.. | .. |
---|
508 | 508 | c_mon = DIV_ROUND_CLOSEST(30 * 24 * tcamp, 32768); |
---|
509 | 509 | |
---|
510 | 510 | 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); |
---|
512 | 512 | else |
---|
513 | 513 | rockchip_rtc_write(rtc->regmap, RTC_COMP_H, CLK32K_NO_COMP); |
---|
514 | 514 | |
---|
.. | .. |
---|
522 | 522 | |
---|
523 | 523 | if (c_det_day > 1) |
---|
524 | 524 | rockchip_rtc_write(rtc->regmap, RTC_COMP_D, |
---|
525 | | - (c_det_day - 1) | trim_dir); |
---|
| 525 | + bin2bcd((c_det_day - 1)) | trim_dir); |
---|
526 | 526 | else |
---|
527 | 527 | rockchip_rtc_write(rtc->regmap, RTC_COMP_D, CLK32K_NO_COMP); |
---|
528 | 528 | |
---|
.. | .. |
---|
536 | 536 | |
---|
537 | 537 | if (c_det_mon) |
---|
538 | 538 | rockchip_rtc_write(rtc->regmap, RTC_COMP_M, |
---|
539 | | - (c_det_mon - 1) | trim_dir); |
---|
| 539 | + bin2bcd((c_det_mon - 1)) | trim_dir); |
---|
540 | 540 | else |
---|
541 | 541 | rockchip_rtc_write(rtc->regmap, RTC_COMP_M, CLK32K_NO_COMP); |
---|
542 | 542 | |
---|
.. | .. |
---|
555 | 555 | return; |
---|
556 | 556 | } |
---|
557 | 557 | |
---|
| 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 | + |
---|
558 | 583 | /* Enable the alarm if it should be enabled (in case it was disabled to |
---|
559 | 584 | * prevent use as a wake source). |
---|
560 | 585 | */ |
---|
.. | .. |
---|
567 | 592 | |
---|
568 | 593 | if (device_may_wakeup(dev)) |
---|
569 | 594 | enable_irq_wake(rtc->irq); |
---|
| 595 | + |
---|
| 596 | + rockchip_rtc_trim_close(rtc); |
---|
570 | 597 | |
---|
571 | 598 | if (rtc->grf) { |
---|
572 | 599 | switch (rtc->mode) { |
---|
.. | .. |
---|
610 | 637 | dev_err(dev, "Cannot enable clock.\n"); |
---|
611 | 638 | return ret; |
---|
612 | 639 | } |
---|
| 640 | + rockchip_rtc_trim_start(rtc); |
---|
613 | 641 | |
---|
614 | 642 | return 0; |
---|
615 | 643 | } |
---|
.. | .. |
---|
761 | 789 | rtc->irq); |
---|
762 | 790 | |
---|
763 | 791 | 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); |
---|
765 | 793 | |
---|
766 | 794 | return rtc_register_device(rtc->rtc); |
---|
767 | 795 | } |
---|