[U-Boot] Many questions about U-Boot's Driver Model

Masahiro YAMADA yamada.m at jp.panasonic.com
Sat Sep 20 08:56:24 CEST 2014


Hi Simon,



2014-09-20 7:25 GMT+09:00 Simon Glass <sjg at chromium.org>:

> - the bind/unbind allows you to have devices which are known to the
> system, but not yet probed. This is important in a boot loader (e.g.
> we don't want to probe devices until they are actually needed, and
> some will never be probed during a boot), although not really
> necessary in an OS

Uh, this view was missing from my mind.
It is nice for faster boot.




> Platform data is bound to the driver to create an new device (instance
> of the driver, if you prefer). Linux has the same concept. See for
> example struct platform_device_info.
>
> Private data is used by that device to hold its information while it
> is active. Linux devices have this, normally in the ->p->driver_data
> member,. See dev_get_drvdata().

Now it is clearer.

In Linux, "platform" looks like a bus,
but in U-Boot it is implemented in the basic infrastructure
(and it seems reasonable enough)




>>
>> [4] What does "struct driver_info" stand for?
>
> It is the information used to bind platform data to a driver to
> produce a device. See Linux's struct platform_device which is similar
> (although in Linux the device is included in the structure).
>
>>
>> I cannot understand the following comment block at all.
>>
>> /**
>>  * struct driver_info - Information required to instantiate a device
>>  *
>>  * @name:       Device name
>>  * @platdata:   Driver-specific platform data
>>  */
>> struct driver_info {
>>         const char *name;
>>         const void *platdata;
>> };
>>
>>
>>
>> Does this structure give information of a driver or a device?
>
> driver + platform data = device


Sorry, I am still not convinced with this part.


In my mind, things happen in the following step:

[1] Every driver is instantiated by U_BOOT_DRIVER()
[2] Every device is instantiated by U_BOOT_DEVICE() (= struct driver_info)
[3] If the system finds a driver and a device with the same name, they are bound


[1] and [2] occur at the build time
[3] occurs at run time  (more exactly, when dm_init_and_scan()
function is called)


At the build time (i.e.  [3] hasn't happened yet), struct driver_info
is information belonging to a *device*.
(This is why I thought "struct driver_info" should be more likely
"struct device_info".)


After [3] happens, you are right, the device's information is attached
to the driver
and driver + platform data = device.
That's what "binding" is for.

Eventually, your explanation in pointing to the same one in my mind.
But there is a slight difference of a nuance.

In my understanding, "binding" is an action that couples a driver and
a device together
by finding the same name.   (In the device tree world, by finding
compatible ones)

Mixing up a driver and a device results in confusion.




>>
>> I am wordering if "struct driver_info" should have been named "struct device_info"?
>>
>
> Possibly, although that might be confusing also, since it is not
> really information about a device. The idea is that it is the info
> needed for a driver to instantiate a new device.

Indeed, it is information about a device.
because .platdata is an attribute of each *device*, right?


I am for statements:
  - It is "information of a device"
  - It is "information for a driver" to bind this device

I am against a statement:
  - It is "information of a driver"



>> I think comments and namings are confusing.
>>
>
> Well it looks like you have found some errors in the comments - we
> should get those fixed. If you have time, please send a patch!

I do not mind if it is a matter of accidental errors in comments. Send
a patch and fix them, that's it.
But I don't think so.

I suspect the struct driver_info is confusing enough and these errors
happened because of that.



-- 
Best Regards
Masahiro Yamada


More information about the U-Boot mailing list