+++ /dev/null
-From 8cab0e9a3f3e8d700179e0d6141643d54a267fd5 Mon Sep 17 00:00:00 2001
-From: Fedor Pchelkin <pchelkin@ispras.ru>
-Date: Sun, 16 Mar 2025 13:26:55 +0300
-Subject: usb: chipidea: ci_hdrc_imx: fix call balance of regulator routines
-
-From: Fedor Pchelkin <pchelkin@ispras.ru>
-
-commit 8cab0e9a3f3e8d700179e0d6141643d54a267fd5 upstream.
-
-Upon encountering errors during the HSIC pinctrl handling section the
-regulator should be disabled.
-
-Use devm_add_action_or_reset() to let the regulator-disabling routine be
-handled by device resource management stack.
-
-Found by Linux Verification Center (linuxtesting.org).
-
-Fixes: 4d6141288c33 ("usb: chipidea: imx: pinctrl for HSIC is optional")
-Cc: stable <stable@kernel.org>
-Signed-off-by: Fedor Pchelkin <pchelkin@ispras.ru>
-Acked-by: Peter Chen <peter.chen@kernel.org>
-Link: https://lore.kernel.org/r/20250316102658.490340-3-pchelkin@ispras.ru
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/usb/chipidea/ci_hdrc_imx.c | 25 +++++++++++++++++--------
- 1 file changed, 17 insertions(+), 8 deletions(-)
-
---- a/drivers/usb/chipidea/ci_hdrc_imx.c
-+++ b/drivers/usb/chipidea/ci_hdrc_imx.c
-@@ -322,6 +322,13 @@ static int ci_hdrc_imx_notify_event(stru
- return ret;
- }
-
-+static void ci_hdrc_imx_disable_regulator(void *arg)
-+{
-+ struct ci_hdrc_imx_data *data = arg;
-+
-+ regulator_disable(data->hsic_pad_regulator);
-+}
-+
- static int ci_hdrc_imx_probe(struct platform_device *pdev)
- {
- struct ci_hdrc_imx_data *data;
-@@ -387,6 +394,13 @@ static int ci_hdrc_imx_probe(struct plat
- "Failed to enable HSIC pad regulator\n");
- return ret;
- }
-+ ret = devm_add_action_or_reset(dev,
-+ ci_hdrc_imx_disable_regulator, data);
-+ if (ret) {
-+ dev_err(dev,
-+ "Failed to add regulator devm action\n");
-+ goto err_put;
-+ }
- }
- }
-
-@@ -423,11 +437,11 @@ static int ci_hdrc_imx_probe(struct plat
-
- ret = imx_get_clks(dev);
- if (ret)
-- goto disable_hsic_regulator;
-+ goto qos_remove_request;
-
- ret = imx_prepare_enable_clks(dev);
- if (ret)
-- goto disable_hsic_regulator;
-+ goto qos_remove_request;
-
- data->phy = devm_usb_get_phy_by_phandle(dev, "fsl,usbphy", 0);
- if (IS_ERR(data->phy)) {
-@@ -509,10 +523,7 @@ disable_device:
- ci_hdrc_remove_device(data->ci_pdev);
- err_clk:
- imx_disable_unprepare_clks(dev);
--disable_hsic_regulator:
-- if (data->hsic_pad_regulator)
-- /* don't overwrite original ret (cf. EPROBE_DEFER) */
-- regulator_disable(data->hsic_pad_regulator);
-+qos_remove_request:
- if (pdata.flags & CI_HDRC_PMQOS)
- cpu_latency_qos_remove_request(&data->pm_qos_req);
- data->ci_pdev = NULL;
-@@ -536,8 +547,6 @@ static int ci_hdrc_imx_remove(struct pla
- imx_disable_unprepare_clks(&pdev->dev);
- if (data->plat_data->flags & CI_HDRC_PMQOS)
- cpu_latency_qos_remove_request(&data->pm_qos_req);
-- if (data->hsic_pad_regulator)
-- regulator_disable(data->hsic_pad_regulator);
- }
-
- return 0;