.. | .. |
---|
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 | } |
---|