RTC: Convert rtc drivers to use the alarm_irq_enable method
Some rtc drivers use the ioctl method instead of the alarm_irq_enable method for enabling alarm interupts. With the new virtualized RTC rework, its important for drivers to use the alarm_irq_enable instead. This patch converts the drivers that use the AIE ioctl method to use the alarm_irq_enable method. Other ioctl cmds are left untouched. I have not been able to test or even compile most of these drivers. Any help to make sure this change is correct would be appreciated! CC: Alessandro Zummo <a.zummo@towertech.it> CC: Thomas Gleixner <tglx@linutronix.de> CC: Marcelo Roberto Jimenez <mroberto@cpti.cetuc.puc-rio.br> Reported-by: Marcelo Roberto Jimenez <mroberto@cpti.cetuc.puc-rio.br> Tested-by: Marcelo Roberto Jimenez <mroberto@cpti.cetuc.puc-rio.br> Signed-off-by: John Stultz <john.stultz@linaro.org>
This commit is contained in:
@@ -299,14 +299,6 @@ rs5c_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
|
||||
if (rs5c->type == rtc_rs5c372a
|
||||
&& (buf & RS5C372A_CTRL1_SL1))
|
||||
return -ENOIOCTLCMD;
|
||||
case RTC_AIE_OFF:
|
||||
case RTC_AIE_ON:
|
||||
/* these irq management calls only make sense for chips
|
||||
* which are wired up to an IRQ.
|
||||
*/
|
||||
if (!rs5c->has_irq)
|
||||
return -ENOIOCTLCMD;
|
||||
break;
|
||||
default:
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
@@ -317,12 +309,6 @@ rs5c_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
|
||||
|
||||
addr = RS5C_ADDR(RS5C_REG_CTRL1);
|
||||
switch (cmd) {
|
||||
case RTC_AIE_OFF: /* alarm off */
|
||||
buf &= ~RS5C_CTRL1_AALE;
|
||||
break;
|
||||
case RTC_AIE_ON: /* alarm on */
|
||||
buf |= RS5C_CTRL1_AALE;
|
||||
break;
|
||||
case RTC_UIE_OFF: /* update off */
|
||||
buf &= ~RS5C_CTRL1_CT_MASK;
|
||||
break;
|
||||
@@ -347,6 +333,39 @@ rs5c_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
|
||||
#endif
|
||||
|
||||
|
||||
static int rs5c_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct rs5c372 *rs5c = i2c_get_clientdata(client);
|
||||
unsigned char buf;
|
||||
int status, addr;
|
||||
|
||||
buf = rs5c->regs[RS5C_REG_CTRL1];
|
||||
|
||||
if (!rs5c->has_irq)
|
||||
return -EINVAL;
|
||||
|
||||
status = rs5c_get_regs(rs5c);
|
||||
if (status < 0)
|
||||
return status;
|
||||
|
||||
addr = RS5C_ADDR(RS5C_REG_CTRL1);
|
||||
if (enabled)
|
||||
buf |= RS5C_CTRL1_AALE;
|
||||
else
|
||||
buf &= ~RS5C_CTRL1_AALE;
|
||||
|
||||
if (i2c_smbus_write_byte_data(client, addr, buf) < 0) {
|
||||
printk(KERN_WARNING "%s: can't update alarm\n",
|
||||
rs5c->rtc->name);
|
||||
status = -EIO;
|
||||
} else
|
||||
rs5c->regs[RS5C_REG_CTRL1] = buf;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
/* NOTE: Since RTC_WKALM_{RD,SET} were originally defined for EFI,
|
||||
* which only exposes a polled programming interface; and since
|
||||
* these calls map directly to those EFI requests; we don't demand
|
||||
@@ -466,6 +485,7 @@ static const struct rtc_class_ops rs5c372_rtc_ops = {
|
||||
.set_time = rs5c372_rtc_set_time,
|
||||
.read_alarm = rs5c_read_alarm,
|
||||
.set_alarm = rs5c_set_alarm,
|
||||
.alarm_irq_enable = rs5c_rtc_alarm_irq_enable,
|
||||
};
|
||||
|
||||
#if defined(CONFIG_RTC_INTF_SYSFS) || defined(CONFIG_RTC_INTF_SYSFS_MODULE)
|
||||
|
Reference in New Issue
Block a user