Commit e76d596a authored by Oza Pawandeep's avatar Oza Pawandeep Committed by Bjorn Helgaas
Browse files

PCI/portdrv: Add generic pcie_port_find_device()



Add generic pcie_port_find_device() routine.

Signed-off-by: default avatarOza Pawandeep <poza@codeaurora.org>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Reviewed-by: default avatarKeith Busch <keith.busch@intel.com>
parent f252d062
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -114,4 +114,5 @@ static inline void pcie_pme_interrupt_enable(struct pci_dev *dev, bool en) {}

struct pcie_port_service_driver *pcie_port_find_service(struct pci_dev *dev,
							u32 service);
struct device *pcie_port_find_device(struct pci_dev *dev, u32 service);
#endif /* _PORTDRV_H_ */
+23 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@

struct portdrv_service_data {
	struct pcie_port_service_driver *drv;
	struct device *dev;
	u32 service;
};

@@ -416,6 +417,7 @@ static int find_service_iter(struct device *device, void *data)
		service_driver = to_service_driver(device->driver);
		if (service_driver->service == service) {
			pdrvs->drv = service_driver;
			pdrvs->dev = device;
			return 1;
		}
	}
@@ -444,6 +446,27 @@ struct pcie_port_service_driver *pcie_port_find_service(struct pci_dev *dev,
	return drv;
}

/**
 * pcie_port_find_device - find the struct device
 * @dev: PCI Express port the service is associated with
 * @service: For the service to find
 *
 * Find the struct device associated with given service on a pci_dev
 */
struct device *pcie_port_find_device(struct pci_dev *dev,
				      u32 service)
{
	struct device *device;
	struct portdrv_service_data pdrvs;

	pdrvs.dev = NULL;
	pdrvs.service = service;
	device_for_each_child(&dev->dev, &pdrvs, find_service_iter);

	device = pdrvs.dev;
	return device;
}

/**
 * pcie_port_device_remove - unregister PCI Express port service devices
 * @dev: PCI Express port the service devices to unregister are associated with