This is how it is:
chrp_pcibios_fixup(void)
{
struct pci_dev *dev = NULL;
struct device_node *np;
/* PCI interrupts are controlled by the OpenPIC */
for_each_pci_dev(dev) {
np = pci_device_to_OF_node(dev);
if ((np != 0) && (np->n_intrs > 0) && (np->intrs[0].line != 0))
dev->irq = np->intrs[0].line;
pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
}
}
for_each_pci_dev is defined to use pci_get_device in include/linux/pci.h,
which uses pci_dev_get. So every PCI devices use count will be incremented
if chrp_pcibios_fixup is called. Do I miss something or should we add a
pci_dev_put(dev) at the end of the loop?
Eike
On Wed, Nov 17, 2004 at 01:29:51PM +0100, Rolf Eike Beer wrote:
> This is how it is:
>
> chrp_pcibios_fixup(void)
> {
> struct pci_dev *dev = NULL;
> struct device_node *np;
>
> /* PCI interrupts are controlled by the OpenPIC */
> for_each_pci_dev(dev) {
> np = pci_device_to_OF_node(dev);
> if ((np != 0) && (np->n_intrs > 0) && (np->intrs[0].line != 0))
> dev->irq = np->intrs[0].line;
> pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
> }
> }
>
> for_each_pci_dev is defined to use pci_get_device in include/linux/pci.h,
> which uses pci_dev_get. So every PCI devices use count will be incremented
> if chrp_pcibios_fixup is called. Do I miss something or should we add a
> pci_dev_put(dev) at the end of the loop?
You missed something :)
Read the docs for pci_get_device(), it will explain how the above code
is just fine.
BTW, this isn't the first time this very question has come up on lkml,
how come people never think to do a archive search...
thanks,
greg k-h