1/* 2 * PCI <-> OF mapping helpers 3 * 4 * Copyright 2011 IBM Corp. 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License 8 * as published by the Free Software Foundation; either version 9 * 2 of the License, or (at your option) any later version. 10 */ 11 12#include <linux/kernel.h> 13#include <linux/pci.h> 14#include <linux/of.h> 15#include <linux/of_pci.h> 16#include "pci.h" 17 18void pci_set_of_node(struct pci_dev *dev) 19{ 20 if (!dev->bus->dev.of_node) 21 return; 22 dev->dev.of_node = of_pci_find_child_device(dev->bus->dev.of_node, 23 dev->devfn); 24} 25 26void pci_release_of_node(struct pci_dev *dev) 27{ 28 of_node_put(dev->dev.of_node); 29 dev->dev.of_node = NULL; 30} 31 32void pci_set_bus_of_node(struct pci_bus *bus) 33{ 34 if (bus->self == NULL) 35 bus->dev.of_node = pcibios_get_phb_of_node(bus); 36 else 37 bus->dev.of_node = of_node_get(bus->self->dev.of_node); 38} 39 40void pci_release_bus_of_node(struct pci_bus *bus) 41{ 42 of_node_put(bus->dev.of_node); 43 bus->dev.of_node = NULL; 44} 45 46struct device_node * __weak pcibios_get_phb_of_node(struct pci_bus *bus) 47{ 48 /* This should only be called for PHBs */ 49 if (WARN_ON(bus->self || bus->parent)) 50 return NULL; 51 52 /* Look for a node pointer in either the intermediary device we 53 * create above the root bus or it's own parent. Normally only 54 * the later is populated. 55 */ 56 if (bus->bridge->of_node) 57 return of_node_get(bus->bridge->of_node); 58 if (bus->bridge->parent && bus->bridge->parent->of_node) 59 return of_node_get(bus->bridge->parent->of_node); 60 return NULL; 61} 62