If CI_HDRC_DUAL_ROLE_NOT_OTG is specified do not use the OTGSC
registers.

Signed-off-by: Sanchayan Maity <maitysancha...@gmail.com>
---
 drivers/usb/chipidea/otg.c | 40 ++++++++++++++++++++++++++++++++++------
 1 file changed, 34 insertions(+), 6 deletions(-)

diff --git a/drivers/usb/chipidea/otg.c b/drivers/usb/chipidea/otg.c
index b02a80e..b09f3e0 100644
--- a/drivers/usb/chipidea/otg.c
+++ b/drivers/usb/chipidea/otg.c
@@ -49,7 +49,7 @@ u32 ci_read_otgsc(struct ci_hdrc *ci, u32 mask)
        u32 val = ci->fake_otgsc;
 
        cable_vbus = &ci->platdata->vbus_extcon;
-       cable_id = &ci->platdata->vbus_extcon;
+       cable_id = &ci->platdata->id_extcon;
        if (!IS_ERR(cable_vbus->edev) || !IS_ERR(cable_id->edev)) {
                if (!IS_ERR(cable_vbus->edev)) {
                        if (cable_vbus->changed)
@@ -78,6 +78,7 @@ u32 ci_read_otgsc(struct ci_hdrc *ci, u32 mask)
                        else
                                val &= ~OTGSC_ID;
                }
+               val |= (OTGSC_IDIE | OTGSC_BSVIE);
                return val;
        } else if (ci->is_otg) { /* read otgsc from register */
                return hw_read_otgsc(ci, mask);
@@ -129,23 +130,50 @@ enum ci_role ci_otg_role(struct ci_hdrc *ci)
 
 void ci_handle_vbus_change(struct ci_hdrc *ci)
 {
+       struct ci_hdrc_cable *vbus;
+
+       if (ci->platdata->flags & CI_HDRC_DUAL_ROLE_NOT_OTG) {
+               vbus = &ci->platdata->vbus_extcon;
+
+               if (!IS_ERR(vbus->edev)) {
+                       if (vbus->state)
+                               usb_gadget_vbus_connect(&ci->gadget);
+                       else
+                               usb_gadget_vbus_disconnect(&ci->gadget);
+               }
+       }
+
        if (ci->dp_always_pullup) {
                usb_gadget_vbus_connect(&ci->gadget);
                return;
        }
 
-       if (ci_read_otgsc(ci, OTGSC_BSV))
-               usb_gadget_vbus_connect(&ci->gadget);
-       else
-               usb_gadget_vbus_disconnect(&ci->gadget);
+       if (!(ci->platdata->flags & CI_HDRC_DUAL_ROLE_NOT_OTG)) {
+               if (ci_read_otgsc(ci, OTGSC_BSV))
+                       usb_gadget_vbus_connect(&ci->gadget);
+               else
+                       usb_gadget_vbus_disconnect(&ci->gadget);
+       }
 }
 
 #define CI_VBUS_STABLE_TIMEOUT_MS 5000
 static void ci_handle_id_switch(struct ci_hdrc *ci)
 {
        enum ci_role role = ci_otg_role(ci);
+       struct ci_hdrc_cable *id;
+
+       if (ci->platdata->flags & CI_HDRC_DUAL_ROLE_NOT_OTG) {
+               id = &ci->platdata->id_extcon;
 
-       if (role != ci->role) {
+               if (!IS_ERR(id->edev)) {
+                       ci_role_stop(ci);
+
+                       if (ci_role_start(ci, id->state ?
+                                         CI_ROLE_GADGET : CI_ROLE_HOST))
+                               dev_err(ci->dev, "Can't start %s role\n",
+                                       id->state ? "host" : "gadget");
+               }
+       } else if (role != ci->role) {
                dev_dbg(ci->dev, "switching from %s to %s\n",
                        ci_role(ci)->name, ci->roles[role]->name);
 
-- 
2.8.2

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to