Hi,
On 29-09-18 16:26, Yu Wang wrote:
The USB PHY mux switch depend on both USB2/USB3 PHY state and xHCI/xDCI
controller state. The role can't be switched if related states haven't
satisfied. That is why we need to poll the DUAL_ROLE_CFG1 to check if
the role switched successful or not.
So the SW_IDPIN and SW_VBUS_VALID bits can't determine the current
acting role.
This patch changes the logic for getting role logic.
I guess this matches up with the recent patches to change the
role-switching on non Cherry Trail devices to use the DRD_CONFIG bits
instead of the SW_IDPIN bit?
AFAIK under normal circumstances with our current code,
DUAL_ROLE_CFG1 will always follow SW_IDPIN, so I'm not entirly sure
what you are trying to fix here?
IOW what problem are you seeing without this patch and how does
this fix it ?
If this is related to the patch to use the DRD_CONFIG bits on
non Cherry Trail devices, then please first submit a new version
of the patch for that which leaves the functionality on CHT
devices as is (as discussed before).
Regards,
Hans
Signed-off-by: Yu Wang <yu1.w...@intel.com>
---
drivers/usb/roles/intel-xhci-usb-role-switch.c | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/drivers/usb/roles/intel-xhci-usb-role-switch.c
b/drivers/usb/roles/intel-xhci-usb-role-switch.c
index 1fb3dd0..c118c9a 100644
--- a/drivers/usb/roles/intel-xhci-usb-role-switch.c
+++ b/drivers/usb/roles/intel-xhci-usb-role-switch.c
@@ -110,14 +110,18 @@ static enum usb_role intel_xhci_usb_get_role(struct
device *dev)
pm_runtime_get_sync(dev);
val = readl(data->base + DUAL_ROLE_CFG0);
- pm_runtime_put(dev);
- if (!(val & SW_IDPIN))
- role = USB_ROLE_HOST;
- else if (val & SW_VBUS_VALID)
- role = USB_ROLE_DEVICE;
- else
+ if ((val & SW_IDPIN) && !(val & SW_VBUS_VALID))
role = USB_ROLE_NONE;
+ else {
+ val = readl(data->base + DUAL_ROLE_CFG1);
+ if (val & HOST_MODE)
+ role = USB_ROLE_HOST;
+ else
+ role = USB_ROLE_DEVICE;
+ }
+
+ pm_runtime_put(dev);
return role;
}