[PATCH 1/2] gpiolib: add gpio_export_with_name

Subsystems: generic include/asm header files, gpio subsystem, mips, the rest

STALE4811d

5 messages, 4 authors, 2013-05-30 · open the first message on its own page

[PATCH 1/2] gpiolib: add gpio_export_with_name

From: Jean-Christophe PLAGNIOL-VILLARD <hidden>
Date: 2012-11-21 10:14:08

allow to specify a name to an exported gpio

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <redacted>
---
 arch/mips/include/asm/mach-au1x00/gpio-au1000.h |    3 ++-
 arch/mips/include/asm/mach-au1x00/gpio-au1300.h |    3 ++-
 drivers/gpio/gpiolib.c                          |   12 +++++++-----
 include/asm-generic/gpio.h                      |    6 ++++--
 include/linux/gpio.h                            |   23 ++++++++++++++++++++++-
 5 files changed, 37 insertions(+), 10 deletions(-)
diff --git a/arch/mips/include/asm/mach-au1x00/gpio-au1000.h b/arch/mips/include/asm/mach-au1x00/gpio-au1000.h
index 73853b5a..af4accb 100644
--- a/arch/mips/include/asm/mach-au1x00/gpio-au1000.h
+++ b/arch/mips/include/asm/mach-au1x00/gpio-au1000.h
@@ -633,7 +633,8 @@ static inline int gpio_set_debounce(unsigned gpio, unsigned debounce)
 	return -ENOSYS;
 }
 
-static inline int gpio_export(unsigned gpio, bool direction_may_change)
+static inline int gpio_export_with_name(unsigned gpio,
+	bool direction_may_change, const char *name)
 {
 	return -ENOSYS;
 }
diff --git a/arch/mips/include/asm/mach-au1x00/gpio-au1300.h b/arch/mips/include/asm/mach-au1x00/gpio-au1300.h
index fb9975c..fcd152e 100644
--- a/arch/mips/include/asm/mach-au1x00/gpio-au1300.h
+++ b/arch/mips/include/asm/mach-au1x00/gpio-au1300.h
@@ -234,7 +234,8 @@ static inline void gpio_unexport(unsigned gpio)
 {
 }
 
-static inline int gpio_export(unsigned gpio, bool direction_may_change)
+static inline int gpio_export_with_name(unsigned gpio,
+	bool direction_may_change, const char *name)
 {
 	return -ENOSYS;
 }
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index b667f76..2141165 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -714,9 +714,10 @@ static struct class gpio_class = {
 
 
 /**
- * gpio_export - export a GPIO through sysfs
+ * gpio_export_with_name - export a GPIO through sysfs
  * @gpio: gpio to make available, already requested
  * @direction_may_change: true if userspace may change gpio direction
+ * @name: gpio name
  * Context: arch_initcall or later
  *
  * When drivers want to make a GPIO accessible to userspace after they
@@ -728,7 +729,7 @@ static struct class gpio_class = {
  *
  * Returns zero on success, else an error.
  */
-int gpio_export(unsigned gpio, bool direction_may_change)
+int gpio_export_with_name(unsigned gpio, bool direction_may_change, const char *name)
 {
 	unsigned long		flags;
 	struct gpio_desc	*desc;
@@ -766,7 +767,9 @@ int gpio_export(unsigned gpio, bool direction_may_change)
 		direction_may_change = false;
 	spin_unlock_irqrestore(&gpio_lock, flags);
 
-	if (desc->chip->names && desc->chip->names[gpio - desc->chip->base])
+	if (name)
+		ioname = name;
+	else if (desc->chip->names && desc->chip->names[gpio - desc->chip->base])
 		ioname = desc->chip->names[gpio - desc->chip->base];
 
 	dev = device_create(&gpio_class, desc->chip->dev, MKDEV(0, 0),
@@ -804,7 +807,7 @@ fail_unlock:
 	pr_debug("%s: gpio%d status %d\n", __func__, gpio, status);
 	return status;
 }
-EXPORT_SYMBOL_GPL(gpio_export);
+EXPORT_SYMBOL_GPL(gpio_export_with_name);
 
 static int match_export(struct device *dev, void *data)
 {
@@ -856,7 +859,6 @@ done:
 }
 EXPORT_SYMBOL_GPL(gpio_export_link);
 
-
 /**
  * gpio_sysfs_set_active_low - set the polarity of gpio sysfs value
  * @gpio: gpio to change
diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h
index b6516f3..d04fc55 100644
--- a/include/asm-generic/gpio.h
+++ b/include/asm-generic/gpio.h
@@ -204,7 +204,8 @@ void devm_gpio_free(struct device *dev, unsigned int gpio);
  * A sysfs interface can be exported by individual drivers if they want,
  * but more typically is configured entirely from userspace.
  */
-extern int gpio_export(unsigned gpio, bool direction_may_change);
+extern int gpio_export_with_name(unsigned gpio, bool direction_may_change,
+			const char *name);
 extern int gpio_export_link(struct device *dev, const char *name,
 			unsigned gpio);
 extern int gpio_sysfs_set_active_low(unsigned gpio, int value);
@@ -249,7 +250,8 @@ struct device;
 
 /* sysfs support is only available with gpiolib, where it's optional */
 
-static inline int gpio_export(unsigned gpio, bool direction_may_change)
+static inline int gpio_export_with_name(unsigned gpio,
+	bool direction_may_change, const char *name)
 {
 	return -ENOSYS;
 }
diff --git a/include/linux/gpio.h b/include/linux/gpio.h
index 7ba2762..6e01b8c 100644
--- a/include/linux/gpio.h
+++ b/include/linux/gpio.h
@@ -189,7 +189,8 @@ static inline void gpio_set_value_cansleep(unsigned gpio, int value)
 	WARN_ON(1);
 }
 
-static inline int gpio_export(unsigned gpio, bool direction_may_change)
+static inline int gpio_export_with_name(unsigned gpio,
+	bool direction_may_change, const char *name)
 {
 	/* GPIO can never have been requested or set as {in,out}put */
 	WARN_ON(1);
@@ -247,4 +248,24 @@ gpiochip_remove_pin_ranges(struct gpio_chip *chip)
 
 #endif /* ! CONFIG_GENERIC_GPIO */
 
+/**
+ * gpio_export - export a GPIO through sysfs
+ * @gpio: gpio to make available, already requested
+ * @direction_may_change: true if userspace may change gpio direction
+ * Context: arch_initcall or later
+ *
+ * When drivers want to make a GPIO accessible to userspace after they
+ * have requested it -- perhaps while debugging, or as part of their
+ * public interface -- they may use this routine.  If the GPIO can
+ * change direction (some can't) and the caller allows it, userspace
+ * will see "direction" sysfs attribute which may be used to change
+ * the gpio's direction.  A "value" attribute will always be provided.
+ *
+ * Returns zero on success, else an error.
+ */
+static inline int gpio_export(unsigned gpio,bool direction_may_change)
+{
+	return gpio_export_with_name(gpio, direction_may_change, NULL);
+}
+
 #endif /* __LINUX_GPIO_H */
-- 
1.7.10.4

[PATCH 2/2] gpiolib-of: ad gpio-export support

From: Jean-Christophe PLAGNIOL-VILLARD <hidden>
Date: 2012-11-21 10:14:09

This will allow to export gpios with or without names

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <redacted>
---
 Documentation/devicetree/bindings/gpio/gpio.txt |   60 ++++++++++++++++++++++
 drivers/gpio/gpiolib-of.c                       |   61 +++++++++++++++++++++++
 2 files changed, 121 insertions(+)
diff --git a/Documentation/devicetree/bindings/gpio/gpio.txt b/Documentation/devicetree/bindings/gpio/gpio.txt
index a336287..c2a9024 100644
--- a/Documentation/devicetree/bindings/gpio/gpio.txt
+++ b/Documentation/devicetree/bindings/gpio/gpio.txt
@@ -112,3 +112,63 @@ where,
 
 The pinctrl node must have "#gpio-range-cells" property to show number of
 arguments to pass with phandle from gpio controllers node.
+
+3) gpio-export
+--------------
+
+gpio-export will allow you to automatically export gpio
+
+required properties:
+- compatible: Should be "gpio-export"
+
+in each child node will reprensent a gpio or if no name is specified
+a list of gpio to export
+
+required properties:
+- gpios: gpio to export
+
+optional properties:
+ - gpio-export,name: export name
+ - gpio-export,output: to set the as output with default value
+ 		       if no present gpio as input
+ - pio-export,direction_may_change: boolean to allow the direction to be controllable
+
+Example:
+
+
+gpio_export {
+	compatible = "gpio-export";
+	#size-cells = <0>;
+
+	in {
+		gpio-export,name = "in";
+		gpios = <&pioC 20 0>;
+	};
+
+	out {
+		gpio-export,name = "out";
+		gpio-export,output = <1>;
+		gpio-export,direction_may_change;
+		gpios = <&pioC 21 0>;
+	};
+
+	in_out {
+		gpio-export,name = "in_out";
+		gpio-export,direction_may_change;
+		gpios = <&pioC 21 0>;
+	};
+
+	gpios_in {
+		gpios = <&pioB 0 0
+			 &pioB 3 0
+			 &pioC 4 0>;
+		gpio-export,direction_may_change;
+	};
+
+	gpios_out {
+		gpios = <&pioB 1 0
+			 &pioB 2 0
+			 &pioC 3 0>;
+		gpio-export,output = <1>;
+	};
+};
diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
index a40cd84..0ab9be4 100644
--- a/drivers/gpio/gpiolib-of.c
+++ b/drivers/gpio/gpiolib-of.c
@@ -21,6 +21,8 @@
 #include <linux/of_gpio.h>
 #include <linux/pinctrl/pinctrl.h>
 #include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
 
 /* Private data structure for of_gpiochip_find_and_xlate */
 struct gg_data {
@@ -277,3 +279,62 @@ void of_gpiochip_remove(struct gpio_chip *chip)
 	if (chip->of_node)
 		of_node_put(chip->of_node);
 }
+
+static struct of_device_id gpio_export_ids[] = {
+	{ .compatible = "gpio-export" },
+	{ /* sentinel */ }
+};
+
+static int __init of_gpio_export_probe(struct platform_device *pdev)
+{
+	struct device_node *np = pdev->dev.of_node;
+	struct device_node *cnp;
+	u32 val;
+	int nb = 0;
+
+	for_each_child_of_node(np, cnp) {
+		const char *name = NULL;
+		int gpio;
+		bool dmc;
+		int max_gpio = 1;
+		int i;
+
+		of_property_read_string(cnp, "gpio-export,name", &name);
+
+		if (!name)
+			max_gpio = of_gpio_count(cnp);
+
+		for (i = 0; i < max_gpio; i++) {
+			gpio = of_get_gpio(cnp, i);
+			if (devm_gpio_request(&pdev->dev, gpio, name ? name : of_node_full_name(np)))
+				continue;
+
+			if (!of_property_read_u32(cnp, "gpio-export,output", &val))
+				gpio_direction_output(gpio, val);
+			else
+				gpio_direction_input(gpio);
+
+			dmc = of_property_read_bool(np, "gpio-export,direction_may_change");
+			gpio_export_with_name(gpio, dmc, name);
+			nb++;
+		}
+	}
+
+	dev_info(&pdev->dev, "%d gpio(s) exported\n", nb);
+
+	return 0;
+}
+
+static struct platform_driver gpio_export_driver = {
+	.driver		= {
+		.name		= "gpio-export",
+		.owner	= THIS_MODULE,
+		.of_match_table	= of_match_ptr(gpio_export_ids),
+	},
+};
+
+static int __init of_gpio_export_init(void)
+{
+	return platform_driver_probe(&gpio_export_driver, of_gpio_export_probe);
+}
+device_initcall(of_gpio_export_init);
-- 
1.7.10.4

Re: [PATCH 1/2] gpiolib: add gpio_export_with_name

From: Grant Likely <hidden>
Date: 2012-11-26 13:59:11

On Wed, 21 Nov 2012 11:14:08 +0100, Jean-Christophe PLAGNIOL-VILLARD [off-list ref] wrote:
allow to specify a name to an exported gpio

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <redacted>
The gpio sysfs ABI is already horrible, racy, and unsafe. Really, we
need a proper chrdev interface for controlling gpios. Sysfs is fine for
poking around and experimenting, but we cannot provide any fine grained
access control, locking or faster IO with the one-file-per-gpio sysfs
model. So, no, I don't think this is a good idea to extend gpiolib in
this way.

However, I would be okay with making gpiochips first-class kobjects or
struct devices that appear as a child of the gpio controller device so
that userspace could interrogate the device tree node associated with
the device.

g.
quoted hunk
---
 arch/mips/include/asm/mach-au1x00/gpio-au1000.h |    3 ++-
 arch/mips/include/asm/mach-au1x00/gpio-au1300.h |    3 ++-
 drivers/gpio/gpiolib.c                          |   12 +++++++-----
 include/asm-generic/gpio.h                      |    6 ++++--
 include/linux/gpio.h                            |   23 ++++++++++++++++++++++-
 5 files changed, 37 insertions(+), 10 deletions(-)
diff --git a/arch/mips/include/asm/mach-au1x00/gpio-au1000.h b/arch/mips/include/asm/mach-au1x00/gpio-au1000.h
index 73853b5a..af4accb 100644
--- a/arch/mips/include/asm/mach-au1x00/gpio-au1000.h
+++ b/arch/mips/include/asm/mach-au1x00/gpio-au1000.h
@@ -633,7 +633,8 @@ static inline int gpio_set_debounce(unsigned gpio, unsigned debounce)
 	return -ENOSYS;
 }
 
-static inline int gpio_export(unsigned gpio, bool direction_may_change)
+static inline int gpio_export_with_name(unsigned gpio,
+	bool direction_may_change, const char *name)
 {
 	return -ENOSYS;
 }
diff --git a/arch/mips/include/asm/mach-au1x00/gpio-au1300.h b/arch/mips/include/asm/mach-au1x00/gpio-au1300.h
index fb9975c..fcd152e 100644
--- a/arch/mips/include/asm/mach-au1x00/gpio-au1300.h
+++ b/arch/mips/include/asm/mach-au1x00/gpio-au1300.h
@@ -234,7 +234,8 @@ static inline void gpio_unexport(unsigned gpio)
 {
 }
 
-static inline int gpio_export(unsigned gpio, bool direction_may_change)
+static inline int gpio_export_with_name(unsigned gpio,
+	bool direction_may_change, const char *name)
 {
 	return -ENOSYS;
 }
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index b667f76..2141165 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -714,9 +714,10 @@ static struct class gpio_class = {
 
 
 /**
- * gpio_export - export a GPIO through sysfs
+ * gpio_export_with_name - export a GPIO through sysfs
  * @gpio: gpio to make available, already requested
  * @direction_may_change: true if userspace may change gpio direction
+ * @name: gpio name
  * Context: arch_initcall or later
  *
  * When drivers want to make a GPIO accessible to userspace after they
@@ -728,7 +729,7 @@ static struct class gpio_class = {
  *
  * Returns zero on success, else an error.
  */
-int gpio_export(unsigned gpio, bool direction_may_change)
+int gpio_export_with_name(unsigned gpio, bool direction_may_change, const char *name)
 {
 	unsigned long		flags;
 	struct gpio_desc	*desc;
@@ -766,7 +767,9 @@ int gpio_export(unsigned gpio, bool direction_may_change)
 		direction_may_change = false;
 	spin_unlock_irqrestore(&gpio_lock, flags);
 
-	if (desc->chip->names && desc->chip->names[gpio - desc->chip->base])
+	if (name)
+		ioname = name;
+	else if (desc->chip->names && desc->chip->names[gpio - desc->chip->base])
 		ioname = desc->chip->names[gpio - desc->chip->base];
 
 	dev = device_create(&gpio_class, desc->chip->dev, MKDEV(0, 0),
@@ -804,7 +807,7 @@ fail_unlock:
 	pr_debug("%s: gpio%d status %d\n", __func__, gpio, status);
 	return status;
 }
-EXPORT_SYMBOL_GPL(gpio_export);
+EXPORT_SYMBOL_GPL(gpio_export_with_name);
 
 static int match_export(struct device *dev, void *data)
 {
@@ -856,7 +859,6 @@ done:
 }
 EXPORT_SYMBOL_GPL(gpio_export_link);
 
-
 /**
  * gpio_sysfs_set_active_low - set the polarity of gpio sysfs value
  * @gpio: gpio to change
diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h
index b6516f3..d04fc55 100644
--- a/include/asm-generic/gpio.h
+++ b/include/asm-generic/gpio.h
@@ -204,7 +204,8 @@ void devm_gpio_free(struct device *dev, unsigned int gpio);
  * A sysfs interface can be exported by individual drivers if they want,
  * but more typically is configured entirely from userspace.
  */
-extern int gpio_export(unsigned gpio, bool direction_may_change);
+extern int gpio_export_with_name(unsigned gpio, bool direction_may_change,
+			const char *name);
 extern int gpio_export_link(struct device *dev, const char *name,
 			unsigned gpio);
 extern int gpio_sysfs_set_active_low(unsigned gpio, int value);
@@ -249,7 +250,8 @@ struct device;
 
 /* sysfs support is only available with gpiolib, where it's optional */
 
-static inline int gpio_export(unsigned gpio, bool direction_may_change)
+static inline int gpio_export_with_name(unsigned gpio,
+	bool direction_may_change, const char *name)
 {
 	return -ENOSYS;
 }
diff --git a/include/linux/gpio.h b/include/linux/gpio.h
index 7ba2762..6e01b8c 100644
--- a/include/linux/gpio.h
+++ b/include/linux/gpio.h
@@ -189,7 +189,8 @@ static inline void gpio_set_value_cansleep(unsigned gpio, int value)
 	WARN_ON(1);
 }
 
-static inline int gpio_export(unsigned gpio, bool direction_may_change)
+static inline int gpio_export_with_name(unsigned gpio,
+	bool direction_may_change, const char *name)
 {
 	/* GPIO can never have been requested or set as {in,out}put */
 	WARN_ON(1);
@@ -247,4 +248,24 @@ gpiochip_remove_pin_ranges(struct gpio_chip *chip)
 
 #endif /* ! CONFIG_GENERIC_GPIO */
 
+/**
+ * gpio_export - export a GPIO through sysfs
+ * @gpio: gpio to make available, already requested
+ * @direction_may_change: true if userspace may change gpio direction
+ * Context: arch_initcall or later
+ *
+ * When drivers want to make a GPIO accessible to userspace after they
+ * have requested it -- perhaps while debugging, or as part of their
+ * public interface -- they may use this routine.  If the GPIO can
+ * change direction (some can't) and the caller allows it, userspace
+ * will see "direction" sysfs attribute which may be used to change
+ * the gpio's direction.  A "value" attribute will always be provided.
+ *
+ * Returns zero on success, else an error.
+ */
+static inline int gpio_export(unsigned gpio,bool direction_may_change)
+{
+	return gpio_export_with_name(gpio, direction_may_change, NULL);
+}
+
 #endif /* __LINUX_GPIO_H */
-- 
1.7.10.4


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
-- 
Grant Likely, B.Sc, P.Eng.
Secret Lab Technologies, Ltd.

Re: [PATCH 1/2] gpiolib: add gpio_export_with_name

From: Jean-Christophe PLAGNIOL-VILLARD <hidden>
Date: 2012-11-28 20:19:07

On 13:59 Mon 26 Nov     , Grant Likely wrote:
On Wed, 21 Nov 2012 11:14:08 +0100, Jean-Christophe PLAGNIOL-VILLARD [off-list ref] wrote:
quoted
allow to specify a name to an exported gpio

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <redacted>
The gpio sysfs ABI is already horrible, racy, and unsafe. Really, we
need a proper chrdev interface for controlling gpios. Sysfs is fine for
poking around and experimenting, but we cannot provide any fine grained
access control, locking or faster IO with the one-file-per-gpio sysfs
model.
I do agree on this and mention it on the ML multiple times but this an ABI
and we can not change it anymore we need to support it
So, no, I don't think this is a good idea to extend gpiolib in
this way.

However, I would be okay with making gpiochips first-class kobjects or
struct devices that appear as a child of the gpio controller device so
that userspace could interrogate the device tree node associated with
the device.
the problem here is that I do not want the user space to become smart

I want the user space to known which gpio use for a specific feature
as example you just want to read lack restistor to detect a hw features

you known the encoding it does not change cross hw but the pin to read do

So the idea is just to tell the user space use this pin to get your
information

how to do you want to solve this?

This apply to other case:
 - chip poweron/off
 - reset
 etc... all control by userspace

Best Regards,
J.
g.
quoted
---
 arch/mips/include/asm/mach-au1x00/gpio-au1000.h |    3 ++-
 arch/mips/include/asm/mach-au1x00/gpio-au1300.h |    3 ++-
 drivers/gpio/gpiolib.c                          |   12 +++++++-----
 include/asm-generic/gpio.h                      |    6 ++++--
 include/linux/gpio.h                            |   23 ++++++++++++++++++++++-
 5 files changed, 37 insertions(+), 10 deletions(-)
diff --git a/arch/mips/include/asm/mach-au1x00/gpio-au1000.h b/arch/mips/include/asm/mach-au1x00/gpio-au1000.h
index 73853b5a..af4accb 100644
--- a/arch/mips/include/asm/mach-au1x00/gpio-au1000.h
+++ b/arch/mips/include/asm/mach-au1x00/gpio-au1000.h
@@ -633,7 +633,8 @@ static inline int gpio_set_debounce(unsigned gpio, unsigned debounce)
 	return -ENOSYS;
 }
 
-static inline int gpio_export(unsigned gpio, bool direction_may_change)
+static inline int gpio_export_with_name(unsigned gpio,
+	bool direction_may_change, const char *name)
 {
 	return -ENOSYS;
 }
diff --git a/arch/mips/include/asm/mach-au1x00/gpio-au1300.h b/arch/mips/include/asm/mach-au1x00/gpio-au1300.h
index fb9975c..fcd152e 100644
--- a/arch/mips/include/asm/mach-au1x00/gpio-au1300.h
+++ b/arch/mips/include/asm/mach-au1x00/gpio-au1300.h
@@ -234,7 +234,8 @@ static inline void gpio_unexport(unsigned gpio)
 {
 }
 
-static inline int gpio_export(unsigned gpio, bool direction_may_change)
+static inline int gpio_export_with_name(unsigned gpio,
+	bool direction_may_change, const char *name)
 {
 	return -ENOSYS;
 }
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index b667f76..2141165 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -714,9 +714,10 @@ static struct class gpio_class = {
 
 
 /**
- * gpio_export - export a GPIO through sysfs
+ * gpio_export_with_name - export a GPIO through sysfs
  * @gpio: gpio to make available, already requested
  * @direction_may_change: true if userspace may change gpio direction
+ * @name: gpio name
  * Context: arch_initcall or later
  *
  * When drivers want to make a GPIO accessible to userspace after they
@@ -728,7 +729,7 @@ static struct class gpio_class = {
  *
  * Returns zero on success, else an error.
  */
-int gpio_export(unsigned gpio, bool direction_may_change)
+int gpio_export_with_name(unsigned gpio, bool direction_may_change, const char *name)
 {
 	unsigned long		flags;
 	struct gpio_desc	*desc;
@@ -766,7 +767,9 @@ int gpio_export(unsigned gpio, bool direction_may_change)
 		direction_may_change = false;
 	spin_unlock_irqrestore(&gpio_lock, flags);
 
-	if (desc->chip->names && desc->chip->names[gpio - desc->chip->base])
+	if (name)
+		ioname = name;
+	else if (desc->chip->names && desc->chip->names[gpio - desc->chip->base])
 		ioname = desc->chip->names[gpio - desc->chip->base];
 
 	dev = device_create(&gpio_class, desc->chip->dev, MKDEV(0, 0),
@@ -804,7 +807,7 @@ fail_unlock:
 	pr_debug("%s: gpio%d status %d\n", __func__, gpio, status);
 	return status;
 }
-EXPORT_SYMBOL_GPL(gpio_export);
+EXPORT_SYMBOL_GPL(gpio_export_with_name);
 
 static int match_export(struct device *dev, void *data)
 {
@@ -856,7 +859,6 @@ done:
 }
 EXPORT_SYMBOL_GPL(gpio_export_link);
 
-
 /**
  * gpio_sysfs_set_active_low - set the polarity of gpio sysfs value
  * @gpio: gpio to change
diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h
index b6516f3..d04fc55 100644
--- a/include/asm-generic/gpio.h
+++ b/include/asm-generic/gpio.h
@@ -204,7 +204,8 @@ void devm_gpio_free(struct device *dev, unsigned int gpio);
  * A sysfs interface can be exported by individual drivers if they want,
  * but more typically is configured entirely from userspace.
  */
-extern int gpio_export(unsigned gpio, bool direction_may_change);
+extern int gpio_export_with_name(unsigned gpio, bool direction_may_change,
+			const char *name);
 extern int gpio_export_link(struct device *dev, const char *name,
 			unsigned gpio);
 extern int gpio_sysfs_set_active_low(unsigned gpio, int value);
@@ -249,7 +250,8 @@ struct device;
 
 /* sysfs support is only available with gpiolib, where it's optional */
 
-static inline int gpio_export(unsigned gpio, bool direction_may_change)
+static inline int gpio_export_with_name(unsigned gpio,
+	bool direction_may_change, const char *name)
 {
 	return -ENOSYS;
 }
diff --git a/include/linux/gpio.h b/include/linux/gpio.h
index 7ba2762..6e01b8c 100644
--- a/include/linux/gpio.h
+++ b/include/linux/gpio.h
@@ -189,7 +189,8 @@ static inline void gpio_set_value_cansleep(unsigned gpio, int value)
 	WARN_ON(1);
 }
 
-static inline int gpio_export(unsigned gpio, bool direction_may_change)
+static inline int gpio_export_with_name(unsigned gpio,
+	bool direction_may_change, const char *name)
 {
 	/* GPIO can never have been requested or set as {in,out}put */
 	WARN_ON(1);
@@ -247,4 +248,24 @@ gpiochip_remove_pin_ranges(struct gpio_chip *chip)
 
 #endif /* ! CONFIG_GENERIC_GPIO */
 
+/**
+ * gpio_export - export a GPIO through sysfs
+ * @gpio: gpio to make available, already requested
+ * @direction_may_change: true if userspace may change gpio direction
+ * Context: arch_initcall or later
+ *
+ * When drivers want to make a GPIO accessible to userspace after they
+ * have requested it -- perhaps while debugging, or as part of their
+ * public interface -- they may use this routine.  If the GPIO can
+ * change direction (some can't) and the caller allows it, userspace
+ * will see "direction" sysfs attribute which may be used to change
+ * the gpio's direction.  A "value" attribute will always be provided.
+ *
+ * Returns zero on success, else an error.
+ */
+static inline int gpio_export(unsigned gpio,bool direction_may_change)
+{
+	return gpio_export_with_name(gpio, direction_may_change, NULL);
+}
+
 #endif /* __LINUX_GPIO_H */
-- 
1.7.10.4


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
-- 
Grant Likely, B.Sc, P.Eng.
Secret Lab Technologies, Ltd.

Re: [PATCH 1/2] gpiolib: add gpio_export_with_name

From: Florian Vaussard <hidden>
Date: 2013-05-30 09:19:33

Hello Grant,

On 11/26/2012 02:59 PM, Grant Likely wrote:
On Wed, 21 Nov 2012 11:14:08 +0100, Jean-Christophe PLAGNIOL-VILLARD [off-list ref] wrote:
quoted
allow to specify a name to an exported gpio

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <redacted>
The gpio sysfs ABI is already horrible, racy, and unsafe. Really, we
need a proper chrdev interface for controlling gpios. Sysfs is fine for
poking around and experimenting, but we cannot provide any fine grained
access control, locking or faster IO with the one-file-per-gpio sysfs
model. So, no, I don't think this is a good idea to extend gpiolib in
this way.
Would it make sense to provide only the DT binding to export a GPIO,
without changing the sysfs ABI? Even if work is progressing towards
having gpio-controlled reset pins [1], some boards still need GPIOs to
be exported to userspace for other functionalities.

Regards,

Florian

[1] http://article.gmane.org/gmane.linux.power-management.general/31364
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help