]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
rtc: ds1511: use generic nvmem
authorAlexandre Belloni <alexandre.belloni@free-electrons.com>
Thu, 12 Oct 2017 22:05:29 +0000 (00:05 +0200)
committerAlexandre Belloni <alexandre.belloni@free-electrons.com>
Thu, 12 Oct 2017 22:10:17 +0000 (00:10 +0200)
Instead of adding a binary sysfs attribute from the driver (which suffers
from a race condition as the attribute appears after the device), use the
core to register an nvmem device.

Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
drivers/rtc/rtc-ds1511.c

index eda45358d63a1a11aa73a7b83eee57231c78f765..1e95312a6f2eecdce510a7cdd79a2b59fa37f037 100644 (file)
@@ -398,42 +398,37 @@ static const struct rtc_class_ops ds1511_rtc_ops = {
        .alarm_irq_enable       = ds1511_rtc_alarm_irq_enable,
 };
 
-static ssize_t
-ds1511_nvram_read(struct file *filp, struct kobject *kobj,
-                 struct bin_attribute *ba,
-                 char *buf, loff_t pos, size_t size)
+static int ds1511_nvram_read(void *priv, unsigned int pos, void *buf,
+                            size_t size)
 {
-       ssize_t count;
+       int i;
 
        rtc_write(pos, DS1511_RAMADDR_LSB);
-       for (count = 0; count < size; count++)
-               *buf++ = rtc_read(DS1511_RAMDATA);
+       for (i = 0; i < size; i++)
+               *(char *)buf++ = rtc_read(DS1511_RAMDATA);
 
-       return count;
+       return 0;
 }
 
-static ssize_t
-ds1511_nvram_write(struct file *filp, struct kobject *kobj,
-                  struct bin_attribute *bin_attr,
-                  char *buf, loff_t pos, size_t size)
+static int ds1511_nvram_write(void *priv, unsigned int pos, void *buf,
+                             size_t size)
 {
-       ssize_t count;
+       int i;
 
        rtc_write(pos, DS1511_RAMADDR_LSB);
-       for (count = 0; count < size; count++)
-               rtc_write(*buf++, DS1511_RAMDATA);
+       for (i = 0; i < size; i++)
+               rtc_write(*(char *)buf++, DS1511_RAMDATA);
 
-       return count;
+       return 0;
 }
 
-static struct bin_attribute ds1511_nvram_attr = {
-       .attr = {
-               .name = "nvram",
-               .mode = S_IRUGO | S_IWUSR,
-       },
+static struct nvmem_config ds1511_nvmem_cfg = {
+       .name = "ds1511_nvram",
+       .word_size = 1,
+       .stride = 1,
        .size = DS1511_RAM_MAX,
-       .read = ds1511_nvram_read,
-       .write = ds1511_nvram_write,
+       .reg_read = ds1511_nvram_read,
+       .reg_write = ds1511_nvram_write,
 };
 
 static int ds1511_rtc_probe(struct platform_device *pdev)
@@ -483,6 +478,10 @@ static int ds1511_rtc_probe(struct platform_device *pdev)
 
        pdata->rtc->ops = &ds1511_rtc_ops;
 
+       ds1511_nvmem_cfg.priv = &pdev->dev;
+       pdata->rtc->nvmem_config = &ds1511_nvmem_cfg;
+       pdata->rtc->nvram_old_abi = true;
+
        ret = rtc_register_device(pdata->rtc);
        if (ret)
                return ret;
@@ -501,18 +500,6 @@ static int ds1511_rtc_probe(struct platform_device *pdev)
                }
        }
 
-       ret = sysfs_create_bin_file(&pdev->dev.kobj, &ds1511_nvram_attr);
-       if (ret)
-               dev_err(&pdev->dev, "Unable to create sysfs entry: %s\n",
-                       ds1511_nvram_attr.attr.name);
-
-       return 0;
-}
-
-static int ds1511_rtc_remove(struct platform_device *pdev)
-{
-       sysfs_remove_bin_file(&pdev->dev.kobj, &ds1511_nvram_attr);
-
        return 0;
 }
 
@@ -521,7 +508,6 @@ MODULE_ALIAS("platform:ds1511");
 
 static struct platform_driver ds1511_rtc_driver = {
        .probe          = ds1511_rtc_probe,
-       .remove         = ds1511_rtc_remove,
        .driver         = {
                .name   = "ds1511",
        },