Lines Matching +full:at91rm9200 +full:- +full:rtc
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Real Time Clock interface for Linux on Atmel AT91RM9200
7 * Converted to RTC class model by Andrew Victor
10 * Based on s3c2410-rtc.c Simtec Electronics
12 * Based on sa1100-rtc.c by Nils Faerber
13 * Based on rtc.c by Paul Gortmaker
28 #include <linux/rtc.h>
119 * Register read back (of any RTC-register) needed to make sure in at91_rtc_write_idr()
120 * IDR-register write has reached the peripheral before updating in at91_rtc_write_idr()
125 * way to be certain would be to poll the IMR-register, which is is in at91_rtc_write_idr()
139 if (at91_rtc_config->use_shadow_imr) { in at91_rtc_read_imr()
165 tm->tm_sec = bcd2bin(FIELD_GET(AT91_RTC_SEC, time)); in at91_rtc_decodetime()
166 tm->tm_min = bcd2bin(FIELD_GET(AT91_RTC_MIN, time)); in at91_rtc_decodetime()
167 tm->tm_hour = bcd2bin(FIELD_GET(AT91_RTC_HOUR, time)); in at91_rtc_decodetime()
171 * the year - so these will return an invalid value. in at91_rtc_decodetime()
173 tm->tm_year = bcd2bin(date & AT91_RTC_CENT) * 100; /* century */ in at91_rtc_decodetime()
174 tm->tm_year += bcd2bin(FIELD_GET(AT91_RTC_YEAR, date)); /* year */ in at91_rtc_decodetime()
176 tm->tm_wday = bcd2bin(FIELD_GET(AT91_RTC_DAY, date)) - 1; /* day of the week [0-6], Sunday=0 */ in at91_rtc_decodetime()
177 tm->tm_mon = bcd2bin(FIELD_GET(AT91_RTC_MONTH, date)) - 1; in at91_rtc_decodetime()
178 tm->tm_mday = bcd2bin(FIELD_GET(AT91_RTC_DATE, date)); in at91_rtc_decodetime()
182 * Read current time and date in RTC
187 tm->tm_yday = rtc_year_days(tm->tm_mday, tm->tm_mon, tm->tm_year); in at91_rtc_readtime()
188 tm->tm_year = tm->tm_year - 1900; in at91_rtc_readtime()
196 * Set current time and date in RTC
215 FIELD_PREP(AT91_RTC_SEC, bin2bcd(tm->tm_sec)) in at91_rtc_settime()
216 | FIELD_PREP(AT91_RTC_MIN, bin2bcd(tm->tm_min)) in at91_rtc_settime()
217 | FIELD_PREP(AT91_RTC_HOUR, bin2bcd(tm->tm_hour))); in at91_rtc_settime()
221 bin2bcd((tm->tm_year + 1900) / 100)) in at91_rtc_settime()
222 | FIELD_PREP(AT91_RTC_YEAR, bin2bcd(tm->tm_year % 100)) in at91_rtc_settime()
223 | FIELD_PREP(AT91_RTC_MONTH, bin2bcd(tm->tm_mon + 1)) in at91_rtc_settime()
224 | FIELD_PREP(AT91_RTC_DAY, bin2bcd(tm->tm_wday + 1)) in at91_rtc_settime()
225 | FIELD_PREP(AT91_RTC_DATE, bin2bcd(tm->tm_mday))); in at91_rtc_settime()
237 * Read alarm time and date in RTC
241 struct rtc_time *tm = &alrm->time; in at91_rtc_readalarm()
244 tm->tm_year = -1; in at91_rtc_readalarm()
246 alrm->enabled = (at91_rtc_read_imr() & AT91_RTC_ALARM) in at91_rtc_readalarm()
250 alrm->enabled ? "en" : "dis"); in at91_rtc_readalarm()
256 * Set alarm time and date in RTC
260 struct rtc_time tm = alrm->time; in at91_rtc_setalarm()
264 FIELD_PREP(AT91_RTC_SEC, bin2bcd(alrm->time.tm_sec)) in at91_rtc_setalarm()
265 | FIELD_PREP(AT91_RTC_MIN, bin2bcd(alrm->time.tm_min)) in at91_rtc_setalarm()
266 | FIELD_PREP(AT91_RTC_HOUR, bin2bcd(alrm->time.tm_hour)) in at91_rtc_setalarm()
269 FIELD_PREP(AT91_RTC_MONTH, bin2bcd(alrm->time.tm_mon + 1)) in at91_rtc_setalarm()
270 | FIELD_PREP(AT91_RTC_DATE, bin2bcd(alrm->time.tm_mday)) in at91_rtc_setalarm()
273 if (alrm->enabled) { in at91_rtc_setalarm()
297 * IRQ handler for the RTC
302 struct rtc_device *rtc = platform_get_drvdata(pdev); in at91_rtc_interrupt() local
322 rtc_update_irq(rtc, 1, events); in at91_rtc_interrupt()
324 dev_dbg(&pdev->dev, "%s(): num=%ld, events=0x%02lx\n", in at91_rtc_interrupt()
348 .compatible = "atmel,at91rm9200-rtc",
351 .compatible = "atmel,at91sam9x5-rtc",
354 .compatible = "atmel,sama5d4-rtc",
357 .compatible = "atmel,sama5d2-rtc",
374 * Initialize and install RTC driver
378 struct rtc_device *rtc; in at91_rtc_probe() local
382 at91_rtc_config = of_device_get_match_data(&pdev->dev); in at91_rtc_probe()
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 return -ENXIO; in at91_rtc_probe()
396 at91_rtc_regs = devm_ioremap(&pdev->dev, regs->start, in at91_rtc_probe()
399 dev_err(&pdev->dev, "failed to map registers, aborting.\n"); in at91_rtc_probe()
400 return -ENOMEM; in at91_rtc_probe()
403 rtc = devm_rtc_allocate_device(&pdev->dev); in at91_rtc_probe()
404 if (IS_ERR(rtc)) in at91_rtc_probe()
405 return PTR_ERR(rtc); in at91_rtc_probe()
406 platform_set_drvdata(pdev, rtc); in at91_rtc_probe()
408 sclk = devm_clk_get(&pdev->dev, NULL); in at91_rtc_probe()
414 dev_err(&pdev->dev, "Could not enable slow clock\n"); in at91_rtc_probe()
426 ret = devm_request_irq(&pdev->dev, irq, at91_rtc_interrupt, in at91_rtc_probe()
430 dev_err(&pdev->dev, "IRQ %d already in use.\n", irq); in at91_rtc_probe()
435 * being wake-capable; if it didn't, do that here. in at91_rtc_probe()
437 if (!device_can_wakeup(&pdev->dev)) in at91_rtc_probe()
438 device_init_wakeup(&pdev->dev, 1); in at91_rtc_probe()
440 rtc->ops = &at91_rtc_ops; in at91_rtc_probe()
441 rtc->range_min = RTC_TIMESTAMP_BEGIN_1900; in at91_rtc_probe()
442 rtc->range_max = RTC_TIMESTAMP_END_2099; in at91_rtc_probe()
443 ret = rtc_register_device(rtc); in at91_rtc_probe()
452 dev_info(&pdev->dev, "AT91 Real Time Clock driver.\n"); in at91_rtc_probe()
462 * Disable and remove the RTC driver
486 /* AT91RM9200 RTC Power management control */
515 struct rtc_device *rtc = dev_get_drvdata(dev); in at91_rtc_resume() local
524 rtc_update_irq(rtc, 1, cached_events); in at91_rtc_resume()
554 MODULE_DESCRIPTION("RTC driver for Atmel AT91RM9200");