FAILED: patch "[PATCH] ASoC: codecs: wcd938x: fix regulator leaks on probe errors" failed to apply to 5.15-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.15.y
git checkout FETCH_HEAD
git cherry-pick -x 69a026a2357ee69983690d07976de44ef26ee38a
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023102032-musty-aground-e769@gregkh' --subject-prefix 'PATCH 5.15.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 69a026a2357ee69983690d07976de44ef26ee38a Mon Sep 17 00:00:00 2001
From: Johan Hovold <[email protected]>
Date: Tue, 3 Oct 2023 17:55:55 +0200
Subject: [PATCH] ASoC: codecs: wcd938x: fix regulator leaks on probe errors
Make sure to disable and free the regulators on probe errors and on driver unbind.
sound/soc/codecs/wcd938x.c +15 -3
@@ -3325,8 +3325,10 @@ static int wcd938x_populate_dt_data(struct wcd938x_priv *wcd938x, struct devicereturn dev_err_probe (dev, ret,"Failed to get supplies\n" ); ret =regulator_bulk_enable (WCD938X_MAX_SUPPLY , wcd938x->supplies); -if (ret) +if (ret) { +regulator_bulk_free (WCD938X_MAX_SUPPLY , wcd938x->supplies);return dev_err_probe (dev, ret,"Failed to enable supplies\n" ); + }wcd938x_dt_parse_micbias_info (dev, wcd938x);
@@ -3592,13 +3594,13 @@ static int wcd938x_probe(struct platform_device *pdev) ret =wcd938x_add_slave_components (wcd938x, dev, &match);if (ret) -return ret; + goto err_disable_regulators;wcd938x_reset (wcd938x); ret =component_master_add_with_match (dev, &wcd938x_comp_ops, match);if (ret) -return ret; + goto err_disable_regulators;pm_runtime_set_autosuspend_delay (dev,1000 );pm_runtime_use_autosuspend (dev);
@@ -3608,11 +3610,21 @@ static int wcd938x_probe(struct platform_device *pdev)pm_runtime_idle (dev);return 0 ; + +err_disable_regulators: +regulator_bulk_disable (WCD938X_MAX_SUPPLY , wcd938x->supplies); +regulator_bulk_free (WCD938X_MAX_SUPPLY , wcd938x->supplies); + +return ret; }static void wcd938x_remove (struct platform_device *pdev) { +struct wcd938x_priv *wcd938x =dev_get_drvdata (&pdev->dev); +component_master_del (&pdev->dev, &wcd938x_comp_ops); +regulator_bulk_disable (WCD938X_MAX_SUPPLY , wcd938x->supplies); +regulator_bulk_free (WCD938X_MAX_SUPPLY , wcd938x->supplies); }#if defined(CONFIG_OF )