Browse Source

implement ioctl to read alarm bit on DS1337

Helmut Pozimski 5 years ago
parent
commit
b7f6ab24bb
1 changed files with 24 additions and 0 deletions
  1. 24 0
      rtc-ds13307.c

+ 24 - 0
rtc-ds13307.c

@@ -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);