From: Alexander Graf Date: Mon, 29 Jan 2018 12:57:20 +0000 (+0100) Subject: serial: Make full device search optional X-Git-Url: http://git.dujemihanovic.xyz/html/index.html?a=commitdiff_plain;h=ae5326a6b34b34b1827edf2eee1a0e9e5363c5a2;p=u-boot.git serial: Make full device search optional Commit 608b0c4ad4e5ec0c ("serial: Use next serial device if probing fails") added code to search for more serial devices if the default one was not probed correctly. Unfortunately, that breaks omap3_evm. So while investigating why that is the case, let's disable the full search for everyone but bcm283x where it is needed. Fixes: 608b0c4ad4e5ec0c ("serial: Use next serial device if probing fails") Reported-by: Derald D. Woods Signed-off-by: Alexander Graf --- diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 30a6f6dc53..a423aa9629 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -550,6 +550,7 @@ config ARCH_BCM283X select DM_GPIO select OF_CONTROL select PL01X_SERIAL + select SERIAL_SEARCH_ALL imply FAT_WRITE config TARGET_VEXPRESS_CA15_TC2 diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index 3ffedba525..93e602e0ee 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig @@ -79,6 +79,18 @@ config SERIAL_RX_BUFFER_SIZE help The size of the RX buffer (needs to be power of 2) +config SERIAL_SEARCH_ALL + bool "Search for serial devices after default one failed" + depends on DM_SERIAL + help + The serial subsystem only searches for a single serial device + that was instantiated, but does not check whether it was probed + correctly. With this option set, we make successful probing + mandatory and search for fallback serial devices if the default + device does not work. + + If unsure, say N. + config SPL_DM_SERIAL bool "Enable Driver Model for serial drivers in SPL" depends on DM_SERIAL diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c index 68ca2d09d1..9891c20656 100644 --- a/drivers/serial/serial-uclass.c +++ b/drivers/serial/serial-uclass.c @@ -74,7 +74,9 @@ static void serial_find_console_or_panic(void) { const void *blob = gd->fdt_blob; struct udevice *dev; +#ifdef CONFIG_SERIAL_SEARCH_ALL int ret; +#endif if (CONFIG_IS_ENABLED(OF_PLATDATA)) { uclass_first_device(UCLASS_SERIAL, &dev); @@ -113,6 +115,8 @@ static void serial_find_console_or_panic(void) #else #define INDEX 0 #endif + +#ifdef CONFIG_SERIAL_SEARCH_ALL if (!uclass_get_device_by_seq(UCLASS_SERIAL, INDEX, &dev) || !uclass_get_device(UCLASS_SERIAL, INDEX, &dev)) { if (dev->flags & DM_FLAG_ACTIVATED) { @@ -131,6 +135,15 @@ static void serial_find_console_or_panic(void) return; } } +#else + if (!uclass_get_device_by_seq(UCLASS_SERIAL, INDEX, &dev) || + !uclass_get_device(UCLASS_SERIAL, INDEX, &dev) || + (!uclass_first_device(UCLASS_SERIAL, &dev) && dev)) { + gd->cur_serial_dev = dev; + return; + } +#endif + #undef INDEX }