[U-Boot] [PATCH v2 3/4] core: Add dev_{disable,enable}_by_path
Mario Six
mario.six at gdsys.cc
Fri May 4 07:37:00 UTC 2018
Hi Simon,
On Thu, May 3, 2018 at 4:33 AM, Simon Glass <sjg at chromium.org> wrote:
> 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?
>
Sure, will be fixed in v3.
>> +
>> + 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
>
Will be fixed in v3.
>> + }
>> +
>> + if (res || !dev)
>> + return res;
>
> Just
>
> if (res)
>
Will be fixed in v3.
>> +
>> + 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)
>
Will be fixed in v3.
>> + break;
>> + }
>> +
>> + if (res || !parent)
>
> if (res)
>
Will be fixed in v3.
>> + 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
>
Best regards,
Mario
More information about the U-Boot
mailing list