+++ /dev/null
-From 54c4c58713aaff76c2422ff5750e557ab3b100d7 Mon Sep 17 00:00:00 2001
-From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
-Date: Wed, 7 May 2025 15:50:28 +0300
-Subject: phy: renesas: rcar-gen3-usb2: Fix role detection on unbind/bind
-
-From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
-
-commit 54c4c58713aaff76c2422ff5750e557ab3b100d7 upstream.
-
-It has been observed on the Renesas RZ/G3S SoC that unbinding and binding
-the PHY driver leads to role autodetection failures. This issue occurs when
-PHY 3 is the first initialized PHY. PHY 3 does not have an interrupt
-associated with the USB2_INT_ENABLE register (as
-rcar_gen3_int_enable[3] = 0). As a result, rcar_gen3_init_otg() is called
-to initialize OTG without enabling PHY interrupts.
-
-To resolve this, add rcar_gen3_is_any_otg_rphy_initialized() and call it in
-role_store(), role_show(), and rcar_gen3_init_otg(). At the same time,
-rcar_gen3_init_otg() is only called when initialization for a PHY with
-interrupt bits is in progress. As a result, the
-struct rcar_gen3_phy::otg_initialized is no longer needed.
-
-Fixes: 549b6b55b005 ("phy: renesas: rcar-gen3-usb2: enable/disable independent irqs")
-Cc: stable@vger.kernel.org
-Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
-Tested-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
-Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
-Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
-Link: https://lore.kernel.org/r/20250507125032.565017-2-claudiu.beznea.uj@bp.renesas.com
-Signed-off-by: Vinod Koul <vkoul@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/phy/renesas/phy-rcar-gen3-usb2.c | 33 +++++++++++++------------------
- 1 file changed, 14 insertions(+), 19 deletions(-)
-
---- a/drivers/phy/renesas/phy-rcar-gen3-usb2.c
-+++ b/drivers/phy/renesas/phy-rcar-gen3-usb2.c
-@@ -98,7 +98,6 @@ struct rcar_gen3_phy {
- struct rcar_gen3_chan *ch;
- u32 int_enable_bits;
- bool initialized;
-- bool otg_initialized;
- bool powered;
- };
-
-@@ -288,16 +287,15 @@ static bool rcar_gen3_is_any_rphy_initia
- return false;
- }
-
--static bool rcar_gen3_needs_init_otg(struct rcar_gen3_chan *ch)
-+static bool rcar_gen3_is_any_otg_rphy_initialized(struct rcar_gen3_chan *ch)
- {
-- int i;
--
-- for (i = 0; i < NUM_OF_PHYS; i++) {
-- if (ch->rphys[i].otg_initialized)
-- return false;
-+ for (enum rcar_gen3_phy_index i = PHY_INDEX_BOTH_HC; i <= PHY_INDEX_EHCI;
-+ i++) {
-+ if (ch->rphys[i].initialized)
-+ return true;
- }
-
-- return true;
-+ return false;
- }
-
- static bool rcar_gen3_are_all_rphys_power_off(struct rcar_gen3_chan *ch)
-@@ -319,7 +317,7 @@ static ssize_t role_store(struct device
- bool is_b_device;
- enum phy_mode cur_mode, new_mode;
-
-- if (!ch->is_otg_channel || !rcar_gen3_is_any_rphy_initialized(ch))
-+ if (!ch->is_otg_channel || !rcar_gen3_is_any_otg_rphy_initialized(ch))
- return -EIO;
-
- if (sysfs_streq(buf, "host"))
-@@ -357,7 +355,7 @@ static ssize_t role_show(struct device *
- {
- struct rcar_gen3_chan *ch = dev_get_drvdata(dev);
-
-- if (!ch->is_otg_channel || !rcar_gen3_is_any_rphy_initialized(ch))
-+ if (!ch->is_otg_channel || !rcar_gen3_is_any_otg_rphy_initialized(ch))
- return -EIO;
-
- return sprintf(buf, "%s\n", rcar_gen3_is_host(ch) ? "host" :
-@@ -370,6 +368,9 @@ static void rcar_gen3_init_otg(struct rc
- void __iomem *usb2_base = ch->base;
- u32 val;
-
-+ if (!ch->is_otg_channel || rcar_gen3_is_any_otg_rphy_initialized(ch))
-+ return;
-+
- /* Should not use functions of read-modify-write a register */
- val = readl(usb2_base + USB2_LINECTRL1);
- val = (val & ~USB2_LINECTRL1_DP_RPD) | USB2_LINECTRL1_DPRPD_EN |
-@@ -432,12 +433,9 @@ static int rcar_gen3_phy_usb2_init(struc
- writel(USB2_SPD_RSM_TIMSET_INIT, usb2_base + USB2_SPD_RSM_TIMSET);
- writel(USB2_OC_TIMSET_INIT, usb2_base + USB2_OC_TIMSET);
-
-- /* Initialize otg part */
-- if (channel->is_otg_channel) {
-- if (rcar_gen3_needs_init_otg(channel))
-- rcar_gen3_init_otg(channel);
-- rphy->otg_initialized = true;
-- }
-+ /* Initialize otg part (only if we initialize a PHY with IRQs). */
-+ if (rphy->int_enable_bits)
-+ rcar_gen3_init_otg(channel);
-
- rphy->initialized = true;
-
-@@ -453,9 +451,6 @@ static int rcar_gen3_phy_usb2_exit(struc
-
- rphy->initialized = false;
-
-- if (channel->is_otg_channel)
-- rphy->otg_initialized = false;
--
- val = readl(usb2_base + USB2_INT_ENABLE);
- val &= ~rphy->int_enable_bits;
- if (!rcar_gen3_is_any_rphy_initialized(channel))
--- a/drivers/phy/renesas/phy-rcar-gen3-usb2.c
+++ b/drivers/phy/renesas/phy-rcar-gen3-usb2.c
-@@ -430,8 +430,11 @@ static int rcar_gen3_phy_usb2_init(struc
+@@ -429,8 +429,11 @@ static int rcar_gen3_phy_usb2_init(struc
val = readl(usb2_base + USB2_INT_ENABLE);
val |= USB2_INT_ENABLE_UCOM_INTEN | rphy->int_enable_bits;
writel(val, usb2_base + USB2_INT_ENABLE);
+ writel(USB2_OC_TIMSET_INIT, usb2_base + USB2_OC_TIMSET);
+ }
- /* Initialize otg part (only if we initialize a PHY with IRQs). */
- if (rphy->int_enable_bits)
+ /* Initialize otg part */
+ if (channel->is_otg_channel) {
alsa-es1968-add-error-handling-for-snd_pcm_hw_constraint_pow2.patch
tracing-samples-initialize-trace_array_printk-with-the-correct-function.patch
phy-fix-error-handling-in-tegra_xusb_port_init.patch
-phy-renesas-rcar-gen3-usb2-fix-role-detection-on-unbind-bind.patch
phy-renesas-rcar-gen3-usb2-set-timing-registers-only-once.patch
wifi-mt76-disable-napi-on-driver-removal.patch
dmaengine-ti-k3-udma-add-missing-locking.patch
+++ /dev/null
-From 54c4c58713aaff76c2422ff5750e557ab3b100d7 Mon Sep 17 00:00:00 2001
-From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
-Date: Wed, 7 May 2025 15:50:28 +0300
-Subject: phy: renesas: rcar-gen3-usb2: Fix role detection on unbind/bind
-
-From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
-
-commit 54c4c58713aaff76c2422ff5750e557ab3b100d7 upstream.
-
-It has been observed on the Renesas RZ/G3S SoC that unbinding and binding
-the PHY driver leads to role autodetection failures. This issue occurs when
-PHY 3 is the first initialized PHY. PHY 3 does not have an interrupt
-associated with the USB2_INT_ENABLE register (as
-rcar_gen3_int_enable[3] = 0). As a result, rcar_gen3_init_otg() is called
-to initialize OTG without enabling PHY interrupts.
-
-To resolve this, add rcar_gen3_is_any_otg_rphy_initialized() and call it in
-role_store(), role_show(), and rcar_gen3_init_otg(). At the same time,
-rcar_gen3_init_otg() is only called when initialization for a PHY with
-interrupt bits is in progress. As a result, the
-struct rcar_gen3_phy::otg_initialized is no longer needed.
-
-Fixes: 549b6b55b005 ("phy: renesas: rcar-gen3-usb2: enable/disable independent irqs")
-Cc: stable@vger.kernel.org
-Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
-Tested-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
-Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
-Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
-Link: https://lore.kernel.org/r/20250507125032.565017-2-claudiu.beznea.uj@bp.renesas.com
-Signed-off-by: Vinod Koul <vkoul@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/phy/renesas/phy-rcar-gen3-usb2.c | 33 +++++++++++++------------------
- 1 file changed, 14 insertions(+), 19 deletions(-)
-
---- a/drivers/phy/renesas/phy-rcar-gen3-usb2.c
-+++ b/drivers/phy/renesas/phy-rcar-gen3-usb2.c
-@@ -103,7 +103,6 @@ struct rcar_gen3_phy {
- struct rcar_gen3_chan *ch;
- u32 int_enable_bits;
- bool initialized;
-- bool otg_initialized;
- bool powered;
- };
-
-@@ -311,16 +310,15 @@ static bool rcar_gen3_is_any_rphy_initia
- return false;
- }
-
--static bool rcar_gen3_needs_init_otg(struct rcar_gen3_chan *ch)
-+static bool rcar_gen3_is_any_otg_rphy_initialized(struct rcar_gen3_chan *ch)
- {
-- int i;
--
-- for (i = 0; i < NUM_OF_PHYS; i++) {
-- if (ch->rphys[i].otg_initialized)
-- return false;
-+ for (enum rcar_gen3_phy_index i = PHY_INDEX_BOTH_HC; i <= PHY_INDEX_EHCI;
-+ i++) {
-+ if (ch->rphys[i].initialized)
-+ return true;
- }
-
-- return true;
-+ return false;
- }
-
- static bool rcar_gen3_are_all_rphys_power_off(struct rcar_gen3_chan *ch)
-@@ -342,7 +340,7 @@ static ssize_t role_store(struct device
- bool is_b_device;
- enum phy_mode cur_mode, new_mode;
-
-- if (!ch->is_otg_channel || !rcar_gen3_is_any_rphy_initialized(ch))
-+ if (!ch->is_otg_channel || !rcar_gen3_is_any_otg_rphy_initialized(ch))
- return -EIO;
-
- if (sysfs_streq(buf, "host"))
-@@ -380,7 +378,7 @@ static ssize_t role_show(struct device *
- {
- struct rcar_gen3_chan *ch = dev_get_drvdata(dev);
-
-- if (!ch->is_otg_channel || !rcar_gen3_is_any_rphy_initialized(ch))
-+ if (!ch->is_otg_channel || !rcar_gen3_is_any_otg_rphy_initialized(ch))
- return -EIO;
-
- return sprintf(buf, "%s\n", rcar_gen3_is_host(ch) ? "host" :
-@@ -393,6 +391,9 @@ static void rcar_gen3_init_otg(struct rc
- void __iomem *usb2_base = ch->base;
- u32 val;
-
-+ if (!ch->is_otg_channel || rcar_gen3_is_any_otg_rphy_initialized(ch))
-+ return;
-+
- /* Should not use functions of read-modify-write a register */
- val = readl(usb2_base + USB2_LINECTRL1);
- val = (val & ~USB2_LINECTRL1_DP_RPD) | USB2_LINECTRL1_DPRPD_EN |
-@@ -456,12 +457,9 @@ static int rcar_gen3_phy_usb2_init(struc
- writel(USB2_SPD_RSM_TIMSET_INIT, usb2_base + USB2_SPD_RSM_TIMSET);
- writel(USB2_OC_TIMSET_INIT, usb2_base + USB2_OC_TIMSET);
-
-- /* Initialize otg part */
-- if (channel->is_otg_channel) {
-- if (rcar_gen3_needs_init_otg(channel))
-- rcar_gen3_init_otg(channel);
-- rphy->otg_initialized = true;
-- }
-+ /* Initialize otg part (only if we initialize a PHY with IRQs). */
-+ if (rphy->int_enable_bits)
-+ rcar_gen3_init_otg(channel);
-
- rphy->initialized = true;
-
-@@ -477,9 +475,6 @@ static int rcar_gen3_phy_usb2_exit(struc
-
- rphy->initialized = false;
-
-- if (channel->is_otg_channel)
-- rphy->otg_initialized = false;
--
- val = readl(usb2_base + USB2_INT_ENABLE);
- val &= ~rphy->int_enable_bits;
- if (!rcar_gen3_is_any_rphy_initialized(channel))
--- a/drivers/phy/renesas/phy-rcar-gen3-usb2.c
+++ b/drivers/phy/renesas/phy-rcar-gen3-usb2.c
-@@ -454,8 +454,11 @@ static int rcar_gen3_phy_usb2_init(struc
+@@ -453,8 +453,11 @@ static int rcar_gen3_phy_usb2_init(struc
val = readl(usb2_base + USB2_INT_ENABLE);
val |= USB2_INT_ENABLE_UCOM_INTEN | rphy->int_enable_bits;
writel(val, usb2_base + USB2_INT_ENABLE);
+ writel(USB2_OC_TIMSET_INIT, usb2_base + USB2_OC_TIMSET);
+ }
- /* Initialize otg part (only if we initialize a PHY with IRQs). */
- if (rphy->int_enable_bits)
+ /* Initialize otg part */
+ if (channel->is_otg_channel) {
ftrace-fix-preemption-accounting-for-stacktrace-filter-command.patch
tracing-samples-initialize-trace_array_printk-with-the-correct-function.patch
phy-fix-error-handling-in-tegra_xusb_port_init.patch
-phy-renesas-rcar-gen3-usb2-fix-role-detection-on-unbind-bind.patch
phy-renesas-rcar-gen3-usb2-set-timing-registers-only-once.patch
wifi-mt76-disable-napi-on-driver-removal.patch
dmaengine-ti-k3-udma-add-missing-locking.patch
+++ /dev/null
-From 54c4c58713aaff76c2422ff5750e557ab3b100d7 Mon Sep 17 00:00:00 2001
-From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
-Date: Wed, 7 May 2025 15:50:28 +0300
-Subject: phy: renesas: rcar-gen3-usb2: Fix role detection on unbind/bind
-
-From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
-
-commit 54c4c58713aaff76c2422ff5750e557ab3b100d7 upstream.
-
-It has been observed on the Renesas RZ/G3S SoC that unbinding and binding
-the PHY driver leads to role autodetection failures. This issue occurs when
-PHY 3 is the first initialized PHY. PHY 3 does not have an interrupt
-associated with the USB2_INT_ENABLE register (as
-rcar_gen3_int_enable[3] = 0). As a result, rcar_gen3_init_otg() is called
-to initialize OTG without enabling PHY interrupts.
-
-To resolve this, add rcar_gen3_is_any_otg_rphy_initialized() and call it in
-role_store(), role_show(), and rcar_gen3_init_otg(). At the same time,
-rcar_gen3_init_otg() is only called when initialization for a PHY with
-interrupt bits is in progress. As a result, the
-struct rcar_gen3_phy::otg_initialized is no longer needed.
-
-Fixes: 549b6b55b005 ("phy: renesas: rcar-gen3-usb2: enable/disable independent irqs")
-Cc: stable@vger.kernel.org
-Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
-Tested-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
-Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
-Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
-Link: https://lore.kernel.org/r/20250507125032.565017-2-claudiu.beznea.uj@bp.renesas.com
-Signed-off-by: Vinod Koul <vkoul@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/phy/renesas/phy-rcar-gen3-usb2.c | 33 +++++++++++++------------------
- 1 file changed, 14 insertions(+), 19 deletions(-)
-
---- a/drivers/phy/renesas/phy-rcar-gen3-usb2.c
-+++ b/drivers/phy/renesas/phy-rcar-gen3-usb2.c
-@@ -98,7 +98,6 @@ struct rcar_gen3_phy {
- struct rcar_gen3_chan *ch;
- u32 int_enable_bits;
- bool initialized;
-- bool otg_initialized;
- bool powered;
- };
-
-@@ -288,16 +287,15 @@ static bool rcar_gen3_is_any_rphy_initia
- return false;
- }
-
--static bool rcar_gen3_needs_init_otg(struct rcar_gen3_chan *ch)
-+static bool rcar_gen3_is_any_otg_rphy_initialized(struct rcar_gen3_chan *ch)
- {
-- int i;
--
-- for (i = 0; i < NUM_OF_PHYS; i++) {
-- if (ch->rphys[i].otg_initialized)
-- return false;
-+ for (enum rcar_gen3_phy_index i = PHY_INDEX_BOTH_HC; i <= PHY_INDEX_EHCI;
-+ i++) {
-+ if (ch->rphys[i].initialized)
-+ return true;
- }
-
-- return true;
-+ return false;
- }
-
- static bool rcar_gen3_are_all_rphys_power_off(struct rcar_gen3_chan *ch)
-@@ -319,7 +317,7 @@ static ssize_t role_store(struct device
- bool is_b_device;
- enum phy_mode cur_mode, new_mode;
-
-- if (!ch->is_otg_channel || !rcar_gen3_is_any_rphy_initialized(ch))
-+ if (!ch->is_otg_channel || !rcar_gen3_is_any_otg_rphy_initialized(ch))
- return -EIO;
-
- if (sysfs_streq(buf, "host"))
-@@ -357,7 +355,7 @@ static ssize_t role_show(struct device *
- {
- struct rcar_gen3_chan *ch = dev_get_drvdata(dev);
-
-- if (!ch->is_otg_channel || !rcar_gen3_is_any_rphy_initialized(ch))
-+ if (!ch->is_otg_channel || !rcar_gen3_is_any_otg_rphy_initialized(ch))
- return -EIO;
-
- return sprintf(buf, "%s\n", rcar_gen3_is_host(ch) ? "host" :
-@@ -370,6 +368,9 @@ static void rcar_gen3_init_otg(struct rc
- void __iomem *usb2_base = ch->base;
- u32 val;
-
-+ if (!ch->is_otg_channel || rcar_gen3_is_any_otg_rphy_initialized(ch))
-+ return;
-+
- /* Should not use functions of read-modify-write a register */
- val = readl(usb2_base + USB2_LINECTRL1);
- val = (val & ~USB2_LINECTRL1_DP_RPD) | USB2_LINECTRL1_DPRPD_EN |
-@@ -430,12 +431,9 @@ static int rcar_gen3_phy_usb2_init(struc
- writel(USB2_SPD_RSM_TIMSET_INIT, usb2_base + USB2_SPD_RSM_TIMSET);
- writel(USB2_OC_TIMSET_INIT, usb2_base + USB2_OC_TIMSET);
-
-- /* Initialize otg part */
-- if (channel->is_otg_channel) {
-- if (rcar_gen3_needs_init_otg(channel))
-- rcar_gen3_init_otg(channel);
-- rphy->otg_initialized = true;
-- }
-+ /* Initialize otg part (only if we initialize a PHY with IRQs). */
-+ if (rphy->int_enable_bits)
-+ rcar_gen3_init_otg(channel);
-
- rphy->initialized = true;
-
-@@ -451,9 +449,6 @@ static int rcar_gen3_phy_usb2_exit(struc
-
- rphy->initialized = false;
-
-- if (channel->is_otg_channel)
-- rphy->otg_initialized = false;
--
- val = readl(usb2_base + USB2_INT_ENABLE);
- val &= ~rphy->int_enable_bits;
- if (!rcar_gen3_is_any_rphy_initialized(channel))
--- a/drivers/phy/renesas/phy-rcar-gen3-usb2.c
+++ b/drivers/phy/renesas/phy-rcar-gen3-usb2.c
-@@ -428,8 +428,11 @@ static int rcar_gen3_phy_usb2_init(struc
+@@ -427,8 +427,11 @@ static int rcar_gen3_phy_usb2_init(struc
val = readl(usb2_base + USB2_INT_ENABLE);
val |= USB2_INT_ENABLE_UCOM_INTEN | rphy->int_enable_bits;
writel(val, usb2_base + USB2_INT_ENABLE);
+ writel(USB2_OC_TIMSET_INIT, usb2_base + USB2_OC_TIMSET);
+ }
- /* Initialize otg part (only if we initialize a PHY with IRQs). */
- if (rphy->int_enable_bits)
+ /* Initialize otg part */
+ if (channel->is_otg_channel) {
acpi-pptt-fix-processor-subtable-walk.patch
alsa-es1968-add-error-handling-for-snd_pcm_hw_constraint_pow2.patch
phy-fix-error-handling-in-tegra_xusb_port_init.patch
-phy-renesas-rcar-gen3-usb2-fix-role-detection-on-unbind-bind.patch
phy-renesas-rcar-gen3-usb2-set-timing-registers-only-once.patch