]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/usb/gadget/langwell_udc.c
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / drivers / usb / gadget / langwell_udc.c
index b8ec954c06926a4c4a6e02d5ff7913f2315d35ba..1eca8b47ce3c366836240c1aa0c352ea9cfefb01 100644 (file)
@@ -2225,6 +2225,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__);
 
@@ -2313,6 +2314,28 @@ static void handle_setup_packet(struct langwell_udc *dev,
                                        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;
@@ -3063,7 +3086,7 @@ static void langwell_udc_remove(struct pci_dev *pdev)
 
        kfree(dev->ep);
 
-       /* diable IRQ handler */
+       /* disable IRQ handler */
        if (dev->got_irq)
                free_irq(pdev->irq, dev);
 
@@ -3383,7 +3406,7 @@ static int langwell_udc_suspend(struct pci_dev *pdev, pm_message_t state)
        /* disable interrupt and set controller to stop state */
        langwell_udc_stop(dev);
 
-       /* diable IRQ handler */
+       /* disable IRQ handler */
        if (dev->got_irq)
                free_irq(pdev->irq, dev);
        dev->got_irq = 0;