[PATCH] usb: dwc3: Fix UTMI/UTMIW phy interface initialization

Andy Shevchenko andy.shevchenko at gmail.com
Wed Dec 18 11:43:08 CET 2019


On Wed, Dec 18, 2019 at 9:30 AM Jagan Teki <jagan at amarulasolutions.com> wrote:
>
> DWC3 support phy interfaces like 8/16-bit UTMI+. phy interface
> initialization code would handle them properly along with UNKNOWN
> type by default if none of the user/board doesn't need to use the
> phy interfaces at all.
>
> The current code is masking the 8/16-bit UTMI+ interface bits globally
> which indeed effect the UNKNOWN cases, therefore it effects the platforms
> which are not using phy interfaces at all.
>
> So, handle the phy masking bits accordingly on respective interface
> type cases.
>

Thanks, it works again!
Tested-by: Andy Shevchenko <andy.shevchenko at gmail.com>

> Fixes: 6b7ebff00190 ("usb: dwc3: Add phy interface for dwc3_uboot")
> Reported-by: Andy Shevchenko <andy.shevchenko at gmail.com>
> Signed-off-by: Jagan Teki <jagan at amarulasolutions.com>
> ---
>  drivers/usb/dwc3/core.c | 12 ++++++++----
>  drivers/usb/dwc3/core.h | 20 ++++++++------------
>  2 files changed, 16 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> index 0f9a632816..77c555e769 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -622,15 +622,19 @@ static void dwc3_uboot_hsphy_mode(struct dwc3_device *dwc3_dev,
>
>         /* Set dwc3 usb2 phy config */
>         reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0));
> -       reg |= DWC3_GUSB2PHYCFG_PHYIF;
> -       reg &= ~DWC3_GUSB2PHYCFG_USBTRDTIM_MASK;
>
>         switch (hsphy_mode) {
>         case USBPHY_INTERFACE_MODE_UTMI:
> -               reg |= DWC3_GUSB2PHYCFG_USBTRDTIM_8BIT;
> +               reg &= ~(DWC3_GUSB2PHYCFG_PHYIF_MASK |
> +                       DWC3_GUSB2PHYCFG_USBTRDTIM_MASK);
> +               reg |= DWC3_GUSB2PHYCFG_PHYIF(UTMI_PHYIF_8_BIT) |
> +                       DWC3_GUSB2PHYCFG_USBTRDTIM(USBTRDTIM_UTMI_8_BIT);
>                 break;
>         case USBPHY_INTERFACE_MODE_UTMIW:
> -               reg |= DWC3_GUSB2PHYCFG_USBTRDTIM_16BIT;
> +               reg &= ~(DWC3_GUSB2PHYCFG_PHYIF_MASK |
> +                       DWC3_GUSB2PHYCFG_USBTRDTIM_MASK);
> +               reg |= DWC3_GUSB2PHYCFG_PHYIF(UTMI_PHYIF_16_BIT) |
> +                       DWC3_GUSB2PHYCFG_USBTRDTIM(USBTRDTIM_UTMI_16_BIT);
>                 break;
>         default:
>                 break;
> diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
> index bff53e072b..1c08a2c5b6 100644
> --- a/drivers/usb/dwc3/core.h
> +++ b/drivers/usb/dwc3/core.h
> @@ -162,18 +162,14 @@
>  /* Global USB2 PHY Configuration Register */
>  #define DWC3_GUSB2PHYCFG_PHYSOFTRST    (1 << 31)
>  #define DWC3_GUSB2PHYCFG_SUSPHY                (1 << 6)
> -#define DWC3_GUSB2PHYCFG_PHYIF         BIT(3)
> -
> -/* Global USB2 PHY Configuration Mask */
> -#define DWC3_GUSB2PHYCFG_USBTRDTIM_MASK                (0xf << 10)
> -
> -/* Global USB2 PHY Configuration Offset */
> -#define DWC3_GUSB2PHYCFG_USBTRDTIM_OFFSET      10
> -
> -#define DWC3_GUSB2PHYCFG_USBTRDTIM_16BIT       (0x5 << \
> -               DWC3_GUSB2PHYCFG_USBTRDTIM_OFFSET)
> -#define DWC3_GUSB2PHYCFG_USBTRDTIM_8BIT                (0x9 << \
> -               DWC3_GUSB2PHYCFG_USBTRDTIM_OFFSET)
> +#define DWC3_GUSB2PHYCFG_PHYIF(n)      ((n) << 3)
> +#define DWC3_GUSB2PHYCFG_PHYIF_MASK    DWC3_GUSB2PHYCFG_PHYIF(1)
> +#define DWC3_GUSB2PHYCFG_USBTRDTIM(n)  ((n) << 10)
> +#define DWC3_GUSB2PHYCFG_USBTRDTIM_MASK        DWC3_GUSB2PHYCFG_USBTRDTIM(0xf)
> +#define USBTRDTIM_UTMI_8_BIT           9
> +#define USBTRDTIM_UTMI_16_BIT          5
> +#define UTMI_PHYIF_16_BIT              1
> +#define UTMI_PHYIF_8_BIT               0
>
>  /* Global USB3 PIPE Control Register */
>  #define DWC3_GUSB3PIPECTL_PHYSOFTRST   (1 << 31)
> --
> 2.18.0.321.gffc6fa0e3
>


-- 
With Best Regards,
Andy Shevchenko


More information about the U-Boot mailing list