diff mbox series

[U-Boot] usb: kbd: Don't fail with iomux

Message ID 20170927011939.6610-1-robdclark@gmail.com
State Deferred
Delegated to: Tom Rini
Headers show
Series [U-Boot] usb: kbd: Don't fail with iomux | expand

Commit Message

Rob Clark Sept. 27, 2017, 1:19 a.m. UTC
stdin might not be set, which would cause iomux_doenv() to fail
therefore causing probe_usb_keyboard() to fail.  Furthermore if we do
have iomux enabled, the sensible thing (in terms of user experience)
would be to simply add ourselves to the list of stdin devices.

This fixes an issue with usbkbd on dragonboard410c with distro-
bootcmd, where stdin is not set (so stdinname is null).

Signed-off-by: Rob Clark <robdclark@gmail.com>
---
Somehow this patch was dropped on the floor.  I don't remember
which version # this is up to, search the list if you care.  But
this is the latest.  I only noticed it was missing because u-boot
crashes when you boot with usb-keyboard plugged in (at least on
db410c) without it.  So someone please apply this patch before it
gets lost again.

 common/usb_kbd.c  | 46 +++++++++++++++++++++++++++++++---------------
 include/console.h |  2 --
 2 files changed, 31 insertions(+), 17 deletions(-)

Comments

Peter Robinson Oct. 5, 2017, 8:38 a.m. UTC | #1
On Wed, Sep 27, 2017 at 2:19 AM, Rob Clark <robdclark@gmail.com> wrote:
> stdin might not be set, which would cause iomux_doenv() to fail
> therefore causing probe_usb_keyboard() to fail.  Furthermore if we do
> have iomux enabled, the sensible thing (in terms of user experience)
> would be to simply add ourselves to the list of stdin devices.
>
> This fixes an issue with usbkbd on dragonboard410c with distro-
> bootcmd, where stdin is not set (so stdinname is null).
>
> Signed-off-by: Rob Clark <robdclark@gmail.com>
Tested-by: Peter Robinson <pbrobinson@gmail.com>

Tested on RPi3 and a couple of other devices.

> ---
> Somehow this patch was dropped on the floor.  I don't remember
> which version # this is up to, search the list if you care.  But
> this is the latest.  I only noticed it was missing because u-boot
> crashes when you boot with usb-keyboard plugged in (at least on
> db410c) without it.  So someone please apply this patch before it
> gets lost again.
>
>  common/usb_kbd.c  | 46 +++++++++++++++++++++++++++++++---------------
>  include/console.h |  2 --
>  2 files changed, 31 insertions(+), 17 deletions(-)
>
> diff --git a/common/usb_kbd.c b/common/usb_kbd.c
> index a323d72a36..4c3ad95fca 100644
> --- a/common/usb_kbd.c
> +++ b/common/usb_kbd.c
> @@ -516,23 +516,39 @@ static int probe_usb_keyboard(struct usb_device *dev)
>                 return error;
>
>         stdinname = env_get("stdin");
> -#if CONFIG_IS_ENABLED(CONSOLE_MUX)
> -       error = iomux_doenv(stdin, stdinname);
> -       if (error)
> -               return error;
> -#else
> -       /* Check if this is the standard input device. */
> -       if (strcmp(stdinname, DEVNAME))
> -               return 1;
> +       if (CONFIG_IS_ENABLED(CONSOLE_MUX)) {
> +               char *devname = DEVNAME;
> +               char *newstdin = NULL;
> +               /*
> +                * stdin might not be set yet.. either way, with console-
> +                * mux the sensible thing to do is add ourselves to the
> +                * list of stdio devices:
> +                */
> +               if (stdinname && !strstr(stdinname, DEVNAME)) {
> +                       newstdin = malloc(strlen(stdinname) +
> +                                       strlen(","DEVNAME) + 1);
> +                       sprintf(newstdin, "%s,"DEVNAME, stdinname);
> +                       stdinname = newstdin;
> +               } else if (!stdinname) {
> +                       stdinname = devname;
> +               }
> +               error = iomux_doenv(stdin, stdinname);
> +               free(newstdin);
> +               if (error)
> +                       return error;
> +       } else {
> +               /* Check if this is the standard input device. */
> +               if (strcmp(stdinname, DEVNAME))
> +                       return 1;
>
> -       /* Reassign the console */
> -       if (overwrite_console())
> -               return 1;
> +               /* Reassign the console */
> +               if (overwrite_console())
> +                       return 1;
>
> -       error = console_assign(stdin, DEVNAME);
> -       if (error)
> -               return error;
> -#endif
> +               error = console_assign(stdin, DEVNAME);
> +               if (error)
> +                       return error;
> +       }
>
>         return 0;
>  }
> diff --git a/include/console.h b/include/console.h
> index cea29ed6dc..7dfd36d7d1 100644
> --- a/include/console.h
> +++ b/include/console.h
> @@ -57,8 +57,6 @@ int console_announce_r(void);
>  /*
>   * CONSOLE multiplexing.
>   */
> -#ifdef CONFIG_CONSOLE_MUX
>  #include <iomux.h>
> -#endif
>
>  #endif
> --
> 2.13.5
>
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> https://lists.denx.de/listinfo/u-boot
Bin Meng Oct. 5, 2017, 12:06 p.m. UTC | #2
On Wed, Sep 27, 2017 at 9:19 AM, Rob Clark <robdclark@gmail.com> wrote:
> stdin might not be set, which would cause iomux_doenv() to fail
> therefore causing probe_usb_keyboard() to fail.  Furthermore if we do
> have iomux enabled, the sensible thing (in terms of user experience)
> would be to simply add ourselves to the list of stdin devices.
>
> This fixes an issue with usbkbd on dragonboard410c with distro-
> bootcmd, where stdin is not set (so stdinname is null).
>
> Signed-off-by: Rob Clark <robdclark@gmail.com>
> ---
> Somehow this patch was dropped on the floor.  I don't remember
> which version # this is up to, search the list if you care.  But
> this is the latest.  I only noticed it was missing because u-boot
> crashes when you boot with usb-keyboard plugged in (at least on
> db410c) without it.  So someone please apply this patch before it
> gets lost again.
>
>  common/usb_kbd.c  | 46 +++++++++++++++++++++++++++++++---------------
>  include/console.h |  2 --
>  2 files changed, 31 insertions(+), 17 deletions(-)
>

Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Simon Glass Oct. 9, 2017, 4:45 a.m. UTC | #3
+Tom

On 26 September 2017 at 19:19, Rob Clark <robdclark@gmail.com> wrote:
> stdin might not be set, which would cause iomux_doenv() to fail
> therefore causing probe_usb_keyboard() to fail.  Furthermore if we do
> have iomux enabled, the sensible thing (in terms of user experience)
> would be to simply add ourselves to the list of stdin devices.
>
> This fixes an issue with usbkbd on dragonboard410c with distro-
> bootcmd, where stdin is not set (so stdinname is null).
>
> Signed-off-by: Rob Clark <robdclark@gmail.com>
> ---
> Somehow this patch was dropped on the floor.  I don't remember
> which version # this is up to, search the list if you care.  But
> this is the latest.  I only noticed it was missing because u-boot
> crashes when you boot with usb-keyboard plugged in (at least on
> db410c) without it.  So someone please apply this patch before it
> gets lost again.
>
>  common/usb_kbd.c  | 46 +++++++++++++++++++++++++++++++---------------
>  include/console.h |  2 --
>  2 files changed, 31 insertions(+), 17 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>
diff mbox series

Patch

diff --git a/common/usb_kbd.c b/common/usb_kbd.c
index a323d72a36..4c3ad95fca 100644
--- a/common/usb_kbd.c
+++ b/common/usb_kbd.c
@@ -516,23 +516,39 @@  static int probe_usb_keyboard(struct usb_device *dev)
 		return error;
 
 	stdinname = env_get("stdin");
-#if CONFIG_IS_ENABLED(CONSOLE_MUX)
-	error = iomux_doenv(stdin, stdinname);
-	if (error)
-		return error;
-#else
-	/* Check if this is the standard input device. */
-	if (strcmp(stdinname, DEVNAME))
-		return 1;
+	if (CONFIG_IS_ENABLED(CONSOLE_MUX)) {
+		char *devname = DEVNAME;
+		char *newstdin = NULL;
+		/*
+		 * stdin might not be set yet.. either way, with console-
+		 * mux the sensible thing to do is add ourselves to the
+		 * list of stdio devices:
+		 */
+		if (stdinname && !strstr(stdinname, DEVNAME)) {
+			newstdin = malloc(strlen(stdinname) +
+					strlen(","DEVNAME) + 1);
+			sprintf(newstdin, "%s,"DEVNAME, stdinname);
+			stdinname = newstdin;
+		} else if (!stdinname) {
+			stdinname = devname;
+		}
+		error = iomux_doenv(stdin, stdinname);
+		free(newstdin);
+		if (error)
+			return error;
+	} else {
+		/* Check if this is the standard input device. */
+		if (strcmp(stdinname, DEVNAME))
+			return 1;
 
-	/* Reassign the console */
-	if (overwrite_console())
-		return 1;
+		/* Reassign the console */
+		if (overwrite_console())
+			return 1;
 
-	error = console_assign(stdin, DEVNAME);
-	if (error)
-		return error;
-#endif
+		error = console_assign(stdin, DEVNAME);
+		if (error)
+			return error;
+	}
 
 	return 0;
 }
diff --git a/include/console.h b/include/console.h
index cea29ed6dc..7dfd36d7d1 100644
--- a/include/console.h
+++ b/include/console.h
@@ -57,8 +57,6 @@  int console_announce_r(void);
 /*
  * CONSOLE multiplexing.
  */
-#ifdef CONFIG_CONSOLE_MUX
 #include <iomux.h>
-#endif
 
 #endif