X-Git-Url: http://pilppa.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=arch%2Farm%2Fplat-omap%2Fgpio-switch.c;h=9053ea08696d5c7c33d2ec25559abdc661f1ace5;hb=HEAD;hp=cd96c00ff4ad798b3662c3e96bc5acd6b6a2c204;hpb=5669d107117726fb431567917c2b40646dbd7fd2;p=linux-2.6-omap-h63xx.git diff --git a/arch/arm/plat-omap/gpio-switch.c b/arch/arm/plat-omap/gpio-switch.c index cd96c00ff4a..9053ea08696 100644 --- a/arch/arm/plat-omap/gpio-switch.c +++ b/arch/arm/plat-omap/gpio-switch.c @@ -19,12 +19,12 @@ #include #include #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include 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)