[U-Boot] [PATCH v2 02/17] dm: core: Allow access to the device's driver_id data

Simon Glass sjg at chromium.org
Thu Nov 20 19:39:09 CET 2014


Hi Masahiro,

On 20 November 2014 06:06, Masahiro Yamada <yamada.m at jp.panasonic.com> wrote:
> Hi Simon,
>
>
>
>
> On Wed, 19 Nov 2014 09:35:54 +0000
> Simon Glass <sjg at chromium.org> wrote:
>
>> Hi Masahiro,
>>
>> On 19 November 2014 08:25, Masahiro Yamada <yamada.m at jp.panasonic.com> wrote:
>> > Hi Simon,
>> >
>> >
>> >
>> > On Tue, 11 Nov 2014 10:46:18 -0700
>> > Simon Glass <sjg at chromium.org> wrote:
>> >
>> >> diff --git a/drivers/core/device.c b/drivers/core/device.c
>> >> index 49faa29..0d84776 100644
>> >> --- a/drivers/core/device.c
>> >> +++ b/drivers/core/device.c
>> >> @@ -548,3 +548,8 @@ int device_find_next_child(struct udevice **devp)
>> >>
>> >>       return 0;
>> >>  }
>> >> +
>> >> +ulong dev_get_of_data(struct udevice *dev)
>> >> +{
>> >> +     return dev->of_id->data;
>> >> +}
>> >
>> >
>> > Since this function is short enough, perhaps you might want to
>> > define it as "static inline" in the header file include/dm/device.h
>> >
>> >
>>
>> Thanks for looking at this series.
>>
>> The background here is that I'm quite worried about all the pointers
>> in driver model. It might be quite easy to use the wrong one and get
>> confused.
>
> Me too.
>
>> So my plan is to add code to check that the pointers are
>> what we think they are, like:
>>
>>    DM_CHECK_PTR(dev, "udevice");
>>
>> or similar. Then that code would compile to nothing unless it is
>> enabled with a CONFIG_DM_CHECK_PTRS or whatever. That's the reason for
>> accessors.
>>
>
> Sounds good!
>
>
>> >
>> >> @@ -116,6 +120,7 @@ int lists_bind_fdt(struct udevice *parent, const void *blob, int offset,
>> >>  {
>> >>       struct driver *driver = ll_entry_start(struct driver, driver);
>> >>       const int n_ents = ll_entry_count(struct driver, driver);
>> >> +     const struct udevice_id *id;
>> >>       struct driver *entry;
>> >>       struct udevice *dev;
>> >>       bool found = false;
>> >> @@ -127,7 +132,8 @@ int lists_bind_fdt(struct udevice *parent, const void *blob, int offset,
>> >>       if (devp)
>> >>               *devp = NULL;
>> >>       for (entry = driver; entry != driver + n_ents; entry++) {
>> >> -             ret = driver_check_compatible(blob, offset, entry->of_match);
>> >> +             ret = driver_check_compatible(blob, offset, entry->of_match,
>> >> +                                           &id);
>> >>               name = fdt_get_name(blob, offset, NULL);
>> >>               if (ret == -ENOENT) {
>> >>                       continue;
>> >> @@ -147,6 +153,7 @@ int lists_bind_fdt(struct udevice *parent, const void *blob, int offset,
>> >>                       dm_warn("Error binding driver '%s'\n", entry->name);
>> >>                       return ret;
>> >>               } else {
>> >> +                     dev->of_id = id;
>> >
>> >
>> > Instead of all the chages above, only one line change,
>> >
>> >                         dev->of_id = entry->of_match
>> >
>> >
>> >
>> > Does this work for you?
>> >
>> >
>>
>> entry->of_match is the first element in an array of records. I want to
>> know exactly which one matches, so I can't just use the first one.
>>
>
>
> Sorry, it was my misunderstanding.
> Thanks for explaining this.
>
>
>
> Could you update the comment block of driver_check_compatible?

OK

>
>
>
> /**
>  * driver_check_compatible() - Check if a driver is compatible with this node
>  *
>  * @param blob:         Device tree pointer
>  * @param offset:       Offset of node in device tree
>  * @param of_matchL     List of compatible strings to match
>  * @return 0 if there is a match, -ENOENT if no match, -ENODEV if the node
>  * does not have a compatible string, other error <0 if there is a device
>  * tree error
>  */
>
>
>   - Add description of "@param of_idp"
>   - Fix  "of_matchL"  -> "of_match"

Will fix.

Regards,
Simon


More information about the U-Boot mailing list