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