10
10
#include <linux/module.h>
11
11
#include <linux/i2c.h>
12
12
#include <linux/bcd.h>
13
+ #include <linux/reboot.h>
13
14
#include <linux/regmap.h>
14
15
#include <linux/rtc.h>
15
16
#include <linux/platform_device.h>
53
54
* Device | Write time | Read time | Write alarm
54
55
* =================================================
55
56
* S5M8767 | UDR + TIME | | UDR
57
+ * S2MPG10 | WUDR | RUDR | AUDR
56
58
* S2MPS11/14 | WUDR | RUDR | WUDR + RUDR
57
59
* S2MPS13 | WUDR | RUDR | WUDR + AUDR
58
60
* S2MPS15 | WUDR | RUDR | AUDR
@@ -99,6 +101,20 @@ static const struct s5m_rtc_reg_config s5m_rtc_regs = {
99
101
.write_alarm_udr_mask = S5M_RTC_UDR_MASK ,
100
102
};
101
103
104
+ /* Register map for S2MPG10 */
105
+ static const struct s5m_rtc_reg_config s2mpg10_rtc_regs = {
106
+ .regs_count = 7 ,
107
+ .time = S2MPG10_RTC_SEC ,
108
+ .ctrl = S2MPG10_RTC_CTRL ,
109
+ .alarm0 = S2MPG10_RTC_A0SEC ,
110
+ .alarm1 = S2MPG10_RTC_A1SEC ,
111
+ .udr_update = S2MPG10_RTC_UPDATE ,
112
+ .autoclear_udr_mask = S2MPS15_RTC_WUDR_MASK | S2MPS15_RTC_AUDR_MASK ,
113
+ .read_time_udr_mask = S2MPS_RTC_RUDR_MASK ,
114
+ .write_time_udr_mask = S2MPS15_RTC_WUDR_MASK ,
115
+ .write_alarm_udr_mask = S2MPS15_RTC_AUDR_MASK ,
116
+ };
117
+
102
118
/* Register map for S2MPS13 */
103
119
static const struct s5m_rtc_reg_config s2mps13_rtc_regs = {
104
120
.regs_count = 7 ,
@@ -238,6 +254,7 @@ static int s5m_check_peding_alarm_interrupt(struct s5m_rtc_info *info,
238
254
ret = regmap_read (info -> regmap , S5M_RTC_STATUS , & val );
239
255
val &= S5M_ALARM0_STATUS ;
240
256
break ;
257
+ case S2MPG10 :
241
258
case S2MPS15X :
242
259
case S2MPS14X :
243
260
case S2MPS13X :
@@ -300,6 +317,7 @@ static int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info)
300
317
case S5M8767X :
301
318
data &= ~S5M_RTC_TIME_EN_MASK ;
302
319
break ;
320
+ case S2MPG10 :
303
321
case S2MPS15X :
304
322
case S2MPS14X :
305
323
case S2MPS13X :
@@ -351,6 +369,7 @@ static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm)
351
369
352
370
switch (info -> device_type ) {
353
371
case S5M8767X :
372
+ case S2MPG10 :
354
373
case S2MPS15X :
355
374
case S2MPS14X :
356
375
case S2MPS13X :
@@ -374,6 +393,7 @@ static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm)
374
393
375
394
switch (info -> device_type ) {
376
395
case S5M8767X :
396
+ case S2MPG10 :
377
397
case S2MPS15X :
378
398
case S2MPS14X :
379
399
case S2MPS13X :
@@ -411,6 +431,7 @@ static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
411
431
412
432
switch (info -> device_type ) {
413
433
case S5M8767X :
434
+ case S2MPG10 :
414
435
case S2MPS15X :
415
436
case S2MPS14X :
416
437
case S2MPS13X :
@@ -449,6 +470,7 @@ static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info)
449
470
450
471
switch (info -> device_type ) {
451
472
case S5M8767X :
473
+ case S2MPG10 :
452
474
case S2MPS15X :
453
475
case S2MPS14X :
454
476
case S2MPS13X :
@@ -487,6 +509,7 @@ static int s5m_rtc_start_alarm(struct s5m_rtc_info *info)
487
509
488
510
switch (info -> device_type ) {
489
511
case S5M8767X :
512
+ case S2MPG10 :
490
513
case S2MPS15X :
491
514
case S2MPS14X :
492
515
case S2MPS13X :
@@ -524,6 +547,7 @@ static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
524
547
525
548
switch (info -> device_type ) {
526
549
case S5M8767X :
550
+ case S2MPG10 :
527
551
case S2MPS15X :
528
552
case S2MPS14X :
529
553
case S2MPS13X :
@@ -604,6 +628,7 @@ static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info)
604
628
ret = regmap_raw_write (info -> regmap , S5M_ALARM0_CONF , data , 2 );
605
629
break ;
606
630
631
+ case S2MPG10 :
607
632
case S2MPS15X :
608
633
case S2MPS14X :
609
634
case S2MPS13X :
@@ -634,6 +659,25 @@ static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info)
634
659
return ret ;
635
660
}
636
661
662
+ static int s5m_rtc_restart_s2mpg10 (struct sys_off_data * data )
663
+ {
664
+ struct s5m_rtc_info * info = data -> cb_data ;
665
+ int ret ;
666
+
667
+ if (data -> mode != REBOOT_COLD && data -> mode != REBOOT_HARD )
668
+ return NOTIFY_DONE ;
669
+
670
+ /*
671
+ * Arm watchdog with maximum timeout (2 seconds), and perform full reset
672
+ * on expiry.
673
+ */
674
+ ret = regmap_set_bits (info -> regmap , S2MPG10_RTC_WTSR ,
675
+ (S2MPG10_WTSR_COLDTIMER | S2MPG10_WTSR_COLDRST
676
+ | S2MPG10_WTSR_WTSRT | S2MPG10_WTSR_WTSR_EN ));
677
+
678
+ return ret ? NOTIFY_BAD : NOTIFY_DONE ;
679
+ }
680
+
637
681
static int s5m_rtc_probe (struct platform_device * pdev )
638
682
{
639
683
struct sec_pmic_dev * s5m87xx = dev_get_drvdata (pdev -> dev .parent );
@@ -689,6 +733,9 @@ static int s5m_rtc_probe(struct platform_device *pdev)
689
733
if (IS_ERR (info -> regmap ))
690
734
return dev_err_probe (& pdev -> dev , PTR_ERR (info -> regmap ),
691
735
"Failed to allocate regmap\n" );
736
+ } else if (device_type == S2MPG10 ) {
737
+ info -> regs = & s2mpg10_rtc_regs ;
738
+ alarm_irq = S2MPG10_IRQ_RTCA0 ;
692
739
} else {
693
740
return dev_err_probe (& pdev -> dev , - ENODEV ,
694
741
"Unsupported device type %d\n" ,
@@ -735,6 +782,18 @@ static int s5m_rtc_probe(struct platform_device *pdev)
735
782
device_init_wakeup (& pdev -> dev , true);
736
783
}
737
784
785
+ if (of_device_is_system_power_controller (pdev -> dev .parent -> of_node ) &&
786
+ info -> device_type == S2MPG10 ) {
787
+ ret = devm_register_sys_off_handler (& pdev -> dev ,
788
+ SYS_OFF_MODE_RESTART ,
789
+ SYS_OFF_PRIO_HIGH + 1 ,
790
+ s5m_rtc_restart_s2mpg10 ,
791
+ info );
792
+ if (ret )
793
+ return dev_err_probe (& pdev -> dev , ret ,
794
+ "Failed to register restart handler\n" );
795
+ }
796
+
738
797
return devm_rtc_register_device (info -> rtc_dev );
739
798
}
740
799
@@ -766,6 +825,7 @@ static SIMPLE_DEV_PM_OPS(s5m_rtc_pm_ops, s5m_rtc_suspend, s5m_rtc_resume);
766
825
767
826
static const struct platform_device_id s5m_rtc_id [] = {
768
827
{ "s5m-rtc" , S5M8767X },
828
+ { "s2mpg10-rtc" , S2MPG10 },
769
829
{ "s2mps13-rtc" , S2MPS13X },
770
830
{ "s2mps14-rtc" , S2MPS14X },
771
831
{ "s2mps15-rtc" , S2MPS15X },
0 commit comments