aboutsummaryrefslogtreecommitdiffstats
path: root/Documentation/gpio/driver.txt
diff options
context:
space:
mode:
authorLinus Walleij <linus.walleij@linaro.org>2014-01-22 09:00:55 -0500
committerLinus Walleij <linus.walleij@linaro.org>2014-02-03 03:11:57 -0500
commit99adc0594864ebbae4478c5d85d84930894ea098 (patch)
treeeb1a1b0a008a384da7febb03247b92fde8191418 /Documentation/gpio/driver.txt
parent38dbfb59d1175ef458d006556061adeaa8751b72 (diff)
gpio: document how to make combined GPIO+irqchip drivers
Write a few words on how GPIO drivers supplying an irqchip should be written. Cc: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'Documentation/gpio/driver.txt')
-rw-r--r--Documentation/gpio/driver.txt35
1 files changed, 35 insertions, 0 deletions
diff --git a/Documentation/gpio/driver.txt b/Documentation/gpio/driver.txt
index 9da0bfa74781..f73cc7b5dc85 100644
--- a/Documentation/gpio/driver.txt
+++ b/Documentation/gpio/driver.txt
@@ -62,6 +62,37 @@ Any debugfs dump method should normally ignore signals which haven't been
62requested as GPIOs. They can use gpiochip_is_requested(), which returns either 62requested as GPIOs. They can use gpiochip_is_requested(), which returns either
63NULL or the label associated with that GPIO when it was requested. 63NULL or the label associated with that GPIO when it was requested.
64 64
65
66GPIO drivers providing IRQs
67---------------------------
68It is custom that GPIO drivers (GPIO chips) are also providing interrupts,
69most often cascaded off a parent interrupt controller, and in some special
70cases the GPIO logic is melded with a SoC's primary interrupt controller.
71
72The IRQ portions of the GPIO block are implemented using an irqchip, using
73the header <linux/irq.h>. So basically such a driver is utilizing two sub-
74systems simultaneously: gpio and irq.
75
76It is legal for any IRQ consumer to request an IRQ from any irqchip no matter
77if that is a combined GPIO+IRQ driver. The basic premise is that gpio_chip and
78irq_chip are orthogonal, and offering their services independent of each
79other.
80
81gpiod_to_irq() is just a convenience function to figure out the IRQ for a
82certain GPIO line and should not be relied upon to have been called before
83the IRQ is used.
84
85So always prepare the hardware and make it ready for action in respective
86callbacks from the GPIO and irqchip APIs. Do not rely on gpiod_to_irq() having
87been called first.
88
89This orthogonality leads to ambiguities that we need to solve: if there is
90competition inside the subsystem which side is using the resource (a certain
91GPIO line and register for example) it needs to deny certain operations and
92keep track of usage inside of the gpiolib subsystem. This is why the API
93below exists.
94
95
65Locking IRQ usage 96Locking IRQ usage
66----------------- 97-----------------
67Input GPIOs can be used as IRQ signals. When this happens, a driver is requested 98Input GPIOs can be used as IRQ signals. When this happens, a driver is requested
@@ -73,3 +104,7 @@ This will prevent the use of non-irq related GPIO APIs until the GPIO IRQ lock
73is released: 104is released:
74 105
75 void gpiod_unlock_as_irq(struct gpio_desc *desc) 106 void gpiod_unlock_as_irq(struct gpio_desc *desc)
107
108When implementing an irqchip inside a GPIO driver, these two functions should
109typically be called in the .startup() and .shutdown() callbacks from the
110irqchip.