diff options
Diffstat (limited to 'arch/powerpc/sysdev')
| -rw-r--r-- | arch/powerpc/sysdev/cpm1.c | 18 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/cpm2_pic.c | 32 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_85xx_l2ctlr.c | 4 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_msi.c | 109 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_pci.c | 15 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_pci.h | 17 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/i8259.c | 42 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/ipic.c | 54 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/mpc8xx_pic.c | 32 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/mpc8xxx_gpio.c | 46 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/mpic.c | 137 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/mpic.h | 5 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/mpic_pasemi_msi.c | 18 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/mpic_u3msi.c | 18 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/mv64x60_dev.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/mv64x60_pic.c | 46 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/qe_lib/qe_ic.c | 25 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/tsi108_pci.c | 41 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/uic.c | 59 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/xilinx_intc.c | 48 | 
20 files changed, 405 insertions, 363 deletions
diff --git a/arch/powerpc/sysdev/cpm1.c b/arch/powerpc/sysdev/cpm1.c index 00852124ff4..0476bcc7c3e 100644 --- a/arch/powerpc/sysdev/cpm1.c +++ b/arch/powerpc/sysdev/cpm1.c @@ -56,32 +56,32 @@ static cpic8xx_t __iomem *cpic_reg;  static struct irq_host *cpm_pic_host; -static void cpm_mask_irq(unsigned int irq) +static void cpm_mask_irq(struct irq_data *d)  { -	unsigned int cpm_vec = (unsigned int)irq_map[irq].hwirq; +	unsigned int cpm_vec = (unsigned int)irq_map[d->irq].hwirq;  	clrbits32(&cpic_reg->cpic_cimr, (1 << cpm_vec));  } -static void cpm_unmask_irq(unsigned int irq) +static void cpm_unmask_irq(struct irq_data *d)  { -	unsigned int cpm_vec = (unsigned int)irq_map[irq].hwirq; +	unsigned int cpm_vec = (unsigned int)irq_map[d->irq].hwirq;  	setbits32(&cpic_reg->cpic_cimr, (1 << cpm_vec));  } -static void cpm_end_irq(unsigned int irq) +static void cpm_end_irq(struct irq_data *d)  { -	unsigned int cpm_vec = (unsigned int)irq_map[irq].hwirq; +	unsigned int cpm_vec = (unsigned int)irq_map[d->irq].hwirq;  	out_be32(&cpic_reg->cpic_cisr, (1 << cpm_vec));  }  static struct irq_chip cpm_pic = {  	.name = "CPM PIC", -	.mask = cpm_mask_irq, -	.unmask = cpm_unmask_irq, -	.eoi = cpm_end_irq, +	.irq_mask = cpm_mask_irq, +	.irq_unmask = cpm_unmask_irq, +	.irq_eoi = cpm_end_irq,  };  int cpm_get_irq(void) diff --git a/arch/powerpc/sysdev/cpm2_pic.c b/arch/powerpc/sysdev/cpm2_pic.c index fcea4ff825d..47303255671 100644 --- a/arch/powerpc/sysdev/cpm2_pic.c +++ b/arch/powerpc/sysdev/cpm2_pic.c @@ -78,10 +78,10 @@ static const u_char irq_to_siubit[] = {  	24, 25, 26, 27, 28, 29, 30, 31,  }; -static void cpm2_mask_irq(unsigned int virq) +static void cpm2_mask_irq(struct irq_data *d)  {  	int	bit, word; -	unsigned int irq_nr = virq_to_hw(virq); +	unsigned int irq_nr = virq_to_hw(d->irq);  	bit = irq_to_siubit[irq_nr];  	word = irq_to_siureg[irq_nr]; @@ -90,10 +90,10 @@ static void cpm2_mask_irq(unsigned int virq)  	out_be32(&cpm2_intctl->ic_simrh + word, ppc_cached_irq_mask[word]);  } -static void cpm2_unmask_irq(unsigned int virq) +static void cpm2_unmask_irq(struct irq_data *d)  {  	int	bit, word; -	unsigned int irq_nr = virq_to_hw(virq); +	unsigned int irq_nr = virq_to_hw(d->irq);  	bit = irq_to_siubit[irq_nr];  	word = irq_to_siureg[irq_nr]; @@ -102,10 +102,10 @@ static void cpm2_unmask_irq(unsigned int virq)  	out_be32(&cpm2_intctl->ic_simrh + word, ppc_cached_irq_mask[word]);  } -static void cpm2_ack(unsigned int virq) +static void cpm2_ack(struct irq_data *d)  {  	int	bit, word; -	unsigned int irq_nr = virq_to_hw(virq); +	unsigned int irq_nr = virq_to_hw(d->irq);  	bit = irq_to_siubit[irq_nr];  	word = irq_to_siureg[irq_nr]; @@ -113,11 +113,11 @@ static void cpm2_ack(unsigned int virq)  	out_be32(&cpm2_intctl->ic_sipnrh + word, 1 << bit);  } -static void cpm2_end_irq(unsigned int virq) +static void cpm2_end_irq(struct irq_data *d)  {  	struct irq_desc *desc;  	int	bit, word; -	unsigned int irq_nr = virq_to_hw(virq); +	unsigned int irq_nr = virq_to_hw(d->irq);  	desc = irq_to_desc(irq_nr);  	if (!(desc->status & (IRQ_DISABLED|IRQ_INPROGRESS)) @@ -137,10 +137,10 @@ static void cpm2_end_irq(unsigned int virq)  	}  } -static int cpm2_set_irq_type(unsigned int virq, unsigned int flow_type) +static int cpm2_set_irq_type(struct irq_data *d, unsigned int flow_type)  { -	unsigned int src = virq_to_hw(virq); -	struct irq_desc *desc = irq_to_desc(virq); +	unsigned int src = virq_to_hw(d->irq); +	struct irq_desc *desc = irq_to_desc(d->irq);  	unsigned int vold, vnew, edibit;  	/* Port C interrupts are either IRQ_TYPE_EDGE_FALLING or @@ -199,11 +199,11 @@ err_sense:  static struct irq_chip cpm2_pic = {  	.name = "CPM2 SIU", -	.mask = cpm2_mask_irq, -	.unmask = cpm2_unmask_irq, -	.ack = cpm2_ack, -	.eoi = cpm2_end_irq, -	.set_type = cpm2_set_irq_type, +	.irq_mask = cpm2_mask_irq, +	.irq_unmask = cpm2_unmask_irq, +	.irq_ack = cpm2_ack, +	.irq_eoi = cpm2_end_irq, +	.irq_set_type = cpm2_set_irq_type,  };  unsigned int cpm2_get_irq(void) diff --git a/arch/powerpc/sysdev/fsl_85xx_l2ctlr.c b/arch/powerpc/sysdev/fsl_85xx_l2ctlr.c index 2b9f0c92532..5f88797dce7 100644 --- a/arch/powerpc/sysdev/fsl_85xx_l2ctlr.c +++ b/arch/powerpc/sysdev/fsl_85xx_l2ctlr.c @@ -93,14 +93,14 @@ static int __devinit mpc85xx_l2ctlr_of_probe(struct platform_device *dev)  	l2cache_size = *prop;  	sram_params.sram_size  = get_cache_sram_size(); -	if (sram_params.sram_size <= 0) { +	if ((int)sram_params.sram_size <= 0) {  		dev_err(&dev->dev,  			"Entire L2 as cache, Aborting Cache-SRAM stuff\n");  		return -EINVAL;  	}  	sram_params.sram_offset  = get_cache_sram_offset(); -	if (sram_params.sram_offset <= 0) { +	if ((int64_t)sram_params.sram_offset <= 0) {  		dev_err(&dev->dev,  			"Entire L2 as cache, provide a valid sram offset\n");  		return -EINVAL; diff --git a/arch/powerpc/sysdev/fsl_msi.c b/arch/powerpc/sysdev/fsl_msi.c index ee6a8a52ac7..58e09b2833f 100644 --- a/arch/powerpc/sysdev/fsl_msi.c +++ b/arch/powerpc/sysdev/fsl_msi.c @@ -1,5 +1,5 @@  /* - * Copyright (C) 2007-2010 Freescale Semiconductor, Inc. + * Copyright (C) 2007-2011 Freescale Semiconductor, Inc.   *   * Author: Tony Li <tony.li@freescale.com>   *	   Jason Jin <Jason.jin@freescale.com> @@ -47,14 +47,14 @@ static inline u32 fsl_msi_read(u32 __iomem *base, unsigned int reg)   * We do not need this actually. The MSIR register has been read once   * in the cascade interrupt. So, this MSI interrupt has been acked  */ -static void fsl_msi_end_irq(unsigned int virq) +static void fsl_msi_end_irq(struct irq_data *d)  {  }  static struct irq_chip fsl_msi_chip = {  	.irq_mask	= mask_msi_irq,  	.irq_unmask	= unmask_msi_irq, -	.ack		= fsl_msi_end_irq, +	.irq_ack	= fsl_msi_end_irq,  	.name		= "FSL-MSI",  }; @@ -183,6 +183,7 @@ out_free:  static void fsl_msi_cascade(unsigned int irq, struct irq_desc *desc)  { +	struct irq_chip *chip = get_irq_desc_chip(desc);  	unsigned int cascade_irq;  	struct fsl_msi *msi_data;  	int msir_index = -1; @@ -196,11 +197,11 @@ static void fsl_msi_cascade(unsigned int irq, struct irq_desc *desc)  	raw_spin_lock(&desc->lock);  	if ((msi_data->feature &  FSL_PIC_IP_MASK) == FSL_PIC_IP_IPIC) { -		if (desc->chip->mask_ack) -			desc->chip->mask_ack(irq); +		if (chip->irq_mask_ack) +			chip->irq_mask_ack(&desc->irq_data);  		else { -			desc->chip->mask(irq); -			desc->chip->ack(irq); +			chip->irq_mask(&desc->irq_data); +			chip->irq_ack(&desc->irq_data);  		}  	} @@ -238,11 +239,11 @@ static void fsl_msi_cascade(unsigned int irq, struct irq_desc *desc)  	switch (msi_data->feature & FSL_PIC_IP_MASK) {  	case FSL_PIC_IP_MPIC: -		desc->chip->eoi(irq); +		chip->irq_eoi(&desc->irq_data);  		break;  	case FSL_PIC_IP_IPIC: -		if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask) -			desc->chip->unmask(irq); +		if (!(desc->status & IRQ_DISABLED) && chip->irq_unmask) +			chip->irq_unmask(&desc->irq_data);  		break;  	}  unlock: @@ -273,18 +274,46 @@ static int fsl_of_msi_remove(struct platform_device *ofdev)  	return 0;  } +static int __devinit fsl_msi_setup_hwirq(struct fsl_msi *msi, +					 struct platform_device *dev, +					 int offset, int irq_index) +{ +	struct fsl_msi_cascade_data *cascade_data = NULL; +	int virt_msir; + +	virt_msir = irq_of_parse_and_map(dev->dev.of_node, irq_index); +	if (virt_msir == NO_IRQ) { +		dev_err(&dev->dev, "%s: Cannot translate IRQ index %d\n", +			__func__, irq_index); +		return 0; +	} + +	cascade_data = kzalloc(sizeof(struct fsl_msi_cascade_data), GFP_KERNEL); +	if (!cascade_data) { +		dev_err(&dev->dev, "No memory for MSI cascade data\n"); +		return -ENOMEM; +	} + +	msi->msi_virqs[irq_index] = virt_msir; +	cascade_data->index = offset + irq_index; +	cascade_data->msi_data = msi; +	set_irq_data(virt_msir, cascade_data); +	set_irq_chained_handler(virt_msir, fsl_msi_cascade); + +	return 0; +} +  static int __devinit fsl_of_msi_probe(struct platform_device *dev)  {  	struct fsl_msi *msi;  	struct resource res; -	int err, i, count; +	int err, i, j, irq_index, count;  	int rc; -	int virt_msir;  	const u32 *p;  	struct fsl_msi_feature *features; -	struct fsl_msi_cascade_data *cascade_data = NULL;  	int len;  	u32 offset; +	static const u32 all_avail[] = { 0, NR_MSI_IRQS };  	if (!dev->dev.of_match)  		return -EINVAL; @@ -335,42 +364,34 @@ static int __devinit fsl_of_msi_probe(struct platform_device *dev)  		goto error_out;  	} -	p = of_get_property(dev->dev.of_node, "interrupts", &count); -	if (!p) { -		dev_err(&dev->dev, "no interrupts property found on %s\n", -				dev->dev.of_node->full_name); -		err = -ENODEV; -		goto error_out; -	} -	if (count % 8 != 0) { -		dev_err(&dev->dev, "Malformed interrupts property on %s\n", -				dev->dev.of_node->full_name); +	p = of_get_property(dev->dev.of_node, "msi-available-ranges", &len); +	if (p && len % (2 * sizeof(u32)) != 0) { +		dev_err(&dev->dev, "%s: Malformed msi-available-ranges property\n", +			__func__);  		err = -EINVAL;  		goto error_out;  	} -	offset = 0; -	p = of_get_property(dev->dev.of_node, "msi-available-ranges", &len); -	if (p) -		offset = *p / IRQS_PER_MSI_REG; -	count /= sizeof(u32); -	for (i = 0; i < min(count / 2, NR_MSI_REG); i++) { -		virt_msir = irq_of_parse_and_map(dev->dev.of_node, i); -		if (virt_msir != NO_IRQ) { -			cascade_data = kzalloc( -					sizeof(struct fsl_msi_cascade_data), -					GFP_KERNEL); -			if (!cascade_data) { -				dev_err(&dev->dev, -					"No memory for MSI cascade data\n"); -				err = -ENOMEM; +	if (!p) +		p = all_avail; + +	for (irq_index = 0, i = 0; i < len / (2 * sizeof(u32)); i++) { +		if (p[i * 2] % IRQS_PER_MSI_REG || +		    p[i * 2 + 1] % IRQS_PER_MSI_REG) { +			printk(KERN_WARNING "%s: %s: msi available range of %u at %u is not IRQ-aligned\n", +			       __func__, dev->dev.of_node->full_name, +			       p[i * 2 + 1], p[i * 2]); +			err = -EINVAL; +			goto error_out; +		} + +		offset = p[i * 2] / IRQS_PER_MSI_REG; +		count = p[i * 2 + 1] / IRQS_PER_MSI_REG; + +		for (j = 0; j < count; j++, irq_index++) { +			err = fsl_msi_setup_hwirq(msi, dev, offset, irq_index); +			if (err)  				goto error_out; -			} -			msi->msi_virqs[i] = virt_msir; -			cascade_data->index = i + offset; -			cascade_data->msi_data = msi; -			set_irq_data(virt_msir, (void *)cascade_data); -			set_irq_chained_handler(virt_msir, fsl_msi_cascade);  		}  	} diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index 818f7c6c8fa..f8f7f28c634 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c @@ -1,7 +1,7 @@  /*   * MPC83xx/85xx/86xx PCI/PCIE support routing.   * - * Copyright 2007-2010 Freescale Semiconductor, Inc. + * Copyright 2007-2011 Freescale Semiconductor, Inc.   * Copyright 2008-2009 MontaVista Software, Inc.   *   * Initial author: Xianghua Xiao <x.xiao@freescale.com> @@ -99,7 +99,7 @@ static void __init setup_pci_atmu(struct pci_controller *hose,  				  struct resource *rsrc)  {  	struct ccsr_pci __iomem *pci; -	int i, j, n, mem_log, win_idx = 2; +	int i, j, n, mem_log, win_idx = 3, start_idx = 1, end_idx = 4;  	u64 mem, sz, paddr_hi = 0;  	u64 paddr_lo = ULLONG_MAX;  	u32 pcicsrbar = 0, pcicsrbar_sz; @@ -109,6 +109,13 @@ static void __init setup_pci_atmu(struct pci_controller *hose,  	pr_debug("PCI memory map start 0x%016llx, size 0x%016llx\n",  		    (u64)rsrc->start, (u64)rsrc->end - (u64)rsrc->start + 1); + +	if (of_device_is_compatible(hose->dn, "fsl,qoriq-pcie-v2.2")) { +		win_idx = 2; +		start_idx = 0; +		end_idx = 3; +	} +  	pci = ioremap(rsrc->start, rsrc->end - rsrc->start + 1);  	if (!pci) {  	    dev_err(hose->parent, "Unable to map ATMU registers\n"); @@ -118,7 +125,7 @@ static void __init setup_pci_atmu(struct pci_controller *hose,  	/* Disable all windows (except powar0 since it's ignored) */  	for(i = 1; i < 5; i++)  		out_be32(&pci->pow[i].powar, 0); -	for(i = 0; i < 3; i++) +	for (i = start_idx; i < end_idx; i++)  		out_be32(&pci->piw[i].piwar, 0);  	/* Setup outbound MEM window */ @@ -204,7 +211,7 @@ static void __init setup_pci_atmu(struct pci_controller *hose,  			mem_log++;  		} -		piwar |= (mem_log - 1); +		piwar |= ((mem_log - 1) & PIWAR_SZ_MASK);  		/* Setup inbound memory window */  		out_be32(&pci->piw[win_idx].pitar,  0x00000000); diff --git a/arch/powerpc/sysdev/fsl_pci.h b/arch/powerpc/sysdev/fsl_pci.h index 8ad72a11f77..a39ed5cc2c5 100644 --- a/arch/powerpc/sysdev/fsl_pci.h +++ b/arch/powerpc/sysdev/fsl_pci.h @@ -1,7 +1,7 @@  /*   * MPC85xx/86xx PCI Express structure define   * - * Copyright 2007 Freescale Semiconductor, Inc + * Copyright 2007,2011 Freescale Semiconductor, Inc   *   * This program is free software; you can redistribute  it and/or modify it   * under  the terms of  the GNU General  Public License as published by the @@ -21,6 +21,7 @@  #define PIWAR_TGI_LOCAL		0x00f00000	/* target - local memory */  #define PIWAR_READ_SNOOP	0x00050000  #define PIWAR_WRITE_SNOOP	0x00005000 +#define PIWAR_SZ_MASK          0x0000003f  /* PCI/PCI Express outbound window reg */  struct pci_outbound_window_regs { @@ -49,7 +50,9 @@ struct ccsr_pci {  	__be32	int_ack;		/* 0x.008 - PCI Interrupt Acknowledge Register */  	__be32	pex_otb_cpl_tor;	/* 0x.00c - PCIE Outbound completion timeout register */  	__be32	pex_conf_tor;		/* 0x.010 - PCIE configuration timeout register */ -	u8	res2[12]; +	__be32	pex_config;		/* 0x.014 - PCIE CONFIG Register */ +	__be32	pex_int_status;		/* 0x.018 - PCIE interrupt status */ +	u8	res2[4];  	__be32	pex_pme_mes_dr;		/* 0x.020 - PCIE PME and message detect register */  	__be32	pex_pme_mes_disr;	/* 0x.024 - PCIE PME and message disable register */  	__be32	pex_pme_mes_ier;	/* 0x.028 - PCIE PME and message interrupt enable register */ @@ -62,14 +65,14 @@ struct ccsr_pci {   * in all of the other outbound windows.   */  	struct pci_outbound_window_regs pow[5]; - -	u8	res14[256]; - -/* PCI/PCI Express inbound window 3-1 +	u8	res14[96]; +	struct pci_inbound_window_regs	pmit;	/* 0xd00 - 0xd9c Inbound MSI */ +	u8	res6[96]; +/* PCI/PCI Express inbound window 3-0   * inbound window 1 supports only a 32-bit base address and does not   * define an inbound window base extended address register.   */ -	struct pci_inbound_window_regs piw[3]; +	struct pci_inbound_window_regs piw[4];  	__be32	pex_err_dr;		/* 0x.e00 - PCI/PCIE error detect register */  	u8	res21[4]; diff --git a/arch/powerpc/sysdev/i8259.c b/arch/powerpc/sysdev/i8259.c index 6323e70e6bf..aeda4c8d0a0 100644 --- a/arch/powerpc/sysdev/i8259.c +++ b/arch/powerpc/sysdev/i8259.c @@ -78,19 +78,19 @@ unsigned int i8259_irq(void)  	return irq;  } -static void i8259_mask_and_ack_irq(unsigned int irq_nr) +static void i8259_mask_and_ack_irq(struct irq_data *d)  {  	unsigned long flags;  	raw_spin_lock_irqsave(&i8259_lock, flags); -	if (irq_nr > 7) { -		cached_A1 |= 1 << (irq_nr-8); +	if (d->irq > 7) { +		cached_A1 |= 1 << (d->irq-8);  		inb(0xA1); 	/* DUMMY */  		outb(cached_A1, 0xA1);  		outb(0x20, 0xA0);	/* Non-specific EOI */  		outb(0x20, 0x20);	/* Non-specific EOI to cascade */  	} else { -		cached_21 |= 1 << irq_nr; +		cached_21 |= 1 << d->irq;  		inb(0x21); 	/* DUMMY */  		outb(cached_21, 0x21);  		outb(0x20, 0x20);	/* Non-specific EOI */ @@ -104,42 +104,42 @@ static void i8259_set_irq_mask(int irq_nr)  	outb(cached_21,0x21);  } -static void i8259_mask_irq(unsigned int irq_nr) +static void i8259_mask_irq(struct irq_data *d)  {  	unsigned long flags; -	pr_debug("i8259_mask_irq(%d)\n", irq_nr); +	pr_debug("i8259_mask_irq(%d)\n", d->irq);  	raw_spin_lock_irqsave(&i8259_lock, flags); -	if (irq_nr < 8) -		cached_21 |= 1 << irq_nr; +	if (d->irq < 8) +		cached_21 |= 1 << d->irq;  	else -		cached_A1 |= 1 << (irq_nr-8); -	i8259_set_irq_mask(irq_nr); +		cached_A1 |= 1 << (d->irq-8); +	i8259_set_irq_mask(d->irq);  	raw_spin_unlock_irqrestore(&i8259_lock, flags);  } -static void i8259_unmask_irq(unsigned int irq_nr) +static void i8259_unmask_irq(struct irq_data *d)  {  	unsigned long flags; -	pr_debug("i8259_unmask_irq(%d)\n", irq_nr); +	pr_debug("i8259_unmask_irq(%d)\n", d->irq);  	raw_spin_lock_irqsave(&i8259_lock, flags); -	if (irq_nr < 8) -		cached_21 &= ~(1 << irq_nr); +	if (d->irq < 8) +		cached_21 &= ~(1 << d->irq);  	else -		cached_A1 &= ~(1 << (irq_nr-8)); -	i8259_set_irq_mask(irq_nr); +		cached_A1 &= ~(1 << (d->irq-8)); +	i8259_set_irq_mask(d->irq);  	raw_spin_unlock_irqrestore(&i8259_lock, flags);  }  static struct irq_chip i8259_pic = {  	.name		= "i8259", -	.mask		= i8259_mask_irq, -	.disable	= i8259_mask_irq, -	.unmask		= i8259_unmask_irq, -	.mask_ack	= i8259_mask_and_ack_irq, +	.irq_mask	= i8259_mask_irq, +	.irq_disable	= i8259_mask_irq, +	.irq_unmask	= i8259_unmask_irq, +	.irq_mask_ack	= i8259_mask_and_ack_irq,  };  static struct resource pic1_iores = { @@ -188,7 +188,7 @@ static int i8259_host_map(struct irq_host *h, unsigned int virq,  static void i8259_host_unmap(struct irq_host *h, unsigned int virq)  {  	/* Make sure irq is masked in hardware */ -	i8259_mask_irq(virq); +	i8259_mask_irq(irq_get_irq_data(virq));  	/* remove chip and handler */  	set_irq_chip_and_handler(virq, NULL, NULL); diff --git a/arch/powerpc/sysdev/ipic.c b/arch/powerpc/sysdev/ipic.c index d7b9b9c6928..497047dc986 100644 --- a/arch/powerpc/sysdev/ipic.c +++ b/arch/powerpc/sysdev/ipic.c @@ -523,10 +523,10 @@ static inline struct ipic * ipic_from_irq(unsigned int virq)  #define ipic_irq_to_hw(virq)	((unsigned int)irq_map[virq].hwirq) -static void ipic_unmask_irq(unsigned int virq) +static void ipic_unmask_irq(struct irq_data *d)  { -	struct ipic *ipic = ipic_from_irq(virq); -	unsigned int src = ipic_irq_to_hw(virq); +	struct ipic *ipic = ipic_from_irq(d->irq); +	unsigned int src = ipic_irq_to_hw(d->irq);  	unsigned long flags;  	u32 temp; @@ -539,10 +539,10 @@ static void ipic_unmask_irq(unsigned int virq)  	raw_spin_unlock_irqrestore(&ipic_lock, flags);  } -static void ipic_mask_irq(unsigned int virq) +static void ipic_mask_irq(struct irq_data *d)  { -	struct ipic *ipic = ipic_from_irq(virq); -	unsigned int src = ipic_irq_to_hw(virq); +	struct ipic *ipic = ipic_from_irq(d->irq); +	unsigned int src = ipic_irq_to_hw(d->irq);  	unsigned long flags;  	u32 temp; @@ -559,10 +559,10 @@ static void ipic_mask_irq(unsigned int virq)  	raw_spin_unlock_irqrestore(&ipic_lock, flags);  } -static void ipic_ack_irq(unsigned int virq) +static void ipic_ack_irq(struct irq_data *d)  { -	struct ipic *ipic = ipic_from_irq(virq); -	unsigned int src = ipic_irq_to_hw(virq); +	struct ipic *ipic = ipic_from_irq(d->irq); +	unsigned int src = ipic_irq_to_hw(d->irq);  	unsigned long flags;  	u32 temp; @@ -578,10 +578,10 @@ static void ipic_ack_irq(unsigned int virq)  	raw_spin_unlock_irqrestore(&ipic_lock, flags);  } -static void ipic_mask_irq_and_ack(unsigned int virq) +static void ipic_mask_irq_and_ack(struct irq_data *d)  { -	struct ipic *ipic = ipic_from_irq(virq); -	unsigned int src = ipic_irq_to_hw(virq); +	struct ipic *ipic = ipic_from_irq(d->irq); +	unsigned int src = ipic_irq_to_hw(d->irq);  	unsigned long flags;  	u32 temp; @@ -601,11 +601,11 @@ static void ipic_mask_irq_and_ack(unsigned int virq)  	raw_spin_unlock_irqrestore(&ipic_lock, flags);  } -static int ipic_set_irq_type(unsigned int virq, unsigned int flow_type) +static int ipic_set_irq_type(struct irq_data *d, unsigned int flow_type)  { -	struct ipic *ipic = ipic_from_irq(virq); -	unsigned int src = ipic_irq_to_hw(virq); -	struct irq_desc *desc = irq_to_desc(virq); +	struct ipic *ipic = ipic_from_irq(d->irq); +	unsigned int src = ipic_irq_to_hw(d->irq); +	struct irq_desc *desc = irq_to_desc(d->irq);  	unsigned int vold, vnew, edibit;  	if (flow_type == IRQ_TYPE_NONE) @@ -630,10 +630,10 @@ static int ipic_set_irq_type(unsigned int virq, unsigned int flow_type)  	if (flow_type & IRQ_TYPE_LEVEL_LOW)  {  		desc->status |= IRQ_LEVEL;  		desc->handle_irq = handle_level_irq; -		desc->chip = &ipic_level_irq_chip; +		desc->irq_data.chip = &ipic_level_irq_chip;  	} else {  		desc->handle_irq = handle_edge_irq; -		desc->chip = &ipic_edge_irq_chip; +		desc->irq_data.chip = &ipic_edge_irq_chip;  	}  	/* only EXT IRQ senses are programmable on ipic @@ -661,19 +661,19 @@ static int ipic_set_irq_type(unsigned int virq, unsigned int flow_type)  /* level interrupts and edge interrupts have different ack operations */  static struct irq_chip ipic_level_irq_chip = {  	.name		= "IPIC", -	.unmask		= ipic_unmask_irq, -	.mask		= ipic_mask_irq, -	.mask_ack	= ipic_mask_irq, -	.set_type	= ipic_set_irq_type, +	.irq_unmask	= ipic_unmask_irq, +	.irq_mask	= ipic_mask_irq, +	.irq_mask_ack	= ipic_mask_irq, +	.irq_set_type	= ipic_set_irq_type,  };  static struct irq_chip ipic_edge_irq_chip = {  	.name		= "IPIC", -	.unmask		= ipic_unmask_irq, -	.mask		= ipic_mask_irq, -	.mask_ack	= ipic_mask_irq_and_ack, -	.ack		= ipic_ack_irq, -	.set_type	= ipic_set_irq_type, +	.irq_unmask	= ipic_unmask_irq, +	.irq_mask	= ipic_mask_irq, +	.irq_mask_ack	= ipic_mask_irq_and_ack, +	.irq_ack	= ipic_ack_irq, +	.irq_set_type	= ipic_set_irq_type,  };  static int ipic_host_match(struct irq_host *h, struct device_node *node) diff --git a/arch/powerpc/sysdev/mpc8xx_pic.c b/arch/powerpc/sysdev/mpc8xx_pic.c index 8c27d261aba..1a75a7fb4a9 100644 --- a/arch/powerpc/sysdev/mpc8xx_pic.c +++ b/arch/powerpc/sysdev/mpc8xx_pic.c @@ -25,10 +25,10 @@ static sysconf8xx_t __iomem *siu_reg;  int cpm_get_irq(struct pt_regs *regs); -static void mpc8xx_unmask_irq(unsigned int virq) +static void mpc8xx_unmask_irq(struct irq_data *d)  {  	int	bit, word; -	unsigned int irq_nr = (unsigned int)irq_map[virq].hwirq; +	unsigned int irq_nr = (unsigned int)irq_map[d->irq].hwirq;  	bit = irq_nr & 0x1f;  	word = irq_nr >> 5; @@ -37,10 +37,10 @@ static void mpc8xx_unmask_irq(unsigned int virq)  	out_be32(&siu_reg->sc_simask, ppc_cached_irq_mask[word]);  } -static void mpc8xx_mask_irq(unsigned int virq) +static void mpc8xx_mask_irq(struct irq_data *d)  {  	int	bit, word; -	unsigned int irq_nr = (unsigned int)irq_map[virq].hwirq; +	unsigned int irq_nr = (unsigned int)irq_map[d->irq].hwirq;  	bit = irq_nr & 0x1f;  	word = irq_nr >> 5; @@ -49,19 +49,19 @@ static void mpc8xx_mask_irq(unsigned int virq)  	out_be32(&siu_reg->sc_simask, ppc_cached_irq_mask[word]);  } -static void mpc8xx_ack(unsigned int virq) +static void mpc8xx_ack(struct irq_data *d)  {  	int	bit; -	unsigned int irq_nr = (unsigned int)irq_map[virq].hwirq; +	unsigned int irq_nr = (unsigned int)irq_map[d->irq].hwirq;  	bit = irq_nr & 0x1f;  	out_be32(&siu_reg->sc_sipend, 1 << (31-bit));  } -static void mpc8xx_end_irq(unsigned int virq) +static void mpc8xx_end_irq(struct irq_data *d)  {  	int bit, word; -	unsigned int irq_nr = (unsigned int)irq_map[virq].hwirq; +	unsigned int irq_nr = (unsigned int)irq_map[d->irq].hwirq;  	bit = irq_nr & 0x1f;  	word = irq_nr >> 5; @@ -70,9 +70,9 @@ static void mpc8xx_end_irq(unsigned int virq)  	out_be32(&siu_reg->sc_simask, ppc_cached_irq_mask[word]);  } -static int mpc8xx_set_irq_type(unsigned int virq, unsigned int flow_type) +static int mpc8xx_set_irq_type(struct irq_data *d, unsigned int flow_type)  { -	struct irq_desc *desc = irq_to_desc(virq); +	struct irq_desc *desc = irq_to_desc(d->irq);  	desc->status &= ~(IRQ_TYPE_SENSE_MASK | IRQ_LEVEL);  	desc->status |= flow_type & IRQ_TYPE_SENSE_MASK; @@ -80,7 +80,7 @@ static int mpc8xx_set_irq_type(unsigned int virq, unsigned int flow_type)  		desc->status |= IRQ_LEVEL;  	if (flow_type & IRQ_TYPE_EDGE_FALLING) { -		irq_hw_number_t hw = (unsigned int)irq_map[virq].hwirq; +		irq_hw_number_t hw = (unsigned int)irq_map[d->irq].hwirq;  		unsigned int siel = in_be32(&siu_reg->sc_siel);  		/* only external IRQ senses are programmable */ @@ -95,11 +95,11 @@ static int mpc8xx_set_irq_type(unsigned int virq, unsigned int flow_type)  static struct irq_chip mpc8xx_pic = {  	.name = "MPC8XX SIU", -	.unmask = mpc8xx_unmask_irq, -	.mask = mpc8xx_mask_irq, -	.ack = mpc8xx_ack, -	.eoi = mpc8xx_end_irq, -	.set_type = mpc8xx_set_irq_type, +	.irq_unmask = mpc8xx_unmask_irq, +	.irq_mask = mpc8xx_mask_irq, +	.irq_ack = mpc8xx_ack, +	.irq_eoi = mpc8xx_end_irq, +	.irq_set_type = mpc8xx_set_irq_type,  };  unsigned int mpc8xx_get_irq(void) diff --git a/arch/powerpc/sysdev/mpc8xxx_gpio.c b/arch/powerpc/sysdev/mpc8xxx_gpio.c index c48cd817807..232e701245d 100644 --- a/arch/powerpc/sysdev/mpc8xxx_gpio.c +++ b/arch/powerpc/sysdev/mpc8xxx_gpio.c @@ -155,43 +155,43 @@ static void mpc8xxx_gpio_irq_cascade(unsigned int irq, struct irq_desc *desc)  						     32 - ffs(mask)));  } -static void mpc8xxx_irq_unmask(unsigned int virq) +static void mpc8xxx_irq_unmask(struct irq_data *d)  { -	struct mpc8xxx_gpio_chip *mpc8xxx_gc = get_irq_chip_data(virq); +	struct mpc8xxx_gpio_chip *mpc8xxx_gc = irq_data_get_irq_chip_data(d);  	struct of_mm_gpio_chip *mm = &mpc8xxx_gc->mm_gc;  	unsigned long flags;  	spin_lock_irqsave(&mpc8xxx_gc->lock, flags); -	setbits32(mm->regs + GPIO_IMR, mpc8xxx_gpio2mask(virq_to_hw(virq))); +	setbits32(mm->regs + GPIO_IMR, mpc8xxx_gpio2mask(virq_to_hw(d->irq)));  	spin_unlock_irqrestore(&mpc8xxx_gc->lock, flags);  } -static void mpc8xxx_irq_mask(unsigned int virq) +static void mpc8xxx_irq_mask(struct irq_data *d)  { -	struct mpc8xxx_gpio_chip *mpc8xxx_gc = get_irq_chip_data(virq); +	struct mpc8xxx_gpio_chip *mpc8xxx_gc = irq_data_get_irq_chip_data(d);  	struct of_mm_gpio_chip *mm = &mpc8xxx_gc->mm_gc;  	unsigned long flags;  	spin_lock_irqsave(&mpc8xxx_gc->lock, flags); -	clrbits32(mm->regs + GPIO_IMR, mpc8xxx_gpio2mask(virq_to_hw(virq))); +	clrbits32(mm->regs + GPIO_IMR, mpc8xxx_gpio2mask(virq_to_hw(d->irq)));  	spin_unlock_irqrestore(&mpc8xxx_gc->lock, flags);  } -static void mpc8xxx_irq_ack(unsigned int virq) +static void mpc8xxx_irq_ack(struct irq_data *d)  { -	struct mpc8xxx_gpio_chip *mpc8xxx_gc = get_irq_chip_data(virq); +	struct mpc8xxx_gpio_chip *mpc8xxx_gc = irq_data_get_irq_chip_data(d);  	struct of_mm_gpio_chip *mm = &mpc8xxx_gc->mm_gc; -	out_be32(mm->regs + GPIO_IER, mpc8xxx_gpio2mask(virq_to_hw(virq))); +	out_be32(mm->regs + GPIO_IER, mpc8xxx_gpio2mask(virq_to_hw(d->irq)));  } -static int mpc8xxx_irq_set_type(unsigned int virq, unsigned int flow_type) +static int mpc8xxx_irq_set_type(struct irq_data *d, unsigned int flow_type)  { -	struct mpc8xxx_gpio_chip *mpc8xxx_gc = get_irq_chip_data(virq); +	struct mpc8xxx_gpio_chip *mpc8xxx_gc = irq_data_get_irq_chip_data(d);  	struct of_mm_gpio_chip *mm = &mpc8xxx_gc->mm_gc;  	unsigned long flags; @@ -199,14 +199,14 @@ static int mpc8xxx_irq_set_type(unsigned int virq, unsigned int flow_type)  	case IRQ_TYPE_EDGE_FALLING:  		spin_lock_irqsave(&mpc8xxx_gc->lock, flags);  		setbits32(mm->regs + GPIO_ICR, -			  mpc8xxx_gpio2mask(virq_to_hw(virq))); +			  mpc8xxx_gpio2mask(virq_to_hw(d->irq)));  		spin_unlock_irqrestore(&mpc8xxx_gc->lock, flags);  		break;  	case IRQ_TYPE_EDGE_BOTH:  		spin_lock_irqsave(&mpc8xxx_gc->lock, flags);  		clrbits32(mm->regs + GPIO_ICR, -			  mpc8xxx_gpio2mask(virq_to_hw(virq))); +			  mpc8xxx_gpio2mask(virq_to_hw(d->irq)));  		spin_unlock_irqrestore(&mpc8xxx_gc->lock, flags);  		break; @@ -217,11 +217,11 @@ static int mpc8xxx_irq_set_type(unsigned int virq, unsigned int flow_type)  	return 0;  } -static int mpc512x_irq_set_type(unsigned int virq, unsigned int flow_type) +static int mpc512x_irq_set_type(struct irq_data *d, unsigned int flow_type)  { -	struct mpc8xxx_gpio_chip *mpc8xxx_gc = get_irq_chip_data(virq); +	struct mpc8xxx_gpio_chip *mpc8xxx_gc = irq_data_get_irq_chip_data(d);  	struct of_mm_gpio_chip *mm = &mpc8xxx_gc->mm_gc; -	unsigned long gpio = virq_to_hw(virq); +	unsigned long gpio = virq_to_hw(d->irq);  	void __iomem *reg;  	unsigned int shift;  	unsigned long flags; @@ -264,10 +264,10 @@ static int mpc512x_irq_set_type(unsigned int virq, unsigned int flow_type)  static struct irq_chip mpc8xxx_irq_chip = {  	.name		= "mpc8xxx-gpio", -	.unmask		= mpc8xxx_irq_unmask, -	.mask		= mpc8xxx_irq_mask, -	.ack		= mpc8xxx_irq_ack, -	.set_type	= mpc8xxx_irq_set_type, +	.irq_unmask	= mpc8xxx_irq_unmask, +	.irq_mask	= mpc8xxx_irq_mask, +	.irq_ack	= mpc8xxx_irq_ack, +	.irq_set_type	= mpc8xxx_irq_set_type,  };  static int mpc8xxx_gpio_irq_map(struct irq_host *h, unsigned int virq, @@ -276,7 +276,7 @@ static int mpc8xxx_gpio_irq_map(struct irq_host *h, unsigned int virq,  	struct mpc8xxx_gpio_chip *mpc8xxx_gc = h->host_data;  	if (mpc8xxx_gc->of_dev_id_data) -		mpc8xxx_irq_chip.set_type = mpc8xxx_gc->of_dev_id_data; +		mpc8xxx_irq_chip.irq_set_type = mpc8xxx_gc->of_dev_id_data;  	set_irq_chip_data(virq, h->host_data);  	set_irq_chip_and_handler(virq, &mpc8xxx_irq_chip, handle_level_irq); @@ -310,6 +310,7 @@ static struct of_device_id mpc8xxx_gpio_ids[] __initdata = {  	{ .compatible = "fsl,mpc8572-gpio", },  	{ .compatible = "fsl,mpc8610-gpio", },  	{ .compatible = "fsl,mpc5121-gpio", .data = mpc512x_irq_set_type, }, +	{ .compatible = "fsl,qoriq-gpio",   },  	{}  }; @@ -389,9 +390,6 @@ static int __init mpc8xxx_add_gpiochips(void)  	for_each_matching_node(np, mpc8xxx_gpio_ids)  		mpc8xxx_add_controller(np); -	for_each_compatible_node(np, NULL, "fsl,qoriq-gpio") -		mpc8xxx_add_controller(np); -  	return 0;  }  arch_initcall(mpc8xxx_add_gpiochips); diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c index b0c8469e5dd..eb7021815e2 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,22 @@ 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); +} + +/* Get the mpic structure from the irq data */ +static inline struct mpic * mpic_from_irq_data(struct irq_data *d) +{ +	return irq_data_get_irq_chip_data(d);  }  /* Send an EOI */ @@ -660,13 +666,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_data(d); +	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 +687,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_data(d); +	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 +709,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_data(d);  #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 +726,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_data(d); +	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_data(d); +	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_data(d); +	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_data(d); +	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 +778,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 +808,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_data(d); +	unsigned int src = mpic_irq_to_hw(d->irq);  	if (mpic->flags & MPIC_SINGLE_DEST_CPU) {  		int cpuid = irq_choose_cpu(cpumask); @@ -848,15 +855,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_data(d); +	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 +914,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 +1067,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 e4a6df77b8d..13f3e8913a9 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 320ad5a9a25..0b7794acfce 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 a2b028b4a20..71900ac7827 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) diff --git a/arch/powerpc/sysdev/mv64x60_dev.c b/arch/powerpc/sysdev/mv64x60_dev.c index feaee402e2d..0f6af41ebb4 100644 --- a/arch/powerpc/sysdev/mv64x60_dev.c +++ b/arch/powerpc/sysdev/mv64x60_dev.c @@ -346,7 +346,7 @@ static int __init mv64x60_i2c_device_setup(struct device_node *np, int id)  	if (prop)  		pdata.freq_m = *prop; -	pdata.freq_m = 3;	/* default */ +	pdata.freq_n = 3;	/* default */  	prop = of_get_property(np, "freq_n", NULL);  	if (prop)  		pdata.freq_n = *prop; diff --git a/arch/powerpc/sysdev/mv64x60_pic.c b/arch/powerpc/sysdev/mv64x60_pic.c index 485b92477d7..bc61ebb8987 100644 --- a/arch/powerpc/sysdev/mv64x60_pic.c +++ b/arch/powerpc/sysdev/mv64x60_pic.c @@ -76,9 +76,9 @@ static struct irq_host *mv64x60_irq_host;   * mv64x60_chip_low functions   */ -static void mv64x60_mask_low(unsigned int virq) +static void mv64x60_mask_low(struct irq_data *d)  { -	int level2 = irq_map[virq].hwirq & MV64x60_LEVEL2_MASK; +	int level2 = irq_map[d->irq].hwirq & MV64x60_LEVEL2_MASK;  	unsigned long flags;  	spin_lock_irqsave(&mv64x60_lock, flags); @@ -89,9 +89,9 @@ static void mv64x60_mask_low(unsigned int virq)  	(void)in_le32(mv64x60_irq_reg_base + MV64X60_IC_CPU0_INTR_MASK_LO);  } -static void mv64x60_unmask_low(unsigned int virq) +static void mv64x60_unmask_low(struct irq_data *d)  { -	int level2 = irq_map[virq].hwirq & MV64x60_LEVEL2_MASK; +	int level2 = irq_map[d->irq].hwirq & MV64x60_LEVEL2_MASK;  	unsigned long flags;  	spin_lock_irqsave(&mv64x60_lock, flags); @@ -104,18 +104,18 @@ static void mv64x60_unmask_low(unsigned int virq)  static struct irq_chip mv64x60_chip_low = {  	.name		= "mv64x60_low", -	.mask		= mv64x60_mask_low, -	.mask_ack	= mv64x60_mask_low, -	.unmask		= mv64x60_unmask_low, +	.irq_mask	= mv64x60_mask_low, +	.irq_mask_ack	= mv64x60_mask_low, +	.irq_unmask	= mv64x60_unmask_low,  };  /*   * mv64x60_chip_high functions   */ -static void mv64x60_mask_high(unsigned int virq) +static void mv64x60_mask_high(struct irq_data *d)  { -	int level2 = irq_map[virq].hwirq & MV64x60_LEVEL2_MASK; +	int level2 = irq_map[d->irq].hwirq & MV64x60_LEVEL2_MASK;  	unsigned long flags;  	spin_lock_irqsave(&mv64x60_lock, flags); @@ -126,9 +126,9 @@ static void mv64x60_mask_high(unsigned int virq)  	(void)in_le32(mv64x60_irq_reg_base + MV64X60_IC_CPU0_INTR_MASK_HI);  } -static void mv64x60_unmask_high(unsigned int virq) +static void mv64x60_unmask_high(struct irq_data *d)  { -	int level2 = irq_map[virq].hwirq & MV64x60_LEVEL2_MASK; +	int level2 = irq_map[d->irq].hwirq & MV64x60_LEVEL2_MASK;  	unsigned long flags;  	spin_lock_irqsave(&mv64x60_lock, flags); @@ -141,18 +141,18 @@ static void mv64x60_unmask_high(unsigned int virq)  static struct irq_chip mv64x60_chip_high = {  	.name		= "mv64x60_high", -	.mask		= mv64x60_mask_high, -	.mask_ack	= mv64x60_mask_high, -	.unmask		= mv64x60_unmask_high, +	.irq_mask	= mv64x60_mask_high, +	.irq_mask_ack	= mv64x60_mask_high, +	.irq_unmask	= mv64x60_unmask_high,  };  /*   * mv64x60_chip_gpp functions   */ -static void mv64x60_mask_gpp(unsigned int virq) +static void mv64x60_mask_gpp(struct irq_data *d)  { -	int level2 = irq_map[virq].hwirq & MV64x60_LEVEL2_MASK; +	int level2 = irq_map[d->irq].hwirq & MV64x60_LEVEL2_MASK;  	unsigned long flags;  	spin_lock_irqsave(&mv64x60_lock, flags); @@ -163,9 +163,9 @@ static void mv64x60_mask_gpp(unsigned int virq)  	(void)in_le32(mv64x60_gpp_reg_base + MV64x60_GPP_INTR_MASK);  } -static void mv64x60_mask_ack_gpp(unsigned int virq) +static void mv64x60_mask_ack_gpp(struct irq_data *d)  { -	int level2 = irq_map[virq].hwirq & MV64x60_LEVEL2_MASK; +	int level2 = irq_map[d->irq].hwirq & MV64x60_LEVEL2_MASK;  	unsigned long flags;  	spin_lock_irqsave(&mv64x60_lock, flags); @@ -178,9 +178,9 @@ static void mv64x60_mask_ack_gpp(unsigned int virq)  	(void)in_le32(mv64x60_gpp_reg_base + MV64x60_GPP_INTR_CAUSE);  } -static void mv64x60_unmask_gpp(unsigned int virq) +static void mv64x60_unmask_gpp(struct irq_data *d)  { -	int level2 = irq_map[virq].hwirq & MV64x60_LEVEL2_MASK; +	int level2 = irq_map[d->irq].hwirq & MV64x60_LEVEL2_MASK;  	unsigned long flags;  	spin_lock_irqsave(&mv64x60_lock, flags); @@ -193,9 +193,9 @@ static void mv64x60_unmask_gpp(unsigned int virq)  static struct irq_chip mv64x60_chip_gpp = {  	.name		= "mv64x60_gpp", -	.mask		= mv64x60_mask_gpp, -	.mask_ack	= mv64x60_mask_ack_gpp, -	.unmask		= mv64x60_unmask_gpp, +	.irq_mask	= mv64x60_mask_gpp, +	.irq_mask_ack	= mv64x60_mask_ack_gpp, +	.irq_unmask	= mv64x60_unmask_gpp,  };  /* diff --git a/arch/powerpc/sysdev/qe_lib/qe_ic.c b/arch/powerpc/sysdev/qe_lib/qe_ic.c index 541ba986364..8c9ded8ea07 100644 --- a/arch/powerpc/sysdev/qe_lib/qe_ic.c +++ b/arch/powerpc/sysdev/qe_lib/qe_ic.c @@ -189,15 +189,20 @@ static inline void qe_ic_write(volatile __be32  __iomem * base, unsigned int reg  static inline struct qe_ic *qe_ic_from_irq(unsigned int virq)  { -	return irq_to_desc(virq)->chip_data; +	return get_irq_chip_data(virq); +} + +static inline struct qe_ic *qe_ic_from_irq_data(struct irq_data *d) +{ +	return irq_data_get_irq_chip_data(d);  }  #define virq_to_hw(virq)	((unsigned int)irq_map[virq].hwirq) -static void qe_ic_unmask_irq(unsigned int virq) +static void qe_ic_unmask_irq(struct irq_data *d)  { -	struct qe_ic *qe_ic = qe_ic_from_irq(virq); -	unsigned int src = virq_to_hw(virq); +	struct qe_ic *qe_ic = qe_ic_from_irq_data(d); +	unsigned int src = virq_to_hw(d->irq);  	unsigned long flags;  	u32 temp; @@ -210,10 +215,10 @@ static void qe_ic_unmask_irq(unsigned int virq)  	raw_spin_unlock_irqrestore(&qe_ic_lock, flags);  } -static void qe_ic_mask_irq(unsigned int virq) +static void qe_ic_mask_irq(struct irq_data *d)  { -	struct qe_ic *qe_ic = qe_ic_from_irq(virq); -	unsigned int src = virq_to_hw(virq); +	struct qe_ic *qe_ic = qe_ic_from_irq_data(d); +	unsigned int src = virq_to_hw(d->irq);  	unsigned long flags;  	u32 temp; @@ -238,9 +243,9 @@ static void qe_ic_mask_irq(unsigned int virq)  static struct irq_chip qe_ic_irq_chip = {  	.name = "QEIC", -	.unmask = qe_ic_unmask_irq, -	.mask = qe_ic_mask_irq, -	.mask_ack = qe_ic_mask_irq, +	.irq_unmask = qe_ic_unmask_irq, +	.irq_mask = qe_ic_mask_irq, +	.irq_mask_ack = qe_ic_mask_irq,  };  static int qe_ic_host_match(struct irq_host *h, struct device_node *node) diff --git a/arch/powerpc/sysdev/tsi108_pci.c b/arch/powerpc/sysdev/tsi108_pci.c index 0ab9281e49a..02c91db9003 100644 --- a/arch/powerpc/sysdev/tsi108_pci.c +++ b/arch/powerpc/sysdev/tsi108_pci.c @@ -343,24 +343,9 @@ static inline unsigned int get_pci_source(void)   * Linux descriptor level callbacks   */ -static void tsi108_pci_irq_enable(u_int irq) +static void tsi108_pci_irq_unmask(struct irq_data *d)  { -	tsi108_pci_int_unmask(irq); -} - -static void tsi108_pci_irq_disable(u_int irq) -{ -	tsi108_pci_int_mask(irq); -} - -static void tsi108_pci_irq_ack(u_int irq) -{ -	tsi108_pci_int_mask(irq); -} - -static void tsi108_pci_irq_end(u_int irq) -{ -	tsi108_pci_int_unmask(irq); +	tsi108_pci_int_unmask(d->irq);  	/* Enable interrupts from PCI block */  	tsi108_write_reg(TSI108_PCI_OFFSET + TSI108_PCI_IRP_ENABLE, @@ -370,16 +355,25 @@ static void tsi108_pci_irq_end(u_int irq)  	mb();  } +static void tsi108_pci_irq_mask(struct irq_data *d) +{ +	tsi108_pci_int_mask(d->irq); +} + +static void tsi108_pci_irq_ack(struct irq_data *d) +{ +	tsi108_pci_int_mask(d->irq); +} +  /*   * Interrupt controller descriptor for cascaded PCI interrupt controller.   */  static struct irq_chip tsi108_pci_irq = {  	.name = "tsi108_PCI_int", -	.mask = tsi108_pci_irq_disable, -	.ack = tsi108_pci_irq_ack, -	.end = tsi108_pci_irq_end, -	.unmask = tsi108_pci_irq_enable, +	.irq_mask = tsi108_pci_irq_mask, +	.irq_ack = tsi108_pci_irq_ack, +	.irq_unmask = tsi108_pci_irq_unmask,  };  static int pci_irq_host_xlate(struct irq_host *h, struct device_node *ct, @@ -437,8 +431,11 @@ void __init tsi108_pci_int_init(struct device_node *node)  void tsi108_irq_cascade(unsigned int irq, struct irq_desc *desc)  { +	struct irq_chip *chip = get_irq_desc_chip(desc);  	unsigned int cascade_irq = get_pci_source(); +  	if (cascade_irq != NO_IRQ)  		generic_handle_irq(cascade_irq); -	desc->chip->eoi(irq); + +	chip->irq_eoi(&desc->irq_data);  } diff --git a/arch/powerpc/sysdev/uic.c b/arch/powerpc/sysdev/uic.c index 0038fb78f09..835f7958b23 100644 --- a/arch/powerpc/sysdev/uic.c +++ b/arch/powerpc/sysdev/uic.c @@ -55,11 +55,11 @@ struct uic {  	struct irq_host	*irqhost;  }; -static void uic_unmask_irq(unsigned int virq) +static void uic_unmask_irq(struct irq_data *d)  { -	struct irq_desc *desc = irq_to_desc(virq); -	struct uic *uic = get_irq_chip_data(virq); -	unsigned int src = uic_irq_to_hw(virq); +	struct irq_desc *desc = irq_to_desc(d->irq); +	struct uic *uic = irq_data_get_irq_chip_data(d); +	unsigned int src = uic_irq_to_hw(d->irq);  	unsigned long flags;  	u32 er, sr; @@ -74,10 +74,10 @@ static void uic_unmask_irq(unsigned int virq)  	spin_unlock_irqrestore(&uic->lock, flags);  } -static void uic_mask_irq(unsigned int virq) +static void uic_mask_irq(struct irq_data *d)  { -	struct uic *uic = get_irq_chip_data(virq); -	unsigned int src = uic_irq_to_hw(virq); +	struct uic *uic = irq_data_get_irq_chip_data(d); +	unsigned int src = uic_irq_to_hw(d->irq);  	unsigned long flags;  	u32 er; @@ -88,10 +88,10 @@ static void uic_mask_irq(unsigned int virq)  	spin_unlock_irqrestore(&uic->lock, flags);  } -static void uic_ack_irq(unsigned int virq) +static void uic_ack_irq(struct irq_data *d)  { -	struct uic *uic = get_irq_chip_data(virq); -	unsigned int src = uic_irq_to_hw(virq); +	struct uic *uic = irq_data_get_irq_chip_data(d); +	unsigned int src = uic_irq_to_hw(d->irq);  	unsigned long flags;  	spin_lock_irqsave(&uic->lock, flags); @@ -99,11 +99,11 @@ static void uic_ack_irq(unsigned int virq)  	spin_unlock_irqrestore(&uic->lock, flags);  } -static void uic_mask_ack_irq(unsigned int virq) +static void uic_mask_ack_irq(struct irq_data *d)  { -	struct irq_desc *desc = irq_to_desc(virq); -	struct uic *uic = get_irq_chip_data(virq); -	unsigned int src = uic_irq_to_hw(virq); +	struct irq_desc *desc = irq_to_desc(d->irq); +	struct uic *uic = irq_data_get_irq_chip_data(d); +	unsigned int src = uic_irq_to_hw(d->irq);  	unsigned long flags;  	u32 er, sr; @@ -125,18 +125,18 @@ static void uic_mask_ack_irq(unsigned int virq)  	spin_unlock_irqrestore(&uic->lock, flags);  } -static int uic_set_irq_type(unsigned int virq, unsigned int flow_type) +static int uic_set_irq_type(struct irq_data *d, unsigned int flow_type)  { -	struct uic *uic = get_irq_chip_data(virq); -	unsigned int src = uic_irq_to_hw(virq); -	struct irq_desc *desc = irq_to_desc(virq); +	struct uic *uic = irq_data_get_irq_chip_data(d); +	unsigned int src = uic_irq_to_hw(d->irq); +	struct irq_desc *desc = irq_to_desc(d->irq);  	unsigned long flags;  	int trigger, polarity;  	u32 tr, pr, mask;  	switch (flow_type & IRQ_TYPE_SENSE_MASK) {  	case IRQ_TYPE_NONE: -		uic_mask_irq(virq); +		uic_mask_irq(d);  		return 0;  	case IRQ_TYPE_EDGE_RISING: @@ -178,11 +178,11 @@ static int uic_set_irq_type(unsigned int virq, unsigned int flow_type)  static struct irq_chip uic_irq_chip = {  	.name		= "UIC", -	.unmask		= uic_unmask_irq, -	.mask		= uic_mask_irq, - 	.mask_ack	= uic_mask_ack_irq, -	.ack		= uic_ack_irq, -	.set_type	= uic_set_irq_type, +	.irq_unmask	= uic_unmask_irq, +	.irq_mask	= uic_mask_irq, +	.irq_mask_ack	= uic_mask_ack_irq, +	.irq_ack	= uic_ack_irq, +	.irq_set_type	= uic_set_irq_type,  };  static int uic_host_map(struct irq_host *h, unsigned int virq, @@ -220,6 +220,7 @@ static struct irq_host_ops uic_host_ops = {  void uic_irq_cascade(unsigned int virq, struct irq_desc *desc)  { +	struct irq_chip *chip = get_irq_desc_chip(desc);  	struct uic *uic = get_irq_data(virq);  	u32 msr;  	int src; @@ -227,9 +228,9 @@ void uic_irq_cascade(unsigned int virq, struct irq_desc *desc)  	raw_spin_lock(&desc->lock);  	if (desc->status & IRQ_LEVEL) -		desc->chip->mask(virq); +		chip->irq_mask(&desc->irq_data);  	else -		desc->chip->mask_ack(virq); +		chip->irq_mask_ack(&desc->irq_data);  	raw_spin_unlock(&desc->lock);  	msr = mfdcr(uic->dcrbase + UIC_MSR); @@ -244,9 +245,9 @@ void uic_irq_cascade(unsigned int virq, struct irq_desc *desc)  uic_irq_ret:  	raw_spin_lock(&desc->lock);  	if (desc->status & IRQ_LEVEL) -		desc->chip->ack(virq); -	if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask) -		desc->chip->unmask(virq); +		chip->irq_ack(&desc->irq_data); +	if (!(desc->status & IRQ_DISABLED) && chip->irq_unmask) +		chip->irq_unmask(&desc->irq_data);  	raw_spin_unlock(&desc->lock);  } diff --git a/arch/powerpc/sysdev/xilinx_intc.c b/arch/powerpc/sysdev/xilinx_intc.c index 1e0ccfaf403..7436f3ed4df 100644 --- a/arch/powerpc/sysdev/xilinx_intc.c +++ b/arch/powerpc/sysdev/xilinx_intc.c @@ -69,17 +69,17 @@ static unsigned char xilinx_intc_map_senses[] = {   *   * IRQ Chip common (across level and edge) operations   */ -static void xilinx_intc_mask(unsigned int virq) +static void xilinx_intc_mask(struct irq_data *d)  { -	int irq = virq_to_hw(virq); -	void * regs = get_irq_chip_data(virq); +	int irq = virq_to_hw(d->irq); +	void * regs = irq_data_get_irq_chip_data(d);  	pr_debug("mask: %d\n", irq);  	out_be32(regs + XINTC_CIE, 1 << irq);  } -static int xilinx_intc_set_type(unsigned int virq, unsigned int flow_type) +static int xilinx_intc_set_type(struct irq_data *d, unsigned int flow_type)  { -	struct irq_desc *desc = irq_to_desc(virq); +	struct irq_desc *desc = irq_to_desc(d->irq);  	desc->status &= ~(IRQ_TYPE_SENSE_MASK | IRQ_LEVEL);  	desc->status |= flow_type & IRQ_TYPE_SENSE_MASK; @@ -91,10 +91,10 @@ static int xilinx_intc_set_type(unsigned int virq, unsigned int flow_type)  /*   * IRQ Chip level operations   */ -static void xilinx_intc_level_unmask(unsigned int virq) +static void xilinx_intc_level_unmask(struct irq_data *d)  { -	int irq = virq_to_hw(virq); -	void * regs = get_irq_chip_data(virq); +	int irq = virq_to_hw(d->irq); +	void * regs = irq_data_get_irq_chip_data(d);  	pr_debug("unmask: %d\n", irq);  	out_be32(regs + XINTC_SIE, 1 << irq); @@ -107,37 +107,37 @@ static void xilinx_intc_level_unmask(unsigned int virq)  static struct irq_chip xilinx_intc_level_irqchip = {  	.name = "Xilinx Level INTC", -	.mask = xilinx_intc_mask, -	.mask_ack = xilinx_intc_mask, -	.unmask = xilinx_intc_level_unmask, -	.set_type = xilinx_intc_set_type, +	.irq_mask = xilinx_intc_mask, +	.irq_mask_ack = xilinx_intc_mask, +	.irq_unmask = xilinx_intc_level_unmask, +	.irq_set_type = xilinx_intc_set_type,  };  /*   * IRQ Chip edge operations   */ -static void xilinx_intc_edge_unmask(unsigned int virq) +static void xilinx_intc_edge_unmask(struct irq_data *d)  { -	int irq = virq_to_hw(virq); -	void *regs = get_irq_chip_data(virq); +	int irq = virq_to_hw(d->irq); +	void *regs = irq_data_get_irq_chip_data(d);  	pr_debug("unmask: %d\n", irq);  	out_be32(regs + XINTC_SIE, 1 << irq);  } -static void xilinx_intc_edge_ack(unsigned int virq) +static void xilinx_intc_edge_ack(struct irq_data *d)  { -	int irq = virq_to_hw(virq); -	void * regs = get_irq_chip_data(virq); +	int irq = virq_to_hw(d->irq); +	void * regs = irq_data_get_irq_chip_data(d);  	pr_debug("ack: %d\n", irq);  	out_be32(regs + XINTC_IAR, 1 << irq);  }  static struct irq_chip xilinx_intc_edge_irqchip = {  	.name = "Xilinx Edge  INTC", -	.mask = xilinx_intc_mask, -	.unmask = xilinx_intc_edge_unmask, -	.ack = xilinx_intc_edge_ack, -	.set_type = xilinx_intc_set_type, +	.irq_mask = xilinx_intc_mask, +	.irq_unmask = xilinx_intc_edge_unmask, +	.irq_ack = xilinx_intc_edge_ack, +	.irq_set_type = xilinx_intc_set_type,  };  /* @@ -229,12 +229,14 @@ int xilinx_intc_get_irq(void)   */  static void xilinx_i8259_cascade(unsigned int irq, struct irq_desc *desc)  { +	struct irq_chip *chip = get_irq_desc_chip(desc);  	unsigned int cascade_irq = i8259_irq(); +  	if (cascade_irq)  		generic_handle_irq(cascade_irq);  	/* Let xilinx_intc end the interrupt */ -	desc->chip->unmask(irq); +	chip->irq_unmask(&desc->irq_data);  }  static void __init xilinx_i8259_setup_cascade(void)  |