aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-sysfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/rtc/rtc-sysfs.c')
-rw-r--r--drivers/rtc/rtc-sysfs.c59
1 files changed, 30 insertions, 29 deletions
diff --git a/drivers/rtc/rtc-sysfs.c b/drivers/rtc/rtc-sysfs.c
index e3ce1dc92b65..7273855ed02e 100644
--- a/drivers/rtc/rtc-sysfs.c
+++ b/drivers/rtc/rtc-sysfs.c
@@ -122,17 +122,6 @@ hctosys_show(struct device *dev, struct device_attribute *attr, char *buf)
122} 122}
123static DEVICE_ATTR_RO(hctosys); 123static DEVICE_ATTR_RO(hctosys);
124 124
125static struct attribute *rtc_attrs[] = {
126 &dev_attr_name.attr,
127 &dev_attr_date.attr,
128 &dev_attr_time.attr,
129 &dev_attr_since_epoch.attr,
130 &dev_attr_max_user_freq.attr,
131 &dev_attr_hctosys.attr,
132 NULL,
133};
134ATTRIBUTE_GROUPS(rtc);
135
136static ssize_t 125static ssize_t
137wakealarm_show(struct device *dev, struct device_attribute *attr, char *buf) 126wakealarm_show(struct device *dev, struct device_attribute *attr, char *buf)
138{ 127{
@@ -222,6 +211,16 @@ wakealarm_store(struct device *dev, struct device_attribute *attr,
222} 211}
223static DEVICE_ATTR_RW(wakealarm); 212static DEVICE_ATTR_RW(wakealarm);
224 213
214static struct attribute *rtc_attrs[] = {
215 &dev_attr_name.attr,
216 &dev_attr_date.attr,
217 &dev_attr_time.attr,
218 &dev_attr_since_epoch.attr,
219 &dev_attr_max_user_freq.attr,
220 &dev_attr_hctosys.attr,
221 &dev_attr_wakealarm.attr,
222 NULL,
223};
225 224
226/* The reason to trigger an alarm with no process watching it (via sysfs) 225/* The reason to trigger an alarm with no process watching it (via sysfs)
227 * is its side effect: waking from a system state like suspend-to-RAM or 226 * is its side effect: waking from a system state like suspend-to-RAM or
@@ -236,29 +235,31 @@ static bool rtc_does_wakealarm(struct rtc_device *rtc)
236 return rtc->ops->set_alarm != NULL; 235 return rtc->ops->set_alarm != NULL;
237} 236}
238 237
239 238static umode_t rtc_attr_is_visible(struct kobject *kobj,
240void rtc_sysfs_add_device(struct rtc_device *rtc) 239 struct attribute *attr, int n)
241{ 240{
242 int err; 241 struct device *dev = container_of(kobj, struct device, kobj);
242 struct rtc_device *rtc = to_rtc_device(dev);
243 umode_t mode = attr->mode;
243 244
244 /* not all RTCs support both alarms and wakeup */ 245 if (attr == &dev_attr_wakealarm.attr)
245 if (!rtc_does_wakealarm(rtc)) 246 if (!rtc_does_wakealarm(rtc))
246 return; 247 mode = 0;
247 248
248 err = device_create_file(&rtc->dev, &dev_attr_wakealarm); 249 return mode;
249 if (err)
250 dev_err(rtc->dev.parent,
251 "failed to create alarm attribute, %d\n", err);
252} 250}
253 251
254void rtc_sysfs_del_device(struct rtc_device *rtc) 252static struct attribute_group rtc_attr_group = {
255{ 253 .is_visible = rtc_attr_is_visible,
256 /* REVISIT did we add it successfully? */ 254 .attrs = rtc_attrs,
257 if (rtc_does_wakealarm(rtc)) 255};
258 device_remove_file(&rtc->dev, &dev_attr_wakealarm); 256
259} 257static const struct attribute_group *rtc_attr_groups[] = {
258 &rtc_attr_group,
259 NULL
260};
260 261
261void __init rtc_sysfs_init(struct class *rtc_class) 262const struct attribute_group **rtc_get_dev_attribute_groups(void)
262{ 263{
263 rtc_class->dev_groups = rtc_groups; 264 return rtc_attr_groups;
264} 265}