aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc
diff options
context:
space:
mode:
authorAlexandre Belloni <alexandre.belloni@bootlin.com>2018-09-19 13:52:10 -0400
committerAlexandre Belloni <alexandre.belloni@bootlin.com>2018-09-28 08:21:01 -0400
commit482419e120da6da187be996c6871ed1e8bf02c51 (patch)
tree25b5d1f4112f394423c27b70a17191b4f6385fb0 /drivers/rtc
parent8ddeb09de163ce4f362c610cd901f9c5ad4f58fd (diff)
rtc: ds1685: use generic nvmem
Instead of adding a binary sysfs attribute from the driver, use the core to register an nvmem device. Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Diffstat (limited to 'drivers/rtc')
-rw-r--r--drivers/rtc/rtc-ds1685.c92
1 files changed, 25 insertions, 67 deletions
diff --git a/drivers/rtc/rtc-ds1685.c b/drivers/rtc/rtc-ds1685.c
index 2bad1f50414f..1f85e46b7888 100644
--- a/drivers/rtc/rtc-ds1685.c
+++ b/drivers/rtc/rtc-ds1685.c
@@ -866,30 +866,13 @@ ds1685_rtc_ops = {
866}; 866};
867/* ----------------------------------------------------------------------- */ 867/* ----------------------------------------------------------------------- */
868 868
869 869static int ds1685_nvram_read(void *priv, unsigned int pos, void *val,
870/* ----------------------------------------------------------------------- */ 870 size_t size)
871/* SysFS interface */
872
873#ifdef CONFIG_SYSFS
874/**
875 * ds1685_rtc_sysfs_nvram_read - reads rtc nvram via sysfs.
876 * @file: pointer to file structure.
877 * @kobj: pointer to kobject structure.
878 * @bin_attr: pointer to bin_attribute structure.
879 * @buf: pointer to char array to hold the output.
880 * @pos: current file position pointer.
881 * @size: size of the data to read.
882 */
883static ssize_t
884ds1685_rtc_sysfs_nvram_read(struct file *filp, struct kobject *kobj,
885 struct bin_attribute *bin_attr, char *buf,
886 loff_t pos, size_t size)
887{ 871{
888 struct platform_device *pdev = 872 struct ds1685_priv *rtc = priv;
889 to_platform_device(container_of(kobj, struct device, kobj));
890 struct ds1685_priv *rtc = platform_get_drvdata(pdev);
891 ssize_t count; 873 ssize_t count;
892 unsigned long flags = 0; 874 unsigned long flags = 0;
875 u8 *buf = val;
893 876
894 spin_lock_irqsave(&rtc->lock, flags); 877 spin_lock_irqsave(&rtc->lock, flags);
895 ds1685_rtc_switch_to_bank0(rtc); 878 ds1685_rtc_switch_to_bank0(rtc);
@@ -943,33 +926,16 @@ ds1685_rtc_sysfs_nvram_read(struct file *filp, struct kobject *kobj,
943#endif /* !CONFIG_RTC_DRV_DS1689 */ 926#endif /* !CONFIG_RTC_DRV_DS1689 */
944 spin_unlock_irqrestore(&rtc->lock, flags); 927 spin_unlock_irqrestore(&rtc->lock, flags);
945 928
946 /* 929 return 0;
947 * XXX: Bug? this appears to cause the function to get executed
948 * several times in succession. But it's the only way to actually get
949 * data written out to a file.
950 */
951 return count;
952} 930}
953 931
954/** 932static int ds1685_nvram_write(void *priv, unsigned int pos, void *val,
955 * ds1685_rtc_sysfs_nvram_write - writes rtc nvram via sysfs. 933 size_t size)
956 * @file: pointer to file structure.
957 * @kobj: pointer to kobject structure.
958 * @bin_attr: pointer to bin_attribute structure.
959 * @buf: pointer to char array to hold the input.
960 * @pos: current file position pointer.
961 * @size: size of the data to write.
962 */
963static ssize_t
964ds1685_rtc_sysfs_nvram_write(struct file *filp, struct kobject *kobj,
965 struct bin_attribute *bin_attr, char *buf,
966 loff_t pos, size_t size)
967{ 934{
968 struct platform_device *pdev = 935 struct ds1685_priv *rtc = priv;
969 to_platform_device(container_of(kobj, struct device, kobj));
970 struct ds1685_priv *rtc = platform_get_drvdata(pdev);
971 ssize_t count; 936 ssize_t count;
972 unsigned long flags = 0; 937 unsigned long flags = 0;
938 u8 *buf = val;
973 939
974 spin_lock_irqsave(&rtc->lock, flags); 940 spin_lock_irqsave(&rtc->lock, flags);
975 ds1685_rtc_switch_to_bank0(rtc); 941 ds1685_rtc_switch_to_bank0(rtc);
@@ -1023,27 +989,13 @@ ds1685_rtc_sysfs_nvram_write(struct file *filp, struct kobject *kobj,
1023#endif /* !CONFIG_RTC_DRV_DS1689 */ 989#endif /* !CONFIG_RTC_DRV_DS1689 */
1024 spin_unlock_irqrestore(&rtc->lock, flags); 990 spin_unlock_irqrestore(&rtc->lock, flags);
1025 991
1026 return count; 992 return 0;
1027} 993}
1028 994
1029/** 995/* ----------------------------------------------------------------------- */
1030 * struct ds1685_rtc_sysfs_nvram_attr - sysfs attributes for rtc nvram. 996/* SysFS interface */
1031 * @attr: nvram attributes.
1032 * @read: nvram read function.
1033 * @write: nvram write function.
1034 * @size: nvram total size (bank0 + extended).
1035 */
1036static struct bin_attribute
1037ds1685_rtc_sysfs_nvram_attr = {
1038 .attr = {
1039 .name = "nvram",
1040 .mode = S_IRUGO | S_IWUSR,
1041 },
1042 .read = ds1685_rtc_sysfs_nvram_read,
1043 .write = ds1685_rtc_sysfs_nvram_write,
1044 .size = NVRAM_TOTAL_SZ
1045};
1046 997
998#ifdef CONFIG_SYSFS
1047/** 999/**
1048 * ds1685_rtc_sysfs_battery_show - sysfs file for main battery status. 1000 * ds1685_rtc_sysfs_battery_show - sysfs file for main battery status.
1049 * @dev: pointer to device structure. 1001 * @dev: pointer to device structure.
@@ -1136,11 +1088,6 @@ ds1685_rtc_sysfs_register(struct device *dev)
1136{ 1088{
1137 int ret = 0; 1089 int ret = 0;
1138 1090
1139 sysfs_bin_attr_init(&ds1685_rtc_sysfs_nvram_attr);
1140 ret = sysfs_create_bin_file(&dev->kobj, &ds1685_rtc_sysfs_nvram_attr);
1141 if (ret)
1142 return ret;
1143
1144 ret = sysfs_create_group(&dev->kobj, &ds1685_rtc_sysfs_misc_grp); 1091 ret = sysfs_create_group(&dev->kobj, &ds1685_rtc_sysfs_misc_grp);
1145 if (ret) 1092 if (ret)
1146 return ret; 1093 return ret;
@@ -1155,7 +1102,6 @@ ds1685_rtc_sysfs_register(struct device *dev)
1155static int 1102static int
1156ds1685_rtc_sysfs_unregister(struct device *dev) 1103ds1685_rtc_sysfs_unregister(struct device *dev)
1157{ 1104{
1158 sysfs_remove_bin_file(&dev->kobj, &ds1685_rtc_sysfs_nvram_attr);
1159 sysfs_remove_group(&dev->kobj, &ds1685_rtc_sysfs_misc_grp); 1105 sysfs_remove_group(&dev->kobj, &ds1685_rtc_sysfs_misc_grp);
1160 1106
1161 return 0; 1107 return 0;
@@ -1181,6 +1127,12 @@ ds1685_rtc_probe(struct platform_device *pdev)
1181 u8 ctrla, ctrlb, hours; 1127 u8 ctrla, ctrlb, hours;
1182 unsigned char am_pm; 1128 unsigned char am_pm;
1183 int ret = 0; 1129 int ret = 0;
1130 struct nvmem_config nvmem_cfg = {
1131 .name = "ds1685_nvram",
1132 .size = NVRAM_TOTAL_SZ,
1133 .reg_read = ds1685_nvram_read,
1134 .reg_write = ds1685_nvram_write,
1135 };
1184 1136
1185 /* Get the platform data. */ 1137 /* Get the platform data. */
1186 pdata = (struct ds1685_rtc_platform_data *) pdev->dev.platform_data; 1138 pdata = (struct ds1685_rtc_platform_data *) pdev->dev.platform_data;
@@ -1444,6 +1396,12 @@ ds1685_rtc_probe(struct platform_device *pdev)
1444 return ret; 1396 return ret;
1445#endif 1397#endif
1446 1398
1399 rtc_dev->nvram_old_abi = true;
1400 nvmem_cfg.priv = rtc;
1401 ret = rtc_nvmem_register(rtc_dev, &nvmem_cfg);
1402 if (ret)
1403 return ret;
1404
1447 return rtc_register_device(rtc_dev); 1405 return rtc_register_device(rtc_dev);
1448} 1406}
1449 1407