If CI_HDRC_DUAL_ROLE_NOT_OTG is specified do not use the OTGSC
registers.
Signed-off-by: Sanchayan Maity <[email protected]>
---
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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html