[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20191028215919.83697-10-john.stultz@linaro.org>
Date: Mon, 28 Oct 2019 21:59:19 +0000
From: John Stultz <john.stultz@...aro.org>
To: lkml <linux-kernel@...r.kernel.org>
Cc: John Stultz <john.stultz@...aro.org>,
Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
Rob Herring <robh+dt@...nel.org>,
Mark Rutland <mark.rutland@....com>,
ShuFan Lee <shufan_lee@...htek.com>,
Heikki Krogerus <heikki.krogerus@...ux.intel.com>,
Suzuki K Poulose <suzuki.poulose@....com>,
Chunfeng Yun <chunfeng.yun@...iatek.com>,
Yu Chen <chenyu56@...wei.com>, Felipe Balbi <balbi@...nel.org>,
Hans de Goede <hdegoede@...hat.com>,
Andy Shevchenko <andy.shevchenko@...il.com>,
Jun Li <lijun.kernel@...il.com>,
Valentin Schneider <valentin.schneider@....com>,
Jack Pham <jackp@...eaurora.org>, linux-usb@...r.kernel.org,
devicetree@...r.kernel.org
Subject: [PATCH v4 9/9] usb: dwc3: Add host-mode as default support
Support configuring the default role the controller assumes as
host mode when the usb role is USB_ROLE_NONE
This patch was split out from a larger patch originally by
Yu Chen <chenyu56@...wei.com>
Cc: Greg Kroah-Hartman <gregkh@...uxfoundation.org>
Cc: Rob Herring <robh+dt@...nel.org>
Cc: Mark Rutland <mark.rutland@....com>
CC: ShuFan Lee <shufan_lee@...htek.com>
Cc: Heikki Krogerus <heikki.krogerus@...ux.intel.com>
Cc: Suzuki K Poulose <suzuki.poulose@....com>
Cc: Chunfeng Yun <chunfeng.yun@...iatek.com>
Cc: Yu Chen <chenyu56@...wei.com>
Cc: Felipe Balbi <balbi@...nel.org>
Cc: Hans de Goede <hdegoede@...hat.com>
Cc: Andy Shevchenko <andy.shevchenko@...il.com>
Cc: Jun Li <lijun.kernel@...il.com>
Cc: Valentin Schneider <valentin.schneider@....com>
Cc: Jack Pham <jackp@...eaurora.org>
Cc: linux-usb@...r.kernel.org
Cc: devicetree@...r.kernel.org
Signed-off-by: John Stultz <john.stultz@...aro.org>
---
v3: Split this patch out from addition of usb-role-switch
handling
---
drivers/usb/dwc3/core.h | 3 +++
drivers/usb/dwc3/drd.c | 20 ++++++++++++++++----
2 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index 6f19e9891767..3c879c9ab1aa 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -953,6 +953,8 @@ struct dwc3_scratchpad_array {
* - USBPHY_INTERFACE_MODE_UTMI
* - USBPHY_INTERFACE_MODE_UTMIW
* @role_sw: usb_role_switch handle
+ * @role_switch_default_mode: default operation mode of controller while
+ * usb role is USB_ROLE_NONE.
* @usb2_phy: pointer to USB2 PHY
* @usb3_phy: pointer to USB3 PHY
* @usb2_generic_phy: pointer to USB2 PHY
@@ -1087,6 +1089,7 @@ struct dwc3 {
struct notifier_block edev_nb;
enum usb_phy_interface hsphy_mode;
struct usb_role_switch *role_sw;
+ enum usb_dr_mode role_switch_default_mode;
u32 fladj;
u32 irq_gadget;
diff --git a/drivers/usb/dwc3/drd.c b/drivers/usb/dwc3/drd.c
index 61d4fd8aead4..0e3466fe5ac4 100644
--- a/drivers/usb/dwc3/drd.c
+++ b/drivers/usb/dwc3/drd.c
@@ -489,7 +489,10 @@ static int dwc3_usb_role_switch_set(struct device *dev, enum usb_role role)
mode = DWC3_GCTL_PRTCAP_DEVICE;
break;
default:
- mode = DWC3_GCTL_PRTCAP_DEVICE;
+ if (dwc->role_switch_default_mode == USB_DR_MODE_HOST)
+ mode = DWC3_GCTL_PRTCAP_HOST;
+ else
+ mode = DWC3_GCTL_PRTCAP_DEVICE;
break;
}
@@ -515,7 +518,10 @@ static enum usb_role dwc3_usb_role_switch_get(struct device *dev)
role = dwc->current_otg_role;
break;
default:
- role = USB_ROLE_DEVICE;
+ if (dwc->role_switch_default_mode == USB_DR_MODE_HOST)
+ role = USB_ROLE_HOST;
+ else
+ role = USB_ROLE_DEVICE;
break;
}
spin_unlock_irqrestore(&dwc->lock, flags);
@@ -534,8 +540,14 @@ int dwc3_drd_init(struct dwc3 *dwc)
struct usb_role_switch_desc dwc3_role_switch = {NULL};
u32 mode;
- mode = DWC3_GCTL_PRTCAP_DEVICE;
-
+ if (device_property_read_bool(dwc->dev,
+ "role-switch-default-host")) {
+ dwc->role_switch_default_mode = USB_DR_MODE_HOST;
+ mode = DWC3_GCTL_PRTCAP_HOST;
+ } else {
+ dwc->role_switch_default_mode = USB_DR_MODE_PERIPHERAL;
+ mode = DWC3_GCTL_PRTCAP_DEVICE;
+ }
dwc3_role_switch.fwnode = dev_fwnode(dwc->dev);
dwc3_role_switch.set = dwc3_usb_role_switch_set;
dwc3_role_switch.get = dwc3_usb_role_switch_get;
--
2.17.1
Powered by blists - more mailing lists