diff mbox

[U-Boot,05/25] dm: pci: Add a driver-model version of pci_find_class()

Message ID 1447732444-30892-6-git-send-email-sjg@chromium.org
State Accepted
Commit a0eb835635abe0952529e3eb5207a24ac36fa000
Delegated to: Simon Glass
Headers show

Commit Message

Simon Glass Nov. 17, 2015, 3:53 a.m. UTC
Add a function which scans the driver model device information rather
than scanning the PCI bus again.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 drivers/pci/pci-uclass.c | 20 ++++++++++++++++++++
 include/pci.h            | 10 ++++++++++
 2 files changed, 30 insertions(+)

Comments

Bin Meng Nov. 18, 2015, 4:27 a.m. UTC | #1
On Tue, Nov 17, 2015 at 11:53 AM, Simon Glass <sjg@chromium.org> wrote:
> Add a function which scans the driver model device information rather
> than scanning the PCI bus again.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
>  drivers/pci/pci-uclass.c | 20 ++++++++++++++++++++
>  include/pci.h            | 10 ++++++++++
>  2 files changed, 30 insertions(+)
>
> diff --git a/drivers/pci/pci-uclass.c b/drivers/pci/pci-uclass.c
> index 6376e43..929d772 100644
> --- a/drivers/pci/pci-uclass.c
> +++ b/drivers/pci/pci-uclass.c
> @@ -233,6 +233,26 @@ int dm_pci_find_device(unsigned int vendor, unsigned int device, int index,
>         return -ENODEV;
>  }
>
> +int dm_pci_find_class(uint find_class, int index, struct udevice **devp)
> +{
> +       struct udevice *dev;
> +
> +       /* Scan all known buses */
> +       for (pci_find_first_device(&dev);
> +            dev;
> +            pci_find_next_device(&dev)) {
> +               struct pci_child_platdata *pplat = dev_get_parent_platdata(dev);
> +
> +               if (pplat->class == find_class && !index--) {
> +                       *devp = dev;
> +                       return device_probe(*devp);
> +               }
> +       }
> +       *devp = NULL;
> +
> +       return -ENODEV;
> +}
> +
>  int pci_bus_write_config(struct udevice *bus, pci_dev_t bdf, int offset,
>                          unsigned long value, enum pci_size_t size)
>  {
> diff --git a/include/pci.h b/include/pci.h
> index f29804f..d4f6e02 100644
> --- a/include/pci.h
> +++ b/include/pci.h
> @@ -1186,6 +1186,16 @@ int dm_pci_find_device(unsigned int vendor, unsigned int device, int index,
>                        struct udevice **devp);
>
>  /**
> + * dm_pci_find_class() - find a device by class
> + *
> + * @find_class: 3-byte (24-bit) class value to find
> + * @index:     0 to find the first match, 1 for second, etc.
> + * @devp:      Returns pointer to the device, if found
> + * @return 0 if found, -ve on error
> + */
> +int dm_pci_find_class(uint find_class, int index, struct udevice **devp);
> +
> +/**
>   * struct dm_pci_emul_ops - PCI device emulator operations
>   */
>  struct dm_pci_emul_ops {
> --

Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
diff mbox

Patch

diff --git a/drivers/pci/pci-uclass.c b/drivers/pci/pci-uclass.c
index 6376e43..929d772 100644
--- a/drivers/pci/pci-uclass.c
+++ b/drivers/pci/pci-uclass.c
@@ -233,6 +233,26 @@  int dm_pci_find_device(unsigned int vendor, unsigned int device, int index,
 	return -ENODEV;
 }
 
+int dm_pci_find_class(uint find_class, int index, struct udevice **devp)
+{
+	struct udevice *dev;
+
+	/* Scan all known buses */
+	for (pci_find_first_device(&dev);
+	     dev;
+	     pci_find_next_device(&dev)) {
+		struct pci_child_platdata *pplat = dev_get_parent_platdata(dev);
+
+		if (pplat->class == find_class && !index--) {
+			*devp = dev;
+			return device_probe(*devp);
+		}
+	}
+	*devp = NULL;
+
+	return -ENODEV;
+}
+
 int pci_bus_write_config(struct udevice *bus, pci_dev_t bdf, int offset,
 			 unsigned long value, enum pci_size_t size)
 {
diff --git a/include/pci.h b/include/pci.h
index f29804f..d4f6e02 100644
--- a/include/pci.h
+++ b/include/pci.h
@@ -1186,6 +1186,16 @@  int dm_pci_find_device(unsigned int vendor, unsigned int device, int index,
 		       struct udevice **devp);
 
 /**
+ * dm_pci_find_class() - find a device by class
+ *
+ * @find_class: 3-byte (24-bit) class value to find
+ * @index:	0 to find the first match, 1 for second, etc.
+ * @devp:	Returns pointer to the device, if found
+ * @return 0 if found, -ve on error
+ */
+int dm_pci_find_class(uint find_class, int index, struct udevice **devp);
+
+/**
  * struct dm_pci_emul_ops - PCI device emulator operations
  */
 struct dm_pci_emul_ops {