phy: renesas: rcar-gen3-usb2: fix imbalance powered flag
diff mbox series

Message ID 1559710142-29161-1-git-send-email-yoshihiro.shimoda.uh@renesas.com
State Superseded
Delegated to: Geert Uytterhoeven
Headers show
Series
  • phy: renesas: rcar-gen3-usb2: fix imbalance powered flag
Related show

Commit Message

Yoshihiro Shimoda June 5, 2019, 4:49 a.m. UTC
The powered flag should be set for any other phys anyway. Otherwise,
after we have revised the device tree for the usb phy, the following
warning happened during a second system suspend. So, this patch fixes
the issue.

[   56.026531] unbalanced disables for USB20_VBUS0
[   56.031108] WARNING: CPU: 3 PID: 513 at drivers/regulator/core.c:2593 _regula
tor_disable+0xe0/0x1c0
[   56.040146] Modules linked in: rcar_du_drm rcar_lvds drm_kms_helper drm drm_p
anel_orientation_quirks vsp1 videobuf2_vmalloc videobuf2_dma_contig videobuf2_me
mops videobuf2_v4l2 videobuf2_common videodev snd_soc_rcar renesas_usbhs snd_soc
_audio_graph_card media snd_soc_simple_card_utils crct10dif_ce renesas_usb3 snd_
soc_ak4613 rcar_fcp pwm_rcar usb_dmac phy_rcar_gen3_usb3 pwm_bl ipv6
[   56.074047] CPU: 3 PID: 513 Comm: kworker/u16:19 Not tainted 5.2.0-rc3-00001-
g5f20a19 #6
[   56.082129] Hardware name: Renesas Salvator-X board based on r8a7795 ES2.0+ (
DT)
[   56.089524] Workqueue: events_unbound async_run_entry_fn
[   56.094832] pstate: 40000005 (nZcv daif -PAN -UAO)
[   56.099617] pc : _regulator_disable+0xe0/0x1c0
[   56.104054] lr : _regulator_disable+0xe0/0x1c0
[   56.108489] sp : ffff0000121c3ae0
[   56.111796] x29: ffff0000121c3ae0 x28: 0000000000000000
[   56.117102] x27: 0000000000000000 x26: ffff000010fe0e60
[   56.122407] x25: 0000000000000002 x24: 0000000000000001
[   56.127712] x23: 0000000000000002 x22: ffff8006f99d4000
[   56.133017] x21: ffff8006f99cc000 x20: ffff8006f9846800
[   56.138322] x19: ffff8006f9846800 x18: ffffffffffffffff
[   56.143626] x17: 0000000000000000 x16: 0000000000000000
[   56.148931] x15: ffff0000112f96c8 x14: ffff0000921c37f7
[   56.154235] x13: ffff0000121c3805 x12: ffff000011312000
[   56.159540] x11: 0000000005f5e0ff x10: ffff0000112f9f20
[   56.164844] x9 : ffff0000112d3018 x8 : 00000000000001ad
[   56.170149] x7 : 00000000ffffffcc x6 : ffff8006ff768180
[   56.175453] x5 : ffff8006ff768180 x4 : 0000000000000000
[   56.180758] x3 : ffff8006ff76ef10 x2 : ffff8006ff768180
[   56.186062] x1 : 3d2eccbaead8fb00 x0 : 0000000000000000
[   56.191367] Call trace:
[   56.193808]  _regulator_disable+0xe0/0x1c0
[   56.197899]  regulator_disable+0x40/0x78
[   56.201820]  rcar_gen3_phy_usb2_power_off+0x3c/0x50
[   56.206692]  phy_power_off+0x48/0xd8
[   56.210263]  usb_phy_roothub_power_off+0x30/0x50
[   56.214873]  usb_phy_roothub_suspend+0x1c/0x50
[   56.219311]  hcd_bus_suspend+0x13c/0x168
[   56.223226]  generic_suspend+0x4c/0x58
[   56.226969]  usb_suspend_both+0x1ac/0x238
[   56.230972]  usb_suspend+0xcc/0x170
[   56.234455]  usb_dev_suspend+0x10/0x18
[   56.238199]  dpm_run_callback.isra.6+0x20/0x68
[   56.242635]  __device_suspend+0x110/0x308
[   56.246637]  async_suspend+0x24/0xa8
[   56.250205]  async_run_entry_fn+0x40/0xf8
[   56.254210]  process_one_work+0x1e0/0x320
[   56.258211]  worker_thread+0x40/0x450
[   56.261867]  kthread+0x124/0x128
[   56.265094]  ret_from_fork+0x10/0x18
[   56.268661] ---[ end trace 86d7ec5de5c517af ]---
[   56.273290] phy phy-ee080200.usb-phy.10: phy poweroff failed --> -5

Reported-by: Geert Uytterhoeven <geert+renesas@glider.be>
Fixes: 549b6b55b005 ("phy: renesas: rcar-gen3-usb2: enable/disable independent irqs")
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
---
 drivers/phy/renesas/phy-rcar-gen3-usb2.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

Comments

Geert Uytterhoeven June 5, 2019, 9:25 a.m. UTC | #1
Hi Shimoda-san,

On Wed, Jun 5, 2019 at 6:54 AM Yoshihiro Shimoda
<yoshihiro.shimoda.uh@renesas.com> wrote:
> The powered flag should be set for any other phys anyway. Otherwise,
> after we have revised the device tree for the usb phy, the following
> warning happened during a second system suspend. So, this patch fixes
> the issue.
>
> [   56.026531] unbalanced disables for USB20_VBUS0
> [   56.031108] WARNING: CPU: 3 PID: 513 at drivers/regulator/core.c:2593 _regula
> tor_disable+0xe0/0x1c0
> [   56.040146] Modules linked in: rcar_du_drm rcar_lvds drm_kms_helper drm drm_p
> anel_orientation_quirks vsp1 videobuf2_vmalloc videobuf2_dma_contig videobuf2_me
> mops videobuf2_v4l2 videobuf2_common videodev snd_soc_rcar renesas_usbhs snd_soc
> _audio_graph_card media snd_soc_simple_card_utils crct10dif_ce renesas_usb3 snd_
> soc_ak4613 rcar_fcp pwm_rcar usb_dmac phy_rcar_gen3_usb3 pwm_bl ipv6
> [   56.074047] CPU: 3 PID: 513 Comm: kworker/u16:19 Not tainted 5.2.0-rc3-00001-
> g5f20a19 #6
> [   56.082129] Hardware name: Renesas Salvator-X board based on r8a7795 ES2.0+ (
> DT)
> [   56.089524] Workqueue: events_unbound async_run_entry_fn
> [   56.094832] pstate: 40000005 (nZcv daif -PAN -UAO)
> [   56.099617] pc : _regulator_disable+0xe0/0x1c0
> [   56.104054] lr : _regulator_disable+0xe0/0x1c0
> [   56.108489] sp : ffff0000121c3ae0
> [   56.111796] x29: ffff0000121c3ae0 x28: 0000000000000000
> [   56.117102] x27: 0000000000000000 x26: ffff000010fe0e60
> [   56.122407] x25: 0000000000000002 x24: 0000000000000001
> [   56.127712] x23: 0000000000000002 x22: ffff8006f99d4000
> [   56.133017] x21: ffff8006f99cc000 x20: ffff8006f9846800
> [   56.138322] x19: ffff8006f9846800 x18: ffffffffffffffff
> [   56.143626] x17: 0000000000000000 x16: 0000000000000000
> [   56.148931] x15: ffff0000112f96c8 x14: ffff0000921c37f7
> [   56.154235] x13: ffff0000121c3805 x12: ffff000011312000
> [   56.159540] x11: 0000000005f5e0ff x10: ffff0000112f9f20
> [   56.164844] x9 : ffff0000112d3018 x8 : 00000000000001ad
> [   56.170149] x7 : 00000000ffffffcc x6 : ffff8006ff768180
> [   56.175453] x5 : ffff8006ff768180 x4 : 0000000000000000
> [   56.180758] x3 : ffff8006ff76ef10 x2 : ffff8006ff768180
> [   56.186062] x1 : 3d2eccbaead8fb00 x0 : 0000000000000000
> [   56.191367] Call trace:
> [   56.193808]  _regulator_disable+0xe0/0x1c0
> [   56.197899]  regulator_disable+0x40/0x78
> [   56.201820]  rcar_gen3_phy_usb2_power_off+0x3c/0x50
> [   56.206692]  phy_power_off+0x48/0xd8
> [   56.210263]  usb_phy_roothub_power_off+0x30/0x50
> [   56.214873]  usb_phy_roothub_suspend+0x1c/0x50
> [   56.219311]  hcd_bus_suspend+0x13c/0x168
> [   56.223226]  generic_suspend+0x4c/0x58
> [   56.226969]  usb_suspend_both+0x1ac/0x238
> [   56.230972]  usb_suspend+0xcc/0x170
> [   56.234455]  usb_dev_suspend+0x10/0x18
> [   56.238199]  dpm_run_callback.isra.6+0x20/0x68
> [   56.242635]  __device_suspend+0x110/0x308
> [   56.246637]  async_suspend+0x24/0xa8
> [   56.250205]  async_run_entry_fn+0x40/0xf8
> [   56.254210]  process_one_work+0x1e0/0x320
> [   56.258211]  worker_thread+0x40/0x450
> [   56.261867]  kthread+0x124/0x128
> [   56.265094]  ret_from_fork+0x10/0x18
> [   56.268661] ---[ end trace 86d7ec5de5c517af ]---
> [   56.273290] phy phy-ee080200.usb-phy.10: phy poweroff failed --> -5
>
> Reported-by: Geert Uytterhoeven <geert+renesas@glider.be>
> Fixes: 549b6b55b005 ("phy: renesas: rcar-gen3-usb2: enable/disable independent irqs")
> Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>

Thank you, this seems to fix the warning, so
Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>

However, the other imbalance (phy-ee080200.usb-phy.6 enabling its
regulator during each system resume phase, but never touching it
otherwise) is still present.

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds
Yoshihiro Shimoda June 5, 2019, 12:12 p.m. UTC | #2
Hi Geert-san,

> From: Geert Uytterhoeven, Sent: Wednesday, June 5, 2019 6:25 PM
<snip>
> Thank you, this seems to fix the warning, so
> Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>

Thank you for the testing!

> However, the other imbalance (phy-ee080200.usb-phy.6 enabling its
> regulator during each system resume phase, but never touching it
> otherwise) is still present.

Umm, since I'd like to investigate this,
would you share your debug print patch?

Best regards,
Yoshihiro Shimoda
Geert Uytterhoeven June 5, 2019, 1:08 p.m. UTC | #3
Hi Shimoda-san,

On Wed, Jun 5, 2019 at 2:12 PM Yoshihiro Shimoda
<yoshihiro.shimoda.uh@renesas.com> wrote:
> > From: Geert Uytterhoeven, Sent: Wednesday, June 5, 2019 6:25 PM
> <snip>
> > Thank you, this seems to fix the warning, so
> > Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
>
> Thank you for the testing!
>
> > However, the other imbalance (phy-ee080200.usb-phy.6 enabling its
> > regulator during each system resume phase, but never touching it
> > otherwise) is still present.
>
> Umm, since I'd like to investigate this,
> would you share your debug print patch?

Attached.

Thanks!

Gr{oetje,eeting}s,

                        Geert
Yoshihiro Shimoda June 7, 2019, 9 a.m. UTC | #4
Hi Geert-san,

> From: Geert Uytterhoeven, Sent: Wednesday, June 5, 2019 10:08 PM
<snip>
> > > From: Geert Uytterhoeven, Sent: Wednesday, June 5, 2019 6:25 PM
> > <snip>
> > > Thank you, this seems to fix the warning, so
> > > Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
> >
> > Thank you for the testing!
> >
> > > However, the other imbalance (phy-ee080200.usb-phy.6 enabling its
> > > regulator during each system resume phase, but never touching it
> > > otherwise) is still present.
> >
> > Umm, since I'd like to investigate this,
> > would you share your debug print patch?
> 
> Attached.

Thank you for your patch. Finally, I found the other imbalance is caused by
rcar_gen3_phy_usb2_power_on(). rcar_gen3_phy_usb2_power_on() should have
own mutex lock to avoid a race condition between calls rcar_gen3_are_all_rphys_power_off()
and assign the ->powered. So, I'll submit v2 patch later.

Notes:
 - Even if the driver has such an own mutex, sometimes the different phy number
   enables the regulator. But the imbalance enabling the regulator issue disappears.

 - One of the phy channel has 4 phy devices. And the phy channel has a regulator
   so that enabling the regulator by one of the phy devices is enough.

--- Example (v5.2-rc3 on R-Car H3) ---
# ls /sys/class/phy/
phy-e65ee000.usb-phy.12  phy-ee0a0200.usb-phy.0  phy-ee0c0200.usb-phy.5
phy-ee080200.usb-phy.10  phy-ee0a0200.usb-phy.1  phy-ee0c0200.usb-phy.6
phy-ee080200.usb-phy.11  phy-ee0a0200.usb-phy.2  phy-ee0c0200.usb-phy.7
phy-ee080200.usb-phy.8   phy-ee0a0200.usb-phy.3
phy-ee080200.usb-phy.9   phy-ee0c0200.usb-phy.4

- phy-ee080200.usb-phy is one of the phy channel.
-- And the "phy-ee080200.usb-phy" phy channel has a regulator.
-- Other phy channels (phy-ee0[ac]0200.usb-phy) don't have their regulators.

- phy-ee080200.usb-phy.{8,9,10,11} are phy devices.
----

Best regards,
Yoshihiro Shimoda

Patch
diff mbox series

diff --git a/drivers/phy/renesas/phy-rcar-gen3-usb2.c b/drivers/phy/renesas/phy-rcar-gen3-usb2.c
index 1322185..dd2d7290 100644
--- a/drivers/phy/renesas/phy-rcar-gen3-usb2.c
+++ b/drivers/phy/renesas/phy-rcar-gen3-usb2.c
@@ -437,15 +437,15 @@  static int rcar_gen3_phy_usb2_power_on(struct phy *p)
 	struct rcar_gen3_chan *channel = rphy->ch;
 	void __iomem *usb2_base = channel->base;
 	u32 val;
-	int ret;
+	int ret = 0;
 
 	if (!rcar_gen3_are_all_rphys_power_off(channel))
-		return 0;
+		goto out;
 
 	if (channel->vbus) {
 		ret = regulator_enable(channel->vbus);
 		if (ret)
-			return ret;
+			goto out;
 	}
 
 	val = readl(usb2_base + USB2_USBCTR);
@@ -454,6 +454,8 @@  static int rcar_gen3_phy_usb2_power_on(struct phy *p)
 	val &= ~USB2_USBCTR_PLL_RST;
 	writel(val, usb2_base + USB2_USBCTR);
 
+out:
+	/* The powered flag should be set for any other phys anyway */
 	rphy->powered = true;
 
 	return 0;