aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc
diff options
context:
space:
mode:
authorGiulio Benetti <giulio.benetti@micronovasrl.com>2018-07-25 13:26:05 -0400
committerAlexandre Belloni <alexandre.belloni@bootlin.com>2018-09-28 08:20:58 -0400
commitb41c23e152f2852ff7a299676af4f642bbe94abf (patch)
tree4dcd807f550a84cc76d3cbef0d9ce7678f9028d0 /drivers/rtc
parent79230ff64167586b2a556470c7934083afea930e (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.c92
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
1053static 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
1073static 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
1086static DEVICE_ATTR_RW(frequency_test_enable);
1087
1088static struct attribute *rtc_freq_test_attrs[] = {
1089 &dev_attr_frequency_test_enable.attr,
1090 NULL,
1091};
1092
1093static const struct attribute_group rtc_freq_test_attr_group = {
1094 .attrs = rtc_freq_test_attrs,
1095};
1096
1097static 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
1104static 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
1055static int ds1307_nvram_read(void *priv, unsigned int offset, void *val, 1143static 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",