Re: [PATCH] phy: samsung: s5pv210-usb2: Add delay after reset
From: Jonathan Bakker
Date: Tue Apr 28 2020 - 17:50:24 EST
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@xxxxxxx>
>> ---
>> 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