12
12
*/
13
13
14
14
#include <linux/bcd.h>
15
+ #include <linux/clk.h>
15
16
#include <linux/init.h>
16
17
#include <linux/iopoll.h>
17
18
#include <linux/module.h>
22
23
#include <linux/spinlock.h>
23
24
24
25
#define RZN1_RTC_CTL0 0x00
25
- #define RZN1_RTC_CTL0_SLSB_SUBU 0
26
26
#define RZN1_RTC_CTL0_SLSB_SCMP BIT(4)
27
27
#define RZN1_RTC_CTL0_AMPM BIT(5)
28
28
#define RZN1_RTC_CTL0_CEST BIT(6)
50
50
#define RZN1_RTC_SUBU_DEV BIT(7)
51
51
#define RZN1_RTC_SUBU_DECR BIT(6)
52
52
53
+ #define RZN1_RTC_SCMP 0x3c
54
+
53
55
#define RZN1_RTC_ALM 0x40
54
56
#define RZN1_RTC_ALH 0x44
55
57
#define RZN1_RTC_ALW 0x48
@@ -357,7 +359,7 @@ static int rzn1_rtc_set_offset(struct device *dev, long offset)
357
359
return 0 ;
358
360
}
359
361
360
- static const struct rtc_class_ops rzn1_rtc_ops = {
362
+ static const struct rtc_class_ops rzn1_rtc_ops_subu = {
361
363
.read_time = rzn1_rtc_read_time ,
362
364
.set_time = rzn1_rtc_set_time ,
363
365
.read_alarm = rzn1_rtc_read_alarm ,
@@ -367,12 +369,21 @@ static const struct rtc_class_ops rzn1_rtc_ops = {
367
369
.set_offset = rzn1_rtc_set_offset ,
368
370
};
369
371
372
+ static const struct rtc_class_ops rzn1_rtc_ops_scmp = {
373
+ .read_time = rzn1_rtc_read_time ,
374
+ .set_time = rzn1_rtc_set_time ,
375
+ .read_alarm = rzn1_rtc_read_alarm ,
376
+ .set_alarm = rzn1_rtc_set_alarm ,
377
+ .alarm_irq_enable = rzn1_rtc_alarm_irq_enable ,
378
+ };
379
+
370
380
static int rzn1_rtc_probe (struct platform_device * pdev )
371
381
{
372
382
struct rzn1_rtc * rtc ;
373
- u32 val ;
374
- int irq ;
375
- int ret ;
383
+ u32 val , scmp_val = 0 ;
384
+ struct clk * xtal ;
385
+ unsigned long rate ;
386
+ int irq , ret ;
376
387
377
388
rtc = devm_kzalloc (& pdev -> dev , sizeof (* rtc ), GFP_KERNEL );
378
389
if (!rtc )
@@ -395,7 +406,6 @@ static int rzn1_rtc_probe(struct platform_device *pdev)
395
406
rtc -> rtcdev -> range_min = RTC_TIMESTAMP_BEGIN_2000 ;
396
407
rtc -> rtcdev -> range_max = RTC_TIMESTAMP_END_2099 ;
397
408
rtc -> rtcdev -> alarm_offset_max = 7 * 86400 ;
398
- rtc -> rtcdev -> ops = & rzn1_rtc_ops ;
399
409
400
410
ret = devm_pm_runtime_enable (& pdev -> dev );
401
411
if (ret < 0 )
@@ -404,10 +414,24 @@ static int rzn1_rtc_probe(struct platform_device *pdev)
404
414
if (ret < 0 )
405
415
return ret ;
406
416
407
- /*
408
- * Ensure the clock counter is enabled.
409
- * Set 24-hour mode and possible oscillator offset compensation in SUBU mode.
410
- */
417
+ /* Only switch to scmp if we have an xtal clock with a valid rate and != 32768 */
418
+ xtal = devm_clk_get_optional (& pdev -> dev , "xtal" );
419
+ if (IS_ERR (xtal )) {
420
+ ret = PTR_ERR (xtal );
421
+ goto dis_runtime_pm ;
422
+ } else if (xtal ) {
423
+ rate = clk_get_rate (xtal );
424
+
425
+ if (rate < 32000 || rate > BIT (22 )) {
426
+ ret = - EOPNOTSUPP ;
427
+ goto dis_runtime_pm ;
428
+ }
429
+
430
+ if (rate != 32768 )
431
+ scmp_val = RZN1_RTC_CTL0_SLSB_SCMP ;
432
+ }
433
+
434
+ /* Disable controller during SUBU/SCMP setup */
411
435
val = readl (rtc -> base + RZN1_RTC_CTL0 ) & ~RZN1_RTC_CTL0_CE ;
412
436
writel (val , rtc -> base + RZN1_RTC_CTL0 );
413
437
/* Wait 2-4 32k clock cycles for the disabled controller */
@@ -416,8 +440,18 @@ static int rzn1_rtc_probe(struct platform_device *pdev)
416
440
if (ret )
417
441
goto dis_runtime_pm ;
418
442
419
- writel (RZN1_RTC_CTL0_CE | RZN1_RTC_CTL0_AMPM | RZN1_RTC_CTL0_SLSB_SUBU ,
420
- rtc -> base + RZN1_RTC_CTL0 );
443
+ /* Set desired modes leaving the controller disabled */
444
+ writel (RZN1_RTC_CTL0_AMPM | scmp_val , rtc -> base + RZN1_RTC_CTL0 );
445
+
446
+ if (scmp_val ) {
447
+ writel (rate - 1 , rtc -> base + RZN1_RTC_SCMP );
448
+ rtc -> rtcdev -> ops = & rzn1_rtc_ops_scmp ;
449
+ } else {
450
+ rtc -> rtcdev -> ops = & rzn1_rtc_ops_subu ;
451
+ }
452
+
453
+ /* Enable controller finally */
454
+ writel (RZN1_RTC_CTL0_CE | RZN1_RTC_CTL0_AMPM | scmp_val , rtc -> base + RZN1_RTC_CTL0 );
421
455
422
456
/* Disable all interrupts */
423
457
writel (0 , rtc -> base + RZN1_RTC_CTL1 );
0 commit comments