• Home
  • Raw
  • Download

Lines Matching +full:at91rm9200 +full:- +full:rtc

2  *	Real Time Clock interface for Linux on Atmel AT91RM9200
6 * Converted to RTC class model by Andrew Victor
9 * Based on s3c2410-rtc.c Simtec Electronics
11 * Based on sa1100-rtc.c by Nils Faerber
12 * Based on rtc.c by Paul Gortmaker
32 #include <linux/rtc.h>
38 #include "rtc-at91rm9200.h"
79 * Register read back (of any RTC-register) needed to make sure in at91_rtc_write_idr()
80 * IDR-register write has reached the peripheral before updating in at91_rtc_write_idr()
85 * way to be certain would be to poll the IMR-register, which is is in at91_rtc_write_idr()
99 if (at91_rtc_config->use_shadow_imr) { in at91_rtc_read_imr()
125 tm->tm_sec = bcd2bin((time & AT91_RTC_SEC) >> 0); in at91_rtc_decodetime()
126 tm->tm_min = bcd2bin((time & AT91_RTC_MIN) >> 8); in at91_rtc_decodetime()
127 tm->tm_hour = bcd2bin((time & AT91_RTC_HOUR) >> 16); in at91_rtc_decodetime()
131 * the year - so these will return an invalid value. in at91_rtc_decodetime()
133 tm->tm_year = bcd2bin(date & AT91_RTC_CENT) * 100; /* century */ in at91_rtc_decodetime()
134 tm->tm_year += bcd2bin((date & AT91_RTC_YEAR) >> 8); /* year */ in at91_rtc_decodetime()
136 tm->tm_wday = bcd2bin((date & AT91_RTC_DAY) >> 21) - 1; /* day of the week [0-6], Sunday=0 */ in at91_rtc_decodetime()
137 tm->tm_mon = bcd2bin((date & AT91_RTC_MONTH) >> 16) - 1; in at91_rtc_decodetime()
138 tm->tm_mday = bcd2bin((date & AT91_RTC_DATE) >> 24); in at91_rtc_decodetime()
142 * Read current time and date in RTC
147 tm->tm_yday = rtc_year_days(tm->tm_mday, tm->tm_mon, tm->tm_year); in at91_rtc_readtime()
148 tm->tm_year = tm->tm_year - 1900; in at91_rtc_readtime()
150 dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__, in at91_rtc_readtime()
151 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday, in at91_rtc_readtime()
152 tm->tm_hour, tm->tm_min, tm->tm_sec); in at91_rtc_readtime()
158 * Set current time and date in RTC
164 dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__, in at91_rtc_settime()
165 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday, in at91_rtc_settime()
166 tm->tm_hour, tm->tm_min, tm->tm_sec); in at91_rtc_settime()
179 bin2bcd(tm->tm_sec) << 0 in at91_rtc_settime()
180 | bin2bcd(tm->tm_min) << 8 in at91_rtc_settime()
181 | bin2bcd(tm->tm_hour) << 16); in at91_rtc_settime()
184 bin2bcd((tm->tm_year + 1900) / 100) /* century */ in at91_rtc_settime()
185 | bin2bcd(tm->tm_year % 100) << 8 /* year */ in at91_rtc_settime()
186 | bin2bcd(tm->tm_mon + 1) << 16 /* tm_mon starts at zero */ in at91_rtc_settime()
187 | bin2bcd(tm->tm_wday + 1) << 21 /* day of the week [0-6], Sunday=0 */ in at91_rtc_settime()
188 | bin2bcd(tm->tm_mday) << 24); in at91_rtc_settime()
200 * Read alarm time and date in RTC
204 struct rtc_time *tm = &alrm->time; in at91_rtc_readalarm()
207 tm->tm_year = -1; in at91_rtc_readalarm()
209 alrm->enabled = (at91_rtc_read_imr() & AT91_RTC_ALARM) in at91_rtc_readalarm()
212 dev_dbg(dev, "%s(): %02d-%02d %02d:%02d:%02d %sabled\n", __func__, in at91_rtc_readalarm()
213 tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, in at91_rtc_readalarm()
214 alrm->enabled ? "en" : "dis"); in at91_rtc_readalarm()
220 * Set alarm time and date in RTC
228 tm.tm_mon = alrm->time.tm_mon; in at91_rtc_setalarm()
229 tm.tm_mday = alrm->time.tm_mday; in at91_rtc_setalarm()
230 tm.tm_hour = alrm->time.tm_hour; in at91_rtc_setalarm()
231 tm.tm_min = alrm->time.tm_min; in at91_rtc_setalarm()
232 tm.tm_sec = alrm->time.tm_sec; in at91_rtc_setalarm()
245 if (alrm->enabled) { in at91_rtc_setalarm()
250 dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__, in at91_rtc_setalarm()
270 * Provide additional RTC information in /proc/driver/rtc
285 * IRQ handler for the RTC
290 struct rtc_device *rtc = platform_get_drvdata(pdev); in at91_rtc_interrupt() local
310 rtc_update_irq(rtc, 1, events); in at91_rtc_interrupt()
312 dev_dbg(&pdev->dev, "%s(): num=%ld, events=0x%02lx\n", in at91_rtc_interrupt()
337 .compatible = "atmel,at91rm9200-rtc",
340 .compatible = "atmel,at91sam9x5-rtc",
354 if (pdev->dev.of_node) { in at91_rtc_get_config()
355 match = of_match_node(at91_rtc_dt_ids, pdev->dev.of_node); in at91_rtc_get_config()
358 return (const struct at91_rtc_config *)match->data; in at91_rtc_get_config()
374 * Initialize and install RTC driver
378 struct rtc_device *rtc; in at91_rtc_probe() local
384 return -ENODEV; in at91_rtc_probe()
388 dev_err(&pdev->dev, "no mmio resource defined\n"); in at91_rtc_probe()
389 return -ENXIO; in at91_rtc_probe()
394 dev_err(&pdev->dev, "no irq resource defined\n"); in at91_rtc_probe()
395 return -ENXIO; in at91_rtc_probe()
398 at91_rtc_regs = devm_ioremap(&pdev->dev, regs->start, in at91_rtc_probe()
401 dev_err(&pdev->dev, "failed to map registers, aborting.\n"); in at91_rtc_probe()
402 return -ENOMEM; in at91_rtc_probe()
405 rtc = devm_rtc_allocate_device(&pdev->dev); in at91_rtc_probe()
406 if (IS_ERR(rtc)) in at91_rtc_probe()
407 return PTR_ERR(rtc); in at91_rtc_probe()
408 platform_set_drvdata(pdev, rtc); in at91_rtc_probe()
410 sclk = devm_clk_get(&pdev->dev, NULL); in at91_rtc_probe()
416 dev_err(&pdev->dev, "Could not enable slow clock\n"); in at91_rtc_probe()
428 ret = devm_request_irq(&pdev->dev, irq, at91_rtc_interrupt, in at91_rtc_probe()
432 dev_err(&pdev->dev, "IRQ %d already in use.\n", irq); in at91_rtc_probe()
437 * being wake-capable; if it didn't, do that here. in at91_rtc_probe()
439 if (!device_can_wakeup(&pdev->dev)) in at91_rtc_probe()
440 device_init_wakeup(&pdev->dev, 1); in at91_rtc_probe()
442 rtc->ops = &at91_rtc_ops; in at91_rtc_probe()
443 rtc->range_min = RTC_TIMESTAMP_BEGIN_1900; in at91_rtc_probe()
444 rtc->range_max = RTC_TIMESTAMP_END_2099; in at91_rtc_probe()
445 ret = rtc_register_device(rtc); in at91_rtc_probe()
454 dev_info(&pdev->dev, "AT91 Real Time Clock driver.\n"); in at91_rtc_probe()
464 * Disable and remove the RTC driver
488 /* AT91RM9200 RTC Power management control */
517 struct rtc_device *rtc = dev_get_drvdata(dev); in at91_rtc_resume() local
526 rtc_update_irq(rtc, 1, cached_events); in at91_rtc_resume()
556 MODULE_DESCRIPTION("RTC driver for Atmel AT91RM9200");