|
@@ -100,7 +100,32 @@ static int rtc_generic_set_time(struct device *dev, struct rtc_time *tm)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
|
|
|
+{
|
|
|
+ struct rtc_pll_info pll;
|
|
|
+ struct rtc_pll_info __user *argp = (void __user *)arg;
|
|
|
+
|
|
|
+ switch (cmd) {
|
|
|
+ case RTC_PLL_GET:
|
|
|
+ if (!mach_get_rtc_pll || mach_get_rtc_pll(&pll))
|
|
|
+ return -EINVAL;
|
|
|
+ return copy_to_user(argp, &pll, sizeof pll) ? -EFAULT : 0;
|
|
|
+
|
|
|
+ case RTC_PLL_SET:
|
|
|
+ if (!mach_set_rtc_pll)
|
|
|
+ return -EINVAL;
|
|
|
+ if (!capable(CAP_SYS_TIME))
|
|
|
+ return -EACCES;
|
|
|
+ if (copy_from_user(&pll, argp, sizeof(pll)))
|
|
|
+ return -EFAULT;
|
|
|
+ return mach_set_rtc_pll(&pll);
|
|
|
+ }
|
|
|
+
|
|
|
+ return -ENOIOCTLCMD;
|
|
|
+}
|
|
|
+
|
|
|
static const struct rtc_class_ops generic_rtc_ops = {
|
|
|
+ .ioctl = rtc_ioctl,
|
|
|
.read_time = rtc_generic_get_time,
|
|
|
.set_time = rtc_generic_set_time,
|
|
|
};
|