FAILED: patch "[PATCH] ASoC: wcd934x: fix error handling in" failed to apply to 5.10-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 5.10-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.10.y
git checkout FETCH_HEAD
git cherry-pick -x 4e65bda8273c938039403144730923e77916a3d7
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025101306-ploy-alkalize-b950@gregkh' --subject-prefix 'PATCH 5.10.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 4e65bda8273c938039403144730923e77916a3d7 Mon Sep 17 00:00:00 2001
From: Ma Ke <[email protected]>
Date: Tue, 23 Sep 2025 14:52:12 +0800
Subject: [PATCH] ASoC: wcd934x: fix error handling in
wcd934x_codec_parse_data()
wcd934x_codec_parse_data() contains a device reference count leak in of_slim_get_device() where device_find_child() increases the reference count of the device but this reference is not properly decreased in the success path. Add put_device() in wcd934x_codec_parse_data() and add devm_add_action_or_reset() in the probe function, which ensures that the reference count of the device is correctly managed.
Memory leak in regmap_init_slimbus() as the allocated regmap is not released when the device is removed. Using devm_regmap_init_slimbus() instead of regmap_init_slimbus() to ensure automatic regmap cleanup on device removal.
Calling path: of_slim_get_device() -> of_find_slim_device() -> device_find_child(). As comment of device_find_child() says, 'NOTE:
you will need to drop the reference with put_device() after use.'.
Found by code review.
sound/soc/codecs/wcd934x.c +15 -2
@@ -5831,6 +5831,13 @@ static const struct snd_soc_component_driver wcd934x_component_drv = { .endianness = 1, }; +static void wcd934x_put_device_action (void *data) +{ +struct device *dev = data; + +put_device (dev); +} +static int wcd934x_codec_parse_data (struct wcd934x_codec *wcd) {struct device *dev = &wcd->sdev->dev;
@@ -5847,11 +5854,13 @@ static int wcd934x_codec_parse_data(struct wcd934x_codec *wcd)return dev_err_probe (dev, -EINVAL ,"Unable to get SLIM Interface device\n" );slim_get_logical_addr (wcd->sidev); - wcd->if_regmap =regmap_init_slimbus (wcd->sidev, + wcd->if_regmap =devm_regmap_init_slimbus (wcd->sidev, &wcd934x_ifc_regmap_config); -if (IS_ERR (wcd->if_regmap)) +if (IS_ERR (wcd->if_regmap)) { +put_device (&wcd->sidev->dev);return dev_err_probe (dev,PTR_ERR (wcd->if_regmap),"Failed to allocate ifc register map\n" ); + }of_property_read_u32 (dev->parent->of_node,"qcom,dmic-sample-rate" , &wcd->dmic_sample_rate);
@@ -5893,6 +5902,10 @@ static int wcd934x_codec_probe(struct platform_device *pdev)if (ret)return ret; + ret =devm_add_action_or_reset (dev, wcd934x_put_device_action, &wcd->sidev->dev); +if (ret) +return ret; +/* set default rate 9P6MHz */ regmap_update_bits(wcd->regmap, WCD934X_CODEC_RPM_CLK_MCLK_CFG, WCD934X_CODEC_RPM_CLK_MCLK_CFG_MCLK_MASK,
Sasha Levin
maintainerPATCH 1/2 ASoC: codecs: wcd934x: Simplify with dev_err_probe
From: Krzysztof Kozlowski <[email protected]>
[ Upstream commit fa92f4294283cc7d1f29151420be9e9336182518 ]
Replace dev_err() in probe() path with dev_err_probe() to:
1. Make code a bit simpler and easier to read,
2. Do not print messages on deferred probe.
Stable-dep-of: 4e65bda8273c ("ASoC: wcd934x: fix error handling in wcd934x_codec_parse_data()")
--- sound/soc/codecs/wcd934x.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-)
sound/soc/codecs/wcd934x.c +7 -12
@@ -5032,10 +5032,9 @@ static int wcd934x_codec_parse_data(struct wcd934x_codec *wcd)slim_get_logical_addr (wcd->sidev); wcd->if_regmap =regmap_init_slimbus (wcd->sidev, &wcd934x_ifc_regmap_config); -if (IS_ERR (wcd->if_regmap)) { -dev_err (dev,"Failed to allocate ifc register map\n" ); -return PTR_ERR (wcd->if_regmap); - } +if (IS_ERR (wcd->if_regmap)) +return dev_err_probe (dev,PTR_ERR (wcd->if_regmap), +"Failed to allocate ifc register map\n" );of_property_read_u32 (dev->parent->of_node,"qcom,dmic-sample-rate" , &wcd->dmic_sample_rate);
@@ -5074,19 +5073,15 @@ static int wcd934x_codec_probe(struct platform_device *pdev)memcpy (wcd->tx_chs, wcd934x_tx_chs,sizeof (wcd934x_tx_chs)); irq =regmap_irq_get_virq (data->irq_data,WCD934X_IRQ_SLIMBUS ); -if (irq <0 ) { -dev_err (wcd->dev,"Failed to get SLIM IRQ\n" ); -return irq; - } +if (irq <0 ) +return dev_err_probe (wcd->dev, irq,"Failed to get SLIM IRQ\n" ); ret =devm_request_threaded_irq (dev, irq,NULL , wcd934x_slim_irq_handler,IRQF_TRIGGER_RISING ,"slim" , wcd); -if (ret) { -dev_err (dev,"Failed to request slimbus irq\n" ); -return ret; - } +if (ret) +return dev_err_probe (dev, ret,"Failed to request slimbus irq\n" );wcd934x_register_mclk_output (wcd);platform_set_drvdata (pdev, wcd);
Signature · 1 line
2.51.0
Sasha Levin
maintainerPATCH 2/2 ASoC: wcd934x: fix error handling in wcd934x_codec_parse_data()
From: Ma Ke <[email protected]>
[ Upstream commit 4e65bda8273c938039403144730923e77916a3d7 ]
wcd934x_codec_parse_data() contains a device reference count leak in of_slim_get_device() where device_find_child() increases the reference count of the device but this reference is not properly decreased in the success path. Add put_device() in wcd934x_codec_parse_data() and add devm_add_action_or_reset() in the probe function, which ensures that the reference count of the device is correctly managed.
Memory leak in regmap_init_slimbus() as the allocated regmap is not released when the device is removed. Using devm_regmap_init_slimbus() instead of regmap_init_slimbus() to ensure automatic regmap cleanup on device removal.
Calling path: of_slim_get_device() -> of_find_slim_device() -> device_find_child(). As comment of device_find_child() says, 'NOTE:
you will need to drop the reference with put_device() after use.'.
Found by code review.
--- sound/soc/codecs/wcd934x.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
sound/soc/codecs/wcd934x.c +15 -2
@@ -5011,6 +5011,13 @@ static const struct snd_soc_component_driver wcd934x_component_drv = { .num_dapm_routes = ARRAY_SIZE(wcd934x_audio_map), }; +static void wcd934x_put_device_action (void *data) +{ +struct device *dev = data; + +put_device (dev); +} +static int wcd934x_codec_parse_data (struct wcd934x_codec *wcd) {struct device *dev = &wcd->sdev->dev;
@@ -5030,11 +5037,13 @@ static int wcd934x_codec_parse_data(struct wcd934x_codec *wcd) }slim_get_logical_addr (wcd->sidev); - wcd->if_regmap =regmap_init_slimbus (wcd->sidev, + wcd->if_regmap =devm_regmap_init_slimbus (wcd->sidev, &wcd934x_ifc_regmap_config); -if (IS_ERR (wcd->if_regmap)) +if (IS_ERR (wcd->if_regmap)) { +put_device (&wcd->sidev->dev);return dev_err_probe (dev,PTR_ERR (wcd->if_regmap),"Failed to allocate ifc register map\n" ); + }of_property_read_u32 (dev->parent->of_node,"qcom,dmic-sample-rate" , &wcd->dmic_sample_rate);
@@ -5065,6 +5074,10 @@ static int wcd934x_codec_probe(struct platform_device *pdev)return ret; } + ret =devm_add_action_or_reset (dev, wcd934x_put_device_action, &wcd->sidev->dev); +if (ret) +return ret; +/* set default rate 9P6MHz */ regmap_update_bits(wcd->regmap, WCD934X_CODEC_RPM_CLK_MCLK_CFG, WCD934X_CODEC_RPM_CLK_MCLK_CFG_MCLK_MASK,
Signature · 1 line
2.51.0