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

Masahiro Yamada
2014-11-19T08:25:52Z

Hi Simon,

On Tue, 11 Nov 2014 10:46:18 -0700
Simon Glass <sjg@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

> diff --git a/drivers/core/lists.c b/drivers/core/lists.c
> index 3a1ea85..9f33dde 100644
> --- a/drivers/core/lists.c
> +++ b/drivers/core/lists.c
> @@ -89,22 +89,26 @@ int lists_bind_drivers(struct udevice *parent, bool pre_reloc_only)
> * tree error
> */
> static int driver_check_compatible(const void *blob, int offset,
> - const struct udevice_id *of_match)
> + const struct udevice_id *of_match,
> + const struct udevice_id **of_idp)
> {
> int ret;
>
> + *of_idp = NULL;
> if (!of_match)
> return -ENOENT;
>
> while (of_match->compatible) {
> ret = fdt_node_check_compatible(blob, offset,
> of_match->compatible);
> - if (!ret)
> + if (!ret) {
> + *of_idp = of_match;
> return 0;
> - else if (ret == -FDT_ERR_NOTFOUND)
> + } else if (ret == -FDT_ERR_NOTFOUND) {
> return -ENODEV;
> - else if (ret < 0)
> + } else if (ret < 0) {
> return -EINVAL;
> + }
> of_match++;
> }

I think you are making things more complicated than is needed.
I guess what you want to do in this patch is just to set "dev->of_id".

Why do you need to touch this function? (Please see below)

> @@ -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?

Best Regards
Masahiro Yamada