Lines Matching refs:rtc
7 * Based on rtc-at91rm9200.c by Rick Bronson
20 #include <linux/rtc.h>
81 #define rtt_readl(rtc, field) \
82 readl((rtc)->rtt + AT91_RTT_ ## field)
83 #define rtt_writel(rtc, field, val) \
84 writel((val), (rtc)->rtt + AT91_RTT_ ## field)
86 static inline unsigned int gpbr_readl(struct sam9_rtc *rtc)
90 regmap_read(rtc->gpbr, rtc->gpbr_offset, &val);
95 static inline void gpbr_writel(struct sam9_rtc *rtc, unsigned int val)
97 regmap_write(rtc->gpbr, rtc->gpbr_offset, val);
105 struct sam9_rtc *rtc = dev_get_drvdata(dev);
110 offset = gpbr_readl(rtc);
115 secs = rtt_readl(rtc, VR);
116 secs2 = rtt_readl(rtc, VR);
118 secs = rtt_readl(rtc, VR);
132 struct sam9_rtc *rtc = dev_get_drvdata(dev);
140 mr = rtt_readl(rtc, MR);
143 rtt_writel(rtc, MR, mr & ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN));
146 offset = gpbr_readl(rtc);
150 gpbr_writel(rtc, secs);
153 alarm = rtt_readl(rtc, AR);
166 rtt_writel(rtc, AR, alarm);
170 rtt_writel(rtc, MR, mr | AT91_RTT_RTTRST);
177 struct sam9_rtc *rtc = dev_get_drvdata(dev);
179 u32 alarm = rtt_readl(rtc, AR);
182 offset = gpbr_readl(rtc);
192 if (rtt_readl(rtc, MR) & AT91_RTT_ALMIEN)
201 struct sam9_rtc *rtc = dev_get_drvdata(dev);
209 offset = gpbr_readl(rtc);
214 mr = rtt_readl(rtc, MR);
215 rtt_writel(rtc, MR, mr & ~AT91_RTT_ALMIEN);
219 rtt_writel(rtc, AR, ALARM_DISABLED);
224 rtt_writel(rtc, AR, secs - offset);
226 rtt_writel(rtc, MR, mr | AT91_RTT_ALMIEN);
235 struct sam9_rtc *rtc = dev_get_drvdata(dev);
236 u32 mr = rtt_readl(rtc, MR);
240 rtt_writel(rtc, MR, mr | AT91_RTT_ALMIEN);
242 rtt_writel(rtc, MR, mr & ~AT91_RTT_ALMIEN);
247 * Provide additional RTC information in /proc/driver/rtc
251 struct sam9_rtc *rtc = dev_get_drvdata(dev);
252 u32 mr = rtt_readl(rtc, MR);
259 static irqreturn_t at91_rtc_cache_events(struct sam9_rtc *rtc)
266 mr = rtt_readl(rtc, MR) & (AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN);
267 sr = rtt_readl(rtc, SR) & (mr >> 16);
273 rtc->events |= (RTC_AF | RTC_IRQF);
277 rtc->events |= (RTC_UF | RTC_IRQF);
282 static void at91_rtc_flush_events(struct sam9_rtc *rtc)
284 if (!rtc->events)
287 rtc_update_irq(rtc->rtcdev, 1, rtc->events);
288 rtc->events = 0;
291 rtc->events >> 8, rtc->events & 0x000000FF);
299 struct sam9_rtc *rtc = _rtc;
302 spin_lock(&rtc->lock);
304 ret = at91_rtc_cache_events(rtc);
307 if (rtc->suspended) {
309 rtt_writel(rtc, MR,
310 rtt_readl(rtc, MR) &
315 at91_rtc_flush_events(rtc);
318 spin_unlock(&rtc->lock);
337 struct sam9_rtc *rtc;
347 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL);
348 if (!rtc)
351 spin_lock_init(&rtc->lock);
352 rtc->irq = irq;
358 platform_set_drvdata(pdev, rtc);
360 rtc->rtt = devm_platform_ioremap_resource(pdev, 0);
361 if (IS_ERR(rtc->rtt))
362 return PTR_ERR(rtc->rtt);
365 "atmel,rtt-rtc-time-reg", 1, 0,
370 rtc->gpbr = syscon_node_to_regmap(args.np);
371 rtc->gpbr_offset = args.args[0];
372 if (IS_ERR(rtc->gpbr)) {
377 rtc->sclk = devm_clk_get(&pdev->dev, NULL);
378 if (IS_ERR(rtc->sclk))
379 return PTR_ERR(rtc->sclk);
381 ret = clk_prepare_enable(rtc->sclk);
387 sclk_rate = clk_get_rate(rtc->sclk);
394 mr = rtt_readl(rtc, MR);
399 gpbr_writel(rtc, 0);
404 rtt_writel(rtc, MR, mr);
406 rtc->rtcdev = devm_rtc_allocate_device(&pdev->dev);
407 if (IS_ERR(rtc->rtcdev)) {
408 ret = PTR_ERR(rtc->rtcdev);
412 rtc->rtcdev->ops = &at91_rtc_ops;
413 rtc->rtcdev->range_max = U32_MAX;
416 ret = devm_request_irq(&pdev->dev, rtc->irq, at91_rtc_interrupt,
418 dev_name(&rtc->rtcdev->dev), rtc);
420 dev_dbg(&pdev->dev, "can't share IRQ %d?\n", rtc->irq);
430 if (gpbr_readl(rtc) == 0)
432 dev_name(&rtc->rtcdev->dev));
434 return devm_rtc_register_device(rtc->rtcdev);
437 clk_disable_unprepare(rtc->sclk);
447 struct sam9_rtc *rtc = platform_get_drvdata(pdev);
448 u32 mr = rtt_readl(rtc, MR);
451 rtt_writel(rtc, MR, mr & ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN));
453 clk_disable_unprepare(rtc->sclk);
458 struct sam9_rtc *rtc = platform_get_drvdata(pdev);
459 u32 mr = rtt_readl(rtc, MR);
461 rtc->imr = mr & (AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN);
462 rtt_writel(rtc, MR, mr & ~rtc->imr);
471 struct sam9_rtc *rtc = dev_get_drvdata(dev);
472 u32 mr = rtt_readl(rtc, MR);
478 rtc->imr = mr & (AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN);
479 if (rtc->imr) {
483 enable_irq_wake(rtc->irq);
484 spin_lock_irqsave(&rtc->lock, flags);
485 rtc->suspended = true;
486 spin_unlock_irqrestore(&rtc->lock, flags);
489 rtt_writel(rtc, MR, mr & ~AT91_RTT_RTTINCIEN);
491 rtt_writel(rtc, MR, mr & ~rtc->imr);
500 struct sam9_rtc *rtc = dev_get_drvdata(dev);
503 if (rtc->imr) {
507 disable_irq_wake(rtc->irq);
508 mr = rtt_readl(rtc, MR);
509 rtt_writel(rtc, MR, mr | rtc->imr);
511 spin_lock_irqsave(&rtc->lock, flags);
512 rtc->suspended = false;
513 at91_rtc_cache_events(rtc);
514 at91_rtc_flush_events(rtc);
515 spin_unlock_irqrestore(&rtc->lock, flags);
535 .name = "rtc-at91sam9",