From af9c7c11e97ce99a8b8a0de99f91bde1b703377e Mon Sep 17 00:00:00 2001
From: Simon Glass <sjg@chromium.org>
Date: Sun, 8 Nov 2015 23:47:55 -0700
Subject: [PATCH] sandbox: usb: Allow finding a USB emulator for a device

Each USB device has an emulator. Currently this can only be found by
supplying the 'pipe' value, which contains the device number. Add a way
to find it directly from the emulated device.

Signed-off-by: Simon Glass <sjg@chromium.org>
---
 drivers/usb/emul/usb-emul-uclass.c | 17 +++++++++++++++--
 include/usb.h                      | 10 ++++++++++
 2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/emul/usb-emul-uclass.c b/drivers/usb/emul/usb-emul-uclass.c
index 205f2c54df..6b5f3c0af4 100644
--- a/drivers/usb/emul/usb-emul-uclass.c
+++ b/drivers/usb/emul/usb-emul-uclass.c
@@ -108,9 +108,8 @@ static int usb_emul_get_descriptor(struct usb_dev_platdata *plat, int value,
 	return upto ? upto : length ? -EIO : 0;
 }
 
-int usb_emul_find(struct udevice *bus, ulong pipe, struct udevice **emulp)
+static int usb_emul_find_devnum(int devnum, struct udevice **emulp)
 {
-	int devnum = usb_pipedevice(pipe);
 	struct udevice *dev;
 	struct uclass *uc;
 	int ret;
@@ -134,6 +133,20 @@ int usb_emul_find(struct udevice *bus, ulong pipe, struct udevice **emulp)
 	return -ENOENT;
 }
 
+int usb_emul_find(struct udevice *bus, ulong pipe, struct udevice **emulp)
+{
+	int devnum = usb_pipedevice(pipe);
+
+	return usb_emul_find_devnum(devnum, emulp);
+}
+
+int usb_emul_find_for_dev(struct udevice *dev, struct udevice **emulp)
+{
+	struct usb_dev_platdata *udev = dev_get_parent_platdata(dev);
+
+	return usb_emul_find_devnum(udev->devnum, emulp);
+}
+
 int usb_emul_control(struct udevice *emul, struct usb_device *udev,
 		     unsigned long pipe, void *buffer, int length,
 		     struct devrequest *setup)
diff --git a/include/usb.h b/include/usb.h
index a09c7f199a..d68453109a 100644
--- a/include/usb.h
+++ b/include/usb.h
@@ -949,6 +949,16 @@ int usb_emul_bulk(struct udevice *emul, struct usb_device *udev,
  */
 int usb_emul_find(struct udevice *bus, ulong pipe, struct udevice **emulp);
 
+/**
+ * usb_emul_find_for_dev() - Find an emulator for a particular device
+ *
+ * @bus:	USB bus (controller)
+ * @dev:	USB device to check
+ * @emulp:	Returns pointer to emulator, or NULL if not found
+ * @return 0 if found, -ve on error
+ */
+int usb_emul_find_for_dev(struct udevice *dev, struct udevice **emulp);
+
 /**
  * usb_emul_reset() - Reset all emulators ready for use
  *
-- 
2.39.5