diff options
-rw-r--r-- | Documentation/gpio.txt | 35 | ||||
-rw-r--r-- | drivers/gpio/gpiolib.c | 12 |
2 files changed, 35 insertions, 12 deletions
diff --git a/Documentation/gpio.txt b/Documentation/gpio.txt index c2c6e9b39bbe..d96a6dba5748 100644 --- a/Documentation/gpio.txt +++ b/Documentation/gpio.txt | |||
@@ -158,10 +158,11 @@ and configure pullups/pulldowns appropriately.) | |||
158 | Spinlock-Safe GPIO access | 158 | Spinlock-Safe GPIO access |
159 | ------------------------- | 159 | ------------------------- |
160 | Most GPIO controllers can be accessed with memory read/write instructions. | 160 | Most GPIO controllers can be accessed with memory read/write instructions. |
161 | That doesn't need to sleep, and can safely be done from inside IRQ handlers. | 161 | Those don't need to sleep, and can safely be done from inside hard |
162 | (That includes hardirq contexts on RT kernels.) | 162 | (nonthreaded) IRQ handlers and similar contexts. |
163 | 163 | ||
164 | Use these calls to access such GPIOs: | 164 | Use the following calls to access such GPIOs, |
165 | for which gpio_cansleep() will always return false (see below): | ||
165 | 166 | ||
166 | /* GPIO INPUT: return zero or nonzero */ | 167 | /* GPIO INPUT: return zero or nonzero */ |
167 | int gpio_get_value(unsigned gpio); | 168 | int gpio_get_value(unsigned gpio); |
@@ -210,9 +211,31 @@ To access such GPIOs, a different set of accessors is defined: | |||
210 | /* GPIO OUTPUT, might sleep */ | 211 | /* GPIO OUTPUT, might sleep */ |
211 | void gpio_set_value_cansleep(unsigned gpio, int value); | 212 | void gpio_set_value_cansleep(unsigned gpio, int value); |
212 | 213 | ||
213 | Other than the fact that these calls might sleep, and will not be ignored | 214 | |
214 | for GPIOs that can't be accessed from IRQ handlers, these calls act the | 215 | Accessing such GPIOs requires a context which may sleep, for example |
215 | same as the spinlock-safe calls. | 216 | a threaded IRQ handler, and those accessors must be used instead of |
217 | spinlock-safe accessors without the cansleep() name suffix. | ||
218 | |||
219 | Other than the fact that these accessors might sleep, and will work | ||
220 | on GPIOs that can't be accessed from hardIRQ handlers, these calls act | ||
221 | the same as the spinlock-safe calls. | ||
222 | |||
223 | ** IN ADDITION ** calls to setup and configure such GPIOs must be made | ||
224 | from contexts which may sleep, since they may need to access the GPIO | ||
225 | controller chip too: (These setup calls are usually made from board | ||
226 | setup or driver probe/teardown code, so this is an easy constraint.) | ||
227 | |||
228 | gpio_direction_input() | ||
229 | gpio_direction_output() | ||
230 | gpio_request() | ||
231 | |||
232 | ## gpio_request_one() | ||
233 | ## gpio_request_array() | ||
234 | ## gpio_free_array() | ||
235 | |||
236 | gpio_free() | ||
237 | gpio_set_debounce() | ||
238 | |||
216 | 239 | ||
217 | 240 | ||
218 | Claiming and Releasing GPIOs | 241 | Claiming and Releasing GPIOs |
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 6a6bd569e1f8..1a8c18cbf201 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c | |||
@@ -1272,7 +1272,7 @@ void gpio_free(unsigned gpio) | |||
1272 | if (chip && test_bit(FLAG_REQUESTED, &desc->flags)) { | 1272 | if (chip && test_bit(FLAG_REQUESTED, &desc->flags)) { |
1273 | if (chip->free) { | 1273 | if (chip->free) { |
1274 | spin_unlock_irqrestore(&gpio_lock, flags); | 1274 | spin_unlock_irqrestore(&gpio_lock, flags); |
1275 | might_sleep_if(extra_checks && chip->can_sleep); | 1275 | might_sleep_if(chip->can_sleep); |
1276 | chip->free(chip, gpio - chip->base); | 1276 | chip->free(chip, gpio - chip->base); |
1277 | spin_lock_irqsave(&gpio_lock, flags); | 1277 | spin_lock_irqsave(&gpio_lock, flags); |
1278 | } | 1278 | } |
@@ -1410,7 +1410,7 @@ int gpio_direction_input(unsigned gpio) | |||
1410 | 1410 | ||
1411 | spin_unlock_irqrestore(&gpio_lock, flags); | 1411 | spin_unlock_irqrestore(&gpio_lock, flags); |
1412 | 1412 | ||
1413 | might_sleep_if(extra_checks && chip->can_sleep); | 1413 | might_sleep_if(chip->can_sleep); |
1414 | 1414 | ||
1415 | if (status) { | 1415 | if (status) { |
1416 | status = chip->request(chip, gpio); | 1416 | status = chip->request(chip, gpio); |
@@ -1463,7 +1463,7 @@ int gpio_direction_output(unsigned gpio, int value) | |||
1463 | 1463 | ||
1464 | spin_unlock_irqrestore(&gpio_lock, flags); | 1464 | spin_unlock_irqrestore(&gpio_lock, flags); |
1465 | 1465 | ||
1466 | might_sleep_if(extra_checks && chip->can_sleep); | 1466 | might_sleep_if(chip->can_sleep); |
1467 | 1467 | ||
1468 | if (status) { | 1468 | if (status) { |
1469 | status = chip->request(chip, gpio); | 1469 | status = chip->request(chip, gpio); |
@@ -1521,7 +1521,7 @@ int gpio_set_debounce(unsigned gpio, unsigned debounce) | |||
1521 | 1521 | ||
1522 | spin_unlock_irqrestore(&gpio_lock, flags); | 1522 | spin_unlock_irqrestore(&gpio_lock, flags); |
1523 | 1523 | ||
1524 | might_sleep_if(extra_checks && chip->can_sleep); | 1524 | might_sleep_if(chip->can_sleep); |
1525 | 1525 | ||
1526 | return chip->set_debounce(chip, gpio, debounce); | 1526 | return chip->set_debounce(chip, gpio, debounce); |
1527 | 1527 | ||
@@ -1571,7 +1571,7 @@ int __gpio_get_value(unsigned gpio) | |||
1571 | struct gpio_chip *chip; | 1571 | struct gpio_chip *chip; |
1572 | 1572 | ||
1573 | chip = gpio_to_chip(gpio); | 1573 | chip = gpio_to_chip(gpio); |
1574 | WARN_ON(extra_checks && chip->can_sleep); | 1574 | WARN_ON(chip->can_sleep); |
1575 | return chip->get ? chip->get(chip, gpio - chip->base) : 0; | 1575 | return chip->get ? chip->get(chip, gpio - chip->base) : 0; |
1576 | } | 1576 | } |
1577 | EXPORT_SYMBOL_GPL(__gpio_get_value); | 1577 | EXPORT_SYMBOL_GPL(__gpio_get_value); |
@@ -1590,7 +1590,7 @@ void __gpio_set_value(unsigned gpio, int value) | |||
1590 | struct gpio_chip *chip; | 1590 | struct gpio_chip *chip; |
1591 | 1591 | ||
1592 | chip = gpio_to_chip(gpio); | 1592 | chip = gpio_to_chip(gpio); |
1593 | WARN_ON(extra_checks && chip->can_sleep); | 1593 | WARN_ON(chip->can_sleep); |
1594 | chip->set(chip, gpio - chip->base, value); | 1594 | chip->set(chip, gpio - chip->base, value); |
1595 | } | 1595 | } |
1596 | EXPORT_SYMBOL_GPL(__gpio_set_value); | 1596 | EXPORT_SYMBOL_GPL(__gpio_set_value); |