Skip to content

Commit

Permalink
brcm63xx: implement gpio_to_irq for bcm63xx-gpio
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
KanjiMonster committed Feb 9, 2017
1 parent 94bbd1f commit dd7079e
Show file tree
Hide file tree
Showing 8 changed files with 53 additions and 1 deletion.
4 changes: 4 additions & 0 deletions target/linux/brcm63xx/dts/bcm6318.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,10 @@
#gpio-cells = <2>;

ngpios = <18>;

interrupt-parent = <&ext_intc>;
interrupts = <0 0>, <1 0>;
interrupt-names = "gpio1", "gpio2";
};

gpio0: gpio-controller@10000084 {
Expand Down
4 changes: 4 additions & 0 deletions target/linux/brcm63xx/dts/bcm63268.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,10 @@
#gpio-cells = <2>;

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 {
Expand Down
5 changes: 5 additions & 0 deletions target/linux/brcm63xx/dts/bcm6328.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@

gpio-controller;
#gpio-cells = <2>;

interrupt-parent = <&ext_intc>;
interrupts = <3 0>, <2 0>, <0 0>, <1 0>;
interrupt-names = "gpio12", "gpio15",
"gpio23", "gpio24";
};
};
};
4 changes: 4 additions & 0 deletions target/linux/brcm63xx/dts/bcm6348.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,10 @@
#gpio-cells = <2>;

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 {
Expand Down
9 changes: 9 additions & 0 deletions target/linux/brcm63xx/dts/bcm6358.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,15 @@
#gpio-cells = <2>;

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 {
Expand Down
5 changes: 5 additions & 0 deletions target/linux/brcm63xx/dts/bcm6362.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,11 @@

gpio-controller;
#gpio-cells = <2>;

interrupt-parent = <&ext_intc>;
interrupts = <0 0>, <1 0>, <2 0>, <3 0>;
interrupt-names = "gpio24", "gpio25",
"gpio26", "gpio27";
};
};
};
9 changes: 9 additions & 0 deletions target/linux/brcm63xx/dts/bcm6368.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,15 @@
#gpio-cells = <2>;

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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
obj-$(CONFIG_GPIO_CLPS711X) += gpio-clps711x.o
--- /dev/null
+++ b/drivers/gpio/gpio-bcm63xx.c
@@ -0,0 +1,122 @@
@@ -0,0 +1,134 @@
+/*
+ * Driver for BCM63XX memory-mapped GPIO controllers, based on
+ * Generic driver for memory-mapped GPIO controllers.
Expand Down Expand Up @@ -73,8 +73,17 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
+#include <linux/mod_devicetable.h>
+#include <linux/basic_mmio_gpio.h>
+#include <linux/of.h>
+#include <linux/of_irq.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)
+{
+ struct device *dev = &pdev->dev;
Expand Down Expand Up @@ -126,6 +135,9 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
+ if (!of_property_read_u32(dev->of_node, "ngpios", &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) {
+ bgc->gc.base = pdata->base;
+ if (pdata->ngpio > 0)
Expand Down

0 comments on commit dd7079e

Please sign in to comment.