phy: samsung: s5pv210-usb2: Add delay after reset
diff mbox series

Message ID BN6PR04MB06605D52502816E500683553A3D10@BN6PR04MB0660.namprd04.prod.outlook.com
State Not Applicable
Headers show
Series
  • phy: samsung: s5pv210-usb2: Add delay after reset
Related show

Commit Message

Jonathan Bakker April 25, 2020, 5:36 p.m. UTC
The USB phy takes some time to reset, so make sure we give it to it. The
delay length was taken from the 4x12 phy driver.

This manifested in issues with the DWC2 driver since commit fe369e1826b3
("usb: dwc2: Make dwc2_readl/writel functions endianness-agnostic.")
where the endianness check would read the DWC ID as 0 due to the phy still
resetting, resulting in the wrong endian mode being chosen.

Signed-off-by: Jonathan Bakker <xc-racer2@live.ca>
---
 drivers/phy/samsung/phy-s5pv210-usb2.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Kishon Vijay Abraham I April 27, 2020, 12:40 p.m. UTC | #1
Hi Jonathan,

On 4/25/2020 11:06 PM, Jonathan Bakker wrote:
> The USB phy takes some time to reset, so make sure we give it to it. The
> delay length was taken from the 4x12 phy driver.
> 
> This manifested in issues with the DWC2 driver since commit fe369e1826b3
> ("usb: dwc2: Make dwc2_readl/writel functions endianness-agnostic.")
> where the endianness check would read the DWC ID as 0 due to the phy still
> resetting, resulting in the wrong endian mode being chosen.
> 
> Signed-off-by: Jonathan Bakker <xc-racer2@live.ca>
> ---
>  drivers/phy/samsung/phy-s5pv210-usb2.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/phy/samsung/phy-s5pv210-usb2.c b/drivers/phy/samsung/phy-s5pv210-usb2.c
> index 56a5083fe6f9..32be62e49804 100644
> --- a/drivers/phy/samsung/phy-s5pv210-usb2.c
> +++ b/drivers/phy/samsung/phy-s5pv210-usb2.c
> @@ -139,6 +139,10 @@ static void s5pv210_phy_pwr(struct samsung_usb2_phy_instance *inst, bool on)
>  		udelay(10);
>  		rst &= ~rstbits;
>  		writel(rst, drv->reg_phy + S5PV210_UPHYRST);
> +		/* The following delay is necessary for the reset sequence to be
> +		 * completed
> +		 */
> +		udelay(80);

Please fix the following checkpatch check error.
CHECK: usleep_range is preferred over udelay; see
Documentation/timers/timers-howto.rst
#151: FILE: drivers/phy/samsung/phy-s5pv210-usb2.c:145:
+               udelay(80);

total: 0 errors, 0 warnings, 1 checks, 10 lines checked

Thanks
Kishon
Jonathan Bakker April 28, 2020, 9:50 p.m. UTC | #2
Hi Kishon,

On 2020-04-27 5:40 a.m., Kishon Vijay Abraham I wrote:
> Hi Jonathan,
> 
> On 4/25/2020 11:06 PM, Jonathan Bakker wrote:
>> The USB phy takes some time to reset, so make sure we give it to it. The
>> delay length was taken from the 4x12 phy driver.
>>
>> This manifested in issues with the DWC2 driver since commit fe369e1826b3
>> ("usb: dwc2: Make dwc2_readl/writel functions endianness-agnostic.")
>> where the endianness check would read the DWC ID as 0 due to the phy still
>> resetting, resulting in the wrong endian mode being chosen.
>>
>> Signed-off-by: Jonathan Bakker <xc-racer2@live.ca>
>> ---
>>  drivers/phy/samsung/phy-s5pv210-usb2.c | 4 ++++
>>  1 file changed, 4 insertions(+)
>>
>> diff --git a/drivers/phy/samsung/phy-s5pv210-usb2.c b/drivers/phy/samsung/phy-s5pv210-usb2.c
>> index 56a5083fe6f9..32be62e49804 100644
>> --- a/drivers/phy/samsung/phy-s5pv210-usb2.c
>> +++ b/drivers/phy/samsung/phy-s5pv210-usb2.c
>> @@ -139,6 +139,10 @@ static void s5pv210_phy_pwr(struct samsung_usb2_phy_instance *inst, bool on)
>>  		udelay(10);
>>  		rst &= ~rstbits;
>>  		writel(rst, drv->reg_phy + S5PV210_UPHYRST);
>> +		/* The following delay is necessary for the reset sequence to be
>> +		 * completed
>> +		 */
>> +		udelay(80);
> 
> Please fix the following checkpatch check error.
> CHECK: usleep_range is preferred over udelay; see
> Documentation/timers/timers-howto.rst
> #151: FILE: drivers/phy/samsung/phy-s5pv210-usb2.c:145:
> +               udelay(80);
> 
> total: 0 errors, 0 warnings, 1 checks, 10 lines checked


Unfortunately, this is an atomic code path (and hence why the other Samsung phy driver use udelay
in the same place). Changing to usleep_range brings up the following BUG:

BUG: scheduling while atomic: swapper/1/0x00000002
Modules linked in:
CPU: 0 PID: 1 Comm: swapper Not tainted 5.7.0-rc2-00001-gf9f8ac7cc48c-dirty #443
Hardware name: Samsung S5PC110/S5PV210-based board
[<c010c744>] (unwind_backtrace) from [<c010a114>] (show_stack+0x10/0x14)
[<c010a114>] (show_stack) from [<c0139f24>] (__schedule_bug+0x70/0x84)
[<c0139f24>] (__schedule_bug) from [<c073acc4>] (__schedule+0x38c/0x464)
[<c073acc4>] (__schedule) from [<c073ae3c>] (schedule+0xa0/0x138)
[<c073ae3c>] (schedule) from [<c073ee9c>] (schedule_hrtimeout_range_clock+0xd4/0x158)
[<c073ee9c>] (schedule_hrtimeout_range_clock) from [<c073ef38>] (schedule_hrtimeout_range+0x18/0x20)
[<c073ef38>] (schedule_hrtimeout_range) from [<c073e84c>] (usleep_range+0x68/0x8c)
[<c073e84c>] (usleep_range) from [<c03e2e50>] (s5pv210_power_on+0xbc/0xe4)
[<c03e2e50>] (s5pv210_power_on) from [<c03e2bf0>] (samsung_usb2_phy_power_on+0xec/0x16c)
[<c03e2bf0>] (samsung_usb2_phy_power_on) from [<c03e1e14>] (phy_power_on+0x8c/0xdc)
[<c03e1e14>] (phy_power_on) from [<c053ab4c>] (__dwc2_lowlevel_hw_enable+0xb8/0xcc)
[<c053ab4c>] (__dwc2_lowlevel_hw_enable) from [<c053ae80>] (dwc2_driver_probe+0x1e4/0x580)
[<c053ae80>] (dwc2_driver_probe) from [<c04b0e9c>] (platform_drv_probe+0x48/0x98)
[<c04b0e9c>] (platform_drv_probe) from [<c04af098>] (really_probe+0x1e0/0x344)
[<c04af098>] (really_probe) from [<c04af338>] (driver_probe_device+0x60/0x168)
[<c04af338>] (driver_probe_device) from [<c04af5e0>] (device_driver_attach+0x58/0x60)
[<c04af5e0>] (device_driver_attach) from [<c04af640>] (__driver_attach+0x58/0xcc)
[<c04af640>] (__driver_attach) from [<c04ad348>] (bus_for_each_dev+0x74/0xb4)
[<c04ad348>] (bus_for_each_dev) from [<c04ae510>] (bus_add_driver+0x1b4/0x1d4)
[<c04ae510>] (bus_add_driver) from [<c04afee0>] (driver_register+0x74/0x108)
[<c04afee0>] (driver_register) from [<c0101710>] (do_one_initcall+0x7c/0x1cc)
[<c0101710>] (do_one_initcall) from [<c0a00ed8>] (kernel_init_freeable+0x15c/0x1d4)
[<c0a00ed8>] (kernel_init_freeable) from [<c073a398>] (kernel_init+0x8/0x110)
[<c073a398>] (kernel_init) from [<c0100148>] (ret_from_fork+0x14/0x2c)
Exception stack(0xe745ffb0 to 0xe745fff8)
ffa0:                                     00000000 00000000 00000000 00000000
ffc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
ffe0: 00000000 00000000 00000000 00000000 00000013 00000000
dwc2 ec000000.hsotg: dwc2_check_params: Invalid parameter besl=1
dwc2 ec000000.hsotg: dwc2_check_params: Invalid parameter g_np_tx_fifo_size=1024
dwc2 ec000000.hsotg: EPs: 16, dedicated fifos, 7808 entries in SPRAM
------------[ cut here ]------------
kernel BUG at mm/vmalloc.c:2101!
Internal error: Oops - BUG: 0 [#1] PREEMPT ARM
Modules linked in:
CPU: 0 PID: 1 Comm: swapper Tainted: G        W         5.7.0-rc2-00001-gf9f8ac7cc48c-dirty #443
Hardware name: Samsung S5PC110/S5PV210-based board
PC is at __get_vm_area_node+0x174/0x178
LR is at 0xe745e000
pc : [<c01cf678>]    lr : [<e745e000>]    psr: 20000013
sp : e745fc60  ip : 001fff00  fp : 00000038
r10: e6cb9880  r9 : 00000001  r8 : c0161760
r7 : e6cb98c0  r6 : 00000cc0  r5 : 00000247  r4 : e7fd2800
r3 : e8800000  r2 : 00000010  r1 : ffffffff  r0 : 00001000
Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment none
Control: 10c5387d  Table: 30004019  DAC: 00000051
Process swapper (pid: 1, stack limit = 0x(ptrval))
Stack: (0xe745fc60 to 0xe7460000)
fc60: ffffe000 c014d04c c09082c0 e7fd2800 00000247 e6cb98c0 e6cb98c0 c0161760
fc80: 00000000 c01cf788 ff800000 ffffffff 00000cc0 c0161760 e7fd2800 c0162be4
fca0: e7fd2800 00001000 00000247 c0162cd4 00000001 e7fd2800 00001000 00000247
fcc0: ffffffff c010e384 e757c810 c0b03008 00000cc0 e76f3c48 ffffffff c010e3e4
fce0: e745fd04 c0161760 00000001 e76f3c48 ffffffff c010e510 e7401c00 00000000
fd00: c0166698 00000000 e757c810 00001000 00000cc0 00000247 c0161760 00000001
fd20: 00000000 57579938 ffffe000 00000000 c0b03008 e757c810 00000008 00000cc0
fd40: 00000000 e76f3c48 c0a27830 c010e6a8 00000247 00000000 00000000 c0161760
fd60: c010e668 c0161760 00000000 c01e7e94 e76f3840 57579938 e6cbd1c0 00000cc0
fd80: 00000000 00000008 e757c810 e76f3c48 00000000 c016182c 00000000 00000010
fda0: e6cbd100 e76f3840 00000000 00000000 00000010 e757c810 c0b20994 c054176c
fdc0: 00000000 00000000 c0b03008 e757c800 00000000 c0b03008 e757c800 e757c810
fde0: e76f3840 c053afb0 00000080 e757a640 e76f3840 57579938 e757a600 57579938
fe00: e757c810 e757c810 00000000 c0b20994 00000000 00000000 c0b20994 c04b0e9c
fe20: c0b685f8 e757c810 c0b685fc 00000000 00000000 c04af098 e757c810 c0b20994
fe40: c0b20994 c04af5e8 00000000 000000a9 c0a27850 c04af338 c0a27850 c05d8e30
fe60: a0000013 e757c810 00000000 c0b20994 c04af5e8 00000000 000000a9 c0a27850
fe80: c0a27830 c04af5e0 00000000 c0b20994 e757c810 c04af640 e75705b0 c0b03008
fea0: c0b20994 c04ad348 000000a9 e743834c e75705b0 57579938 c0b1d920 c0b20994
fec0: e6cb2c00 c0b1d920 00000000 c04ae510 c083e4dc ffffe000 c0b20994 c0b20994
fee0: c0b03008 ffffe000 c0a1b950 c04afee0 c0b2fb80 c0b03008 ffffe000 c0101710
ff00: e74385d6 c0134194 c0984550 c0919800 00000000 00000006 00000006 c08cf26c
ff20: 00000000 c0b03008 c08d8c7c c08cf2e0 00000000 e74385bf 00000000 57579938
ff40: 00000000 c0b2fb80 00000007 57579938 c0b2fb80 c0a33094 c0984550 00000007
ff60: e7438540 c0a00ed8 00000006 00000006 00000000 c0a003f0 00000000 c0a003f0
ff80: 00000000 00000000 c073a390 00000000 00000000 00000000 00000000 00000000
ffa0: 00000000 c073a398 00000000 c0100148 00000000 00000000 00000000 00000000
ffc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
ffe0: 00000000 00000000 00000000 00000000 00000013 00000000 00000000 00000000
[<c01cf678>] (__get_vm_area_node) from [<c01cf788>] (get_vm_area_caller+0x48/0x50)
[<c01cf788>] (get_vm_area_caller) from [<c0162be4>] (__dma_common_pages_remap+0x1c/0x50)
[<c0162be4>] (__dma_common_pages_remap) from [<c0162cd4>] (dma_common_contiguous_remap+0x7c/0xbc)
[<c0162cd4>] (dma_common_contiguous_remap) from [<c010e384>] (__alloc_remap_buffer+0x50/0x88)
[<c010e384>] (__alloc_remap_buffer) from [<c010e3e4>] (remap_allocator_alloc+0x28/0x30)
[<c010e3e4>] (remap_allocator_alloc) from [<c010e510>] (__dma_alloc+0x124/0x240)
[<c010e510>] (__dma_alloc) from [<c010e6a8>] (arm_dma_alloc+0x40/0x48)
[<c010e6a8>] (arm_dma_alloc) from [<c0161760>] (dma_alloc_attrs+0x9c/0x110)
[<c0161760>] (dma_alloc_attrs) from [<c016182c>] (dmam_alloc_attrs+0x58/0x98)
[<c016182c>] (dmam_alloc_attrs) from [<c054176c>] (dwc2_gadget_init+0x31c/0x3fc)
[<c054176c>] (dwc2_gadget_init) from [<c053afb0>] (dwc2_driver_probe+0x314/0x580)
[<c053afb0>] (dwc2_driver_probe) from [<c04b0e9c>] (platform_drv_probe+0x48/0x98)
[<c04b0e9c>] (platform_drv_probe) from [<c04af098>] (really_probe+0x1e0/0x344)
[<c04af098>] (really_probe) from [<c04af338>] (driver_probe_device+0x60/0x168)
[<c04af338>] (driver_probe_device) from [<c04af5e0>] (device_driver_attach+0x58/0x60)
[<c04af5e0>] (device_driver_attach) from [<c04af640>] (__driver_attach+0x58/0xcc)
[<c04af640>] (__driver_attach) from [<c04ad348>] (bus_for_each_dev+0x74/0xb4)
[<c04ad348>] (bus_for_each_dev) from [<c04ae510>] (bus_add_driver+0x1b4/0x1d4)
[<c04ae510>] (bus_add_driver) from [<c04afee0>] (driver_register+0x74/0x108)
[<c04afee0>] (driver_register) from [<c0101710>] (do_one_initcall+0x7c/0x1cc)
[<c0101710>] (do_one_initcall) from [<c0a00ed8>] (kernel_init_freeable+0x15c/0x1d4)
[<c0a00ed8>] (kernel_init_freeable) from [<c073a398>] (kernel_init+0x8/0x110)
[<c073a398>] (kernel_init) from [<c0100148>] (ret_from_fork+0x14/0x2c)
Exception stack(0xe745ffb0 to 0xe745fff8)
ffa0:                                     00000000 00000000 00000000 00000000
ffc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
ffe0: 00000000 00000000 00000000 00000000 00000013 00000000
Code: eb005d92 e1a00008 e28dd00c e8bd83f0 (e7f001f2) 
---[ end trace 4ae52726a37c07c2 ]---
Kernel panic - not syncing: Fatal exception in interrupt
---[ end Kernel panic - not syncing: Fatal exception in interrupt ]---

> 
> Thanks
> Kishon
> 


Thanks,
Jonathan
Jonathan Bakker May 9, 2020, 2:37 a.m. UTC | #3
Hi Kishon,

Is there anything else you (or someone else) needs from me?  I'd really appreciate getting USB working again on s5pv210 as without this patch it is entirely broken.

Thanks,
Jonathan

On 2020-04-28 2:50 p.m., Jonathan Bakker wrote:
> Hi Kishon,
> 
> On 2020-04-27 5:40 a.m., Kishon Vijay Abraham I wrote:
>> Hi Jonathan,
>>
>> On 4/25/2020 11:06 PM, Jonathan Bakker wrote:
>>> The USB phy takes some time to reset, so make sure we give it to it. The
>>> delay length was taken from the 4x12 phy driver.
>>>
>>> This manifested in issues with the DWC2 driver since commit fe369e1826b3
>>> ("usb: dwc2: Make dwc2_readl/writel functions endianness-agnostic.")
>>> where the endianness check would read the DWC ID as 0 due to the phy still
>>> resetting, resulting in the wrong endian mode being chosen.
>>>
>>> Signed-off-by: Jonathan Bakker <xc-racer2@live.ca>
>>> ---
>>>  drivers/phy/samsung/phy-s5pv210-usb2.c | 4 ++++
>>>  1 file changed, 4 insertions(+)
>>>
>>> diff --git a/drivers/phy/samsung/phy-s5pv210-usb2.c b/drivers/phy/samsung/phy-s5pv210-usb2.c
>>> index 56a5083fe6f9..32be62e49804 100644
>>> --- a/drivers/phy/samsung/phy-s5pv210-usb2.c
>>> +++ b/drivers/phy/samsung/phy-s5pv210-usb2.c
>>> @@ -139,6 +139,10 @@ static void s5pv210_phy_pwr(struct samsung_usb2_phy_instance *inst, bool on)
>>>  		udelay(10);
>>>  		rst &= ~rstbits;
>>>  		writel(rst, drv->reg_phy + S5PV210_UPHYRST);
>>> +		/* The following delay is necessary for the reset sequence to be
>>> +		 * completed
>>> +		 */
>>> +		udelay(80);
>>
>> Please fix the following checkpatch check error.
>> CHECK: usleep_range is preferred over udelay; see
>> Documentation/timers/timers-howto.rst
>> #151: FILE: drivers/phy/samsung/phy-s5pv210-usb2.c:145:
>> +               udelay(80);
>>
>> total: 0 errors, 0 warnings, 1 checks, 10 lines checked
> 
> 
> Unfortunately, this is an atomic code path (and hence why the other Samsung phy driver use udelay
> in the same place). Changing to usleep_range brings up the following BUG:
> 
> BUG: scheduling while atomic: swapper/1/0x00000002
> Modules linked in:
> CPU: 0 PID: 1 Comm: swapper Not tainted 5.7.0-rc2-00001-gf9f8ac7cc48c-dirty #443
> Hardware name: Samsung S5PC110/S5PV210-based board
> [<c010c744>] (unwind_backtrace) from [<c010a114>] (show_stack+0x10/0x14)
> [<c010a114>] (show_stack) from [<c0139f24>] (__schedule_bug+0x70/0x84)
> [<c0139f24>] (__schedule_bug) from [<c073acc4>] (__schedule+0x38c/0x464)
> [<c073acc4>] (__schedule) from [<c073ae3c>] (schedule+0xa0/0x138)
> [<c073ae3c>] (schedule) from [<c073ee9c>] (schedule_hrtimeout_range_clock+0xd4/0x158)
> [<c073ee9c>] (schedule_hrtimeout_range_clock) from [<c073ef38>] (schedule_hrtimeout_range+0x18/0x20)
> [<c073ef38>] (schedule_hrtimeout_range) from [<c073e84c>] (usleep_range+0x68/0x8c)
> [<c073e84c>] (usleep_range) from [<c03e2e50>] (s5pv210_power_on+0xbc/0xe4)
> [<c03e2e50>] (s5pv210_power_on) from [<c03e2bf0>] (samsung_usb2_phy_power_on+0xec/0x16c)
> [<c03e2bf0>] (samsung_usb2_phy_power_on) from [<c03e1e14>] (phy_power_on+0x8c/0xdc)
> [<c03e1e14>] (phy_power_on) from [<c053ab4c>] (__dwc2_lowlevel_hw_enable+0xb8/0xcc)
> [<c053ab4c>] (__dwc2_lowlevel_hw_enable) from [<c053ae80>] (dwc2_driver_probe+0x1e4/0x580)
> [<c053ae80>] (dwc2_driver_probe) from [<c04b0e9c>] (platform_drv_probe+0x48/0x98)
> [<c04b0e9c>] (platform_drv_probe) from [<c04af098>] (really_probe+0x1e0/0x344)
> [<c04af098>] (really_probe) from [<c04af338>] (driver_probe_device+0x60/0x168)
> [<c04af338>] (driver_probe_device) from [<c04af5e0>] (device_driver_attach+0x58/0x60)
> [<c04af5e0>] (device_driver_attach) from [<c04af640>] (__driver_attach+0x58/0xcc)
> [<c04af640>] (__driver_attach) from [<c04ad348>] (bus_for_each_dev+0x74/0xb4)
> [<c04ad348>] (bus_for_each_dev) from [<c04ae510>] (bus_add_driver+0x1b4/0x1d4)
> [<c04ae510>] (bus_add_driver) from [<c04afee0>] (driver_register+0x74/0x108)
> [<c04afee0>] (driver_register) from [<c0101710>] (do_one_initcall+0x7c/0x1cc)
> [<c0101710>] (do_one_initcall) from [<c0a00ed8>] (kernel_init_freeable+0x15c/0x1d4)
> [<c0a00ed8>] (kernel_init_freeable) from [<c073a398>] (kernel_init+0x8/0x110)
> [<c073a398>] (kernel_init) from [<c0100148>] (ret_from_fork+0x14/0x2c)
> Exception stack(0xe745ffb0 to 0xe745fff8)
> ffa0:                                     00000000 00000000 00000000 00000000
> ffc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
> ffe0: 00000000 00000000 00000000 00000000 00000013 00000000
> dwc2 ec000000.hsotg: dwc2_check_params: Invalid parameter besl=1
> dwc2 ec000000.hsotg: dwc2_check_params: Invalid parameter g_np_tx_fifo_size=1024
> dwc2 ec000000.hsotg: EPs: 16, dedicated fifos, 7808 entries in SPRAM
> ------------[ cut here ]------------
> kernel BUG at mm/vmalloc.c:2101!
> Internal error: Oops - BUG: 0 [#1] PREEMPT ARM
> Modules linked in:
> CPU: 0 PID: 1 Comm: swapper Tainted: G        W         5.7.0-rc2-00001-gf9f8ac7cc48c-dirty #443
> Hardware name: Samsung S5PC110/S5PV210-based board
> PC is at __get_vm_area_node+0x174/0x178
> LR is at 0xe745e000
> pc : [<c01cf678>]    lr : [<e745e000>]    psr: 20000013
> sp : e745fc60  ip : 001fff00  fp : 00000038
> r10: e6cb9880  r9 : 00000001  r8 : c0161760
> r7 : e6cb98c0  r6 : 00000cc0  r5 : 00000247  r4 : e7fd2800
> r3 : e8800000  r2 : 00000010  r1 : ffffffff  r0 : 00001000
> Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment none
> Control: 10c5387d  Table: 30004019  DAC: 00000051
> Process swapper (pid: 1, stack limit = 0x(ptrval))
> Stack: (0xe745fc60 to 0xe7460000)
> fc60: ffffe000 c014d04c c09082c0 e7fd2800 00000247 e6cb98c0 e6cb98c0 c0161760
> fc80: 00000000 c01cf788 ff800000 ffffffff 00000cc0 c0161760 e7fd2800 c0162be4
> fca0: e7fd2800 00001000 00000247 c0162cd4 00000001 e7fd2800 00001000 00000247
> fcc0: ffffffff c010e384 e757c810 c0b03008 00000cc0 e76f3c48 ffffffff c010e3e4
> fce0: e745fd04 c0161760 00000001 e76f3c48 ffffffff c010e510 e7401c00 00000000
> fd00: c0166698 00000000 e757c810 00001000 00000cc0 00000247 c0161760 00000001
> fd20: 00000000 57579938 ffffe000 00000000 c0b03008 e757c810 00000008 00000cc0
> fd40: 00000000 e76f3c48 c0a27830 c010e6a8 00000247 00000000 00000000 c0161760
> fd60: c010e668 c0161760 00000000 c01e7e94 e76f3840 57579938 e6cbd1c0 00000cc0
> fd80: 00000000 00000008 e757c810 e76f3c48 00000000 c016182c 00000000 00000010
> fda0: e6cbd100 e76f3840 00000000 00000000 00000010 e757c810 c0b20994 c054176c
> fdc0: 00000000 00000000 c0b03008 e757c800 00000000 c0b03008 e757c800 e757c810
> fde0: e76f3840 c053afb0 00000080 e757a640 e76f3840 57579938 e757a600 57579938
> fe00: e757c810 e757c810 00000000 c0b20994 00000000 00000000 c0b20994 c04b0e9c
> fe20: c0b685f8 e757c810 c0b685fc 00000000 00000000 c04af098 e757c810 c0b20994
> fe40: c0b20994 c04af5e8 00000000 000000a9 c0a27850 c04af338 c0a27850 c05d8e30
> fe60: a0000013 e757c810 00000000 c0b20994 c04af5e8 00000000 000000a9 c0a27850
> fe80: c0a27830 c04af5e0 00000000 c0b20994 e757c810 c04af640 e75705b0 c0b03008
> fea0: c0b20994 c04ad348 000000a9 e743834c e75705b0 57579938 c0b1d920 c0b20994
> fec0: e6cb2c00 c0b1d920 00000000 c04ae510 c083e4dc ffffe000 c0b20994 c0b20994
> fee0: c0b03008 ffffe000 c0a1b950 c04afee0 c0b2fb80 c0b03008 ffffe000 c0101710
> ff00: e74385d6 c0134194 c0984550 c0919800 00000000 00000006 00000006 c08cf26c
> ff20: 00000000 c0b03008 c08d8c7c c08cf2e0 00000000 e74385bf 00000000 57579938
> ff40: 00000000 c0b2fb80 00000007 57579938 c0b2fb80 c0a33094 c0984550 00000007
> ff60: e7438540 c0a00ed8 00000006 00000006 00000000 c0a003f0 00000000 c0a003f0
> ff80: 00000000 00000000 c073a390 00000000 00000000 00000000 00000000 00000000
> ffa0: 00000000 c073a398 00000000 c0100148 00000000 00000000 00000000 00000000
> ffc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
> ffe0: 00000000 00000000 00000000 00000000 00000013 00000000 00000000 00000000
> [<c01cf678>] (__get_vm_area_node) from [<c01cf788>] (get_vm_area_caller+0x48/0x50)
> [<c01cf788>] (get_vm_area_caller) from [<c0162be4>] (__dma_common_pages_remap+0x1c/0x50)
> [<c0162be4>] (__dma_common_pages_remap) from [<c0162cd4>] (dma_common_contiguous_remap+0x7c/0xbc)
> [<c0162cd4>] (dma_common_contiguous_remap) from [<c010e384>] (__alloc_remap_buffer+0x50/0x88)
> [<c010e384>] (__alloc_remap_buffer) from [<c010e3e4>] (remap_allocator_alloc+0x28/0x30)
> [<c010e3e4>] (remap_allocator_alloc) from [<c010e510>] (__dma_alloc+0x124/0x240)
> [<c010e510>] (__dma_alloc) from [<c010e6a8>] (arm_dma_alloc+0x40/0x48)
> [<c010e6a8>] (arm_dma_alloc) from [<c0161760>] (dma_alloc_attrs+0x9c/0x110)
> [<c0161760>] (dma_alloc_attrs) from [<c016182c>] (dmam_alloc_attrs+0x58/0x98)
> [<c016182c>] (dmam_alloc_attrs) from [<c054176c>] (dwc2_gadget_init+0x31c/0x3fc)
> [<c054176c>] (dwc2_gadget_init) from [<c053afb0>] (dwc2_driver_probe+0x314/0x580)
> [<c053afb0>] (dwc2_driver_probe) from [<c04b0e9c>] (platform_drv_probe+0x48/0x98)
> [<c04b0e9c>] (platform_drv_probe) from [<c04af098>] (really_probe+0x1e0/0x344)
> [<c04af098>] (really_probe) from [<c04af338>] (driver_probe_device+0x60/0x168)
> [<c04af338>] (driver_probe_device) from [<c04af5e0>] (device_driver_attach+0x58/0x60)
> [<c04af5e0>] (device_driver_attach) from [<c04af640>] (__driver_attach+0x58/0xcc)
> [<c04af640>] (__driver_attach) from [<c04ad348>] (bus_for_each_dev+0x74/0xb4)
> [<c04ad348>] (bus_for_each_dev) from [<c04ae510>] (bus_add_driver+0x1b4/0x1d4)
> [<c04ae510>] (bus_add_driver) from [<c04afee0>] (driver_register+0x74/0x108)
> [<c04afee0>] (driver_register) from [<c0101710>] (do_one_initcall+0x7c/0x1cc)
> [<c0101710>] (do_one_initcall) from [<c0a00ed8>] (kernel_init_freeable+0x15c/0x1d4)
> [<c0a00ed8>] (kernel_init_freeable) from [<c073a398>] (kernel_init+0x8/0x110)
> [<c073a398>] (kernel_init) from [<c0100148>] (ret_from_fork+0x14/0x2c)
> Exception stack(0xe745ffb0 to 0xe745fff8)
> ffa0:                                     00000000 00000000 00000000 00000000
> ffc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
> ffe0: 00000000 00000000 00000000 00000000 00000013 00000000
> Code: eb005d92 e1a00008 e28dd00c e8bd83f0 (e7f001f2) 
> ---[ end trace 4ae52726a37c07c2 ]---
> Kernel panic - not syncing: Fatal exception in interrupt
> ---[ end Kernel panic - not syncing: Fatal exception in interrupt ]---
> 
>>
>> Thanks
>> Kishon
>>
> 
> 
> Thanks,
> Jonathan
>
Kishon Vijay Abraham I May 13, 2020, 2:20 a.m. UTC | #4
On 4/25/2020 11:06 PM, Jonathan Bakker wrote:
> The USB phy takes some time to reset, so make sure we give it to it. The
> delay length was taken from the 4x12 phy driver.
> 
> This manifested in issues with the DWC2 driver since commit fe369e1826b3
> ("usb: dwc2: Make dwc2_readl/writel functions endianness-agnostic.")
> where the endianness check would read the DWC ID as 0 due to the phy still
> resetting, resulting in the wrong endian mode being chosen.
> 
> Signed-off-by: Jonathan Bakker <xc-racer2@live.ca>

merged, thanks!

-Kishon
> ---
>  drivers/phy/samsung/phy-s5pv210-usb2.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/phy/samsung/phy-s5pv210-usb2.c b/drivers/phy/samsung/phy-s5pv210-usb2.c
> index 56a5083fe6f9..32be62e49804 100644
> --- a/drivers/phy/samsung/phy-s5pv210-usb2.c
> +++ b/drivers/phy/samsung/phy-s5pv210-usb2.c
> @@ -139,6 +139,10 @@ static void s5pv210_phy_pwr(struct samsung_usb2_phy_instance *inst, bool on)
>  		udelay(10);
>  		rst &= ~rstbits;
>  		writel(rst, drv->reg_phy + S5PV210_UPHYRST);
> +		/* The following delay is necessary for the reset sequence to be
> +		 * completed
> +		 */
> +		udelay(80);
>  	} else {
>  		pwr = readl(drv->reg_phy + S5PV210_UPHYPWR);
>  		pwr |= phypwr;
>

Patch
diff mbox series

diff --git a/drivers/phy/samsung/phy-s5pv210-usb2.c b/drivers/phy/samsung/phy-s5pv210-usb2.c
index 56a5083fe6f9..32be62e49804 100644
--- a/drivers/phy/samsung/phy-s5pv210-usb2.c
+++ b/drivers/phy/samsung/phy-s5pv210-usb2.c
@@ -139,6 +139,10 @@  static void s5pv210_phy_pwr(struct samsung_usb2_phy_instance *inst, bool on)
 		udelay(10);
 		rst &= ~rstbits;
 		writel(rst, drv->reg_phy + S5PV210_UPHYRST);
+		/* The following delay is necessary for the reset sequence to be
+		 * completed
+		 */
+		udelay(80);
 	} else {
 		pwr = readl(drv->reg_phy + S5PV210_UPHYPWR);
 		pwr |= phypwr;