[PATCH 05/10] core: extend struct driver_info to point to device

Walter Lozano walter.lozano at collabora.com
Fri May 29 21:20:52 CEST 2020


Hi Simon,

On 29/5/20 16:00, Simon Glass wrote:
> Hi Walter,
>
> On Fri, 29 May 2020 at 12:56, Walter Lozano <walter.lozano at collabora.com> wrote:
>>
>> On 29/5/20 15:15, Walter Lozano wrote:
>>> Currently when creating an U_BOOT_DEVICE entry a struct driver_info
>>> is declared, which contains the data needed to instantiate the device.
>>> However, the actual device is created at runtime and there is no proper
>>> way to get the device based on its struct driver_info.
>>>
>>> This patch extends struct driver_info adding a pointer to udevice which
>>> is populated during the bind process, allowing to generate a set of
>>> functions to get the device based on its struct driver_info.
>>>
>>> Signed-off-by: Walter Lozano <walter.lozano at collabora.com>
>>> ---
>>>    drivers/core/device.c | 26 +++++++++++++++++++++++---
>>>    drivers/core/root.c   |  4 ++++
>>>    include/dm/device.h   | 14 ++++++++++++++
>>>    include/dm/platdata.h | 14 ++++++++++++++
>>>    4 files changed, 55 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/drivers/core/device.c b/drivers/core/device.c
>>> index a0ad080aaf..5adbc30849 100644
>>> --- a/drivers/core/device.c
>>> +++ b/drivers/core/device.c
>>> @@ -250,6 +250,7 @@ int device_bind_by_name(struct udevice *parent, bool pre_reloc_only,
>>>    {
>>>        struct driver *drv;
>>>        uint platdata_size = 0;
>>> +     int ret = 0;
>>>
>>>        drv = lists_driver_lookup_name(info->name);
>>>        if (!drv)
>>> @@ -260,9 +261,16 @@ int device_bind_by_name(struct udevice *parent, bool pre_reloc_only,
>>>    #if CONFIG_IS_ENABLED(OF_PLATDATA)
>>>        platdata_size = info->platdata_size;
>>>    #endif
>>> -     return device_bind_common(parent, drv, info->name,
>>> -                     (void *)info->platdata, 0, ofnode_null(), platdata_size,
>>> -                     devp);
>>> +     ret = device_bind_common(parent, drv, info->name,
>>> +                              (void *)info->platdata, 0, ofnode_null(),
>>> +                              platdata_size, devp);
>>> +     if (ret)
>>> +             return ret;
>>> +#if CONFIG_IS_ENABLED(OF_PLATDATA)
>>> +     info->dev = *devp;
>>> +#endif
>> I have tried to test this using sandbox_spl_defconfig but I've received
>> a segmentation fault when trying to update info->dev, however this code
>> works on iMX6.
>>
>> Could it be some kind of protection? Any thoughts?
> Yes, see u-boot-dm/dtoc-working - arch/sandbox/cpu/u-boot-spl.lds has
> an attempt to move some of the list stuff into the data region.

Thanks for confirmed it and also for the quick response. I'm about to 
start a deeper review to your work about tiny-dm now.

Regards,

Walter




More information about the U-Boot mailing list