Commit ac54cd2b authored by John Stultz's avatar John Stultz

RTC: Fix rtc driver ioctl specific shortcutting

Some RTC drivers enable functionality directly via their ioctl method
instead of using the generic ioctl handling code. With the recent
virtualization of the RTC layer, its now important that the generic
layer always be used.

This patch moved the rtc driver ioctl method call to after the generic
ioctl processing is done. This allows hardware specific features or
ioctls to still function, while relying on the generic code for handling
everything else.

This patch on its own may more obviously break rtc drivers that
implement the alarm irq enablement via their ioctl method instead of
implementing the alarm_irq_eanble method. Those drivers will be fixed
in a following patch. Additionaly, those drivers are already likely to
not be functioning reliably without this patch.

CC: Alessandro Zummo <a.zummo@towertech.it>
CC: Marcelo Roberto Jimenez <mroberto@cpti.cetuc.puc-rio.br>
CC: Thomas Gleixner <tglx@linutronix.de>
Reported-by: default avatarMarcelo Roberto Jimenez <mroberto@cpti.cetuc.puc-rio.br>
Tested-by: default avatarMarcelo Roberto Jimenez <mroberto@cpti.cetuc.puc-rio.br>
Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
parent 83a06bf5
...@@ -154,19 +154,7 @@ static long rtc_dev_ioctl(struct file *file, ...@@ -154,19 +154,7 @@ static long rtc_dev_ioctl(struct file *file,
if (err) if (err)
goto done; goto done;
/* try the driver's ioctl interface */ /*
if (ops->ioctl) {
err = ops->ioctl(rtc->dev.parent, cmd, arg);
if (err != -ENOIOCTLCMD) {
mutex_unlock(&rtc->ops_lock);
return err;
}
}
/* if the driver does not provide the ioctl interface
* or if that particular ioctl was not implemented
* (-ENOIOCTLCMD), we will try to emulate here.
*
* Drivers *SHOULD NOT* provide ioctl implementations * Drivers *SHOULD NOT* provide ioctl implementations
* for these requests. Instead, provide methods to * for these requests. Instead, provide methods to
* support the following code, so that the RTC's main * support the following code, so that the RTC's main
...@@ -329,7 +317,12 @@ static long rtc_dev_ioctl(struct file *file, ...@@ -329,7 +317,12 @@ static long rtc_dev_ioctl(struct file *file,
return err; return err;
default: default:
err = -ENOTTY; /* Finally try the driver's ioctl interface */
if (ops->ioctl) {
err = ops->ioctl(rtc->dev.parent, cmd, arg);
if (err == -ENOIOCTLCMD)
err = -ENOTTY;
}
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment