Commit 52964f87 authored by Michael Ellerman's avatar Michael Ellerman Committed by Paul Mackerras

[POWERPC] Add an optional device_node pointer to the irq_host

The majority of irq_host implementations (3 out of 4) are associated
with a device_node, and need to stash it somewhere. Rather than having
it somewhere different for each host, add an optional device_node pointer
to the irq_host structure.
Signed-off-by: default avatarMichael Ellerman <michael@ellerman.id.au>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 0ae0b545
...@@ -418,7 +418,8 @@ irq_hw_number_t virq_to_hw(unsigned int virq) ...@@ -418,7 +418,8 @@ irq_hw_number_t virq_to_hw(unsigned int virq)
} }
EXPORT_SYMBOL_GPL(virq_to_hw); EXPORT_SYMBOL_GPL(virq_to_hw);
__init_refok struct irq_host *irq_alloc_host(unsigned int revmap_type, __init_refok struct irq_host *irq_alloc_host(struct device_node *of_node,
unsigned int revmap_type,
unsigned int revmap_arg, unsigned int revmap_arg,
struct irq_host_ops *ops, struct irq_host_ops *ops,
irq_hw_number_t inval_irq) irq_hw_number_t inval_irq)
...@@ -446,6 +447,7 @@ __init_refok struct irq_host *irq_alloc_host(unsigned int revmap_type, ...@@ -446,6 +447,7 @@ __init_refok struct irq_host *irq_alloc_host(unsigned int revmap_type,
host->revmap_type = revmap_type; host->revmap_type = revmap_type;
host->inval_irq = inval_irq; host->inval_irq = inval_irq;
host->ops = ops; host->ops = ops;
host->of_node = of_node;
spin_lock_irqsave(&irq_big_lock, flags); spin_lock_irqsave(&irq_big_lock, flags);
......
...@@ -244,7 +244,7 @@ static struct irq_chip mpc52xx_sdma_irqchip = { ...@@ -244,7 +244,7 @@ static struct irq_chip mpc52xx_sdma_irqchip = {
static int mpc52xx_irqhost_match(struct irq_host *h, struct device_node *node) static int mpc52xx_irqhost_match(struct irq_host *h, struct device_node *node)
{ {
pr_debug("%s: node=%p\n", __func__, node); pr_debug("%s: node=%p\n", __func__, node);
return mpc52xx_irqhost->host_data == node; return h->of_node == node;
} }
static int mpc52xx_irqhost_xlate(struct irq_host *h, struct device_node *ct, static int mpc52xx_irqhost_xlate(struct irq_host *h, struct device_node *ct,
...@@ -419,14 +419,13 @@ void __init mpc52xx_init_irq(void) ...@@ -419,14 +419,13 @@ void __init mpc52xx_init_irq(void)
* hw irq information provided by the ofw to linux virq * hw irq information provided by the ofw to linux virq
*/ */
mpc52xx_irqhost = irq_alloc_host(IRQ_HOST_MAP_LINEAR, mpc52xx_irqhost = irq_alloc_host(picnode, IRQ_HOST_MAP_LINEAR,
MPC52xx_IRQ_HIGHTESTHWIRQ, MPC52xx_IRQ_HIGHTESTHWIRQ,
&mpc52xx_irqhost_ops, -1); &mpc52xx_irqhost_ops, -1);
if (!mpc52xx_irqhost) if (!mpc52xx_irqhost)
panic(__FILE__ ": Cannot allocate the IRQ host\n"); panic(__FILE__ ": Cannot allocate the IRQ host\n");
mpc52xx_irqhost->host_data = picnode;
printk(KERN_INFO "MPC52xx PIC is up and running!\n"); printk(KERN_INFO "MPC52xx PIC is up and running!\n");
} }
......
...@@ -61,7 +61,6 @@ static struct { ...@@ -61,7 +61,6 @@ static struct {
static unsigned long pci_int_base; static unsigned long pci_int_base;
static struct irq_host *pci_pic_host; static struct irq_host *pci_pic_host;
static struct device_node *pci_pic_node;
#endif #endif
static void __init mpc82xx_ads_pic_init(void) static void __init mpc82xx_ads_pic_init(void)
...@@ -401,7 +400,7 @@ m82xx_pci_irq_demux(unsigned int irq, struct irq_desc *desc) ...@@ -401,7 +400,7 @@ m82xx_pci_irq_demux(unsigned int irq, struct irq_desc *desc)
static int pci_pic_host_match(struct irq_host *h, struct device_node *node) static int pci_pic_host_match(struct irq_host *h, struct device_node *node)
{ {
return node == pci_pic_node; return h->of_node == node;
} }
static int pci_pic_host_map(struct irq_host *h, unsigned int virq, static int pci_pic_host_map(struct irq_host *h, unsigned int virq,
...@@ -478,7 +477,6 @@ void m82xx_pci_init_irq(void) ...@@ -478,7 +477,6 @@ void m82xx_pci_init_irq(void)
iounmap(immap); iounmap(immap);
return; return;
} }
pci_pic_node = of_node_get(np);
/* PCI interrupt controller registers: status and mask */ /* PCI interrupt controller registers: status and mask */
regs = of_get_property(np, "reg", &size); regs = of_get_property(np, "reg", &size);
if ((!regs) || (size <= 2)) { if ((!regs) || (size <= 2)) {
...@@ -490,7 +488,6 @@ void m82xx_pci_init_irq(void) ...@@ -490,7 +488,6 @@ void m82xx_pci_init_irq(void)
ioremap(regs[0], sizeof(*pci_regs.pci_int_stat_reg)); ioremap(regs[0], sizeof(*pci_regs.pci_int_stat_reg));
pci_regs.pci_int_mask_reg = pci_regs.pci_int_mask_reg =
ioremap(regs[1], sizeof(*pci_regs.pci_int_mask_reg)); ioremap(regs[1], sizeof(*pci_regs.pci_int_mask_reg));
of_node_put(np);
/* configure chip select for PCI interrupt controller */ /* configure chip select for PCI interrupt controller */
immap->im_memctl.memc_br3 = regs[0] | 0x00001801; immap->im_memctl.memc_br3 = regs[0] | 0x00001801;
immap->im_memctl.memc_or3 = 0xffff8010; immap->im_memctl.memc_or3 = 0xffff8010;
...@@ -501,7 +498,7 @@ void m82xx_pci_init_irq(void) ...@@ -501,7 +498,7 @@ void m82xx_pci_init_irq(void)
*pci_regs.pci_int_mask_reg |= 0xfff00000; *pci_regs.pci_int_mask_reg |= 0xfff00000;
iounmap(immap); iounmap(immap);
pci_pic_host = pci_pic_host =
irq_alloc_host(IRQ_HOST_MAP_LINEAR, irq_max - irq_min + 1, irq_alloc_host(np, IRQ_HOST_MAP_LINEAR, irq_max - irq_min + 1,
&pci_pic_host_ops, irq_max + 1); &pci_pic_host_ops, irq_max + 1);
return; return;
} }
......
...@@ -64,7 +64,6 @@ ...@@ -64,7 +64,6 @@
struct axon_msic { struct axon_msic {
struct device_node *dn;
struct irq_host *irq_host; struct irq_host *irq_host;
__le32 *fifo; __le32 *fifo;
dcr_host_t dcr_host; dcr_host_t dcr_host;
...@@ -297,9 +296,7 @@ static int msic_host_map(struct irq_host *h, unsigned int virq, ...@@ -297,9 +296,7 @@ static int msic_host_map(struct irq_host *h, unsigned int virq,
static int msic_host_match(struct irq_host *host, struct device_node *dn) static int msic_host_match(struct irq_host *host, struct device_node *dn)
{ {
struct axon_msic *msic = host->host_data; return host->of_node == dn;
return msic->dn == dn;
} }
static struct irq_host_ops msic_host_ops = { static struct irq_host_ops msic_host_ops = {
...@@ -314,7 +311,8 @@ static int axon_msi_notify_reboot(struct notifier_block *nb, ...@@ -314,7 +311,8 @@ static int axon_msi_notify_reboot(struct notifier_block *nb,
u32 tmp; u32 tmp;
list_for_each_entry(msic, &axon_msic_list, list) { list_for_each_entry(msic, &axon_msic_list, list) {
pr_debug("axon_msi: disabling %s\n", msic->dn->full_name); pr_debug("axon_msi: disabling %s\n",
msic->irq_host->of_node->full_name);
tmp = msic_dcr_read(msic, MSIC_CTRL_REG); tmp = msic_dcr_read(msic, MSIC_CTRL_REG);
tmp &= ~MSIC_CTRL_ENABLE & ~MSIC_CTRL_IRQ_ENABLE; tmp &= ~MSIC_CTRL_ENABLE & ~MSIC_CTRL_IRQ_ENABLE;
msic_dcr_write(msic, MSIC_CTRL_REG, tmp); msic_dcr_write(msic, MSIC_CTRL_REG, tmp);
...@@ -370,8 +368,8 @@ static int axon_msi_setup_one(struct device_node *dn) ...@@ -370,8 +368,8 @@ static int axon_msi_setup_one(struct device_node *dn)
msic->fifo = page_address(page); msic->fifo = page_address(page);
msic->irq_host = irq_alloc_host(IRQ_HOST_MAP_NOMAP, NR_IRQS, msic->irq_host = irq_alloc_host(of_node_get(dn), IRQ_HOST_MAP_NOMAP,
&msic_host_ops, 0); NR_IRQS, &msic_host_ops, 0);
if (!msic->irq_host) { if (!msic->irq_host) {
printk(KERN_ERR "axon_msi: couldn't allocate irq_host for %s\n", printk(KERN_ERR "axon_msi: couldn't allocate irq_host for %s\n",
dn->full_name); dn->full_name);
...@@ -387,8 +385,6 @@ static int axon_msi_setup_one(struct device_node *dn) ...@@ -387,8 +385,6 @@ static int axon_msi_setup_one(struct device_node *dn)
goto out_free_host; goto out_free_host;
} }
msic->dn = of_node_get(dn);
set_irq_data(virq, msic); set_irq_data(virq, msic);
set_irq_chained_handler(virq, axon_msi_cascade); set_irq_chained_handler(virq, axon_msi_cascade);
pr_debug("axon_msi: irq 0x%x setup for axon_msi\n", virq); pr_debug("axon_msi: irq 0x%x setup for axon_msi\n", virq);
......
...@@ -381,7 +381,7 @@ static int __init setup_iic(void) ...@@ -381,7 +381,7 @@ static int __init setup_iic(void)
void __init iic_init_IRQ(void) void __init iic_init_IRQ(void)
{ {
/* Setup an irq host data structure */ /* Setup an irq host data structure */
iic_host = irq_alloc_host(IRQ_HOST_MAP_LINEAR, IIC_SOURCE_COUNT, iic_host = irq_alloc_host(NULL, IRQ_HOST_MAP_LINEAR, IIC_SOURCE_COUNT,
&iic_host_ops, IIC_IRQ_INVALID); &iic_host_ops, IIC_IRQ_INVALID);
BUG_ON(iic_host == NULL); BUG_ON(iic_host == NULL);
irq_set_default_host(iic_host); irq_set_default_host(iic_host);
......
...@@ -63,7 +63,6 @@ enum { ...@@ -63,7 +63,6 @@ enum {
struct spider_pic { struct spider_pic {
struct irq_host *host; struct irq_host *host;
struct device_node *of_node;
void __iomem *regs; void __iomem *regs;
unsigned int node_id; unsigned int node_id;
}; };
...@@ -178,8 +177,7 @@ static struct irq_chip spider_pic = { ...@@ -178,8 +177,7 @@ static struct irq_chip spider_pic = {
static int spider_host_match(struct irq_host *h, struct device_node *node) static int spider_host_match(struct irq_host *h, struct device_node *node)
{ {
struct spider_pic *pic = h->host_data; return h->of_node == node;
return node == pic->of_node;
} }
static int spider_host_map(struct irq_host *h, unsigned int virq, static int spider_host_map(struct irq_host *h, unsigned int virq,
...@@ -247,18 +245,18 @@ static unsigned int __init spider_find_cascade_and_node(struct spider_pic *pic) ...@@ -247,18 +245,18 @@ static unsigned int __init spider_find_cascade_and_node(struct spider_pic *pic)
* tree in case the device-tree is ever fixed * tree in case the device-tree is ever fixed
*/ */
struct of_irq oirq; struct of_irq oirq;
if (of_irq_map_one(pic->of_node, 0, &oirq) == 0) { if (of_irq_map_one(pic->host->of_node, 0, &oirq) == 0) {
virq = irq_create_of_mapping(oirq.controller, oirq.specifier, virq = irq_create_of_mapping(oirq.controller, oirq.specifier,
oirq.size); oirq.size);
return virq; return virq;
} }
/* Now do the horrible hacks */ /* Now do the horrible hacks */
tmp = of_get_property(pic->of_node, "#interrupt-cells", NULL); tmp = of_get_property(pic->host->of_node, "#interrupt-cells", NULL);
if (tmp == NULL) if (tmp == NULL)
return NO_IRQ; return NO_IRQ;
intsize = *tmp; intsize = *tmp;
imap = of_get_property(pic->of_node, "interrupt-map", &imaplen); imap = of_get_property(pic->host->of_node, "interrupt-map", &imaplen);
if (imap == NULL || imaplen < (intsize + 1)) if (imap == NULL || imaplen < (intsize + 1))
return NO_IRQ; return NO_IRQ;
iic = of_find_node_by_phandle(imap[intsize]); iic = of_find_node_by_phandle(imap[intsize]);
...@@ -308,15 +306,13 @@ static void __init spider_init_one(struct device_node *of_node, int chip, ...@@ -308,15 +306,13 @@ static void __init spider_init_one(struct device_node *of_node, int chip,
panic("spider_pic: can't map registers !"); panic("spider_pic: can't map registers !");
/* Allocate a host */ /* Allocate a host */
pic->host = irq_alloc_host(IRQ_HOST_MAP_LINEAR, SPIDER_SRC_COUNT, pic->host = irq_alloc_host(of_node_get(of_node), IRQ_HOST_MAP_LINEAR,
&spider_host_ops, SPIDER_IRQ_INVALID); SPIDER_SRC_COUNT, &spider_host_ops,
SPIDER_IRQ_INVALID);
if (pic->host == NULL) if (pic->host == NULL)
panic("spider_pic: can't allocate irq host !"); panic("spider_pic: can't allocate irq host !");
pic->host->host_data = pic; pic->host->host_data = pic;
/* Fill out other bits */
pic->of_node = of_node_get(of_node);
/* Go through all sources and disable them */ /* Go through all sources and disable them */
for (i = 0; i < SPIDER_SRC_COUNT; i++) { for (i = 0; i < SPIDER_SRC_COUNT; i++) {
void __iomem *cfg = pic->regs + TIR_CFGA + 8 * i; void __iomem *cfg = pic->regs + TIR_CFGA + 8 * i;
......
...@@ -242,7 +242,7 @@ void __init beatic_init_IRQ(void) ...@@ -242,7 +242,7 @@ void __init beatic_init_IRQ(void)
ppc_md.get_irq = beatic_get_irq; ppc_md.get_irq = beatic_get_irq;
/* Allocate an irq host */ /* Allocate an irq host */
beatic_host = irq_alloc_host(IRQ_HOST_MAP_NOMAP, 0, beatic_host = irq_alloc_host(NULL, IRQ_HOST_MAP_NOMAP, 0,
&beatic_pic_host_ops, &beatic_pic_host_ops,
0); 0);
BUG_ON(beatic_host == NULL); BUG_ON(beatic_host == NULL);
......
...@@ -369,7 +369,8 @@ void __init iSeries_init_IRQ(void) ...@@ -369,7 +369,8 @@ void __init iSeries_init_IRQ(void)
/* Create irq host. No need for a revmap since HV will give us /* Create irq host. No need for a revmap since HV will give us
* back our virtual irq number * back our virtual irq number
*/ */
host = irq_alloc_host(IRQ_HOST_MAP_NOMAP, 0, &iseries_irq_host_ops, 0); host = irq_alloc_host(NULL, IRQ_HOST_MAP_NOMAP, 0,
&iseries_irq_host_ops, 0);
BUG_ON(host == NULL); BUG_ON(host == NULL);
irq_set_default_host(host); irq_set_default_host(host);
......
...@@ -384,7 +384,7 @@ static void __init pmac_pic_probe_oldstyle(void) ...@@ -384,7 +384,7 @@ static void __init pmac_pic_probe_oldstyle(void)
/* /*
* Allocate an irq host * Allocate an irq host
*/ */
pmac_pic_host = irq_alloc_host(IRQ_HOST_MAP_LINEAR, max_irqs, pmac_pic_host = irq_alloc_host(master, IRQ_HOST_MAP_LINEAR, max_irqs,
&pmac_pic_host_ops, &pmac_pic_host_ops,
max_irqs); max_irqs);
BUG_ON(pmac_pic_host == NULL); BUG_ON(pmac_pic_host == NULL);
......
...@@ -726,7 +726,7 @@ void __init ps3_init_IRQ(void) ...@@ -726,7 +726,7 @@ void __init ps3_init_IRQ(void)
unsigned cpu; unsigned cpu;
struct irq_host *host; struct irq_host *host;
host = irq_alloc_host(IRQ_HOST_MAP_NOMAP, 0, &ps3_host_ops, host = irq_alloc_host(NULL, IRQ_HOST_MAP_NOMAP, 0, &ps3_host_ops,
PS3_INVALID_OUTLET); PS3_INVALID_OUTLET);
irq_set_default_host(host); irq_set_default_host(host);
irq_set_virq_count(PS3_PLUG_MAX + 1); irq_set_virq_count(PS3_PLUG_MAX + 1);
......
...@@ -540,7 +540,7 @@ static void __init xics_init_host(void) ...@@ -540,7 +540,7 @@ static void __init xics_init_host(void)
ops = &xics_host_lpar_ops; ops = &xics_host_lpar_ops;
else else
ops = &xics_host_direct_ops; ops = &xics_host_direct_ops;
xics_host = irq_alloc_host(IRQ_HOST_MAP_TREE, 0, ops, xics_host = irq_alloc_host(NULL, IRQ_HOST_MAP_TREE, 0, ops,
XICS_IRQ_SPURIOUS); XICS_IRQ_SPURIOUS);
BUG_ON(xics_host == NULL); BUG_ON(xics_host == NULL);
irq_set_default_host(xics_host); irq_set_default_host(xics_host);
......
...@@ -50,7 +50,6 @@ static uint host_end; /* end + 1 */ ...@@ -50,7 +50,6 @@ static uint host_end; /* end + 1 */
cpm8xx_t *cpmp; /* Pointer to comm processor space */ cpm8xx_t *cpmp; /* Pointer to comm processor space */
cpic8xx_t *cpic_reg; cpic8xx_t *cpic_reg;
static struct device_node *cpm_pic_node;
static struct irq_host *cpm_pic_host; static struct irq_host *cpm_pic_host;
static void cpm_mask_irq(unsigned int irq) static void cpm_mask_irq(unsigned int irq)
...@@ -97,7 +96,7 @@ int cpm_get_irq(void) ...@@ -97,7 +96,7 @@ int cpm_get_irq(void)
static int cpm_pic_host_match(struct irq_host *h, struct device_node *node) static int cpm_pic_host_match(struct irq_host *h, struct device_node *node)
{ {
return cpm_pic_node == node; return h->of_node == node;
} }
static int cpm_pic_host_map(struct irq_host *h, unsigned int virq, static int cpm_pic_host_map(struct irq_host *h, unsigned int virq,
...@@ -165,9 +164,8 @@ unsigned int cpm_pic_init(void) ...@@ -165,9 +164,8 @@ unsigned int cpm_pic_init(void)
out_be32(&cpic_reg->cpic_cimr, 0); out_be32(&cpic_reg->cpic_cimr, 0);
cpm_pic_node = of_node_get(np); cpm_pic_host = irq_alloc_host(of_node_get(np), IRQ_HOST_MAP_LINEAR,
64, &cpm_pic_host_ops, 64);
cpm_pic_host = irq_alloc_host(IRQ_HOST_MAP_LINEAR, 64, &cpm_pic_host_ops, 64);
if (cpm_pic_host == NULL) { if (cpm_pic_host == NULL) {
printk(KERN_ERR "CPM2 PIC: failed to allocate irq host!\n"); printk(KERN_ERR "CPM2 PIC: failed to allocate irq host!\n");
sirq = NO_IRQ; sirq = NO_IRQ;
......
...@@ -50,7 +50,6 @@ ...@@ -50,7 +50,6 @@
static intctl_cpm2_t *cpm2_intctl; static intctl_cpm2_t *cpm2_intctl;
static struct device_node *cpm2_pic_node;
static struct irq_host *cpm2_pic_host; static struct irq_host *cpm2_pic_host;
#define NR_MASK_WORDS ((NR_IRQS + 31) / 32) #define NR_MASK_WORDS ((NR_IRQS + 31) / 32)
static unsigned long ppc_cached_irq_mask[NR_MASK_WORDS]; static unsigned long ppc_cached_irq_mask[NR_MASK_WORDS];
...@@ -208,7 +207,7 @@ unsigned int cpm2_get_irq(void) ...@@ -208,7 +207,7 @@ unsigned int cpm2_get_irq(void)
static int cpm2_pic_host_match(struct irq_host *h, struct device_node *node) static int cpm2_pic_host_match(struct irq_host *h, struct device_node *node)
{ {
return cpm2_pic_node == node; return h->of_node == node;
} }
static int cpm2_pic_host_map(struct irq_host *h, unsigned int virq, static int cpm2_pic_host_map(struct irq_host *h, unsigned int virq,
...@@ -273,8 +272,8 @@ void cpm2_pic_init(struct device_node *node) ...@@ -273,8 +272,8 @@ void cpm2_pic_init(struct device_node *node)
out_be32(&cpm2_intctl->ic_scprrl, 0x05309770); out_be32(&cpm2_intctl->ic_scprrl, 0x05309770);
/* create a legacy host */ /* create a legacy host */
cpm2_pic_node = of_node_get(node); cpm2_pic_host = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LINEAR,
cpm2_pic_host = irq_alloc_host(IRQ_HOST_MAP_LINEAR, 64, &cpm2_pic_host_ops, 64); 64, &cpm2_pic_host_ops, 64);
if (cpm2_pic_host == NULL) { if (cpm2_pic_host == NULL) {
printk(KERN_ERR "CPM2 PIC: failed to allocate irq host!\n"); printk(KERN_ERR "CPM2 PIC: failed to allocate irq host!\n");
return; return;
......
...@@ -25,7 +25,6 @@ static unsigned char cached_8259[2] = { 0xff, 0xff }; ...@@ -25,7 +25,6 @@ static unsigned char cached_8259[2] = { 0xff, 0xff };
static DEFINE_SPINLOCK(i8259_lock); static DEFINE_SPINLOCK(i8259_lock);
static struct device_node *i8259_node;
static struct irq_host *i8259_host; static struct irq_host *i8259_host;
/* /*
...@@ -165,7 +164,7 @@ static struct resource pic_edgectrl_iores = { ...@@ -165,7 +164,7 @@ static struct resource pic_edgectrl_iores = {
static int i8259_host_match(struct irq_host *h, struct device_node *node) static int i8259_host_match(struct irq_host *h, struct device_node *node)
{ {
return i8259_node == NULL || i8259_node == node; return h->of_node == NULL || h->of_node == node;
} }
static int i8259_host_map(struct irq_host *h, unsigned int virq, static int i8259_host_map(struct irq_host *h, unsigned int virq,
...@@ -276,9 +275,8 @@ void i8259_init(struct device_node *node, unsigned long intack_addr) ...@@ -276,9 +275,8 @@ void i8259_init(struct device_node *node, unsigned long intack_addr)
spin_unlock_irqrestore(&i8259_lock, flags); spin_unlock_irqrestore(&i8259_lock, flags);
/* create a legacy host */ /* create a legacy host */
if (node) i8259_host = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LEGACY,
i8259_node = of_node_get(node); 0, &i8259_host_ops, 0);
i8259_host = irq_alloc_host(IRQ_HOST_MAP_LEGACY, 0, &i8259_host_ops, 0);
if (i8259_host == NULL) { if (i8259_host == NULL) {
printk(KERN_ERR "i8259: failed to allocate irq host !\n"); printk(KERN_ERR "i8259: failed to allocate irq host !\n");
return; return;
......
...@@ -511,10 +511,8 @@ static struct irq_chip ipic_irq_chip = { ...@@ -511,10 +511,8 @@ static struct irq_chip ipic_irq_chip = {
static int ipic_host_match(struct irq_host *h, struct device_node *node) static int ipic_host_match(struct irq_host *h, struct device_node *node)
{ {
struct ipic *ipic = h->host_data;
/* Exact match, unless ipic node is NULL */ /* Exact match, unless ipic node is NULL */
return ipic->of_node == NULL || ipic->of_node == node; return h->of_node == NULL || h->of_node == node;
} }
static int ipic_host_map(struct irq_host *h, unsigned int virq, static int ipic_host_map(struct irq_host *h, unsigned int virq,
...@@ -568,9 +566,8 @@ struct ipic * __init ipic_init(struct device_node *node, unsigned int flags) ...@@ -568,9 +566,8 @@ struct ipic * __init ipic_init(struct device_node *node, unsigned int flags)
return NULL; return NULL;
memset(ipic, 0, sizeof(struct ipic)); memset(ipic, 0, sizeof(struct ipic));
ipic->of_node = of_node_get(node);
ipic->irqhost = irq_alloc_host(IRQ_HOST_MAP_LINEAR, ipic->irqhost = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LINEAR,
NR_IPIC_INTS, NR_IPIC_INTS,
&ipic_host_ops, 0); &ipic_host_ops, 0);
if (ipic->irqhost == NULL) { if (ipic->irqhost == NULL) {
......
...@@ -48,9 +48,6 @@ struct ipic { ...@@ -48,9 +48,6 @@ struct ipic {
/* The "linux" controller struct */ /* The "linux" controller struct */
struct irq_chip hc_irq; struct irq_chip hc_irq;
/* The device node of the interrupt controller */
struct device_node *of_node;
}; };
struct ipic_info { struct ipic_info {
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
extern int cpm_get_irq(struct pt_regs *regs); extern int cpm_get_irq(struct pt_regs *regs);
static struct device_node *mpc8xx_pic_node;
static struct irq_host *mpc8xx_pic_host; static struct irq_host *mpc8xx_pic_host;
#define NR_MASK_WORDS ((NR_IRQS + 31) / 32) #define NR_MASK_WORDS ((NR_IRQS + 31) / 32)
static unsigned long ppc_cached_irq_mask[NR_MASK_WORDS]; static unsigned long ppc_cached_irq_mask[NR_MASK_WORDS];
...@@ -122,7 +121,7 @@ unsigned int mpc8xx_get_irq(void) ...@@ -122,7 +121,7 @@ unsigned int mpc8xx_get_irq(void)
static int mpc8xx_pic_host_match(struct irq_host *h, struct device_node *node) static int mpc8xx_pic_host_match(struct irq_host *h, struct device_node *node)
{ {
return mpc8xx_pic_node == node; return h->of_node == node;
} }
static int mpc8xx_pic_host_map(struct irq_host *h, unsigned int virq, static int mpc8xx_pic_host_map(struct irq_host *h, unsigned int virq,
...@@ -176,22 +175,24 @@ int mpc8xx_pic_init(void) ...@@ -176,22 +175,24 @@ int mpc8xx_pic_init(void)
return -ENOMEM; return -ENOMEM;
} }
mpc8xx_pic_node = of_node_get(np);
ret = of_address_to_resource(np, 0, &res); ret = of_address_to_resource(np, 0, &res);
of_node_put(np);
if (ret) if (ret)
return ret; goto out;
siu_reg = (void *)ioremap(res.start, res.end - res.start + 1); siu_reg = (void *)ioremap(res.start, res.end - res.start + 1);
if (siu_reg == NULL) if (siu_reg == NULL) {
return -EINVAL; ret = -EINVAL;
goto out;
}
mpc8xx_pic_host = irq_alloc_host(IRQ_HOST_MAP_LINEAR, 64, &mpc8xx_pic_host_ops, 64); mpc8xx_pic_host = irq_alloc_host(of_node_get(np), IRQ_HOST_MAP_LINEAR,
64, &mpc8xx_pic_host_ops, 64);
if (mpc8xx_pic_host == NULL) { if (mpc8xx_pic_host == NULL) {
printk(KERN_ERR "MPC8xx PIC: failed to allocate irq host!\n"); printk(KERN_ERR "MPC8xx PIC: failed to allocate irq host!\n");
ret = -ENOMEM; ret = -ENOMEM;
} }
out:
of_node_put(np);
return ret; return ret;
} }
...@@ -271,7 +271,7 @@ static void _mpic_map_dcr(struct mpic *mpic, struct mpic_reg_bank *rb, ...@@ -271,7 +271,7 @@ static void _mpic_map_dcr(struct mpic *mpic, struct mpic_reg_bank *rb,
{ {
rb->dbase = mpic->dcr_base; rb->dbase = mpic->dcr_base;
rb->doff = offset; rb->doff = offset;
rb->dhost = dcr_map(mpic->of_node, rb->dbase + rb->doff, size); rb->dhost = dcr_map(mpic->irqhost->of_node, rb->dbase + rb->doff, size);
BUG_ON(!DCR_MAP_OK(rb->dhost)); BUG_ON(!DCR_MAP_OK(rb->dhost));
} }
...@@ -861,10 +861,8 @@ static struct irq_chip mpic_irq_ht_chip = { ...@@ -861,10 +861,8 @@ static struct irq_chip mpic_irq_ht_chip = {
static int mpic_host_match(struct irq_host *h, struct device_node *node) static int mpic_host_match(struct irq_host *h, struct device_node *node)
{ {
struct mpic *mpic = h->host_data;
/* Exact match, unless mpic node is NULL */ /* Exact match, unless mpic node is NULL */
return mpic->of_node == NULL || mpic->of_node == node; return h->of_node == NULL || h->of_node == node;
} }
static int mpic_host_map(struct irq_host *h, unsigned int virq, static int mpic_host_map(struct irq_host *h, unsigned int virq,
...@@ -985,10 +983,9 @@ struct mpic * __init mpic_alloc(struct device_node *node, ...@@ -985,10 +983,9 @@ struct mpic * __init mpic_alloc(struct device_node *node,
memset(mpic, 0, sizeof(struct mpic)); memset(mpic, 0, sizeof(struct mpic));
mpic->name = name; mpic->name = name;
mpic->of_node = of_node_get(node);
mpic->irqhost = irq_alloc_host(IRQ_HOST_MAP_LINEAR, isu_size, mpic->irqhost = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LINEAR,
&mpic_host_ops, isu_size, &mpic_host_ops,
flags & MPIC_LARGE_VECTORS ? 2048 : 256); flags & MPIC_LARGE_VECTORS ? 2048 : 256);
if (mpic->irqhost == NULL) { if (mpic->irqhost == NULL) {
of_node_put(node); of_node_put(node);
......
...@@ -117,16 +117,17 @@ static int mpic_msi_reserve_dt_hwirqs(struct mpic *mpic) ...@@ -117,16 +117,17 @@ static int mpic_msi_reserve_dt_hwirqs(struct mpic *mpic)
int i, len; int i, len;
const u32 *p; const u32 *p;
p = of_get_property(mpic->of_node, "msi-available-ranges", &len); p = of_get_property(mpic->irqhost->of_node,
"msi-available-ranges", &len);
if (!p) { if (!p) {
pr_debug("mpic: no msi-available-ranges property found on %s\n", pr_debug("mpic: no msi-available-ranges property found on %s\n",
mpic->of_node->full_name); mpic->irqhost->of_node->full_name);
return -ENODEV; return -ENODEV;
} }
if (len % 8 != 0) { if (len % 8 != 0) {
printk(KERN_WARNING "mpic: Malformed msi-available-ranges " printk(KERN_WARNING "mpic: Malformed msi-available-ranges "
"property on %s\n", mpic->of_node->full_name); "property on %s\n", mpic->irqhost->of_node->full_name);
return -EINVAL; return -EINVAL;
} }
......
...@@ -204,7 +204,7 @@ static struct irq_chip mv64x60_chip_gpp = { ...@@ -204,7 +204,7 @@ static struct irq_chip mv64x60_chip_gpp = {
static int mv64x60_host_match(struct irq_host *h, struct device_node *np) static int mv64x60_host_match(struct irq_host *h, struct device_node *np)
{ {
return mv64x60_irq_host->host_data == np; return h->of_node == np;
} }
static struct irq_chip *mv64x60_chips[] = { static struct irq_chip *mv64x60_chips[] = {
...@@ -253,14 +253,12 @@ void __init mv64x60_init_irq(void) ...@@ -253,14 +253,12 @@ void __init mv64x60_init_irq(void)
np = of_find_compatible_node(NULL, NULL, "marvell,mv64x60-pic"); np = of_find_compatible_node(NULL, NULL, "marvell,mv64x60-pic");
reg = of_get_property(np, "reg", &size); reg = of_get_property(np, "reg", &size);
paddr = of_translate_address(np, reg); paddr = of_translate_address(np, reg);
of_node_put(np);
mv64x60_irq_reg_base = ioremap(paddr, reg[1]); mv64x60_irq_reg_base = ioremap(paddr, reg[1]);
mv64x60_irq_host = irq_alloc_host(IRQ_HOST_MAP_LINEAR, MV64x60_NUM_IRQS, mv64x60_irq_host = irq_alloc_host(np, IRQ_HOST_MAP_LINEAR,
MV64x60_NUM_IRQS,
&mv64x60_host_ops, MV64x60_NUM_IRQS); &mv64x60_host_ops, MV64x60_NUM_IRQS);
mv64x60_irq_host->host_data = np;
spin_lock_irqsave(&mv64x60_lock, flags); spin_lock_irqsave(&mv64x60_lock, flags);
out_le32(mv64x60_gpp_reg_base + MV64x60_GPP_INTR_MASK, out_le32(mv64x60_gpp_reg_base + MV64x60_GPP_INTR_MASK,
mv64x60_cached_gpp_mask); mv64x60_cached_gpp_mask);
......
...@@ -245,10 +245,8 @@ static struct irq_chip qe_ic_irq_chip = { ...@@ -245,10 +245,8 @@ static struct irq_chip qe_ic_irq_chip = {
static int qe_ic_host_match(struct irq_host *h, struct device_node *node) static int qe_ic_host_match(struct irq_host *h, struct device_node *node)
{ {
struct qe_ic *qe_ic = h->host_data;
/* Exact match, unless qe_ic node is NULL */ /* Exact match, unless qe_ic node is NULL */
return qe_ic->of_node == NULL || qe_ic->of_node == node; return h->of_node == NULL || h->of_node == node;
} }
static int qe_ic_host_map(struct irq_host *h, unsigned int virq, static int qe_ic_host_map(struct irq_host *h, unsigned int virq,
...@@ -352,9 +350,8 @@ void __init qe_ic_init(struct device_node *node, unsigned int flags) ...@@ -352,9 +350,8 @@ void __init qe_ic_init(struct device_node *node, unsigned int flags)
return; return;
memset(qe_ic, 0, sizeof(struct qe_ic)); memset(qe_ic, 0, sizeof(struct qe_ic));
qe_ic->of_node = of_node_get(node);
qe_ic->irqhost = irq_alloc_host(IRQ_HOST_MAP_LINEAR, qe_ic->irqhost = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LINEAR,
NR_QE_IC_INTS, &qe_ic_host_ops, 0); NR_QE_IC_INTS, &qe_ic_host_ops, 0);
if (qe_ic->irqhost == NULL) { if (qe_ic->irqhost == NULL) {
of_node_put(node); of_node_put(node);
......
...@@ -84,9 +84,6 @@ struct qe_ic { ...@@ -84,9 +84,6 @@ struct qe_ic {
/* The "linux" controller struct */ /* The "linux" controller struct */
struct irq_chip hc_irq; struct irq_chip hc_irq;
/* The device node of the interrupt controller */
struct device_node *of_node;
/* VIRQ numbers of QE high/low irqs */ /* VIRQ numbers of QE high/low irqs */
unsigned int virq_high; unsigned int virq_high;
unsigned int virq_low; unsigned int virq_low;
......
...@@ -52,7 +52,6 @@ ...@@ -52,7 +52,6 @@
u32 tsi108_pci_cfg_base; u32 tsi108_pci_cfg_base;
static u32 tsi108_pci_cfg_phys; static u32 tsi108_pci_cfg_phys;
u32 tsi108_csr_vir_base; u32 tsi108_csr_vir_base;
static struct device_node *pci_irq_node;
static struct irq_host *pci_irq_host; static struct irq_host *pci_irq_host;
extern u32 get_vir_csrbase(void); extern u32 get_vir_csrbase(void);
...@@ -407,7 +406,7 @@ static int pci_irq_host_map(struct irq_host *h, unsigned int virq, ...@@ -407,7 +406,7 @@ static int pci_irq_host_map(struct irq_host *h, unsigned int virq,
static int pci_irq_host_match(struct irq_host *h, struct device_node *node) static int pci_irq_host_match(struct irq_host *h, struct device_node *node)
{ {
return pci_irq_node == node; return h->of_node == node;
} }
static struct irq_host_ops pci_irq_host_ops = { static struct irq_host_ops pci_irq_host_ops = {
...@@ -433,10 +432,11 @@ void __init tsi108_pci_int_init(struct device_node *node) ...@@ -433,10 +432,11 @@ void __init tsi108_pci_int_init(struct device_node *node)
{ {
DBG("Tsi108_pci_int_init: initializing PCI interrupts\n"); DBG("Tsi108_pci_int_init: initializing PCI interrupts\n");
pci_irq_node = of_node_get(node); pci_irq_host = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LEGACY,
pci_irq_host = irq_alloc_host(IRQ_HOST_MAP_LEGACY, 0, &pci_irq_host_ops, 0); 0, &pci_irq_host_ops, 0);
if (pci_irq_host == NULL) { if (pci_irq_host == NULL) {
printk(KERN_ERR "pci_irq_host: failed to allocate irq host !\n"); printk(KERN_ERR "pci_irq_host: failed to allocate irq host !\n");
of_node_put(node);
return; return;
} }
......
...@@ -56,9 +56,6 @@ struct uic { ...@@ -56,9 +56,6 @@ struct uic {
/* For secondary UICs, the cascade interrupt's irqaction */ /* For secondary UICs, the cascade interrupt's irqaction */
struct irqaction cascade; struct irqaction cascade;
/* The device node of the interrupt controller */
struct device_node *of_node;
}; };
static void uic_unmask_irq(unsigned int virq) static void uic_unmask_irq(unsigned int virq)
...@@ -220,8 +217,7 @@ void fastcall handle_uic_irq(unsigned int irq, struct irq_desc *desc) ...@@ -220,8 +217,7 @@ void fastcall handle_uic_irq(unsigned int irq, struct irq_desc *desc)
static int uic_host_match(struct irq_host *h, struct device_node *node) static int uic_host_match(struct irq_host *h, struct device_node *node)
{ {
struct uic *uic = h->host_data; return h->of_node == node;
return uic->of_node == node;
} }
static int uic_host_map(struct irq_host *h, unsigned int virq, static int uic_host_map(struct irq_host *h, unsigned int virq,
...@@ -291,7 +287,6 @@ static struct uic * __init uic_init_one(struct device_node *node) ...@@ -291,7 +287,6 @@ static struct uic * __init uic_init_one(struct device_node *node)
memset(uic, 0, sizeof(*uic)); memset(uic, 0, sizeof(*uic));
spin_lock_init(&uic->lock); spin_lock_init(&uic->lock);
uic->of_node = of_node_get(node);
indexp = of_get_property(node, "cell-index", &len); indexp = of_get_property(node, "cell-index", &len);
if (!indexp || (len != sizeof(u32))) { if (!indexp || (len != sizeof(u32))) {
printk(KERN_ERR "uic: Device node %s has missing or invalid " printk(KERN_ERR "uic: Device node %s has missing or invalid "
...@@ -308,8 +303,8 @@ static struct uic * __init uic_init_one(struct device_node *node) ...@@ -308,8 +303,8 @@ static struct uic * __init uic_init_one(struct device_node *node)
} }
uic->dcrbase = *dcrreg; uic->dcrbase = *dcrreg;
uic->irqhost = irq_alloc_host(IRQ_HOST_MAP_LINEAR, NR_UIC_INTS, uic->irqhost = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LINEAR,
&uic_host_ops, -1); NR_UIC_INTS, &uic_host_ops, -1);
if (! uic->irqhost) { if (! uic->irqhost) {
of_node_put(node); of_node_put(node);
return NULL; /* FIXME: panic? */ return NULL; /* FIXME: panic? */
......
...@@ -124,6 +124,9 @@ struct irq_host { ...@@ -124,6 +124,9 @@ struct irq_host {
struct irq_host_ops *ops; struct irq_host_ops *ops;
void *host_data; void *host_data;
irq_hw_number_t inval_irq; irq_hw_number_t inval_irq;
/* Optional device node pointer */
struct device_node *of_node;
}; };
/* The main irq map itself is an array of NR_IRQ entries containing the /* The main irq map itself is an array of NR_IRQ entries containing the
...@@ -142,7 +145,7 @@ extern irq_hw_number_t virq_to_hw(unsigned int virq); ...@@ -142,7 +145,7 @@ extern irq_hw_number_t virq_to_hw(unsigned int virq);
/** /**
* irq_alloc_host - Allocate a new irq_host data structure * irq_alloc_host - Allocate a new irq_host data structure
* @node: device-tree node of the interrupt controller * @of_node: optional device-tree node of the interrupt controller
* @revmap_type: type of reverse mapping to use * @revmap_type: type of reverse mapping to use
* @revmap_arg: for IRQ_HOST_MAP_LINEAR linear only: size of the map * @revmap_arg: for IRQ_HOST_MAP_LINEAR linear only: size of the map
* @ops: map/unmap host callbacks * @ops: map/unmap host callbacks
...@@ -156,7 +159,8 @@ extern irq_hw_number_t virq_to_hw(unsigned int virq); ...@@ -156,7 +159,8 @@ extern irq_hw_number_t virq_to_hw(unsigned int virq);
* later during boot automatically (the reverse mapping will use the slow path * later during boot automatically (the reverse mapping will use the slow path
* until that happens). * until that happens).
*/ */
extern struct irq_host *irq_alloc_host(unsigned int revmap_type, extern struct irq_host *irq_alloc_host(struct device_node *of_node,
unsigned int revmap_type,
unsigned int revmap_arg, unsigned int revmap_arg,
struct irq_host_ops *ops, struct irq_host_ops *ops,
irq_hw_number_t inval_irq); irq_hw_number_t inval_irq);
......
...@@ -240,9 +240,6 @@ struct mpic_irq_save { ...@@ -240,9 +240,6 @@ struct mpic_irq_save {
/* The instance data of a given MPIC */ /* The instance data of a given MPIC */
struct mpic struct mpic
{ {
/* The device node of the interrupt controller */
struct device_node *of_node;
/* The remapper for this MPIC */ /* The remapper for this MPIC */
struct irq_host *irqhost; struct irq_host *irqhost;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment