[U-Boot] [PATCH v2 3/4] core: Add dev_{disable,enable}_by_path

Simon Glass sjg at chromium.org
Thu May 3 02:33:03 UTC 2018


Hi Mario,

On 27 April 2018 at 06:51, Mario Six <mario.six at gdsys.cc> wrote:
> We cannot use device structures to disable devices, since getting
> them with the API functions would bind and activate the device, which
> would fail if the underlying device does not exist.
>
> Hence, add a function to disable devices by path in a live device tree.
>
> Signed-off-by: Mario Six <mario.six at gdsys.cc>
>
> ---
>
> v1 -> v2:
> * Simplified np_to_ofnode(of_find_node_by_path(path)) to ofnode_path(path)
> * Switched to returning -ENOSYS if livetree is not enabled
> * Removed device_find_by_ofnode usage
>
> ---
>  drivers/core/device.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  include/dm/device.h   | 20 ++++++++++++++++++
>  2 files changed, 78 insertions(+)
>
> diff --git a/drivers/core/device.c b/drivers/core/device.c
> index 940a153c58..3bb2fa02af 100644
> --- a/drivers/core/device.c
> +++ b/drivers/core/device.c
> @@ -724,3 +724,61 @@ bool of_machine_is_compatible(const char *compat)
>
>         return !fdt_node_check_compatible(fdt, 0, compat);
>  }
> +
> +int dev_disable_by_path(const char *path)
> +{
> +       struct uclass *uc;
> +       ofnode node = ofnode_path(path);
> +       struct udevice *dev;
> +       int res = 1;

For consistency with current code can you please use ret instead of res?

> +
> +       if (!of_live_active())
> +               return -ENOSYS;
> +
> +       list_for_each_entry(uc, &gd->uclass_root, sibling_node) {
> +               res = uclass_find_device_by_ofnode(uc->uc_drv->id, node, &dev);

How about putting this in global device_find_by_ofnode() function,
which doesn't work on a per-uclass basis?

> +               if (!res || dev)
> +                       break;

Just !res

> +       }
> +
> +       if (res || !dev)
> +               return res;

Just

if (res)

> +
> +       res = device_remove(dev, DM_REMOVE_NORMAL);
> +       if (res)
> +               return res;
> +
> +       res = device_unbind(dev);
> +       if (res)
> +               return res;
> +
> +       return ofnode_set_enabled(node, false);
> +}
> +
> +int dev_enable_by_path(const char *path)
> +{
> +       struct uclass *uc;
> +       ofnode node = ofnode_path(path);
> +       ofnode pnode = ofnode_get_parent(node);
> +       struct udevice *parent;
> +       int res = 1;
> +
> +       if (!of_live_active())
> +               return -ENOSYS;
> +
> +       list_for_each_entry(uc, &gd->uclass_root, sibling_node) {
> +               res = uclass_find_device_by_ofnode(uc->uc_drv->id, pnode,
> +                                                  &parent);
> +               if (!res || parent)

if (!res)

> +                       break;
> +       }
> +
> +       if (res || !parent)

if (res)

> +               return res;
> +
> +       res = ofnode_set_enabled(node, true);
> +       if (res)
> +               return res;
> +
> +       return lists_bind_fdt(parent, node, NULL);
> +}
> diff --git a/include/dm/device.h b/include/dm/device.h
> index 7786b1cf4e..f55907966a 100644
> --- a/include/dm/device.h
> +++ b/include/dm/device.h
> @@ -586,6 +586,26 @@ bool device_is_compatible(struct udevice *dev, const char *compat);
>   */
>  bool of_machine_is_compatible(const char *compat);
>
> +#ifdef CONFIG_OF_LIVE
> +
> +/**
> + * dev_disable_by_path() - Disable a device given its device tree path
> + *
> + * @path:      The device tree path identifying the device to be disabled
> + * @return 0 on success, -ve on error
> + */
> +int dev_disable_by_path(const char *path);
> +
> +/**
> + * dev_enable_by_path() - Enable a device given its device tree path
> + *
> + * @path:      The device tree path identifying the device to be enabled
> + * @return 0 on success, -ve on error
> + */
> +int dev_enable_by_path(const char *path);
> +
> +#endif /* CONFIG_OF_LIVE */
> +
>  /**
>   * device_is_on_pci_bus - Test if a device is on a PCI bus
>   *
> --
> 2.16.1
>

Regards,
Simon


More information about the U-Boot mailing list