Re: [PATCH] pinctrl: at91: choose appropriate handler for level interrupts

2013-08-12 Thread Nicolas Ferre

On 29/07/2013 17:42, Linus Walleij :

On Sat, Jul 20, 2013 at 4:51 PM, Boris BREZILLON
 wrote:


The current implementation handle both edge and level interrupts with the
'handle_simple_irq' handler.

Level interrupts are active as long as the pin stays at the configured
level (low or high). In this case we have to use 'handle_level_irq' which
mask the interrupt until the handle has treated it.

Signed-off-by: Boris BREZILLON 


Nicolas/Jean-Christophe: any opinion on this patch?


Back online:

Acked-by: Nicolas Ferre 

(maybe too late though)

Thanks for fixing this.

Bye,


I am tempted to just apply it and see if you react to it :-)

Yours,
Linus Walleij




--
Nicolas Ferre
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] pinctrl: at91: choose appropriate handler for level interrupts

2013-08-07 Thread boris brezillon

On 07/08/2013 20:59, Linus Walleij wrote:

On Sat, Jul 20, 2013 at 4:51 PM, Boris BREZILLON
 wrote:


The current implementation handle both edge and level interrupts with the
'handle_simple_irq' handler.

Level interrupts are active as long as the pin stays at the configured
level (low or high). In this case we have to use 'handle_level_irq' which
mask the interrupt until the handle has treated it.

Signed-off-by: Boris BREZILLON 

Patch applied with Alexandre's Tested-by tag.

Thanks


Worst thing that can happen is that I have to revert it.
Now it will atleast get some testing in linux-next.

Yours,
Linus Walleij


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] pinctrl: at91: choose appropriate handler for level interrupts

2013-08-07 Thread Linus Walleij
On Sat, Jul 20, 2013 at 4:51 PM, Boris BREZILLON
 wrote:

> The current implementation handle both edge and level interrupts with the
> 'handle_simple_irq' handler.
>
> Level interrupts are active as long as the pin stays at the configured
> level (low or high). In this case we have to use 'handle_level_irq' which
> mask the interrupt until the handle has treated it.
>
> Signed-off-by: Boris BREZILLON 

Patch applied with Alexandre's Tested-by tag.

Worst thing that can happen is that I have to revert it.
Now it will atleast get some testing in linux-next.

Yours,
Linus Walleij
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] pinctrl: at91: choose appropriate handler for level interrupts

2013-08-01 Thread boris brezillon

On 01/08/2013 13:04, Alexandre Belloni wrote:

Hi,

On 20/07/2013 16:51, Boris BREZILLON wrote:

The current implementation handle both edge and level interrupts with the
'handle_simple_irq' handler.

Level interrupts are active as long as the pin stays at the configured
level (low or high). In this case we have to use 'handle_level_irq' which
mask the interrupt until the handle has treated it.

Signed-off-by: Boris BREZILLON 

This solves the issue on my side.

Tested-by: Alexandre Belloni 



Thanks
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] pinctrl: at91: choose appropriate handler for level interrupts

2013-08-01 Thread Alexandre Belloni
Hi,

On 20/07/2013 16:51, Boris BREZILLON wrote:
> The current implementation handle both edge and level interrupts with the
> 'handle_simple_irq' handler.
>
> Level interrupts are active as long as the pin stays at the configured
> level (low or high). In this case we have to use 'handle_level_irq' which
> mask the interrupt until the handle has treated it.
>
> Signed-off-by: Boris BREZILLON 

This solves the issue on my side.

Tested-by: Alexandre Belloni 


-- 
Alexandre Belloni, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] pinctrl: at91: choose appropriate handler for level interrupts

2013-07-29 Thread boris brezillon

On 29/07/2013 17:42, Linus Walleij wrote:

On Sat, Jul 20, 2013 at 4:51 PM, Boris BREZILLON
 wrote:


The current implementation handle both edge and level interrupts with the
'handle_simple_irq' handler.

Level interrupts are active as long as the pin stays at the configured
level (low or high). In this case we have to use 'handle_level_irq' which
mask the interrupt until the handle has treated it.

Signed-off-by: Boris BREZILLON 

Nicolas/Jean-Christophe: any opinion on this patch?

I am tempted to just apply it and see if you react to it :-)

Hello,

Just for clarification, without this patch the kernel hangs if you request a
threaded irq on level state (low or high).

This was tested on sama5ek board.

Best Regards,

Boris


Yours,
Linus Walleij


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] pinctrl: at91: choose appropriate handler for level interrupts

2013-07-29 Thread Linus Walleij
On Sat, Jul 20, 2013 at 4:51 PM, Boris BREZILLON
 wrote:

> The current implementation handle both edge and level interrupts with the
> 'handle_simple_irq' handler.
>
> Level interrupts are active as long as the pin stays at the configured
> level (low or high). In this case we have to use 'handle_level_irq' which
> mask the interrupt until the handle has treated it.
>
> Signed-off-by: Boris BREZILLON 

Nicolas/Jean-Christophe: any opinion on this patch?

I am tempted to just apply it and see if you react to it :-)

Yours,
Linus Walleij
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] pinctrl: at91: choose appropriate handler for level interrupts

2013-07-20 Thread Boris BREZILLON
The current implementation handle both edge and level interrupts with the
'handle_simple_irq' handler.

Level interrupts are active as long as the pin stays at the configured
level (low or high). In this case we have to use 'handle_level_irq' which
mask the interrupt until the handle has treated it.

Signed-off-by: Boris BREZILLON 
---
 drivers/pinctrl/pinctrl-at91.c |   16 ++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c
index 5d7529e..76e108d 100644
--- a/drivers/pinctrl/pinctrl-at91.c
+++ b/drivers/pinctrl/pinctrl-at91.c
@@ -1241,18 +1241,22 @@ static int alt_gpio_irq_type(struct irq_data *d, 
unsigned type)
 
switch (type) {
case IRQ_TYPE_EDGE_RISING:
+   irq_set_handler(d->irq, handle_simple_irq);
writel_relaxed(mask, pio + PIO_ESR);
writel_relaxed(mask, pio + PIO_REHLSR);
break;
case IRQ_TYPE_EDGE_FALLING:
+   irq_set_handler(d->irq, handle_simple_irq);
writel_relaxed(mask, pio + PIO_ESR);
writel_relaxed(mask, pio + PIO_FELLSR);
break;
case IRQ_TYPE_LEVEL_LOW:
+   irq_set_handler(d->irq, handle_level_irq);
writel_relaxed(mask, pio + PIO_LSR);
writel_relaxed(mask, pio + PIO_FELLSR);
break;
case IRQ_TYPE_LEVEL_HIGH:
+   irq_set_handler(d->irq, handle_level_irq);
writel_relaxed(mask, pio + PIO_LSR);
writel_relaxed(mask, pio + PIO_REHLSR);
break;
@@ -1261,6 +1265,7 @@ static int alt_gpio_irq_type(struct irq_data *d, unsigned 
type)
 * disable additional interrupt modes:
 * fall back to default behavior
 */
+   irq_set_handler(d->irq, handle_simple_irq);
writel_relaxed(mask, pio + PIO_AIMDR);
return 0;
case IRQ_TYPE_NONE:
@@ -1402,6 +1407,8 @@ static int at91_gpio_irq_map(struct irq_domain *h, 
unsigned int virq,
irq_hw_number_t hw)
 {
struct at91_gpio_chip   *at91_gpio = h->host_data;
+   void __iomem*pio = at91_gpio->regbase;
+   u32 mask = 1 << hw;
 
irq_set_lockdep_class(virq, &gpio_lock_class);
 
@@ -1409,8 +1416,13 @@ static int at91_gpio_irq_map(struct irq_domain *h, 
unsigned int virq,
 * Can use the "simple" and not "edge" handler since it's
 * shorter, and the AIC handles interrupts sanely.
 */
-   irq_set_chip_and_handler(virq, &gpio_irqchip,
-handle_simple_irq);
+   irq_set_chip(virq, &gpio_irqchip);
+   if ((at91_gpio->ops == &at91sam9x5_ops) &&
+   (readl_relaxed(pio + PIO_AIMMR) & mask) &&
+   (readl_relaxed(pio + PIO_ELSR) & mask))
+   irq_set_handler(virq, handle_level_irq);
+   else
+   irq_set_handler(virq, handle_simple_irq);
set_irq_flags(virq, IRQF_VALID);
irq_set_chip_data(virq, at91_gpio);
 
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/