Browse Source

implement reading from the DS1307 nvram

Helmut Pozimski 5 years ago
parent
commit
a6ce541391
1 changed files with 28 additions and 5 deletions
  1. 28 5
      rtc-ds13307.c

+ 28 - 5
rtc-ds13307.c

@@ -27,6 +27,7 @@
 #define COMMON_YEAR 0x06
 #define COMMON_HIGH_BIT 0x80
 
+#define DS1307_NVRAM_BASE 0x08
 #define DS1307_MAX_ADDR 0x3F
 
 #define DS1337_CTL 0x0E
@@ -35,6 +36,7 @@
 static int model_detected;
 
 static struct i2c_driver ds13307_driver;
+static struct nvmem_config ds1307_nvmem;
 
 /* Reads a specified number of bytes via i2c, returns 0 on success */
 static int ds13307_read_bytes(struct i2c_client *client,
@@ -197,22 +199,43 @@ static int ds13307_detect_device(struct i2c_client *client) {
 	return -1;
 }
 
+static int ds13307_nvram_read(void *priv, unsigned int offset, void *buf, size_t count) {
+	struct i2c_client *client = priv;
+	u8 addr = DS1307_NVRAM_BASE + offset;
+	if (!ds13307_read_bytes(client, &addr, buf, count)) {
+		return count;
+	}
+	return -EIO;
+}
+
+static int ds13307_nvram_write(void *priv, unsigned int offset, void *buf, size_t count) {
+	return 0;
+}
+
 static int ds13307_probe(struct i2c_client *client,
 		const struct i2c_device_id *id) {
 	struct rtc_device *rtc;
+	int error;
 	model_detected = ds13307_detect_device(client);
 	if ((model_detected != DEVICE_DS1307) && (model_detected != DEVICE_DS1337)) {
 		return -EIO;
 	}
-	rtc = devm_rtc_device_register(&client->dev, ds13307_driver.driver.name,
-		&ds13307_rtc_ops, THIS_MODULE);
-
+	rtc = devm_rtc_allocate_device(&client->dev);
 	if (IS_ERR(rtc)) {
 		return PTR_ERR(rtc);
 	}
-
+	if (model_detected == DEVICE_DS1307) {
+		ds1307_nvmem.name = "ds1307_nvram";
+		ds1307_nvmem.word_size = 1;
+		ds1307_nvmem.size = 56;
+		ds1307_nvmem.reg_read = ds13307_nvram_read;
+		ds1307_nvmem.priv = client;
+		rtc->nvmem_config = &ds1307_nvmem;
+	}
+	rtc->ops = &ds13307_rtc_ops;
 	i2c_set_clientdata(client,rtc);
-	return 0;
+	error = rtc_register_device(rtc);
+	return error ? error: 0;
 }
 
 static struct i2c_device_id ds13307_idtable[] = {