Re: [PATCH] gpio: Renesas R-Car GPIO driver

Magnus Damm
2013-03-14T04:07:14Z

Hi Linus,

On Thu, Mar 14, 2013 at 2:20 AM, Linus Walleij <linus.walleij@linaro.org> wrote:
> On Tue, Mar 5, 2013 at 1:32 AM, Magnus Damm <magnus.damm@gmail.com> wrote:
>
>> +static int gpio_rcar_irq_set_type(struct irq_data *d, unsigned int type)
>> +{
>> + struct gpio_rcar_priv *p = irq_data_get_irq_chip_data(d);
>> + unsigned int hwirq = irqd_to_hwirq(d);
>> +
>> + pr_debug("gpio: sense irq = %d, type = %d\n", hwirq, type);
>> +
>> + switch (type & IRQ_TYPE_SENSE_MASK) {
>> + case IRQ_TYPE_LEVEL_HIGH:
>> + gpio_rcar_config_interrupt_input_mode(p, hwirq, true, true);
>> + break;
>> + case IRQ_TYPE_LEVEL_LOW:
>> + gpio_rcar_config_interrupt_input_mode(p, hwirq, false, true);
>> + break;
>> + case IRQ_TYPE_EDGE_RISING:
>> + gpio_rcar_config_interrupt_input_mode(p, hwirq, true, false);
>> + break;
>> + case IRQ_TYPE_EDGE_FALLING:
>> + gpio_rcar_config_interrupt_input_mode(p, hwirq, false, false);
>> + break;
>
> It is quite common to request IRQ on *both* rising and falling edges,
> what happens then?
>
> See <linux/irqs.h>
> IRQ_TYPE_EDGE_RISING = 0x00000001,
> IRQ_TYPE_EDGE_FALLING = 0x00000002,
> IRQ_TYPE_EDGE_BOTH = (IRQ_TYPE_EDGE_FALLING |
> IRQ_TYPE_EDGE_RISING),
>
> I guess then you get just rising edge...

I may be wrong, but the switch above does AND with IRQ_TYPE_SENSE_MASK
which makes me believe that the BOTH case will result in -EINVAL.

The -EINVAL is IMO correct here since the most basic version of this
GPIO block (used in r8a7779) does not suport BOTH edges. I've noticed
that newer versions of that GPIO hardware block has additional
registers where this can be selected. My plan is to submit an
incremental patch for such feature in the not so distant future.

> The rest I think is already covered by Laurent's comments.

Ok, thanks for your help!

/ magnus