diff options
| -rw-r--r-- | Documentation/gpio.txt | 5 | ||||
| -rw-r--r-- | arch/arm/mach-at91/gpio.c | 3 | ||||
| -rw-r--r-- | arch/arm/mach-sa1100/generic.c | 3 | ||||
| -rw-r--r-- | arch/avr32/mach-at32ap/pio.c | 4 | ||||
| -rw-r--r-- | drivers/spi/atmel_spi.c | 2 | ||||
| -rw-r--r-- | include/asm-arm/arch-at91/gpio.h | 2 | ||||
| -rw-r--r-- | include/asm-arm/arch-omap/gpio.h | 3 | ||||
| -rw-r--r-- | include/asm-arm/arch-pxa/gpio.h | 4 | ||||
| -rw-r--r-- | include/asm-arm/arch-s3c2410/gpio.h | 4 | ||||
| -rw-r--r-- | include/asm-arm/arch-sa1100/gpio.h | 2 | ||||
| -rw-r--r-- | include/asm-avr32/arch-at32ap/gpio.h | 2 |
11 files changed, 22 insertions, 12 deletions
diff --git a/Documentation/gpio.txt b/Documentation/gpio.txt index 576ce463cf..989f1130f4 100644 --- a/Documentation/gpio.txt +++ b/Documentation/gpio.txt | |||
| @@ -105,12 +105,15 @@ setting up a platform_device using the GPIO, is mark its direction: | |||
| 105 | 105 | ||
| 106 | /* set as input or output, returning 0 or negative errno */ | 106 | /* set as input or output, returning 0 or negative errno */ |
| 107 | int gpio_direction_input(unsigned gpio); | 107 | int gpio_direction_input(unsigned gpio); |
| 108 | int gpio_direction_output(unsigned gpio); | 108 | int gpio_direction_output(unsigned gpio, int value); |
| 109 | 109 | ||
| 110 | The return value is zero for success, else a negative errno. It should | 110 | The return value is zero for success, else a negative errno. It should |
| 111 | be checked, since the get/set calls don't have error returns and since | 111 | be checked, since the get/set calls don't have error returns and since |
| 112 | misconfiguration is possible. (These calls could sleep.) | 112 | misconfiguration is possible. (These calls could sleep.) |
| 113 | 113 | ||
| 114 | For output GPIOs, the value provided becomes the initial output value. | ||
| 115 | This helps avoid signal glitching during system startup. | ||
| 116 | |||
| 114 | Setting the direction can fail if the GPIO number is invalid, or when | 117 | Setting the direction can fail if the GPIO number is invalid, or when |
| 115 | that particular GPIO can't be used in that mode. It's generally a bad | 118 | that particular GPIO can't be used in that mode. It's generally a bad |
| 116 | idea to rely on boot firmware to have set the direction correctly, since | 119 | idea to rely on boot firmware to have set the direction correctly, since |
diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c index 44211a0af1..ba4a1bb3ee 100644 --- a/arch/arm/mach-at91/gpio.c +++ b/arch/arm/mach-at91/gpio.c | |||
| @@ -215,13 +215,14 @@ int gpio_direction_input(unsigned pin) | |||
| 215 | } | 215 | } |
| 216 | EXPORT_SYMBOL(gpio_direction_input); | 216 | EXPORT_SYMBOL(gpio_direction_input); |
| 217 | 217 | ||
| 218 | int gpio_direction_output(unsigned pin) | 218 | int gpio_direction_output(unsigned pin, int value) |
| 219 | { | 219 | { |
| 220 | void __iomem *pio = pin_to_controller(pin); | 220 | void __iomem *pio = pin_to_controller(pin); |
| 221 | unsigned mask = pin_to_mask(pin); | 221 | unsigned mask = pin_to_mask(pin); |
| 222 | 222 | ||
| 223 | if (!pio || !(__raw_readl(pio + PIO_PSR) & mask)) | 223 | if (!pio || !(__raw_readl(pio + PIO_PSR) & mask)) |
| 224 | return -EINVAL; | 224 | return -EINVAL; |
| 225 | __raw_writel(mask, pio + (value ? PIO_SODR : PIO_CODR)); | ||
| 225 | __raw_writel(mask, pio + PIO_OER); | 226 | __raw_writel(mask, pio + PIO_OER); |
| 226 | return 0; | 227 | return 0; |
| 227 | } | 228 | } |
diff --git a/arch/arm/mach-sa1100/generic.c b/arch/arm/mach-sa1100/generic.c index 192a5a26cf..edc349e5fc 100644 --- a/arch/arm/mach-sa1100/generic.c +++ b/arch/arm/mach-sa1100/generic.c | |||
| @@ -153,7 +153,7 @@ int gpio_direction_input(unsigned gpio) | |||
| 153 | 153 | ||
| 154 | EXPORT_SYMBOL(gpio_direction_input); | 154 | EXPORT_SYMBOL(gpio_direction_input); |
| 155 | 155 | ||
| 156 | int gpio_direction_output(unsigned gpio) | 156 | int gpio_direction_output(unsigned gpio, int value) |
| 157 | { | 157 | { |
| 158 | unsigned long flags; | 158 | unsigned long flags; |
| 159 | 159 | ||
| @@ -161,6 +161,7 @@ int gpio_direction_output(unsigned gpio) | |||
| 161 | return -EINVAL; | 161 | return -EINVAL; |
| 162 | 162 | ||
| 163 | local_irq_save(flags); | 163 | local_irq_save(flags); |
| 164 | gpio_set_value(gpio, value); | ||
| 164 | GPDR |= GPIO_GPIO(gpio); | 165 | GPDR |= GPIO_GPIO(gpio); |
| 165 | local_irq_restore(flags); | 166 | local_irq_restore(flags); |
| 166 | return 0; | 167 | return 0; |
diff --git a/arch/avr32/mach-at32ap/pio.c b/arch/avr32/mach-at32ap/pio.c index 9ba5654cde..1eb99b814f 100644 --- a/arch/avr32/mach-at32ap/pio.c +++ b/arch/avr32/mach-at32ap/pio.c | |||
| @@ -214,7 +214,7 @@ int gpio_direction_input(unsigned int gpio) | |||
| 214 | } | 214 | } |
| 215 | EXPORT_SYMBOL(gpio_direction_input); | 215 | EXPORT_SYMBOL(gpio_direction_input); |
| 216 | 216 | ||
| 217 | int gpio_direction_output(unsigned int gpio) | 217 | int gpio_direction_output(unsigned int gpio, int value) |
| 218 | { | 218 | { |
| 219 | struct pio_device *pio; | 219 | struct pio_device *pio; |
| 220 | unsigned int pin; | 220 | unsigned int pin; |
| @@ -223,6 +223,8 @@ int gpio_direction_output(unsigned int gpio) | |||
| 223 | if (!pio) | 223 | if (!pio) |
| 224 | return -ENODEV; | 224 | return -ENODEV; |
| 225 | 225 | ||
| 226 | gpio_set_value(gpio, value); | ||
| 227 | |||
| 226 | pin = gpio & 0x1f; | 228 | pin = gpio & 0x1f; |
| 227 | pio_writel(pio, OER, 1 << pin); | 229 | pio_writel(pio, OER, 1 << pin); |
| 228 | 230 | ||
diff --git a/drivers/spi/atmel_spi.c b/drivers/spi/atmel_spi.c index 6fa260d1a9..66e7bc9857 100644 --- a/drivers/spi/atmel_spi.c +++ b/drivers/spi/atmel_spi.c | |||
| @@ -425,7 +425,7 @@ static int atmel_spi_setup(struct spi_device *spi) | |||
| 425 | if (ret) | 425 | if (ret) |
| 426 | return ret; | 426 | return ret; |
| 427 | spi->controller_state = (void *)npcs_pin; | 427 | spi->controller_state = (void *)npcs_pin; |
| 428 | gpio_direction_output(npcs_pin); | 428 | gpio_direction_output(npcs_pin, !(spi->mode & SPI_CS_HIGH)); |
| 429 | } | 429 | } |
| 430 | 430 | ||
| 431 | dev_dbg(&spi->dev, | 431 | dev_dbg(&spi->dev, |
diff --git a/include/asm-arm/arch-at91/gpio.h b/include/asm-arm/arch-at91/gpio.h index 98ad2114f4..0a241e2fb6 100644 --- a/include/asm-arm/arch-at91/gpio.h +++ b/include/asm-arm/arch-at91/gpio.h | |||
| @@ -223,7 +223,7 @@ static inline void gpio_free(unsigned gpio) | |||
| 223 | } | 223 | } |
| 224 | 224 | ||
| 225 | extern int gpio_direction_input(unsigned gpio); | 225 | extern int gpio_direction_input(unsigned gpio); |
| 226 | extern int gpio_direction_output(unsigned gpio); | 226 | extern int gpio_direction_output(unsigned gpio, int value); |
| 227 | 227 | ||
| 228 | static inline int gpio_get_value(unsigned gpio) | 228 | static inline int gpio_get_value(unsigned gpio) |
| 229 | { | 229 | { |
diff --git a/include/asm-arm/arch-omap/gpio.h b/include/asm-arm/arch-omap/gpio.h index 3762a6ae6a..590917efc9 100644 --- a/include/asm-arm/arch-omap/gpio.h +++ b/include/asm-arm/arch-omap/gpio.h | |||
| @@ -113,8 +113,9 @@ static inline int gpio_direction_input(unsigned gpio) | |||
| 113 | return __gpio_set_direction(gpio, 1); | 113 | return __gpio_set_direction(gpio, 1); |
| 114 | } | 114 | } |
| 115 | 115 | ||
| 116 | static inline int gpio_direction_output(unsigned gpio) | 116 | static inline int gpio_direction_output(unsigned gpio, int value) |
| 117 | { | 117 | { |
| 118 | omap_set_gpio_dataout(gpio, value); | ||
| 118 | return __gpio_set_direction(gpio, 0); | 119 | return __gpio_set_direction(gpio, 0); |
| 119 | } | 120 | } |
| 120 | 121 | ||
diff --git a/include/asm-arm/arch-pxa/gpio.h b/include/asm-arm/arch-pxa/gpio.h index 3d348a3511..aeba24347f 100644 --- a/include/asm-arm/arch-pxa/gpio.h +++ b/include/asm-arm/arch-pxa/gpio.h | |||
| @@ -43,9 +43,9 @@ static inline int gpio_direction_input(unsigned gpio) | |||
| 43 | return pxa_gpio_mode(gpio | GPIO_IN); | 43 | return pxa_gpio_mode(gpio | GPIO_IN); |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | static inline int gpio_direction_output(unsigned gpio) | 46 | static inline int gpio_direction_output(unsigned gpio, int value) |
| 47 | { | 47 | { |
| 48 | return pxa_gpio_mode(gpio | GPIO_OUT); | 48 | return pxa_gpio_mode(gpio | GPIO_OUT | (value ? 0 : GPIO_DFLT_LOW)); |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | static inline int __gpio_get_value(unsigned gpio) | 51 | static inline int __gpio_get_value(unsigned gpio) |
diff --git a/include/asm-arm/arch-s3c2410/gpio.h b/include/asm-arm/arch-s3c2410/gpio.h index d47ae453f8..7583895fd3 100644 --- a/include/asm-arm/arch-s3c2410/gpio.h +++ b/include/asm-arm/arch-s3c2410/gpio.h | |||
| @@ -44,9 +44,11 @@ static inline int gpio_direction_input(unsigned gpio) | |||
| 44 | return 0; | 44 | return 0; |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | static inline int gpio_direction_output(unsigned gpio) | 47 | static inline int gpio_direction_output(unsigned gpio, int value) |
| 48 | { | 48 | { |
| 49 | s3c2410_gpio_cfgpin(gpio, S3C2410_GPIO_OUTPUT); | 49 | s3c2410_gpio_cfgpin(gpio, S3C2410_GPIO_OUTPUT); |
| 50 | /* REVISIT can we write the value first, to avoid glitching? */ | ||
| 51 | s3c2410_gpio_setpin(gpio, value); | ||
| 50 | return 0; | 52 | return 0; |
| 51 | } | 53 | } |
| 52 | 54 | ||
diff --git a/include/asm-arm/arch-sa1100/gpio.h b/include/asm-arm/arch-sa1100/gpio.h index da7575b0e5..e7a9d26e22 100644 --- a/include/asm-arm/arch-sa1100/gpio.h +++ b/include/asm-arm/arch-sa1100/gpio.h | |||
| @@ -38,7 +38,7 @@ static inline void gpio_free(unsigned gpio) | |||
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | extern int gpio_direction_input(unsigned gpio); | 40 | extern int gpio_direction_input(unsigned gpio); |
| 41 | extern int gpio_direction_output(unsigned gpio); | 41 | extern int gpio_direction_output(unsigned gpio, int value); |
| 42 | 42 | ||
| 43 | 43 | ||
| 44 | static inline int gpio_get_value(unsigned gpio) | 44 | static inline int gpio_get_value(unsigned gpio) |
diff --git a/include/asm-avr32/arch-at32ap/gpio.h b/include/asm-avr32/arch-at32ap/gpio.h index fcb756bdaa..80a21aa9ae 100644 --- a/include/asm-avr32/arch-at32ap/gpio.h +++ b/include/asm-avr32/arch-at32ap/gpio.h | |||
| @@ -10,7 +10,7 @@ int __must_check gpio_request(unsigned int gpio, const char *label); | |||
| 10 | void gpio_free(unsigned int gpio); | 10 | void gpio_free(unsigned int gpio); |
| 11 | 11 | ||
| 12 | int gpio_direction_input(unsigned int gpio); | 12 | int gpio_direction_input(unsigned int gpio); |
| 13 | int gpio_direction_output(unsigned int gpio); | 13 | int gpio_direction_output(unsigned int gpio, int value); |
| 14 | int gpio_get_value(unsigned int gpio); | 14 | int gpio_get_value(unsigned int gpio); |
| 15 | void gpio_set_value(unsigned int gpio, int value); | 15 | void gpio_set_value(unsigned int gpio, int value); |
| 16 | 16 | ||
