brcm63xx: implement gpio_to_irq for bcm63xx-gpio
Add support for mapping some GPIO lines to IRQs. GPIO to IRQ mappings were found out through experimentation, helped by having the GPIO as output still toggling the IRQ input. Based-on: http://patchwork.ozlabs.org/patch/660534/ Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
This commit is contained in:
parent
94bbd1f057
commit
dd7079e79a
8 changed files with 53 additions and 1 deletions
|
@ -65,6 +65,10 @@
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
|
|
||||||
ngpios = <18>;
|
ngpios = <18>;
|
||||||
|
|
||||||
|
interrupt-parent = <&ext_intc>;
|
||||||
|
interrupts = <0 0>, <1 0>;
|
||||||
|
interrupt-names = "gpio1", "gpio2";
|
||||||
};
|
};
|
||||||
|
|
||||||
gpio0: gpio-controller@10000084 {
|
gpio0: gpio-controller@10000084 {
|
||||||
|
|
|
@ -72,6 +72,10 @@
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
|
|
||||||
ngpios = <20>;
|
ngpios = <20>;
|
||||||
|
|
||||||
|
interrupt-parent = <&periph_intc>;
|
||||||
|
interrupts = <0 0>, <1 0>, <2 0>, <3 0>;
|
||||||
|
interrupt-names = "gpio0", "gpio1", "gpio2", "gpio3";
|
||||||
};
|
};
|
||||||
|
|
||||||
gpio0: gpio-controller@100000c4 {
|
gpio0: gpio-controller@100000c4 {
|
||||||
|
|
|
@ -62,6 +62,11 @@
|
||||||
|
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
|
|
||||||
|
interrupt-parent = <&ext_intc>;
|
||||||
|
interrupts = <3 0>, <2 0>, <0 0>, <1 0>;
|
||||||
|
interrupt-names = "gpio12", "gpio15",
|
||||||
|
"gpio23", "gpio24";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -78,6 +78,10 @@
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
|
|
||||||
ngpios = <5>;
|
ngpios = <5>;
|
||||||
|
|
||||||
|
interrupt-parent = <&ext_intc>;
|
||||||
|
interrupts = <0 0>, <1 0>, <2 0>, <3 0>;
|
||||||
|
interrupt-names = "gpio0", "gpio1", "gpio2", "gpio3";
|
||||||
};
|
};
|
||||||
|
|
||||||
gpio0: gpio-controller@fffe0404 {
|
gpio0: gpio-controller@fffe0404 {
|
||||||
|
|
|
@ -94,6 +94,15 @@
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
|
|
||||||
ngpios = <8>;
|
ngpios = <8>;
|
||||||
|
|
||||||
|
interrupts-extended = <&ext_intc1 0 0>,
|
||||||
|
<&ext_intc1 1 0>,
|
||||||
|
<&ext_intc0 0 0>,
|
||||||
|
<&ext_intc0 1 0>,
|
||||||
|
<&ext_intc0 2 0>,
|
||||||
|
<&ext_intc0 3 0>;
|
||||||
|
interrupt-names = "gpio0", "gpio1", "gpio2", "gpio3",
|
||||||
|
"gpio4", "gpio5";
|
||||||
};
|
};
|
||||||
|
|
||||||
gpio0: gpio-controller@fffe0084 {
|
gpio0: gpio-controller@fffe0084 {
|
||||||
|
|
|
@ -80,6 +80,11 @@
|
||||||
|
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
|
|
||||||
|
interrupt-parent = <&ext_intc>;
|
||||||
|
interrupts = <0 0>, <1 0>, <2 0>, <3 0>;
|
||||||
|
interrupt-names = "gpio24", "gpio25",
|
||||||
|
"gpio26", "gpio27";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -84,6 +84,15 @@
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
|
|
||||||
ngpios = <6>;
|
ngpios = <6>;
|
||||||
|
|
||||||
|
interrupts-extended = <&ext_intc1 0 0>,
|
||||||
|
<&ext_intc1 1 0>,
|
||||||
|
<&ext_intc0 0 0>,
|
||||||
|
<&ext_intc0 1 0>,
|
||||||
|
<&ext_intc0 2 0>,
|
||||||
|
<&ext_intc0 3 0>;
|
||||||
|
interrupt-names = "gpio0", "gpio1", "gpio2", "gpio3",
|
||||||
|
"gpio4", "gpio5";
|
||||||
};
|
};
|
||||||
|
|
||||||
gpio0: gpio-controller@10000084 {
|
gpio0: gpio-controller@10000084 {
|
||||||
|
|
|
@ -40,7 +40,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||||
obj-$(CONFIG_GPIO_CLPS711X) += gpio-clps711x.o
|
obj-$(CONFIG_GPIO_CLPS711X) += gpio-clps711x.o
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/drivers/gpio/gpio-bcm63xx.c
|
+++ b/drivers/gpio/gpio-bcm63xx.c
|
||||||
@@ -0,0 +1,122 @@
|
@@ -0,0 +1,134 @@
|
||||||
+/*
|
+/*
|
||||||
+ * Driver for BCM63XX memory-mapped GPIO controllers, based on
|
+ * Driver for BCM63XX memory-mapped GPIO controllers, based on
|
||||||
+ * Generic driver for memory-mapped GPIO controllers.
|
+ * Generic driver for memory-mapped GPIO controllers.
|
||||||
|
@ -73,8 +73,17 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||||
+#include <linux/mod_devicetable.h>
|
+#include <linux/mod_devicetable.h>
|
||||||
+#include <linux/basic_mmio_gpio.h>
|
+#include <linux/basic_mmio_gpio.h>
|
||||||
+#include <linux/of.h>
|
+#include <linux/of.h>
|
||||||
|
+#include <linux/of_irq.h>
|
||||||
+#include <linux/of_gpio.h>
|
+#include <linux/of_gpio.h>
|
||||||
+
|
+
|
||||||
|
+static int bcm63xx_gpio_to_irq(struct gpio_chip *chip, unsigned gpio)
|
||||||
|
+{
|
||||||
|
+ char irq_name[7]; /* "gpioXX" */
|
||||||
|
+
|
||||||
|
+ sprintf(irq_name, "gpio%d", gpio);
|
||||||
|
+ return of_irq_get_byname(chip->of_node, irq_name);
|
||||||
|
+}
|
||||||
|
+
|
||||||
+static int bcm63xx_gpio_probe(struct platform_device *pdev)
|
+static int bcm63xx_gpio_probe(struct platform_device *pdev)
|
||||||
+{
|
+{
|
||||||
+ struct device *dev = &pdev->dev;
|
+ struct device *dev = &pdev->dev;
|
||||||
|
@ -126,6 +135,9 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||||
+ if (!of_property_read_u32(dev->of_node, "ngpios", &ngpios))
|
+ if (!of_property_read_u32(dev->of_node, "ngpios", &ngpios))
|
||||||
+ bgc->gc.ngpio = ngpios;
|
+ bgc->gc.ngpio = ngpios;
|
||||||
+
|
+
|
||||||
|
+ if (of_get_property(dev->of_node, "interrupt-names", NULL))
|
||||||
|
+ bgc->gc.to_irq = bcm63xx_gpio_to_irq;
|
||||||
|
+
|
||||||
+ } else if (pdata) {
|
+ } else if (pdata) {
|
||||||
+ bgc->gc.base = pdata->base;
|
+ bgc->gc.base = pdata->base;
|
||||||
+ if (pdata->ngpio > 0)
|
+ if (pdata->ngpio > 0)
|
||||||
|
|
Loading…
Reference in a new issue