The patch is already sent to upstream but not accepted yet.

This patch adds test mode support for Langwell gadget driver.

Signed-off-by: Henry Yuan <[email protected]>
Signed-off-by: Andy Luo <[email protected]>
---
 drivers/usb/gadget/langwell_udc.c |   23 +++++++++++++++++++++++
 include/linux/usb/ch9.h           |    9 +++++++++
 2 files changed, 32 insertions(+), 0 deletions(-)

diff --git a/drivers/usb/gadget/langwell_udc.c 
b/drivers/usb/gadget/langwell_udc.c
index 974f7e5..089d81e 100644
--- a/drivers/usb/gadget/langwell_udc.c
+++ b/drivers/usb/gadget/langwell_udc.c
@@ -2254,6 +2254,7 @@ static void handle_setup_packet(struct langwell_udc *dev,
        u16     wValue = le16_to_cpu(setup->wValue);
        u16     wIndex = le16_to_cpu(setup->wIndex);
        u16     wLength = le16_to_cpu(setup->wLength);
+       u32     portsc1;
 
        dev_vdbg(&dev->pdev->dev, "---> %s()\n", __func__);
 
@@ -2354,6 +2355,28 @@ static void handle_setup_packet(struct langwell_udc *dev,
                                dev->gadget.a_alt_hnp_support = 1;
                                dev->dev_status |= (1 << wValue);
                                break;
+                       case USB_DEVICE_TEST_MODE:
+                               dev_dbg(&dev->pdev->dev, "SETUP: TEST MODE\n");
+                               if ((wIndex & 0xff) ||
+                                       (dev->gadget.speed != USB_SPEED_HIGH))
+                                       ep0_stall(dev);
+
+                               switch (wIndex >> 8) {
+                               case TEST_J:
+                               case TEST_K:
+                               case TEST_SE0_NAK:
+                               case TEST_PACKET:
+                               case TEST_FORCE_EN:
+                                       if (prime_status_phase(dev, EP_DIR_IN))
+                                               ep0_stall(dev);
+                                       portsc1 = readl(&dev->op_regs->portsc1);
+                                       portsc1 |= (wIndex & 0xf00) << 8;
+                                       writel(portsc1, &dev->op_regs->portsc1);
+                                       goto end;
+                               default:
+                                       rc = -EOPNOTSUPP;
+                               }
+                               break;
                        default:
                                rc = -EOPNOTSUPP;
                                break;
diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h
index da2ed77..6f03fb1 100644
--- a/include/linux/usb/ch9.h
+++ b/include/linux/usb/ch9.h
@@ -125,6 +125,15 @@
 
 #define USB_ENDPOINT_HALT              0       /* IN/OUT will STALL */
 
+/*
+ * Test Mode Selectors
+ * See USB 2.0 spec Table 9-7
+ */
+#define        TEST_J          1
+#define        TEST_K          2
+#define        TEST_SE0_NAK    3
+#define        TEST_PACKET     4
+#define        TEST_FORCE_EN   5
 
 /**
  * struct usb_ctrlrequest - SETUP data for a USB device control request
-- 
1.7.2.3

_______________________________________________
MeeGo-kernel mailing list
[email protected]
http://lists.meego.com/listinfo/meego-kernel

Reply via email to