Patchwork support IRQ from GPIO trough OF and GPIOLIB

login
register
mail settings
Submitter Henk Stegeman
Date March 5, 2009, 11:20 a.m.
Message ID <ae4f76fd0903050320j75200141we4d7c264dd387d2d@mail.gmail.com>
Download mbox | patch
Permalink /patch/24095/
State Rejected
Delegated to: Grant Likely
Headers show

Comments

Henk Stegeman - March 5, 2009, 11:20 a.m.
I forgot to include my  changes in arch/powerpc/include/asm/gpio.h:



On Thu, Mar 5, 2009 at 12:15 PM, Henk Stegeman <henk.stegeman@gmail.com> wrote:
> Hello,
>
> I have an SPI device that sends an IRQ to the CPU (MPC5200) via GPIO (GPT6):
>
> gpt6: timer@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>;
> };
>
> spi@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-controller@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)
>
Henk Stegeman - March 6, 2009, 1:51 p.m.
I just saw that I missed an earlier very useful a suggestion from Grant Likely:

http://ozlabs.org/pipermail/linuxppc-dev/2009-February/068357.html

By defining the irq in the dts directly I don't need the gpio irq
support anymore.


On Thu, Mar 5, 2009 at 12:20 PM, Henk Stegeman <henk.stegeman@gmail.com> wrote:
> I forgot to include my  changes in arch/powerpc/include/asm/gpio.h:
>
> diff --git a/arch/powerpc/include/asm/gpio.h b/arch/powerpc/include/asm/gpio.h
> index ea04632..38762ed 100644
> --- a/arch/powerpc/include/asm/gpio.h
> +++ b/arch/powerpc/include/asm/gpio.h
> @@ -38,12 +38,9 @@ static inline int gpio_cansleep(unsigned int gpio)
>        return __gpio_cansleep(gpio);
>  }
>
> -/*
> - * Not implemented, yet.
> - */
>  static inline int gpio_to_irq(unsigned int gpio)
>  {
> -       return -ENOSYS;
> +       return __gpio_to_irq(gpio);
>  }
>
>  static inline int irq_to_gpio(unsigned int irq)
>
>
> On Thu, Mar 5, 2009 at 12:15 PM, Henk Stegeman <henk.stegeman@gmail.com> wrote:
>> Hello,
>>
>> I have an SPI device that sends an IRQ to the CPU (MPC5200) via GPIO (GPT6):
>>
>> gpt6: timer@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>;
>> };
>>
>> spi@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-controller@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)
>>
>

Patch

diff --git a/arch/powerpc/include/asm/gpio.h b/arch/powerpc/include/asm/gpio.h
index ea04632..38762ed 100644
--- a/arch/powerpc/include/asm/gpio.h
+++ b/arch/powerpc/include/asm/gpio.h
@@ -38,12 +38,9 @@  static inline int gpio_cansleep(unsigned int gpio)
 	return __gpio_cansleep(gpio);
 }

-/*
- * Not implemented, yet.
- */
 static inline int gpio_to_irq(unsigned int gpio)
 {
-	return -ENOSYS;
+	return __gpio_to_irq(gpio);
 }

 static inline int irq_to_gpio(unsigned int irq)