[U-Boot] [PATCH v3 07/16] dm: Add base driver model support

Marek Vasut marex at denx.de
Fri Jun 28 22:53:12 CEST 2013


Dear Simon Glass,

> Add driver model functionality for generic board.
> 
> This includes data structures and base code for registering devices and
> uclasses (groups of devices with the same purpose, e.g. all I2C ports will
> be in the same uclass).
> 
> The feature is enabled with CONFIG_DM.
> 
> Signed-off-by: Simon Glass <sjg at chromium.org>
> Signed-off-by: Marek Vasut <marex at denx.de>
> Signed-off-by: Pavel Herrmann <morpheus.ibis at gmail.com>
> Signed-off-by: Viktor Křivák <viktor.krivak at gmail.com>
> Signed-off-by: Tomas Hlavacek <tmshlvck at gmail.com>
> ---
> Changes in v3:
> - Tidy up commenting of functions and structures
> - Rename per_device_priv_size to per_device_auto_alloc_size, etc.
> - Add a flag for tracking whether DM allocates/frees platform_data
> 
> Changes in v2: None
> 
>  Makefile                          |   2 +
>  common/dm/Makefile                |  43 +++++
>  common/dm/device.c                | 331
> ++++++++++++++++++++++++++++++++++++++ common/dm/lists.c                 |
> 168 +++++++++++++++++++
>  common/dm/root.c                  | 115 +++++++++++++
>  common/dm/uclass.c                | 298 ++++++++++++++++++++++++++++++++++
>  common/dm/util.c                  |  50 ++++++

Maybe we should move these into drivers/core like Linux has it ?

[...]

> +#include <common.h>
> +#include <malloc.h>
> +#include <dm/device.h>
> +#include <dm/device-internal.h>
> +#include <dm/lists.h>
> +#include <dm/platform_data.h>
> +#include <dm/uclass.h>
> +#include <dm/uclass-internal.h>
> +#include <dm/util.h>
> +#include <linux/err.h>
> +#include <linux/list.h>
> +
> +/**
> + * device_chld_unbind() - Unbind all device's children from the device
> + * @dev:	The device that is to be stripped of its children
> + * @return 0 on success, -ve on error
> + */
> +static int device_chld_unbind(struct device *dev)
> +{
> +	struct device *pos, *n;
> +	int ret;
> +
> +	assert(dev);
> +
> +	list_for_each_entry_safe(pos, n, &dev->child_head, sibling_node) {
> +		ret = device_unbind(pos);
> +		if (ret)
> +			return ret;
> +	}

This is used for stuff like destroying USB bus topology after running "usb 
rescan" for the second time, right? We might want to continue unbinding and only 
report the error instead of returning on the first error.

> +	return 0;
> +}
> +
> +/**
> + * device_chld_remove() - Stop all device's children
> + * @dev:	The device whose children are to be removed
> + * @return 0 on success, -ve on error
> + */
> +static int device_chld_remove(struct device *dev)
> +{
> +	struct device *pos, *n;
> +	int ret;
> +
> +	assert(dev);
> +
> +	list_for_each_entry_safe(pos, n, &dev->child_head, sibling_node) {
> +		ret = device_remove(pos);
> +		if (ret)
> +			return ret;
> +	}
> +
> +	return 0;
> +}

[...]

We might really want to document these.

> +int device_bind_by_name(struct device *parent, const struct driver_info
> *info, +			struct device **devp)

[...]

> +struct uclass *uclass_find(enum uclass_id key)
> +{
> +	struct uclass *uc;
> +
> +	/*
> +	 * TODO(sjg at chromium.org): Optimise this, perhaps moving the found
> +	 * node to the start of the list, or creating a linear array mapping
> +	 * id to node.
> +	 */

We better do this later, after it's all in place.

> +	list_for_each_entry(uc, &gd->uclass_root, sibling_node) {
> +		if (uc->uc_drv->id == key)
> +			return uc;
> +	}
> +
> +	return NULL;
> +}
> +
> +/**
> + * uclass_add() - Create new uclass in list
> + * @id: Id number to create
> + * @ucp: Returns pointer to uclass, or NULL on error
> + * @return 0 on success, -ve on error
> + *
> + * The new uclass is added to the list. There must be only one uclass for
> + * each id.
> + */
> +static int uclass_add(enum uclass_id id, struct uclass **ucp)
> +{

I might be a bit lost here. Do we now support adding uclass at runtime ?

Best regards,


More information about the U-Boot mailing list