diff options
author | Alexandre Belloni <alexandre.belloni@bootlin.com> | 2018-02-17 08:58:40 -0500 |
---|---|---|
committer | Alexandre Belloni <alexandre.belloni@bootlin.com> | 2018-03-17 09:20:54 -0400 |
commit | 71db049e7355f31604e2c04b6cabb71d02bd487d (patch) | |
tree | 19743f8478631b847a11cf09690a6b4f28927e76 /drivers/rtc/rtc-sysfs.c | |
parent | 236b7187034e87bd46eb535ab4f276267ef66ee4 (diff) |
rtc: Add RTC range
Add a way for drivers to inform the core of the supported date/time range.
The core can then check whether the date/time or alarm is in the range
before calling ->set_time, ->set_mmss or ->set_alarm. It returns -ERANGE
when the time is out of range.
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Diffstat (limited to 'drivers/rtc/rtc-sysfs.c')
-rw-r--r-- | drivers/rtc/rtc-sysfs.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/rtc/rtc-sysfs.c b/drivers/rtc/rtc-sysfs.c index 92ff2edb86a6..454da38c6012 100644 --- a/drivers/rtc/rtc-sysfs.c +++ b/drivers/rtc/rtc-sysfs.c | |||
@@ -248,6 +248,14 @@ offset_store(struct device *dev, struct device_attribute *attr, | |||
248 | } | 248 | } |
249 | static DEVICE_ATTR_RW(offset); | 249 | static DEVICE_ATTR_RW(offset); |
250 | 250 | ||
251 | static ssize_t | ||
252 | range_show(struct device *dev, struct device_attribute *attr, char *buf) | ||
253 | { | ||
254 | return sprintf(buf, "[%lld,%llu]\n", to_rtc_device(dev)->range_min, | ||
255 | to_rtc_device(dev)->range_max); | ||
256 | } | ||
257 | static DEVICE_ATTR_RO(range); | ||
258 | |||
251 | static struct attribute *rtc_attrs[] = { | 259 | static struct attribute *rtc_attrs[] = { |
252 | &dev_attr_name.attr, | 260 | &dev_attr_name.attr, |
253 | &dev_attr_date.attr, | 261 | &dev_attr_date.attr, |
@@ -257,6 +265,7 @@ static struct attribute *rtc_attrs[] = { | |||
257 | &dev_attr_hctosys.attr, | 265 | &dev_attr_hctosys.attr, |
258 | &dev_attr_wakealarm.attr, | 266 | &dev_attr_wakealarm.attr, |
259 | &dev_attr_offset.attr, | 267 | &dev_attr_offset.attr, |
268 | &dev_attr_range.attr, | ||
260 | NULL, | 269 | NULL, |
261 | }; | 270 | }; |
262 | 271 | ||
@@ -286,6 +295,9 @@ static umode_t rtc_attr_is_visible(struct kobject *kobj, | |||
286 | } else if (attr == &dev_attr_offset.attr) { | 295 | } else if (attr == &dev_attr_offset.attr) { |
287 | if (!rtc->ops->set_offset) | 296 | if (!rtc->ops->set_offset) |
288 | mode = 0; | 297 | mode = 0; |
298 | } else if (attr == &dev_attr_range.attr) { | ||
299 | if (!(rtc->range_max - rtc->range_min)) | ||
300 | mode = 0; | ||
289 | } | 301 | } |
290 | 302 | ||
291 | return mode; | 303 | return mode; |