diff options
author | Giulio Benetti <giulio.benetti@micronovasrl.com> | 2018-07-25 13:26:05 -0400 |
---|---|---|
committer | Alexandre Belloni <alexandre.belloni@bootlin.com> | 2018-09-28 08:20:58 -0400 |
commit | b41c23e152f2852ff7a299676af4f642bbe94abf (patch) | |
tree | 4dcd807f550a84cc76d3cbef0d9ce7678f9028d0 /drivers/rtc | |
parent | 79230ff64167586b2a556470c7934083afea930e (diff) |
rtc: ds1307: add frequency_test_enable attribute on m41txx
On m41txx you can enable open-drain OUT pin to check if offset is ok.
Enabling OUT pin with frequency_test_enable attribute, OUT pin will tick
512 times faster than 1s tick base.
Enable or Disable FT bit on CONTROL register if freq_test is 1 or 0.
Signed-off-by: Giulio Benetti <giulio.benetti@micronovasrl.com>
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Diffstat (limited to 'drivers/rtc')
-rw-r--r-- | drivers/rtc/rtc-ds1307.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index 8268813f15c3..edccd0c0da25 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c | |||
@@ -1050,6 +1050,94 @@ static int m41txx_rtc_set_offset(struct device *dev, long offset) | |||
1050 | ctrl_reg); | 1050 | ctrl_reg); |
1051 | } | 1051 | } |
1052 | 1052 | ||
1053 | static ssize_t frequency_test_enable_store(struct device *dev, | ||
1054 | struct device_attribute *attr, | ||
1055 | const char *buf, size_t count) | ||
1056 | { | ||
1057 | struct ds1307 *ds1307 = dev_get_drvdata(dev); | ||
1058 | bool freq_test_en; | ||
1059 | int ret; | ||
1060 | |||
1061 | ret = kstrtobool(buf, &freq_test_en); | ||
1062 | if (ret) { | ||
1063 | dev_err(dev, "Failed to store RTC Frequency Test attribute\n"); | ||
1064 | return ret; | ||
1065 | } | ||
1066 | |||
1067 | regmap_update_bits(ds1307->regmap, M41TXX_REG_CONTROL, M41TXX_BIT_FT, | ||
1068 | freq_test_en ? M41TXX_BIT_FT : 0); | ||
1069 | |||
1070 | return count; | ||
1071 | } | ||
1072 | |||
1073 | static ssize_t frequency_test_enable_show(struct device *dev, | ||
1074 | struct device_attribute *attr, | ||
1075 | char *buf) | ||
1076 | { | ||
1077 | struct ds1307 *ds1307 = dev_get_drvdata(dev); | ||
1078 | unsigned int ctrl_reg; | ||
1079 | |||
1080 | regmap_read(ds1307->regmap, M41TXX_REG_CONTROL, &ctrl_reg); | ||
1081 | |||
1082 | return scnprintf(buf, PAGE_SIZE, (ctrl_reg & M41TXX_BIT_FT) ? "on\n" : | ||
1083 | "off\n"); | ||
1084 | } | ||
1085 | |||
1086 | static DEVICE_ATTR_RW(frequency_test_enable); | ||
1087 | |||
1088 | static struct attribute *rtc_freq_test_attrs[] = { | ||
1089 | &dev_attr_frequency_test_enable.attr, | ||
1090 | NULL, | ||
1091 | }; | ||
1092 | |||
1093 | static const struct attribute_group rtc_freq_test_attr_group = { | ||
1094 | .attrs = rtc_freq_test_attrs, | ||
1095 | }; | ||
1096 | |||
1097 | static void rtc_calib_remove_sysfs_group(void *_dev) | ||
1098 | { | ||
1099 | struct device *dev = _dev; | ||
1100 | |||
1101 | sysfs_remove_group(&dev->kobj, &rtc_freq_test_attr_group); | ||
1102 | } | ||
1103 | |||
1104 | static int ds1307_add_frequency_test(struct ds1307 *ds1307) | ||
1105 | { | ||
1106 | int err; | ||
1107 | |||
1108 | switch (ds1307->type) { | ||
1109 | case m41t0: | ||
1110 | case m41t00: | ||
1111 | case m41t11: | ||
1112 | /* Export sysfs entries */ | ||
1113 | err = sysfs_create_group(&(ds1307->dev)->kobj, | ||
1114 | &rtc_freq_test_attr_group); | ||
1115 | if (err) { | ||
1116 | dev_err(ds1307->dev, | ||
1117 | "Failed to create sysfs group: %d\n", | ||
1118 | err); | ||
1119 | return err; | ||
1120 | } | ||
1121 | |||
1122 | err = devm_add_action_or_reset(ds1307->dev, | ||
1123 | rtc_calib_remove_sysfs_group, | ||
1124 | ds1307->dev); | ||
1125 | if (err) { | ||
1126 | dev_err(ds1307->dev, | ||
1127 | "Failed to add sysfs cleanup action: %d\n", | ||
1128 | err); | ||
1129 | sysfs_remove_group(&(ds1307->dev)->kobj, | ||
1130 | &rtc_freq_test_attr_group); | ||
1131 | return err; | ||
1132 | } | ||
1133 | break; | ||
1134 | default: | ||
1135 | break; | ||
1136 | } | ||
1137 | |||
1138 | return 0; | ||
1139 | } | ||
1140 | |||
1053 | /*----------------------------------------------------------------------*/ | 1141 | /*----------------------------------------------------------------------*/ |
1054 | 1142 | ||
1055 | static int ds1307_nvram_read(void *priv, unsigned int offset, void *val, | 1143 | static int ds1307_nvram_read(void *priv, unsigned int offset, void *val, |
@@ -1792,6 +1880,10 @@ read_rtc: | |||
1792 | if (err) | 1880 | if (err) |
1793 | return err; | 1881 | return err; |
1794 | 1882 | ||
1883 | err = ds1307_add_frequency_test(ds1307); | ||
1884 | if (err) | ||
1885 | return err; | ||
1886 | |||
1795 | if (chip->nvram_size) { | 1887 | if (chip->nvram_size) { |
1796 | struct nvmem_config nvmem_cfg = { | 1888 | struct nvmem_config nvmem_cfg = { |
1797 | .name = "ds1307_nvram", | 1889 | .name = "ds1307_nvram", |