• Home
  • Raw
  • Download

Lines Matching full:rtc

7  * Copyright (C) 2006 David Brownell (new RTC framework)
32 #include <linux/rtc.h>
35 * The OMAP RTC is a year/month/day/hours/minutes/seconds BCD clock
43 * RTC_OFF_NOFF used as the reset signal (so the RTC won't be reset),
44 * and wiring RTC_WAKE_INT (so the RTC alarm can wake the system from
49 /* RTC registers */
141 void (*lock)(struct omap_rtc *rtc);
142 void (*unlock)(struct omap_rtc *rtc);
146 struct rtc_device *rtc; member
159 static inline u8 rtc_read(struct omap_rtc *rtc, unsigned int reg) in rtc_read() argument
161 return readb(rtc->base + reg); in rtc_read()
164 static inline u32 rtc_readl(struct omap_rtc *rtc, unsigned int reg) in rtc_readl() argument
166 return readl(rtc->base + reg); in rtc_readl()
169 static inline void rtc_write(struct omap_rtc *rtc, unsigned int reg, u8 val) in rtc_write() argument
171 writeb(val, rtc->base + reg); in rtc_write()
174 static inline void rtc_writel(struct omap_rtc *rtc, unsigned int reg, u32 val) in rtc_writel() argument
176 writel(val, rtc->base + reg); in rtc_writel()
179 static void am3352_rtc_unlock(struct omap_rtc *rtc) in am3352_rtc_unlock() argument
181 rtc_writel(rtc, OMAP_RTC_KICK0_REG, KICK0_VALUE); in am3352_rtc_unlock()
182 rtc_writel(rtc, OMAP_RTC_KICK1_REG, KICK1_VALUE); in am3352_rtc_unlock()
185 static void am3352_rtc_lock(struct omap_rtc *rtc) in am3352_rtc_lock() argument
187 rtc_writel(rtc, OMAP_RTC_KICK0_REG, 0); in am3352_rtc_lock()
188 rtc_writel(rtc, OMAP_RTC_KICK1_REG, 0); in am3352_rtc_lock()
191 static void default_rtc_unlock(struct omap_rtc *rtc) in default_rtc_unlock() argument
195 static void default_rtc_lock(struct omap_rtc *rtc) in default_rtc_lock() argument
200 * We rely on the rtc framework to handle locking (rtc->ops_lock),
204 static void rtc_wait_not_busy(struct omap_rtc *rtc) in rtc_wait_not_busy() argument
211 status = rtc_read(rtc, OMAP_RTC_STATUS_REG); in rtc_wait_not_busy()
221 struct omap_rtc *rtc = dev_id; in rtc_irq() local
225 irq_data = rtc_read(rtc, OMAP_RTC_STATUS_REG); in rtc_irq()
229 rtc->type->unlock(rtc); in rtc_irq()
230 rtc_write(rtc, OMAP_RTC_STATUS_REG, OMAP_RTC_STATUS_ALARM); in rtc_irq()
231 rtc->type->lock(rtc); in rtc_irq()
239 rtc_update_irq(rtc->rtc, 1, events); in rtc_irq()
246 struct omap_rtc *rtc = dev_get_drvdata(dev); in omap_rtc_alarm_irq_enable() local
250 rtc_wait_not_busy(rtc); in omap_rtc_alarm_irq_enable()
251 reg = rtc_read(rtc, OMAP_RTC_INTERRUPTS_REG); in omap_rtc_alarm_irq_enable()
252 if (rtc->type->has_irqwakeen) in omap_rtc_alarm_irq_enable()
253 irqwake_reg = rtc_read(rtc, OMAP_RTC_IRQWAKEEN); in omap_rtc_alarm_irq_enable()
262 rtc_wait_not_busy(rtc); in omap_rtc_alarm_irq_enable()
263 rtc->type->unlock(rtc); in omap_rtc_alarm_irq_enable()
264 rtc_write(rtc, OMAP_RTC_INTERRUPTS_REG, reg); in omap_rtc_alarm_irq_enable()
265 if (rtc->type->has_irqwakeen) in omap_rtc_alarm_irq_enable()
266 rtc_write(rtc, OMAP_RTC_IRQWAKEEN, irqwake_reg); in omap_rtc_alarm_irq_enable()
267 rtc->type->lock(rtc); in omap_rtc_alarm_irq_enable()
302 static void omap_rtc_read_time_raw(struct omap_rtc *rtc, struct rtc_time *tm) in omap_rtc_read_time_raw() argument
304 tm->tm_sec = rtc_read(rtc, OMAP_RTC_SECONDS_REG); in omap_rtc_read_time_raw()
305 tm->tm_min = rtc_read(rtc, OMAP_RTC_MINUTES_REG); in omap_rtc_read_time_raw()
306 tm->tm_hour = rtc_read(rtc, OMAP_RTC_HOURS_REG); in omap_rtc_read_time_raw()
307 tm->tm_mday = rtc_read(rtc, OMAP_RTC_DAYS_REG); in omap_rtc_read_time_raw()
308 tm->tm_mon = rtc_read(rtc, OMAP_RTC_MONTHS_REG); in omap_rtc_read_time_raw()
309 tm->tm_year = rtc_read(rtc, OMAP_RTC_YEARS_REG); in omap_rtc_read_time_raw()
314 struct omap_rtc *rtc = dev_get_drvdata(dev); in omap_rtc_read_time() local
318 rtc_wait_not_busy(rtc); in omap_rtc_read_time()
319 omap_rtc_read_time_raw(rtc, tm); in omap_rtc_read_time()
329 struct omap_rtc *rtc = dev_get_drvdata(dev); in omap_rtc_set_time() local
335 rtc_wait_not_busy(rtc); in omap_rtc_set_time()
337 rtc->type->unlock(rtc); in omap_rtc_set_time()
338 rtc_write(rtc, OMAP_RTC_YEARS_REG, tm->tm_year); in omap_rtc_set_time()
339 rtc_write(rtc, OMAP_RTC_MONTHS_REG, tm->tm_mon); in omap_rtc_set_time()
340 rtc_write(rtc, OMAP_RTC_DAYS_REG, tm->tm_mday); in omap_rtc_set_time()
341 rtc_write(rtc, OMAP_RTC_HOURS_REG, tm->tm_hour); in omap_rtc_set_time()
342 rtc_write(rtc, OMAP_RTC_MINUTES_REG, tm->tm_min); in omap_rtc_set_time()
343 rtc_write(rtc, OMAP_RTC_SECONDS_REG, tm->tm_sec); in omap_rtc_set_time()
344 rtc->type->lock(rtc); in omap_rtc_set_time()
353 struct omap_rtc *rtc = dev_get_drvdata(dev); in omap_rtc_read_alarm() local
357 rtc_wait_not_busy(rtc); in omap_rtc_read_alarm()
359 alm->time.tm_sec = rtc_read(rtc, OMAP_RTC_ALARM_SECONDS_REG); in omap_rtc_read_alarm()
360 alm->time.tm_min = rtc_read(rtc, OMAP_RTC_ALARM_MINUTES_REG); in omap_rtc_read_alarm()
361 alm->time.tm_hour = rtc_read(rtc, OMAP_RTC_ALARM_HOURS_REG); in omap_rtc_read_alarm()
362 alm->time.tm_mday = rtc_read(rtc, OMAP_RTC_ALARM_DAYS_REG); in omap_rtc_read_alarm()
363 alm->time.tm_mon = rtc_read(rtc, OMAP_RTC_ALARM_MONTHS_REG); in omap_rtc_read_alarm()
364 alm->time.tm_year = rtc_read(rtc, OMAP_RTC_ALARM_YEARS_REG); in omap_rtc_read_alarm()
370 interrupts = rtc_read(rtc, OMAP_RTC_INTERRUPTS_REG); in omap_rtc_read_alarm()
378 struct omap_rtc *rtc = dev_get_drvdata(dev); in omap_rtc_set_alarm() local
385 rtc_wait_not_busy(rtc); in omap_rtc_set_alarm()
387 rtc->type->unlock(rtc); in omap_rtc_set_alarm()
388 rtc_write(rtc, OMAP_RTC_ALARM_YEARS_REG, alm->time.tm_year); in omap_rtc_set_alarm()
389 rtc_write(rtc, OMAP_RTC_ALARM_MONTHS_REG, alm->time.tm_mon); in omap_rtc_set_alarm()
390 rtc_write(rtc, OMAP_RTC_ALARM_DAYS_REG, alm->time.tm_mday); in omap_rtc_set_alarm()
391 rtc_write(rtc, OMAP_RTC_ALARM_HOURS_REG, alm->time.tm_hour); in omap_rtc_set_alarm()
392 rtc_write(rtc, OMAP_RTC_ALARM_MINUTES_REG, alm->time.tm_min); in omap_rtc_set_alarm()
393 rtc_write(rtc, OMAP_RTC_ALARM_SECONDS_REG, alm->time.tm_sec); in omap_rtc_set_alarm()
395 reg = rtc_read(rtc, OMAP_RTC_INTERRUPTS_REG); in omap_rtc_set_alarm()
396 if (rtc->type->has_irqwakeen) in omap_rtc_set_alarm()
397 irqwake_reg = rtc_read(rtc, OMAP_RTC_IRQWAKEEN); in omap_rtc_set_alarm()
406 rtc_write(rtc, OMAP_RTC_INTERRUPTS_REG, reg); in omap_rtc_set_alarm()
407 if (rtc->type->has_irqwakeen) in omap_rtc_set_alarm()
408 rtc_write(rtc, OMAP_RTC_IRQWAKEEN, irqwake_reg); in omap_rtc_set_alarm()
409 rtc->type->lock(rtc); in omap_rtc_set_alarm()
419 * omap_rtc_poweroff: RTC-controlled power off
421 * The RTC can be used to control an external PMIC via the pmic_power_en pin,
434 struct omap_rtc *rtc = omap_rtc_power_off_rtc; in omap_rtc_power_off() local
439 rtc->type->unlock(rtc); in omap_rtc_power_off()
441 val = rtc_readl(rtc, OMAP_RTC_PMIC_REG); in omap_rtc_power_off()
442 rtc_writel(rtc, OMAP_RTC_PMIC_REG, val | OMAP_RTC_PMIC_POWER_EN_EN); in omap_rtc_power_off()
445 omap_rtc_read_time_raw(rtc, &tm); in omap_rtc_power_off()
451 dev_err(&rtc->rtc->dev, "power off failed\n"); in omap_rtc_power_off()
452 rtc->type->lock(rtc); in omap_rtc_power_off()
456 rtc_wait_not_busy(rtc); in omap_rtc_power_off()
458 rtc_write(rtc, OMAP_RTC_ALARM2_SECONDS_REG, tm.tm_sec); in omap_rtc_power_off()
459 rtc_write(rtc, OMAP_RTC_ALARM2_MINUTES_REG, tm.tm_min); in omap_rtc_power_off()
460 rtc_write(rtc, OMAP_RTC_ALARM2_HOURS_REG, tm.tm_hour); in omap_rtc_power_off()
461 rtc_write(rtc, OMAP_RTC_ALARM2_DAYS_REG, tm.tm_mday); in omap_rtc_power_off()
462 rtc_write(rtc, OMAP_RTC_ALARM2_MONTHS_REG, tm.tm_mon); in omap_rtc_power_off()
463 rtc_write(rtc, OMAP_RTC_ALARM2_YEARS_REG, tm.tm_year); in omap_rtc_power_off()
470 val = rtc_read(rtc, OMAP_RTC_INTERRUPTS_REG); in omap_rtc_power_off()
471 rtc_writel(rtc, OMAP_RTC_INTERRUPTS_REG, in omap_rtc_power_off()
473 rtc->type->lock(rtc); in omap_rtc_power_off()
515 .name = "am3352-rtc",
518 .name = "da830-rtc",
528 .compatible = "ti,am3352-rtc",
531 .compatible = "ti,da830-rtc",
579 struct omap_rtc *rtc = pinctrl_dev_get_drvdata(pctldev); in rtc_pinconf_get() local
584 val = rtc_readl(rtc, OMAP_RTC_PMIC_REG); in rtc_pinconf_get()
608 struct omap_rtc *rtc = pinctrl_dev_get_drvdata(pctldev); in rtc_pinconf_set() local
614 val = rtc_readl(rtc, OMAP_RTC_PMIC_REG); in rtc_pinconf_set()
634 dev_err(&rtc->rtc->dev, "Property %u not supported\n", in rtc_pinconf_set()
640 rtc->type->unlock(rtc); in rtc_pinconf_set()
641 rtc_writel(rtc, OMAP_RTC_PMIC_REG, val); in rtc_pinconf_set()
642 rtc->type->lock(rtc); in rtc_pinconf_set()
669 struct omap_rtc *rtc = priv; in omap_rtc_scratch_read() local
674 val[i] = rtc_readl(rtc, in omap_rtc_scratch_read()
683 struct omap_rtc *rtc = priv; in omap_rtc_scratch_write() local
687 rtc->type->unlock(rtc); in omap_rtc_scratch_write()
689 rtc_writel(rtc, in omap_rtc_scratch_write()
691 rtc->type->lock(rtc); in omap_rtc_scratch_write()
707 struct omap_rtc *rtc; in omap_rtc_probe() local
714 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); in omap_rtc_probe()
715 if (!rtc) in omap_rtc_probe()
720 rtc->type = of_id->data; in omap_rtc_probe()
721 rtc->is_pmic_controller = rtc->type->has_pmic_mode && in omap_rtc_probe()
726 rtc->type = (void *)id_entry->driver_data; in omap_rtc_probe()
729 rtc->irq_timer = platform_get_irq(pdev, 0); in omap_rtc_probe()
730 if (rtc->irq_timer <= 0) in omap_rtc_probe()
733 rtc->irq_alarm = platform_get_irq(pdev, 1); in omap_rtc_probe()
734 if (rtc->irq_alarm <= 0) in omap_rtc_probe()
737 rtc->clk = devm_clk_get(&pdev->dev, "ext-clk"); in omap_rtc_probe()
738 if (!IS_ERR(rtc->clk)) in omap_rtc_probe()
739 rtc->has_ext_clk = true; in omap_rtc_probe()
741 rtc->clk = devm_clk_get(&pdev->dev, "int-clk"); in omap_rtc_probe()
743 if (!IS_ERR(rtc->clk)) in omap_rtc_probe()
744 clk_prepare_enable(rtc->clk); in omap_rtc_probe()
747 rtc->base = devm_ioremap_resource(&pdev->dev, res); in omap_rtc_probe()
748 if (IS_ERR(rtc->base)) { in omap_rtc_probe()
749 clk_disable_unprepare(rtc->clk); in omap_rtc_probe()
750 return PTR_ERR(rtc->base); in omap_rtc_probe()
753 platform_set_drvdata(pdev, rtc); in omap_rtc_probe()
759 rtc->type->unlock(rtc); in omap_rtc_probe()
766 rtc_writel(rtc, OMAP_RTC_INTERRUPTS_REG, 0); in omap_rtc_probe()
768 /* enable RTC functional clock */ in omap_rtc_probe()
769 if (rtc->type->has_32kclk_en) { in omap_rtc_probe()
770 reg = rtc_read(rtc, OMAP_RTC_OSC_REG); in omap_rtc_probe()
771 rtc_writel(rtc, OMAP_RTC_OSC_REG, in omap_rtc_probe()
776 reg = rtc_read(rtc, OMAP_RTC_STATUS_REG); in omap_rtc_probe()
780 if (rtc->type->has_pmic_mode) in omap_rtc_probe()
783 if (rtc->type->has_power_up_reset) { in omap_rtc_probe()
786 dev_info(&pdev->dev, "RTC power up reset detected\n"); in omap_rtc_probe()
790 rtc_write(rtc, OMAP_RTC_STATUS_REG, reg & mask); in omap_rtc_probe()
792 /* On boards with split power, RTC_ON_NOFF won't reset the RTC */ in omap_rtc_probe()
793 reg = rtc_read(rtc, OMAP_RTC_CTRL_REG); in omap_rtc_probe()
807 * being woken up by RTC alarm. For OMAP-L138, this capability in omap_rtc_probe()
820 rtc_write(rtc, OMAP_RTC_CTRL_REG, new_ctrl); in omap_rtc_probe()
826 if (rtc->has_ext_clk) { in omap_rtc_probe()
827 reg = rtc_read(rtc, OMAP_RTC_OSC_REG); in omap_rtc_probe()
830 rtc_writel(rtc, OMAP_RTC_OSC_REG, reg); in omap_rtc_probe()
833 rtc->type->lock(rtc); in omap_rtc_probe()
837 rtc->rtc = devm_rtc_allocate_device(&pdev->dev); in omap_rtc_probe()
838 if (IS_ERR(rtc->rtc)) { in omap_rtc_probe()
839 ret = PTR_ERR(rtc->rtc); in omap_rtc_probe()
843 rtc->rtc->ops = &omap_rtc_ops; in omap_rtc_probe()
844 omap_rtc_nvmem_config.priv = rtc; in omap_rtc_probe()
847 ret = devm_request_irq(&pdev->dev, rtc->irq_timer, rtc_irq, 0, in omap_rtc_probe()
848 dev_name(&rtc->rtc->dev), rtc); in omap_rtc_probe()
852 if (rtc->irq_timer != rtc->irq_alarm) { in omap_rtc_probe()
853 ret = devm_request_irq(&pdev->dev, rtc->irq_alarm, rtc_irq, 0, in omap_rtc_probe()
854 dev_name(&rtc->rtc->dev), rtc); in omap_rtc_probe()
862 rtc->pctldev = pinctrl_register(&rtc_pinctrl_desc, &pdev->dev, rtc); in omap_rtc_probe()
863 if (IS_ERR(rtc->pctldev)) { in omap_rtc_probe()
865 ret = PTR_ERR(rtc->pctldev); in omap_rtc_probe()
869 ret = rtc_register_device(rtc->rtc); in omap_rtc_probe()
873 rtc_nvmem_register(rtc->rtc, &omap_rtc_nvmem_config); in omap_rtc_probe()
875 if (rtc->is_pmic_controller) { in omap_rtc_probe()
877 omap_rtc_power_off_rtc = rtc; in omap_rtc_probe()
885 pinctrl_unregister(rtc->pctldev); in omap_rtc_probe()
887 clk_disable_unprepare(rtc->clk); in omap_rtc_probe()
889 rtc->type->lock(rtc); in omap_rtc_probe()
898 struct omap_rtc *rtc = platform_get_drvdata(pdev); in omap_rtc_remove() local
902 omap_rtc_power_off_rtc == rtc) { in omap_rtc_remove()
909 if (!IS_ERR(rtc->clk)) in omap_rtc_remove()
910 clk_disable_unprepare(rtc->clk); in omap_rtc_remove()
912 rtc->type->unlock(rtc); in omap_rtc_remove()
913 /* leave rtc running, but disable irqs */ in omap_rtc_remove()
914 rtc_write(rtc, OMAP_RTC_INTERRUPTS_REG, 0); in omap_rtc_remove()
916 if (rtc->has_ext_clk) { in omap_rtc_remove()
917 reg = rtc_read(rtc, OMAP_RTC_OSC_REG); in omap_rtc_remove()
919 rtc_write(rtc, OMAP_RTC_OSC_REG, reg); in omap_rtc_remove()
922 rtc->type->lock(rtc); in omap_rtc_remove()
929 pinctrl_unregister(rtc->pctldev); in omap_rtc_remove()
936 struct omap_rtc *rtc = dev_get_drvdata(dev); in omap_rtc_suspend() local
938 rtc->interrupts_reg = rtc_read(rtc, OMAP_RTC_INTERRUPTS_REG); in omap_rtc_suspend()
940 rtc->type->unlock(rtc); in omap_rtc_suspend()
942 * FIXME: the RTC alarm is not currently acting as a wakeup event in omap_rtc_suspend()
947 enable_irq_wake(rtc->irq_alarm); in omap_rtc_suspend()
949 rtc_write(rtc, OMAP_RTC_INTERRUPTS_REG, 0); in omap_rtc_suspend()
950 rtc->type->lock(rtc); in omap_rtc_suspend()
952 rtc->is_suspending = true; in omap_rtc_suspend()
959 struct omap_rtc *rtc = dev_get_drvdata(dev); in omap_rtc_resume() local
961 rtc->type->unlock(rtc); in omap_rtc_resume()
963 disable_irq_wake(rtc->irq_alarm); in omap_rtc_resume()
965 rtc_write(rtc, OMAP_RTC_INTERRUPTS_REG, rtc->interrupts_reg); in omap_rtc_resume()
966 rtc->type->lock(rtc); in omap_rtc_resume()
968 rtc->is_suspending = false; in omap_rtc_resume()
975 struct omap_rtc *rtc = dev_get_drvdata(dev); in omap_rtc_runtime_suspend() local
977 if (rtc->is_suspending && !rtc->has_ext_clk) in omap_rtc_runtime_suspend()
990 struct omap_rtc *rtc = platform_get_drvdata(pdev); in omap_rtc_shutdown() local
997 rtc->type->unlock(rtc); in omap_rtc_shutdown()
998 mask = rtc_read(rtc, OMAP_RTC_INTERRUPTS_REG); in omap_rtc_shutdown()
1000 rtc_write(rtc, OMAP_RTC_INTERRUPTS_REG, mask); in omap_rtc_shutdown()
1001 rtc->type->lock(rtc); in omap_rtc_shutdown()