The switchover to cross-platform GPIO interface unexpectedly caused all
output GPIO switches to be set to high state by default, unlike the
original OMAP code. Introduce a new GPIO switch flag to define the
initial state of the switch. Unless the flag is set, the default is now
inactive state of the switch.

Also store the state of output switches directly into the switch struct
instead of trying to read an output GPIO.

Signed-off-by: Jani Nikula <ext-jani.1.nik...@nokia.com>
---
 arch/arm/plat-omap/gpio-switch.c              |   13 +++++++++----
 arch/arm/plat-omap/include/mach/gpio-switch.h |   11 ++++++-----
 2 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/arch/arm/plat-omap/gpio-switch.c b/arch/arm/plat-omap/gpio-switch.c
index 2b5665d..9053ea0 100644
--- a/arch/arm/plat-omap/gpio-switch.c
+++ b/arch/arm/plat-omap/gpio-switch.c
@@ -286,12 +286,17 @@ static int __init new_switch(struct gpio_switch *sw)
 
        /* input: 1, output: 0 */
        direction = !(sw->flags & OMAP_GPIO_SWITCH_FLAG_OUTPUT);
-       if (direction)
+       if (direction) {
                gpio_direction_input(sw->gpio);
-       else
-               gpio_direction_output(sw->gpio, true);
+               sw->state = gpio_sw_get_state(sw);
+       } else {
+               int state = sw->state = !!(sw->flags &
+                       OMAP_GPIO_SWITCH_FLAG_OUTPUT_INIT_ACTIVE);
 
-       sw->state = gpio_sw_get_state(sw);
+               if (sw->flags & OMAP_GPIO_SWITCH_FLAG_INVERTED)
+                       state = !state;
+               gpio_direction_output(sw->gpio, state);
+       }
 
        r = 0;
        r |= device_create_file(&sw->pdev.dev, &dev_attr_state);
diff --git a/arch/arm/plat-omap/include/mach/gpio-switch.h 
b/arch/arm/plat-omap/include/mach/gpio-switch.h
index a143253..2096780 100644
--- a/arch/arm/plat-omap/include/mach/gpio-switch.h
+++ b/arch/arm/plat-omap/include/mach/gpio-switch.h
@@ -24,11 +24,12 @@
  *     low  -> inactive
  *
  */
-#define OMAP_GPIO_SWITCH_TYPE_COVER            0x0000
-#define OMAP_GPIO_SWITCH_TYPE_CONNECTION       0x0001
-#define OMAP_GPIO_SWITCH_TYPE_ACTIVITY         0x0002
-#define OMAP_GPIO_SWITCH_FLAG_INVERTED         0x0001
-#define OMAP_GPIO_SWITCH_FLAG_OUTPUT           0x0002
+#define OMAP_GPIO_SWITCH_TYPE_COVER                    0x0000
+#define OMAP_GPIO_SWITCH_TYPE_CONNECTION               0x0001
+#define OMAP_GPIO_SWITCH_TYPE_ACTIVITY                 0x0002
+#define OMAP_GPIO_SWITCH_FLAG_INVERTED                 0x0001
+#define OMAP_GPIO_SWITCH_FLAG_OUTPUT                   0x0002
+#define OMAP_GPIO_SWITCH_FLAG_OUTPUT_INIT_ACTIVE       0x0004
 
 struct omap_gpio_switch {
        const char *name;
-- 
1.6.0.4

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to