]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/arm/plat-omap/gpio-switch.c
ARM: OMAP: Partial revert for EAC IO address changes
[linux-2.6-omap-h63xx.git] / arch / arm / plat-omap / gpio-switch.c
index cd96c00ff4ad798b3662c3e96bc5acd6b6a2c204..9053ea08696d5c7c33d2ec25559abdc661f1ace5 100644 (file)
 #include <linux/platform_device.h>
 #include <linux/timer.h>
 #include <linux/err.h>
-#include <asm/arch/hardware.h>
-#include <asm/arch/gpio.h>
-#include <asm/arch/irqs.h>
-#include <asm/arch/mux.h>
-#include <asm/arch/board.h>
-#include <asm/arch/gpio-switch.h>
+#include <linux/gpio.h>
+#include <mach/hardware.h>
+#include <mach/irqs.h>
+#include <mach/mux.h>
+#include <mach/board.h>
+#include <mach/gpio-switch.h>
 
 struct gpio_switch {
        char            name[14];
@@ -106,7 +106,7 @@ static int gpio_sw_get_state(struct gpio_switch *sw)
 {
        int state;
 
-       state = omap_get_gpio_datain(sw->gpio);
+       state = gpio_get_value(sw->gpio);
        if (sw->flags & OMAP_GPIO_SWITCH_FLAG_INVERTED)
                state = !state;
 
@@ -131,14 +131,15 @@ static ssize_t gpio_sw_state_store(struct device *dev,
 
        str = get_sw_str(sw);
        if (strcmp(state, str[0]) == 0)
-               enable = 0;
+               sw->state = enable = 0;
        else if (strcmp(state, str[1]) == 0)
-               enable = 1;
+               sw->state = enable = 1;
        else
                return -EINVAL;
+
        if (sw->flags & OMAP_GPIO_SWITCH_FLAG_INVERTED)
                enable = !enable;
-       omap_set_gpio_dataout(sw->gpio, enable);
+       gpio_set_value(sw->gpio, enable);
 
        return count;
 }
@@ -189,10 +190,10 @@ static irqreturn_t gpio_sw_irq_handler(int irq, void *arg)
        int state;
 
        if (!sw->both_edges) {
-               if (omap_get_gpio_datain(sw->gpio))
-                       set_irq_type(OMAP_GPIO_IRQ(sw->gpio), IRQT_FALLING);
+               if (gpio_get_value(sw->gpio))
+                       set_irq_type(gpio_to_irq(sw->gpio), IRQ_TYPE_EDGE_FALLING);
                else
-                       set_irq_type(OMAP_GPIO_IRQ(sw->gpio), IRQT_RISING);
+                       set_irq_type(gpio_to_irq(sw->gpio), IRQ_TYPE_EDGE_RISING);
        }
 
        state = gpio_sw_get_state(sw);
@@ -277,7 +278,7 @@ static int __init new_switch(struct gpio_switch *sw)
        }
        dev_set_drvdata(&sw->pdev.dev, sw);
 
-       r = omap_request_gpio(sw->gpio);
+       r = gpio_request(sw->gpio, sw->name);
        if (r < 0) {
                platform_device_unregister(&sw->pdev);
                return r;
@@ -285,9 +286,17 @@ static int __init new_switch(struct gpio_switch *sw)
 
        /* input: 1, output: 0 */
        direction = !(sw->flags & OMAP_GPIO_SWITCH_FLAG_OUTPUT);
-       omap_set_gpio_direction(sw->gpio, direction);
+       if (direction) {
+               gpio_direction_input(sw->gpio);
+               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);
@@ -304,18 +313,18 @@ static int __init new_switch(struct gpio_switch *sw)
                trigger = IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING;
                sw->both_edges = 1;
        } else {
-               if (omap_get_gpio_datain(sw->gpio))
+               if (gpio_get_value(sw->gpio))
                        trigger = IRQF_TRIGGER_FALLING;
                else
                        trigger = IRQF_TRIGGER_RISING;
        }
-       r = request_irq(OMAP_GPIO_IRQ(sw->gpio), gpio_sw_irq_handler,
+       r = request_irq(gpio_to_irq(sw->gpio), gpio_sw_irq_handler,
                        IRQF_SHARED | trigger, sw->name, sw);
        if (r < 0) {
                printk(KERN_ERR "gpio-switch: request_irq() failed "
                       "for GPIO %d\n", sw->gpio);
                platform_device_unregister(&sw->pdev);
-               omap_free_gpio(sw->gpio);
+               gpio_free(sw->gpio);
                return r;
        }
 
@@ -444,14 +453,14 @@ static void gpio_sw_cleanup(void)
                flush_scheduled_work();
                del_timer_sync(&sw->timer);
 
-               free_irq(OMAP_GPIO_IRQ(sw->gpio), sw);
+               free_irq(gpio_to_irq(sw->gpio), sw);
 
                device_remove_file(&sw->pdev.dev, &dev_attr_state);
                device_remove_file(&sw->pdev.dev, &dev_attr_type);
                device_remove_file(&sw->pdev.dev, &dev_attr_direction);
 
                platform_device_unregister(&sw->pdev);
-               omap_free_gpio(sw->gpio);
+               gpio_free(sw->gpio);
                old = sw;
        }
        kfree(old);
@@ -464,7 +473,7 @@ static void __init report_initial_state(void)
        list_for_each_entry(sw, &gpio_switches, node) {
                int state;
 
-               state = omap_get_gpio_datain(sw->gpio);
+               state = gpio_get_value(sw->gpio);
                if (sw->flags & OMAP_GPIO_SWITCH_FLAG_INVERTED)
                        state = !state;
                if (sw->notify != NULL)