gpio: sysfs: fix gpio-chip device-attribute leak
[pandora-kernel.git] / drivers / gpio / gpiolib.c
index a971e3d..f4e4363 100644 (file)
@@ -587,16 +587,13 @@ static ssize_t chip_ngpio_show(struct device *dev,
 }
 static DEVICE_ATTR(ngpio, 0444, chip_ngpio_show, NULL);
 
-static const struct attribute *gpiochip_attrs[] = {
+static struct attribute *gpiochip_attrs[] = {
        &dev_attr_base.attr,
        &dev_attr_label.attr,
        &dev_attr_ngpio.attr,
        NULL,
 };
-
-static const struct attribute_group gpiochip_attr_group = {
-       .attrs = (struct attribute **) gpiochip_attrs,
-};
+ATTRIBUTE_GROUPS(gpiochip);
 
 /*
  * /sys/class/gpio/export ... write-only
@@ -918,13 +915,13 @@ static int gpiochip_export(struct gpio_chip *chip)
 
        /* use chip->base for the ID; it's already known to be unique */
        mutex_lock(&sysfs_lock);
-       dev = device_create(&gpio_class, chip->dev, MKDEV(0, 0), chip,
-                               "gpiochip%d", chip->base);
-       if (!IS_ERR(dev)) {
-               status = sysfs_create_group(&dev->kobj,
-                               &gpiochip_attr_group);
-       } else
+       dev = device_create_with_groups(&gpio_class, chip->dev, MKDEV(0, 0),
+                                       chip, gpiochip_groups,
+                                       "gpiochip%d", chip->base);
+       if (IS_ERR(dev))
                status = PTR_ERR(dev);
+       else
+               status = 0;
        chip->exported = (status == 0);
        mutex_unlock(&sysfs_lock);
 
@@ -1075,9 +1072,9 @@ int gpiochip_add(struct gpio_chip *chip)
                                ? (1 << FLAG_IS_OUT)
                                : 0;
                }
-       }
 
-       of_gpiochip_add(chip);
+               of_gpiochip_add(chip);
+       }
 
 unlock:
        spin_unlock_irqrestore(&gpio_lock, flags);
@@ -1086,8 +1083,10 @@ unlock:
                goto fail;
 
        status = gpiochip_export(chip);
-       if (status)
+       if (status) {
+               of_gpiochip_remove(chip);
                goto fail;
+       }
 
        return 0;
 fail: