[U-Boot] [PATCH v10 00/35] phy: sunxi: Add Allwinner sun4i USB PHY
Vasily Khoruzhick
anarsoul at gmail.com
Tue Jun 5 07:02:33 UTC 2018
On Mon, Jun 4, 2018 at 11:31 PM, Vasily Khoruzhick <anarsoul at gmail.com> wrote:
> On Mon, Jun 4, 2018 at 10:58 PM, Vasily Khoruzhick <anarsoul at gmail.com> wrote:
>>> And A64-Relic has only ehci0 and ohci0 no ehci1 and ohci1, better to
>>> debug it from your side, what went wrong.
>>
>> Sure, I can do bisect.
>
> dd3228170ad7388bdd57ff18b9e463c36508ebe9 is the first bad commit
> commit dd3228170ad7388bdd57ff18b9e463c36508ebe9
> Author: Jagan Teki <jagan at amarulasolutions.com>
> Date: Mon May 7 13:03:38 2018 +0530
>
> usb: sunxi: Switch to use generic-phy
>
> Allwinner USB PHY handling can be done through driver-model
> generic-phy so add the generic-phy ops to relevant places
> on host and musb sunxi driver and enable them in respective
> SOC's.
>
> Signed-off-by: Jagan Teki <jagan at amarulasolutions.com>
> Acked-by: Jun Nie <jun.nie at linaro.org>
Original code in ehci-sunxi.c and ohci-sunxi.c used following as phy_index:
priv->phy_index = ((uintptr_t)hccr - SUNXI_USB1_BASE) / BASE_DIST
So apparently phy_index for EHCI1 was 0.
This quick hack fixes EHCI1 and OHCI1 for me (I hope gmail won't
garble formatting):
diff --git a/drivers/usb/host/ehci-sunxi.c b/drivers/usb/host/ehci-sunxi.c
index 360efc9116..db87d062fa 100644
--- a/drivers/usb/host/ehci-sunxi.c
+++ b/drivers/usb/host/ehci-sunxi.c
@@ -47,6 +47,7 @@ static int ehci_usb_probe(struct udevice *dev)
phys = 0;
goto no_phy;
}
+ printf("%s: phys: %d\n", __func__, phys);
ret = generic_phy_get_by_name(dev, "usb", &priv->phy);
if (ret) {
@@ -75,8 +76,8 @@ no_phy:
#if defined(CONFIG_MACH_SUNXI_H3_H5) || defined(CONFIG_MACH_SUN50I)
extra_ahb_gate_mask = 1 << AHB_GATE_OFFSET_USB_OHCI0;
#endif
- priv->ahb_gate_mask <<= phys * AHB_CLK_DIST;
- extra_ahb_gate_mask <<= phys * AHB_CLK_DIST;
+ priv->ahb_gate_mask <<= 0; //phys * AHB_CLK_DIST;
+ extra_ahb_gate_mask <<= 0; //phys * AHB_CLK_DIST;
setbits_le32(&priv->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 ce2b47a5c4..cd7984240e 100644
--- a/drivers/usb/host/ohci-sunxi.c
+++ b/drivers/usb/host/ohci-sunxi.c
@@ -78,9 +78,9 @@ no_phy:
extra_ahb_gate_mask = 1 << AHB_GATE_OFFSET_USB_EHCI0;
#endif
priv->usb_gate_mask = CCM_USB_CTRL_OHCI0_CLK;
- priv->ahb_gate_mask <<= phys * AHB_CLK_DIST;
- extra_ahb_gate_mask <<= phys * AHB_CLK_DIST;
- priv->usb_gate_mask <<= phys;
+ priv->ahb_gate_mask <<= 0; //phys * AHB_CLK_DIST;
+ extra_ahb_gate_mask <<= 0; //phys * AHB_CLK_DIST;
+ priv->usb_gate_mask <<= 0; //phys;
setbits_le32(&priv->ccm->ahb_gate0,
priv->ahb_gate_mask | extra_ahb_gate_mask);
I'm too tired to look into what this code does and why phy_index has
to be 0 for EHCI1/OHCI1, but I can safely and surely say that
dd3228170ad7388bdd57ff18b9e463c36508ebe9 caused the issue.
EHCI1/OHCI1 won't work if ECHI0/OHCI0 aren't enabled.
More information about the U-Boot
mailing list