public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] gpiolib: Add ability to get GPIO pin direction
@ 2011-01-06 19:54 Peter Tyser
  2011-01-06 19:54 ` [PATCH 2/3] gpio: pca953x: Implement get_direction() hook Peter Tyser
                   ` (2 more replies)
  0 siblings, 3 replies; 26+ messages in thread
From: Peter Tyser @ 2011-01-06 19:54 UTC (permalink / raw)
  To: linux-kernel
  Cc: Peter Tyser, Alek Du, Samuel Ortiz, David Brownell, Eric Miao,
	Uwe Kleine-K?nig, Mark Brown, Joe Perches

Add a new get_direction() function to the gpio_chip structure.  This is
useful so that the direction of a pin can be determined when its
exported.  Previously, the direction defaulted to 'in' regardless of the
actual configuration of the GPIO pin which resulted in the 'direction'
sysfs file often being incorrect.

If a GPIO driver implements get_direction(), it is called in
gpio_request() to set the initial direction of the pin accurately.

Cc: Alek Du <alek.du@intel.com>
Cc: Samuel Ortiz <sameo@linux.intel.com>
Cc: David Brownell <dbrownell@users.sourceforge.net>
Cc: Eric Miao <eric.y.miao@gmail.com>
Cc: Uwe Kleine-K?nig <u.kleine-koenig@pengutronix.de>
Cc: Mark Brown <broonie@opensource.wolfsonmicro.com>
Cc: Joe Perches <joe@perches.com>
Signed-off-by: Peter Tyser <ptyser@xes-inc.com>
---
 drivers/gpio/gpiolib.c     |   15 ++++++++-------
 include/asm-generic/gpio.h |    4 ++++
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 649550e..0a360d8 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -1062,13 +1062,6 @@ int gpiochip_add(struct gpio_chip *chip)
 	if (status == 0) {
 		for (id = base; id < base + chip->ngpio; id++) {
 			gpio_desc[id].chip = chip;
-
-			/* REVISIT:  most hardware initializes GPIOs as
-			 * inputs (often with pullups enabled) so power
-			 * usage is minimized.  Linux code should set the
-			 * gpio direction first thing; but until it does,
-			 * we may expose the wrong direction in sysfs.
-			 */
 			gpio_desc[id].flags = !chip->direction_input
 				? (1 << FLAG_IS_OUT)
 				: 0;
@@ -1215,6 +1208,14 @@ int gpio_request(unsigned gpio, const char *label)
 		}
 	}
 
+	if (chip->get_direction) {
+		/* chip->get_direction may sleep */
+		spin_unlock_irqrestore(&gpio_lock, flags);
+		if (chip->get_direction(chip, gpio - chip->base) > 0)
+			set_bit(FLAG_IS_OUT, &desc->flags);
+		spin_lock_irqsave(&gpio_lock, flags);
+	}
+
 done:
 	if (status)
 		pr_debug("gpio_request: gpio-%d (%s) status %d\n",
diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h
index ff5c660..7d55cf7 100644
--- a/include/asm-generic/gpio.h
+++ b/include/asm-generic/gpio.h
@@ -57,6 +57,8 @@ struct device_node;
  * @direction_input: configures signal "offset" as input, or returns error
  * @get: returns value for signal "offset"; for output signals this
  *	returns either the value actually sensed, or zero
+ * @get_direction: optional hook to determine if a GPIO signal is configured
+ *	as an input (0) or output (1).
  * @direction_output: configures signal "offset" as output, or returns error
  * @set: assigns output value for signal "offset"
  * @to_irq: optional hook supporting non-static gpio_to_irq() mappings;
@@ -101,6 +103,8 @@ struct gpio_chip {
 						unsigned offset);
 	int			(*get)(struct gpio_chip *chip,
 						unsigned offset);
+	int			(*get_direction)(struct gpio_chip *chip,
+						unsigned offset);
 	int			(*direction_output)(struct gpio_chip *chip,
 						unsigned offset, int value);
 	int			(*set_debounce)(struct gpio_chip *chip,
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2011-03-06  7:53 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-01-06 19:54 [PATCH 1/3] gpiolib: Add ability to get GPIO pin direction Peter Tyser
2011-01-06 19:54 ` [PATCH 2/3] gpio: pca953x: Implement get_direction() hook Peter Tyser
2011-01-06 23:16   ` David Brownell
2011-01-06 19:54 ` [PATCH 3/3] gpio: Add support for Intel ICHx/3100/Series[56] GPIO Peter Tyser
2011-01-06 23:12   ` David Brownell
2011-02-14 15:48 ` [PATCH 1/3] gpiolib: Add ability to get GPIO pin direction Peter Tyser
2011-02-14 16:02   ` Grant Likely
2011-02-14 19:14     ` Grant Likely
2011-02-14 20:01       ` Peter Tyser
2011-02-14 17:08   ` Alan Cox
2011-02-14 17:26     ` Grant Likely
2011-02-14 17:39       ` Mark Brown
2011-02-14 17:45       ` Peter Tyser
2011-02-14 18:04         ` Grant Likely
2011-02-14 18:46           ` Peter Tyser
2011-02-14 19:35       ` Alan Cox
2011-02-14 23:35         ` Peter Tyser
2011-02-15 11:42           ` Alan Cox
2011-02-15 17:05             ` Peter Tyser
2011-02-15 17:19               ` Alan Cox
2011-02-15 17:49                 ` Peter Tyser
2011-02-15 19:41                   ` Alan Cox
2011-02-17  8:06                   ` Uwe Kleine-König
2011-03-06  7:53               ` Grant Likely
2011-02-15 23:55           ` Mark Brown
2011-03-06  7:49         ` Grant Likely

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox