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