Lines Matching full:rtc

18 #include <linux/rtc.h>
91 /* Max STM32 RTC register offset is 0x3FC */
94 /* STM32 RTC driver time helpers */
119 void (*clear_events)(struct stm32_rtc *rtc, unsigned int flags);
137 static void stm32_rtc_wpr_unlock(struct stm32_rtc *rtc) in stm32_rtc_wpr_unlock() argument
139 const struct stm32_rtc_registers *regs = &rtc->data->regs; in stm32_rtc_wpr_unlock()
141 writel_relaxed(RTC_WPR_1ST_KEY, rtc->base + regs->wpr); in stm32_rtc_wpr_unlock()
142 writel_relaxed(RTC_WPR_2ND_KEY, rtc->base + regs->wpr); in stm32_rtc_wpr_unlock()
145 static void stm32_rtc_wpr_lock(struct stm32_rtc *rtc) in stm32_rtc_wpr_lock() argument
147 const struct stm32_rtc_registers *regs = &rtc->data->regs; in stm32_rtc_wpr_lock()
149 writel_relaxed(RTC_WPR_WRONG_KEY, rtc->base + regs->wpr); in stm32_rtc_wpr_lock()
152 static int stm32_rtc_enter_init_mode(struct stm32_rtc *rtc) in stm32_rtc_enter_init_mode() argument
154 const struct stm32_rtc_registers *regs = &rtc->data->regs; in stm32_rtc_enter_init_mode()
155 unsigned int isr = readl_relaxed(rtc->base + regs->isr); in stm32_rtc_enter_init_mode()
159 writel_relaxed(isr, rtc->base + regs->isr); in stm32_rtc_enter_init_mode()
167 return readl_relaxed_poll_timeout_atomic(rtc->base + regs->isr, isr, in stm32_rtc_enter_init_mode()
175 static void stm32_rtc_exit_init_mode(struct stm32_rtc *rtc) in stm32_rtc_exit_init_mode() argument
177 const struct stm32_rtc_registers *regs = &rtc->data->regs; in stm32_rtc_exit_init_mode()
178 unsigned int isr = readl_relaxed(rtc->base + regs->isr); in stm32_rtc_exit_init_mode()
181 writel_relaxed(isr, rtc->base + regs->isr); in stm32_rtc_exit_init_mode()
184 static int stm32_rtc_wait_sync(struct stm32_rtc *rtc) in stm32_rtc_wait_sync() argument
186 const struct stm32_rtc_registers *regs = &rtc->data->regs; in stm32_rtc_wait_sync()
187 unsigned int isr = readl_relaxed(rtc->base + regs->isr); in stm32_rtc_wait_sync()
190 writel_relaxed(isr, rtc->base + regs->isr); in stm32_rtc_wait_sync()
196 return readl_relaxed_poll_timeout_atomic(rtc->base + regs->isr, in stm32_rtc_wait_sync()
202 static void stm32_rtc_clear_event_flags(struct stm32_rtc *rtc, in stm32_rtc_clear_event_flags() argument
205 rtc->data->clear_events(rtc, flags); in stm32_rtc_clear_event_flags()
210 struct stm32_rtc *rtc = (struct stm32_rtc *)dev_id; in stm32_rtc_alarm_irq() local
211 const struct stm32_rtc_registers *regs = &rtc->data->regs; in stm32_rtc_alarm_irq()
212 const struct stm32_rtc_events *evts = &rtc->data->events; in stm32_rtc_alarm_irq()
215 rtc_lock(rtc->rtc_dev); in stm32_rtc_alarm_irq()
217 status = readl_relaxed(rtc->base + regs->sr); in stm32_rtc_alarm_irq()
218 cr = readl_relaxed(rtc->base + regs->cr); in stm32_rtc_alarm_irq()
223 dev_dbg(&rtc->rtc_dev->dev, "Alarm occurred\n"); in stm32_rtc_alarm_irq()
226 rtc_update_irq(rtc->rtc_dev, 1, RTC_IRQF | RTC_AF); in stm32_rtc_alarm_irq()
229 stm32_rtc_clear_event_flags(rtc, evts->alra); in stm32_rtc_alarm_irq()
232 rtc_unlock(rtc->rtc_dev); in stm32_rtc_alarm_irq()
250 * - on rtc side, 0=invalid,1=Monday...7=Sunday in tm2bcd()
268 * - on rtc side, 0=invalid,1=Monday...7=Sunday in bcd2tm()
275 struct stm32_rtc *rtc = dev_get_drvdata(dev); in stm32_rtc_read_time() local
276 const struct stm32_rtc_registers *regs = &rtc->data->regs; in stm32_rtc_read_time()
280 tr = readl_relaxed(rtc->base + regs->tr); in stm32_rtc_read_time()
281 dr = readl_relaxed(rtc->base + regs->dr); in stm32_rtc_read_time()
301 struct stm32_rtc *rtc = dev_get_drvdata(dev); in stm32_rtc_set_time() local
302 const struct stm32_rtc_registers *regs = &rtc->data->regs; in stm32_rtc_set_time()
319 stm32_rtc_wpr_unlock(rtc); in stm32_rtc_set_time()
321 ret = stm32_rtc_enter_init_mode(rtc); in stm32_rtc_set_time()
327 writel_relaxed(tr, rtc->base + regs->tr); in stm32_rtc_set_time()
328 writel_relaxed(dr, rtc->base + regs->dr); in stm32_rtc_set_time()
330 stm32_rtc_exit_init_mode(rtc); in stm32_rtc_set_time()
332 ret = stm32_rtc_wait_sync(rtc); in stm32_rtc_set_time()
334 stm32_rtc_wpr_lock(rtc); in stm32_rtc_set_time()
341 struct stm32_rtc *rtc = dev_get_drvdata(dev); in stm32_rtc_read_alarm() local
342 const struct stm32_rtc_registers *regs = &rtc->data->regs; in stm32_rtc_read_alarm()
343 const struct stm32_rtc_events *evts = &rtc->data->events; in stm32_rtc_read_alarm()
347 alrmar = readl_relaxed(rtc->base + regs->alrmar); in stm32_rtc_read_alarm()
348 cr = readl_relaxed(rtc->base + regs->cr); in stm32_rtc_read_alarm()
349 status = readl_relaxed(rtc->base + regs->sr); in stm32_rtc_read_alarm()
409 struct stm32_rtc *rtc = dev_get_drvdata(dev); in stm32_rtc_alarm_irq_enable() local
410 const struct stm32_rtc_registers *regs = &rtc->data->regs; in stm32_rtc_alarm_irq_enable()
411 const struct stm32_rtc_events *evts = &rtc->data->events; in stm32_rtc_alarm_irq_enable()
414 cr = readl_relaxed(rtc->base + regs->cr); in stm32_rtc_alarm_irq_enable()
416 stm32_rtc_wpr_unlock(rtc); in stm32_rtc_alarm_irq_enable()
423 writel_relaxed(cr, rtc->base + regs->cr); in stm32_rtc_alarm_irq_enable()
426 stm32_rtc_clear_event_flags(rtc, evts->alra); in stm32_rtc_alarm_irq_enable()
428 stm32_rtc_wpr_lock(rtc); in stm32_rtc_alarm_irq_enable()
443 * RTC alarm can't be set on a specific month and year. in stm32_rtc_valid_alrm()
473 struct stm32_rtc *rtc = dev_get_drvdata(dev); in stm32_rtc_set_alarm() local
474 const struct stm32_rtc_registers *regs = &rtc->data->regs; in stm32_rtc_set_alarm()
480 * RTC alarm can't be set on a specific date, unless this date is in stm32_rtc_set_alarm()
491 /* tm_year and tm_mon are not used because not supported by RTC */ in stm32_rtc_set_alarm()
503 stm32_rtc_wpr_unlock(rtc); in stm32_rtc_set_alarm()
506 cr = readl_relaxed(rtc->base + regs->cr); in stm32_rtc_set_alarm()
508 writel_relaxed(cr, rtc->base + regs->cr); in stm32_rtc_set_alarm()
514 ret = readl_relaxed_poll_timeout_atomic(rtc->base + regs->isr, in stm32_rtc_set_alarm()
525 writel_relaxed(alrmar, rtc->base + regs->alrmar); in stm32_rtc_set_alarm()
529 stm32_rtc_wpr_lock(rtc); in stm32_rtc_set_alarm()
542 static void stm32_rtc_clear_events(struct stm32_rtc *rtc, in stm32_rtc_clear_events() argument
545 const struct stm32_rtc_registers *regs = &rtc->data->regs; in stm32_rtc_clear_events()
548 writel_relaxed(readl_relaxed(rtc->base + regs->isr) & ~flags, in stm32_rtc_clear_events()
549 rtc->base + regs->isr); in stm32_rtc_clear_events()
596 static void stm32mp1_rtc_clear_events(struct stm32_rtc *rtc, in stm32mp1_rtc_clear_events() argument
599 struct stm32_rtc_registers regs = rtc->data->regs; in stm32mp1_rtc_clear_events()
602 writel_relaxed(flags, rtc->base + regs.scr); in stm32mp1_rtc_clear_events()
628 { .compatible = "st,stm32-rtc", .data = &stm32_rtc_data },
629 { .compatible = "st,stm32h7-rtc", .data = &stm32h7_rtc_data },
630 { .compatible = "st,stm32mp1-rtc", .data = &stm32mp1_data },
636 struct stm32_rtc *rtc) in stm32_rtc_init() argument
638 const struct stm32_rtc_registers *regs = &rtc->data->regs; in stm32_rtc_init()
643 rate = clk_get_rate(rtc->rtc_ck); in stm32_rtc_init()
654 if (rtc->data->need_accuracy) { in stm32_rtc_init()
671 * Can't find a 1Hz, so give priority to RTC power consumption in stm32_rtc_init()
683 cr = readl_relaxed(rtc->base + regs->cr); in stm32_rtc_init()
685 prer = readl_relaxed(rtc->base + regs->prer); in stm32_rtc_init()
697 stm32_rtc_wpr_unlock(rtc); in stm32_rtc_init()
699 ret = stm32_rtc_enter_init_mode(rtc); in stm32_rtc_init()
706 writel_relaxed(pred_s, rtc->base + regs->prer); in stm32_rtc_init()
707 writel_relaxed(pred_a | pred_s, rtc->base + regs->prer); in stm32_rtc_init()
711 writel_relaxed(cr, rtc->base + regs->cr); in stm32_rtc_init()
713 stm32_rtc_exit_init_mode(rtc); in stm32_rtc_init()
715 ret = stm32_rtc_wait_sync(rtc); in stm32_rtc_init()
717 stm32_rtc_wpr_lock(rtc); in stm32_rtc_init()
724 struct stm32_rtc *rtc; in stm32_rtc_probe() local
728 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); in stm32_rtc_probe()
729 if (!rtc) in stm32_rtc_probe()
732 rtc->base = devm_platform_ioremap_resource(pdev, 0); in stm32_rtc_probe()
733 if (IS_ERR(rtc->base)) in stm32_rtc_probe()
734 return PTR_ERR(rtc->base); in stm32_rtc_probe()
736 rtc->data = (struct stm32_rtc_data *) in stm32_rtc_probe()
738 regs = &rtc->data->regs; in stm32_rtc_probe()
740 if (rtc->data->need_dbp) { in stm32_rtc_probe()
741 rtc->dbp = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, in stm32_rtc_probe()
743 if (IS_ERR(rtc->dbp)) { in stm32_rtc_probe()
745 return PTR_ERR(rtc->dbp); in stm32_rtc_probe()
749 1, &rtc->dbp_reg); in stm32_rtc_probe()
756 2, &rtc->dbp_mask); in stm32_rtc_probe()
763 if (!rtc->data->has_pclk) { in stm32_rtc_probe()
764 rtc->pclk = NULL; in stm32_rtc_probe()
765 rtc->rtc_ck = devm_clk_get(&pdev->dev, NULL); in stm32_rtc_probe()
767 rtc->pclk = devm_clk_get(&pdev->dev, "pclk"); in stm32_rtc_probe()
768 if (IS_ERR(rtc->pclk)) in stm32_rtc_probe()
769 return dev_err_probe(&pdev->dev, PTR_ERR(rtc->pclk), "no pclk clock"); in stm32_rtc_probe()
771 rtc->rtc_ck = devm_clk_get(&pdev->dev, "rtc_ck"); in stm32_rtc_probe()
773 if (IS_ERR(rtc->rtc_ck)) in stm32_rtc_probe()
774 return dev_err_probe(&pdev->dev, PTR_ERR(rtc->rtc_ck), "no rtc_ck clock"); in stm32_rtc_probe()
776 if (rtc->data->has_pclk) { in stm32_rtc_probe()
777 ret = clk_prepare_enable(rtc->pclk); in stm32_rtc_probe()
782 ret = clk_prepare_enable(rtc->rtc_ck); in stm32_rtc_probe()
786 if (rtc->data->need_dbp) in stm32_rtc_probe()
787 regmap_update_bits(rtc->dbp, rtc->dbp_reg, in stm32_rtc_probe()
788 rtc->dbp_mask, rtc->dbp_mask); in stm32_rtc_probe()
794 * rtc_ck parent clock has changed (so RTC prescalers need to be in stm32_rtc_probe()
795 * changed). That's why we cannot rely on this flag to know if RTC in stm32_rtc_probe()
798 ret = stm32_rtc_init(pdev, rtc); in stm32_rtc_probe()
802 rtc->irq_alarm = platform_get_irq(pdev, 0); in stm32_rtc_probe()
803 if (rtc->irq_alarm <= 0) { in stm32_rtc_probe()
804 ret = rtc->irq_alarm; in stm32_rtc_probe()
812 ret = dev_pm_set_wake_irq(&pdev->dev, rtc->irq_alarm); in stm32_rtc_probe()
816 platform_set_drvdata(pdev, rtc); in stm32_rtc_probe()
818 rtc->rtc_dev = devm_rtc_device_register(&pdev->dev, pdev->name, in stm32_rtc_probe()
820 if (IS_ERR(rtc->rtc_dev)) { in stm32_rtc_probe()
821 ret = PTR_ERR(rtc->rtc_dev); in stm32_rtc_probe()
822 dev_err(&pdev->dev, "rtc device registration failed, err=%d\n", in stm32_rtc_probe()
827 /* Handle RTC alarm interrupts */ in stm32_rtc_probe()
828 ret = devm_request_threaded_irq(&pdev->dev, rtc->irq_alarm, NULL, in stm32_rtc_probe()
830 pdev->name, rtc); in stm32_rtc_probe()
833 rtc->irq_alarm); in stm32_rtc_probe()
841 if (!(readl_relaxed(rtc->base + regs->isr) & STM32_RTC_ISR_INITS)) in stm32_rtc_probe()
845 u32 ver = readl_relaxed(rtc->base + regs->verr); in stm32_rtc_probe()
855 clk_disable_unprepare(rtc->rtc_ck); in stm32_rtc_probe()
857 if (rtc->data->has_pclk) in stm32_rtc_probe()
858 clk_disable_unprepare(rtc->pclk); in stm32_rtc_probe()
860 if (rtc->data->need_dbp) in stm32_rtc_probe()
861 regmap_update_bits(rtc->dbp, rtc->dbp_reg, rtc->dbp_mask, 0); in stm32_rtc_probe()
871 struct stm32_rtc *rtc = platform_get_drvdata(pdev); in stm32_rtc_remove() local
872 const struct stm32_rtc_registers *regs = &rtc->data->regs; in stm32_rtc_remove()
876 stm32_rtc_wpr_unlock(rtc); in stm32_rtc_remove()
877 cr = readl_relaxed(rtc->base + regs->cr); in stm32_rtc_remove()
879 writel_relaxed(cr, rtc->base + regs->cr); in stm32_rtc_remove()
880 stm32_rtc_wpr_lock(rtc); in stm32_rtc_remove()
882 clk_disable_unprepare(rtc->rtc_ck); in stm32_rtc_remove()
883 if (rtc->data->has_pclk) in stm32_rtc_remove()
884 clk_disable_unprepare(rtc->pclk); in stm32_rtc_remove()
887 if (rtc->data->need_dbp) in stm32_rtc_remove()
888 regmap_update_bits(rtc->dbp, rtc->dbp_reg, rtc->dbp_mask, 0); in stm32_rtc_remove()
896 struct stm32_rtc *rtc = dev_get_drvdata(dev); in stm32_rtc_suspend() local
898 if (rtc->data->has_pclk) in stm32_rtc_suspend()
899 clk_disable_unprepare(rtc->pclk); in stm32_rtc_suspend()
906 struct stm32_rtc *rtc = dev_get_drvdata(dev); in stm32_rtc_resume() local
909 if (rtc->data->has_pclk) { in stm32_rtc_resume()
910 ret = clk_prepare_enable(rtc->pclk); in stm32_rtc_resume()
915 ret = stm32_rtc_wait_sync(rtc); in stm32_rtc_resume()
917 if (rtc->data->has_pclk) in stm32_rtc_resume()
918 clk_disable_unprepare(rtc->pclk); in stm32_rtc_resume()