]> git.sur5r.net Git - u-boot/commitdiff
dm: Improve handling of a missing uclass
authorSimon Glass <sjg@chromium.org>
Sun, 30 Aug 2015 22:55:16 +0000 (16:55 -0600)
committerSimon Glass <sjg@chromium.org>
Thu, 3 Sep 2015 03:28:23 +0000 (21:28 -0600)
When a uclass definition is missing, no drivers in that uclass can operate.
This can happen if a board has a strange collection of options (e.g. the
driver is enabled but the uclass is not).

Unfortunately this is very confusing at present. Starting up driver model
results in a -ENOENT error, which is pretty generic. Quite a big of digging
is needed to get to the root cause.

To help with this, change the error to a very strange one with no other
users in U-Boot. Also add a debug message.

Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/core/device.c
drivers/core/uclass.c

index a6cd93698f5df210fa5d1d3f5e11f0bef22d5e05..0ccd443f252e0bbb75425685d33b2f07fcbab84d 100644 (file)
@@ -39,8 +39,10 @@ int device_bind(struct udevice *parent, const struct driver *drv,
                return -EINVAL;
 
        ret = uclass_get(drv->id, &uc);
-       if (ret)
+       if (ret) {
+               debug("Missing uclass for driver %s\n", drv->name);
                return ret;
+       }
 
        dev = calloc(1, sizeof(struct udevice));
        if (!dev)
index f63ff599a69bac8ded6f48ab15acfbf12eae5f54..e800c28653f6170c62d9e1aeb23da1ced4ebea7a 100644 (file)
@@ -58,7 +58,12 @@ static int uclass_add(enum uclass_id id, struct uclass **ucp)
        if (!uc_drv) {
                debug("Cannot find uclass for id %d: please add the UCLASS_DRIVER() declaration for this UCLASS_... id\n",
                      id);
-               return -ENOENT;
+               /*
+                * Use a strange error to make this case easier to find. When
+                * a uclass is not available it can prevent driver model from
+                * starting up and this failure is otherwise hard to debug.
+                */
+               return -EPFNOSUPPORT;
        }
        uc = calloc(1, sizeof(*uc));
        if (!uc)