[U-Boot] [PATCH v3 03/30] sunxi: Fix USB PHY index for H3/H5/A64

Marek Vasut marex at denx.de
Sun Jan 28 16:31:16 UTC 2018


On 01/28/2018 05:19 PM, Jagan Teki wrote:
> From: Chen-Yu Tsai <wens at csie.org>
> 
> On the new chips such as H3, H5, and A64, the USB OTG controller is
> paired with a set of proper EHCI/OHCI USB hosts. To enable these hosts,
> the USB PHY index count has to be reworked to start from this pair.
> 
> This patch reworks the USB clock gate and reset indices, and how the
> USB host is mapped to a USB phy, for the newer chips.

The ifdeffery is awful. The driver is DT capable, do why don't you
detect the block type / soc type from DT and handle this dynamically
instead of adding ifdefs ?

> Signed-off-by: Chen-Yu Tsai <wens at csie.org>
> Reviewed-by: Jagan Teki <jagan at openedev.com>
> [jagan: remove 3/8] from commit header]
> Signed-off-by: Jagan Teki <jagan at amarulasolutions.com>
> Cc: Marek Vasut <marex at denx.de>
> ---
>  arch/arm/include/asm/arch-sunxi/clock_sun6i.h | 30 +++++++++++++--------------
>  drivers/usb/host/ehci-sunxi.c                 |  9 +++++++-
>  drivers/usb/host/ohci-sunxi.c                 |  9 +++++++-
>  3 files changed, 30 insertions(+), 18 deletions(-)
> 
> diff --git a/arch/arm/include/asm/arch-sunxi/clock_sun6i.h b/arch/arm/include/asm/arch-sunxi/clock_sun6i.h
> index d328df9..2c82d0a 100644
> --- a/arch/arm/include/asm/arch-sunxi/clock_sun6i.h
> +++ b/arch/arm/include/asm/arch-sunxi/clock_sun6i.h
> @@ -270,17 +270,18 @@ struct sunxi_ccm_reg {
>  #define AXI_GATE_OFFSET_DRAM		0
>  
>  /* ahb_gate0 offsets */
> +#if defined(CONFIG_MACH_SUNXI_H3_H5) || defined(CONFIG_MACH_SUN50I)
> +#define AHB_GATE_OFFSET_USB_OHCI3	31
> +#define AHB_GATE_OFFSET_USB_OHCI2	30
> +#define AHB_GATE_OFFSET_USB_OHCI1	29
> +#define AHB_GATE_OFFSET_USB_OHCI0	28
> +#define AHB_GATE_OFFSET_USB_EHCI3	27
> +#define AHB_GATE_OFFSET_USB_EHCI2	26
> +#define AHB_GATE_OFFSET_USB_EHCI1	25
> +#define AHB_GATE_OFFSET_USB_EHCI0	24
> +#else
>  #define AHB_GATE_OFFSET_USB_OHCI1	30
>  #define AHB_GATE_OFFSET_USB_OHCI0	29
> -#ifdef CONFIG_MACH_SUNXI_H3_H5
> -/*
> - * These are EHCI1 - EHCI3 in the datasheet (EHCI0 is for the OTG) we call
> - * them 0 - 2 like they were called on older SoCs.
> - */
> -#define AHB_GATE_OFFSET_USB_EHCI2	27
> -#define AHB_GATE_OFFSET_USB_EHCI1	26
> -#define AHB_GATE_OFFSET_USB_EHCI0	25
> -#else
>  #define AHB_GATE_OFFSET_USB_EHCI1	27
>  #define AHB_GATE_OFFSET_USB_EHCI0	26
>  #endif
> @@ -339,13 +340,10 @@ struct sunxi_ccm_reg {
>  #define CCM_USB_CTRL_PHY2_CLK (0x1 << 10)
>  #define CCM_USB_CTRL_PHY3_CLK (0x1 << 11)
>  #ifdef CONFIG_MACH_SUNXI_H3_H5
> -/*
> - * These are OHCI1 - OHCI3 in the datasheet (OHCI0 is for the OTG) we call
> - * them 0 - 2 like they were called on older SoCs.
> - */
> -#define CCM_USB_CTRL_OHCI0_CLK (0x1 << 17)
> -#define CCM_USB_CTRL_OHCI1_CLK (0x1 << 18)
> -#define CCM_USB_CTRL_OHCI2_CLK (0x1 << 19)
> +#define CCM_USB_CTRL_OHCI0_CLK (0x1 << 16)
> +#define CCM_USB_CTRL_OHCI1_CLK (0x1 << 17)
> +#define CCM_USB_CTRL_OHCI2_CLK (0x1 << 18)
> +#define CCM_USB_CTRL_OHCI3_CLK (0x1 << 19)
>  #else
>  #define CCM_USB_CTRL_OHCI0_CLK (0x1 << 16)
>  #define CCM_USB_CTRL_OHCI1_CLK (0x1 << 17)
> diff --git a/drivers/usb/host/ehci-sunxi.c b/drivers/usb/host/ehci-sunxi.c
> index 6ecb7c4..f40228e 100644
> --- a/drivers/usb/host/ehci-sunxi.c
> +++ b/drivers/usb/host/ehci-sunxi.c
> @@ -48,10 +48,17 @@ static int ehci_usb_probe(struct udevice *dev)
>  #if defined(CONFIG_MACH_SUNXI_H3_H5) || defined(CONFIG_MACH_SUN50I)
>  	extra_ahb_gate_mask = 1 << AHB_GATE_OFFSET_USB_OHCI0;
>  #endif
> +#if defined(CONFIG_MACH_SUNXI_H3_H5) || defined(CONFIG_MACH_SUN50I)
> +	/* Newer chips have a EHCI/OHCI host pair for OTG host mode */
> +	priv->phy_index = ((uintptr_t)hccr - SUNXI_USB0_BASE) / BASE_DIST;
> +#else
>  	priv->phy_index = ((uintptr_t)hccr - SUNXI_USB1_BASE) / BASE_DIST;
> +#endif
>  	priv->ahb_gate_mask <<= priv->phy_index * AHB_CLK_DIST;
>  	extra_ahb_gate_mask <<= priv->phy_index * AHB_CLK_DIST;
> -	priv->phy_index++; /* Non otg phys start at 1 */
> +#if !defined(CONFIG_MACH_SUNXI_H3_H5) && !defined(CONFIG_MACH_SUN50I)
> +	priv->phy_index++; /* older chips do not have EHCI with OTG */
> +#endif
>  
>  	setbits_le32(&ccm->ahb_gate0,
>  		     priv->ahb_gate_mask | extra_ahb_gate_mask);
> diff --git a/drivers/usb/host/ohci-sunxi.c b/drivers/usb/host/ohci-sunxi.c
> index 133774f..4b8a403 100644
> --- a/drivers/usb/host/ohci-sunxi.c
> +++ b/drivers/usb/host/ohci-sunxi.c
> @@ -51,11 +51,18 @@ static int ohci_usb_probe(struct udevice *dev)
>  	extra_ahb_gate_mask = 1 << AHB_GATE_OFFSET_USB_EHCI0;
>  #endif
>  	priv->usb_gate_mask = CCM_USB_CTRL_OHCI0_CLK;
> +#if defined(CONFIG_MACH_SUNXI_H3_H5) || defined(CONFIG_MACH_SUN50I)
> +	/* Newer chips have a EHCI/OHCI host pair for OTG host mode */
> +	priv->phy_index = ((uintptr_t)regs - (SUNXI_USB0_BASE + 0x400)) / BASE_DIST;
> +#else
>  	priv->phy_index = ((uintptr_t)regs - (SUNXI_USB1_BASE + 0x400)) / BASE_DIST;
> +#endif
>  	priv->ahb_gate_mask <<= priv->phy_index * AHB_CLK_DIST;
>  	extra_ahb_gate_mask <<= priv->phy_index * AHB_CLK_DIST;
>  	priv->usb_gate_mask <<= priv->phy_index;
> -	priv->phy_index++; /* Non otg phys start at 1 */
> +#if !defined(CONFIG_MACH_SUNXI_H3_H5) && !defined(CONFIG_MACH_SUN50I)
> +	priv->phy_index++; /* older chips do not have OHCI with OTG */
> +#endif
>  
>  	setbits_le32(&ccm->ahb_gate0,
>  		     priv->ahb_gate_mask | extra_ahb_gate_mask);
> 


-- 
Best regards,
Marek Vasut


More information about the U-Boot mailing list