[U-Boot] [PATCH v4] usb: kbd: don't fail with iomux
Bin Meng
bmeng.cn at gmail.com
Tue Aug 8 10:57:30 UTC 2017
Hi Rob,
On Tue, Aug 8, 2017 at 6:48 PM, Rob Clark <robdclark at gmail.com> wrote:
> On Tue, Aug 8, 2017 at 6:42 AM, Bin Meng <bmeng.cn at gmail.com> wrote:
>> Hi Rob,
>>
>> On Tue, Aug 8, 2017 at 3:51 AM, Rob Clark <robdclark at 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 at gmail.com>
>>> ---
>>> v2: address Bin's review comments
>>> v3: fix fail with free()ing if usbkbd is already in stdin env variable
>>> pointed out by Simon
>>> v4: use if (CONFIG_IS_ENABLED(CONSOLE_MUX)) { ... }
>>>
>>> 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 d2d29cc98f..8edeb6c4f5 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 = getenv("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);
>>
>> Sorry I should have asked this before: isn't free(devname) OK? In
>> previous version, it has a test logic to see whether free is needed.
>
> it was in the first version of my patch, until I added the &&!strstr()
> bit to avoid adding usbkbd a second time to stdin if stdin already
> contained usbkbd. Now we have a case where stdinname is the ptr
> returned from getenv() which we probably don't want to free() ;-)
>
Ah yes, I misread the codes. It's free(newstdin) not free(stdinname).
Thanks for the clarification.
Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
Regards,
Bin
More information about the U-Boot
mailing list