]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
usb: gadget: tegra: fix schedule work for non-std charger
authorRohith Seelaboyina <rseelaboyina@nvidia.com>
Fri, 19 Jul 2013 10:43:29 +0000 (16:13 +0530)
committerDan Willemsen <dwillemsen@nvidia.com>
Sat, 14 Sep 2013 20:32:48 +0000 (13:32 -0700)
Work is scheduled to detect non-standard charger
whenever can_pullup is successful.

Bug 1316950

Change-Id: I8c8b7eb381d311273a77f039964601d5b2535bb2
Signed-off-by: Rohith Seelaboyina <rseelaboyina@nvidia.com>
Reviewed-on: http://git-master/r/251599
Reviewed-by: Rakesh Bodla <rbodla@nvidia.com>
Reviewed-by: Chao Xu <cxu@nvidia.com>
Reviewed-by: Automatic_Commit_Validation_User
drivers/usb/gadget/tegra_udc.c
drivers/usb/gadget/tegra_udc.h

index 804c6f137fbfb4ca6666e65fca9404d163845712..e5cacabd9864a159cb16b128ad126bd8edba56fa 100644 (file)
@@ -401,8 +401,12 @@ static void dr_controller_run(struct tegra_udc *udc)
        temp = udc_readl(udc, USB_CMD_REG_OFFSET);
        temp &= ~USB_CMD_ITC;
        temp |= USB_CMD_ITC_1_MICRO_FRM;
-       if (can_pullup(udc))
+       if (can_pullup(udc)) {
                temp |= USB_CMD_RUN_STOP;
+               if (udc->connect_type == CONNECT_TYPE_SDP)
+                       schedule_delayed_work(&udc->non_std_charger_work,
+                               msecs_to_jiffies(NON_STD_CHARGER_DET_TIME_MS));
+       }
        else
                temp &= ~USB_CMD_RUN_STOP;
        udc_writel(udc, temp, USB_CMD_REG_OFFSET);
@@ -1508,16 +1512,6 @@ static int tegra_vbus_session(struct usb_gadget *gadget, int is_active)
                if ((udc->connect_type == CONNECT_TYPE_SDP) ||
                    (udc->connect_type == CONNECT_TYPE_CDP))
                        dr_controller_run(udc);
-
-               /*
-                * We cannot tell difference between a SDP and non-standard
-                * charger (which has D+/D- line floating) based on line status.
-                * Schedule a 7sec delayed work and verify it is an
-                * non-standard charger if no setup packet is received.
-                */
-               if (udc->connect_type == CONNECT_TYPE_SDP)
-                       schedule_delayed_work(&udc->non_std_charger_work,
-                               msecs_to_jiffies(NON_STD_CHARGER_DET_TIME_MS));
        }
        mutex_unlock(&udc->sync_lock);
 
@@ -1566,9 +1560,21 @@ static int tegra_pullup(struct usb_gadget *gadget, int is_on)
        tmp = udc_readl(udc, USB_CMD_REG_OFFSET);
        tmp &= ~USB_CMD_ITC;
        tmp |= USB_CMD_ITC_1_MICRO_FRM;
-       if (can_pullup(udc))
+       if (can_pullup(udc)) {
                udc_writel(udc, tmp | USB_CMD_RUN_STOP, USB_CMD_REG_OFFSET);
-       else
+               /*
+                * We cannot tell difference between a SDP and non-standard
+                * charger (which has D+/D- line floating) based on line status
+                * at the time VBUS is detected.
+                *
+                * We can schedule a 4s delayed work and verify it is an
+                * non-standard charger if no setup packet is received after
+                * enumeration started.
+                */
+               if (udc->connect_type == CONNECT_TYPE_SDP)
+                       schedule_delayed_work(&udc->non_std_charger_work,
+                               msecs_to_jiffies(NON_STD_CHARGER_DET_TIME_MS));
+       } else
                udc_writel(udc, (tmp & ~USB_CMD_RUN_STOP), USB_CMD_REG_OFFSET);
 
        DBG("%s(%d) END\n", __func__, __LINE__);
index f8ea5031c6e58b70c93dc3c3e9771a857e0bb82b..8ecfee791c179ea976e1f23a8c6f4a456f8972a6 100644 (file)
@@ -44,8 +44,8 @@
 #define USB_CHARGING_NV_CHARGER_CURRENT_LIMIT_UA 2000000u
 #define USB_CHARGING_NON_STANDARD_CHARGER_CURRENT_LIMIT_UA 500000u
 
- /* 7 sec wait time for non-std charger detection after vbus is detected */
-#define NON_STD_CHARGER_DET_TIME_MS 7000
+ /* 1 sec wait time for non-std charger detection after vbus is detected */
+#define NON_STD_CHARGER_DET_TIME_MS 1000
 #define BOOST_TRIGGER_SIZE 4096
 
 #define UDC_RESET_TIMEOUT_MS 1000