Patchwork [01/28] powerpc: mpic irq_data conversion.

login
register
mail settings
Submitter Lennert Buytenhek
Date March 7, 2011, 11:59 p.m.
Message ID <20110307235902.GF16649@mail.wantstofly.org>
Download mbox | patch
Permalink /patch/85846/
State Superseded
Delegated to: Benjamin Herrenschmidt
Headers show

Comments

Lennert Buytenhek - March 7, 2011, 11:59 p.m.
Signed-off-by: Lennert Buytenhek <buytenh@secretlab.ca>
---
 arch/powerpc/include/asm/mpic.h       |    6 +-
 arch/powerpc/platforms/pasemi/setup.c |    4 +-
 arch/powerpc/sysdev/mpic.c            |  131 +++++++++++++++++----------------
 arch/powerpc/sysdev/mpic.h            |    5 +-
 arch/powerpc/sysdev/mpic_pasemi_msi.c |   18 ++--
 arch/powerpc/sysdev/mpic_u3msi.c      |   18 ++--
 6 files changed, 92 insertions(+), 90 deletions(-)
Grant Likely - March 8, 2011, 4:13 a.m.
On Tue, Mar 08, 2011 at 12:59:02AM +0100, Lennert Buytenhek wrote:
> Signed-off-by: Lennert Buytenhek <buytenh@secretlab.ca>

Hi Lennert,

I'm taking a look over now and running some build testing.

However, this needs a wider audience for review before it gets merged.
Can you please repost and cc: benh, sfr, tglx, and linux-kernel?

Thanks,
g.

> ---
>  arch/powerpc/include/asm/mpic.h       |    6 +-
>  arch/powerpc/platforms/pasemi/setup.c |    4 +-
>  arch/powerpc/sysdev/mpic.c            |  131 +++++++++++++++++----------------
>  arch/powerpc/sysdev/mpic.h            |    5 +-
>  arch/powerpc/sysdev/mpic_pasemi_msi.c |   18 ++--
>  arch/powerpc/sysdev/mpic_u3msi.c      |   18 ++--
>  6 files changed, 92 insertions(+), 90 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/mpic.h b/arch/powerpc/include/asm/mpic.h
> index e000cce..946ec49 100644
> --- a/arch/powerpc/include/asm/mpic.h
> +++ b/arch/powerpc/include/asm/mpic.h
> @@ -467,11 +467,11 @@ extern void mpic_request_ipis(void);
>  void smp_mpic_message_pass(int target, int msg);
>  
>  /* Unmask a specific virq */
> -extern void mpic_unmask_irq(unsigned int irq);
> +extern void mpic_unmask_irq(struct irq_data *d);
>  /* Mask a specific virq */
> -extern void mpic_mask_irq(unsigned int irq);
> +extern void mpic_mask_irq(struct irq_data *d);
>  /* EOI a specific virq */
> -extern void mpic_end_irq(unsigned int irq);
> +extern void mpic_end_irq(struct irq_data *d);
>  
>  /* Fetch interrupt from a given mpic */
>  extern unsigned int mpic_get_one_irq(struct mpic *mpic);
> diff --git a/arch/powerpc/platforms/pasemi/setup.c b/arch/powerpc/platforms/pasemi/setup.c
> index f372ec1..a6067b3 100644
> --- a/arch/powerpc/platforms/pasemi/setup.c
> +++ b/arch/powerpc/platforms/pasemi/setup.c
> @@ -240,7 +240,7 @@ static __init void pas_init_IRQ(void)
>  		nmi_virq = irq_create_mapping(NULL, *nmiprop);
>  		mpic_irq_set_priority(nmi_virq, 15);
>  		set_irq_type(nmi_virq, IRQ_TYPE_EDGE_RISING);
> -		mpic_unmask_irq(nmi_virq);
> +		mpic_unmask_irq(irq_get_irq_data(nmi_virq));
>  	}
>  
>  	of_node_put(mpic_node);
> @@ -266,7 +266,7 @@ static int pas_machine_check_handler(struct pt_regs *regs)
>  	if (nmi_virq != NO_IRQ && mpic_get_mcirq() == nmi_virq) {
>  		printk(KERN_ERR "NMI delivered\n");
>  		debugger(regs);
> -		mpic_end_irq(nmi_virq);
> +		mpic_end_irq(irq_get_irq_data(nmi_virq));
>  		goto out;
>  	}
>  
> diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
> index b0c8469..95712f6 100644
> --- a/arch/powerpc/sysdev/mpic.c
> +++ b/arch/powerpc/sysdev/mpic.c
> @@ -611,7 +611,7 @@ static struct mpic *mpic_find(unsigned int irq)
>  	if (irq < NUM_ISA_INTERRUPTS)
>  		return NULL;
>  
> -	return irq_to_desc(irq)->chip_data;
> +	return get_irq_chip_data(irq);
>  }
>  
>  /* Determine if the linux irq is an IPI */
> @@ -636,16 +636,16 @@ static inline u32 mpic_physmask(u32 cpumask)
>  
>  #ifdef CONFIG_SMP
>  /* Get the mpic structure from the IPI number */
> -static inline struct mpic * mpic_from_ipi(unsigned int ipi)
> +static inline struct mpic * mpic_from_ipi(struct irq_data *d)
>  {
> -	return irq_to_desc(ipi)->chip_data;
> +	return irq_data_get_irq_chip_data(d);
>  }
>  #endif
>  
>  /* Get the mpic structure from the irq number */
>  static inline struct mpic * mpic_from_irq(unsigned int irq)
>  {
> -	return irq_to_desc(irq)->chip_data;
> +	return get_irq_chip_data(irq);
>  }
>  
>  /* Send an EOI */
> @@ -660,13 +660,13 @@ static inline void mpic_eoi(struct mpic *mpic)
>   */
>  
>  
> -void mpic_unmask_irq(unsigned int irq)
> +void mpic_unmask_irq(struct irq_data *d)
>  {
>  	unsigned int loops = 100000;
> -	struct mpic *mpic = mpic_from_irq(irq);
> -	unsigned int src = mpic_irq_to_hw(irq);
> +	struct mpic *mpic = mpic_from_irq(d->irq);
> +	unsigned int src = mpic_irq_to_hw(d->irq);
>  
> -	DBG("%p: %s: enable_irq: %d (src %d)\n", mpic, mpic->name, irq, src);
> +	DBG("%p: %s: enable_irq: %d (src %d)\n", mpic, mpic->name, d->irq, src);
>  
>  	mpic_irq_write(src, MPIC_INFO(IRQ_VECTOR_PRI),
>  		       mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) &
> @@ -681,13 +681,13 @@ void mpic_unmask_irq(unsigned int irq)
>  	} while(mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) & MPIC_VECPRI_MASK);
>  }
>  
> -void mpic_mask_irq(unsigned int irq)
> +void mpic_mask_irq(struct irq_data *d)
>  {
>  	unsigned int loops = 100000;
> -	struct mpic *mpic = mpic_from_irq(irq);
> -	unsigned int src = mpic_irq_to_hw(irq);
> +	struct mpic *mpic = mpic_from_irq(d->irq);
> +	unsigned int src = mpic_irq_to_hw(d->irq);
>  
> -	DBG("%s: disable_irq: %d (src %d)\n", mpic->name, irq, src);
> +	DBG("%s: disable_irq: %d (src %d)\n", mpic->name, d->irq, src);
>  
>  	mpic_irq_write(src, MPIC_INFO(IRQ_VECTOR_PRI),
>  		       mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) |
> @@ -703,12 +703,12 @@ void mpic_mask_irq(unsigned int irq)
>  	} while(!(mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) & MPIC_VECPRI_MASK));
>  }
>  
> -void mpic_end_irq(unsigned int irq)
> +void mpic_end_irq(struct irq_data *d)
>  {
> -	struct mpic *mpic = mpic_from_irq(irq);
> +	struct mpic *mpic = mpic_from_irq(d->irq);
>  
>  #ifdef DEBUG_IRQ
> -	DBG("%s: end_irq: %d\n", mpic->name, irq);
> +	DBG("%s: end_irq: %d\n", mpic->name, d->irq);
>  #endif
>  	/* We always EOI on end_irq() even for edge interrupts since that
>  	 * should only lower the priority, the MPIC should have properly
> @@ -720,51 +720,51 @@ void mpic_end_irq(unsigned int irq)
>  
>  #ifdef CONFIG_MPIC_U3_HT_IRQS
>  
> -static void mpic_unmask_ht_irq(unsigned int irq)
> +static void mpic_unmask_ht_irq(struct irq_data *d)
>  {
> -	struct mpic *mpic = mpic_from_irq(irq);
> -	unsigned int src = mpic_irq_to_hw(irq);
> +	struct mpic *mpic = mpic_from_irq(d->irq);
> +	unsigned int src = mpic_irq_to_hw(d->irq);
>  
> -	mpic_unmask_irq(irq);
> +	mpic_unmask_irq(d);
>  
> -	if (irq_to_desc(irq)->status & IRQ_LEVEL)
> +	if (irq_to_desc(d->irq)->status & IRQ_LEVEL)
>  		mpic_ht_end_irq(mpic, src);
>  }
>  
> -static unsigned int mpic_startup_ht_irq(unsigned int irq)
> +static unsigned int mpic_startup_ht_irq(struct irq_data *d)
>  {
> -	struct mpic *mpic = mpic_from_irq(irq);
> -	unsigned int src = mpic_irq_to_hw(irq);
> +	struct mpic *mpic = mpic_from_irq(d->irq);
> +	unsigned int src = mpic_irq_to_hw(d->irq);
>  
> -	mpic_unmask_irq(irq);
> -	mpic_startup_ht_interrupt(mpic, src, irq_to_desc(irq)->status);
> +	mpic_unmask_irq(d);
> +	mpic_startup_ht_interrupt(mpic, src, irq_to_desc(d->irq)->status);
>  
>  	return 0;
>  }
>  
> -static void mpic_shutdown_ht_irq(unsigned int irq)
> +static void mpic_shutdown_ht_irq(struct irq_data *d)
>  {
> -	struct mpic *mpic = mpic_from_irq(irq);
> -	unsigned int src = mpic_irq_to_hw(irq);
> +	struct mpic *mpic = mpic_from_irq(d->irq);
> +	unsigned int src = mpic_irq_to_hw(d->irq);
>  
> -	mpic_shutdown_ht_interrupt(mpic, src, irq_to_desc(irq)->status);
> -	mpic_mask_irq(irq);
> +	mpic_shutdown_ht_interrupt(mpic, src, irq_to_desc(d->irq)->status);
> +	mpic_mask_irq(d);
>  }
>  
> -static void mpic_end_ht_irq(unsigned int irq)
> +static void mpic_end_ht_irq(struct irq_data *d)
>  {
> -	struct mpic *mpic = mpic_from_irq(irq);
> -	unsigned int src = mpic_irq_to_hw(irq);
> +	struct mpic *mpic = mpic_from_irq(d->irq);
> +	unsigned int src = mpic_irq_to_hw(d->irq);
>  
>  #ifdef DEBUG_IRQ
> -	DBG("%s: end_irq: %d\n", mpic->name, irq);
> +	DBG("%s: end_irq: %d\n", mpic->name, d->irq);
>  #endif
>  	/* We always EOI on end_irq() even for edge interrupts since that
>  	 * should only lower the priority, the MPIC should have properly
>  	 * latched another edge interrupt coming in anyway
>  	 */
>  
> -	if (irq_to_desc(irq)->status & IRQ_LEVEL)
> +	if (irq_to_desc(d->irq)->status & IRQ_LEVEL)
>  		mpic_ht_end_irq(mpic, src);
>  	mpic_eoi(mpic);
>  }
> @@ -772,23 +772,23 @@ static void mpic_end_ht_irq(unsigned int irq)
>  
>  #ifdef CONFIG_SMP
>  
> -static void mpic_unmask_ipi(unsigned int irq)
> +static void mpic_unmask_ipi(struct irq_data *d)
>  {
> -	struct mpic *mpic = mpic_from_ipi(irq);
> -	unsigned int src = mpic_irq_to_hw(irq) - mpic->ipi_vecs[0];
> +	struct mpic *mpic = mpic_from_ipi(d);
> +	unsigned int src = mpic_irq_to_hw(d->irq) - mpic->ipi_vecs[0];
>  
> -	DBG("%s: enable_ipi: %d (ipi %d)\n", mpic->name, irq, src);
> +	DBG("%s: enable_ipi: %d (ipi %d)\n", mpic->name, d->irq, src);
>  	mpic_ipi_write(src, mpic_ipi_read(src) & ~MPIC_VECPRI_MASK);
>  }
>  
> -static void mpic_mask_ipi(unsigned int irq)
> +static void mpic_mask_ipi(struct irq_data *d)
>  {
>  	/* NEVER disable an IPI... that's just plain wrong! */
>  }
>  
> -static void mpic_end_ipi(unsigned int irq)
> +static void mpic_end_ipi(struct irq_data *d)
>  {
> -	struct mpic *mpic = mpic_from_ipi(irq);
> +	struct mpic *mpic = mpic_from_ipi(d);
>  
>  	/*
>  	 * IPIs are marked IRQ_PER_CPU. This has the side effect of
> @@ -802,10 +802,11 @@ static void mpic_end_ipi(unsigned int irq)
>  
>  #endif /* CONFIG_SMP */
>  
> -int mpic_set_affinity(unsigned int irq, const struct cpumask *cpumask)
> +int mpic_set_affinity(struct irq_data *d, const struct cpumask *cpumask,
> +		      bool force)
>  {
> -	struct mpic *mpic = mpic_from_irq(irq);
> -	unsigned int src = mpic_irq_to_hw(irq);
> +	struct mpic *mpic = mpic_from_irq(d->irq);
> +	unsigned int src = mpic_irq_to_hw(d->irq);
>  
>  	if (mpic->flags & MPIC_SINGLE_DEST_CPU) {
>  		int cpuid = irq_choose_cpu(cpumask);
> @@ -848,15 +849,15 @@ static unsigned int mpic_type_to_vecpri(struct mpic *mpic, unsigned int type)
>  	}
>  }
>  
> -int mpic_set_irq_type(unsigned int virq, unsigned int flow_type)
> +int mpic_set_irq_type(struct irq_data *d, unsigned int flow_type)
>  {
> -	struct mpic *mpic = mpic_from_irq(virq);
> -	unsigned int src = mpic_irq_to_hw(virq);
> -	struct irq_desc *desc = irq_to_desc(virq);
> +	struct mpic *mpic = mpic_from_irq(d->irq);
> +	unsigned int src = mpic_irq_to_hw(d->irq);
> +	struct irq_desc *desc = irq_to_desc(d->irq);
>  	unsigned int vecpri, vold, vnew;
>  
>  	DBG("mpic: set_irq_type(mpic:@%p,virq:%d,src:0x%x,type:0x%x)\n",
> -	    mpic, virq, src, flow_type);
> +	    mpic, d->irq, src, flow_type);
>  
>  	if (src >= mpic->irq_count)
>  		return -EINVAL;
> @@ -907,28 +908,28 @@ void mpic_set_vector(unsigned int virq, unsigned int vector)
>  }
>  
>  static struct irq_chip mpic_irq_chip = {
> -	.mask		= mpic_mask_irq,
> -	.unmask		= mpic_unmask_irq,
> -	.eoi		= mpic_end_irq,
> -	.set_type	= mpic_set_irq_type,
> +	.irq_mask	= mpic_mask_irq,
> +	.irq_unmask	= mpic_unmask_irq,
> +	.irq_eoi	= mpic_end_irq,
> +	.irq_set_type	= mpic_set_irq_type,
>  };
>  
>  #ifdef CONFIG_SMP
>  static struct irq_chip mpic_ipi_chip = {
> -	.mask		= mpic_mask_ipi,
> -	.unmask		= mpic_unmask_ipi,
> -	.eoi		= mpic_end_ipi,
> +	.irq_mask	= mpic_mask_ipi,
> +	.irq_unmask	= mpic_unmask_ipi,
> +	.irq_eoi	= mpic_end_ipi,
>  };
>  #endif /* CONFIG_SMP */
>  
>  #ifdef CONFIG_MPIC_U3_HT_IRQS
>  static struct irq_chip mpic_irq_ht_chip = {
> -	.startup	= mpic_startup_ht_irq,
> -	.shutdown	= mpic_shutdown_ht_irq,
> -	.mask		= mpic_mask_irq,
> -	.unmask		= mpic_unmask_ht_irq,
> -	.eoi		= mpic_end_ht_irq,
> -	.set_type	= mpic_set_irq_type,
> +	.irq_startup	= mpic_startup_ht_irq,
> +	.irq_shutdown	= mpic_shutdown_ht_irq,
> +	.irq_mask	= mpic_mask_irq,
> +	.irq_unmask	= mpic_unmask_ht_irq,
> +	.irq_eoi	= mpic_end_ht_irq,
> +	.irq_set_type	= mpic_set_irq_type,
>  };
>  #endif /* CONFIG_MPIC_U3_HT_IRQS */
>  
> @@ -1060,12 +1061,12 @@ struct mpic * __init mpic_alloc(struct device_node *node,
>  	mpic->hc_irq = mpic_irq_chip;
>  	mpic->hc_irq.name = name;
>  	if (flags & MPIC_PRIMARY)
> -		mpic->hc_irq.set_affinity = mpic_set_affinity;
> +		mpic->hc_irq.irq_set_affinity = mpic_set_affinity;
>  #ifdef CONFIG_MPIC_U3_HT_IRQS
>  	mpic->hc_ht_irq = mpic_irq_ht_chip;
>  	mpic->hc_ht_irq.name = name;
>  	if (flags & MPIC_PRIMARY)
> -		mpic->hc_ht_irq.set_affinity = mpic_set_affinity;
> +		mpic->hc_ht_irq.irq_set_affinity = mpic_set_affinity;
>  #endif /* CONFIG_MPIC_U3_HT_IRQS */
>  
>  #ifdef CONFIG_SMP
> diff --git a/arch/powerpc/sysdev/mpic.h b/arch/powerpc/sysdev/mpic.h
> index e4a6df7..13f3e89 100644
> --- a/arch/powerpc/sysdev/mpic.h
> +++ b/arch/powerpc/sysdev/mpic.h
> @@ -34,9 +34,10 @@ static inline int mpic_pasemi_msi_init(struct mpic *mpic)
>  }
>  #endif
>  
> -extern int mpic_set_irq_type(unsigned int virq, unsigned int flow_type);
> +extern int mpic_set_irq_type(struct irq_data *d, unsigned int flow_type);
>  extern void mpic_set_vector(unsigned int virq, unsigned int vector);
> -extern int mpic_set_affinity(unsigned int irq, const struct cpumask *cpumask);
> +extern int mpic_set_affinity(struct irq_data *d,
> +			     const struct cpumask *cpumask, bool force);
>  extern void mpic_reset_core(int cpu);
>  
>  #endif /* _POWERPC_SYSDEV_MPIC_H */
> diff --git a/arch/powerpc/sysdev/mpic_pasemi_msi.c b/arch/powerpc/sysdev/mpic_pasemi_msi.c
> index 320ad5a..0b7794a 100644
> --- a/arch/powerpc/sysdev/mpic_pasemi_msi.c
> +++ b/arch/powerpc/sysdev/mpic_pasemi_msi.c
> @@ -43,24 +43,24 @@ static void mpic_pasemi_msi_mask_irq(struct irq_data *data)
>  {
>  	pr_debug("mpic_pasemi_msi_mask_irq %d\n", data->irq);
>  	mask_msi_irq(data);
> -	mpic_mask_irq(data->irq);
> +	mpic_mask_irq(data);
>  }
>  
>  static void mpic_pasemi_msi_unmask_irq(struct irq_data *data)
>  {
>  	pr_debug("mpic_pasemi_msi_unmask_irq %d\n", data->irq);
> -	mpic_unmask_irq(data->irq);
> +	mpic_unmask_irq(data);
>  	unmask_msi_irq(data);
>  }
>  
>  static struct irq_chip mpic_pasemi_msi_chip = {
> -	.irq_shutdown	= mpic_pasemi_msi_mask_irq,
> -	.irq_mask	= mpic_pasemi_msi_mask_irq,
> -	.irq_unmask	= mpic_pasemi_msi_unmask_irq,
> -	.eoi		= mpic_end_irq,
> -	.set_type	= mpic_set_irq_type,
> -	.set_affinity	= mpic_set_affinity,
> -	.name		= "PASEMI-MSI",
> +	.irq_shutdown		= mpic_pasemi_msi_mask_irq,
> +	.irq_mask		= mpic_pasemi_msi_mask_irq,
> +	.irq_unmask		= mpic_pasemi_msi_unmask_irq,
> +	.irq_eoi		= mpic_end_irq,
> +	.irq_set_type		= mpic_set_irq_type,
> +	.irq_set_affinity	= mpic_set_affinity,
> +	.name			= "PASEMI-MSI",
>  };
>  
>  static int pasemi_msi_check_device(struct pci_dev *pdev, int nvec, int type)
> diff --git a/arch/powerpc/sysdev/mpic_u3msi.c b/arch/powerpc/sysdev/mpic_u3msi.c
> index a2b028b..71900ac 100644
> --- a/arch/powerpc/sysdev/mpic_u3msi.c
> +++ b/arch/powerpc/sysdev/mpic_u3msi.c
> @@ -26,23 +26,23 @@ static struct mpic *msi_mpic;
>  static void mpic_u3msi_mask_irq(struct irq_data *data)
>  {
>  	mask_msi_irq(data);
> -	mpic_mask_irq(data->irq);
> +	mpic_mask_irq(data);
>  }
>  
>  static void mpic_u3msi_unmask_irq(struct irq_data *data)
>  {
> -	mpic_unmask_irq(data->irq);
> +	mpic_unmask_irq(data);
>  	unmask_msi_irq(data);
>  }
>  
>  static struct irq_chip mpic_u3msi_chip = {
> -	.irq_shutdown	= mpic_u3msi_mask_irq,
> -	.irq_mask	= mpic_u3msi_mask_irq,
> -	.irq_unmask	= mpic_u3msi_unmask_irq,
> -	.eoi		= mpic_end_irq,
> -	.set_type	= mpic_set_irq_type,
> -	.set_affinity	= mpic_set_affinity,
> -	.name		= "MPIC-U3MSI",
> +	.irq_shutdown		= mpic_u3msi_mask_irq,
> +	.irq_mask		= mpic_u3msi_mask_irq,
> +	.irq_unmask		= mpic_u3msi_unmask_irq,
> +	.irq_eoi		= mpic_end_irq,
> +	.irq_set_type		= mpic_set_irq_type,
> +	.irq_set_affinity	= mpic_set_affinity,
> +	.name			= "MPIC-U3MSI",
>  };
>  
>  static u64 read_ht_magic_addr(struct pci_dev *pdev, unsigned int pos)
> -- 
> 1.7.4
> 
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev
Benjamin Herrenschmidt - March 8, 2011, 4:51 a.m.
On Mon, 2011-03-07 at 21:13 -0700, Grant Likely wrote:
> On Tue, Mar 08, 2011 at 12:59:02AM +0100, Lennert Buytenhek wrote:
> > Signed-off-by: Lennert Buytenhek <buytenh@secretlab.ca>
> 
> Hi Lennert,
> 
> I'm taking a look over now and running some build testing.
> 
> However, this needs a wider audience for review before it gets merged.
> Can you please repost and cc: benh, sfr, tglx, and linux-kernel?

No need to re-CC me. I have picked it up from the list and it's on
patchwork.

If Thomas is interested, he can look at patchwork I suppose :-)

Cheers,
Ben.

> Thanks,
> g.
> 
> > ---
> >  arch/powerpc/include/asm/mpic.h       |    6 +-
> >  arch/powerpc/platforms/pasemi/setup.c |    4 +-
> >  arch/powerpc/sysdev/mpic.c            |  131 +++++++++++++++++----------------
> >  arch/powerpc/sysdev/mpic.h            |    5 +-
> >  arch/powerpc/sysdev/mpic_pasemi_msi.c |   18 ++--
> >  arch/powerpc/sysdev/mpic_u3msi.c      |   18 ++--
> >  6 files changed, 92 insertions(+), 90 deletions(-)
> > 
> > diff --git a/arch/powerpc/include/asm/mpic.h b/arch/powerpc/include/asm/mpic.h
> > index e000cce..946ec49 100644
> > --- a/arch/powerpc/include/asm/mpic.h
> > +++ b/arch/powerpc/include/asm/mpic.h
> > @@ -467,11 +467,11 @@ extern void mpic_request_ipis(void);
> >  void smp_mpic_message_pass(int target, int msg);
> >  
> >  /* Unmask a specific virq */
> > -extern void mpic_unmask_irq(unsigned int irq);
> > +extern void mpic_unmask_irq(struct irq_data *d);
> >  /* Mask a specific virq */
> > -extern void mpic_mask_irq(unsigned int irq);
> > +extern void mpic_mask_irq(struct irq_data *d);
> >  /* EOI a specific virq */
> > -extern void mpic_end_irq(unsigned int irq);
> > +extern void mpic_end_irq(struct irq_data *d);
> >  
> >  /* Fetch interrupt from a given mpic */
> >  extern unsigned int mpic_get_one_irq(struct mpic *mpic);
> > diff --git a/arch/powerpc/platforms/pasemi/setup.c b/arch/powerpc/platforms/pasemi/setup.c
> > index f372ec1..a6067b3 100644
> > --- a/arch/powerpc/platforms/pasemi/setup.c
> > +++ b/arch/powerpc/platforms/pasemi/setup.c
> > @@ -240,7 +240,7 @@ static __init void pas_init_IRQ(void)
> >  		nmi_virq = irq_create_mapping(NULL, *nmiprop);
> >  		mpic_irq_set_priority(nmi_virq, 15);
> >  		set_irq_type(nmi_virq, IRQ_TYPE_EDGE_RISING);
> > -		mpic_unmask_irq(nmi_virq);
> > +		mpic_unmask_irq(irq_get_irq_data(nmi_virq));
> >  	}
> >  
> >  	of_node_put(mpic_node);
> > @@ -266,7 +266,7 @@ static int pas_machine_check_handler(struct pt_regs *regs)
> >  	if (nmi_virq != NO_IRQ && mpic_get_mcirq() == nmi_virq) {
> >  		printk(KERN_ERR "NMI delivered\n");
> >  		debugger(regs);
> > -		mpic_end_irq(nmi_virq);
> > +		mpic_end_irq(irq_get_irq_data(nmi_virq));
> >  		goto out;
> >  	}
> >  
> > diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
> > index b0c8469..95712f6 100644
> > --- a/arch/powerpc/sysdev/mpic.c
> > +++ b/arch/powerpc/sysdev/mpic.c
> > @@ -611,7 +611,7 @@ static struct mpic *mpic_find(unsigned int irq)
> >  	if (irq < NUM_ISA_INTERRUPTS)
> >  		return NULL;
> >  
> > -	return irq_to_desc(irq)->chip_data;
> > +	return get_irq_chip_data(irq);
> >  }
> >  
> >  /* Determine if the linux irq is an IPI */
> > @@ -636,16 +636,16 @@ static inline u32 mpic_physmask(u32 cpumask)
> >  
> >  #ifdef CONFIG_SMP
> >  /* Get the mpic structure from the IPI number */
> > -static inline struct mpic * mpic_from_ipi(unsigned int ipi)
> > +static inline struct mpic * mpic_from_ipi(struct irq_data *d)
> >  {
> > -	return irq_to_desc(ipi)->chip_data;
> > +	return irq_data_get_irq_chip_data(d);
> >  }
> >  #endif
> >  
> >  /* Get the mpic structure from the irq number */
> >  static inline struct mpic * mpic_from_irq(unsigned int irq)
> >  {
> > -	return irq_to_desc(irq)->chip_data;
> > +	return get_irq_chip_data(irq);
> >  }
> >  
> >  /* Send an EOI */
> > @@ -660,13 +660,13 @@ static inline void mpic_eoi(struct mpic *mpic)
> >   */
> >  
> >  
> > -void mpic_unmask_irq(unsigned int irq)
> > +void mpic_unmask_irq(struct irq_data *d)
> >  {
> >  	unsigned int loops = 100000;
> > -	struct mpic *mpic = mpic_from_irq(irq);
> > -	unsigned int src = mpic_irq_to_hw(irq);
> > +	struct mpic *mpic = mpic_from_irq(d->irq);
> > +	unsigned int src = mpic_irq_to_hw(d->irq);
> >  
> > -	DBG("%p: %s: enable_irq: %d (src %d)\n", mpic, mpic->name, irq, src);
> > +	DBG("%p: %s: enable_irq: %d (src %d)\n", mpic, mpic->name, d->irq, src);
> >  
> >  	mpic_irq_write(src, MPIC_INFO(IRQ_VECTOR_PRI),
> >  		       mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) &
> > @@ -681,13 +681,13 @@ void mpic_unmask_irq(unsigned int irq)
> >  	} while(mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) & MPIC_VECPRI_MASK);
> >  }
> >  
> > -void mpic_mask_irq(unsigned int irq)
> > +void mpic_mask_irq(struct irq_data *d)
> >  {
> >  	unsigned int loops = 100000;
> > -	struct mpic *mpic = mpic_from_irq(irq);
> > -	unsigned int src = mpic_irq_to_hw(irq);
> > +	struct mpic *mpic = mpic_from_irq(d->irq);
> > +	unsigned int src = mpic_irq_to_hw(d->irq);
> >  
> > -	DBG("%s: disable_irq: %d (src %d)\n", mpic->name, irq, src);
> > +	DBG("%s: disable_irq: %d (src %d)\n", mpic->name, d->irq, src);
> >  
> >  	mpic_irq_write(src, MPIC_INFO(IRQ_VECTOR_PRI),
> >  		       mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) |
> > @@ -703,12 +703,12 @@ void mpic_mask_irq(unsigned int irq)
> >  	} while(!(mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) & MPIC_VECPRI_MASK));
> >  }
> >  
> > -void mpic_end_irq(unsigned int irq)
> > +void mpic_end_irq(struct irq_data *d)
> >  {
> > -	struct mpic *mpic = mpic_from_irq(irq);
> > +	struct mpic *mpic = mpic_from_irq(d->irq);
> >  
> >  #ifdef DEBUG_IRQ
> > -	DBG("%s: end_irq: %d\n", mpic->name, irq);
> > +	DBG("%s: end_irq: %d\n", mpic->name, d->irq);
> >  #endif
> >  	/* We always EOI on end_irq() even for edge interrupts since that
> >  	 * should only lower the priority, the MPIC should have properly
> > @@ -720,51 +720,51 @@ void mpic_end_irq(unsigned int irq)
> >  
> >  #ifdef CONFIG_MPIC_U3_HT_IRQS
> >  
> > -static void mpic_unmask_ht_irq(unsigned int irq)
> > +static void mpic_unmask_ht_irq(struct irq_data *d)
> >  {
> > -	struct mpic *mpic = mpic_from_irq(irq);
> > -	unsigned int src = mpic_irq_to_hw(irq);
> > +	struct mpic *mpic = mpic_from_irq(d->irq);
> > +	unsigned int src = mpic_irq_to_hw(d->irq);
> >  
> > -	mpic_unmask_irq(irq);
> > +	mpic_unmask_irq(d);
> >  
> > -	if (irq_to_desc(irq)->status & IRQ_LEVEL)
> > +	if (irq_to_desc(d->irq)->status & IRQ_LEVEL)
> >  		mpic_ht_end_irq(mpic, src);
> >  }
> >  
> > -static unsigned int mpic_startup_ht_irq(unsigned int irq)
> > +static unsigned int mpic_startup_ht_irq(struct irq_data *d)
> >  {
> > -	struct mpic *mpic = mpic_from_irq(irq);
> > -	unsigned int src = mpic_irq_to_hw(irq);
> > +	struct mpic *mpic = mpic_from_irq(d->irq);
> > +	unsigned int src = mpic_irq_to_hw(d->irq);
> >  
> > -	mpic_unmask_irq(irq);
> > -	mpic_startup_ht_interrupt(mpic, src, irq_to_desc(irq)->status);
> > +	mpic_unmask_irq(d);
> > +	mpic_startup_ht_interrupt(mpic, src, irq_to_desc(d->irq)->status);
> >  
> >  	return 0;
> >  }
> >  
> > -static void mpic_shutdown_ht_irq(unsigned int irq)
> > +static void mpic_shutdown_ht_irq(struct irq_data *d)
> >  {
> > -	struct mpic *mpic = mpic_from_irq(irq);
> > -	unsigned int src = mpic_irq_to_hw(irq);
> > +	struct mpic *mpic = mpic_from_irq(d->irq);
> > +	unsigned int src = mpic_irq_to_hw(d->irq);
> >  
> > -	mpic_shutdown_ht_interrupt(mpic, src, irq_to_desc(irq)->status);
> > -	mpic_mask_irq(irq);
> > +	mpic_shutdown_ht_interrupt(mpic, src, irq_to_desc(d->irq)->status);
> > +	mpic_mask_irq(d);
> >  }
> >  
> > -static void mpic_end_ht_irq(unsigned int irq)
> > +static void mpic_end_ht_irq(struct irq_data *d)
> >  {
> > -	struct mpic *mpic = mpic_from_irq(irq);
> > -	unsigned int src = mpic_irq_to_hw(irq);
> > +	struct mpic *mpic = mpic_from_irq(d->irq);
> > +	unsigned int src = mpic_irq_to_hw(d->irq);
> >  
> >  #ifdef DEBUG_IRQ
> > -	DBG("%s: end_irq: %d\n", mpic->name, irq);
> > +	DBG("%s: end_irq: %d\n", mpic->name, d->irq);
> >  #endif
> >  	/* We always EOI on end_irq() even for edge interrupts since that
> >  	 * should only lower the priority, the MPIC should have properly
> >  	 * latched another edge interrupt coming in anyway
> >  	 */
> >  
> > -	if (irq_to_desc(irq)->status & IRQ_LEVEL)
> > +	if (irq_to_desc(d->irq)->status & IRQ_LEVEL)
> >  		mpic_ht_end_irq(mpic, src);
> >  	mpic_eoi(mpic);
> >  }
> > @@ -772,23 +772,23 @@ static void mpic_end_ht_irq(unsigned int irq)
> >  
> >  #ifdef CONFIG_SMP
> >  
> > -static void mpic_unmask_ipi(unsigned int irq)
> > +static void mpic_unmask_ipi(struct irq_data *d)
> >  {
> > -	struct mpic *mpic = mpic_from_ipi(irq);
> > -	unsigned int src = mpic_irq_to_hw(irq) - mpic->ipi_vecs[0];
> > +	struct mpic *mpic = mpic_from_ipi(d);
> > +	unsigned int src = mpic_irq_to_hw(d->irq) - mpic->ipi_vecs[0];
> >  
> > -	DBG("%s: enable_ipi: %d (ipi %d)\n", mpic->name, irq, src);
> > +	DBG("%s: enable_ipi: %d (ipi %d)\n", mpic->name, d->irq, src);
> >  	mpic_ipi_write(src, mpic_ipi_read(src) & ~MPIC_VECPRI_MASK);
> >  }
> >  
> > -static void mpic_mask_ipi(unsigned int irq)
> > +static void mpic_mask_ipi(struct irq_data *d)
> >  {
> >  	/* NEVER disable an IPI... that's just plain wrong! */
> >  }
> >  
> > -static void mpic_end_ipi(unsigned int irq)
> > +static void mpic_end_ipi(struct irq_data *d)
> >  {
> > -	struct mpic *mpic = mpic_from_ipi(irq);
> > +	struct mpic *mpic = mpic_from_ipi(d);
> >  
> >  	/*
> >  	 * IPIs are marked IRQ_PER_CPU. This has the side effect of
> > @@ -802,10 +802,11 @@ static void mpic_end_ipi(unsigned int irq)
> >  
> >  #endif /* CONFIG_SMP */
> >  
> > -int mpic_set_affinity(unsigned int irq, const struct cpumask *cpumask)
> > +int mpic_set_affinity(struct irq_data *d, const struct cpumask *cpumask,
> > +		      bool force)
> >  {
> > -	struct mpic *mpic = mpic_from_irq(irq);
> > -	unsigned int src = mpic_irq_to_hw(irq);
> > +	struct mpic *mpic = mpic_from_irq(d->irq);
> > +	unsigned int src = mpic_irq_to_hw(d->irq);
> >  
> >  	if (mpic->flags & MPIC_SINGLE_DEST_CPU) {
> >  		int cpuid = irq_choose_cpu(cpumask);
> > @@ -848,15 +849,15 @@ static unsigned int mpic_type_to_vecpri(struct mpic *mpic, unsigned int type)
> >  	}
> >  }
> >  
> > -int mpic_set_irq_type(unsigned int virq, unsigned int flow_type)
> > +int mpic_set_irq_type(struct irq_data *d, unsigned int flow_type)
> >  {
> > -	struct mpic *mpic = mpic_from_irq(virq);
> > -	unsigned int src = mpic_irq_to_hw(virq);
> > -	struct irq_desc *desc = irq_to_desc(virq);
> > +	struct mpic *mpic = mpic_from_irq(d->irq);
> > +	unsigned int src = mpic_irq_to_hw(d->irq);
> > +	struct irq_desc *desc = irq_to_desc(d->irq);
> >  	unsigned int vecpri, vold, vnew;
> >  
> >  	DBG("mpic: set_irq_type(mpic:@%p,virq:%d,src:0x%x,type:0x%x)\n",
> > -	    mpic, virq, src, flow_type);
> > +	    mpic, d->irq, src, flow_type);
> >  
> >  	if (src >= mpic->irq_count)
> >  		return -EINVAL;
> > @@ -907,28 +908,28 @@ void mpic_set_vector(unsigned int virq, unsigned int vector)
> >  }
> >  
> >  static struct irq_chip mpic_irq_chip = {
> > -	.mask		= mpic_mask_irq,
> > -	.unmask		= mpic_unmask_irq,
> > -	.eoi		= mpic_end_irq,
> > -	.set_type	= mpic_set_irq_type,
> > +	.irq_mask	= mpic_mask_irq,
> > +	.irq_unmask	= mpic_unmask_irq,
> > +	.irq_eoi	= mpic_end_irq,
> > +	.irq_set_type	= mpic_set_irq_type,
> >  };
> >  
> >  #ifdef CONFIG_SMP
> >  static struct irq_chip mpic_ipi_chip = {
> > -	.mask		= mpic_mask_ipi,
> > -	.unmask		= mpic_unmask_ipi,
> > -	.eoi		= mpic_end_ipi,
> > +	.irq_mask	= mpic_mask_ipi,
> > +	.irq_unmask	= mpic_unmask_ipi,
> > +	.irq_eoi	= mpic_end_ipi,
> >  };
> >  #endif /* CONFIG_SMP */
> >  
> >  #ifdef CONFIG_MPIC_U3_HT_IRQS
> >  static struct irq_chip mpic_irq_ht_chip = {
> > -	.startup	= mpic_startup_ht_irq,
> > -	.shutdown	= mpic_shutdown_ht_irq,
> > -	.mask		= mpic_mask_irq,
> > -	.unmask		= mpic_unmask_ht_irq,
> > -	.eoi		= mpic_end_ht_irq,
> > -	.set_type	= mpic_set_irq_type,
> > +	.irq_startup	= mpic_startup_ht_irq,
> > +	.irq_shutdown	= mpic_shutdown_ht_irq,
> > +	.irq_mask	= mpic_mask_irq,
> > +	.irq_unmask	= mpic_unmask_ht_irq,
> > +	.irq_eoi	= mpic_end_ht_irq,
> > +	.irq_set_type	= mpic_set_irq_type,
> >  };
> >  #endif /* CONFIG_MPIC_U3_HT_IRQS */
> >  
> > @@ -1060,12 +1061,12 @@ struct mpic * __init mpic_alloc(struct device_node *node,
> >  	mpic->hc_irq = mpic_irq_chip;
> >  	mpic->hc_irq.name = name;
> >  	if (flags & MPIC_PRIMARY)
> > -		mpic->hc_irq.set_affinity = mpic_set_affinity;
> > +		mpic->hc_irq.irq_set_affinity = mpic_set_affinity;
> >  #ifdef CONFIG_MPIC_U3_HT_IRQS
> >  	mpic->hc_ht_irq = mpic_irq_ht_chip;
> >  	mpic->hc_ht_irq.name = name;
> >  	if (flags & MPIC_PRIMARY)
> > -		mpic->hc_ht_irq.set_affinity = mpic_set_affinity;
> > +		mpic->hc_ht_irq.irq_set_affinity = mpic_set_affinity;
> >  #endif /* CONFIG_MPIC_U3_HT_IRQS */
> >  
> >  #ifdef CONFIG_SMP
> > diff --git a/arch/powerpc/sysdev/mpic.h b/arch/powerpc/sysdev/mpic.h
> > index e4a6df7..13f3e89 100644
> > --- a/arch/powerpc/sysdev/mpic.h
> > +++ b/arch/powerpc/sysdev/mpic.h
> > @@ -34,9 +34,10 @@ static inline int mpic_pasemi_msi_init(struct mpic *mpic)
> >  }
> >  #endif
> >  
> > -extern int mpic_set_irq_type(unsigned int virq, unsigned int flow_type);
> > +extern int mpic_set_irq_type(struct irq_data *d, unsigned int flow_type);
> >  extern void mpic_set_vector(unsigned int virq, unsigned int vector);
> > -extern int mpic_set_affinity(unsigned int irq, const struct cpumask *cpumask);
> > +extern int mpic_set_affinity(struct irq_data *d,
> > +			     const struct cpumask *cpumask, bool force);
> >  extern void mpic_reset_core(int cpu);
> >  
> >  #endif /* _POWERPC_SYSDEV_MPIC_H */
> > diff --git a/arch/powerpc/sysdev/mpic_pasemi_msi.c b/arch/powerpc/sysdev/mpic_pasemi_msi.c
> > index 320ad5a..0b7794a 100644
> > --- a/arch/powerpc/sysdev/mpic_pasemi_msi.c
> > +++ b/arch/powerpc/sysdev/mpic_pasemi_msi.c
> > @@ -43,24 +43,24 @@ static void mpic_pasemi_msi_mask_irq(struct irq_data *data)
> >  {
> >  	pr_debug("mpic_pasemi_msi_mask_irq %d\n", data->irq);
> >  	mask_msi_irq(data);
> > -	mpic_mask_irq(data->irq);
> > +	mpic_mask_irq(data);
> >  }
> >  
> >  static void mpic_pasemi_msi_unmask_irq(struct irq_data *data)
> >  {
> >  	pr_debug("mpic_pasemi_msi_unmask_irq %d\n", data->irq);
> > -	mpic_unmask_irq(data->irq);
> > +	mpic_unmask_irq(data);
> >  	unmask_msi_irq(data);
> >  }
> >  
> >  static struct irq_chip mpic_pasemi_msi_chip = {
> > -	.irq_shutdown	= mpic_pasemi_msi_mask_irq,
> > -	.irq_mask	= mpic_pasemi_msi_mask_irq,
> > -	.irq_unmask	= mpic_pasemi_msi_unmask_irq,
> > -	.eoi		= mpic_end_irq,
> > -	.set_type	= mpic_set_irq_type,
> > -	.set_affinity	= mpic_set_affinity,
> > -	.name		= "PASEMI-MSI",
> > +	.irq_shutdown		= mpic_pasemi_msi_mask_irq,
> > +	.irq_mask		= mpic_pasemi_msi_mask_irq,
> > +	.irq_unmask		= mpic_pasemi_msi_unmask_irq,
> > +	.irq_eoi		= mpic_end_irq,
> > +	.irq_set_type		= mpic_set_irq_type,
> > +	.irq_set_affinity	= mpic_set_affinity,
> > +	.name			= "PASEMI-MSI",
> >  };
> >  
> >  static int pasemi_msi_check_device(struct pci_dev *pdev, int nvec, int type)
> > diff --git a/arch/powerpc/sysdev/mpic_u3msi.c b/arch/powerpc/sysdev/mpic_u3msi.c
> > index a2b028b..71900ac 100644
> > --- a/arch/powerpc/sysdev/mpic_u3msi.c
> > +++ b/arch/powerpc/sysdev/mpic_u3msi.c
> > @@ -26,23 +26,23 @@ static struct mpic *msi_mpic;
> >  static void mpic_u3msi_mask_irq(struct irq_data *data)
> >  {
> >  	mask_msi_irq(data);
> > -	mpic_mask_irq(data->irq);
> > +	mpic_mask_irq(data);
> >  }
> >  
> >  static void mpic_u3msi_unmask_irq(struct irq_data *data)
> >  {
> > -	mpic_unmask_irq(data->irq);
> > +	mpic_unmask_irq(data);
> >  	unmask_msi_irq(data);
> >  }
> >  
> >  static struct irq_chip mpic_u3msi_chip = {
> > -	.irq_shutdown	= mpic_u3msi_mask_irq,
> > -	.irq_mask	= mpic_u3msi_mask_irq,
> > -	.irq_unmask	= mpic_u3msi_unmask_irq,
> > -	.eoi		= mpic_end_irq,
> > -	.set_type	= mpic_set_irq_type,
> > -	.set_affinity	= mpic_set_affinity,
> > -	.name		= "MPIC-U3MSI",
> > +	.irq_shutdown		= mpic_u3msi_mask_irq,
> > +	.irq_mask		= mpic_u3msi_mask_irq,
> > +	.irq_unmask		= mpic_u3msi_unmask_irq,
> > +	.irq_eoi		= mpic_end_irq,
> > +	.irq_set_type		= mpic_set_irq_type,
> > +	.irq_set_affinity	= mpic_set_affinity,
> > +	.name			= "MPIC-U3MSI",
> >  };
> >  
> >  static u64 read_ht_magic_addr(struct pci_dev *pdev, unsigned int pos)
> > -- 
> > 1.7.4
> > 
> > _______________________________________________
> > Linuxppc-dev mailing list
> > Linuxppc-dev@lists.ozlabs.org
> > https://lists.ozlabs.org/listinfo/linuxppc-dev
Benjamin Herrenschmidt - March 9, 2011, 3:22 a.m.
On Tue, 2011-03-08 at 00:59 +0100, Lennert Buytenhek wrote:

> -static void mpic_unmask_ht_irq(unsigned int irq)
> +static void mpic_unmask_ht_irq(struct irq_data *d)
>  {
> -	struct mpic *mpic = mpic_from_irq(irq);
> -	unsigned int src = mpic_irq_to_hw(irq);
> +	struct mpic *mpic = mpic_from_irq(d->irq);
> +	unsigned int src = mpic_irq_to_hw(d->irq);

It's a bit sad to have a pointerm turn it back to a irq number, look it
up just to get back the chip data in there :-)

Either we should create an mpic_from_irqdata() which itself uses
irq_data_get_irq_chip_data() or just change mpic_from_irq() if we decide
we can always call it with "data" instead of "irq"
 
> -	mpic_unmask_irq(irq);
> +	mpic_unmask_irq(d);
>  
> -	if (irq_to_desc(irq)->status & IRQ_LEVEL)
> +	if (irq_to_desc(d->irq)->status & IRQ_LEVEL)
>  		mpic_ht_end_irq(mpic, src);
>  }

Do we really need that gymnastic to get to desc->status from irq_data ?

Again, we're going back to a number and then looking it up again... bad.

I don't see off hand a data -> desc accessor, but it also looks like it
should be trivial to add. Thomas, what do you reckon ?

> -static unsigned int mpic_startup_ht_irq(unsigned int irq)
> +static unsigned int mpic_startup_ht_irq(struct irq_data *d)
>  {
> -	struct mpic *mpic = mpic_from_irq(irq);
> -	unsigned int src = mpic_irq_to_hw(irq);
> +	struct mpic *mpic = mpic_from_irq(d->irq);
> +	unsigned int src = mpic_irq_to_hw(d->irq);
>  
> -	mpic_unmask_irq(irq);
> -	mpic_startup_ht_interrupt(mpic, src, irq_to_desc(irq)->status);
> +	mpic_unmask_irq(d);
> +	mpic_startup_ht_interrupt(mpic, src, irq_to_desc(d->irq)->status);
>  
>  	return 0;
>  }

Similar.

Cheers,
Ben.

Patch

diff --git a/arch/powerpc/include/asm/mpic.h b/arch/powerpc/include/asm/mpic.h
index e000cce..946ec49 100644
--- a/arch/powerpc/include/asm/mpic.h
+++ b/arch/powerpc/include/asm/mpic.h
@@ -467,11 +467,11 @@  extern void mpic_request_ipis(void);
 void smp_mpic_message_pass(int target, int msg);
 
 /* Unmask a specific virq */
-extern void mpic_unmask_irq(unsigned int irq);
+extern void mpic_unmask_irq(struct irq_data *d);
 /* Mask a specific virq */
-extern void mpic_mask_irq(unsigned int irq);
+extern void mpic_mask_irq(struct irq_data *d);
 /* EOI a specific virq */
-extern void mpic_end_irq(unsigned int irq);
+extern void mpic_end_irq(struct irq_data *d);
 
 /* Fetch interrupt from a given mpic */
 extern unsigned int mpic_get_one_irq(struct mpic *mpic);
diff --git a/arch/powerpc/platforms/pasemi/setup.c b/arch/powerpc/platforms/pasemi/setup.c
index f372ec1..a6067b3 100644
--- a/arch/powerpc/platforms/pasemi/setup.c
+++ b/arch/powerpc/platforms/pasemi/setup.c
@@ -240,7 +240,7 @@  static __init void pas_init_IRQ(void)
 		nmi_virq = irq_create_mapping(NULL, *nmiprop);
 		mpic_irq_set_priority(nmi_virq, 15);
 		set_irq_type(nmi_virq, IRQ_TYPE_EDGE_RISING);
-		mpic_unmask_irq(nmi_virq);
+		mpic_unmask_irq(irq_get_irq_data(nmi_virq));
 	}
 
 	of_node_put(mpic_node);
@@ -266,7 +266,7 @@  static int pas_machine_check_handler(struct pt_regs *regs)
 	if (nmi_virq != NO_IRQ && mpic_get_mcirq() == nmi_virq) {
 		printk(KERN_ERR "NMI delivered\n");
 		debugger(regs);
-		mpic_end_irq(nmi_virq);
+		mpic_end_irq(irq_get_irq_data(nmi_virq));
 		goto out;
 	}
 
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
index b0c8469..95712f6 100644
--- a/arch/powerpc/sysdev/mpic.c
+++ b/arch/powerpc/sysdev/mpic.c
@@ -611,7 +611,7 @@  static struct mpic *mpic_find(unsigned int irq)
 	if (irq < NUM_ISA_INTERRUPTS)
 		return NULL;
 
-	return irq_to_desc(irq)->chip_data;
+	return get_irq_chip_data(irq);
 }
 
 /* Determine if the linux irq is an IPI */
@@ -636,16 +636,16 @@  static inline u32 mpic_physmask(u32 cpumask)
 
 #ifdef CONFIG_SMP
 /* Get the mpic structure from the IPI number */
-static inline struct mpic * mpic_from_ipi(unsigned int ipi)
+static inline struct mpic * mpic_from_ipi(struct irq_data *d)
 {
-	return irq_to_desc(ipi)->chip_data;
+	return irq_data_get_irq_chip_data(d);
 }
 #endif
 
 /* Get the mpic structure from the irq number */
 static inline struct mpic * mpic_from_irq(unsigned int irq)
 {
-	return irq_to_desc(irq)->chip_data;
+	return get_irq_chip_data(irq);
 }
 
 /* Send an EOI */
@@ -660,13 +660,13 @@  static inline void mpic_eoi(struct mpic *mpic)
  */
 
 
-void mpic_unmask_irq(unsigned int irq)
+void mpic_unmask_irq(struct irq_data *d)
 {
 	unsigned int loops = 100000;
-	struct mpic *mpic = mpic_from_irq(irq);
-	unsigned int src = mpic_irq_to_hw(irq);
+	struct mpic *mpic = mpic_from_irq(d->irq);
+	unsigned int src = mpic_irq_to_hw(d->irq);
 
-	DBG("%p: %s: enable_irq: %d (src %d)\n", mpic, mpic->name, irq, src);
+	DBG("%p: %s: enable_irq: %d (src %d)\n", mpic, mpic->name, d->irq, src);
 
 	mpic_irq_write(src, MPIC_INFO(IRQ_VECTOR_PRI),
 		       mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) &
@@ -681,13 +681,13 @@  void mpic_unmask_irq(unsigned int irq)
 	} while(mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) & MPIC_VECPRI_MASK);
 }
 
-void mpic_mask_irq(unsigned int irq)
+void mpic_mask_irq(struct irq_data *d)
 {
 	unsigned int loops = 100000;
-	struct mpic *mpic = mpic_from_irq(irq);
-	unsigned int src = mpic_irq_to_hw(irq);
+	struct mpic *mpic = mpic_from_irq(d->irq);
+	unsigned int src = mpic_irq_to_hw(d->irq);
 
-	DBG("%s: disable_irq: %d (src %d)\n", mpic->name, irq, src);
+	DBG("%s: disable_irq: %d (src %d)\n", mpic->name, d->irq, src);
 
 	mpic_irq_write(src, MPIC_INFO(IRQ_VECTOR_PRI),
 		       mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) |
@@ -703,12 +703,12 @@  void mpic_mask_irq(unsigned int irq)
 	} while(!(mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) & MPIC_VECPRI_MASK));
 }
 
-void mpic_end_irq(unsigned int irq)
+void mpic_end_irq(struct irq_data *d)
 {
-	struct mpic *mpic = mpic_from_irq(irq);
+	struct mpic *mpic = mpic_from_irq(d->irq);
 
 #ifdef DEBUG_IRQ
-	DBG("%s: end_irq: %d\n", mpic->name, irq);
+	DBG("%s: end_irq: %d\n", mpic->name, d->irq);
 #endif
 	/* We always EOI on end_irq() even for edge interrupts since that
 	 * should only lower the priority, the MPIC should have properly
@@ -720,51 +720,51 @@  void mpic_end_irq(unsigned int irq)
 
 #ifdef CONFIG_MPIC_U3_HT_IRQS
 
-static void mpic_unmask_ht_irq(unsigned int irq)
+static void mpic_unmask_ht_irq(struct irq_data *d)
 {
-	struct mpic *mpic = mpic_from_irq(irq);
-	unsigned int src = mpic_irq_to_hw(irq);
+	struct mpic *mpic = mpic_from_irq(d->irq);
+	unsigned int src = mpic_irq_to_hw(d->irq);
 
-	mpic_unmask_irq(irq);
+	mpic_unmask_irq(d);
 
-	if (irq_to_desc(irq)->status & IRQ_LEVEL)
+	if (irq_to_desc(d->irq)->status & IRQ_LEVEL)
 		mpic_ht_end_irq(mpic, src);
 }
 
-static unsigned int mpic_startup_ht_irq(unsigned int irq)
+static unsigned int mpic_startup_ht_irq(struct irq_data *d)
 {
-	struct mpic *mpic = mpic_from_irq(irq);
-	unsigned int src = mpic_irq_to_hw(irq);
+	struct mpic *mpic = mpic_from_irq(d->irq);
+	unsigned int src = mpic_irq_to_hw(d->irq);
 
-	mpic_unmask_irq(irq);
-	mpic_startup_ht_interrupt(mpic, src, irq_to_desc(irq)->status);
+	mpic_unmask_irq(d);
+	mpic_startup_ht_interrupt(mpic, src, irq_to_desc(d->irq)->status);
 
 	return 0;
 }
 
-static void mpic_shutdown_ht_irq(unsigned int irq)
+static void mpic_shutdown_ht_irq(struct irq_data *d)
 {
-	struct mpic *mpic = mpic_from_irq(irq);
-	unsigned int src = mpic_irq_to_hw(irq);
+	struct mpic *mpic = mpic_from_irq(d->irq);
+	unsigned int src = mpic_irq_to_hw(d->irq);
 
-	mpic_shutdown_ht_interrupt(mpic, src, irq_to_desc(irq)->status);
-	mpic_mask_irq(irq);
+	mpic_shutdown_ht_interrupt(mpic, src, irq_to_desc(d->irq)->status);
+	mpic_mask_irq(d);
 }
 
-static void mpic_end_ht_irq(unsigned int irq)
+static void mpic_end_ht_irq(struct irq_data *d)
 {
-	struct mpic *mpic = mpic_from_irq(irq);
-	unsigned int src = mpic_irq_to_hw(irq);
+	struct mpic *mpic = mpic_from_irq(d->irq);
+	unsigned int src = mpic_irq_to_hw(d->irq);
 
 #ifdef DEBUG_IRQ
-	DBG("%s: end_irq: %d\n", mpic->name, irq);
+	DBG("%s: end_irq: %d\n", mpic->name, d->irq);
 #endif
 	/* We always EOI on end_irq() even for edge interrupts since that
 	 * should only lower the priority, the MPIC should have properly
 	 * latched another edge interrupt coming in anyway
 	 */
 
-	if (irq_to_desc(irq)->status & IRQ_LEVEL)
+	if (irq_to_desc(d->irq)->status & IRQ_LEVEL)
 		mpic_ht_end_irq(mpic, src);
 	mpic_eoi(mpic);
 }
@@ -772,23 +772,23 @@  static void mpic_end_ht_irq(unsigned int irq)
 
 #ifdef CONFIG_SMP
 
-static void mpic_unmask_ipi(unsigned int irq)
+static void mpic_unmask_ipi(struct irq_data *d)
 {
-	struct mpic *mpic = mpic_from_ipi(irq);
-	unsigned int src = mpic_irq_to_hw(irq) - mpic->ipi_vecs[0];
+	struct mpic *mpic = mpic_from_ipi(d);
+	unsigned int src = mpic_irq_to_hw(d->irq) - mpic->ipi_vecs[0];
 
-	DBG("%s: enable_ipi: %d (ipi %d)\n", mpic->name, irq, src);
+	DBG("%s: enable_ipi: %d (ipi %d)\n", mpic->name, d->irq, src);
 	mpic_ipi_write(src, mpic_ipi_read(src) & ~MPIC_VECPRI_MASK);
 }
 
-static void mpic_mask_ipi(unsigned int irq)
+static void mpic_mask_ipi(struct irq_data *d)
 {
 	/* NEVER disable an IPI... that's just plain wrong! */
 }
 
-static void mpic_end_ipi(unsigned int irq)
+static void mpic_end_ipi(struct irq_data *d)
 {
-	struct mpic *mpic = mpic_from_ipi(irq);
+	struct mpic *mpic = mpic_from_ipi(d);
 
 	/*
 	 * IPIs are marked IRQ_PER_CPU. This has the side effect of
@@ -802,10 +802,11 @@  static void mpic_end_ipi(unsigned int irq)
 
 #endif /* CONFIG_SMP */
 
-int mpic_set_affinity(unsigned int irq, const struct cpumask *cpumask)
+int mpic_set_affinity(struct irq_data *d, const struct cpumask *cpumask,
+		      bool force)
 {
-	struct mpic *mpic = mpic_from_irq(irq);
-	unsigned int src = mpic_irq_to_hw(irq);
+	struct mpic *mpic = mpic_from_irq(d->irq);
+	unsigned int src = mpic_irq_to_hw(d->irq);
 
 	if (mpic->flags & MPIC_SINGLE_DEST_CPU) {
 		int cpuid = irq_choose_cpu(cpumask);
@@ -848,15 +849,15 @@  static unsigned int mpic_type_to_vecpri(struct mpic *mpic, unsigned int type)
 	}
 }
 
-int mpic_set_irq_type(unsigned int virq, unsigned int flow_type)
+int mpic_set_irq_type(struct irq_data *d, unsigned int flow_type)
 {
-	struct mpic *mpic = mpic_from_irq(virq);
-	unsigned int src = mpic_irq_to_hw(virq);
-	struct irq_desc *desc = irq_to_desc(virq);
+	struct mpic *mpic = mpic_from_irq(d->irq);
+	unsigned int src = mpic_irq_to_hw(d->irq);
+	struct irq_desc *desc = irq_to_desc(d->irq);
 	unsigned int vecpri, vold, vnew;
 
 	DBG("mpic: set_irq_type(mpic:@%p,virq:%d,src:0x%x,type:0x%x)\n",
-	    mpic, virq, src, flow_type);
+	    mpic, d->irq, src, flow_type);
 
 	if (src >= mpic->irq_count)
 		return -EINVAL;
@@ -907,28 +908,28 @@  void mpic_set_vector(unsigned int virq, unsigned int vector)
 }
 
 static struct irq_chip mpic_irq_chip = {
-	.mask		= mpic_mask_irq,
-	.unmask		= mpic_unmask_irq,
-	.eoi		= mpic_end_irq,
-	.set_type	= mpic_set_irq_type,
+	.irq_mask	= mpic_mask_irq,
+	.irq_unmask	= mpic_unmask_irq,
+	.irq_eoi	= mpic_end_irq,
+	.irq_set_type	= mpic_set_irq_type,
 };
 
 #ifdef CONFIG_SMP
 static struct irq_chip mpic_ipi_chip = {
-	.mask		= mpic_mask_ipi,
-	.unmask		= mpic_unmask_ipi,
-	.eoi		= mpic_end_ipi,
+	.irq_mask	= mpic_mask_ipi,
+	.irq_unmask	= mpic_unmask_ipi,
+	.irq_eoi	= mpic_end_ipi,
 };
 #endif /* CONFIG_SMP */
 
 #ifdef CONFIG_MPIC_U3_HT_IRQS
 static struct irq_chip mpic_irq_ht_chip = {
-	.startup	= mpic_startup_ht_irq,
-	.shutdown	= mpic_shutdown_ht_irq,
-	.mask		= mpic_mask_irq,
-	.unmask		= mpic_unmask_ht_irq,
-	.eoi		= mpic_end_ht_irq,
-	.set_type	= mpic_set_irq_type,
+	.irq_startup	= mpic_startup_ht_irq,
+	.irq_shutdown	= mpic_shutdown_ht_irq,
+	.irq_mask	= mpic_mask_irq,
+	.irq_unmask	= mpic_unmask_ht_irq,
+	.irq_eoi	= mpic_end_ht_irq,
+	.irq_set_type	= mpic_set_irq_type,
 };
 #endif /* CONFIG_MPIC_U3_HT_IRQS */
 
@@ -1060,12 +1061,12 @@  struct mpic * __init mpic_alloc(struct device_node *node,
 	mpic->hc_irq = mpic_irq_chip;
 	mpic->hc_irq.name = name;
 	if (flags & MPIC_PRIMARY)
-		mpic->hc_irq.set_affinity = mpic_set_affinity;
+		mpic->hc_irq.irq_set_affinity = mpic_set_affinity;
 #ifdef CONFIG_MPIC_U3_HT_IRQS
 	mpic->hc_ht_irq = mpic_irq_ht_chip;
 	mpic->hc_ht_irq.name = name;
 	if (flags & MPIC_PRIMARY)
-		mpic->hc_ht_irq.set_affinity = mpic_set_affinity;
+		mpic->hc_ht_irq.irq_set_affinity = mpic_set_affinity;
 #endif /* CONFIG_MPIC_U3_HT_IRQS */
 
 #ifdef CONFIG_SMP
diff --git a/arch/powerpc/sysdev/mpic.h b/arch/powerpc/sysdev/mpic.h
index e4a6df7..13f3e89 100644
--- a/arch/powerpc/sysdev/mpic.h
+++ b/arch/powerpc/sysdev/mpic.h
@@ -34,9 +34,10 @@  static inline int mpic_pasemi_msi_init(struct mpic *mpic)
 }
 #endif
 
-extern int mpic_set_irq_type(unsigned int virq, unsigned int flow_type);
+extern int mpic_set_irq_type(struct irq_data *d, unsigned int flow_type);
 extern void mpic_set_vector(unsigned int virq, unsigned int vector);
-extern int mpic_set_affinity(unsigned int irq, const struct cpumask *cpumask);
+extern int mpic_set_affinity(struct irq_data *d,
+			     const struct cpumask *cpumask, bool force);
 extern void mpic_reset_core(int cpu);
 
 #endif /* _POWERPC_SYSDEV_MPIC_H */
diff --git a/arch/powerpc/sysdev/mpic_pasemi_msi.c b/arch/powerpc/sysdev/mpic_pasemi_msi.c
index 320ad5a..0b7794a 100644
--- a/arch/powerpc/sysdev/mpic_pasemi_msi.c
+++ b/arch/powerpc/sysdev/mpic_pasemi_msi.c
@@ -43,24 +43,24 @@  static void mpic_pasemi_msi_mask_irq(struct irq_data *data)
 {
 	pr_debug("mpic_pasemi_msi_mask_irq %d\n", data->irq);
 	mask_msi_irq(data);
-	mpic_mask_irq(data->irq);
+	mpic_mask_irq(data);
 }
 
 static void mpic_pasemi_msi_unmask_irq(struct irq_data *data)
 {
 	pr_debug("mpic_pasemi_msi_unmask_irq %d\n", data->irq);
-	mpic_unmask_irq(data->irq);
+	mpic_unmask_irq(data);
 	unmask_msi_irq(data);
 }
 
 static struct irq_chip mpic_pasemi_msi_chip = {
-	.irq_shutdown	= mpic_pasemi_msi_mask_irq,
-	.irq_mask	= mpic_pasemi_msi_mask_irq,
-	.irq_unmask	= mpic_pasemi_msi_unmask_irq,
-	.eoi		= mpic_end_irq,
-	.set_type	= mpic_set_irq_type,
-	.set_affinity	= mpic_set_affinity,
-	.name		= "PASEMI-MSI",
+	.irq_shutdown		= mpic_pasemi_msi_mask_irq,
+	.irq_mask		= mpic_pasemi_msi_mask_irq,
+	.irq_unmask		= mpic_pasemi_msi_unmask_irq,
+	.irq_eoi		= mpic_end_irq,
+	.irq_set_type		= mpic_set_irq_type,
+	.irq_set_affinity	= mpic_set_affinity,
+	.name			= "PASEMI-MSI",
 };
 
 static int pasemi_msi_check_device(struct pci_dev *pdev, int nvec, int type)
diff --git a/arch/powerpc/sysdev/mpic_u3msi.c b/arch/powerpc/sysdev/mpic_u3msi.c
index a2b028b..71900ac 100644
--- a/arch/powerpc/sysdev/mpic_u3msi.c
+++ b/arch/powerpc/sysdev/mpic_u3msi.c
@@ -26,23 +26,23 @@  static struct mpic *msi_mpic;
 static void mpic_u3msi_mask_irq(struct irq_data *data)
 {
 	mask_msi_irq(data);
-	mpic_mask_irq(data->irq);
+	mpic_mask_irq(data);
 }
 
 static void mpic_u3msi_unmask_irq(struct irq_data *data)
 {
-	mpic_unmask_irq(data->irq);
+	mpic_unmask_irq(data);
 	unmask_msi_irq(data);
 }
 
 static struct irq_chip mpic_u3msi_chip = {
-	.irq_shutdown	= mpic_u3msi_mask_irq,
-	.irq_mask	= mpic_u3msi_mask_irq,
-	.irq_unmask	= mpic_u3msi_unmask_irq,
-	.eoi		= mpic_end_irq,
-	.set_type	= mpic_set_irq_type,
-	.set_affinity	= mpic_set_affinity,
-	.name		= "MPIC-U3MSI",
+	.irq_shutdown		= mpic_u3msi_mask_irq,
+	.irq_mask		= mpic_u3msi_mask_irq,
+	.irq_unmask		= mpic_u3msi_unmask_irq,
+	.irq_eoi		= mpic_end_irq,
+	.irq_set_type		= mpic_set_irq_type,
+	.irq_set_affinity	= mpic_set_affinity,
+	.name			= "MPIC-U3MSI",
 };
 
 static u64 read_ht_magic_addr(struct pci_dev *pdev, unsigned int pos)