Re: [PATCH v2 01/10] usb: cdns3: Add support for DRD CDNSP

2020-11-10 Thread Peter Chen
On 20-11-06 12:42:51, Pawel Laszczak wrote:
> - * Value of the strap pins.
> + * Value of the strap pins for:
> + * CDN3:

%/CDN3/CDNS3

Peter
>   * 000 - no default configuration
>   * 010 - Controller initiall configured as Host
>   * 100 - Controller initially configured as Device
> + * CDNSP:
> + * 000 - No default configuration.
> + * 010 - Controller initiall configured as Host.
> + * 100 - Controller initially configured as Device.
>   */
>  #define OTGSTS_STRAP(p)  (((p) & GENMASK(14, 12)) >> 12)
>  #define OTGSTS_STRAP_NO_DEFAULT_CFG  0x00
>  #define OTGSTS_STRAP_HOST_OTG0x01
>  #define OTGSTS_STRAP_HOST0x02
>  #define OTGSTS_STRAP_GADGET  0x04
> +#define OTGSTS_CDNSP_STRAP_HOST  0x01
> +#define OTGSTS_CDNSP_STRAP_GADGET0x02
> +
>  /* Host mode is turned on. */
> -#define OTGSTS_XHCI_READYBIT(26)
> +#define OTGSTS_CDNS3_XHCI_READY  BIT(26)
> +#define OTGSTS_CDNSP_XHCI_READY  BIT(27)
> +
>  /* "Device mode is turned on .*/
> -#define OTGSTS_DEV_READY BIT(27)
> +#define OTGSTS_CDNS3_DEV_READY   BIT(27)
> +#define OTGSTS_CDNSP_DEV_READY   BIT(26)
>  
>  /* OTGSTATE- bitmasks */
>  #define OTGSTATE_DEV_STATE_MASK  GENMASK(2, 0)
> @@ -152,6 +194,8 @@ struct cdns3_otg_common_regs {
>  #define OVERRIDE_IDPULLUPBIT(0)
>  /* Only for CDNS3_CONTROLLER_V0 version */
>  #define OVERRIDE_IDPULLUP_V0 BIT(24)
> +/* Vbusvalid/Sesvalid override select. */
> +#define OVERRIDE_SESS_VLD_SELBIT(10)
>  
>  /* PHYRST_CFG - bitmasks */
>  #define PHYRST_CFG_PHYRST_A_ENABLE BIT(0)
> @@ -170,6 +214,5 @@ int cdns3_drd_gadget_on(struct cdns3 *cdns);
>  void cdns3_drd_gadget_off(struct cdns3 *cdns);
>  int cdns3_drd_host_on(struct cdns3 *cdns);
>  void cdns3_drd_host_off(struct cdns3 *cdns);
> -int cdns3_set_mode(struct cdns3 *cdns, enum usb_dr_mode mode);
>  
>  #endif /* __LINUX_CDNS3_DRD */
> -- 
> 2.17.1
> 

-- 

Thanks,
Peter Chen

[PATCH v2 01/10] usb: cdns3: Add support for DRD CDNSP

2020-11-06 Thread Pawel Laszczak
Patch adds support for Cadence DRD Super Speed Plus controller(CDNSP).
CDNSP DRD is a part of Cadence CDNSP controller.
The DRD CDNSP controller has a lot of difference on hardware level but on
software level is quite compatible with CDNS3 DRD. For this reason
CDNS3 DRD part of CDNS3 driver was reused for CDNSP driver.

Signed-off-by: Pawel Laszczak 
---
 drivers/usb/cdns3/core.c |  24 +++---
 drivers/usb/cdns3/core.h |   5 ++
 drivers/usb/cdns3/drd.c  | 101 +++
 drivers/usb/cdns3/drd.h  |  67 +-
 4 files changed, 148 insertions(+), 49 deletions(-)

diff --git a/drivers/usb/cdns3/core.c b/drivers/usb/cdns3/core.c
index f2dedce3a40e..58a3cb0e2a5d 100644
--- a/drivers/usb/cdns3/core.c
+++ b/drivers/usb/cdns3/core.c
@@ -97,13 +97,23 @@ static int cdns3_core_init_role(struct cdns3 *cdns)
 * can be restricted later depending on strap pin configuration.
 */
if (dr_mode == USB_DR_MODE_UNKNOWN) {
-   if (IS_ENABLED(CONFIG_USB_CDNS3_HOST) &&
-   IS_ENABLED(CONFIG_USB_CDNS3_GADGET))
-   dr_mode = USB_DR_MODE_OTG;
-   else if (IS_ENABLED(CONFIG_USB_CDNS3_HOST))
-   dr_mode = USB_DR_MODE_HOST;
-   else if (IS_ENABLED(CONFIG_USB_CDNS3_GADGET))
-   dr_mode = USB_DR_MODE_PERIPHERAL;
+   if (cdns->version == CDNSP_CONTROLLER_V2) {
+   if (IS_ENABLED(CONFIG_USB_CDNSP_HOST) &&
+   IS_ENABLED(CONFIG_USB_CDNSP_GADGET))
+   dr_mode = USB_DR_MODE_OTG;
+   else if (IS_ENABLED(CONFIG_USB_CDNSP_HOST))
+   dr_mode = USB_DR_MODE_HOST;
+   else if (IS_ENABLED(CONFIG_USB_CDNSP_GADGET))
+   dr_mode = USB_DR_MODE_PERIPHERAL;
+   } else {
+   if (IS_ENABLED(CONFIG_USB_CDNS3_HOST) &&
+   IS_ENABLED(CONFIG_USB_CDNS3_GADGET))
+   dr_mode = USB_DR_MODE_OTG;
+   else if (IS_ENABLED(CONFIG_USB_CDNS3_HOST))
+   dr_mode = USB_DR_MODE_HOST;
+   else if (IS_ENABLED(CONFIG_USB_CDNS3_GADGET))
+   dr_mode = USB_DR_MODE_PERIPHERAL;
+   }
}
 
/*
diff --git a/drivers/usb/cdns3/core.h b/drivers/usb/cdns3/core.h
index 8a40d53d5ede..3af8eb7ca844 100644
--- a/drivers/usb/cdns3/core.h
+++ b/drivers/usb/cdns3/core.h
@@ -53,7 +53,9 @@ struct cdns3_platform_data {
  * @otg_res: the resource for otg
  * @otg_v0_regs: pointer to base of v0 otg registers
  * @otg_v1_regs: pointer to base of v1 otg registers
+ * @otg_cdnsp_regs: pointer to base of CDNSP otg registers
  * @otg_regs: pointer to base of otg registers
+ * @otg_irq_regs: pointer to interrupt registers
  * @otg_irq: irq number for otg controller
  * @dev_irq: irq number for device controller
  * @wakeup_irq: irq number for wakeup event, it is optional
@@ -83,9 +85,12 @@ struct cdns3 {
struct resource otg_res;
struct cdns3_otg_legacy_regs*otg_v0_regs;
struct cdns3_otg_regs   *otg_v1_regs;
+   struct cdnsp_otg_regs   *otg_cdnsp_regs;
struct cdns3_otg_common_regs*otg_regs;
+   struct cdns3_otg_irq_regs   *otg_irq_regs;
 #define CDNS3_CONTROLLER_V00
 #define CDNS3_CONTROLLER_V11
+#define CDNSP_CONTROLLER_V22
u32 version;
boolphyrst_a_enable;
 
diff --git a/drivers/usb/cdns3/drd.c b/drivers/usb/cdns3/drd.c
index 38ccd29e4cde..95863d44e3e0 100644
--- a/drivers/usb/cdns3/drd.c
+++ b/drivers/usb/cdns3/drd.c
@@ -2,13 +2,12 @@
 /*
  * Cadence USBSS DRD Driver.
  *
- * Copyright (C) 2018-2019 Cadence.
+ * Copyright (C) 2018-2020 Cadence.
  * Copyright (C) 2019 Texas Instruments
  *
  * Author: Pawel Laszczak 
  * Roger Quadros 
  *
- *
  */
 #include 
 #include 
@@ -28,8 +27,9 @@
  *
  * Returns 0 on success otherwise negative errno
  */
-int cdns3_set_mode(struct cdns3 *cdns, enum usb_dr_mode mode)
+static int cdns3_set_mode(struct cdns3 *cdns, enum usb_dr_mode mode)
 {
+   u32 __iomem *override_reg;
u32 reg;
 
switch (mode) {
@@ -39,11 +39,24 @@ int cdns3_set_mode(struct cdns3 *cdns, enum usb_dr_mode 
mode)
break;
case USB_DR_MODE_OTG:
dev_dbg(cdns->dev, "Set controller to OTG mode\n");
-   if (cdns->version == CDNS3_CONTROLLER_V1) {
-   reg = readl(&cdns->otg_v1_regs->override);
+
+   if (cdns->version == CDNSP_CONTROLLER_V2)
+   override_reg = &cdns->otg_cdnsp_regs->override;
+   else if (cdns->version == CDNS3_CONTROLLER_V1)
+   override_reg = &cdns->otg_v1_regs->override;
+   else
+