greybus: kernel_ver.h: add sysfs_create_groups() and sysfs_remove_groups()
authorGreg Kroah-Hartman <greg@kroah.com>
Tue, 31 Mar 2015 23:36:23 +0000 (01:36 +0200)
committerGreg Kroah-Hartman <greg@kroah.com>
Tue, 31 Mar 2015 23:36:23 +0000 (01:36 +0200)
These functions showed up in 3.12 or so, and we are stuck on 3.10 for
various reasons, so provide backports in kernel_ver.h so that we can
rely on these functions.

Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
drivers/staging/greybus/kernel_ver.h

index 12b454e..92eb024 100644 (file)
@@ -78,6 +78,8 @@ static inline void gb_gpiochip_remove(struct gpio_chip *chip)
  * it here.
  */
 #if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0)
+#include <linux/sysfs.h>
+
 #define ATTRIBUTE_GROUPS(name)                                 \
 static const struct attribute_group name##_group = {           \
        .attrs = name##_attrs,                                  \
@@ -86,6 +88,37 @@ static const struct attribute_group *name##_groups[] = {     \
        &name##_group,                                          \
        NULL,                                                   \
 }
+
+static inline int sysfs_create_groups(struct kobject *kobj,
+                                     const struct attribute_group **groups)
+{
+       int error = 0;
+       int i;
+
+       if (!groups)
+               return 0;
+
+       for (i = 0; groups[i]; i++) {
+               error = sysfs_create_group(kobj, groups[i]);
+               if (error) {
+                       while (--i >= 0)
+                               sysfs_remove_group(kobj, groups[i]);
+                       break;
+               }
+       }
+       return error;
+}
+
+static inline void sysfs_remove_groups(struct kobject *kobj,
+                                      const struct attribute_group **groups)
+{
+       int i;
+
+       if (!groups)
+               return;
+       for (i = 0; groups[i]; i++)
+               sysfs_remove_group(kobj, groups[i]);
+}
 #endif
 
 #endif /* __GREYBUS_KERNEL_VER_H */