Re: DWC3 host support

Angus Ainslie
2022-07-19T13:23:07Z

On 2022-07-18 23:47, Michal Simek wrote:
> Hi,
>
> On 7/18/22 18:23, Angus Ainslie wrote:
>> Hi,
>>
>> On 2022-07-18 01:13, Michal Simek wrote:
>>> On 7/17/22 17:23, Marek Vasut wrote:
>>>> On 7/17/22 05:00, Angus Ainslie wrote:
>>>>> On 2022-07-16 11:37, Marek Vasut wrote:
>>>>>> On 7/16/22 15:02, Angus Ainslie wrote:
>>>>>>> Hi Michal,
>>>>>>>
>>>>>>> I recently rebased my librem5 tree onto the latest u-boot-imx
>>>>>>> branch
>>>>>>> and the dwc3 host mode stopped working.
>>>>>>>
>>>>>>> I bisected it down to this commit:
>>>>>>>
>>>>>>> 142d50fbce7c364a74f5e8204dba491b9f066e6c usb: dwc3: Add support
>>>>>>> for
>>>>>>> usb3-phy PHY configuration
>>>>>>>
>>>>>>> Reverting that commit allows usb host mode to work on the librem5
>>>>>>> again.
>>>>>>>
>>>>>>> Should this initialization go into an SOC specific glue_configure
>>>>>>> function ?
>>>>>>>
>>>>>>> Is the imx8mq.dtsi missing something that will keep usb host
>>>>>>> working
>>>>>>> with this patch ?
>>>>>>>
>>>>>>> Does this break usb host on other imx8mq devices ?
>>>>>>
>>>>>> Wasn't this fixed by:
>>>>>> 868d58f69c ("usb: dwc3: Fix non-usb3 configurations")
>>>>>> ?
>>>>>
>>>>> I've got that in my tree and it still fails to probe the USB2 hub
>>>>> and
>>>>> USB 2 storage.
>>>>
>>>> I assume you do have CONFIG_PHY_IMX8MQ_USB enabled ?
>>>>
>>>> What does generic_phy_get_by_name() return for you in
>>>> drivers/usb/dwc3/dwc3-generic.c ?
>>>
>>> As Marek said there was one patch which fixes origin patch which
>>> didn't handle all the error cases properly. We need to know return
>>> value from generic_phy_get_by_name(), also if you still have usb3-phy
>>> in DT (as is in imx8mq.dtsi) with phy DT status enabled and enabled
>>> phy driver (CONFIG_PHY_IMX8MQ_USB).
>>>
>>
>> Removing the usb3 phy definition also "fixes" it
>>
>> --- a/arch/arm/dts/imx8mq-librem5-r4.dts
>> +++ b/arch/arm/dts/imx8mq-librem5-r4.dts
>> @@ -33,3 +33,8 @@
>>  &proximity {
>>         proximity-near-level = <10>;
>>  };
>> +
>> +&usb_dwc3_1 {
>> +       phys = <&usb3_phy1>;
>> +       phy-names = "usb2-phy";
>> +};
>
> Log shows that phy initialization is called properly but it looks like
> that initialization itself has issue which should be the issue with
> phy driver.
>
> DWC3 driver is calling just phy_init and phy_power_on which are quite
> small 2 functions in phy-imx8mq-usb.c.
>
> Did usb3 work before 142d50fbce7c364a74f5e8204dba491b9f066e6c?
> I have no idea how imx is working but I have added to CC author of
> this phy driver.
>

We don't use USB3 on that port so no idea. The only thing connected to
that port is a USB 2 hub and then downstream devices from the hub. The
USB 2 hub did work without 142d50fbce7c364a74f5e8204dba491b9f066e6c.

> I see small differences between Linux and U-Boot drivers.
>
> 99 value &= ~PHY_CTRL0_SSC_RANGE_MASK;
> 100 value |= PHY_CTRL0_SSC_RANGE_4003PPM;
>
> And in power_on I see this in u-boot
>
> 129 /* Disable rx term override */
> 130 value = readl(imx_phy->base + PHY_CTRL6);
> 131 value &= ~PHY_CTRL6_RXTERM_OVERRIDE_SEL;
> 132 writel(value, imx_phy->base + PHY_CTRL6);
>
> And Linux driver is handling regulators. Do you use any regulator?

There isn't a regulator specifically for the PHY. There is one for the
hub and it gets enabled before the phy_init functions.

>
> If usb3.0 works in Linux I think it should be easier for you to track
> this down but there are some small differences in the U-Boot driver
> which can be the reason why it is failing on your board.

Thanks
Angus

>
> Thanks,
> Michal