Hello, I have an SPI device that sends an IRQ to the CPU (MPC5200) via GPIO (GPT6):
gpt6: ti...@660 { // General Purpose Timer GPT6 in GPIO mode for SMC4000IO sample irq. compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio"; cell-index = <6>; reg = <0x660 0x10>; interrupts = <1 15 0>; interrupt-parent = <&mpc5200_pic>; gpio-controller; #gpio-cells = <2>; }; s...@f00 { #address-cells = <1>; #size-cells = <0>; compatible = "fsl,mpc5200b-spi","fsl,mpc5200-spi"; reg = <0xf00 0x20>; interrupts = <2 13 0 2 14 0>; interrupt-parent = <&mpc5200_pic>; gpios = <&gpt4 0 0>; io-control...@0 { compatible = "microkey,smc4000io"; linux,modalias = "of_smc4000io"; spi-max-frequency = <1000000>; spi-cpha; reg = <0>; // gpios: first is IRQ to cpu gpios = <&gpt6 0 0>; word-delay-us = <0>; }; }; I've got it working for a mm_gpio, but it's probably not the right approach, I have the following questions to get to the right solution: - Should gpiolib's gpio_to_irq function indeed return the IRQ that was specified at the GPIO by the DTS (interrupts = <1 15 0>)? The effect is that if the IRQ is not specified in the DTS the gpio_to_irq returns NO_IRQ. (On the MPC5200 the IRQ is fixed for GPT6, so instead the cell-index could also be used to return a gpio's IRQ) - If a GPIO controller supports several GPIOs but one IRQ, is it defined what gpio_to_irq should return? - Is it okay for gpio_to_irq to return NO_IRQ? (returned by irq_of_parse_and_map) if irq is not defined? Henk. diff --git a/drivers/of/gpio.c b/drivers/of/gpio.c index 6eea601..81927d7 100644 --- a/drivers/of/gpio.c +++ b/drivers/of/gpio.c @@ -150,6 +150,17 @@ int of_gpio_simple_xlate(struct of_gpio_chip *of_gc, struct device_node *np, } EXPORT_SYMBOL(of_gpio_simple_xlate); +static int of_mm_gpio_to_irq(struct gpio_chip *gc, unsigned int gpio) +{ + struct of_mm_gpio_chip *mm_gc; + struct of_gpio_chip *of_gc; + + of_gc = container_of(gc, struct of_gpio_chip, gc); + mm_gc = container_of(of_gc, struct of_mm_gpio_chip, of_gc); + return mm_gc->irq; + +} + /** * of_mm_gpiochip_add - Add memory mapped GPIO chip (bank) * @np: device node of the GPIO chip @@ -188,6 +199,9 @@ int of_mm_gpiochip_add(struct device_node *np, gc->base = -1; + mm_gc->irq = irq_of_parse_and_map(np, 0); + gc->to_irq = of_mm_gpio_to_irq; + if (!of_gc->xlate) of_gc->xlate = of_gpio_simple_xlate; diff --git a/include/linux/of_gpio.h b/include/linux/of_gpio.h index fc2472c..17fe9ed 100644 --- a/include/linux/of_gpio.h +++ b/include/linux/of_gpio.h @@ -54,6 +54,7 @@ struct of_mm_gpio_chip { struct of_gpio_chip of_gc; void (*save_regs)(struct of_mm_gpio_chip *mm_gc); void __iomem *regs; + int irq; }; static inline struct of_mm_gpio_chip *to_of_mm_gpio_chip(struct gpio_chip *gc) _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev