Patchwork [UPSTEAM] powerpc/mpic: add irq_set_wake support

login
register
mail settings
Submitter Dongsheng Wang
Date Jan. 31, 2013, 3:10 a.m.
Message ID <1359601823-9861-1-git-send-email-dongsheng.wang@freescale.com>
Download mbox | patch
Permalink /patch/217078/
State Superseded
Delegated to: Kumar Gala
Headers show

Comments

Dongsheng Wang - Jan. 31, 2013, 3:10 a.m.
Add irq_set_wake support. Just add IRQF_NO_SUSPEND to desc->action->flag.
So the wake up interrupt will not be disable in suspend_device_irqs.

Signed-off-by: Wang Dongsheng <dongsheng.wang@freescale.com>
---
 arch/powerpc/sysdev/mpic.c |   15 +++++++++++++++
 1 files changed, 15 insertions(+), 0 deletions(-)

--
1.7.5.1
Wang Dongsheng-B40534 - Feb. 18, 2013, 2:52 a.m.
Hi Kumar,
Could you ack this patch?
Thanks.

> -----Original Message-----
> From: Wang Dongsheng-B40534
> Sent: Thursday, January 31, 2013 11:10 AM
> To: linuxppc-dev@lists.ozlabs.org
> Cc: Wang Dongsheng-B40534
> Subject: [PATCH][UPSTEAM] powerpc/mpic: add irq_set_wake support
> 
> Add irq_set_wake support. Just add IRQF_NO_SUSPEND to desc->action->flag.
> So the wake up interrupt will not be disable in suspend_device_irqs.
> 
> Signed-off-by: Wang Dongsheng <dongsheng.wang@freescale.com>
> ---
>  arch/powerpc/sysdev/mpic.c |   15 +++++++++++++++
>  1 files changed, 15 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
> index 9c6e535..2ed0220 100644
> --- a/arch/powerpc/sysdev/mpic.c
> +++ b/arch/powerpc/sysdev/mpic.c
> @@ -920,6 +920,18 @@ int mpic_set_irq_type(struct irq_data *d, unsigned
> int flow_type)
>  	return IRQ_SET_MASK_OK_NOCOPY;
>  }
> 
> +static int mpic_irq_set_wake(struct irq_data *d, unsigned int on)
> +{
> +	struct irq_desc *desc = container_of(d, struct irq_desc, irq_data);
> +
> +	if (on)
> +		desc->action->flags |= IRQF_NO_SUSPEND;
> +	else
> +		desc->action->flags &= ~IRQF_NO_SUSPEND;
> +
> +	return 0;
> +}
> +
>  void mpic_set_vector(unsigned int virq, unsigned int vector)
>  {
>  	struct mpic *mpic = mpic_from_irq(virq);
> @@ -957,6 +969,7 @@ static struct irq_chip mpic_irq_chip = {
>  	.irq_unmask	= mpic_unmask_irq,
>  	.irq_eoi	= mpic_end_irq,
>  	.irq_set_type	= mpic_set_irq_type,
> +	.irq_set_wake	= mpic_irq_set_wake,
>  };
> 
>  #ifdef CONFIG_SMP
> @@ -971,6 +984,7 @@ static struct irq_chip mpic_tm_chip = {
>  	.irq_mask	= mpic_mask_tm,
>  	.irq_unmask	= mpic_unmask_tm,
>  	.irq_eoi	= mpic_end_irq,
> +	.irq_set_wake	= mpic_irq_set_wake,
>  };
> 
>  #ifdef CONFIG_MPIC_U3_HT_IRQS
> @@ -981,6 +995,7 @@ static struct irq_chip mpic_irq_ht_chip = {
>  	.irq_unmask	= mpic_unmask_ht_irq,
>  	.irq_eoi	= mpic_end_ht_irq,
>  	.irq_set_type	= mpic_set_irq_type,
> +	.irq_set_wake	= mpic_irq_set_wake,
>  };
>  #endif /* CONFIG_MPIC_U3_HT_IRQS */
> 
> --
> 1.7.5.1
Kumar Gala - Feb. 18, 2013, 7:43 p.m.
On Jan 30, 2013, at 9:10 PM, Wang Dongsheng wrote:

> Add irq_set_wake support. Just add IRQF_NO_SUSPEND to desc->action->flag.
> So the wake up interrupt will not be disable in suspend_device_irqs.
> 
> Signed-off-by: Wang Dongsheng <dongsheng.wang@freescale.com>
> ---
> arch/powerpc/sysdev/mpic.c |   15 +++++++++++++++
> 1 files changed, 15 insertions(+), 0 deletions(-)

Why are we doing this globally for all interrupts?  Don't we only have some specific interrupts that wake us up?

Also, I'm guessing the wake behavior for interrupts is FSL specific so should not apply to ALL users of MPIC.

- k

> 
> diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
> index 9c6e535..2ed0220 100644
> --- a/arch/powerpc/sysdev/mpic.c
> +++ b/arch/powerpc/sysdev/mpic.c
> @@ -920,6 +920,18 @@ int mpic_set_irq_type(struct irq_data *d, unsigned int flow_type)
> 	return IRQ_SET_MASK_OK_NOCOPY;
> }
> 
> +static int mpic_irq_set_wake(struct irq_data *d, unsigned int on)
> +{
> +	struct irq_desc *desc = container_of(d, struct irq_desc, irq_data);
> +
> +	if (on)
> +		desc->action->flags |= IRQF_NO_SUSPEND;
> +	else
> +		desc->action->flags &= ~IRQF_NO_SUSPEND;
> +
> +	return 0;
> +}
> +
> void mpic_set_vector(unsigned int virq, unsigned int vector)
> {
> 	struct mpic *mpic = mpic_from_irq(virq);
> @@ -957,6 +969,7 @@ static struct irq_chip mpic_irq_chip = {
> 	.irq_unmask	= mpic_unmask_irq,
> 	.irq_eoi	= mpic_end_irq,
> 	.irq_set_type	= mpic_set_irq_type,
> +	.irq_set_wake	= mpic_irq_set_wake,
> };
> 
> #ifdef CONFIG_SMP
> @@ -971,6 +984,7 @@ static struct irq_chip mpic_tm_chip = {
> 	.irq_mask	= mpic_mask_tm,
> 	.irq_unmask	= mpic_unmask_tm,
> 	.irq_eoi	= mpic_end_irq,
> +	.irq_set_wake	= mpic_irq_set_wake,
> };
> 
> #ifdef CONFIG_MPIC_U3_HT_IRQS
> @@ -981,6 +995,7 @@ static struct irq_chip mpic_irq_ht_chip = {
> 	.irq_unmask	= mpic_unmask_ht_irq,
> 	.irq_eoi	= mpic_end_ht_irq,
> 	.irq_set_type	= mpic_set_irq_type,
> +	.irq_set_wake	= mpic_irq_set_wake,
> };
> #endif /* CONFIG_MPIC_U3_HT_IRQS */
> 
> --
> 1.7.5.1
> 
> 
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev
Wang Dongsheng-B40534 - Feb. 20, 2013, 5:57 a.m.
> -----Original Message-----
> From: Kumar Gala [mailto:galak@kernel.crashing.org]
> Sent: Tuesday, February 19, 2013 3:43 AM
> To: Wang Dongsheng-B40534
> Cc: linuxppc-dev@lists.ozlabs.org
> Subject: Re: [PATCH][UPSTEAM] powerpc/mpic: add irq_set_wake support
> 
> 
> On Jan 30, 2013, at 9:10 PM, Wang Dongsheng wrote:
> 
> > Add irq_set_wake support. Just add IRQF_NO_SUSPEND to desc->action-
> >flag.
> > So the wake up interrupt will not be disable in suspend_device_irqs.
> >
> > Signed-off-by: Wang Dongsheng <dongsheng.wang@freescale.com>
> > ---
> > arch/powerpc/sysdev/mpic.c |   15 +++++++++++++++
> > 1 files changed, 15 insertions(+), 0 deletions(-)
> 
> Why are we doing this globally for all interrupts? Don't we only have 
> some specific interrupts that wake us up?
> Also, I'm guessing the wake behavior for interrupts is FSL specific so
> should not apply to ALL users of MPIC.

That is IRQ wakeup (PM) control. Actually not all interrupts will be set.
We just let mpic have this ability. It's control by driver.
If a device has the ability to wake up system, this device driver can set
irq wake up(through enable/disable_irq_wake()), and the driver do not need
add a flag(IRQF_NO_SUSPEND) to request_irq().

for example,

suspend()
{
	...;
	enable_irq_wake(irq);
	...;
}

resume()
{
	...;
	disable_irq_wake(irq);
	...;
}

> 
> - k
> 

> >
> > diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
> > index 9c6e535..2ed0220 100644
> > --- a/arch/powerpc/sysdev/mpic.c
> > +++ b/arch/powerpc/sysdev/mpic.c
> > @@ -920,6 +920,18 @@ int mpic_set_irq_type(struct irq_data *d, unsigned
> int flow_type)
> > 	return IRQ_SET_MASK_OK_NOCOPY;
> > }
> >
> > +static int mpic_irq_set_wake(struct irq_data *d, unsigned int on) {
> > +	struct irq_desc *desc = container_of(d, struct irq_desc, irq_data);
> > +
> > +	if (on)
> > +		desc->action->flags |= IRQF_NO_SUSPEND;
> > +	else
> > +		desc->action->flags &= ~IRQF_NO_SUSPEND;
> > +
> > +	return 0;
> > +}
> > +
> > void mpic_set_vector(unsigned int virq, unsigned int vector) {
> > 	struct mpic *mpic = mpic_from_irq(virq); @@ -957,6 +969,7 @@ static
> > struct irq_chip mpic_irq_chip = {
> > 	.irq_unmask	= mpic_unmask_irq,
> > 	.irq_eoi	= mpic_end_irq,
> > 	.irq_set_type	= mpic_set_irq_type,
> > +	.irq_set_wake	= mpic_irq_set_wake,
> > };
> >
> > #ifdef CONFIG_SMP
> > @@ -971,6 +984,7 @@ static struct irq_chip mpic_tm_chip = {
> > 	.irq_mask	= mpic_mask_tm,
> > 	.irq_unmask	= mpic_unmask_tm,
> > 	.irq_eoi	= mpic_end_irq,
> > +	.irq_set_wake	= mpic_irq_set_wake,
> > };
> >
> > #ifdef CONFIG_MPIC_U3_HT_IRQS
> > @@ -981,6 +995,7 @@ static struct irq_chip mpic_irq_ht_chip = {
> > 	.irq_unmask	= mpic_unmask_ht_irq,
> > 	.irq_eoi	= mpic_end_ht_irq,
> > 	.irq_set_type	= mpic_set_irq_type,
> > +	.irq_set_wake	= mpic_irq_set_wake,
> > };
> > #endif /* CONFIG_MPIC_U3_HT_IRQS */
> >
> > --
> > 1.7.5.1
> >
> >
> > _______________________________________________
> > Linuxppc-dev mailing list
> > Linuxppc-dev@lists.ozlabs.org
> > https://lists.ozlabs.org/listinfo/linuxppc-dev
>
Wang Dongsheng-B40534 - March 6, 2013, 9:13 a.m.
Hi Benjamin,

Could you please apply this patch?

Regards,
dongsheng

> -----Original Message-----
> From: Wang Dongsheng-B40534
> Sent: Wednesday, February 20, 2013 1:58 PM
> To: 'Kumar Gala'
> Cc: linuxppc-dev@lists.ozlabs.org
> Subject: RE: [PATCH][UPSTEAM] powerpc/mpic: add irq_set_wake support
> 
> 
> 
> > -----Original Message-----
> > From: Kumar Gala [mailto:galak@kernel.crashing.org]
> > Sent: Tuesday, February 19, 2013 3:43 AM
> > To: Wang Dongsheng-B40534
> > Cc: linuxppc-dev@lists.ozlabs.org
> > Subject: Re: [PATCH][UPSTEAM] powerpc/mpic: add irq_set_wake support
> >
> >
> > On Jan 30, 2013, at 9:10 PM, Wang Dongsheng wrote:
> >
> > > Add irq_set_wake support. Just add IRQF_NO_SUSPEND to desc->action-
> > >flag.
> > > So the wake up interrupt will not be disable in suspend_device_irqs.
> > >
> > > Signed-off-by: Wang Dongsheng <dongsheng.wang@freescale.com>
> > > ---
> > > arch/powerpc/sysdev/mpic.c |   15 +++++++++++++++
> > > 1 files changed, 15 insertions(+), 0 deletions(-)
> >
> > Why are we doing this globally for all interrupts? Don't we only have
> > some specific interrupts that wake us up?
> > Also, I'm guessing the wake behavior for interrupts is FSL specific so
> > should not apply to ALL users of MPIC.
> 
> That is IRQ wakeup (PM) control. Actually not all interrupts will be set.
> We just let mpic have this ability. It's control by driver.
> If a device has the ability to wake up system, this device driver can set
> irq wake up(through enable/disable_irq_wake()), and the driver do not
> need add a flag(IRQF_NO_SUSPEND) to request_irq().
> 
> for example,
> 
> suspend()
> {
> 	...;
> 	enable_irq_wake(irq);
> 	...;
> }
> 
> resume()
> {
> 	...;
> 	disable_irq_wake(irq);
> 	...;
> }
> 
> >
> > - k
> >
> 
> > >
> > > diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
> > > index 9c6e535..2ed0220 100644
> > > --- a/arch/powerpc/sysdev/mpic.c
> > > +++ b/arch/powerpc/sysdev/mpic.c
> > > @@ -920,6 +920,18 @@ int mpic_set_irq_type(struct irq_data *d,
> > > unsigned
> > int flow_type)
> > > 	return IRQ_SET_MASK_OK_NOCOPY;
> > > }
> > >
> > > +static int mpic_irq_set_wake(struct irq_data *d, unsigned int on) {
> > > +	struct irq_desc *desc = container_of(d, struct irq_desc,
> > > +irq_data);
> > > +
> > > +	if (on)
> > > +		desc->action->flags |= IRQF_NO_SUSPEND;
> > > +	else
> > > +		desc->action->flags &= ~IRQF_NO_SUSPEND;
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > void mpic_set_vector(unsigned int virq, unsigned int vector) {
> > > 	struct mpic *mpic = mpic_from_irq(virq); @@ -957,6 +969,7 @@ static
> > > struct irq_chip mpic_irq_chip = {
> > > 	.irq_unmask	= mpic_unmask_irq,
> > > 	.irq_eoi	= mpic_end_irq,
> > > 	.irq_set_type	= mpic_set_irq_type,
> > > +	.irq_set_wake	= mpic_irq_set_wake,
> > > };
> > >
> > > #ifdef CONFIG_SMP
> > > @@ -971,6 +984,7 @@ static struct irq_chip mpic_tm_chip = {
> > > 	.irq_mask	= mpic_mask_tm,
> > > 	.irq_unmask	= mpic_unmask_tm,
> > > 	.irq_eoi	= mpic_end_irq,
> > > +	.irq_set_wake	= mpic_irq_set_wake,
> > > };
> > >
> > > #ifdef CONFIG_MPIC_U3_HT_IRQS
> > > @@ -981,6 +995,7 @@ static struct irq_chip mpic_irq_ht_chip = {
> > > 	.irq_unmask	= mpic_unmask_ht_irq,
> > > 	.irq_eoi	= mpic_end_ht_irq,
> > > 	.irq_set_type	= mpic_set_irq_type,
> > > +	.irq_set_wake	= mpic_irq_set_wake,
> > > };
> > > #endif /* CONFIG_MPIC_U3_HT_IRQS */
> > >
> > > --
> > > 1.7.5.1
> > >
> > >
> > > _______________________________________________
> > > Linuxppc-dev mailing list
> > > Linuxppc-dev@lists.ozlabs.org
> > > https://lists.ozlabs.org/listinfo/linuxppc-dev
> >
Wang Dongsheng-B40534 - March 19, 2013, 7:10 a.m.
> -----Original Message-----
> From: Wood Scott-B07421
> Sent: Tuesday, March 19, 2013 7:36 AM
> To: Wang Dongsheng-B40534
> Cc: linuxppc-dev@lists.ozlabs.org; galak@kernel.crashing.org
> Subject: Re: [PATCH][UPSTEAM] powerpc/mpic: add irq_set_wake support
> 
> On 01/30/2013 09:10:23 PM, Wang Dongsheng wrote:
> > Add irq_set_wake support. Just add IRQF_NO_SUSPEND to
> > desc->action->flag.
> > So the wake up interrupt will not be disable in suspend_device_irqs.
> >
> > Signed-off-by: Wang Dongsheng <dongsheng.wang@freescale.com>
> > ---
> >  arch/powerpc/sysdev/mpic.c |   15 +++++++++++++++
> >  1 files changed, 15 insertions(+), 0 deletions(-)
> >
> > diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
> > index 9c6e535..2ed0220 100644
> > --- a/arch/powerpc/sysdev/mpic.c
> > +++ b/arch/powerpc/sysdev/mpic.c
> > @@ -920,6 +920,18 @@ int mpic_set_irq_type(struct irq_data *d,
> > unsigned int flow_type)
> >  	return IRQ_SET_MASK_OK_NOCOPY;
> >  }
> >
> > +static int mpic_irq_set_wake(struct irq_data *d, unsigned int on)
> > +{
> > +	struct irq_desc *desc = container_of(d, struct irq_desc,
> > irq_data);
> > +
> > +	if (on)
> > +		desc->action->flags |= IRQF_NO_SUSPEND;
> > +	else
> > +		desc->action->flags &= ~IRQF_NO_SUSPEND;
> > +
> > +	return 0;
> > +}
> 
> This should really be something like fsl_mpic_irq_set_wake() and only
> set when we have an FSL MPIC.
> 
Thanks, Add "#ifdef FSL_SOC" to control.
Scott Wood - March 19, 2013, 4 p.m.
On 03/19/2013 02:10:38 AM, Wang Dongsheng-B40534 wrote:
> 
> 
> > -----Original Message-----
> > From: Wood Scott-B07421
> > Sent: Tuesday, March 19, 2013 7:36 AM
> > To: Wang Dongsheng-B40534
> > Cc: linuxppc-dev@lists.ozlabs.org; galak@kernel.crashing.org
> > Subject: Re: [PATCH][UPSTEAM] powerpc/mpic: add irq_set_wake support
> >
> > On 01/30/2013 09:10:23 PM, Wang Dongsheng wrote:
> > > Add irq_set_wake support. Just add IRQF_NO_SUSPEND to
> > > desc->action->flag.
> > > So the wake up interrupt will not be disable in  
> suspend_device_irqs.
> > >
> > > Signed-off-by: Wang Dongsheng <dongsheng.wang@freescale.com>
> > > ---
> > >  arch/powerpc/sysdev/mpic.c |   15 +++++++++++++++
> > >  1 files changed, 15 insertions(+), 0 deletions(-)
> > >
> > > diff --git a/arch/powerpc/sysdev/mpic.c  
> b/arch/powerpc/sysdev/mpic.c
> > > index 9c6e535..2ed0220 100644
> > > --- a/arch/powerpc/sysdev/mpic.c
> > > +++ b/arch/powerpc/sysdev/mpic.c
> > > @@ -920,6 +920,18 @@ int mpic_set_irq_type(struct irq_data *d,
> > > unsigned int flow_type)
> > >  	return IRQ_SET_MASK_OK_NOCOPY;
> > >  }
> > >
> > > +static int mpic_irq_set_wake(struct irq_data *d, unsigned int on)
> > > +{
> > > +	struct irq_desc *desc = container_of(d, struct irq_desc,
> > > irq_data);
> > > +
> > > +	if (on)
> > > +		desc->action->flags |= IRQF_NO_SUSPEND;
> > > +	else
> > > +		desc->action->flags &= ~IRQF_NO_SUSPEND;
> > > +
> > > +	return 0;
> > > +}
> >
> > This should really be something like fsl_mpic_irq_set_wake() and  
> only
> > set when we have an FSL MPIC.
> >
> Thanks, Add "#ifdef FSL_SOC" to control.

That's not what I meant.  Check "mpic->flags & MPIC_FSL".

-Scott

Patch

diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
index 9c6e535..2ed0220 100644
--- a/arch/powerpc/sysdev/mpic.c
+++ b/arch/powerpc/sysdev/mpic.c
@@ -920,6 +920,18 @@  int mpic_set_irq_type(struct irq_data *d, unsigned int flow_type)
 	return IRQ_SET_MASK_OK_NOCOPY;
 }

+static int mpic_irq_set_wake(struct irq_data *d, unsigned int on)
+{
+	struct irq_desc *desc = container_of(d, struct irq_desc, irq_data);
+
+	if (on)
+		desc->action->flags |= IRQF_NO_SUSPEND;
+	else
+		desc->action->flags &= ~IRQF_NO_SUSPEND;
+
+	return 0;
+}
+
 void mpic_set_vector(unsigned int virq, unsigned int vector)
 {
 	struct mpic *mpic = mpic_from_irq(virq);
@@ -957,6 +969,7 @@  static struct irq_chip mpic_irq_chip = {
 	.irq_unmask	= mpic_unmask_irq,
 	.irq_eoi	= mpic_end_irq,
 	.irq_set_type	= mpic_set_irq_type,
+	.irq_set_wake	= mpic_irq_set_wake,
 };

 #ifdef CONFIG_SMP
@@ -971,6 +984,7 @@  static struct irq_chip mpic_tm_chip = {
 	.irq_mask	= mpic_mask_tm,
 	.irq_unmask	= mpic_unmask_tm,
 	.irq_eoi	= mpic_end_irq,
+	.irq_set_wake	= mpic_irq_set_wake,
 };

 #ifdef CONFIG_MPIC_U3_HT_IRQS
@@ -981,6 +995,7 @@  static struct irq_chip mpic_irq_ht_chip = {
 	.irq_unmask	= mpic_unmask_ht_irq,
 	.irq_eoi	= mpic_end_ht_irq,
 	.irq_set_type	= mpic_set_irq_type,
+	.irq_set_wake	= mpic_irq_set_wake,
 };
 #endif /* CONFIG_MPIC_U3_HT_IRQS */