Merge tag 'rtc-4.15' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux
[sfrench/cifs-2.6.git] / drivers / rtc / rtc-ds1511.c
index 1b2dcb58c0abf84801a83e2974651f55860ac0d1..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)
@@ -477,11 +472,20 @@ static int ds1511_rtc_probe(struct platform_device *pdev)
        spin_lock_init(&pdata->lock);
        platform_set_drvdata(pdev, pdata);
 
-       pdata->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
-                                             &ds1511_rtc_ops, THIS_MODULE);
+       pdata->rtc = devm_rtc_allocate_device(&pdev->dev);
        if (IS_ERR(pdata->rtc))
                return PTR_ERR(pdata->rtc);
 
+       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;
+
        /*
         * if the platform has an interrupt in mind for this device,
         * then by all means, set it
@@ -496,26 +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)
-{
-       struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
-
-       sysfs_remove_bin_file(&pdev->dev.kobj, &ds1511_nvram_attr);
-       if (pdata->irq > 0) {
-               /*
-                * disable the alarm interrupt
-                */
-               rtc_write(rtc_read(RTC_CMD) & ~RTC_TIE, RTC_CMD);
-               rtc_read(RTC_CMD1);
-       }
        return 0;
 }
 
@@ -524,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",
        },