diff mbox

pinctrl: single: call pcs_soc->rearm() whenever IRQ mask is changed

Message ID 20131011172128.GT29913@atomide.com (mailing list archive)
State New, archived
Headers show

Commit Message

Tony Lindgren Oct. 11, 2013, 5:21 p.m. UTC
* Roger Quadros <rogerq@ti.com> [131011 09:21]:
> On OMAPs the IO ring must be rearmed each time the pad wakeup
> configuration is changed. So call pcs_soc->rearm() from
> pcs_irq_set().
> 
> Signed-off-by: Roger Quadros <rogerq@ti.com>
> ---
>  drivers/pinctrl/pinctrl-single.c |    5 +++--
>  1 files changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c
> index c2aada7..1800e47 100644
> --- a/drivers/pinctrl/pinctrl-single.c
> +++ b/drivers/pinctrl/pinctrl-single.c
> @@ -1604,6 +1604,9 @@ static inline void pcs_irq_set(struct pcs_soc_data *pcs_soc,
>  		pcs->write(mask, pcswi->reg);
>  		raw_spin_unlock(&pcs->lock);
>  	}
> +
> +	if (pcs_soc->rearm)
> +		pcs_soc->rearm();
>  }
>  
>  /**
> @@ -1626,8 +1629,6 @@ static void pcs_irq_unmask(struct irq_data *d)
>  	struct pcs_soc_data *pcs_soc = irq_data_get_irq_chip_data(d);
>  
>  	pcs_irq_set(pcs_soc, d->irq, true);
> -	if (pcs_soc->rearm)
> -		pcs_soc->rearm();
>  }

This seems to cause the wake-up interrupts to happen also during
runtime for me, which makes the omap3 behave the same way as omap4
already does.

However, the concern I have is that we only want the io chain
wake-up happen during idle and not during runtime.. So counting
on the io chain in your EHCI driver during runtime would require
also additional tracking of idle wake up events vs runtime wake-up
events somewhere once we have the automatic solution for runtime PM.
That is to avoid spurious interrupts during runtime.

In any case, since this is an interrupt controller now, we should
just follow the Linux standard for interrupt controllers, so if
you do a request_irq() on it, you really should get interrupts.

I've updated the patch a litte below to also remove the now bogus
comment, and to update the description.

So considering all that, I suggest that Linus applies the updated
fix below into the pinctrl tree after pulling in the the tag I
posted for "pinctrl-single-for-linus-for-v3.13-signed".

8< -----------------------

From: Roger Quadros <rogerq@ti.com>
Date: Fri, 11 Oct 2013 19:13:16 +0300
Subject: [PATCH] pinctrl: single: call pcs_soc->rearm() whenever IRQ mask is changed

On OMAPs the IO ring must be rearmed each time the pad wakeup
configuration is changed. So call pcs_soc->rearm() from
pcs_irq_set().

As pinctrl-single is now an interrupt controller in some cases,
we should follow the standards and keep the interrupts enabled
constantly, and not just for wake-up events. The tracking of
runtime vs wake-up interrupts can be handled separately for
the automated runtime PM solution when we have it in the
future.

Signed-off-by: Roger Quadros <rogerq@ti.com>
[tony@atomide.com: removed wrong comment, updated description]
Signed-off-by: Tony Lindgren <tony@atomide.com>

Comments

Roger Quadros Oct. 14, 2013, 8:15 a.m. UTC | #1
On 10/11/2013 08:21 PM, Tony Lindgren wrote:
> * Roger Quadros <rogerq@ti.com> [131011 09:21]:
>> On OMAPs the IO ring must be rearmed each time the pad wakeup
>> configuration is changed. So call pcs_soc->rearm() from
>> pcs_irq_set().
>>
>> Signed-off-by: Roger Quadros <rogerq@ti.com>
>> ---
>>  drivers/pinctrl/pinctrl-single.c |    5 +++--
>>  1 files changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c
>> index c2aada7..1800e47 100644
>> --- a/drivers/pinctrl/pinctrl-single.c
>> +++ b/drivers/pinctrl/pinctrl-single.c
>> @@ -1604,6 +1604,9 @@ static inline void pcs_irq_set(struct pcs_soc_data *pcs_soc,
>>  		pcs->write(mask, pcswi->reg);
>>  		raw_spin_unlock(&pcs->lock);
>>  	}
>> +
>> +	if (pcs_soc->rearm)
>> +		pcs_soc->rearm();
>>  }
>>  
>>  /**
>> @@ -1626,8 +1629,6 @@ static void pcs_irq_unmask(struct irq_data *d)
>>  	struct pcs_soc_data *pcs_soc = irq_data_get_irq_chip_data(d);
>>  
>>  	pcs_irq_set(pcs_soc, d->irq, true);
>> -	if (pcs_soc->rearm)
>> -		pcs_soc->rearm();
>>  }
> 
> This seems to cause the wake-up interrupts to happen also during
> runtime for me, which makes the omap3 behave the same way as omap4
> already does.
> 
> However, the concern I have is that we only want the io chain
> wake-up happen during idle and not during runtime.. So counting
> on the io chain in your EHCI driver during runtime would require
> also additional tracking of idle wake up events vs runtime wake-up
> events somewhere once we have the automatic solution for runtime PM.
> That is to avoid spurious interrupts during runtime.

Right. It is upto the driver to disable the irq when it is not interested
in the wake up interrupts.

> 
> In any case, since this is an interrupt controller now, we should
> just follow the Linux standard for interrupt controllers, so if
> you do a request_irq() on it, you really should get interrupts.
> 
> I've updated the patch a litte below to also remove the now bogus
> comment, and to update the description.
> 
> So considering all that, I suggest that Linus applies the updated
> fix below into the pinctrl tree after pulling in the the tag I
> posted for "pinctrl-single-for-linus-for-v3.13-signed".

Great. Thanks.

cheers,
-roger
diff mbox

Patch

--- a/drivers/pinctrl/pinctrl-single.c
+++ b/drivers/pinctrl/pinctrl-single.c
@@ -1604,6 +1604,9 @@  static inline void pcs_irq_set(struct pcs_soc_data *pcs_soc,
 		pcs->write(mask, pcswi->reg);
 		raw_spin_unlock(&pcs->lock);
 	}
+
+	if (pcs_soc->rearm)
+		pcs_soc->rearm();
 }
 
 /**
@@ -1626,8 +1629,6 @@  static void pcs_irq_unmask(struct irq_data *d)
 	struct pcs_soc_data *pcs_soc = irq_data_get_irq_chip_data(d);
 
 	pcs_irq_set(pcs_soc, d->irq, true);
-	if (pcs_soc->rearm)
-		pcs_soc->rearm();
 }
 
 /**
@@ -1678,11 +1679,6 @@  static int pcs_irq_handle(struct pcs_soc_data *pcs_soc)
 		}
 	}
 
-	/*
-	 * For debugging on omaps, you may want to call pcs_soc->rearm()
-	 * here to see wake-up interrupts during runtime also.
-	 */
-
 	return count;
 }