Re: [PATCH v2] rtc: make rtc-omap driver ioremap its register space

2009-10-13 Thread Mark A. Greer
On Wed, Sep 16, 2009 at 05:04:58PM -0700, Mark A. Greer wrote:
 From: Mark A. Greer mgr...@mvista.com
 
 The rtc-omap driver currently assumes that the rtc's
 registers are at a fixed address and already mapped
 into virtual memory space.  Remove those assumptions
 so the same driver can be used for similar devices
 that reside at different physical addresses (e.g.,
 TI's DA8xx/OMAP-L13x SoC's).
 
 Also allow the possibility for the timer and alarm
 interrupts to use the same IRQ.
 
 Signed-off-by: Mark A. Greer mgr...@mvista.com
 CC: David Brownell davi...@pacbell.net
 ---

Ping?

Just wondering if this patch was noticed.

FYI, the following were added by subsequent emails:

Acked-by: David Brownell dbrown...@users.sourceforge.net
Acked-by: Kevin Hilman khil...@deeprootsystems.com
Acked-by: Tony Lindgren t...@atomide.com

Thanks,

Mark
--
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [rtc-linux] Re: [PATCH v2] rtc: make rtc-omap driver ioremap its register space

2009-10-13 Thread Alessandro Zummo
On Tue, 13 Oct 2009 16:00:23 -0700
Mark A. Greer mgr...@mvista.com wrote:

 Ping?
 
 Just wondering if this patch was noticed.

 noticed. it's in the queue for the next submission set,
 which means after upstream merges all of current pending patches 
 (which are now in -mm) .
 
-- 

 Best regards,

 Alessandro Zummo,
  Tower Technologies - Torino, Italy

  http://www.towertech.it

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2] rtc: make rtc-omap driver ioremap its register space

2009-09-22 Thread Kevin Hilman
Mark A. Greer mgr...@mvista.com writes:

 From: Mark A. Greer mgr...@mvista.com

 The rtc-omap driver currently assumes that the rtc's
 registers are at a fixed address and already mapped
 into virtual memory space.  Remove those assumptions
 so the same driver can be used for similar devices
 that reside at different physical addresses (e.g.,
 TI's DA8xx/OMAP-L13x SoC's).

 Also allow the possibility for the timer and alarm
 interrupts to use the same IRQ.

 Signed-off-by: Mark A. Greer mgr...@mvista.com
 CC: David Brownell davi...@pacbell.net

Acked-by: Kevin Hilman khil...@deeprootsystems.com

for relevance to davinci platforms.

Kevin


 ---
 Sorry for the cross-posting but this is relevant to the different lists.

 This patch was tested on a da830 and a da850.  It was only compiled
 for an omap1 platform (don't have the hardware) but it should be low
 risk.  Note that the platform_device data is already set up in
 arch/arm/mach-omap1/devices.c so it those platforms should
 Just Work(tm).

  drivers/rtc/Kconfig|7 ---
  drivers/rtc/rtc-omap.c |   47 ++-
  2 files changed, 30 insertions(+), 24 deletions(-)

 diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
 index 81adbdb..f06e885 100644
 --- a/drivers/rtc/Kconfig
 +++ b/drivers/rtc/Kconfig
 @@ -539,10 +539,11 @@ comment on-CPU RTC drivers
  
  config RTC_DRV_OMAP
   tristate TI OMAP1
 - depends on ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730
 + depends on ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730 || 
 ARCH_DAVINCI_DA8XX
   help
 -   Say yes here to support the real time clock on TI OMAP1 chips.
 -   This driver can also be built as a module called rtc-omap.
 +   Say yes here to support the real time clock on TI OMAP1 and
 +   DA8xx/OMAP-L13x chips.  This driver can also be built as a
 +   module called rtc-omap.
  
  config RTC_DRV_S3C
   tristate Samsung S3C series SoC RTC
 diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c
 index bd1ce8e..aa418d5 100644
 --- a/drivers/rtc/rtc-omap.c
 +++ b/drivers/rtc/rtc-omap.c
 @@ -87,9 +87,10 @@
  #define OMAP_RTC_INTERRUPTS_IT_ALARM(13)
  #define OMAP_RTC_INTERRUPTS_IT_TIMER(12)
  
 +static void __iomem  *rtc_base;
  
 -#define rtc_read(addr)   omap_readb(OMAP_RTC_BASE + (addr))
 -#define rtc_write(val, addr) omap_writeb(val, OMAP_RTC_BASE + (addr))
 +#define rtc_read(addr)   __raw_readb(rtc_base + (addr))
 +#define rtc_write(val, addr) __raw_writeb(val, rtc_base + (addr))
  
  
  /* we rely on the rtc framework to handle locking (rtc-ops_lock),
 @@ -330,32 +331,31 @@ static int __init omap_rtc_probe(struct platform_device 
 *pdev)
   return -ENOENT;
   }
  
 - /* NOTE:  using static mapping for RTC registers */
   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 - if (res  res-start != OMAP_RTC_BASE) {
 - pr_debug(%s: RTC registers at %08x, expected %08x\n,
 - pdev-name, (unsigned) res-start, OMAP_RTC_BASE);
 + if (!res) {
 + pr_debug(%s: RTC resource data missing\n, pdev-name);
   return -ENOENT;
   }
  
 - if (res)
 - mem = request_mem_region(res-start,
 - res-end - res-start + 1,
 - pdev-name);
 - else
 - mem = NULL;
 + mem = request_mem_region(res-start, resource_size(res), pdev-name);
   if (!mem) {
   pr_debug(%s: RTC registers at %08x are not free\n,
 - pdev-name, OMAP_RTC_BASE);
 + pdev-name, res-start);
   return -EBUSY;
   }
  
 + rtc_base = ioremap(res-start, resource_size(res));
 + if (!rtc_base) {
 + pr_debug(%s: RTC registers can't be mapped\n, pdev-name);
 + goto fail;
 + }
 +
   rtc = rtc_device_register(pdev-name, pdev-dev,
   omap_rtc_ops, THIS_MODULE);
   if (IS_ERR(rtc)) {
   pr_debug(%s: can't register RTC device, err %ld\n,
   pdev-name, PTR_ERR(rtc));
 - goto fail;
 + goto fail0;
   }
   platform_set_drvdata(pdev, rtc);
   dev_set_drvdata(rtc-dev, mem);
 @@ -380,13 +380,14 @@ static int __init omap_rtc_probe(struct platform_device 
 *pdev)
   dev_name(rtc-dev), rtc)) {
   pr_debug(%s: RTC timer interrupt IRQ%d already claimed\n,
   pdev-name, omap_rtc_timer);
 - goto fail0;
 + goto fail1;
   }
 - if (request_irq(omap_rtc_alarm, rtc_irq, IRQF_DISABLED,
 - dev_name(rtc-dev), rtc)) {
 + if ((omap_rtc_timer != omap_rtc_alarm) 
 + (request_irq(omap_rtc_alarm, rtc_irq, IRQF_DISABLED,
 + dev_name(rtc-dev), rtc))) {
   pr_debug(%s: RTC alarm interrupt IRQ%d already claimed\n,
   pdev-name, 

Re: [PATCH v2] rtc: make rtc-omap driver ioremap its register space

2009-09-22 Thread Tony Lindgren
* Kevin Hilman khil...@deeprootsystems.com [090922 10:27]:
 Mark A. Greer mgr...@mvista.com writes:
 
  From: Mark A. Greer mgr...@mvista.com
 
  The rtc-omap driver currently assumes that the rtc's
  registers are at a fixed address and already mapped
  into virtual memory space.  Remove those assumptions
  so the same driver can be used for similar devices
  that reside at different physical addresses (e.g.,
  TI's DA8xx/OMAP-L13x SoC's).
 
  Also allow the possibility for the timer and alarm
  interrupts to use the same IRQ.
 
  Signed-off-by: Mark A. Greer mgr...@mvista.com
  CC: David Brownell davi...@pacbell.net
 
 Acked-by: Kevin Hilman khil...@deeprootsystems.com
 
 for relevance to davinci platforms.

Acked-by: Tony Lindgren t...@atomide.com



 
 Kevin
 
 
  ---
  Sorry for the cross-posting but this is relevant to the different lists.
 
  This patch was tested on a da830 and a da850.  It was only compiled
  for an omap1 platform (don't have the hardware) but it should be low
  risk.  Note that the platform_device data is already set up in
  arch/arm/mach-omap1/devices.c so it those platforms should
  Just Work(tm).
 
   drivers/rtc/Kconfig|7 ---
   drivers/rtc/rtc-omap.c |   47 
  ++-
   2 files changed, 30 insertions(+), 24 deletions(-)
 
  diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
  index 81adbdb..f06e885 100644
  --- a/drivers/rtc/Kconfig
  +++ b/drivers/rtc/Kconfig
  @@ -539,10 +539,11 @@ comment on-CPU RTC drivers
   
   config RTC_DRV_OMAP
  tristate TI OMAP1
  -   depends on ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730
  +   depends on ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730 || 
  ARCH_DAVINCI_DA8XX
  help
  - Say yes here to support the real time clock on TI OMAP1 chips.
  - This driver can also be built as a module called rtc-omap.
  + Say yes here to support the real time clock on TI OMAP1 and
  + DA8xx/OMAP-L13x chips.  This driver can also be built as a
  + module called rtc-omap.
   
   config RTC_DRV_S3C
  tristate Samsung S3C series SoC RTC
  diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c
  index bd1ce8e..aa418d5 100644
  --- a/drivers/rtc/rtc-omap.c
  +++ b/drivers/rtc/rtc-omap.c
  @@ -87,9 +87,10 @@
   #define OMAP_RTC_INTERRUPTS_IT_ALARM(13)
   #define OMAP_RTC_INTERRUPTS_IT_TIMER(12)
   
  +static void __iomem*rtc_base;
   
  -#define rtc_read(addr) omap_readb(OMAP_RTC_BASE + (addr))
  -#define rtc_write(val, addr)   omap_writeb(val, OMAP_RTC_BASE + (addr))
  +#define rtc_read(addr) __raw_readb(rtc_base + (addr))
  +#define rtc_write(val, addr)   __raw_writeb(val, rtc_base + (addr))
   
   
   /* we rely on the rtc framework to handle locking (rtc-ops_lock),
  @@ -330,32 +331,31 @@ static int __init omap_rtc_probe(struct 
  platform_device *pdev)
  return -ENOENT;
  }
   
  -   /* NOTE:  using static mapping for RTC registers */
  res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  -   if (res  res-start != OMAP_RTC_BASE) {
  -   pr_debug(%s: RTC registers at %08x, expected %08x\n,
  -   pdev-name, (unsigned) res-start, OMAP_RTC_BASE);
  +   if (!res) {
  +   pr_debug(%s: RTC resource data missing\n, pdev-name);
  return -ENOENT;
  }
   
  -   if (res)
  -   mem = request_mem_region(res-start,
  -   res-end - res-start + 1,
  -   pdev-name);
  -   else
  -   mem = NULL;
  +   mem = request_mem_region(res-start, resource_size(res), pdev-name);
  if (!mem) {
  pr_debug(%s: RTC registers at %08x are not free\n,
  -   pdev-name, OMAP_RTC_BASE);
  +   pdev-name, res-start);
  return -EBUSY;
  }
   
  +   rtc_base = ioremap(res-start, resource_size(res));
  +   if (!rtc_base) {
  +   pr_debug(%s: RTC registers can't be mapped\n, pdev-name);
  +   goto fail;
  +   }
  +
  rtc = rtc_device_register(pdev-name, pdev-dev,
  omap_rtc_ops, THIS_MODULE);
  if (IS_ERR(rtc)) {
  pr_debug(%s: can't register RTC device, err %ld\n,
  pdev-name, PTR_ERR(rtc));
  -   goto fail;
  +   goto fail0;
  }
  platform_set_drvdata(pdev, rtc);
  dev_set_drvdata(rtc-dev, mem);
  @@ -380,13 +380,14 @@ static int __init omap_rtc_probe(struct 
  platform_device *pdev)
  dev_name(rtc-dev), rtc)) {
  pr_debug(%s: RTC timer interrupt IRQ%d already claimed\n,
  pdev-name, omap_rtc_timer);
  -   goto fail0;
  +   goto fail1;
  }
  -   if (request_irq(omap_rtc_alarm, rtc_irq, IRQF_DISABLED,
  -   dev_name(rtc-dev), rtc)) {
  +   if ((omap_rtc_timer != omap_rtc_alarm) 
  +   (request_irq(omap_rtc_alarm, rtc_irq, IRQF_DISABLED,
  +   

[PATCH v2] rtc: make rtc-omap driver ioremap its register space

2009-09-16 Thread Mark A. Greer
From: Mark A. Greer mgr...@mvista.com

The rtc-omap driver currently assumes that the rtc's
registers are at a fixed address and already mapped
into virtual memory space.  Remove those assumptions
so the same driver can be used for similar devices
that reside at different physical addresses (e.g.,
TI's DA8xx/OMAP-L13x SoC's).

Also allow the possibility for the timer and alarm
interrupts to use the same IRQ.

Signed-off-by: Mark A. Greer mgr...@mvista.com
CC: David Brownell davi...@pacbell.net
---
Sorry for the cross-posting but this is relevant to the different lists.

This patch was tested on a da830 and a da850.  It was only compiled
for an omap1 platform (don't have the hardware) but it should be low
risk.  Note that the platform_device data is already set up in
arch/arm/mach-omap1/devices.c so it those platforms should
Just Work(tm).

 drivers/rtc/Kconfig|7 ---
 drivers/rtc/rtc-omap.c |   47 ++-
 2 files changed, 30 insertions(+), 24 deletions(-)

diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index 81adbdb..f06e885 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -539,10 +539,11 @@ comment on-CPU RTC drivers
 
 config RTC_DRV_OMAP
tristate TI OMAP1
-   depends on ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730
+   depends on ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730 || 
ARCH_DAVINCI_DA8XX
help
- Say yes here to support the real time clock on TI OMAP1 chips.
- This driver can also be built as a module called rtc-omap.
+ Say yes here to support the real time clock on TI OMAP1 and
+ DA8xx/OMAP-L13x chips.  This driver can also be built as a
+ module called rtc-omap.
 
 config RTC_DRV_S3C
tristate Samsung S3C series SoC RTC
diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c
index bd1ce8e..aa418d5 100644
--- a/drivers/rtc/rtc-omap.c
+++ b/drivers/rtc/rtc-omap.c
@@ -87,9 +87,10 @@
 #define OMAP_RTC_INTERRUPTS_IT_ALARM(13)
 #define OMAP_RTC_INTERRUPTS_IT_TIMER(12)
 
+static void __iomem*rtc_base;
 
-#define rtc_read(addr) omap_readb(OMAP_RTC_BASE + (addr))
-#define rtc_write(val, addr)   omap_writeb(val, OMAP_RTC_BASE + (addr))
+#define rtc_read(addr) __raw_readb(rtc_base + (addr))
+#define rtc_write(val, addr)   __raw_writeb(val, rtc_base + (addr))
 
 
 /* we rely on the rtc framework to handle locking (rtc-ops_lock),
@@ -330,32 +331,31 @@ static int __init omap_rtc_probe(struct platform_device 
*pdev)
return -ENOENT;
}
 
-   /* NOTE:  using static mapping for RTC registers */
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   if (res  res-start != OMAP_RTC_BASE) {
-   pr_debug(%s: RTC registers at %08x, expected %08x\n,
-   pdev-name, (unsigned) res-start, OMAP_RTC_BASE);
+   if (!res) {
+   pr_debug(%s: RTC resource data missing\n, pdev-name);
return -ENOENT;
}
 
-   if (res)
-   mem = request_mem_region(res-start,
-   res-end - res-start + 1,
-   pdev-name);
-   else
-   mem = NULL;
+   mem = request_mem_region(res-start, resource_size(res), pdev-name);
if (!mem) {
pr_debug(%s: RTC registers at %08x are not free\n,
-   pdev-name, OMAP_RTC_BASE);
+   pdev-name, res-start);
return -EBUSY;
}
 
+   rtc_base = ioremap(res-start, resource_size(res));
+   if (!rtc_base) {
+   pr_debug(%s: RTC registers can't be mapped\n, pdev-name);
+   goto fail;
+   }
+
rtc = rtc_device_register(pdev-name, pdev-dev,
omap_rtc_ops, THIS_MODULE);
if (IS_ERR(rtc)) {
pr_debug(%s: can't register RTC device, err %ld\n,
pdev-name, PTR_ERR(rtc));
-   goto fail;
+   goto fail0;
}
platform_set_drvdata(pdev, rtc);
dev_set_drvdata(rtc-dev, mem);
@@ -380,13 +380,14 @@ static int __init omap_rtc_probe(struct platform_device 
*pdev)
dev_name(rtc-dev), rtc)) {
pr_debug(%s: RTC timer interrupt IRQ%d already claimed\n,
pdev-name, omap_rtc_timer);
-   goto fail0;
+   goto fail1;
}
-   if (request_irq(omap_rtc_alarm, rtc_irq, IRQF_DISABLED,
-   dev_name(rtc-dev), rtc)) {
+   if ((omap_rtc_timer != omap_rtc_alarm) 
+   (request_irq(omap_rtc_alarm, rtc_irq, IRQF_DISABLED,
+   dev_name(rtc-dev), rtc))) {
pr_debug(%s: RTC alarm interrupt IRQ%d already claimed\n,
pdev-name, omap_rtc_alarm);
-   goto fail1;
+   goto fail2;
}
 
/* On boards with split power, RTC_ON_NOFF won't 

Re: [PATCH v2] rtc: make rtc-omap driver ioremap its register space

2009-09-16 Thread David Brownell
On Wednesday 16 September 2009, Mark A. Greer wrote:
 From: Mark A. Greer mgr...@mvista.com
 
 The rtc-omap driver currently assumes that the rtc's
 registers are at a fixed address and already mapped
 into virtual memory space.  Remove those assumptions
 so the same driver can be used for similar devices
 that reside at different physical addresses (e.g.,
 TI's DA8xx/OMAP-L13x SoC's).
 
 Also allow the possibility for the timer and alarm
 interrupts to use the same IRQ.
 
 Signed-off-by: Mark A. Greer mgr...@mvista.com
 CC: David Brownell davi...@pacbell.net

Acked-by: David Brownell dbrown...@users.sourceforge.net

... but not tested on OMAP1 (e.g. OSK5912, H2).

 ---
 Sorry for the cross-posting but this is relevant to the different lists.
 
 This patch was tested on a da830 and a da850.  It was only compiled
 for an omap1 platform (don't have the hardware) but it should be low
 risk.  Note that the platform_device data is already set up in
 arch/arm/mach-omap1/devices.c so it those platforms should
 Just Work(tm).
 
  drivers/rtc/Kconfig|7 ---
  drivers/rtc/rtc-omap.c |   47 ++-
  2 files changed, 30 insertions(+), 24 deletions(-)
 
 diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
 index 81adbdb..f06e885 100644
 --- a/drivers/rtc/Kconfig
 +++ b/drivers/rtc/Kconfig
 @@ -539,10 +539,11 @@ comment on-CPU RTC drivers
  
  config RTC_DRV_OMAP
   tristate TI OMAP1
 - depends on ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730
 + depends on ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730 || 
 ARCH_DAVINCI_DA8XX
   help
 -   Say yes here to support the real time clock on TI OMAP1 chips.
 -   This driver can also be built as a module called rtc-omap.
 +   Say yes here to support the real time clock on TI OMAP1 and
 +   DA8xx/OMAP-L13x chips.  This driver can also be built as a
 +   module called rtc-omap.
  
  config RTC_DRV_S3C
   tristate Samsung S3C series SoC RTC
 diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c
 index bd1ce8e..aa418d5 100644
 --- a/drivers/rtc/rtc-omap.c
 +++ b/drivers/rtc/rtc-omap.c
 @@ -87,9 +87,10 @@
  #define OMAP_RTC_INTERRUPTS_IT_ALARM(13)
  #define OMAP_RTC_INTERRUPTS_IT_TIMER(12)
  
 +static void __iomem  *rtc_base;
  
 -#define rtc_read(addr)   omap_readb(OMAP_RTC_BASE + (addr))
 -#define rtc_write(val, addr) omap_writeb(val, OMAP_RTC_BASE + (addr))
 +#define rtc_read(addr)   __raw_readb(rtc_base + (addr))
 +#define rtc_write(val, addr) __raw_writeb(val, rtc_base + (addr))
  
  
  /* we rely on the rtc framework to handle locking (rtc-ops_lock),
 @@ -330,32 +331,31 @@ static int __init omap_rtc_probe(struct platform_device 
 *pdev)
   return -ENOENT;
   }
  
 - /* NOTE:  using static mapping for RTC registers */
   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 - if (res  res-start != OMAP_RTC_BASE) {
 - pr_debug(%s: RTC registers at %08x, expected %08x\n,
 - pdev-name, (unsigned) res-start, OMAP_RTC_BASE);
 + if (!res) {
 + pr_debug(%s: RTC resource data missing\n, pdev-name);
   return -ENOENT;
   }
  
 - if (res)
 - mem = request_mem_region(res-start,
 - res-end - res-start + 1,
 - pdev-name);
 - else
 - mem = NULL;
 + mem = request_mem_region(res-start, resource_size(res), pdev-name);
   if (!mem) {
   pr_debug(%s: RTC registers at %08x are not free\n,
 - pdev-name, OMAP_RTC_BASE);
 + pdev-name, res-start);
   return -EBUSY;
   }
  
 + rtc_base = ioremap(res-start, resource_size(res));
 + if (!rtc_base) {
 + pr_debug(%s: RTC registers can't be mapped\n, pdev-name);
 + goto fail;
 + }
 +
   rtc = rtc_device_register(pdev-name, pdev-dev,
   omap_rtc_ops, THIS_MODULE);
   if (IS_ERR(rtc)) {
   pr_debug(%s: can't register RTC device, err %ld\n,
   pdev-name, PTR_ERR(rtc));
 - goto fail;
 + goto fail0;
   }
   platform_set_drvdata(pdev, rtc);
   dev_set_drvdata(rtc-dev, mem);
 @@ -380,13 +380,14 @@ static int __init omap_rtc_probe(struct platform_device 
 *pdev)
   dev_name(rtc-dev), rtc)) {
   pr_debug(%s: RTC timer interrupt IRQ%d already claimed\n,
   pdev-name, omap_rtc_timer);
 - goto fail0;
 + goto fail1;
   }
 - if (request_irq(omap_rtc_alarm, rtc_irq, IRQF_DISABLED,
 - dev_name(rtc-dev), rtc)) {
 + if ((omap_rtc_timer != omap_rtc_alarm) 
 + (request_irq(omap_rtc_alarm, rtc_irq, IRQF_DISABLED,
 + dev_name(rtc-dev), rtc))) {
   pr_debug(%s: RTC alarm interrupt IRQ%d already claimed\n,