MLK-16221-4 usb: cdns3: gadget: disable device mode when the gadget is stopped
authorPeter Chen <peter.chen@nxp.com>
Mon, 21 Aug 2017 07:04:58 +0000 (15:04 +0800)
committerNitin Garg <nitin.garg@nxp.com>
Mon, 19 Mar 2018 20:38:26 +0000 (15:38 -0500)
After USB_CONF.DEVDS is set, the device mode will be disabled, and the
host will set the disconnection, this bit is just like DP pullup bit
at USB2.

And we add disable/enable device mode logic at .pullup function for
UDC core.

Signed-off-by: Peter Chen <peter.chen@nxp.com>
drivers/usb/cdns3/dev-regs-macro.h
drivers/usb/cdns3/gadget.c

index e87e053..477de38 100644 (file)
@@ -25,6 +25,7 @@
 #define USB_CONF__CFGSET__MASK                                      0x00000002U
 #define USB_CONF__USB3DIS__MASK                                     0x00000008U
 #define USB_CONF__DEVEN__MASK                                       0x00004000U
+#define USB_CONF__DEVDS__MASK                                       0x00008000U
 #define USB_CONF__L1EN__MASK                                        0x00010000U
 #define USB_CONF__L1DS__MASK                                        0x00020000U
 #define USB_CONF__CLK2OFFDS__MASK                                   0x00080000U
index 955ba9c..3e8459a 100644 (file)
@@ -1756,7 +1756,18 @@ static int usb_ss_gadget_pullup(struct usb_gadget *gadget, int is_on)
 {
        struct usb_ss_dev *usb_ss = gadget_to_usb_ss(gadget);
 
+       if (!usb_ss->start_gadget)
+               return 0;
+
        dev_dbg(&usb_ss->dev, "usb_ss_gadget_pullup: %d\n", is_on);
+
+       if (is_on)
+               gadget_writel(usb_ss, &usb_ss->regs->usb_conf,
+                               USB_CONF__DEVEN__MASK);
+       else
+               gadget_writel(usb_ss, &usb_ss->regs->usb_conf,
+                               USB_CONF__DEVDS__MASK);
+
        return 0;
 }
 
@@ -1861,6 +1872,7 @@ static int usb_ss_gadget_udc_stop(struct usb_gadget *gadget)
                goto quit;
        /* disable interrupt for device */
        gadget_writel(usb_ss, &usb_ss->regs->usb_ien, 0);
+       gadget_writel(usb_ss, &usb_ss->regs->usb_conf, USB_CONF__DEVDS__MASK);
        spin_unlock_irqrestore(&usb_ss->lock, flags);
 
        for (i = 0; i < usb_ss->ep_nums ; i++)
@@ -2192,6 +2204,7 @@ static void cdns3_gadget_stop(struct cdns3 *cdns)
 
        /* disable interrupt for device */
        gadget_writel(usb_ss, &usb_ss->regs->usb_ien, 0);
+       gadget_writel(usb_ss, &usb_ss->regs->usb_conf, USB_CONF__DEVDS__MASK);
        usb_ss->start_gadget = 0;
        spin_unlock_irqrestore(&usb_ss->lock, flags);
 }