Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

powerpc: Fix irq_alloc_host() reference counting and callers

When I changed irq_alloc_host() to take an of_node
(52964f87c64e6c6ea671b5bf3030fb1494090a48: "Add an optional
device_node pointer to the irq_host"), I botched the reference
counting semantics.

Stephen pointed out that it's irq_alloc_host()'s business if
it needs to take an additional reference to the device_node,
the caller shouldn't need to care.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>

authored by

Michael Ellerman and committed by
Paul Mackerras
19fc65b5 2272a55f

+15 -24
+1 -1
arch/powerpc/kernel/irq.c
··· 498 498 host->revmap_type = revmap_type; 499 499 host->inval_irq = inval_irq; 500 500 host->ops = ops; 501 - host->of_node = of_node; 501 + host->of_node = of_node_get(of_node); 502 502 503 503 if (host->ops->match == NULL) 504 504 host->ops->match = default_irq_host_match;
+1 -1
arch/powerpc/platforms/cell/axon_msi.c
··· 365 365 goto out_free_fifo; 366 366 } 367 367 368 - msic->irq_host = irq_alloc_host(of_node_get(dn), IRQ_HOST_MAP_NOMAP, 368 + msic->irq_host = irq_alloc_host(dn, IRQ_HOST_MAP_NOMAP, 369 369 NR_IRQS, &msic_host_ops, 0); 370 370 if (!msic->irq_host) { 371 371 printk(KERN_ERR "axon_msi: couldn't allocate irq_host for %s\n",
+1 -1
arch/powerpc/platforms/cell/spider-pic.c
··· 300 300 panic("spider_pic: can't map registers !"); 301 301 302 302 /* Allocate a host */ 303 - pic->host = irq_alloc_host(of_node_get(of_node), IRQ_HOST_MAP_LINEAR, 303 + pic->host = irq_alloc_host(of_node, IRQ_HOST_MAP_LINEAR, 304 304 SPIDER_SRC_COUNT, &spider_host_ops, 305 305 SPIDER_IRQ_INVALID); 306 306 if (pic->host == NULL)
+1 -1
arch/powerpc/sysdev/cpm1.c
··· 159 159 160 160 out_be32(&cpic_reg->cpic_cimr, 0); 161 161 162 - cpm_pic_host = irq_alloc_host(of_node_get(np), IRQ_HOST_MAP_LINEAR, 162 + cpm_pic_host = irq_alloc_host(np, IRQ_HOST_MAP_LINEAR, 163 163 64, &cpm_pic_host_ops, 64); 164 164 if (cpm_pic_host == NULL) { 165 165 printk(KERN_ERR "CPM2 PIC: failed to allocate irq host!\n");
+1 -1
arch/powerpc/sysdev/cpm2_pic.c
··· 266 266 out_be32(&cpm2_intctl->ic_scprrl, 0x05309770); 267 267 268 268 /* create a legacy host */ 269 - cpm2_pic_host = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LINEAR, 269 + cpm2_pic_host = irq_alloc_host(node, IRQ_HOST_MAP_LINEAR, 270 270 64, &cpm2_pic_host_ops, 64); 271 271 if (cpm2_pic_host == NULL) { 272 272 printk(KERN_ERR "CPM2 PIC: failed to allocate irq host!\n");
+1 -1
arch/powerpc/sysdev/i8259.c
··· 276 276 spin_unlock_irqrestore(&i8259_lock, flags); 277 277 278 278 /* create a legacy host */ 279 - i8259_host = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LEGACY, 279 + i8259_host = irq_alloc_host(node, IRQ_HOST_MAP_LEGACY, 280 280 0, &i8259_host_ops, 0); 281 281 if (i8259_host == NULL) { 282 282 printk(KERN_ERR "i8259: failed to allocate irq host !\n");
+2 -4
arch/powerpc/sysdev/ipic.c
··· 735 735 736 736 memset(ipic, 0, sizeof(struct ipic)); 737 737 738 - ipic->irqhost = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LINEAR, 738 + ipic->irqhost = irq_alloc_host(node, IRQ_HOST_MAP_LINEAR, 739 739 NR_IPIC_INTS, 740 740 &ipic_host_ops, 0); 741 - if (ipic->irqhost == NULL) { 742 - of_node_put(node); 741 + if (ipic->irqhost == NULL) 743 742 return NULL; 744 - } 745 743 746 744 ipic->regs = ioremap(res.start, res.end - res.start + 1); 747 745
+2 -4
arch/powerpc/sysdev/mpic.c
··· 1016 1016 memset(mpic, 0, sizeof(struct mpic)); 1017 1017 mpic->name = name; 1018 1018 1019 - mpic->irqhost = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LINEAR, 1019 + mpic->irqhost = irq_alloc_host(node, IRQ_HOST_MAP_LINEAR, 1020 1020 isu_size, &mpic_host_ops, 1021 1021 flags & MPIC_LARGE_VECTORS ? 2048 : 256); 1022 - if (mpic->irqhost == NULL) { 1023 - of_node_put(node); 1022 + if (mpic->irqhost == NULL) 1024 1023 return NULL; 1025 - } 1026 1024 1027 1025 mpic->irqhost->host_data = mpic; 1028 1026 mpic->hc_irq = mpic_irq_chip;
+2 -4
arch/powerpc/sysdev/qe_lib/qe_ic.c
··· 339 339 340 340 memset(qe_ic, 0, sizeof(struct qe_ic)); 341 341 342 - qe_ic->irqhost = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LINEAR, 342 + qe_ic->irqhost = irq_alloc_host(node, IRQ_HOST_MAP_LINEAR, 343 343 NR_QE_IC_INTS, &qe_ic_host_ops, 0); 344 - if (qe_ic->irqhost == NULL) { 345 - of_node_put(node); 344 + if (qe_ic->irqhost == NULL) 346 345 return; 347 - } 348 346 349 347 qe_ic->regs = ioremap(res.start, res.end - res.start + 1); 350 348
+1 -2
arch/powerpc/sysdev/tsi108_pci.c
··· 426 426 { 427 427 DBG("Tsi108_pci_int_init: initializing PCI interrupts\n"); 428 428 429 - pci_irq_host = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LEGACY, 429 + pci_irq_host = irq_alloc_host(node, IRQ_HOST_MAP_LEGACY, 430 430 0, &pci_irq_host_ops, 0); 431 431 if (pci_irq_host == NULL) { 432 432 printk(KERN_ERR "pci_irq_host: failed to allocate irq host !\n"); 433 - of_node_put(node); 434 433 return; 435 434 } 436 435
+2 -4
arch/powerpc/sysdev/uic.c
··· 280 280 } 281 281 uic->dcrbase = *dcrreg; 282 282 283 - uic->irqhost = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LINEAR, 283 + uic->irqhost = irq_alloc_host(node, IRQ_HOST_MAP_LINEAR, 284 284 NR_UIC_INTS, &uic_host_ops, -1); 285 - if (! uic->irqhost) { 286 - of_node_put(node); 285 + if (! uic->irqhost) 287 286 return NULL; /* FIXME: panic? */ 288 - } 289 287 290 288 uic->irqhost->host_data = uic; 291 289