[Bug] usb: dwc2: Add functions to set and clear force mode
John Youn
John.Youn at synopsys.com
Tue Feb 2 17:32:07 PST 2016
On 2/2/2016 5:10 PM, Caesar Wang wrote:
>
>
> 在 2016年02月03日 09:08, John Youn 写道:
>> On 2/2/2016 4:36 PM, Caesar Wang wrote:
>>> Hi John,
>>>
>>> 在 2016年02月03日 08:03, John Youn 写道:
>>>> On 2/1/2016 6:53 PM, Caesar Wang wrote:
>>>>> John,
>>>>>
>>>>> I will suggest the msleep(25) delay should put in
>>>>> 'dwc2_force_dr_mode()' instead of the 'dwc2_clear_force_mode()'
>>>>>
>>>> Hi Caesar,
>>>>
>>>> Are you saying that just msleep(25) in that function like this solves
>>>> your issue?
>>>>
>>>> diff --git a/drivers/usb/dwc2/core.c b/drivers/usb/dwc2/core.c
>>>> index 39a0fa8..e8a9688 100644
>>>> --- a/drivers/usb/dwc2/core.c
>>>> +++ b/drivers/usb/dwc2/core.c
>>>> @@ -625,6 +625,8 @@ void dwc2_force_dr_mode(struct dwc2_hsotg *hsotg)
>>>> __func__, hsotg->dr_mode);
>>>> break;
>>>> }
>>>> +
>>>> + msleep(25);
>>> Yep, that will solve this issue.
>>>
>> Ok thanks. Though that still seems strange since you should be getting
>> the msleep(25) from either the dwc2_force_mode() or
>> dwc2_clear_force_mode().
>>
>> Can you check if the following patch works?
>>
>> If so, I think we can go with that to fix the regression for
>> now. Otherwise I'll just add the extra msleep(25) and revisit this
>> later.
>>
>> Regards,
>> John
>>
>> ---->8----
>>
>> diff --git a/drivers/usb/dwc2/core.c b/drivers/usb/dwc2/core.c
>> index e991d55..13c060c 100644
>> --- a/drivers/usb/dwc2/core.c
>> +++ b/drivers/usb/dwc2/core.c
>> @@ -576,7 +576,6 @@ static bool dwc2_force_mode(struct dwc2_hsotg *hsotg, bool host)
>> gusbcfg |= set;
>> dwc2_writel(gusbcfg, hsotg->regs + GUSBCFG);
>>
>> - msleep(25);
>> return true;
>> }
>>
>> @@ -596,7 +595,6 @@ static void dwc2_clear_force_mode(struct dwc2_hsotg *hsotg)
>> * NOTE: This long sleep is _very_ important, otherwise the core will
>> * not stay in host mode after a connector ID change!
>> */
>> - msleep(25);
>> }
>>
>> /*
>> @@ -619,6 +617,8 @@ void dwc2_force_dr_mode(struct dwc2_hsotg *hsotg)
>> __func__, hsotg->dr_mode);
>> break;
>> }
>> +
>> + msleep(25);
>> }
>
> Right, that works for me.
>
Ok, interesting. Actually this won't work either since we need the
separate msleeps when those functions are called from other contexts.
Is your controller by chance *not* OTG capable, i.e.
dwc2_hw_is_otg(hsotg) == false
Then the msleep in dwc2_force_mode() is skipped.
Then, for some reason, skipping it (even though nothing was forced)
causes the failure on your platform.
Regards,
John
More information about the Linux-rockchip
mailing list