diff --git a/common/usb_kbd.c b/common/usb_kbd.c
index e02529fca4b1657ff109bf984d358d7cd085562a..24a1a5614118d2140ca5b225180a3ab2eadb18f9 100644
--- a/common/usb_kbd.c
+++ b/common/usb_kbd.c
@@ -8,6 +8,7 @@
  * SPDX-License-Identifier:	GPL-2.0+
  */
 #include <common.h>
+#include <dm.h>
 #include <errno.h>
 #include <malloc.h>
 #include <stdio_dev.h>
@@ -520,7 +521,37 @@ int drv_usb_kbd_init(void)
 {
 	int error, i;
 
-	debug("%s: Probing for keyboard\n", __func__);/* Scan all USB Devices */
+	debug("%s: Probing for keyboard\n", __func__);
+#ifdef CONFIG_DM_USB
+	/*
+	 * TODO: We should add USB_DEVICE() declarations to each USB ethernet
+	 * driver and then most of this file can be removed.
+	 */
+	struct udevice *bus;
+	struct uclass *uc;
+	int ret;
+
+	ret = uclass_get(UCLASS_USB, &uc);
+	if (ret)
+		return ret;
+	uclass_foreach_dev(bus, uc) {
+		for (i = 0; i < USB_MAX_DEVICE; i++) {
+			struct usb_device *dev;
+
+			dev = usb_get_dev_index(bus, i); /* get device */
+			debug("i=%d, %p\n", i, dev);
+			if (!dev)
+				break; /* no more devices available */
+
+			error = probe_usb_keyboard(dev);
+			if (!error)
+				return 1;
+			if (error && error != -ENOENT)
+				return error;
+		} /* for */
+	}
+#else
+	/* Scan all USB Devices */
 	for (i = 0; i < USB_MAX_DEVICE; i++) {
 		struct usb_device *dev;
 
@@ -538,6 +569,7 @@ int drv_usb_kbd_init(void)
 		if (error && error != -ENOENT)
 			return error;
 	}
+#endif
 
 	/* No USB Keyboard found */
 	return -1;