[PATCH 13/13] ARM: at91: make rm9200 rtc drivers soc independent
Nicolas Ferre
nicolas.ferre at atmel.com
Mon Nov 21 08:47:31 EST 2011
On 11/15/2011 09:40 PM, Jean-Christophe PLAGNIOL-VILLARD :
> switch the rtc drivers to resource and pass it via platform_device
>
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> Cc: Nicolas Ferre <nicolas.ferre at atmel.com>
Acked-by: Nicolas Ferre <nicolas.ferre at atmel.com>
> Cc: rtc-linux at googlegroups.com
> ---
> Hi Alessandro,
>
> Can I apply this one via at91
> it's part of a big cleanup
>
> Best Regards,
> J.
> arch/arm/mach-at91/at91rm9200_devices.c | 16 ++++-
> arch/arm/mach-at91/at91sam9g45_devices.c | 16 ++++-
> arch/arm/mach-at91/include/mach/at91_rtc.h | 24 +++---
> arch/arm/mach-at91/include/mach/at91rm9200.h | 2 +-
> arch/arm/mach-at91/include/mach/at91sam9g45.h | 2 +-
> drivers/rtc/rtc-at91rm9200.c | 101 +++++++++++++++---------
> 6 files changed, 107 insertions(+), 54 deletions(-)
>
> diff --git a/arch/arm/mach-at91/at91rm9200_devices.c b/arch/arm/mach-at91/at91rm9200_devices.c
> index 1007ba8..ba4fefe 100644
> --- a/arch/arm/mach-at91/at91rm9200_devices.c
> +++ b/arch/arm/mach-at91/at91rm9200_devices.c
> @@ -665,10 +665,24 @@ static void __init at91_add_device_tc(void) { }
> * -------------------------------------------------------------------- */
>
> #if defined(CONFIG_RTC_DRV_AT91RM9200) || defined(CONFIG_RTC_DRV_AT91RM9200_MODULE)
> +static struct resource rtc_resources[] = {
> + [0] = {
> + .start = AT91RM9200_BASE_RTC,
> + .end = AT91RM9200_BASE_RTC + SZ_256 - 1,
> + .flags = IORESOURCE_MEM,
> + },
> + [1] = {
> + .start = AT91_ID_SYS,
> + .end = AT91_ID_SYS,
> + .flags = IORESOURCE_IRQ,
> + },
> +};
> +
> static struct platform_device at91rm9200_rtc_device = {
> .name = "at91_rtc",
> .id = -1,
> - .num_resources = 0,
> + .resource = rtc_resources,
> + .num_resources = ARRAY_SIZE(rtc_resources),
> };
>
> static void __init at91_add_device_rtc(void)
> diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c
> index 153dad0..2c64e01 100644
> --- a/arch/arm/mach-at91/at91sam9g45_devices.c
> +++ b/arch/arm/mach-at91/at91sam9g45_devices.c
> @@ -1009,10 +1009,24 @@ static void __init at91_add_device_tc(void) { }
> * -------------------------------------------------------------------- */
>
> #if defined(CONFIG_RTC_DRV_AT91RM9200) || defined(CONFIG_RTC_DRV_AT91RM9200_MODULE)
> +static struct resource rtc_resources[] = {
> + [0] = {
> + .start = AT91SAM9G45_BASE_RTC,
> + .end = AT91SAM9G45_BASE_RTC + SZ_256 - 1,
> + .flags = IORESOURCE_MEM,
> + },
> + [1] = {
> + .start = AT91_ID_SYS,
> + .end = AT91_ID_SYS,
> + .flags = IORESOURCE_IRQ,
> + },
> +};
> +
> static struct platform_device at91sam9g45_rtc_device = {
> .name = "at91_rtc",
> .id = -1,
> - .num_resources = 0,
> + .resource = rtc_resources,
> + .num_resources = ARRAY_SIZE(rtc_resources),
> };
>
> static void __init at91_add_device_rtc(void)
> diff --git a/arch/arm/mach-at91/include/mach/at91_rtc.h b/arch/arm/mach-at91/include/mach/at91_rtc.h
> index e56f470..da1945e 100644
> --- a/arch/arm/mach-at91/include/mach/at91_rtc.h
> +++ b/arch/arm/mach-at91/include/mach/at91_rtc.h
> @@ -16,7 +16,7 @@
> #ifndef AT91_RTC_H
> #define AT91_RTC_H
>
> -#define AT91_RTC_CR (AT91_RTC + 0x00) /* Control Register */
> +#define AT91_RTC_CR 0x00 /* Control Register */
> #define AT91_RTC_UPDTIM (1 << 0) /* Update Request Time Register */
> #define AT91_RTC_UPDCAL (1 << 1) /* Update Request Calendar Register */
> #define AT91_RTC_TIMEVSEL (3 << 8) /* Time Event Selection */
> @@ -29,44 +29,44 @@
> #define AT91_RTC_CALEVSEL_MONTH (1 << 16)
> #define AT91_RTC_CALEVSEL_YEAR (2 << 16)
>
> -#define AT91_RTC_MR (AT91_RTC + 0x04) /* Mode Register */
> +#define AT91_RTC_MR 0x04 /* Mode Register */
> #define AT91_RTC_HRMOD (1 << 0) /* 12/24 Hour Mode */
>
> -#define AT91_RTC_TIMR (AT91_RTC + 0x08) /* Time Register */
> +#define AT91_RTC_TIMR 0x08 /* Time Register */
> #define AT91_RTC_SEC (0x7f << 0) /* Current Second */
> #define AT91_RTC_MIN (0x7f << 8) /* Current Minute */
> #define AT91_RTC_HOUR (0x3f << 16) /* Current Hour */
> #define AT91_RTC_AMPM (1 << 22) /* Ante Meridiem Post Meridiem Indicator */
>
> -#define AT91_RTC_CALR (AT91_RTC + 0x0c) /* Calendar Register */
> +#define AT91_RTC_CALR 0x0c /* Calendar Register */
> #define AT91_RTC_CENT (0x7f << 0) /* Current Century */
> #define AT91_RTC_YEAR (0xff << 8) /* Current Year */
> #define AT91_RTC_MONTH (0x1f << 16) /* Current Month */
> #define AT91_RTC_DAY (7 << 21) /* Current Day */
> #define AT91_RTC_DATE (0x3f << 24) /* Current Date */
>
> -#define AT91_RTC_TIMALR (AT91_RTC + 0x10) /* Time Alarm Register */
> +#define AT91_RTC_TIMALR 0x10 /* Time Alarm Register */
> #define AT91_RTC_SECEN (1 << 7) /* Second Alarm Enable */
> #define AT91_RTC_MINEN (1 << 15) /* Minute Alarm Enable */
> #define AT91_RTC_HOUREN (1 << 23) /* Hour Alarm Enable */
>
> -#define AT91_RTC_CALALR (AT91_RTC + 0x14) /* Calendar Alarm Register */
> +#define AT91_RTC_CALALR 0x14 /* Calendar Alarm Register */
> #define AT91_RTC_MTHEN (1 << 23) /* Month Alarm Enable */
> #define AT91_RTC_DATEEN (1 << 31) /* Date Alarm Enable */
>
> -#define AT91_RTC_SR (AT91_RTC + 0x18) /* Status Register */
> +#define AT91_RTC_SR 0x18 /* Status Register */
> #define AT91_RTC_ACKUPD (1 << 0) /* Acknowledge for Update */
> #define AT91_RTC_ALARM (1 << 1) /* Alarm Flag */
> #define AT91_RTC_SECEV (1 << 2) /* Second Event */
> #define AT91_RTC_TIMEV (1 << 3) /* Time Event */
> #define AT91_RTC_CALEV (1 << 4) /* Calendar Event */
>
> -#define AT91_RTC_SCCR (AT91_RTC + 0x1c) /* Status Clear Command Register */
> -#define AT91_RTC_IER (AT91_RTC + 0x20) /* Interrupt Enable Register */
> -#define AT91_RTC_IDR (AT91_RTC + 0x24) /* Interrupt Disable Register */
> -#define AT91_RTC_IMR (AT91_RTC + 0x28) /* Interrupt Mask Register */
> +#define AT91_RTC_SCCR 0x1c /* Status Clear Command Register */
> +#define AT91_RTC_IER 0x20 /* Interrupt Enable Register */
> +#define AT91_RTC_IDR 0x24 /* Interrupt Disable Register */
> +#define AT91_RTC_IMR 0x28 /* Interrupt Mask Register */
>
> -#define AT91_RTC_VER (AT91_RTC + 0x2c) /* Valid Entry Register */
> +#define AT91_RTC_VER 0x2c /* Valid Entry Register */
> #define AT91_RTC_NVTIM (1 << 0) /* Non valid Time */
> #define AT91_RTC_NVCAL (1 << 1) /* Non valid Calendar */
> #define AT91_RTC_NVTIMALR (1 << 2) /* Non valid Time Alarm */
> diff --git a/arch/arm/mach-at91/include/mach/at91rm9200.h b/arch/arm/mach-at91/include/mach/at91rm9200.h
> index 90e92a8..bacb511 100644
> --- a/arch/arm/mach-at91/include/mach/at91rm9200.h
> +++ b/arch/arm/mach-at91/include/mach/at91rm9200.h
> @@ -81,7 +81,6 @@
> */
> #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) /* Power Management Controller */
> #define AT91_ST (0xfffffd00 - AT91_BASE_SYS) /* System Timer */
> -#define AT91_RTC (0xfffffe00 - AT91_BASE_SYS) /* Real-Time Clock */
> #define AT91_MC (0xffffff00 - AT91_BASE_SYS) /* Memory Controllers */
>
> #define AT91RM9200_BASE_DBGU AT91_BASE_DBGU0 /* Debug Unit */
> @@ -89,6 +88,7 @@
> #define AT91RM9200_BASE_PIOB 0xfffff600 /* PIO Controller B */
> #define AT91RM9200_BASE_PIOC 0xfffff800 /* PIO Controller C */
> #define AT91RM9200_BASE_PIOD 0xfffffa00 /* PIO Controller D */
> +#define AT91RM9200_BASE_RTC 0xfffffe00 /* Real-Time Clock */
>
> #define AT91_USART0 AT91RM9200_BASE_US0
> #define AT91_USART1 AT91RM9200_BASE_US1
> diff --git a/arch/arm/mach-at91/include/mach/at91sam9g45.h b/arch/arm/mach-at91/include/mach/at91sam9g45.h
> index ac5c471..f0c23c9 100644
> --- a/arch/arm/mach-at91/include/mach/at91sam9g45.h
> +++ b/arch/arm/mach-at91/include/mach/at91sam9g45.h
> @@ -92,7 +92,6 @@
> #define AT91_PMC (0xfffffc00 - AT91_BASE_SYS)
> #define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS)
> #define AT91_GPBR (0xfffffd60 - AT91_BASE_SYS)
> -#define AT91_RTC (0xfffffdb0 - AT91_BASE_SYS)
>
> #define AT91SAM9G45_BASE_ECC 0xffffe200
> #define AT91SAM9G45_BASE_DMA 0xffffec00
> @@ -107,6 +106,7 @@
> #define AT91SAM9G45_BASE_RTT 0xfffffd20
> #define AT91SAM9G45_BASE_PIT 0xfffffd30
> #define AT91SAM9G45_BASE_WDT 0xfffffd40
> +#define AT91SAM9G45_BASE_RTC 0xfffffdb0
>
> #define AT91_USART0 AT91SAM9G45_BASE_US0
> #define AT91_USART1 AT91SAM9G45_BASE_US1
> diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c
> index e39b77a..dc474bc 100644
> --- a/drivers/rtc/rtc-at91rm9200.c
> +++ b/drivers/rtc/rtc-at91rm9200.c
> @@ -32,11 +32,17 @@
>
> #include <mach/at91_rtc.h>
>
> +#define at91_rtc_read(field) \
> + __raw_readl(at91_rtc_regs + field)
> +#define at91_rtc_write(field, val) \
> + __raw_writel((val), at91_rtc_regs + field)
>
> #define AT91_RTC_EPOCH 1900UL /* just like arch/arm/common/rtctime.c */
>
> static DECLARE_COMPLETION(at91_rtc_updated);
> static unsigned int at91_alarm_year = AT91_RTC_EPOCH;
> +static void __iomem *at91_rtc_regs;
> +static int irq;
>
> /*
> * Decode time/date into rtc_time structure
> @@ -48,10 +54,10 @@ static void at91_rtc_decodetime(unsigned int timereg, unsigned int calreg,
>
> /* must read twice in case it changes */
> do {
> - time = at91_sys_read(timereg);
> - date = at91_sys_read(calreg);
> - } while ((time != at91_sys_read(timereg)) ||
> - (date != at91_sys_read(calreg)));
> + time = at91_rtc_read(timereg);
> + date = at91_rtc_read(calreg);
> + } while ((time != at91_rtc_read(timereg)) ||
> + (date != at91_rtc_read(calreg)));
>
> tm->tm_sec = bcd2bin((time & AT91_RTC_SEC) >> 0);
> tm->tm_min = bcd2bin((time & AT91_RTC_MIN) >> 8);
> @@ -98,19 +104,19 @@ static int at91_rtc_settime(struct device *dev, struct rtc_time *tm)
> tm->tm_hour, tm->tm_min, tm->tm_sec);
>
> /* Stop Time/Calendar from counting */
> - cr = at91_sys_read(AT91_RTC_CR);
> - at91_sys_write(AT91_RTC_CR, cr | AT91_RTC_UPDCAL | AT91_RTC_UPDTIM);
> + cr = at91_rtc_read(AT91_RTC_CR);
> + at91_rtc_write(AT91_RTC_CR, cr | AT91_RTC_UPDCAL | AT91_RTC_UPDTIM);
>
> - at91_sys_write(AT91_RTC_IER, AT91_RTC_ACKUPD);
> + at91_rtc_write(AT91_RTC_IER, AT91_RTC_ACKUPD);
> wait_for_completion(&at91_rtc_updated); /* wait for ACKUPD interrupt */
> - at91_sys_write(AT91_RTC_IDR, AT91_RTC_ACKUPD);
> + at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD);
>
> - at91_sys_write(AT91_RTC_TIMR,
> + at91_rtc_write(AT91_RTC_TIMR,
> bin2bcd(tm->tm_sec) << 0
> | bin2bcd(tm->tm_min) << 8
> | bin2bcd(tm->tm_hour) << 16);
>
> - at91_sys_write(AT91_RTC_CALR,
> + at91_rtc_write(AT91_RTC_CALR,
> bin2bcd((tm->tm_year + 1900) / 100) /* century */
> | bin2bcd(tm->tm_year % 100) << 8 /* year */
> | bin2bcd(tm->tm_mon + 1) << 16 /* tm_mon starts at zero */
> @@ -118,8 +124,8 @@ static int at91_rtc_settime(struct device *dev, struct rtc_time *tm)
> | bin2bcd(tm->tm_mday) << 24);
>
> /* Restart Time/Calendar */
> - cr = at91_sys_read(AT91_RTC_CR);
> - at91_sys_write(AT91_RTC_CR, cr & ~(AT91_RTC_UPDCAL | AT91_RTC_UPDTIM));
> + cr = at91_rtc_read(AT91_RTC_CR);
> + at91_rtc_write(AT91_RTC_CR, cr & ~(AT91_RTC_UPDCAL | AT91_RTC_UPDTIM));
>
> return 0;
> }
> @@ -135,7 +141,7 @@ static int at91_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm)
> tm->tm_yday = rtc_year_days(tm->tm_mday, tm->tm_mon, tm->tm_year);
> tm->tm_year = at91_alarm_year - 1900;
>
> - alrm->enabled = (at91_sys_read(AT91_RTC_IMR) & AT91_RTC_ALARM)
> + alrm->enabled = (at91_rtc_read(AT91_RTC_IMR) & AT91_RTC_ALARM)
> ? 1 : 0;
>
> pr_debug("%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__,
> @@ -160,20 +166,20 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
> tm.tm_min = alrm->time.tm_min;
> tm.tm_sec = alrm->time.tm_sec;
>
> - at91_sys_write(AT91_RTC_IDR, AT91_RTC_ALARM);
> - at91_sys_write(AT91_RTC_TIMALR,
> + at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ALARM);
> + at91_rtc_write(AT91_RTC_TIMALR,
> bin2bcd(tm.tm_sec) << 0
> | bin2bcd(tm.tm_min) << 8
> | bin2bcd(tm.tm_hour) << 16
> | AT91_RTC_HOUREN | AT91_RTC_MINEN | AT91_RTC_SECEN);
> - at91_sys_write(AT91_RTC_CALALR,
> + at91_rtc_write(AT91_RTC_CALALR,
> bin2bcd(tm.tm_mon + 1) << 16 /* tm_mon starts at zero */
> | bin2bcd(tm.tm_mday) << 24
> | AT91_RTC_DATEEN | AT91_RTC_MTHEN);
>
> if (alrm->enabled) {
> - at91_sys_write(AT91_RTC_SCCR, AT91_RTC_ALARM);
> - at91_sys_write(AT91_RTC_IER, AT91_RTC_ALARM);
> + at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_ALARM);
> + at91_rtc_write(AT91_RTC_IER, AT91_RTC_ALARM);
> }
>
> pr_debug("%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__,
> @@ -188,10 +194,10 @@ static int at91_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
> pr_debug("%s(): cmd=%08x\n", __func__, enabled);
>
> if (enabled) {
> - at91_sys_write(AT91_RTC_SCCR, AT91_RTC_ALARM);
> - at91_sys_write(AT91_RTC_IER, AT91_RTC_ALARM);
> + at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_ALARM);
> + at91_rtc_write(AT91_RTC_IER, AT91_RTC_ALARM);
> } else
> - at91_sys_write(AT91_RTC_IDR, AT91_RTC_ALARM);
> + at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ALARM);
>
> return 0;
> }
> @@ -200,7 +206,7 @@ static int at91_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
> */
> static int at91_rtc_proc(struct device *dev, struct seq_file *seq)
> {
> - unsigned long imr = at91_sys_read(AT91_RTC_IMR);
> + unsigned long imr = at91_rtc_read(AT91_RTC_IMR);
>
> seq_printf(seq, "update_IRQ\t: %s\n",
> (imr & AT91_RTC_ACKUPD) ? "yes" : "no");
> @@ -220,7 +226,7 @@ static irqreturn_t at91_rtc_interrupt(int irq, void *dev_id)
> unsigned int rtsr;
> unsigned long events = 0;
>
> - rtsr = at91_sys_read(AT91_RTC_SR) & at91_sys_read(AT91_RTC_IMR);
> + rtsr = at91_rtc_read(AT91_RTC_SR) & at91_rtc_read(AT91_RTC_IMR);
> if (rtsr) { /* this interrupt is shared! Is it ours? */
> if (rtsr & AT91_RTC_ALARM)
> events |= (RTC_AF | RTC_IRQF);
> @@ -229,7 +235,7 @@ static irqreturn_t at91_rtc_interrupt(int irq, void *dev_id)
> if (rtsr & AT91_RTC_ACKUPD)
> complete(&at91_rtc_updated);
>
> - at91_sys_write(AT91_RTC_SCCR, rtsr); /* clear status reg */
> + at91_rtc_write(AT91_RTC_SCCR, rtsr); /* clear status reg */
>
> rtc_update_irq(rtc, 1, events);
>
> @@ -256,22 +262,41 @@ static const struct rtc_class_ops at91_rtc_ops = {
> static int __init at91_rtc_probe(struct platform_device *pdev)
> {
> struct rtc_device *rtc;
> - int ret;
> + struct resource *regs;
> + int ret = 0;
>
> - at91_sys_write(AT91_RTC_CR, 0);
> - at91_sys_write(AT91_RTC_MR, 0); /* 24 hour mode */
> + regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + if (!regs) {
> + dev_err(&pdev->dev, "no mmio resource defined\n");
> + return -ENXIO;
> + }
> +
> + irq = platform_get_irq(pdev, 0);
> + if (irq < 0) {
> + dev_err(&pdev->dev, "no irq resource defined\n");
> + return -ENXIO;
> + }
> +
> + at91_rtc_regs = ioremap(regs->start, resource_size(regs));
> + if (!at91_rtc_regs) {
> + dev_err(&pdev->dev, "failed to map registers, aborting.\n");
> + return -ENOMEM;
> + }
> +
> + at91_rtc_write(AT91_RTC_CR, 0);
> + at91_rtc_write(AT91_RTC_MR, 0); /* 24 hour mode */
>
> /* Disable all interrupts */
> - at91_sys_write(AT91_RTC_IDR, AT91_RTC_ACKUPD | AT91_RTC_ALARM |
> + at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD | AT91_RTC_ALARM |
> AT91_RTC_SECEV | AT91_RTC_TIMEV |
> AT91_RTC_CALEV);
>
> - ret = request_irq(AT91_ID_SYS, at91_rtc_interrupt,
> + ret = request_irq(irq, at91_rtc_interrupt,
> IRQF_SHARED,
> "at91_rtc", pdev);
> if (ret) {
> printk(KERN_ERR "at91_rtc: IRQ %d already in use.\n",
> - AT91_ID_SYS);
> + irq);
> return ret;
> }
>
> @@ -284,7 +309,7 @@ static int __init at91_rtc_probe(struct platform_device *pdev)
> rtc = rtc_device_register(pdev->name, &pdev->dev,
> &at91_rtc_ops, THIS_MODULE);
> if (IS_ERR(rtc)) {
> - free_irq(AT91_ID_SYS, pdev);
> + free_irq(irq, pdev);
> return PTR_ERR(rtc);
> }
> platform_set_drvdata(pdev, rtc);
> @@ -301,10 +326,10 @@ static int __exit at91_rtc_remove(struct platform_device *pdev)
> struct rtc_device *rtc = platform_get_drvdata(pdev);
>
> /* Disable all interrupts */
> - at91_sys_write(AT91_RTC_IDR, AT91_RTC_ACKUPD | AT91_RTC_ALARM |
> + at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD | AT91_RTC_ALARM |
> AT91_RTC_SECEV | AT91_RTC_TIMEV |
> AT91_RTC_CALEV);
> - free_irq(AT91_ID_SYS, pdev);
> + free_irq(irq, pdev);
>
> rtc_device_unregister(rtc);
> platform_set_drvdata(pdev, NULL);
> @@ -323,13 +348,13 @@ static int at91_rtc_suspend(struct device *dev)
> /* this IRQ is shared with DBGU and other hardware which isn't
> * necessarily doing PM like we are...
> */
> - at91_rtc_imr = at91_sys_read(AT91_RTC_IMR)
> + at91_rtc_imr = at91_rtc_read(AT91_RTC_IMR)
> & (AT91_RTC_ALARM|AT91_RTC_SECEV);
> if (at91_rtc_imr) {
> if (device_may_wakeup(dev))
> - enable_irq_wake(AT91_ID_SYS);
> + enable_irq_wake(irq);
> else
> - at91_sys_write(AT91_RTC_IDR, at91_rtc_imr);
> + at91_rtc_write(AT91_RTC_IDR, at91_rtc_imr);
> }
> return 0;
> }
> @@ -338,9 +363,9 @@ static int at91_rtc_resume(struct device *dev)
> {
> if (at91_rtc_imr) {
> if (device_may_wakeup(dev))
> - disable_irq_wake(AT91_ID_SYS);
> + disable_irq_wake(irq);
> else
> - at91_sys_write(AT91_RTC_IER, at91_rtc_imr);
> + at91_rtc_write(AT91_RTC_IER, at91_rtc_imr);
> }
> return 0;
> }
--
Nicolas Ferre
More information about the linux-arm-kernel
mailing list