These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / rtc / rtc-sysfs.c
index babd43b..7273855 100644 (file)
@@ -122,20 +122,8 @@ 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
-rtc_sysfs_show_wakealarm(struct device *dev, struct device_attribute *attr,
-               char *buf)
+wakealarm_show(struct device *dev, struct device_attribute *attr, char *buf)
 {
        ssize_t retval;
        unsigned long alarm;
@@ -159,7 +147,7 @@ rtc_sysfs_show_wakealarm(struct device *dev, struct device_attribute *attr,
 }
 
 static ssize_t
-rtc_sysfs_set_wakealarm(struct device *dev, struct device_attribute *attr,
+wakealarm_store(struct device *dev, struct device_attribute *attr,
                const char *buf, size_t n)
 {
        ssize_t retval;
@@ -221,45 +209,57 @@ rtc_sysfs_set_wakealarm(struct device *dev, struct device_attribute *attr,
        retval = rtc_set_alarm(rtc, &alm);
        return (retval < 0) ? retval : n;
 }
-static DEVICE_ATTR(wakealarm, S_IRUGO | S_IWUSR,
-               rtc_sysfs_show_wakealarm, rtc_sysfs_set_wakealarm);
+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
  * suspend-to-disk.  So: no attribute unless that side effect is possible.
  * (Userspace may disable that mechanism later.)
  */
-static inline int rtc_does_wakealarm(struct rtc_device *rtc)
+static bool rtc_does_wakealarm(struct rtc_device *rtc)
 {
        if (!device_can_wakeup(rtc->dev.parent))
-               return 0;
+               return false;
+
        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;
 }