aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/gpio.txt35
-rw-r--r--drivers/gpio/gpiolib.c12
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.)
158Spinlock-Safe GPIO access 158Spinlock-Safe GPIO access
159------------------------- 159-------------------------
160Most GPIO controllers can be accessed with memory read/write instructions. 160Most GPIO controllers can be accessed with memory read/write instructions.
161That doesn't need to sleep, and can safely be done from inside IRQ handlers. 161Those 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
164Use these calls to access such GPIOs: 164Use the following calls to access such GPIOs,
165for 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
213Other than the fact that these calls might sleep, and will not be ignored 214
214for GPIOs that can't be accessed from IRQ handlers, these calls act the 215Accessing such GPIOs requires a context which may sleep, for example
215same as the spinlock-safe calls. 216a threaded IRQ handler, and those accessors must be used instead of
217spinlock-safe accessors without the cansleep() name suffix.
218
219Other than the fact that these accessors might sleep, and will work
220on GPIOs that can't be accessed from hardIRQ handlers, these calls act
221the same as the spinlock-safe calls.
222
223 ** IN ADDITION ** calls to setup and configure such GPIOs must be made
224from contexts which may sleep, since they may need to access the GPIO
225controller chip too: (These setup calls are usually made from board
226setup 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
218Claiming and Releasing GPIOs 241Claiming 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}
1577EXPORT_SYMBOL_GPL(__gpio_get_value); 1577EXPORT_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}
1596EXPORT_SYMBOL_GPL(__gpio_set_value); 1596EXPORT_SYMBOL_GPL(__gpio_set_value);