Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 330ebfe3 authored by Bjorn Helgaas's avatar Bjorn Helgaas
Browse files

Merge branch 'pci/deletion' into next

* pci/deletion:
  PCI: Remove from bus_list and release resources in pci_release_dev()
  PCI: Move pci_proc_attach_device() to pci_bus_add_device()
  PCI: Use device_release_driver() in pci_stop_root_bus()
  PCI: Move device_del() from pci_stop_dev() to pci_destroy_dev()

Conflicts:
	drivers/pci/remove.c
parents d9cdfb87 ef83b078
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -176,6 +176,7 @@ int pci_bus_add_device(struct pci_dev *dev)
	 */
	 */
	pci_fixup_device(pci_fixup_final, dev);
	pci_fixup_device(pci_fixup_final, dev);
	pci_create_sysfs_dev_files(dev);
	pci_create_sysfs_dev_files(dev);
	pci_proc_attach_device(dev);


	dev->match_driver = true;
	dev->match_driver = true;
	retval = device_attach(&dev->dev);
	retval = device_attach(&dev->dev);
+19 −4
Original line number Original line Diff line number Diff line
@@ -1154,6 +1154,18 @@ static void pci_release_capabilities(struct pci_dev *dev)
	pci_free_cap_save_buffers(dev);
	pci_free_cap_save_buffers(dev);
}
}


static void pci_free_resources(struct pci_dev *dev)
{
	int i;

	pci_cleanup_rom(dev);
	for (i = 0; i < PCI_NUM_RESOURCES; i++) {
		struct resource *res = dev->resource + i;
		if (res->parent)
			release_resource(res);
	}
}

/**
/**
 * pci_release_dev - free a pci device structure when all users of it are finished.
 * pci_release_dev - free a pci device structure when all users of it are finished.
 * @dev: device that's been disconnected
 * @dev: device that's been disconnected
@@ -1163,9 +1175,14 @@ static void pci_release_capabilities(struct pci_dev *dev)
 */
 */
static void pci_release_dev(struct device *dev)
static void pci_release_dev(struct device *dev)
{
{
	struct pci_dev *pci_dev;
	struct pci_dev *pci_dev = to_pci_dev(dev);

	down_write(&pci_bus_sem);
	list_del(&pci_dev->bus_list);
	up_write(&pci_bus_sem);

	pci_free_resources(pci_dev);


	pci_dev = to_pci_dev(dev);
	pci_release_capabilities(pci_dev);
	pci_release_capabilities(pci_dev);
	pci_release_of_node(pci_dev);
	pci_release_of_node(pci_dev);
	pcibios_release_device(pci_dev);
	pcibios_release_device(pci_dev);
@@ -1381,8 +1398,6 @@ void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)
	dev->match_driver = false;
	dev->match_driver = false;
	ret = device_add(&dev->dev);
	ret = device_add(&dev->dev);
	WARN_ON(ret < 0);
	WARN_ON(ret < 0);

	pci_proc_attach_device(dev);
}
}


struct pci_dev *__ref pci_scan_single_device(struct pci_bus *bus, int devfn)
struct pci_dev *__ref pci_scan_single_device(struct pci_bus *bus, int devfn)
+2 −21
Original line number Original line Diff line number Diff line
@@ -3,20 +3,6 @@
#include <linux/pci-aspm.h>
#include <linux/pci-aspm.h>
#include "pci.h"
#include "pci.h"


static void pci_free_resources(struct pci_dev *dev)
{
	int i;

	msi_remove_pci_irq_vectors(dev);

	pci_cleanup_rom(dev);
	for (i = 0; i < PCI_NUM_RESOURCES; i++) {
		struct resource *res = dev->resource + i;
		if (res->parent)
			release_resource(res);
	}
}

static void pci_stop_dev(struct pci_dev *dev)
static void pci_stop_dev(struct pci_dev *dev)
{
{
	pci_pme_active(dev, false);
	pci_pme_active(dev, false);
@@ -36,11 +22,6 @@ static void pci_destroy_dev(struct pci_dev *dev)
{
{
	device_del(&dev->dev);
	device_del(&dev->dev);


	down_write(&pci_bus_sem);
	list_del(&dev->bus_list);
	up_write(&pci_bus_sem);

	pci_free_resources(dev);
	put_device(&dev->dev);
	put_device(&dev->dev);
}
}


@@ -128,7 +109,7 @@ void pci_stop_root_bus(struct pci_bus *bus)
		pci_stop_bus_device(child);
		pci_stop_bus_device(child);


	/* stop the host bridge */
	/* stop the host bridge */
	device_del(&host_bridge->dev);
	device_release_driver(&host_bridge->dev);
}
}


void pci_remove_root_bus(struct pci_bus *bus)
void pci_remove_root_bus(struct pci_bus *bus)
@@ -147,5 +128,5 @@ void pci_remove_root_bus(struct pci_bus *bus)
	host_bridge->bus = NULL;
	host_bridge->bus = NULL;


	/* remove the host bridge */
	/* remove the host bridge */
	put_device(&host_bridge->dev);
	device_unregister(&host_bridge->dev);
}
}