[PATCH][UPSTEAM] powerpc/mpic: add irq_set_wake support

Wang Dongsheng-B40534 B40534 at freescale.com
Wed Mar 6 20:13:46 EST 2013


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 at lists.ozlabs.org
> Subject: RE: [PATCH][UPSTEAM] powerpc/mpic: add irq_set_wake support
> 
> 
> 
> > -----Original Message-----
> > From: Kumar Gala [mailto:galak at kernel.crashing.org]
> > Sent: Tuesday, February 19, 2013 3:43 AM
> > To: Wang Dongsheng-B40534
> > Cc: linuxppc-dev at 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 at 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 at lists.ozlabs.org
> > > https://lists.ozlabs.org/listinfo/linuxppc-dev
> >




More information about the Linuxppc-dev mailing list