diff mbox

Re: [RFC PATCH] rtc: tw4030 add alarm/update interfaces

Message ID 200811191828.24087.david-b@pacbell.net
State Superseded, archived
Headers show

Commit Message

David Brownell Nov. 20, 2008, 2:28 a.m. UTC
From: Alessandro Zummo <a.zummo@towertech.it>

Changes:

 - implement alarm_irq_enable
 - return correct error code when registering fails

[ dbrownell@users.sourceforge.net: build fixes, force 1/sec irqs]

Signed-off-by: Alessandro Zummo <a.zummo@towertech.it>
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Cc: Tony Lindgren <tony@atomide.com>
Cc: Samuel Ortiz <sameo@openedhand.com>
---
Requires a bugfix to the alarm/update interface patch in -mm.

 drivers/rtc/rtc-twl4030.c |   44 ++++++++++----------------------------------
 1 file changed, 10 insertions(+), 34 deletions(-)


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
-~----------~----~----~----~------~----~------~--~---

Comments

Alessandro Zummo Nov. 20, 2008, 2:29 a.m. UTC | #1
On Wed, 19 Nov 2008 18:28:23 -0800
David Brownell <david-b@pacbell.net> wrote:

> Changes:
> 
>  - implement alarm_irq_enable
>  - return correct error code when registering fails
> 
> [ dbrownell@users.sourceforge.net: build fixes, force 1/sec irqs]

 Thanks David!
diff mbox

Patch

--- a/drivers/rtc/rtc-twl4030.c
+++ b/drivers/rtc/rtc-twl4030.c
@@ -119,7 +119,7 @@  static int twl4030_rtc_write_u8(u8 data,
 static unsigned char rtc_irq_bits;
 
 /*
- * Enable timer and/or alarm interrupts.
+ * Enable 1/second update and/or alarm interrupts.
  */
 static int set_rtc_irq_bit(unsigned char bit)
 {
@@ -127,6 +127,7 @@  static int set_rtc_irq_bit(unsigned char
 	int ret;
 
 	val = rtc_irq_bits | bit;
+	val &= ~BIT_RTC_INTERRUPTS_REG_EVERY_M;
 	ret = twl4030_rtc_write_u8(val, REG_RTC_INTERRUPTS_REG);
 	if (ret == 0)
 		rtc_irq_bits = val;
@@ -135,7 +136,7 @@  static int set_rtc_irq_bit(unsigned char
 }
 
 /*
- * Disable timer and/or alarm interrupts.
+ * Disable update and/or alarm interrupts.
  */
 static int mask_rtc_irq_bit(unsigned char bit)
 {
@@ -150,7 +151,7 @@  static int mask_rtc_irq_bit(unsigned cha
 	return ret;
 }
 
-static inline int twl4030_rtc_alarm_irq_set_state(int enabled)
+static int twl4030_rtc_alarm_irq_enable(struct device *dev, unsigned enabled)
 {
 	int ret;
 
@@ -162,7 +163,7 @@  static inline int twl4030_rtc_alarm_irq_
 	return ret;
 }
 
-static inline int twl4030_rtc_irq_set_state(int enabled)
+static int twl4030_rtc_update_irq_enable(struct device *dev, unsigned enabled)
 {
 	int ret;
 
@@ -291,7 +292,7 @@  static int twl4030_rtc_set_alarm(struct 
 	unsigned char alarm_data[ALL_TIME_REGS + 1];
 	int ret;
 
-	ret = twl4030_rtc_alarm_irq_set_state(0);
+	ret = twl4030_rtc_alarm_irq_enable(dev, 0);
 	if (ret)
 		goto out;
 
@@ -311,35 +312,11 @@  static int twl4030_rtc_set_alarm(struct 
 	}
 
 	if (alm->enabled)
-		ret = twl4030_rtc_alarm_irq_set_state(1);
+		ret = twl4030_rtc_alarm_irq_enable(dev, 1);
 out:
 	return ret;
 }
 
-#ifdef	CONFIG_RTC_INTF_DEV
-
-static int twl4030_rtc_ioctl(struct device *dev, unsigned int cmd,
-			     unsigned long arg)
-{
-	switch (cmd) {
-	case RTC_AIE_OFF:
-		return twl4030_rtc_alarm_irq_set_state(0);
-	case RTC_AIE_ON:
-		return twl4030_rtc_alarm_irq_set_state(1);
-	case RTC_UIE_OFF:
-		return twl4030_rtc_irq_set_state(0);
-	case RTC_UIE_ON:
-		return twl4030_rtc_irq_set_state(1);
-
-	default:
-		return -ENOIOCTLCMD;
-	}
-}
-
-#else
-#define	omap_rtc_ioctl	NULL
-#endif
-
 static irqreturn_t twl4030_rtc_interrupt(int irq, void *rtc)
 {
 	unsigned long events = 0;
@@ -399,11 +376,12 @@  out:
 }
 
 static struct rtc_class_ops twl4030_rtc_ops = {
-	.ioctl		= twl4030_rtc_ioctl,
 	.read_time	= twl4030_rtc_read_time,
 	.set_time	= twl4030_rtc_set_time,
 	.read_alarm	= twl4030_rtc_read_alarm,
 	.set_alarm	= twl4030_rtc_set_alarm,
+	.alarm_irq_enable = twl4030_rtc_alarm_irq_enable,
+	.update_irq_enable = twl4030_rtc_update_irq_enable,
 };
 
 /*----------------------------------------------------------------------*/
@@ -421,7 +399,7 @@  static int __devinit twl4030_rtc_probe(s
 	rtc = rtc_device_register(pdev->name,
 				  &pdev->dev, &twl4030_rtc_ops, THIS_MODULE);
 	if (IS_ERR(rtc)) {
-		ret = -EINVAL;
+		ret = PTR_ERR(rtc);
 		dev_err(&pdev->dev, "can't register RTC device, err %ld\n",
 			PTR_ERR(rtc));
 		goto out0;
@@ -431,7 +409,6 @@  static int __devinit twl4030_rtc_probe(s
 	platform_set_drvdata(pdev, rtc);
 
 	ret = twl4030_rtc_read_u8(&rd_reg, REG_RTC_STATUS_REG);
-
 	if (ret < 0)
 		goto out1;
 
@@ -474,7 +451,6 @@  static int __devinit twl4030_rtc_probe(s
 
 	return ret;
 
-
 out2:
 	free_irq(irq, rtc);
 out1: