[U-Boot] [PATCH 05/10] dm: pci: Adjust pci_find_and_bind_driver() to return -EPERM
Bin Meng
bmeng.cn at gmail.com
Mon Sep 14 14:15:56 CEST 2015
On Wed, Sep 9, 2015 at 7:52 AM, Simon Glass <sjg at chromium.org> wrote:
> The current code returns 0 even if it failed to find or bind a driver. The
> caller then has to check the returned device to see if it is NULL. It is
> better to return an error code in this case so that it is clear what
> happened.
>
> Adjust the code to return -EPERM, indicating that the device was not bound
> because it is not needed for pre-relocation use. Add comments so that the
> return value is clear.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
> drivers/pci/pci-uclass.c | 31 +++++++++++++++++++------------
> 1 file changed, 19 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/pci/pci-uclass.c b/drivers/pci/pci-uclass.c
> index 7347160..54285ee 100644
> --- a/drivers/pci/pci-uclass.c
> +++ b/drivers/pci/pci-uclass.c
> @@ -458,10 +458,17 @@ static bool pci_match_one_id(const struct pci_device_id *id,
> * pci_find_and_bind_driver() - Find and bind the right PCI driver
> *
> * This only looks at certain fields in the descriptor.
> + *
> + * @parent: Parent bus
> + * @find_id: Specification of the driver to find
> + * @bdf: Bus/device/function addreess - see PCI_BDF()
> + * @devp: Returns a pointer to the device created
> + * @return 0 if OK, -EPERM if the device is not needed before relocation and
> + * therefore was not created, other -ve value on error
> */
> static int pci_find_and_bind_driver(struct udevice *parent,
> - struct pci_device_id *find_id, pci_dev_t bdf,
> - struct udevice **devp)
> + struct pci_device_id *find_id,
> + pci_dev_t bdf, struct udevice **devp)
> {
> struct pci_driver_entry *start, *entry;
> const char *drv;
> @@ -497,7 +504,7 @@ static int pci_find_and_bind_driver(struct udevice *parent,
> */
> if (!(gd->flags & GD_FLG_RELOC) &&
> !(drv->flags & DM_FLAG_PRE_RELOC))
> - return 0;
> + return -EPERM;
>
> /*
> * We could pass the descriptor to the driver as
> @@ -525,7 +532,7 @@ static int pci_find_and_bind_driver(struct udevice *parent,
> * limited (ie: using Cache As RAM).
> */
> if (!(gd->flags & GD_FLG_RELOC) && !bridge)
> - return 0;
> + return -EPERM;
>
> /* Bind a generic driver so that the device can be used */
> sprintf(name, "pci_%x:%x.%x", parent->seq, PCI_DEV(bdf),
> @@ -613,17 +620,17 @@ int pci_bind_bus_devices(struct udevice *bus)
> ret = pci_find_and_bind_driver(bus, &find_id, bdf,
> &dev);
> }
> - if (ret)
> + if (ret == -EPERM)
> + continue;
> + else if (ret)
> return ret;
>
> /* Update the platform data */
> - if (dev) {
> - pplat = dev_get_parent_platdata(dev);
> - pplat->devfn = PCI_MASK_BUS(bdf);
> - pplat->vendor = vendor;
> - pplat->device = device;
> - pplat->class = class;
> - }
> + pplat = dev_get_parent_platdata(dev);
> + pplat->devfn = PCI_MASK_BUS(bdf);
> + pplat->vendor = vendor;
> + pplat->device = device;
> + pplat->class = class;
> }
>
> return 0;
> --
Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
More information about the U-Boot
mailing list