mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
ASoC: hdac_hdmi: Fix resource cleanup on probe failure
hdac_hdmi_dev_probe() gets the HDA link before allocating and initializing the HDMI codec private data. Several later error paths return directly without dropping the link reference, leaving the hlink refcount unbalanced. Release the link reference on probe failures. Also turn display power off if the failure happens after it has been enabled. This issue was dicussed in: https://lore.kernel.org/all/s5h1s0esk8o.wl-tiwai@suse.de/ I think the paths fixed here are probe failure paths: the device has not been fully initialized or bound, and runtime PM suspend cannot be relied on to balance the reference taken during probe. Signed-off-by: Haoxiang Li <haoxiang_li2024@163.com> Link: https://patch.msgid.link/20260622151127.1198196-1-haoxiang_li2024@163.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
2e5bf7f48b
commit
785903b777
|
|
@ -1866,8 +1866,10 @@ static int hdac_hdmi_dev_probe(struct hdac_device *hdev)
|
|||
snd_hdac_ext_bus_link_get(hdev->bus, hlink);
|
||||
|
||||
hdmi_priv = devm_kzalloc(&hdev->dev, sizeof(*hdmi_priv), GFP_KERNEL);
|
||||
if (hdmi_priv == NULL)
|
||||
if (hdmi_priv == NULL) {
|
||||
snd_hdac_ext_bus_link_put(hdev->bus, hlink);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
snd_hdac_register_chmap_ops(hdev, &hdmi_priv->chmap);
|
||||
hdmi_priv->chmap.ops.get_chmap = hdac_hdmi_get_chmap;
|
||||
|
|
@ -1876,8 +1878,10 @@ static int hdac_hdmi_dev_probe(struct hdac_device *hdev)
|
|||
hdmi_priv->chmap.ops.get_spk_alloc = hdac_hdmi_get_spk_alloc;
|
||||
hdmi_priv->hdev = hdev;
|
||||
|
||||
if (!hdac_id)
|
||||
if (!hdac_id) {
|
||||
snd_hdac_ext_bus_link_put(hdev->bus, hlink);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (hdac_id->driver_data)
|
||||
hdmi_priv->drv_data =
|
||||
|
|
@ -1902,6 +1906,8 @@ static int hdac_hdmi_dev_probe(struct hdac_device *hdev)
|
|||
if (ret < 0) {
|
||||
dev_err(&hdev->dev,
|
||||
"Failed in parse and map nid with err: %d\n", ret);
|
||||
snd_hdac_ext_bus_link_put(hdev->bus, hlink);
|
||||
snd_hdac_display_power(hdev->bus, hdev->addr, false);
|
||||
return ret;
|
||||
}
|
||||
snd_hdac_refresh_widgets(hdev);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user