hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/rtc/rtc-rockchip.c
....@@ -508,7 +508,7 @@
508508 c_mon = DIV_ROUND_CLOSEST(30 * 24 * tcamp, 32768);
509509
510510 if (c_hour > 1)
511
- rockchip_rtc_write(rtc->regmap, RTC_COMP_H, (c_hour - 1) | trim_dir);
511
+ rockchip_rtc_write(rtc->regmap, RTC_COMP_H, bin2bcd((c_hour - 1)) | trim_dir);
512512 else
513513 rockchip_rtc_write(rtc->regmap, RTC_COMP_H, CLK32K_NO_COMP);
514514
....@@ -522,7 +522,7 @@
522522
523523 if (c_det_day > 1)
524524 rockchip_rtc_write(rtc->regmap, RTC_COMP_D,
525
- (c_det_day - 1) | trim_dir);
525
+ bin2bcd((c_det_day - 1)) | trim_dir);
526526 else
527527 rockchip_rtc_write(rtc->regmap, RTC_COMP_D, CLK32K_NO_COMP);
528528
....@@ -536,7 +536,7 @@
536536
537537 if (c_det_mon)
538538 rockchip_rtc_write(rtc->regmap, RTC_COMP_M,
539
- (c_det_mon - 1) | trim_dir);
539
+ bin2bcd((c_det_mon - 1)) | trim_dir);
540540 else
541541 rockchip_rtc_write(rtc->regmap, RTC_COMP_M, CLK32K_NO_COMP);
542542
....@@ -555,6 +555,31 @@
555555 return;
556556 }
557557
558
+static bool rockchip_rtc_is_trimed(struct rockchip_rtc *rtc)
559
+{
560
+ int ret, comp_done;
561
+
562
+ ret = regmap_read(rtc->regmap, RTC_CTRL, &comp_done);
563
+ if (ret) {
564
+ pr_err("%s: Failed to read RTC_CTRL: %d\n", __func__, ret);
565
+ return false;
566
+ }
567
+ return (comp_done & CLK32K_COMP_EN) == CLK32K_COMP_EN;
568
+}
569
+
570
+static void rockchip_rtc_trim_start(struct rockchip_rtc *rtc)
571
+{
572
+ if (!rockchip_rtc_is_trimed(rtc))
573
+ queue_delayed_work(system_long_wq, &rtc->trim_work,
574
+ msecs_to_jiffies(5000));
575
+}
576
+
577
+static void __maybe_unused rockchip_rtc_trim_close(struct rockchip_rtc *rtc)
578
+{
579
+ if (!rockchip_rtc_is_trimed(rtc))
580
+ cancel_delayed_work_sync(&rtc->trim_work);
581
+}
582
+
558583 /* Enable the alarm if it should be enabled (in case it was disabled to
559584 * prevent use as a wake source).
560585 */
....@@ -567,6 +592,8 @@
567592
568593 if (device_may_wakeup(dev))
569594 enable_irq_wake(rtc->irq);
595
+
596
+ rockchip_rtc_trim_close(rtc);
570597
571598 if (rtc->grf) {
572599 switch (rtc->mode) {
....@@ -610,6 +637,7 @@
610637 dev_err(dev, "Cannot enable clock.\n");
611638 return ret;
612639 }
640
+ rockchip_rtc_trim_start(rtc);
613641
614642 return 0;
615643 }
....@@ -761,7 +789,7 @@
761789 rtc->irq);
762790
763791 INIT_DELAYED_WORK(&rtc->trim_work, rockchip_rtc_compensation_delay_work);
764
- queue_delayed_work(system_long_wq, &rtc->trim_work, 3000);
792
+ rockchip_rtc_trim_start(rtc);
765793
766794 return rtc_register_device(rtc->rtc);
767795 }