From: Yinghai Lu <yinghai@kernel.org>
To: Bjorn Helgaas <bhelgaas@google.com>
Cc: linux-pci@vger.kernel.org, Yinghai Lu <yinghai@kernel.org>
Subject: [PATCH 04/10] PCI: Use device_add for device and bus early
Date: Mon, 1 Oct 2012 23:33:02 -0700 [thread overview]
Message-ID: <1349159588-15029-5-git-send-email-yinghai@kernel.org> (raw)
In-Reply-To: <1349159588-15029-1-git-send-email-yinghai@kernel.org>
Move out device registering out of pci_bus_add_devices, so we could
put new created pci devices in device tree early.
new pci_bus_add_devices will do the device_attach work to load pci drivers
instead.
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
---
drivers/pci/bus.c | 34 ++--------------------------------
drivers/pci/iov.c | 7 -------
drivers/pci/probe.c | 25 ++++++++++++++++++-------
3 files changed, 20 insertions(+), 46 deletions(-)
diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c
index 3144262..5b98505 100644
--- a/drivers/pci/bus.c
+++ b/drivers/pci/bus.c
@@ -179,12 +179,7 @@ static void pci_bus_attach_device(struct pci_dev *dev)
*/
int pci_bus_add_device(struct pci_dev *dev)
{
- int retval;
-
pci_fixup_device(pci_fixup_final, dev);
- retval = device_add(&dev->dev);
- if (retval)
- return retval;
pci_bus_attach_device(dev);
dev->is_added = 1;
@@ -201,21 +196,12 @@ int pci_bus_add_device(struct pci_dev *dev)
*/
int pci_bus_add_child(struct pci_bus *bus)
{
- int retval;
-
- if (bus->bridge)
- bus->dev.parent = bus->bridge;
-
- retval = device_add(&bus->dev);
- if (retval)
- return retval;
-
bus->is_added = 1;
/* Create legacy_io and legacy_mem files for this bus */
pci_create_legacy_files(bus);
- return retval;
+ return 0;
}
/**
@@ -241,36 +227,20 @@ void pci_bus_add_devices(const struct pci_bus *bus)
if (dev->is_added)
continue;
retval = pci_bus_add_device(dev);
- if (retval)
- dev_err(&dev->dev, "Error adding device, continuing\n");
}
list_for_each_entry(dev, &bus->devices, bus_list) {
BUG_ON(!dev->is_added);
child = dev->subordinate;
- /*
- * If there is an unattached subordinate bus, attach
- * it and then scan for unattached PCI devices.
- */
+
if (!child)
continue;
- if (list_empty(&child->node)) {
- down_write(&pci_bus_sem);
- list_add_tail(&child->node, &dev->bus->children);
- up_write(&pci_bus_sem);
- }
pci_bus_add_devices(child);
- /*
- * register the bus with sysfs as the parent is now
- * properly registered.
- */
if (child->is_added)
continue;
retval = pci_bus_add_child(child);
- if (retval)
- dev_err(&dev->dev, "Error adding bus, continuing\n");
}
}
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
index aeccc91..f286583 100644
--- a/drivers/pci/iov.c
+++ b/drivers/pci/iov.c
@@ -48,12 +48,7 @@ static struct pci_bus *virtfn_add_bus(struct pci_bus *bus, int busnr)
return NULL;
pci_bus_insert_busn_res(child, busnr, busnr);
- child->dev.parent = bus->bridge;
rc = pci_bus_add_child(child);
- if (rc) {
- pci_remove_bus(child);
- return NULL;
- }
return child;
}
@@ -123,8 +118,6 @@ static int virtfn_add(struct pci_dev *dev, int id, int reset)
virtfn->is_virtfn = 1;
rc = pci_bus_add_device(virtfn);
- if (rc)
- goto failed1;
sprintf(buf, "virtfn%u", id);
rc = sysfs_create_link(&dev->dev.kobj, &virtfn->dev.kobj, buf);
if (rc)
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index c3da8f5..c1b7292 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -616,6 +616,7 @@ static struct pci_bus *pci_alloc_child_bus(struct pci_bus *parent,
{
struct pci_bus *child;
int i;
+ int ret;
/*
* Allocate a new bus, and inherit stuff from the parent..
@@ -630,8 +631,7 @@ static struct pci_bus *pci_alloc_child_bus(struct pci_bus *parent,
child->bus_flags = parent->bus_flags;
/* initialize some portions of the bus device, but don't register it
- * now as the parent is not properly set up yet. This device will get
- * registered later in pci_bus_add_devices()
+ * now as the parent is not properly set up yet.
*/
child->dev.class = &pcibus_class;
dev_set_name(&child->dev, "%04x:%02x", pci_domain_nr(child), busnr);
@@ -645,11 +645,14 @@ static struct pci_bus *pci_alloc_child_bus(struct pci_bus *parent,
child->primary = parent->busn_res.start;
child->busn_res.end = 0xff;
- if (!bridge)
- return child;
+ if (!bridge) {
+ child->dev.parent = parent->bridge;
+ goto add_dev;
+ }
child->self = bridge;
child->bridge = get_device(&bridge->dev);
+ child->dev.parent = child->bridge;
pci_set_bus_of_node(child);
pci_set_bus_speed(child);
@@ -660,6 +663,10 @@ static struct pci_bus *pci_alloc_child_bus(struct pci_bus *parent,
}
bridge->subordinate = child;
+add_dev:
+ ret = device_add(&child->dev);
+ WARN_ON(ret < 0);
+
return child;
}
@@ -1290,6 +1297,8 @@ static void pci_init_capabilities(struct pci_dev *dev)
void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)
{
+ int ret;
+
device_initialize(&dev->dev);
dev->dev.release = pci_release_dev;
@@ -1320,6 +1329,10 @@ void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)
down_write(&pci_bus_sem);
list_add_tail(&dev->bus_list, &bus->devices);
up_write(&pci_bus_sem);
+
+ /* notifier could use pci capabilities */
+ ret = device_add(&dev->dev);
+ WARN_ON(ret < 0);
}
struct pci_dev *__ref pci_scan_single_device(struct pci_bus *bus, int devfn)
@@ -1638,13 +1651,13 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
char bus_addr[64];
char *fmt;
-
b = pci_alloc_bus();
if (!b)
return NULL;
b->sysdata = sysdata;
b->ops = ops;
+ b->number = b->busn_res.start = bus;
b2 = pci_find_bus(pci_domain_nr(b), bus);
if (b2) {
/* If we already got to this bus through a different bridge, ignore it */
@@ -1681,8 +1694,6 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
/* Create legacy_io and legacy_mem files for this bus */
pci_create_legacy_files(b);
- b->number = b->busn_res.start = bus;
-
if (parent)
dev_info(parent, "PCI host bridge to bus %s\n", dev_name(&b->dev));
else
--
1.7.7
next prev parent reply other threads:[~2012-10-02 6:33 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-02 6:32 [PATCH 00/10] PCI, ACPI: Use bus type notifier for root bus hotplug Yinghai Lu
2012-10-02 6:32 ` [PATCH 01/10] device: add drivers_autoprobe in struct device Yinghai Lu
2012-10-02 13:33 ` Greg Kroah-Hartman
2012-10-02 17:39 ` Yinghai Lu
2012-10-02 17:47 ` Greg Kroah-Hartman
2012-10-02 18:00 ` Bjorn Helgaas
2012-10-02 20:20 ` Yinghai Lu
2012-10-02 20:45 ` Greg Kroah-Hartman
2012-10-02 21:47 ` Yinghai Lu
2012-10-02 22:38 ` Bjorn Helgaas
2012-10-02 23:20 ` Yinghai Lu
2012-10-03 0:00 ` Yinghai Lu
2012-10-03 2:07 ` Yinghai Lu
2012-10-03 2:08 ` Yinghai Lu
2012-10-03 19:48 ` Bjorn Helgaas
2012-10-03 20:50 ` Yinghai Lu
2012-10-03 23:00 ` [PATCH 0/4] ACPI: kill acpi_pci_root_start Yinghai Lu
2012-10-03 23:00 ` [PATCH 1/4] ACPI: add drivers_autoprobe in struct acpi_device Yinghai Lu
2012-10-04 13:03 ` Konrad Rzeszutek Wilk
2012-10-04 15:15 ` Yinghai Lu
2012-10-09 16:38 ` Konrad Rzeszutek Wilk
2012-10-03 23:00 ` [PATCH 2/4] ACPI: use device drivers_autoprobe to delay loading acpi drivers Yinghai Lu
2012-10-03 23:00 ` [PATCH 3/4] PCI, ACPI: Remove not used acpi_pci_root_start() Yinghai Lu
2012-10-03 23:00 ` [PATCH 4/4] ACPI: remove acpi_op_start workaround Yinghai Lu
2012-10-04 12:57 ` Konrad Rzeszutek Wilk
2012-10-04 17:47 ` [PATCH 0/4] ACPI: kill acpi_pci_root_start Bjorn Helgaas
2012-10-04 18:36 ` Yinghai Lu
2012-10-04 19:44 ` Bjorn Helgaas
2012-10-04 19:54 ` Rafael J. Wysocki
2012-10-04 20:14 ` Yinghai Lu
2012-10-04 20:47 ` Bjorn Helgaas
2012-10-04 19:53 ` Rafael J. Wysocki
2012-10-04 21:23 ` Rafael J. Wysocki
2012-10-04 21:31 ` Yinghai Lu
2012-10-04 21:53 ` Rafael J. Wysocki
2012-10-04 22:01 ` Yinghai Lu
2012-10-04 22:36 ` Rafael J. Wysocki
2012-10-04 22:46 ` Yinghai Lu
2012-10-05 23:01 ` Rafael J. Wysocki
2012-10-05 23:10 ` Yinghai Lu
2012-10-08 20:12 ` Rafael J. Wysocki
2012-10-02 6:33 ` [PATCH 02/10] ACPI: use device drivers_autoprobe to delay loading acpi drivers Yinghai Lu
2012-10-02 6:33 ` [PATCH 03/10] PCI: prepare to use device drivers_autoprobe to delay attach drivers Yinghai Lu
2012-10-02 6:33 ` Yinghai Lu [this message]
2012-10-02 6:33 ` [PATCH 05/10] PCI, ACPI: Separate out acpi_pci_root_osc_contorl_set Yinghai Lu
2012-10-02 6:33 ` [PATCH 06/10] PCI, ACPI: Move hot add root bus conf code to acpi_pci_root_add Yinghai Lu
2012-10-02 6:33 ` [PATCH 07/10] PCI, ACPI: Remove not used acpi_pci_root_start() Yinghai Lu
2012-10-02 6:33 ` [PATCH 08/10] PCI: Add dev_is_pci_host_bridge() helper Yinghai Lu
2012-10-02 6:33 ` [PATCH 09/10] PCI, ACPI: using acpi/pci bind path for pci_host_bridge Yinghai Lu
2012-10-02 6:33 ` [PATCH 10/10] PCI, ACPI: use bus_type notifier for acpi_pci_bind_notify Yinghai Lu
2012-10-06 2:57 ` [PATCH 00/10] PCI, ACPI: Use bus type notifier for root bus hotplug Jiang Liu
2012-10-06 7:25 ` Yinghai Lu
2012-10-07 15:17 ` Jiang Liu
2012-10-07 22:33 ` Yinghai Lu
2012-10-08 15:23 ` Jiang Liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1349159588-15029-5-git-send-email-yinghai@kernel.org \
--to=yinghai@kernel.org \
--cc=bhelgaas@google.com \
--cc=linux-pci@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.