aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Graf2018-01-25 12:05:42 +0100
committerTom Rini2018-01-28 12:27:33 -0500
commit608b0c4ad4e5ec0c5d2c60276f19c3651d3d3cab (patch)
tree6c48149de1ca4dc49ac5c051d693ebc902a461fc
parentb442e16b876f92af82768d6ec86fe71ecea01166 (diff)
serial: Use next serial device if probing fails
Currently our serial device search chokes on the fact that the serial probe function could fail. If it does, instead of searching for the next usable serial device, it just quits. This patch changes the fallback logic so that even when a serial device was not probed correctly, we just try the next ones until we find one that works. Signed-off-by: Alexander Graf <agraf@suse.de> Reviewed-by: Simon Glass <sjg@chromium.org>
-rw-r--r--drivers/serial/serial-uclass.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c
index 2e5116f7cee..68ca2d09d1b 100644
--- a/drivers/serial/serial-uclass.c
+++ b/drivers/serial/serial-uclass.c
@@ -74,6 +74,7 @@ static void serial_find_console_or_panic(void)
{
const void *blob = gd->fdt_blob;
struct udevice *dev;
+ int ret;
if (CONFIG_IS_ENABLED(OF_PLATDATA)) {
uclass_first_device(UCLASS_SERIAL, &dev);
@@ -104,8 +105,8 @@ static void serial_find_console_or_panic(void)
* from 1!).
*
* Failing that, get the device with sequence number 0, or in
- * extremis just the first serial device we can find. But we
- * insist on having a console (even if it is silent).
+ * extremis just the first working serial device we can find.
+ * But we insist on having a console (even if it is silent).
*/
#ifdef CONFIG_CONS_INDEX
#define INDEX (CONFIG_CONS_INDEX - 1)
@@ -113,10 +114,22 @@ static void serial_find_console_or_panic(void)
#define INDEX 0
#endif
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;
+ !uclass_get_device(UCLASS_SERIAL, INDEX, &dev)) {
+ if (dev->flags & DM_FLAG_ACTIVATED) {
+ gd->cur_serial_dev = dev;
+ return;
+ }
+ }
+
+ /* Search for any working device */
+ for (ret = uclass_first_device_check(UCLASS_SERIAL, &dev);
+ dev;
+ ret = uclass_next_device_check(&dev)) {
+ if (!ret) {
+ /* Device did succeed probing */
+ gd->cur_serial_dev = dev;
+ return;
+ }
}
#undef INDEX
}