
Hi Simon,
On Mon, Oct 3, 2016 at 11:12 AM, Simon Glass sjg@chromium.org wrote:
At present all video devices are probed on start-up. It would be better to probe a device only when it is needed. This can happen if it is referenced in the stdout environment variable, for example.
Add support for this by searching for a suitable device when needed, probing it, and finding the stdio device it creates.
Signed-off-by: Simon Glass sjg@chromium.org
common/stdio.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 4 deletions(-)
diff --git a/common/stdio.c b/common/stdio.c index f99cfe7..b58b3c7 100644 --- a/common/stdio.c +++ b/common/stdio.c @@ -121,19 +121,76 @@ struct list_head* stdio_get_list(void) return &(devs.list); }
+#ifdef CONFIG_DM_VIDEO +/**
- stdio_probe_device() - Find a device which provides the given stdio device
- This looks for a device of the given uclass which provides a particular
- stdio device. It is currently really only useful for UCLASS_VIDEO.
- Ultimately we want to be able to probe a device by its stdio name. At
- present devices register in their probe function (for video devices this
- is done in vidconsole_post_probe()) and we don't know what name they will
- use until they do so.
- TODO(sjg@chromium.org): We should be able to determine the name before
- probing, and probe the required device.
- @name: stdio device name (e.g. "vidconsole")
- id: Uclass ID of device to look for (e.g. UCLASS_VIDEO)
- @sdevp: Returns stdout device, if found, else NULL
- @return 0 if found, -ENOENT if no device found with that name, other -ve
on other error
- */
+static int stdio_probe_device(const char *name, enum uclass_id id,
struct stdio_dev **sdevp)
+{
struct stdio_dev *sdev;
struct udevice *dev;
int seq, ret;
*sdevp = NULL;
seq = trailing_strtoln(name, NULL);
if (seq == -1)
ret = uclass_first_device_err(id, &dev);
else
ret = uclass_get_device_by_seq(id, seq, &dev);
if (ret) {
debug("No %s device for seq %d (%s)\n", uclass_get_name(id),
seq, name);
return ret;
}
/* The device should be be the last one registered */
sdev = list_empty(&devs.list) ? NULL :
list_last_entry(&devs.list, struct stdio_dev, list);
if (!sdev || strcmp(sdev->name, name)) {
debug("Device '%s' did not register with stdio as '%s'\n",
dev->name, name);
return -ENOENT;
}
*sdevp = sdev;
return 0;
+} +#endif
struct stdio_dev* stdio_get_by_name(const char *name) { struct list_head *pos;
struct stdio_dev *dev;
struct stdio_dev *sdev; if(!name) return NULL; list_for_each(pos, &(devs.list)) {
dev = list_entry(pos, struct stdio_dev, list);
if(strcmp(dev->name, name) == 0)
return dev;
sdev = list_entry(pos, struct stdio_dev, list);
if (strcmp(sdev->name, name) == 0)
return sdev; }
+#ifdef CONFIG_DM_VIDEO
if (!strncmp(name, "vidconsole", 10) && !strchr(name, ',') &&
Why is strchr(name, ',') needed?
!stdio_probe_device(name, UCLASS_VIDEO, &sdev))
return sdev;
+#endif
return NULL;
} @@ -282,6 +339,7 @@ int stdio_add_devices(void) #endif #endif #ifdef CONFIG_DM_VIDEO +#ifndef CONFIG_SYS_CONSOLE_IS_IN_ENV
Wy adding CONFIG_SYS_CONSOLE_IS_IN_ENV check?
struct udevice *vdev;
# ifndef CONFIG_DM_KEYBOARD int ret; @@ -293,6 +351,7 @@ int stdio_add_devices(void) ; if (ret) printf("%s: Video device failed (ret=%d)\n", __func__, ret); +#endif /* !CONFIG_SYS_CONSOLE_IS_IN_ENV */ #else # if defined(CONFIG_LCD) drv_lcd_init (); --
Regards, Bin