[U-Boot] [PATCH v5 06/16] dm: Add README for driver model
Marek Vasut
marex at denx.de
Wed Oct 23 04:56:45 CEST 2013
Dear Simon Glass,
[...]
> +What is going on?
> +-----------------
> +
> +Let's start at the top. The demo command is in common/cmd_demo.c. It does
> +the usual command procesing and then:
> +
> + struct device *demo_dev;
> +
> + ret = uclass_get_device(UCLASS_DEMO, &demo_dev);
Which device will this assign into demo_dev if there are multiple devices
registered with the demo uclass ?
> +UCLASS_DEMO means the class of devices which implement 'demo'. Other
> +classes might be MMC, or GPIO, hashing or serial. The idea is that the
> +devices in the class all share a particular way of working. The class
> +presents a unified view of all these devices to U-Boot.
[...]
> +Declaring Drivers
> +-----------------
> +
> +A driver declaration looks something like this (see
> +drivers/demo/demo-shape.c):
> +
> +static const struct demo_ops simple_ops = {
> + .hello = shape_hello,
> + .status = shape_status,
> +};
> +
> +U_BOOT_DRIVER(demo_shape_drv) = {
> + .name = "demo_shape_drv",
> + .id = UCLASS_DEMO,
> + .ops = &simple_ops,
> + .priv_data_size = sizeof(struct shape_data),
> +};
We are not discussing relocation here yet, right ?
> +This driver has two methods (hello and status) and requires a bit
> +of private data (accessible through dev->priv once the driver has
> +been probed). It is a member of UCLASS_DEMO so will register itself
> +there.
> +
> +In U_BOOT_DRIVER it is also possible to specify special methods for probe,
> +and bind, and these are called at appropriate times. For many drivers
> +it is hoped that only 'probe' and 'remove' will be needed.
> +
> +The U_BOOT_DRIVER macro creates a data structure accessible from C,
> +so driver model can find the drivers that are available.
> +
> +
> +Platform Data
> +-------------
> +
> +Where does the platform data come from? See demo-pdata.c which
> +sets up a table of driver names and their associated platform data.
> +The data can be interpreted by the drivers however they like - it is
> +basically a communication scheme between the board-specific code and
> +the generic drivers, which are intended to work on any board.
> +
> +Drivers can acceess their data via dev->info->platform_data. Here is
> +the declaration for the platform data, which would normally appear
> +in the board file.
> +
> + static const struct dm_demo_cdata red_square = {
> + .colour = "red",
> + .sides = 4.
> + };
> + static const struct driver_info info[] = {
> + {
> + .name = "demo_shape_drv",
> + .platform_data = &red_square,
> + },
> + };
> +
> + demo1 = driver_bind(root, &info[0]);
We need dev_get_platdata() call or something, otherwise someone will shoot
himself in the face with a NULL pointer.
> +Device Tree
> +-----------
> +
> +While platform_data is useful, a more flexible way of providing device
> data is +by using device tree. With device tree we replace the above code
> with the +following device treefragment:
> +
> + red-square {
> + compatible = "demo-shape";
> + colour = "red";
> + sides = <4>;
> + };
> +
> +
> +The easiest way to make this work it to add a platform_data_size member to
> +the driver:
> +
> + .platform_data_auto_alloc_size = sizeof(struct dm_test_pdata),
> +
> +This will be allocated and zeroed before the driver's probe method is
> called. +The driver can then read the information out of the device tree
> and put it +in dev->priv, typically using a ..._parse_dt() function.
Can the driver maybe implement some ofdata_to_pdata() callback?
> +Declaring Uclasses
> +------------------
> +
> +The demo uclass is declared like this:
> +
> +U_BOOT_CLASS(demo) = {
> + .id = UCLASS_DEMO,
> +};
> +
> +It is also possible to specify special methods for probe, etc. The uclass
> +numbering comes from include/dm/uclass.h. To add a new uclass, add to the
> +end of the enum there, then declare your uclass as above.
I wonder if we cannot even automate the numbering here ;-)
[...]
More information about the U-Boot
mailing list