All of lore.kernel.org
 help / color / mirror / Atom feed
From: Simon Glass <sjg@chromium.org>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2 08/12] dm: stdio: Allow lazy probing of video devices
Date: Wed,  5 Oct 2016 20:42:16 -0600	[thread overview]
Message-ID: <1475721740-15124-9-git-send-email-sjg@chromium.org> (raw)
In-Reply-To: <1475721740-15124-1-git-send-email-sjg@chromium.org>

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

Changes in v2:
- Add comment as to why we need #ifndef CONFIG_SYS_CONSOLE_IS_IN_ENV
- Add comment as to why we check for "," in stdio_get_by_name()

 common/stdio.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 83 insertions(+), 4 deletions(-)

diff --git a/common/stdio.c b/common/stdio.c
index f99cfe7..ab9b05d 100644
--- a/common/stdio.c
+++ b/common/stdio.c
@@ -121,19 +121,87 @@ 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 at 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
+	/*
+	 * We did not find a suitable stdio device. If there is a video
+	 * driver with a name starting with 'vidconsole', we can try probing
+	 * that in the hope that it will produce the required stdio device.
+	 *
+	 * This function is sometimes called with the entire value of
+	 * 'stdout', which may include a list of devices separate by commas.
+	 * Obviously this is not going to work, so we ignore that case. The
+	 * call path in that case is console_init_r() -> search_device() ->
+	 * stdio_get_by_name().
+	 */
+	if (!strncmp(name, "vidconsole", 10) && !strchr(name, ',') &&
+	    !stdio_probe_device(name, UCLASS_VIDEO, &sdev))
+		return sdev;
+#endif
 
 	return NULL;
 }
@@ -282,6 +350,16 @@ int stdio_add_devices(void)
 #endif
 #endif
 #ifdef CONFIG_DM_VIDEO
+	/*
+	 * If the console setting is not in environment variables then
+	 * console_init_r() will not be calling iomux_doenv() (which calls
+	 * search_device()). So we will not dynamically add devices by
+	 * calling stdio_probe_device().
+	 *
+	 * So just probe all video devices now so that whichever one is
+	 * required will be available.
+	 */
+#ifndef CONFIG_SYS_CONSOLE_IS_IN_ENV
 	struct udevice *vdev;
 # ifndef CONFIG_DM_KEYBOARD
 	int ret;
@@ -293,6 +371,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 ();
-- 
2.8.0.rc3.226.g39d4020

  parent reply	other threads:[~2016-10-06  2:42 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-06  2:42 [U-Boot] [PATCH v2 00/12] dm: x86: Improve vesa driver-model support Simon Glass
2016-10-06  2:42 ` [U-Boot] [PATCH v2 01/12] Revert "x86: broadwell: gpio: Remove the codes to set up pin control" Simon Glass
2016-10-08  4:23   ` Bin Meng
2016-10-06  2:42 ` [U-Boot] [PATCH v2 02/12] x86: Add an accelerated memmove() function Simon Glass
2016-10-08  2:25   ` Bin Meng
2016-10-08  4:23     ` Bin Meng
2016-10-08  5:53     ` Bin Meng
2016-10-10  2:05       ` Bin Meng
2016-10-13  0:03         ` Simon Glass
2016-10-06  2:42 ` [U-Boot] [PATCH v2 03/12] Fix return value in trailing_strtoln() Simon Glass
2016-10-08  4:23   ` Bin Meng
2016-10-06  2:42 ` [U-Boot] [PATCH v2 04/12] list: Add list_last_entry() to find the last entry Simon Glass
2016-10-08  4:23   ` Bin Meng
2016-10-06  2:42 ` [U-Boot] [PATCH v2 05/12] dm: core: Add a function to get a uclass name Simon Glass
2016-10-08  4:23   ` Bin Meng
2016-10-06  2:42 ` [U-Boot] [PATCH v2 06/12] x86: video: Fix typo in broadwell Kconfig Simon Glass
2016-10-08  4:23   ` Bin Meng
2016-10-06  2:42 ` [U-Boot] [PATCH v2 07/12] dm: x86: video: Add a driver-model driver for ivybridge graphics Simon Glass
2016-10-08  2:33   ` Bin Meng
2016-10-08  4:23     ` Bin Meng
2016-10-06  2:42 ` Simon Glass [this message]
2016-10-08  2:32   ` [U-Boot] [PATCH v2 08/12] dm: stdio: Allow lazy probing of video devices Bin Meng
2016-10-08  4:23     ` Bin Meng
2016-10-06  2:42 ` [U-Boot] [PATCH v2 09/12] dm: video: Add driver-model support to vesa graphics Simon Glass
2016-10-08  4:24   ` Bin Meng
2016-10-06  2:42 ` [U-Boot] [PATCH v2 10/12] x86: Adjust config to support DM_VIDEO Simon Glass
2016-10-08  4:24   ` Bin Meng
2016-10-06  2:42 ` [U-Boot] [PATCH v2 11/12] dm: x86: Move samus to use new driver model support Simon Glass
2016-10-08  4:24   ` Bin Meng
2016-10-06  2:42 ` [U-Boot] [PATCH v2 12/12] dm: x86: Move link to use driver model for video Simon Glass
2016-10-08  4:24   ` Bin Meng

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1475721740-15124-9-git-send-email-sjg@chromium.org \
    --to=sjg@chromium.org \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.