|
@@ -35,6 +35,8 @@
|
|
|
#define DS1337_STAT 0x0F
|
|
|
#define DS1337_ALRM1 0x07
|
|
|
|
|
|
+#define IOCTL_DS13307_ALRM _IOR('p', 0x15, u8) /* ioctl to read alarm bit */
|
|
|
+
|
|
|
static int model_detected;
|
|
|
|
|
|
static struct i2c_driver ds13307_driver;
|
|
@@ -278,6 +280,27 @@ static int ds13307_alarm_irq_enable(struct device *dev, unsigned int enabled) {
|
|
|
return -EIO;
|
|
|
}
|
|
|
|
|
|
+/* Reads the alarm bit and copies it to userspace */
|
|
|
+static int ds13307_ioctl(struct device *dev, unsigned int cmd, unsigned long arg) {
|
|
|
+ struct i2c_client *client;
|
|
|
+ u8 addr, buf;
|
|
|
+ switch(cmd) {
|
|
|
+ case IOCTL_DS13307_ALRM:
|
|
|
+ addr = DS1337_STAT;
|
|
|
+ client = to_i2c_client(dev);
|
|
|
+ if (ds13307_read_bytes(client, &addr, &buf, 1)) {
|
|
|
+ return -EIO;
|
|
|
+ }
|
|
|
+ buf &= 0x01;
|
|
|
+ if (copy_to_user((void __user *)arg, &buf, sizeof(u8))) {
|
|
|
+ return -EFAULT;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ default:
|
|
|
+ return -ENOIOCTLCMD;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static struct rtc_class_ops ds13307_rtc_ops = {
|
|
|
.read_time = ds13307_read_time,
|
|
|
.set_time = ds13307_set_time
|
|
@@ -351,6 +374,7 @@ static int ds13307_probe(struct i2c_client *client,
|
|
|
ds13307_rtc_ops.read_alarm = ds13307_read_alarm;
|
|
|
ds13307_rtc_ops.set_alarm = ds13307_write_alarm;
|
|
|
ds13307_rtc_ops.alarm_irq_enable = ds13307_alarm_irq_enable;
|
|
|
+ ds13307_rtc_ops.ioctl = ds13307_ioctl;
|
|
|
}
|
|
|
rtc->ops = &ds13307_rtc_ops;
|
|
|
i2c_set_clientdata(client,rtc);
|