Merge branch 'devicetree/next' of git://git.secretlab.ca/git/linux-2.6
* 'devicetree/next' of git://git.secretlab.ca/git/linux-2.6: (21 commits) tty: serial: altera_jtaguart: Add device tree support tty: serial: altera_uart: Add devicetree support dt: eliminate of_platform_driver shim code dt: Eliminate of_platform_{,un}register_driver dt/serial: Eliminate users of of_platform_{,un}register_driver dt/usb: Eliminate users of of_platform_{,un}register_driver dt/video: Eliminate users of of_platform_{,un}register_driver dt/net: Eliminate users of of_platform_{,un}register_driver dt/sound: Eliminate users of of_platform_{,un}register_driver dt/spi: Eliminate users of of_platform_{,un}register_driver dt: uartlite: merge platform and of_platform driver bindings dt: xilinx_hwicap: merge platform and of_platform driver bindings ipmi: convert OF driver to platform driver leds/leds-gpio: merge platform_driver with of_platform_driver dt/sparc: Eliminate users of of_platform_{,un}register_driver dt/powerpc: Eliminate users of of_platform_{,un}register_driver dt/powerpc: move of_bus_type infrastructure to ibmebus drivercore/dt: add a match table pointer to struct device dt: Typo fix. altera_ps2: Add devicetree support ...
Цей коміт міститься в:
@@ -201,13 +201,14 @@ int ibmebus_register_driver(struct of_platform_driver *drv)
|
||||
/* If the driver uses devices that ibmebus doesn't know, add them */
|
||||
ibmebus_create_devices(drv->driver.of_match_table);
|
||||
|
||||
return of_register_driver(drv, &ibmebus_bus_type);
|
||||
drv->driver.bus = &ibmebus_bus_type;
|
||||
return driver_register(&drv->driver);
|
||||
}
|
||||
EXPORT_SYMBOL(ibmebus_register_driver);
|
||||
|
||||
void ibmebus_unregister_driver(struct of_platform_driver *drv)
|
||||
{
|
||||
of_unregister_driver(drv);
|
||||
driver_unregister(&drv->driver);
|
||||
}
|
||||
EXPORT_SYMBOL(ibmebus_unregister_driver);
|
||||
|
||||
@@ -308,15 +309,410 @@ static ssize_t ibmebus_store_remove(struct bus_type *bus,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static struct bus_attribute ibmebus_bus_attrs[] = {
|
||||
__ATTR(probe, S_IWUSR, NULL, ibmebus_store_probe),
|
||||
__ATTR(remove, S_IWUSR, NULL, ibmebus_store_remove),
|
||||
__ATTR_NULL
|
||||
};
|
||||
|
||||
static int ibmebus_bus_bus_match(struct device *dev, struct device_driver *drv)
|
||||
{
|
||||
const struct of_device_id *matches = drv->of_match_table;
|
||||
|
||||
if (!matches)
|
||||
return 0;
|
||||
|
||||
return of_match_device(matches, dev) != NULL;
|
||||
}
|
||||
|
||||
static int ibmebus_bus_device_probe(struct device *dev)
|
||||
{
|
||||
int error = -ENODEV;
|
||||
struct of_platform_driver *drv;
|
||||
struct platform_device *of_dev;
|
||||
const struct of_device_id *match;
|
||||
|
||||
drv = to_of_platform_driver(dev->driver);
|
||||
of_dev = to_platform_device(dev);
|
||||
|
||||
if (!drv->probe)
|
||||
return error;
|
||||
|
||||
of_dev_get(of_dev);
|
||||
|
||||
match = of_match_device(drv->driver.of_match_table, dev);
|
||||
if (match)
|
||||
error = drv->probe(of_dev, match);
|
||||
if (error)
|
||||
of_dev_put(of_dev);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static int ibmebus_bus_device_remove(struct device *dev)
|
||||
{
|
||||
struct platform_device *of_dev = to_platform_device(dev);
|
||||
struct of_platform_driver *drv = to_of_platform_driver(dev->driver);
|
||||
|
||||
if (dev->driver && drv->remove)
|
||||
drv->remove(of_dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ibmebus_bus_device_shutdown(struct device *dev)
|
||||
{
|
||||
struct platform_device *of_dev = to_platform_device(dev);
|
||||
struct of_platform_driver *drv = to_of_platform_driver(dev->driver);
|
||||
|
||||
if (dev->driver && drv->shutdown)
|
||||
drv->shutdown(of_dev);
|
||||
}
|
||||
|
||||
/*
|
||||
* ibmebus_bus_device_attrs
|
||||
*/
|
||||
static ssize_t devspec_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct platform_device *ofdev;
|
||||
|
||||
ofdev = to_platform_device(dev);
|
||||
return sprintf(buf, "%s\n", ofdev->dev.of_node->full_name);
|
||||
}
|
||||
|
||||
static ssize_t name_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct platform_device *ofdev;
|
||||
|
||||
ofdev = to_platform_device(dev);
|
||||
return sprintf(buf, "%s\n", ofdev->dev.of_node->name);
|
||||
}
|
||||
|
||||
static ssize_t modalias_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
ssize_t len = of_device_get_modalias(dev, buf, PAGE_SIZE - 2);
|
||||
buf[len] = '\n';
|
||||
buf[len+1] = 0;
|
||||
return len+1;
|
||||
}
|
||||
|
||||
struct device_attribute ibmebus_bus_device_attrs[] = {
|
||||
__ATTR_RO(devspec),
|
||||
__ATTR_RO(name),
|
||||
__ATTR_RO(modalias),
|
||||
__ATTR_NULL
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int ibmebus_bus_legacy_suspend(struct device *dev, pm_message_t mesg)
|
||||
{
|
||||
struct platform_device *of_dev = to_platform_device(dev);
|
||||
struct of_platform_driver *drv = to_of_platform_driver(dev->driver);
|
||||
int ret = 0;
|
||||
|
||||
if (dev->driver && drv->suspend)
|
||||
ret = drv->suspend(of_dev, mesg);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ibmebus_bus_legacy_resume(struct device *dev)
|
||||
{
|
||||
struct platform_device *of_dev = to_platform_device(dev);
|
||||
struct of_platform_driver *drv = to_of_platform_driver(dev->driver);
|
||||
int ret = 0;
|
||||
|
||||
if (dev->driver && drv->resume)
|
||||
ret = drv->resume(of_dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ibmebus_bus_pm_prepare(struct device *dev)
|
||||
{
|
||||
struct device_driver *drv = dev->driver;
|
||||
int ret = 0;
|
||||
|
||||
if (drv && drv->pm && drv->pm->prepare)
|
||||
ret = drv->pm->prepare(dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void ibmebus_bus_pm_complete(struct device *dev)
|
||||
{
|
||||
struct device_driver *drv = dev->driver;
|
||||
|
||||
if (drv && drv->pm && drv->pm->complete)
|
||||
drv->pm->complete(dev);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
|
||||
static int ibmebus_bus_pm_suspend(struct device *dev)
|
||||
{
|
||||
struct device_driver *drv = dev->driver;
|
||||
int ret = 0;
|
||||
|
||||
if (!drv)
|
||||
return 0;
|
||||
|
||||
if (drv->pm) {
|
||||
if (drv->pm->suspend)
|
||||
ret = drv->pm->suspend(dev);
|
||||
} else {
|
||||
ret = ibmebus_bus_legacy_suspend(dev, PMSG_SUSPEND);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ibmebus_bus_pm_suspend_noirq(struct device *dev)
|
||||
{
|
||||
struct device_driver *drv = dev->driver;
|
||||
int ret = 0;
|
||||
|
||||
if (!drv)
|
||||
return 0;
|
||||
|
||||
if (drv->pm) {
|
||||
if (drv->pm->suspend_noirq)
|
||||
ret = drv->pm->suspend_noirq(dev);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ibmebus_bus_pm_resume(struct device *dev)
|
||||
{
|
||||
struct device_driver *drv = dev->driver;
|
||||
int ret = 0;
|
||||
|
||||
if (!drv)
|
||||
return 0;
|
||||
|
||||
if (drv->pm) {
|
||||
if (drv->pm->resume)
|
||||
ret = drv->pm->resume(dev);
|
||||
} else {
|
||||
ret = ibmebus_bus_legacy_resume(dev);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ibmebus_bus_pm_resume_noirq(struct device *dev)
|
||||
{
|
||||
struct device_driver *drv = dev->driver;
|
||||
int ret = 0;
|
||||
|
||||
if (!drv)
|
||||
return 0;
|
||||
|
||||
if (drv->pm) {
|
||||
if (drv->pm->resume_noirq)
|
||||
ret = drv->pm->resume_noirq(dev);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#else /* !CONFIG_SUSPEND */
|
||||
|
||||
#define ibmebus_bus_pm_suspend NULL
|
||||
#define ibmebus_bus_pm_resume NULL
|
||||
#define ibmebus_bus_pm_suspend_noirq NULL
|
||||
#define ibmebus_bus_pm_resume_noirq NULL
|
||||
|
||||
#endif /* !CONFIG_SUSPEND */
|
||||
|
||||
#ifdef CONFIG_HIBERNATION
|
||||
|
||||
static int ibmebus_bus_pm_freeze(struct device *dev)
|
||||
{
|
||||
struct device_driver *drv = dev->driver;
|
||||
int ret = 0;
|
||||
|
||||
if (!drv)
|
||||
return 0;
|
||||
|
||||
if (drv->pm) {
|
||||
if (drv->pm->freeze)
|
||||
ret = drv->pm->freeze(dev);
|
||||
} else {
|
||||
ret = ibmebus_bus_legacy_suspend(dev, PMSG_FREEZE);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ibmebus_bus_pm_freeze_noirq(struct device *dev)
|
||||
{
|
||||
struct device_driver *drv = dev->driver;
|
||||
int ret = 0;
|
||||
|
||||
if (!drv)
|
||||
return 0;
|
||||
|
||||
if (drv->pm) {
|
||||
if (drv->pm->freeze_noirq)
|
||||
ret = drv->pm->freeze_noirq(dev);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ibmebus_bus_pm_thaw(struct device *dev)
|
||||
{
|
||||
struct device_driver *drv = dev->driver;
|
||||
int ret = 0;
|
||||
|
||||
if (!drv)
|
||||
return 0;
|
||||
|
||||
if (drv->pm) {
|
||||
if (drv->pm->thaw)
|
||||
ret = drv->pm->thaw(dev);
|
||||
} else {
|
||||
ret = ibmebus_bus_legacy_resume(dev);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ibmebus_bus_pm_thaw_noirq(struct device *dev)
|
||||
{
|
||||
struct device_driver *drv = dev->driver;
|
||||
int ret = 0;
|
||||
|
||||
if (!drv)
|
||||
return 0;
|
||||
|
||||
if (drv->pm) {
|
||||
if (drv->pm->thaw_noirq)
|
||||
ret = drv->pm->thaw_noirq(dev);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ibmebus_bus_pm_poweroff(struct device *dev)
|
||||
{
|
||||
struct device_driver *drv = dev->driver;
|
||||
int ret = 0;
|
||||
|
||||
if (!drv)
|
||||
return 0;
|
||||
|
||||
if (drv->pm) {
|
||||
if (drv->pm->poweroff)
|
||||
ret = drv->pm->poweroff(dev);
|
||||
} else {
|
||||
ret = ibmebus_bus_legacy_suspend(dev, PMSG_HIBERNATE);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ibmebus_bus_pm_poweroff_noirq(struct device *dev)
|
||||
{
|
||||
struct device_driver *drv = dev->driver;
|
||||
int ret = 0;
|
||||
|
||||
if (!drv)
|
||||
return 0;
|
||||
|
||||
if (drv->pm) {
|
||||
if (drv->pm->poweroff_noirq)
|
||||
ret = drv->pm->poweroff_noirq(dev);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ibmebus_bus_pm_restore(struct device *dev)
|
||||
{
|
||||
struct device_driver *drv = dev->driver;
|
||||
int ret = 0;
|
||||
|
||||
if (!drv)
|
||||
return 0;
|
||||
|
||||
if (drv->pm) {
|
||||
if (drv->pm->restore)
|
||||
ret = drv->pm->restore(dev);
|
||||
} else {
|
||||
ret = ibmebus_bus_legacy_resume(dev);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ibmebus_bus_pm_restore_noirq(struct device *dev)
|
||||
{
|
||||
struct device_driver *drv = dev->driver;
|
||||
int ret = 0;
|
||||
|
||||
if (!drv)
|
||||
return 0;
|
||||
|
||||
if (drv->pm) {
|
||||
if (drv->pm->restore_noirq)
|
||||
ret = drv->pm->restore_noirq(dev);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#else /* !CONFIG_HIBERNATION */
|
||||
|
||||
#define ibmebus_bus_pm_freeze NULL
|
||||
#define ibmebus_bus_pm_thaw NULL
|
||||
#define ibmebus_bus_pm_poweroff NULL
|
||||
#define ibmebus_bus_pm_restore NULL
|
||||
#define ibmebus_bus_pm_freeze_noirq NULL
|
||||
#define ibmebus_bus_pm_thaw_noirq NULL
|
||||
#define ibmebus_bus_pm_poweroff_noirq NULL
|
||||
#define ibmebus_bus_pm_restore_noirq NULL
|
||||
|
||||
#endif /* !CONFIG_HIBERNATION */
|
||||
|
||||
static struct dev_pm_ops ibmebus_bus_dev_pm_ops = {
|
||||
.prepare = ibmebus_bus_pm_prepare,
|
||||
.complete = ibmebus_bus_pm_complete,
|
||||
.suspend = ibmebus_bus_pm_suspend,
|
||||
.resume = ibmebus_bus_pm_resume,
|
||||
.freeze = ibmebus_bus_pm_freeze,
|
||||
.thaw = ibmebus_bus_pm_thaw,
|
||||
.poweroff = ibmebus_bus_pm_poweroff,
|
||||
.restore = ibmebus_bus_pm_restore,
|
||||
.suspend_noirq = ibmebus_bus_pm_suspend_noirq,
|
||||
.resume_noirq = ibmebus_bus_pm_resume_noirq,
|
||||
.freeze_noirq = ibmebus_bus_pm_freeze_noirq,
|
||||
.thaw_noirq = ibmebus_bus_pm_thaw_noirq,
|
||||
.poweroff_noirq = ibmebus_bus_pm_poweroff_noirq,
|
||||
.restore_noirq = ibmebus_bus_pm_restore_noirq,
|
||||
};
|
||||
|
||||
#define IBMEBUS_BUS_PM_OPS_PTR (&ibmebus_bus_dev_pm_ops)
|
||||
|
||||
#else /* !CONFIG_PM_SLEEP */
|
||||
|
||||
#define IBMEBUS_BUS_PM_OPS_PTR NULL
|
||||
|
||||
#endif /* !CONFIG_PM_SLEEP */
|
||||
|
||||
struct bus_type ibmebus_bus_type = {
|
||||
.name = "ibmebus",
|
||||
.uevent = of_device_uevent,
|
||||
.bus_attrs = ibmebus_bus_attrs
|
||||
.bus_attrs = ibmebus_bus_attrs,
|
||||
.match = ibmebus_bus_bus_match,
|
||||
.probe = ibmebus_bus_device_probe,
|
||||
.remove = ibmebus_bus_device_remove,
|
||||
.shutdown = ibmebus_bus_device_shutdown,
|
||||
.dev_attrs = ibmebus_bus_device_attrs,
|
||||
.pm = IBMEBUS_BUS_PM_OPS_PTR,
|
||||
};
|
||||
EXPORT_SYMBOL(ibmebus_bus_type);
|
||||
|
||||
@@ -326,7 +722,7 @@ static int __init ibmebus_bus_init(void)
|
||||
|
||||
printk(KERN_INFO "IBM eBus Device Driver\n");
|
||||
|
||||
err = of_bus_type_init(&ibmebus_bus_type, "ibmebus");
|
||||
err = bus_register(&ibmebus_bus_type);
|
||||
if (err) {
|
||||
printk(KERN_ERR "%s: failed to register IBM eBus.\n",
|
||||
__func__);
|
||||
|
@@ -36,8 +36,7 @@
|
||||
* lacking some bits needed here.
|
||||
*/
|
||||
|
||||
static int __devinit of_pci_phb_probe(struct platform_device *dev,
|
||||
const struct of_device_id *match)
|
||||
static int __devinit of_pci_phb_probe(struct platform_device *dev)
|
||||
{
|
||||
struct pci_controller *phb;
|
||||
|
||||
@@ -74,7 +73,7 @@ static int __devinit of_pci_phb_probe(struct platform_device *dev,
|
||||
#endif /* CONFIG_EEH */
|
||||
|
||||
/* Scan the bus */
|
||||
pcibios_scan_phb(phb, dev->dev.of_node);
|
||||
pcibios_scan_phb(phb);
|
||||
if (phb->bus == NULL)
|
||||
return -ENXIO;
|
||||
|
||||
@@ -104,7 +103,7 @@ static struct of_device_id of_pci_phb_ids[] = {
|
||||
{}
|
||||
};
|
||||
|
||||
static struct of_platform_driver of_pci_phb_driver = {
|
||||
static struct platform_driver of_pci_phb_driver = {
|
||||
.probe = of_pci_phb_probe,
|
||||
.driver = {
|
||||
.name = "of-pci",
|
||||
@@ -115,7 +114,7 @@ static struct of_platform_driver of_pci_phb_driver = {
|
||||
|
||||
static __init int of_pci_phb_init(void)
|
||||
{
|
||||
return of_register_platform_driver(&of_pci_phb_driver);
|
||||
return platform_driver_register(&of_pci_phb_driver);
|
||||
}
|
||||
|
||||
device_initcall(of_pci_phb_init);
|
||||
|
@@ -1688,13 +1688,8 @@ int early_find_capability(struct pci_controller *hose, int bus, int devfn,
|
||||
/**
|
||||
* pci_scan_phb - Given a pci_controller, setup and scan the PCI bus
|
||||
* @hose: Pointer to the PCI host controller instance structure
|
||||
* @sysdata: value to use for sysdata pointer. ppc32 and ppc64 differ here
|
||||
*
|
||||
* Note: the 'data' pointer is a temporary measure. As 32 and 64 bit
|
||||
* pci code gets merged, this parameter should become unnecessary because
|
||||
* both will use the same value.
|
||||
*/
|
||||
void __devinit pcibios_scan_phb(struct pci_controller *hose, void *sysdata)
|
||||
void __devinit pcibios_scan_phb(struct pci_controller *hose)
|
||||
{
|
||||
struct pci_bus *bus;
|
||||
struct device_node *node = hose->dn;
|
||||
@@ -1704,13 +1699,13 @@ void __devinit pcibios_scan_phb(struct pci_controller *hose, void *sysdata)
|
||||
node ? node->full_name : "<NO NAME>");
|
||||
|
||||
/* Create an empty bus for the toplevel */
|
||||
bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops,
|
||||
sysdata);
|
||||
bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, hose);
|
||||
if (bus == NULL) {
|
||||
pr_err("Failed to create bus for PCI domain %04x\n",
|
||||
hose->global_number);
|
||||
return;
|
||||
}
|
||||
bus->dev.of_node = of_node_get(node);
|
||||
bus->secondary = hose->first_busno;
|
||||
hose->bus = bus;
|
||||
|
||||
|
@@ -381,7 +381,7 @@ static int __init pcibios_init(void)
|
||||
if (pci_assign_all_buses)
|
||||
hose->first_busno = next_busno;
|
||||
hose->last_busno = 0xff;
|
||||
pcibios_scan_phb(hose, hose);
|
||||
pcibios_scan_phb(hose);
|
||||
pci_bus_add_devices(hose->bus);
|
||||
if (pci_assign_all_buses || next_busno <= hose->last_busno)
|
||||
next_busno = hose->last_busno + pcibios_assign_bus_offset;
|
||||
|
@@ -64,7 +64,7 @@ static int __init pcibios_init(void)
|
||||
|
||||
/* Scan all of the recorded PCI controllers. */
|
||||
list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
|
||||
pcibios_scan_phb(hose, hose->dn);
|
||||
pcibios_scan_phb(hose);
|
||||
pci_bus_add_devices(hose->bus);
|
||||
}
|
||||
|
||||
@@ -242,10 +242,10 @@ long sys_pciconfig_iobase(long which, unsigned long in_bus,
|
||||
break;
|
||||
bus = NULL;
|
||||
}
|
||||
if (bus == NULL || bus->sysdata == NULL)
|
||||
if (bus == NULL || bus->dev.of_node == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
hose_node = (struct device_node *)bus->sysdata;
|
||||
hose_node = bus->dev.of_node;
|
||||
hose = PCI_DN(hose_node)->phb;
|
||||
|
||||
switch (which) {
|
||||
|
@@ -161,7 +161,7 @@ static void *is_devfn_node(struct device_node *dn, void *data)
|
||||
/*
|
||||
* This is the "slow" path for looking up a device_node from a
|
||||
* pci_dev. It will hunt for the device under its parent's
|
||||
* phb and then update sysdata for a future fastpath.
|
||||
* phb and then update of_node pointer.
|
||||
*
|
||||
* It may also do fixups on the actual device since this happens
|
||||
* on the first read/write.
|
||||
@@ -170,16 +170,19 @@ static void *is_devfn_node(struct device_node *dn, void *data)
|
||||
* In this case it may probe for real hardware ("just in case")
|
||||
* and add a device_node to the device tree if necessary.
|
||||
*
|
||||
* Is this function necessary anymore now that dev->dev.of_node is
|
||||
* used to store the node pointer?
|
||||
*
|
||||
*/
|
||||
struct device_node *fetch_dev_dn(struct pci_dev *dev)
|
||||
{
|
||||
struct device_node *orig_dn = dev->sysdata;
|
||||
struct device_node *orig_dn = dev->dev.of_node;
|
||||
struct device_node *dn;
|
||||
unsigned long searchval = (dev->bus->number << 8) | dev->devfn;
|
||||
|
||||
dn = traverse_pci_devices(orig_dn, is_devfn_node, (void *)searchval);
|
||||
if (dn)
|
||||
dev->sysdata = dn;
|
||||
dev->dev.of_node = dn;
|
||||
return dn;
|
||||
}
|
||||
EXPORT_SYMBOL(fetch_dev_dn);
|
||||
|
@@ -135,7 +135,7 @@ struct pci_dev *of_create_pci_dev(struct device_node *node,
|
||||
pr_debug(" create device, devfn: %x, type: %s\n", devfn, type);
|
||||
|
||||
dev->bus = bus;
|
||||
dev->sysdata = node;
|
||||
dev->dev.of_node = of_node_get(node);
|
||||
dev->dev.parent = bus->bridge;
|
||||
dev->dev.bus = &pci_bus_type;
|
||||
dev->devfn = devfn;
|
||||
@@ -238,7 +238,7 @@ void __devinit of_scan_pci_bridge(struct device_node *node,
|
||||
bus->primary = dev->bus->number;
|
||||
bus->subordinate = busrange[1];
|
||||
bus->bridge_ctl = 0;
|
||||
bus->sysdata = node;
|
||||
bus->dev.of_node = of_node_get(node);
|
||||
|
||||
/* parse ranges property */
|
||||
/* PCI #address-cells == 3 and #size-cells == 2 always */
|
||||
|
Посилання в новій задачі
Заблокувати користувача