diff options
Diffstat (limited to 'drivers/rtc/rtc-sysfs.c')
-rw-r--r-- | drivers/rtc/rtc-sysfs.c | 59 |
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 | } |
123 | static DEVICE_ATTR_RO(hctosys); | 123 | static DEVICE_ATTR_RO(hctosys); |
124 | 124 | ||
125 | static 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 | }; | ||
134 | ATTRIBUTE_GROUPS(rtc); | ||
135 | |||
136 | static ssize_t | 125 | static ssize_t |
137 | wakealarm_show(struct device *dev, struct device_attribute *attr, char *buf) | 126 | wakealarm_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 | } |
223 | static DEVICE_ATTR_RW(wakealarm); | 212 | static DEVICE_ATTR_RW(wakealarm); |
224 | 213 | ||
214 | static 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 | 238 | static umode_t rtc_attr_is_visible(struct kobject *kobj, | |
240 | void 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 | ||
254 | void rtc_sysfs_del_device(struct rtc_device *rtc) | 252 | static 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 | } | 257 | static const struct attribute_group *rtc_attr_groups[] = { |
258 | &rtc_attr_group, | ||
259 | NULL | ||
260 | }; | ||
260 | 261 | ||
261 | void __init rtc_sysfs_init(struct class *rtc_class) | 262 | const 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 | } |