Lines Matching full:rtc
13 #include <linux/rtc.h>
66 /* RK630 has a shadowed register for saving a "frozen" RTC time.
68 * register. If set "READSEL" to 1, user read rtc time register, actually
119 struct rtc_device *rtc; member
145 /* Read current time and date in RTC */
148 struct rockchip_rtc *rtc = dev_get_drvdata(dev); in rockchip_rtc_read_time() local
154 ret = regmap_bulk_read(rtc->regmap, RTC_SET_SECONDS, in rockchip_rtc_read_time()
160 ret = regmap_bulk_read(rtc->regmap, RTC_SET_SECONDS, in rockchip_rtc_read_time()
166 ret = regmap_bulk_read(rtc->regmap, RTC_SET_SECONDS, in rockchip_rtc_read_time()
183 dev_dbg(dev, "RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n", in rockchip_rtc_read_time()
190 /* Set current time and date in RTC */
193 struct rockchip_rtc *rtc = dev_get_drvdata(dev); in rockchip_rtc_set_time() local
198 dev_dbg(dev, "set RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n", in rockchip_rtc_set_time()
218 /* Stop RTC while updating the RTC registers */ in rockchip_rtc_set_time()
219 ret = rockchip_rtc_update_bits(rtc->regmap, RTC_CTRL, in rockchip_rtc_set_time()
222 dev_err(dev, "Failed to update RTC control: %d\n", ret); in rockchip_rtc_set_time()
226 ret = regmap_read_poll_timeout(rtc->regmap, RTC_STATUS1, status, in rockchip_rtc_set_time()
234 ret = regmap_bulk_write(rtc->regmap, RTC_SET_SECONDS, in rockchip_rtc_set_time()
241 /* Start RTC again */ in rockchip_rtc_set_time()
242 ret = rockchip_rtc_update_bits(rtc->regmap, RTC_CTRL, in rockchip_rtc_set_time()
248 dev_err(dev, "Failed to update RTC control: %d\n", ret); in rockchip_rtc_set_time()
252 ret = regmap_read_poll_timeout(rtc->regmap, RTC_STATUS1, status, in rockchip_rtc_set_time()
263 /* Read alarm time and date in RTC */
266 struct rockchip_rtc *rtc = dev_get_drvdata(dev); in rockchip_rtc_readalarm() local
272 ret = regmap_bulk_read(rtc->regmap, in rockchip_rtc_readalarm()
276 dev_err(dev, "Failed to read RTC alarm date REG: %d\n", ret); in rockchip_rtc_readalarm()
289 ret = regmap_read(rtc->regmap, RTC_INT0_EN, &int_reg); in rockchip_rtc_readalarm()
291 dev_err(dev, "Failed to read RTC INT REG: %d\n", ret); in rockchip_rtc_readalarm()
296 "alrm read RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n", in rockchip_rtc_readalarm()
306 static int rockchip_rtc_stop_alarm(struct rockchip_rtc *rtc) in rockchip_rtc_stop_alarm() argument
310 ret = rockchip_rtc_write(rtc->regmap, RTC_INT0_EN, 0); in rockchip_rtc_stop_alarm()
315 static int rockchip_rtc_start_alarm(struct rockchip_rtc *rtc) in rockchip_rtc_start_alarm() argument
319 ret = rockchip_rtc_write(rtc->regmap, RTC_STATUS0, RTC_STATUS_MASK); in rockchip_rtc_start_alarm()
320 ret = rockchip_rtc_write(rtc->regmap, RTC_STATUS0, 0); in rockchip_rtc_start_alarm()
321 ret = rockchip_rtc_write(rtc->regmap, RTC_INT0_EN, ENABLE_ALARM_INT); in rockchip_rtc_start_alarm()
328 struct rockchip_rtc *rtc = dev_get_drvdata(dev); in rockchip_rtc_setalarm() local
333 ret = rockchip_rtc_stop_alarm(rtc); in rockchip_rtc_setalarm()
339 "alrm set RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n", in rockchip_rtc_setalarm()
359 ret = regmap_bulk_write(rtc->regmap, in rockchip_rtc_setalarm()
367 ret = rockchip_rtc_start_alarm(rtc); in rockchip_rtc_setalarm()
379 struct rockchip_rtc *rtc = dev_get_drvdata(dev); in rockchip_rtc_alarm_irq_enable() local
382 return rockchip_rtc_start_alarm(rtc); in rockchip_rtc_alarm_irq_enable()
384 return rockchip_rtc_stop_alarm(rtc); in rockchip_rtc_alarm_irq_enable()
394 struct rockchip_rtc *rtc = data; in rockchip_rtc_alarm_irq() local
397 ret = regmap_read(rtc->regmap, RTC_STATUS0, &status); in rockchip_rtc_alarm_irq()
399 pr_err("Failed to read RTC INT REG: %d\n", ret); in rockchip_rtc_alarm_irq()
403 ret = rockchip_rtc_write(rtc->regmap, RTC_STATUS0, status); in rockchip_rtc_alarm_irq()
405 pr_err("%s:Failed to update RTC status: %d\n", __func__, ret); in rockchip_rtc_alarm_irq()
410 rtc_update_irq(rtc->rtc, 1, RTC_IRQF | RTC_AF); in rockchip_rtc_alarm_irq()
427 * with the environment change. In rtc test,
430 * and configure test length, when rtc test done(0x84[2]),
434 * In RTC digital design, we set three level compensation,
436 * RTC 32k clock test result, and if we need compensation,
448 struct rockchip_rtc *rtc = container_of(work, struct rockchip_rtc, trim_work.work); in rockchip_rtc_compensation_delay_work() local
454 ret = rockchip_rtc_update_bits(rtc->regmap, RTC_CLK32K_TEST, in rockchip_rtc_compensation_delay_work()
457 pr_err("%s:Failed to update RTC CLK32K TEST: %d\n", in rockchip_rtc_compensation_delay_work()
462 ret = rockchip_rtc_write(rtc->regmap, RTC_TEST_LEN, in rockchip_rtc_compensation_delay_work()
465 pr_err("%s:Failed to update RTC CLK32K TEST LEN: %d\n", in rockchip_rtc_compensation_delay_work()
470 ret = rockchip_rtc_update_bits(rtc->regmap, RTC_TEST_ST, in rockchip_rtc_compensation_delay_work()
474 pr_err("%s:Failed to update RTC CLK32K TEST STATUS : %d\n", in rockchip_rtc_compensation_delay_work()
478 ret = regmap_read_poll_timeout(rtc->regmap, RTC_TEST_ST, done, in rockchip_rtc_compensation_delay_work()
481 pr_err("%s:timeout waiting for RTC TEST STATUS : %d\n", in rockchip_rtc_compensation_delay_work()
484 ret = regmap_bulk_read(rtc->regmap, in rockchip_rtc_compensation_delay_work()
488 pr_err("Failed to read RTC count REG: %d\n", ret); in rockchip_rtc_compensation_delay_work()
511 rockchip_rtc_write(rtc->regmap, RTC_COMP_H, (c_hour - 1) | trim_dir); in rockchip_rtc_compensation_delay_work()
513 rockchip_rtc_write(rtc->regmap, RTC_COMP_H, CLK32K_NO_COMP); in rockchip_rtc_compensation_delay_work()
524 rockchip_rtc_write(rtc->regmap, RTC_COMP_D, in rockchip_rtc_compensation_delay_work()
527 rockchip_rtc_write(rtc->regmap, RTC_COMP_D, CLK32K_NO_COMP); in rockchip_rtc_compensation_delay_work()
538 rockchip_rtc_write(rtc->regmap, RTC_COMP_M, in rockchip_rtc_compensation_delay_work()
541 rockchip_rtc_write(rtc->regmap, RTC_COMP_M, CLK32K_NO_COMP); in rockchip_rtc_compensation_delay_work()
543 ret = regmap_read(rtc->regmap, RTC_CTRL, &done); in rockchip_rtc_compensation_delay_work()
549 ret = rockchip_rtc_update_bits(rtc->regmap, RTC_CTRL, in rockchip_rtc_compensation_delay_work()
552 pr_err("%s:Failed to update RTC CTRL : %d\n", __func__, ret); in rockchip_rtc_compensation_delay_work()
566 struct rockchip_rtc *rtc = dev_get_drvdata(&pdev->dev); in rockchip_rtc_suspend() local
569 enable_irq_wake(rtc->irq); in rockchip_rtc_suspend()
571 if (rtc->grf) { in rockchip_rtc_suspend()
572 switch (rtc->mode) { in rockchip_rtc_suspend()
574 regmap_write(rtc->grf, VI_GRF_VI_MISC_CON0, in rockchip_rtc_suspend()
581 clk_bulk_disable_unprepare(rtc->num_clks, rtc->clks); in rockchip_rtc_suspend()
592 struct rockchip_rtc *rtc = dev_get_drvdata(&pdev->dev); in rockchip_rtc_resume() local
596 disable_irq_wake(rtc->irq); in rockchip_rtc_resume()
598 if (rtc->grf) { in rockchip_rtc_resume()
599 switch (rtc->mode) { in rockchip_rtc_resume()
601 regmap_write(rtc->grf, VI_GRF_VI_MISC_CON0, in rockchip_rtc_resume()
608 ret = clk_bulk_prepare_enable(rtc->num_clks, rtc->clks); in rockchip_rtc_resume()
623 .compatible = "rockchip,rv1106-rtc",
632 struct rockchip_rtc *rtc = data; in rockchip_rtc_clk_disable() local
634 clk_bulk_disable_unprepare(rtc->num_clks, rtc->clks); in rockchip_rtc_clk_disable()
641 struct rockchip_rtc *rtc; in rockchip_rtc_probe() local
653 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); in rockchip_rtc_probe()
654 if (!rtc) in rockchip_rtc_probe()
657 rtc->regmap = device_node_to_regmap(np); in rockchip_rtc_probe()
658 if (IS_ERR(rtc->regmap)) in rockchip_rtc_probe()
659 return dev_err_probe(dev, PTR_ERR(rtc->regmap), in rockchip_rtc_probe()
662 rtc->mode = (uintptr_t)device_get_match_data(dev); in rockchip_rtc_probe()
663 rtc->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf"); in rockchip_rtc_probe()
664 if (IS_ERR(rtc->grf)) { in rockchip_rtc_probe()
666 rtc->grf = NULL; in rockchip_rtc_probe()
668 switch (rtc->mode) { in rockchip_rtc_probe()
670 regmap_write(rtc->grf, VI_GRF_VI_MISC_CON0, in rockchip_rtc_probe()
678 platform_set_drvdata(pdev, rtc); in rockchip_rtc_probe()
680 rtc->num_clks = devm_clk_bulk_get_all(&pdev->dev, &rtc->clks); in rockchip_rtc_probe()
681 if (rtc->num_clks < 1) in rockchip_rtc_probe()
683 ret = clk_bulk_prepare_enable(rtc->num_clks, rtc->clks); in rockchip_rtc_probe()
686 ret = devm_add_action_or_reset(dev, rockchip_rtc_clk_disable, rtc); in rockchip_rtc_probe()
691 ret = rockchip_rtc_update_bits(rtc->regmap, RTC_VPTAT_TRIM, in rockchip_rtc_probe()
697 ret = rockchip_rtc_update_bits(rtc->regmap, RTC_ANALOG_EN, in rockchip_rtc_probe()
704 ret = rockchip_rtc_update_bits(rtc->regmap, RTC_LDO_CTRL, in rockchip_rtc_probe()
711 ret = rockchip_rtc_update_bits(rtc->regmap, RTC_ANALOG_EN, in rockchip_rtc_probe()
718 /* start rtc running by default, and use shadowed timer. */ in rockchip_rtc_probe()
719 ret = rockchip_rtc_update_bits(rtc->regmap, RTC_CTRL, in rockchip_rtc_probe()
726 "Failed to update RTC control\n"); in rockchip_rtc_probe()
728 ret = rockchip_rtc_write(rtc->regmap, RTC_STATUS0, RTC_STATUS_MASK); in rockchip_rtc_probe()
731 "Failed to write RTC status0\n"); in rockchip_rtc_probe()
733 ret = rockchip_rtc_write(rtc->regmap, RTC_STATUS0, 0); in rockchip_rtc_probe()
736 "Failed to write RTC status0\n"); in rockchip_rtc_probe()
744 rtc->rtc = devm_rtc_allocate_device(&pdev->dev); in rockchip_rtc_probe()
745 if (IS_ERR(rtc->rtc)) in rockchip_rtc_probe()
746 return PTR_ERR(rtc->rtc); in rockchip_rtc_probe()
748 rtc->rtc->ops = &rockchip_rtc_ops; in rockchip_rtc_probe()
750 rtc->irq = platform_get_irq(pdev, 0); in rockchip_rtc_probe()
751 if (rtc->irq < 0) in rockchip_rtc_probe()
752 return dev_err_probe(&pdev->dev, rtc->irq, "No IRQ resource\n"); in rockchip_rtc_probe()
754 /* request alarm irq of rtc */ in rockchip_rtc_probe()
755 ret = devm_request_threaded_irq(&pdev->dev, rtc->irq, NULL, in rockchip_rtc_probe()
757 "RTC alarm", rtc); in rockchip_rtc_probe()
761 rtc->irq); in rockchip_rtc_probe()
763 INIT_DELAYED_WORK(&rtc->trim_work, rockchip_rtc_compensation_delay_work); in rockchip_rtc_probe()
764 queue_delayed_work(system_long_wq, &rtc->trim_work, 3000); in rockchip_rtc_probe()
766 return rtc_register_device(rtc->rtc); in rockchip_rtc_probe()
772 .name = "rockchip-rtc",
780 MODULE_DESCRIPTION("RTC driver for the rockchip");