[U-Boot] [PATCH 1/2] dm: core: Add uclass_first_device_err() to return a valid device
Simon Glass
sjg at chromium.org
Tue Feb 23 07:38:00 CET 2016
Hi Bin,
On 16 February 2016 at 02:31, Bin Meng <bmeng.cn at gmail.com> wrote:
> Hi Simon,
>
> On Fri, Feb 12, 2016 at 4:23 AM, Simon Glass <sjg at chromium.org> wrote:
>> A common pattern is to call uclass_first_device() and then check if it
>> actually returns a device. Add a new function which does this, returning
>> an error if there are no devices in that uclass.
>>
>> Signed-off-by: Simon Glass <sjg at chromium.org>
>> ---
>>
>> drivers/core/uclass.c | 13 +++++++++++++
>> include/dm/uclass.h | 15 +++++++++++++--
>> 2 files changed, 26 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/core/uclass.c b/drivers/core/uclass.c
>> index 12095e7..1141ce1 100644
>> --- a/drivers/core/uclass.c
>> +++ b/drivers/core/uclass.c
>> @@ -401,6 +401,19 @@ int uclass_first_device(enum uclass_id id, struct udevice **devp)
>> return uclass_get_device_tail(dev, ret, devp);
>> }
>>
>> +int uclass_first_device_err(enum uclass_id id, struct udevice **devp)
>
> Or maybe another way is to change uclass_first_device() behavior to
> return -ENODEV if device is not found? (move the return value test
> logic into uclass_first_device)
Yes, that was my original plan. But when I looked at the calls about
half of them would find that annoying, and it would add extra logic.
After all, if the error is -ENODEV then it means there is no device,
but all is well. If the error is -EINVAL (for example), then the error
would need to be returned by the caller of uclass_first_device().
>
>> +{
>> + int ret;
>> +
>> + ret = uclass_first_device(id, devp);
>> + if (ret)
>> + return ret;
>> + else if (!*devp)
>> + return -ENODEV;
>> +
>> + return 0;
>> +}
>> +
>> int uclass_next_device(struct udevice **devp)
>> {
>> struct udevice *dev = *devp;
>> diff --git a/include/dm/uclass.h b/include/dm/uclass.h
>> index bfbd27a..fd368b6 100644
>> --- a/include/dm/uclass.h
>> +++ b/include/dm/uclass.h
>> @@ -200,18 +200,29 @@ int uclass_get_device_by_phandle(enum uclass_id id, struct udevice *parent,
>> *
>> * @id: Uclass ID to look up
>> * @devp: Returns pointer to the first device in that uclass, or NULL if none
>> - * @return 0 if OK (found or not found), -1 on error
>> + * @return 0 if OK (found or not found), other -ve on error
>> */
>> int uclass_first_device(enum uclass_id id, struct udevice **devp);
>>
>> /**
>> + * uclass_first_device_err() - Get the first device in a uclass
>> + *
>> + * The device returned is probed if necessary, and ready for use
>> + *
>> + * @id: Uclass ID to look up
>> + * @devp: Returns pointer to the first device in that uclass, or NULL if none
>> + * @return 0 if found, -ENODEV if not found, other -ve on error
>> + */
>> +int uclass_first_device_err(enum uclass_id id, struct udevice **devp);
>> +
>> +/**
>> * uclass_next_device() - Get the next device in a uclass
>> *
>> * The device returned is probed if necessary, and ready for use
>> *
>> * @devp: On entry, pointer to device to lookup. On exit, returns pointer
>> * to the next device in the same uclass, or NULL if none
>> - * @return 0 if OK (found or not found), -1 on error
>> + * @return 0 if OK (found or not found), other -ve on error
>> */
>> int uclass_next_device(struct udevice **devp);
>>
>> --
>
> Regards,
> Bin
Regards,
Simon
More information about the U-Boot
mailing list