Skip to content

Commit

Permalink
irq_domain: Replace irq_alloc_host() with revmap-specific initializers
Browse files Browse the repository at this point in the history
Each revmap type has different arguments for setting up the revmap.
This patch splits up the generator functions so that each revmap type
can do its own setup and the user doesn't need to keep track of how
each revmap type handles the arguments.

This patch also adds a host_data argument to the generators.  There are
cases where the host_data pointer will be needed before the function returns.
ie. the legacy map calls the .map callback for each irq before returning.

v2: - Add void *host_data argument to irq_domain_add_*() functions
    - fixed failure to compile
    - Moved IRQ_DOMAIN_MAP_* defines into irqdomain.c

Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Cc: Rob Herring <rob.herring@calxeda.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Milton Miller <miltonm@bga.com>
Tested-by: Olof Johansson <olof@lixom.net>
  • Loading branch information
Grant Likely committed Feb 16, 2012
1 parent 6870065 commit a8db8cf
Show file tree
Hide file tree
Showing 35 changed files with 198 additions and 185 deletions.
3 changes: 1 addition & 2 deletions arch/powerpc/platforms/512x/mpc5121_ads_cpld.c
Original file line number Diff line number Diff line change
Expand Up @@ -190,8 +190,7 @@ mpc5121_ads_cpld_pic_init(void)

cpld_pic_node = of_node_get(np);

cpld_pic_host =
irq_alloc_host(np, IRQ_DOMAIN_MAP_LINEAR, 16, &cpld_pic_host_ops, 16);
cpld_pic_host = irq_domain_add_linear(np, 16, &cpld_pic_host_ops, NULL);
if (!cpld_pic_host) {
printk(KERN_ERR "CPLD PIC: failed to allocate irq host!\n");
goto end;
Expand Down
7 changes: 2 additions & 5 deletions arch/powerpc/platforms/52xx/media5200.c
Original file line number Diff line number Diff line change
Expand Up @@ -173,15 +173,12 @@ static void __init media5200_init_irq(void)

spin_lock_init(&media5200_irq.lock);

media5200_irq.irqhost = irq_alloc_host(fpga_np, IRQ_DOMAIN_MAP_LINEAR,
MEDIA5200_NUM_IRQS,
&media5200_irq_ops, -1);
media5200_irq.irqhost = irq_domain_add_linear(fpga_np,
MEDIA5200_NUM_IRQS, &media5200_irq_ops, &media5200_irq);
if (!media5200_irq.irqhost)
goto out;
pr_debug("%s: allocated irqhost\n", __func__);

media5200_irq.irqhost->host_data = &media5200_irq;

irq_set_handler_data(cascade_virq, &media5200_irq);
irq_set_chained_handler(cascade_virq, media5200_irq_cascade);

Expand Down
6 changes: 2 additions & 4 deletions arch/powerpc/platforms/52xx/mpc52xx_gpt.c
Original file line number Diff line number Diff line change
Expand Up @@ -252,14 +252,12 @@ mpc52xx_gpt_irq_setup(struct mpc52xx_gpt_priv *gpt, struct device_node *node)
if (!cascade_virq)
return;

gpt->irqhost = irq_alloc_host(node, IRQ_DOMAIN_MAP_LINEAR, 1,
&mpc52xx_gpt_irq_ops, -1);
gpt->irqhost = irq_domain_add_linear(node, 1, &mpc52xx_gpt_irq_ops, gpt);
if (!gpt->irqhost) {
dev_err(gpt->dev, "irq_alloc_host() failed\n");
dev_err(gpt->dev, "irq_domain_add_linear() failed\n");
return;
}

gpt->irqhost->host_data = gpt;
irq_set_handler_data(cascade_virq, gpt);
irq_set_chained_handler(cascade_virq, mpc52xx_gpt_irq_cascade);

Expand Down
4 changes: 2 additions & 2 deletions arch/powerpc/platforms/52xx/mpc52xx_pic.c
Original file line number Diff line number Diff line change
Expand Up @@ -444,9 +444,9 @@ void __init mpc52xx_init_irq(void)
* As last step, add an irq host to translate the real
* hw irq information provided by the ofw to linux virq
*/
mpc52xx_irqhost = irq_alloc_host(picnode, IRQ_DOMAIN_MAP_LINEAR,
mpc52xx_irqhost = irq_domain_add_linear(picnode,
MPC52xx_IRQ_HIGHTESTHWIRQ,
&mpc52xx_irqhost_ops, -1);
&mpc52xx_irqhost_ops, NULL);

if (!mpc52xx_irqhost)
panic(__FILE__ ": Cannot allocate the IRQ host\n");
Expand Down
6 changes: 1 addition & 5 deletions arch/powerpc/platforms/82xx/pq2ads-pci-pic.c
Original file line number Diff line number Diff line change
Expand Up @@ -156,17 +156,13 @@ int __init pq2ads_pci_init_irq(void)
out_be32(&priv->regs->mask, ~0);
mb();

host = irq_alloc_host(np, IRQ_DOMAIN_MAP_LINEAR, NUM_IRQS,
&pci_pic_host_ops, NUM_IRQS);
host = irq_domain_add_linear(np, NUM_IRQS, &pci_pic_host_ops, priv);
if (!host) {
ret = -ENOMEM;
goto out_unmap_regs;
}

host->host_data = priv;

priv->host = host;
host->host_data = priv;
irq_set_handler_data(irq, priv);
irq_set_chained_handler(irq, pq2ads_pci_irq_demux);

Expand Down
5 changes: 2 additions & 3 deletions arch/powerpc/platforms/85xx/socrates_fpga_pic.c
Original file line number Diff line number Diff line change
Expand Up @@ -280,9 +280,8 @@ void socrates_fpga_pic_init(struct device_node *pic)
int i;

/* Setup an irq_domain structure */
socrates_fpga_pic_irq_host = irq_alloc_host(pic, IRQ_DOMAIN_MAP_LINEAR,
SOCRATES_FPGA_NUM_IRQS, &socrates_fpga_pic_host_ops,
SOCRATES_FPGA_NUM_IRQS);
socrates_fpga_pic_irq_host = irq_domain_add_linear(pic,
SOCRATES_FPGA_NUM_IRQS, &socrates_fpga_pic_host_ops, NULL);
if (socrates_fpga_pic_irq_host == NULL) {
pr_err("FPGA PIC: Unable to allocate host\n");
return;
Expand Down
5 changes: 2 additions & 3 deletions arch/powerpc/platforms/86xx/gef_pic.c
Original file line number Diff line number Diff line change
Expand Up @@ -212,9 +212,8 @@ void __init gef_pic_init(struct device_node *np)
}

/* Setup an irq_domain structure */
gef_pic_irq_host = irq_alloc_host(np, IRQ_DOMAIN_MAP_LINEAR,
GEF_PIC_NUM_IRQS,
&gef_pic_host_ops, NO_IRQ);
gef_pic_irq_host = irq_domain_add_linear(np, GEF_PIC_NUM_IRQS,
&gef_pic_host_ops, NULL);
if (gef_pic_irq_host == NULL)
return;

Expand Down
5 changes: 1 addition & 4 deletions arch/powerpc/platforms/cell/axon_msi.c
Original file line number Diff line number Diff line change
Expand Up @@ -392,16 +392,13 @@ static int axon_msi_probe(struct platform_device *device)
}
memset(msic->fifo_virt, 0xff, MSIC_FIFO_SIZE_BYTES);

msic->irq_domain = irq_alloc_host(dn, IRQ_DOMAIN_MAP_NOMAP,
NR_IRQS, &msic_host_ops, 0);
msic->irq_domain = irq_domain_add_nomap(dn, &msic_host_ops, msic);
if (!msic->irq_domain) {
printk(KERN_ERR "axon_msi: couldn't allocate irq_domain for %s\n",
dn->full_name);
goto out_free_fifo;
}

msic->irq_domain->host_data = msic;

irq_set_handler_data(virq, msic);
irq_set_chained_handler(virq, axon_msi_cascade);
pr_devel("axon_msi: irq 0x%x setup for axon_msi\n", virq);
Expand Down
4 changes: 1 addition & 3 deletions arch/powerpc/platforms/cell/beat_interrupt.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,9 +239,7 @@ void __init beatic_init_IRQ(void)
ppc_md.get_irq = beatic_get_irq;

/* Allocate an irq host */
beatic_host = irq_alloc_host(NULL, IRQ_DOMAIN_MAP_NOMAP, 0,
&beatic_pic_host_ops,
0);
beatic_host = irq_domain_add_nomap(NULL, &beatic_pic_host_ops, NULL);
BUG_ON(beatic_host == NULL);
irq_set_default_host(beatic_host);
}
Expand Down
4 changes: 2 additions & 2 deletions arch/powerpc/platforms/cell/interrupt.c
Original file line number Diff line number Diff line change
Expand Up @@ -378,8 +378,8 @@ static int __init setup_iic(void)
void __init iic_init_IRQ(void)
{
/* Setup an irq host data structure */
iic_host = irq_alloc_host(NULL, IRQ_DOMAIN_MAP_LINEAR, IIC_SOURCE_COUNT,
&iic_host_ops, IIC_IRQ_INVALID);
iic_host = irq_domain_add_linear(NULL, IIC_SOURCE_COUNT, &iic_host_ops,
NULL);
BUG_ON(iic_host == NULL);
irq_set_default_host(iic_host);

Expand Down
6 changes: 2 additions & 4 deletions arch/powerpc/platforms/cell/spider-pic.c
Original file line number Diff line number Diff line change
Expand Up @@ -299,12 +299,10 @@ static void __init spider_init_one(struct device_node *of_node, int chip,
panic("spider_pic: can't map registers !");

/* Allocate a host */
pic->host = irq_alloc_host(of_node, IRQ_DOMAIN_MAP_LINEAR,
SPIDER_SRC_COUNT, &spider_host_ops,
SPIDER_IRQ_INVALID);
pic->host = irq_domain_add_linear(of_node, SPIDER_SRC_COUNT,
&spider_host_ops, pic);
if (pic->host == NULL)
panic("spider_pic: can't allocate irq host !");
pic->host->host_data = pic;

/* Go through all sources and disable them */
for (i = 0; i < SPIDER_SRC_COUNT; i++) {
Expand Down
6 changes: 2 additions & 4 deletions arch/powerpc/platforms/embedded6xx/flipper-pic.c
Original file line number Diff line number Diff line change
Expand Up @@ -159,15 +159,13 @@ struct irq_domain * __init flipper_pic_init(struct device_node *np)

__flipper_quiesce(io_base);

irq_domain = irq_alloc_host(np, IRQ_DOMAIN_MAP_LINEAR, FLIPPER_NR_IRQS,
&flipper_irq_domain_ops, -1);
irq_domain = irq_domain_add_linear(np, FLIPPER_NR_IRQS,
&flipper_irq_domain_ops, io_base);
if (!irq_domain) {
pr_err("failed to allocate irq_domain\n");
return NULL;
}

irq_domain->host_data = io_base;

out:
return irq_domain;
}
Expand Down
5 changes: 2 additions & 3 deletions arch/powerpc/platforms/embedded6xx/hlwd-pic.c
Original file line number Diff line number Diff line change
Expand Up @@ -177,13 +177,12 @@ struct irq_domain *hlwd_pic_init(struct device_node *np)

__hlwd_quiesce(io_base);

irq_domain = irq_alloc_host(np, IRQ_DOMAIN_MAP_LINEAR, HLWD_NR_IRQS,
&hlwd_irq_domain_ops, -1);
irq_domain = irq_domain_add_linear(np, HLWD_NR_IRQS,
&hlwd_irq_domain_ops, io_base);
if (!irq_domain) {
pr_err("failed to allocate irq_domain\n");
return NULL;
}
irq_domain->host_data = io_base;

return irq_domain;
}
Expand Down
3 changes: 1 addition & 2 deletions arch/powerpc/platforms/iseries/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -380,8 +380,7 @@ void __init iSeries_init_IRQ(void)
/* Create irq host. No need for a revmap since HV will give us
* back our virtual irq number
*/
host = irq_alloc_host(NULL, IRQ_DOMAIN_MAP_NOMAP, 0,
&iseries_irq_domain_ops, 0);
host = irq_domain_add_nomap(NULL, &iseries_irq_domain_ops, NULL);
BUG_ON(host == NULL);
irq_set_default_host(host);

Expand Down
5 changes: 2 additions & 3 deletions arch/powerpc/platforms/powermac/pic.c
Original file line number Diff line number Diff line change
Expand Up @@ -352,9 +352,8 @@ static void __init pmac_pic_probe_oldstyle(void)
/*
* Allocate an irq host
*/
pmac_pic_host = irq_alloc_host(master, IRQ_DOMAIN_MAP_LINEAR, max_irqs,
&pmac_pic_host_ops,
max_irqs);
pmac_pic_host = irq_domain_add_linear(master, max_irqs,
&pmac_pic_host_ops, NULL);
BUG_ON(pmac_pic_host == NULL);
irq_set_default_host(pmac_pic_host);

Expand Down
3 changes: 1 addition & 2 deletions arch/powerpc/platforms/powermac/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -192,8 +192,7 @@ static int psurge_secondary_ipi_init(void)
{
int rc = -ENOMEM;

psurge_host = irq_alloc_host(NULL, IRQ_DOMAIN_MAP_NOMAP, 0,
&psurge_host_ops, 0);
psurge_host = irq_domain_add_nomap(NULL, &psurge_host_ops, NULL);

if (psurge_host)
psurge_secondary_virq = irq_create_direct_mapping(psurge_host);
Expand Down
3 changes: 1 addition & 2 deletions arch/powerpc/platforms/ps3/interrupt.c
Original file line number Diff line number Diff line change
Expand Up @@ -753,8 +753,7 @@ void __init ps3_init_IRQ(void)
unsigned cpu;
struct irq_domain *host;

host = irq_alloc_host(NULL, IRQ_DOMAIN_MAP_NOMAP, 0, &ps3_host_ops,
PS3_INVALID_OUTLET);
host = irq_domain_add_nomap(NULL, &ps3_host_ops, NULL);
irq_set_default_host(host);
irq_set_virq_count(PS3_PLUG_MAX + 1);

Expand Down
7 changes: 2 additions & 5 deletions arch/powerpc/platforms/wsp/opb_pic.c
Original file line number Diff line number Diff line change
Expand Up @@ -263,21 +263,18 @@ struct opb_pic *opb_pic_init_one(struct device_node *dn)
goto free_opb;
}

/* Allocate an irq host so that Linux knows that despite only
/* Allocate an irq domain so that Linux knows that despite only
* having one interrupt to issue, we're the controller for multiple
* hardware IRQs, so later we can lookup their virtual IRQs. */

opb->host = irq_alloc_host(dn, IRQ_DOMAIN_MAP_LINEAR,
OPB_NR_IRQS, &opb_host_ops, -1);

opb->host = irq_domain_add_linear(dn, OPB_NR_IRQS, &opb_host_ops, opb);
if (!opb->host) {
printk(KERN_ERR "opb: Failed to allocate IRQ host!\n");
goto free_regs;
}

opb->index = opb_index++;
spin_lock_init(&opb->lock);
opb->host->host_data = opb;

/* Disable all interrupts by default */
opb_out(opb, OPB_MLSASIER, 0);
Expand Down
3 changes: 1 addition & 2 deletions arch/powerpc/sysdev/cpm1.c
Original file line number Diff line number Diff line change
Expand Up @@ -164,8 +164,7 @@ unsigned int cpm_pic_init(void)

out_be32(&cpic_reg->cpic_cimr, 0);

cpm_pic_host = irq_alloc_host(np, IRQ_DOMAIN_MAP_LINEAR,
64, &cpm_pic_host_ops, 64);
cpm_pic_host = irq_domain_add_linear(np, 64, &cpm_pic_host_ops, NULL);
if (cpm_pic_host == NULL) {
printk(KERN_ERR "CPM2 PIC: failed to allocate irq host!\n");
sirq = NO_IRQ;
Expand Down
3 changes: 1 addition & 2 deletions arch/powerpc/sysdev/cpm2_pic.c
Original file line number Diff line number Diff line change
Expand Up @@ -275,8 +275,7 @@ void cpm2_pic_init(struct device_node *node)
out_be32(&cpm2_intctl->ic_scprrl, 0x05309770);

/* create a legacy host */
cpm2_pic_host = irq_alloc_host(node, IRQ_DOMAIN_MAP_LINEAR,
64, &cpm2_pic_host_ops, 64);
cpm2_pic_host = irq_domain_add_linear(node, 64, &cpm2_pic_host_ops, NULL);
if (cpm2_pic_host == NULL) {
printk(KERN_ERR "CPM2 PIC: failed to allocate irq host!\n");
return;
Expand Down
6 changes: 2 additions & 4 deletions arch/powerpc/sysdev/ehv_pic.c
Original file line number Diff line number Diff line change
Expand Up @@ -275,9 +275,8 @@ void __init ehv_pic_init(void)
return;
}

ehv_pic->irqhost = irq_alloc_host(np, IRQ_DOMAIN_MAP_LINEAR,
NR_EHV_PIC_INTS, &ehv_pic_host_ops, 0);

ehv_pic->irqhost = irq_domain_add_linear(np, NR_EHV_PIC_INTS,
&ehv_pic_host_ops, ehv_pic);
if (!ehv_pic->irqhost) {
of_node_put(np);
kfree(ehv_pic);
Expand All @@ -293,7 +292,6 @@ void __init ehv_pic_init(void)
of_node_put(np2);
}

ehv_pic->irqhost->host_data = ehv_pic;
ehv_pic->hc_irq = ehv_pic_irq_chip;
ehv_pic->hc_irq.irq_set_affinity = ehv_pic_set_affinity;
ehv_pic->coreint_flag = coreint_flag;
Expand Down
6 changes: 2 additions & 4 deletions arch/powerpc/sysdev/fsl_msi.c
Original file line number Diff line number Diff line change
Expand Up @@ -387,8 +387,8 @@ static int __devinit fsl_of_msi_probe(struct platform_device *dev)
}
platform_set_drvdata(dev, msi);

msi->irqhost = irq_alloc_host(dev->dev.of_node, IRQ_DOMAIN_MAP_LINEAR,
NR_MSI_IRQS, &fsl_msi_host_ops, 0);
msi->irqhost = irq_domain_add_linear(dev->dev.of_node,
NR_MSI_IRQS, &fsl_msi_host_ops, msi);

if (msi->irqhost == NULL) {
dev_err(&dev->dev, "No memory for MSI irqhost\n");
Expand Down Expand Up @@ -420,8 +420,6 @@ static int __devinit fsl_of_msi_probe(struct platform_device *dev)

msi->feature = features->fsl_pic_ip;

msi->irqhost->host_data = msi;

/*
* Remember the phandle, so that we can match with any PCI nodes
* that have an "fsl,msi" property.
Expand Down
3 changes: 1 addition & 2 deletions arch/powerpc/sysdev/i8259.c
Original file line number Diff line number Diff line change
Expand Up @@ -263,8 +263,7 @@ void i8259_init(struct device_node *node, unsigned long intack_addr)
raw_spin_unlock_irqrestore(&i8259_lock, flags);

/* create a legacy host */
i8259_host = irq_alloc_host(node, IRQ_DOMAIN_MAP_LEGACY,
0, &i8259_host_ops, 0);
i8259_host = irq_domain_add_legacy(node, &i8259_host_ops, NULL);
if (i8259_host == NULL) {
printk(KERN_ERR "i8259: failed to allocate irq host !\n");
return;
Expand Down
7 changes: 2 additions & 5 deletions arch/powerpc/sysdev/ipic.c
Original file line number Diff line number Diff line change
Expand Up @@ -728,18 +728,15 @@ struct ipic * __init ipic_init(struct device_node *node, unsigned int flags)
if (ipic == NULL)
return NULL;

ipic->irqhost = irq_alloc_host(node, IRQ_DOMAIN_MAP_LINEAR,
NR_IPIC_INTS,
&ipic_host_ops, 0);
ipic->irqhost = irq_domain_add_linear(node, NR_IPIC_INTS,
&ipic_host_ops, ipic);
if (ipic->irqhost == NULL) {
kfree(ipic);
return NULL;
}

ipic->regs = ioremap(res.start, resource_size(&res));

ipic->irqhost->host_data = ipic;

/* init hw */
ipic_write(ipic->regs, IPIC_SICNR, 0x0);

Expand Down
3 changes: 1 addition & 2 deletions arch/powerpc/sysdev/mpc8xx_pic.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,8 +171,7 @@ int mpc8xx_pic_init(void)
goto out;
}

mpc8xx_pic_host = irq_alloc_host(np, IRQ_DOMAIN_MAP_LINEAR,
64, &mpc8xx_pic_host_ops, 64);
mpc8xx_pic_host = irq_domain_add_linear(np, 64, &mpc8xx_pic_host_ops, NULL);
if (mpc8xx_pic_host == NULL) {
printk(KERN_ERR "MPC8xx PIC: failed to allocate irq host!\n");
ret = -ENOMEM;
Expand Down
7 changes: 2 additions & 5 deletions arch/powerpc/sysdev/mpic.c
Original file line number Diff line number Diff line change
Expand Up @@ -1345,10 +1345,9 @@ struct mpic * __init mpic_alloc(struct device_node *node,
mpic->isu_shift = 1 + __ilog2(mpic->isu_size - 1);
mpic->isu_mask = (1 << mpic->isu_shift) - 1;

mpic->irqhost = irq_alloc_host(mpic->node, IRQ_DOMAIN_MAP_LINEAR,
mpic->irqhost = irq_domain_add_linear(mpic->node,
isu_size ? isu_size : mpic->num_sources,
&mpic_host_ops,
flags & MPIC_LARGE_VECTORS ? 2048 : 256);
&mpic_host_ops, mpic);

/*
* FIXME: The code leaks the MPIC object and mappings here; this
Expand All @@ -1357,8 +1356,6 @@ struct mpic * __init mpic_alloc(struct device_node *node,
if (mpic->irqhost == NULL)
return NULL;

mpic->irqhost->host_data = mpic;

/* Display version */
switch (greg_feature & MPIC_GREG_FEATURE_VERSION_MASK) {
case 1:
Expand Down
5 changes: 2 additions & 3 deletions arch/powerpc/sysdev/mv64x60_pic.c
Original file line number Diff line number Diff line change
Expand Up @@ -250,9 +250,8 @@ void __init mv64x60_init_irq(void)
paddr = of_translate_address(np, reg);
mv64x60_irq_reg_base = ioremap(paddr, reg[1]);

mv64x60_irq_host = irq_alloc_host(np, IRQ_DOMAIN_MAP_LINEAR,
MV64x60_NUM_IRQS,
&mv64x60_host_ops, MV64x60_NUM_IRQS);
mv64x60_irq_host = irq_domain_add_linear(np, MV64x60_NUM_IRQS,
&mv64x60_host_ops, NULL);

spin_lock_irqsave(&mv64x60_lock, flags);
out_le32(mv64x60_gpp_reg_base + MV64x60_GPP_INTR_MASK,
Expand Down
Loading

0 comments on commit a8db8cf

Please sign in to comment.