[Blackfin] arch: Fix BUG gpio_direction_output API is not compatitable with GENERIC_G...
authorMichael Hennerich <michael.hennerich@analog.com>
Tue, 22 Jan 2008 10:36:20 +0000 (18:36 +0800)
committerBryan Wu <bryan.wu@analog.com>
Tue, 22 Jan 2008 10:36:20 +0000 (18:36 +0800)
signef-off-by: Michael Hennerich <michael.hennerich@analog.com>
Signed-off-by: Bryan Wu <bryan.wu@analog.com>
12 files changed:
arch/blackfin/kernel/bfin_gpio.c
arch/blackfin/mach-bf527/boards/ezkit.c
arch/blackfin/mach-bf537/boards/generic_board.c
arch/blackfin/mach-bf537/boards/pnav10.c
arch/blackfin/mach-bf537/boards/stamp.c
drivers/video/bf54x-lq043fb.c
include/asm-blackfin/gpio.h
include/asm-blackfin/mach-bf527/bfin_serial_5xx.h
include/asm-blackfin/mach-bf533/bfin_serial_5xx.h
include/asm-blackfin/mach-bf537/bfin_serial_5xx.h
include/asm-blackfin/mach-bf548/bfin_serial_5xx.h
include/asm-blackfin/mach-bf561/bfin_serial_5xx.h

index ffee3691028832807cc74a13d93042451182d536..7312011a4211c9655820b73d0b24a83279e87dcb 100644 (file)
@@ -229,6 +229,11 @@ inline int check_gpio(unsigned short gpio)
 }
 #endif
 
+void gpio_error(unsigned gpio)
+{
+       printk(KERN_ERR "bfin-gpio: GPIO %d wasn't requested!\n", gpio);
+}
+
 static void set_label(unsigned short ident, const char *label)
 {
 
@@ -1034,7 +1039,7 @@ EXPORT_SYMBOL(peripheral_free_list);
 * MODIFICATION HISTORY :
 **************************************************************/
 
-int gpio_request(unsigned short gpio, const char *label)
+int gpio_request(unsigned gpio, const char *label)
 {
        unsigned long flags;
 
@@ -1081,7 +1086,7 @@ int gpio_request(unsigned short gpio, const char *label)
 }
 EXPORT_SYMBOL(gpio_request);
 
-void gpio_free(unsigned short gpio)
+void gpio_free(unsigned gpio)
 {
        unsigned long flags;
 
@@ -1091,7 +1096,7 @@ void gpio_free(unsigned short gpio)
        local_irq_save(flags);
 
        if (unlikely(!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio)))) {
-               printk(KERN_ERR "bfin-gpio: GPIO %d wasn't reserved!\n", gpio);
+               gpio_error(gpio);
                dump_stack();
                local_irq_restore(flags);
                return;
@@ -1107,34 +1112,47 @@ void gpio_free(unsigned short gpio)
 }
 EXPORT_SYMBOL(gpio_free);
 
+
 #ifdef BF548_FAMILY
-void gpio_direction_input(unsigned short gpio)
+int gpio_direction_input(unsigned gpio)
 {
        unsigned long flags;
 
-       BUG_ON(!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio)));
+       if (!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio))) {
+               gpio_error(gpio);
+               return -EINVAL;
+       }
+
 
        local_irq_save(flags);
        gpio_array[gpio_bank(gpio)]->port_dir_clear = gpio_bit(gpio);
        gpio_array[gpio_bank(gpio)]->port_inen |= gpio_bit(gpio);
        local_irq_restore(flags);
+
+       return 0;
 }
 EXPORT_SYMBOL(gpio_direction_input);
 
-void gpio_direction_output(unsigned short gpio)
+int gpio_direction_output(unsigned gpio, int value)
 {
        unsigned long flags;
 
-       BUG_ON(!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio)));
+       if (!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio))) {
+               gpio_error(gpio);
+               return -EINVAL;
+       }
 
        local_irq_save(flags);
        gpio_array[gpio_bank(gpio)]->port_inen &= ~gpio_bit(gpio);
+       gpio_set_value(gpio, value);
        gpio_array[gpio_bank(gpio)]->port_dir_set = gpio_bit(gpio);
        local_irq_restore(flags);
+
+       return 0;
 }
 EXPORT_SYMBOL(gpio_direction_output);
 
-void gpio_set_value(unsigned short gpio, unsigned short arg)
+void gpio_set_value(unsigned gpio, int arg)
 {
        if (arg)
                gpio_array[gpio_bank(gpio)]->port_set = gpio_bit(gpio);
@@ -1144,7 +1162,7 @@ void gpio_set_value(unsigned short gpio, unsigned short arg)
 }
 EXPORT_SYMBOL(gpio_set_value);
 
-unsigned short gpio_get_value(unsigned short gpio)
+int gpio_get_value(unsigned gpio)
 {
        return (1 & (gpio_array[gpio_bank(gpio)]->port_data >> gpio_sub_n(gpio)));
 }
@@ -1152,31 +1170,42 @@ EXPORT_SYMBOL(gpio_get_value);
 
 #else
 
-void gpio_direction_input(unsigned short gpio)
+int gpio_direction_input(unsigned gpio)
 {
        unsigned long flags;
 
-       BUG_ON(!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio)));
+       if (!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio))) {
+               gpio_error(gpio);
+               return -EINVAL;
+       }
 
        local_irq_save(flags);
        gpio_bankb[gpio_bank(gpio)]->dir &= ~gpio_bit(gpio);
        gpio_bankb[gpio_bank(gpio)]->inen |= gpio_bit(gpio);
        AWA_DUMMY_READ(inen);
        local_irq_restore(flags);
+
+       return 0;
 }
 EXPORT_SYMBOL(gpio_direction_input);
 
-void gpio_direction_output(unsigned short gpio)
+int gpio_direction_output(unsigned gpio, int value)
 {
        unsigned long flags;
 
-       BUG_ON(!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio)));
+       if (!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio))) {
+               gpio_error(gpio);
+               return -EINVAL;
+       }
 
        local_irq_save(flags);
        gpio_bankb[gpio_bank(gpio)]->inen &= ~gpio_bit(gpio);
+       gpio_set_value(gpio, value);
        gpio_bankb[gpio_bank(gpio)]->dir |= gpio_bit(gpio);
        AWA_DUMMY_READ(dir);
        local_irq_restore(flags);
+
+       return 0;
 }
 EXPORT_SYMBOL(gpio_direction_output);
 
index bc256811a5e37573a1f86df4a7df4522a312735b..6d70aae4cc9b2e12af8c95d6eddc14c519adff6e 100644 (file)
@@ -317,12 +317,7 @@ static struct resource sl811_hcd_resources[] = {
 void sl811_port_power(struct device *dev, int is_on)
 {
        gpio_request(CONFIG_USB_SL811_BFIN_GPIO_VBUS, "usb:SL811_VBUS");
-       gpio_direction_output(CONFIG_USB_SL811_BFIN_GPIO_VBUS);
-
-       if (is_on)
-               gpio_set_value(CONFIG_USB_SL811_BFIN_GPIO_VBUS, 1);
-       else
-               gpio_set_value(CONFIG_USB_SL811_BFIN_GPIO_VBUS, 0);
+       gpio_direction_output(CONFIG_USB_SL811_BFIN_GPIO_VBUS, is_on);
 }
 #endif
 
index 1c97219a2ab535cccb8d2d31137d23bec9625f44..3225b15883989031342d8e955fbac345c8266b9c 100644 (file)
@@ -205,12 +205,8 @@ static struct resource sl811_hcd_resources[] = {
 void sl811_port_power(struct device *dev, int is_on)
 {
        gpio_request(CONFIG_USB_SL811_BFIN_GPIO_VBUS, "usb:SL811_VBUS");
-       gpio_direction_output(CONFIG_USB_SL811_BFIN_GPIO_VBUS);
+       gpio_direction_output(CONFIG_USB_SL811_BFIN_GPIO_VBUS, is_on);
 
-       if (is_on)
-               gpio_set_value(CONFIG_USB_SL811_BFIN_GPIO_VBUS, 1);
-       else
-               gpio_set_value(CONFIG_USB_SL811_BFIN_GPIO_VBUS, 0);
 }
 #endif
 
index 23e10c7dab5b292987912d65f1a20d0eabb5a37c..4c4870590bd868d4f9b9151ae912264ed7dce58a 100644 (file)
@@ -134,12 +134,8 @@ static struct resource sl811_hcd_resources[] = {
 void sl811_port_power(struct device *dev, int is_on)
 {
        gpio_request(CONFIG_USB_SL811_BFIN_GPIO_VBUS, "usb:SL811_VBUS");
-       gpio_direction_output(CONFIG_USB_SL811_BFIN_GPIO_VBUS);
+       gpio_direction_output(CONFIG_USB_SL811_BFIN_GPIO_VBUS, is_on);
 
-       if (is_on)
-               gpio_set_value(CONFIG_USB_SL811_BFIN_GPIO_VBUS, 1);
-       else
-               gpio_set_value(CONFIG_USB_SL811_BFIN_GPIO_VBUS, 0);
 }
 #endif
 
index 3e0ad04d8d75f5b2b62dbd63c596a17f8a61da13..37759ac7df2a7cc36c61c5b7dad228b43a25b1ef 100644 (file)
@@ -250,12 +250,7 @@ static struct resource sl811_hcd_resources[] = {
 void sl811_port_power(struct device *dev, int is_on)
 {
        gpio_request(CONFIG_USB_SL811_BFIN_GPIO_VBUS, "usb:SL811_VBUS");
-       gpio_direction_output(CONFIG_USB_SL811_BFIN_GPIO_VBUS);
-
-       if (is_on)
-               gpio_set_value(CONFIG_USB_SL811_BFIN_GPIO_VBUS, 1);
-       else
-               gpio_set_value(CONFIG_USB_SL811_BFIN_GPIO_VBUS, 0);
+       gpio_direction_output(CONFIG_USB_SL811_BFIN_GPIO_VBUS, is_on);
 }
 #endif
 
index 1b7e54de0d7632048d6a871252ad0f616c46143b..c8e7427a0bc8732a18122a16e966236ebff4895a 100644 (file)
@@ -264,8 +264,7 @@ static int request_ports(struct bfin_bf54xfb_info *fbi)
                }
        }
 
-       gpio_direction_output(disp);
-       gpio_set_value(disp, 1);
+       gpio_direction_output(disp, 1);
 
        return 0;
 }
index 33ce98ef7e0f6cc8c7cea119e3b59baa8581603c..7bba9b17654e22832bf3cb12d73ffcd2adcbf730 100644 (file)
@@ -426,19 +426,19 @@ struct gpio_port_s {
 * MODIFICATION HISTORY :
 **************************************************************/
 
-int gpio_request(unsigned short, const char *);
-void gpio_free(unsigned short);
+int gpio_request(unsigned, const char *);
+void gpio_free(unsigned);
 
-void gpio_set_value(unsigned short gpio, unsigned short arg);
-unsigned short gpio_get_value(unsigned short gpio);
+void gpio_set_value(unsigned gpio, int arg);
+int gpio_get_value(unsigned gpio);
 
 #ifndef BF548_FAMILY
 #define gpio_get_value(gpio)           get_gpio_data(gpio)
 #define gpio_set_value(gpio, value)    set_gpio_data(gpio, value)
 #endif
 
-void gpio_direction_input(unsigned short gpio);
-void gpio_direction_output(unsigned short gpio);
+int gpio_direction_input(unsigned gpio);
+int gpio_direction_output(unsigned gpio, int value);
 
 #include <asm-generic/gpio.h>          /* cansleep wrappers */
 #include <asm/irq.h>
index 0b867e6a76c474ff54931a764c9438599913c9d3..15dbc21eed8bd30c34da9f747ccf88bc1f92b347 100644 (file)
@@ -146,7 +146,7 @@ static void bfin_serial_hw_init(struct bfin_serial_port *uart)
 
        if (uart->rts_pin >= 0) {
                gpio_request(uart->rts_pin, DRIVER_NAME);
-               gpio_direction_output(uart->rts_pin);
+               gpio_direction_output(uart->rts_pin, 0);
        }
 #endif
 }
index 69b9f8e120e93402b5cae571f2e8dfdd26084e49..7871d4313f49b3d7751c4cbe779d5fa321ea789c 100644 (file)
@@ -111,7 +111,7 @@ static void bfin_serial_hw_init(struct bfin_serial_port *uart)
        }
        if (uart->rts_pin >= 0) {
                gpio_request(uart->rts_pin, DRIVER_NAME);
-               gpio_direction_input(uart->rts_pin);
+               gpio_direction_input(uart->rts_pin, 0);
        }
 #endif
 }
index 6fb328f5186a25dd759e35e944576ab434306f55..86e45c3798389270f6feb33cfb40205ced3afc52 100644 (file)
@@ -146,7 +146,7 @@ static void bfin_serial_hw_init(struct bfin_serial_port *uart)
 
        if (uart->rts_pin >= 0) {
                gpio_request(uart->rts_pin, DRIVER_NAME);
-               gpio_direction_output(uart->rts_pin);
+               gpio_direction_output(uart->rts_pin, 0);
        }
 #endif
 }
index f21a1620e6bd931f57bc4ed08e48e02fcb2f0755..3770aa38ee9f9f6b039316ca1714997e431933d3 100644 (file)
@@ -186,7 +186,7 @@ static void bfin_serial_hw_init(struct bfin_serial_port *uart)
 
        if (uart->rts_pin >= 0) {
                gpio_request(uart->rts_pin, DRIVER_NAME);
-               gpio_direction_output(uart->rts_pin);
+               gpio_direction_output(uart->rts_pin, 0);
        }
 #endif
 }
index 69b9f8e120e93402b5cae571f2e8dfdd26084e49..7871d4313f49b3d7751c4cbe779d5fa321ea789c 100644 (file)
@@ -111,7 +111,7 @@ static void bfin_serial_hw_init(struct bfin_serial_port *uart)
        }
        if (uart->rts_pin >= 0) {
                gpio_request(uart->rts_pin, DRIVER_NAME);
-               gpio_direction_input(uart->rts_pin);
+               gpio_direction_input(uart->rts_pin, 0);
        }
 #endif
 }