• Home
  • Raw
  • Download

Lines Matching +full:real +full:- +full:time

2  * "RTT as Real Time Clock" driver for AT91SAM9 SoC family
6 * Based on rtc-at91rm9200.c by Rick Bronson
27 #include <linux/time.h>
32 * to implement the Real Time Clock interfaces
34 * - A "Real-time Timer" (RTT) counts up in seconds from a base time.
37 * - One of the "General Purpose Backup Registers" (GPBRs) holds the
38 * base time, normally an offset from the beginning of the POSIX
39 * epoch (1970-Jan-1 00:00:00 UTC). Some systems also include the
46 * choose from, or a "real" RTC module. All systems have multiple GPBR
50 #define AT91_RTT_MR 0x00 /* Real-time Mode Register */
51 #define AT91_RTT_RTPRES (0xffff << 0) /* Real-time Timer Prescaler Value */
53 #define AT91_RTT_RTTINCIEN (1 << 17) /* Real Time Timer Increment Interrupt Enable */
54 #define AT91_RTT_RTTRST (1 << 18) /* Real Time Timer Restart */
56 #define AT91_RTT_AR 0x04 /* Real-time Alarm Register */
59 #define AT91_RTT_VR 0x08 /* Real-time Value Register */
60 #define AT91_RTT_CRTV (0xffffffff) /* Current Real-time Value */
62 #define AT91_RTT_SR 0x0c /* Real-time Status Register */
63 #define AT91_RTT_ALMS (1 << 0) /* Real-time Alarm Status */
64 #define AT91_RTT_RTTINC (1 << 1) /* Real-time Timer Increment */
87 readl((rtc)->rtt + AT91_RTT_ ## field)
89 writel((val), (rtc)->rtt + AT91_RTT_ ## field)
95 regmap_read(rtc->gpbr, rtc->gpbr_offset, &val); in gpbr_readl()
102 regmap_write(rtc->gpbr, rtc->gpbr_offset, val); in gpbr_writel()
106 * Read current time and date in RTC
114 /* read current time offset */ in at91_rtc_readtime()
117 return -EILSEQ; in at91_rtc_readtime()
127 dev_dbg(dev, "%s: %4d-%02d-%02d %02d:%02d:%02d\n", "readtime", in at91_rtc_readtime()
128 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday, in at91_rtc_readtime()
129 tm->tm_hour, tm->tm_min, tm->tm_sec); in at91_rtc_readtime()
135 * Set current time and date in RTC
144 dev_dbg(dev, "%s: %4d-%02d-%02d %02d:%02d:%02d\n", "settime", in at91_rtc_settime()
145 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday, in at91_rtc_settime()
146 tm->tm_hour, tm->tm_min, tm->tm_sec); in at91_rtc_settime()
157 /* read current time offset */ in at91_rtc_settime()
160 /* store the new base time in a battery backup register */ in at91_rtc_settime()
164 /* adjust the alarm time for the new base */ in at91_rtc_settime()
168 /* time jumped backwards, increase time until alarm */ in at91_rtc_settime()
169 alarm += (offset - secs); in at91_rtc_settime()
171 /* time jumped forwards, decrease time until alarm */ in at91_rtc_settime()
172 alarm -= (secs - offset); in at91_rtc_settime()
174 /* time jumped past the alarm, disable alarm */ in at91_rtc_settime()
181 /* reset the timer, and re-enable interrupts */ in at91_rtc_settime()
190 struct rtc_time *tm = &alrm->time; in at91_rtc_readalarm()
196 return -EILSEQ; in at91_rtc_readalarm()
202 dev_dbg(dev, "%s: %4d-%02d-%02d %02d:%02d:%02d\n", "readalarm", in at91_rtc_readalarm()
203 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday, in at91_rtc_readalarm()
204 tm->tm_hour, tm->tm_min, tm->tm_sec); in at91_rtc_readalarm()
207 alrm->enabled = 1; in at91_rtc_readalarm()
216 struct rtc_time *tm = &alrm->time; in at91_rtc_setalarm()
228 /* time is not set */ in at91_rtc_setalarm()
229 return -EILSEQ; in at91_rtc_setalarm()
241 rtt_writel(rtc, AR, secs - offset); in at91_rtc_setalarm()
242 if (alrm->enabled) in at91_rtc_setalarm()
245 dev_dbg(dev, "%s: %4d-%02d-%02d %02d:%02d:%02d\n", "setalarm", in at91_rtc_setalarm()
246 tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, in at91_rtc_setalarm()
247 tm->tm_min, tm->tm_sec); in at91_rtc_setalarm()
292 rtc->events |= (RTC_AF | RTC_IRQF); in at91_rtc_cache_events()
296 rtc->events |= (RTC_UF | RTC_IRQF); in at91_rtc_cache_events()
303 if (!rtc->events) in at91_rtc_flush_events()
306 rtc_update_irq(rtc->rtcdev, 1, rtc->events); in at91_rtc_flush_events()
307 rtc->events = 0; in at91_rtc_flush_events()
310 rtc->events >> 8, rtc->events & 0x000000FF); in at91_rtc_flush_events()
321 spin_lock(&rtc->lock); in at91_rtc_interrupt()
326 if (rtc->suspended) { in at91_rtc_interrupt()
337 spin_unlock(&rtc->lock); in at91_rtc_interrupt()
371 dev_err(&pdev->dev, "failed to get interrupt resource\n"); in at91_rtc_probe()
375 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); in at91_rtc_probe()
377 return -ENOMEM; in at91_rtc_probe()
379 spin_lock_init(&rtc->lock); in at91_rtc_probe()
380 rtc->irq = irq; in at91_rtc_probe()
383 if (!device_can_wakeup(&pdev->dev)) in at91_rtc_probe()
384 device_init_wakeup(&pdev->dev, 1); in at91_rtc_probe()
389 rtc->rtt = devm_ioremap_resource(&pdev->dev, r); in at91_rtc_probe()
390 if (IS_ERR(rtc->rtt)) in at91_rtc_probe()
391 return PTR_ERR(rtc->rtt); in at91_rtc_probe()
393 if (!pdev->dev.of_node) { in at91_rtc_probe()
402 gpbr = devm_ioremap_resource(&pdev->dev, r); in at91_rtc_probe()
406 rtc->gpbr = regmap_init_mmio(NULL, gpbr, in at91_rtc_probe()
411 ret = of_parse_phandle_with_fixed_args(pdev->dev.of_node, in at91_rtc_probe()
412 "atmel,rtt-rtc-time-reg", 1, 0, in at91_rtc_probe()
417 rtc->gpbr = syscon_node_to_regmap(args.np); in at91_rtc_probe()
418 rtc->gpbr_offset = args.args[0]; in at91_rtc_probe()
421 if (IS_ERR(rtc->gpbr)) { in at91_rtc_probe()
422 dev_err(&pdev->dev, "failed to retrieve gpbr regmap, aborting.\n"); in at91_rtc_probe()
423 return -ENOMEM; in at91_rtc_probe()
426 rtc->sclk = devm_clk_get(&pdev->dev, NULL); in at91_rtc_probe()
427 if (IS_ERR(rtc->sclk)) in at91_rtc_probe()
428 return PTR_ERR(rtc->sclk); in at91_rtc_probe()
430 ret = clk_prepare_enable(rtc->sclk); in at91_rtc_probe()
432 dev_err(&pdev->dev, "Could not enable slow clock\n"); in at91_rtc_probe()
436 sclk_rate = clk_get_rate(rtc->sclk); in at91_rtc_probe()
438 dev_err(&pdev->dev, "Invalid slow clock rate\n"); in at91_rtc_probe()
439 ret = -EINVAL; in at91_rtc_probe()
445 /* unless RTT is counting at 1 Hz, re-initialize it */ in at91_rtc_probe()
455 rtc->rtcdev = devm_rtc_device_register(&pdev->dev, pdev->name, in at91_rtc_probe()
457 if (IS_ERR(rtc->rtcdev)) { in at91_rtc_probe()
458 ret = PTR_ERR(rtc->rtcdev); in at91_rtc_probe()
463 ret = devm_request_irq(&pdev->dev, rtc->irq, at91_rtc_interrupt, in at91_rtc_probe()
465 dev_name(&rtc->rtcdev->dev), rtc); in at91_rtc_probe()
467 dev_dbg(&pdev->dev, "can't share IRQ %d?\n", rtc->irq); in at91_rtc_probe()
473 * initialize the time from some external source like a GPS, wall in at91_rtc_probe()
478 dev_warn(&pdev->dev, "%s: SET TIME!\n", in at91_rtc_probe()
479 dev_name(&rtc->rtcdev->dev)); in at91_rtc_probe()
484 clk_disable_unprepare(rtc->sclk); in at91_rtc_probe()
500 clk_disable_unprepare(rtc->sclk); in at91_rtc_remove()
510 rtc->imr = mr & (AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN); in at91_rtc_shutdown()
511 rtt_writel(rtc, MR, mr & ~rtc->imr); in at91_rtc_shutdown()
527 rtc->imr = mr & (AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN); in at91_rtc_suspend()
528 if (rtc->imr) { in at91_rtc_suspend()
532 enable_irq_wake(rtc->irq); in at91_rtc_suspend()
533 spin_lock_irqsave(&rtc->lock, flags); in at91_rtc_suspend()
534 rtc->suspended = true; in at91_rtc_suspend()
535 spin_unlock_irqrestore(&rtc->lock, flags); in at91_rtc_suspend()
540 rtt_writel(rtc, MR, mr & ~rtc->imr); in at91_rtc_suspend()
551 if (rtc->imr) { in at91_rtc_resume()
555 disable_irq_wake(rtc->irq); in at91_rtc_resume()
557 rtt_writel(rtc, MR, mr | rtc->imr); in at91_rtc_resume()
559 spin_lock_irqsave(&rtc->lock, flags); in at91_rtc_resume()
560 rtc->suspended = false; in at91_rtc_resume()
563 spin_unlock_irqrestore(&rtc->lock, flags); in at91_rtc_resume()
574 { .compatible = "atmel,at91sam9260-rtt" },
585 .name = "rtc-at91sam9",