From: Jonas Gorski Date: Sun, 18 Dec 2016 12:54:17 +0000 (+0100) Subject: brcm63xx: implement gpio_to_irq for bcm63xx-gpio X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=dd7079e79a94fdde2e0ff4c1d6f428f3b115211c;p=openwrt%2Fstaging%2Fblogic.git 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 --- diff --git a/target/linux/brcm63xx/dts/bcm6318.dtsi b/target/linux/brcm63xx/dts/bcm6318.dtsi index 776698068d4e..037161797814 100644 --- a/target/linux/brcm63xx/dts/bcm6318.dtsi +++ b/target/linux/brcm63xx/dts/bcm6318.dtsi @@ -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 { diff --git a/target/linux/brcm63xx/dts/bcm63268.dtsi b/target/linux/brcm63xx/dts/bcm63268.dtsi index 47894f8b42e7..5a0a909563d1 100644 --- a/target/linux/brcm63xx/dts/bcm63268.dtsi +++ b/target/linux/brcm63xx/dts/bcm63268.dtsi @@ -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 { diff --git a/target/linux/brcm63xx/dts/bcm6328.dtsi b/target/linux/brcm63xx/dts/bcm6328.dtsi index b49958a7b67b..5eec6dec3a57 100644 --- a/target/linux/brcm63xx/dts/bcm6328.dtsi +++ b/target/linux/brcm63xx/dts/bcm6328.dtsi @@ -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"; }; }; }; diff --git a/target/linux/brcm63xx/dts/bcm6348.dtsi b/target/linux/brcm63xx/dts/bcm6348.dtsi index 7edda30845ec..d1219c031ff4 100644 --- a/target/linux/brcm63xx/dts/bcm6348.dtsi +++ b/target/linux/brcm63xx/dts/bcm6348.dtsi @@ -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 { diff --git a/target/linux/brcm63xx/dts/bcm6358.dtsi b/target/linux/brcm63xx/dts/bcm6358.dtsi index fa0b5b8a6ebc..9d95849b3ae8 100644 --- a/target/linux/brcm63xx/dts/bcm6358.dtsi +++ b/target/linux/brcm63xx/dts/bcm6358.dtsi @@ -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 { diff --git a/target/linux/brcm63xx/dts/bcm6362.dtsi b/target/linux/brcm63xx/dts/bcm6362.dtsi index 40f6b9ec29e1..a6a5c1f1d02f 100644 --- a/target/linux/brcm63xx/dts/bcm6362.dtsi +++ b/target/linux/brcm63xx/dts/bcm6362.dtsi @@ -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"; }; }; }; diff --git a/target/linux/brcm63xx/dts/bcm6368.dtsi b/target/linux/brcm63xx/dts/bcm6368.dtsi index 52bcec4466ed..59ef41af47a5 100644 --- a/target/linux/brcm63xx/dts/bcm6368.dtsi +++ b/target/linux/brcm63xx/dts/bcm6368.dtsi @@ -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 { diff --git a/target/linux/brcm63xx/patches-4.4/374-gpio-add-a-simple-GPIO-driver-for-bcm63xx.patch b/target/linux/brcm63xx/patches-4.4/374-gpio-add-a-simple-GPIO-driver-for-bcm63xx.patch index 28930d0f9f52..cd613f5e7b38 100644 --- a/target/linux/brcm63xx/patches-4.4/374-gpio-add-a-simple-GPIO-driver-for-bcm63xx.patch +++ b/target/linux/brcm63xx/patches-4.4/374-gpio-add-a-simple-GPIO-driver-for-bcm63xx.patch @@ -40,7 +40,7 @@ Signed-off-by: Jonas Gorski 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. @@ -73,8 +73,17 @@ Signed-off-by: Jonas Gorski +#include +#include +#include ++#include +#include + ++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; @@ -126,6 +135,9 @@ Signed-off-by: Jonas Gorski + 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)