diff options
author | Alexandre Belloni <alexandre.belloni@bootlin.com> | 2018-09-19 13:52:10 -0400 |
---|---|---|
committer | Alexandre Belloni <alexandre.belloni@bootlin.com> | 2018-09-28 08:21:01 -0400 |
commit | 482419e120da6da187be996c6871ed1e8bf02c51 (patch) | |
tree | 25b5d1f4112f394423c27b70a17191b4f6385fb0 /drivers/rtc | |
parent | 8ddeb09de163ce4f362c610cd901f9c5ad4f58fd (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.c | 92 |
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 | 869 | static 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 | */ | ||
883 | static ssize_t | ||
884 | ds1685_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 | /** | 932 | static 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 | */ | ||
963 | static ssize_t | ||
964 | ds1685_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 | */ | ||
1036 | static struct bin_attribute | ||
1037 | ds1685_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) | |||
1155 | static int | 1102 | static int |
1156 | ds1685_rtc_sysfs_unregister(struct device *dev) | 1103 | ds1685_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 | ||