
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,
name = fdt_get_name(blob, offset, NULL); if (ret == -ENOENT) { continue;&id);
@@ -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