Browse Source

gpiolib: allow GPIOs to be named

Allow GPIOs in GPIOLIB chips to be named.  This name is then used when the
GPIO is exported to sysfs, although it could be used elsewhere if deemed
useful.

Signed-off-by: Daniel Silverstone <dsilvers@simtec.co.uk>
Cc: David Brownell <david-b@pacbell.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Daniel Silverstone 16 năm trước cách đây
mục cha
commit
926b663ce8

+ 6 - 1
drivers/gpio/gpiolib.c

@@ -438,6 +438,7 @@ int gpio_export(unsigned gpio, bool direction_may_change)
 	unsigned long		flags;
 	unsigned long		flags;
 	struct gpio_desc	*desc;
 	struct gpio_desc	*desc;
 	int			status = -EINVAL;
 	int			status = -EINVAL;
+	char			*ioname = NULL;
 
 
 	/* can't export until sysfs is available ... */
 	/* can't export until sysfs is available ... */
 	if (!gpio_class.p) {
 	if (!gpio_class.p) {
@@ -461,11 +462,14 @@ int gpio_export(unsigned gpio, bool direction_may_change)
 	}
 	}
 	spin_unlock_irqrestore(&gpio_lock, flags);
 	spin_unlock_irqrestore(&gpio_lock, flags);
 
 
+	if (desc->chip->names && desc->chip->names[gpio - desc->chip->base])
+		ioname = desc->chip->names[gpio - desc->chip->base];
+
 	if (status == 0) {
 	if (status == 0) {
 		struct device	*dev;
 		struct device	*dev;
 
 
 		dev = device_create(&gpio_class, desc->chip->dev, MKDEV(0, 0),
 		dev = device_create(&gpio_class, desc->chip->dev, MKDEV(0, 0),
-					desc, "gpio%d", gpio);
+				    desc, ioname ? ioname : "gpio%d", gpio);
 		if (dev) {
 		if (dev) {
 			if (direction_may_change)
 			if (direction_may_change)
 				status = sysfs_create_group(&dev->kobj,
 				status = sysfs_create_group(&dev->kobj,
@@ -513,6 +517,7 @@ void gpio_unexport(unsigned gpio)
 	mutex_lock(&sysfs_lock);
 	mutex_lock(&sysfs_lock);
 
 
 	desc = &gpio_desc[gpio];
 	desc = &gpio_desc[gpio];
+
 	if (test_bit(FLAG_EXPORT, &desc->flags)) {
 	if (test_bit(FLAG_EXPORT, &desc->flags)) {
 		struct device	*dev = NULL;
 		struct device	*dev = NULL;
 
 

+ 5 - 0
include/asm-generic/gpio.h

@@ -55,6 +55,10 @@ struct module;
  *	handled is (base + ngpio - 1).
  *	handled is (base + ngpio - 1).
  * @can_sleep: flag must be set iff get()/set() methods sleep, as they
  * @can_sleep: flag must be set iff get()/set() methods sleep, as they
  *	must while accessing GPIO expander chips over I2C or SPI
  *	must while accessing GPIO expander chips over I2C or SPI
+ * @names: if set, must be an array of strings to use as alternative
+ *      names for the GPIOs in this chip. Any entry in the array
+ *      may be NULL if there is no alias for the GPIO, however the
+ *      array must be @ngpio entries long.
  *
  *
  * A gpio_chip can help platforms abstract various sources of GPIOs so
  * A gpio_chip can help platforms abstract various sources of GPIOs so
  * they can all be accessed through a common programing interface.
  * they can all be accessed through a common programing interface.
@@ -92,6 +96,7 @@ struct gpio_chip {
 						struct gpio_chip *chip);
 						struct gpio_chip *chip);
 	int			base;
 	int			base;
 	u16			ngpio;
 	u16			ngpio;
+	char			**names;
 	unsigned		can_sleep:1;
 	unsigned		can_sleep:1;
 	unsigned		exported:1;
 	unsigned		exported:1;
 };
 };