|
@@ -122,17 +122,6 @@ hctosys_show(struct device *dev, struct device_attribute *attr, char *buf)
|
|
|
}
|
|
|
static DEVICE_ATTR_RO(hctosys);
|
|
|
|
|
|
-static struct attribute *rtc_attrs[] = {
|
|
|
- &dev_attr_name.attr,
|
|
|
- &dev_attr_date.attr,
|
|
|
- &dev_attr_time.attr,
|
|
|
- &dev_attr_since_epoch.attr,
|
|
|
- &dev_attr_max_user_freq.attr,
|
|
|
- &dev_attr_hctosys.attr,
|
|
|
- NULL,
|
|
|
-};
|
|
|
-ATTRIBUTE_GROUPS(rtc);
|
|
|
-
|
|
|
static ssize_t
|
|
|
wakealarm_show(struct device *dev, struct device_attribute *attr, char *buf)
|
|
|
{
|
|
@@ -222,6 +211,16 @@ wakealarm_store(struct device *dev, struct device_attribute *attr,
|
|
|
}
|
|
|
static DEVICE_ATTR_RW(wakealarm);
|
|
|
|
|
|
+static struct attribute *rtc_attrs[] = {
|
|
|
+ &dev_attr_name.attr,
|
|
|
+ &dev_attr_date.attr,
|
|
|
+ &dev_attr_time.attr,
|
|
|
+ &dev_attr_since_epoch.attr,
|
|
|
+ &dev_attr_max_user_freq.attr,
|
|
|
+ &dev_attr_hctosys.attr,
|
|
|
+ &dev_attr_wakealarm.attr,
|
|
|
+ NULL,
|
|
|
+};
|
|
|
|
|
|
/* The reason to trigger an alarm with no process watching it (via sysfs)
|
|
|
* 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)
|
|
|
return rtc->ops->set_alarm != NULL;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-void rtc_sysfs_add_device(struct rtc_device *rtc)
|
|
|
+static umode_t rtc_attr_is_visible(struct kobject *kobj,
|
|
|
+ struct attribute *attr, int n)
|
|
|
{
|
|
|
- int err;
|
|
|
+ struct device *dev = container_of(kobj, struct device, kobj);
|
|
|
+ struct rtc_device *rtc = to_rtc_device(dev);
|
|
|
+ umode_t mode = attr->mode;
|
|
|
|
|
|
- /* not all RTCs support both alarms and wakeup */
|
|
|
- if (!rtc_does_wakealarm(rtc))
|
|
|
- return;
|
|
|
+ if (attr == &dev_attr_wakealarm.attr)
|
|
|
+ if (!rtc_does_wakealarm(rtc))
|
|
|
+ mode = 0;
|
|
|
|
|
|
- err = device_create_file(&rtc->dev, &dev_attr_wakealarm);
|
|
|
- if (err)
|
|
|
- dev_err(rtc->dev.parent,
|
|
|
- "failed to create alarm attribute, %d\n", err);
|
|
|
+ return mode;
|
|
|
}
|
|
|
|
|
|
-void rtc_sysfs_del_device(struct rtc_device *rtc)
|
|
|
-{
|
|
|
- /* REVISIT did we add it successfully? */
|
|
|
- if (rtc_does_wakealarm(rtc))
|
|
|
- device_remove_file(&rtc->dev, &dev_attr_wakealarm);
|
|
|
-}
|
|
|
+static struct attribute_group rtc_attr_group = {
|
|
|
+ .is_visible = rtc_attr_is_visible,
|
|
|
+ .attrs = rtc_attrs,
|
|
|
+};
|
|
|
+
|
|
|
+static const struct attribute_group *rtc_attr_groups[] = {
|
|
|
+ &rtc_attr_group,
|
|
|
+ NULL
|
|
|
+};
|
|
|
|
|
|
-void __init rtc_sysfs_init(struct class *rtc_class)
|
|
|
+const struct attribute_group **rtc_get_dev_attribute_groups(void)
|
|
|
{
|
|
|
- rtc_class->dev_groups = rtc_groups;
|
|
|
+ return rtc_attr_groups;
|
|
|
}
|