mirror of
https://github.com/torvalds/linux.git
synced 2026-09-13 15:40:03 +02:00
ASoC: Intel: avs: Clean up the bus when its initialization fails
snd_hdac_i915_init() which is part of the initialization may return -EPROBE_DEFER what fails the procedure and the existing avs_bus_init() and avs_pci_probe() do not clean up the bus fields with snd_hdac_ext_bus_exit() when that happens. Fix avs_bus_init() by rearranging the initialization blocks: allocations first, snd_hdac_ext_bus_init() last. Such approach generates no error-path whilst still achieving the goal of cleaning up the bus. For avs_pci_probe() update the existing error-path instead. Co-developed-by: Amadeusz Sławiński <amade@asmblr.net> Signed-off-by: Amadeusz Sławiński <amade@asmblr.net> Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com> Link: https://patch.msgid.link/20260902081814.1590883-4-cezary.rojewski@intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
48afc07c4f
commit
ce4d735666
|
|
@ -383,6 +383,18 @@ static int avs_bus_init(struct avs_dev *adev, struct pci_dev *pci, const struct
|
|||
struct device *dev = &pci->dev;
|
||||
int ret;
|
||||
|
||||
ipc = devm_kzalloc(dev, sizeof(*ipc), GFP_KERNEL);
|
||||
if (!ipc)
|
||||
return -ENOMEM;
|
||||
|
||||
adev->modcfg_buf = devm_kzalloc(dev, AVS_MAILBOX_SIZE, GFP_KERNEL);
|
||||
if (!adev->modcfg_buf)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = avs_ipc_init(ipc, dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = snd_hdac_ext_bus_init(&bus->core, dev, NULL, &soc_hda_ext_bus_ops);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
|
@ -394,17 +406,6 @@ static int avs_bus_init(struct avs_dev *adev, struct pci_dev *pci, const struct
|
|||
bus->mixer_assigned = -1;
|
||||
mutex_init(&bus->prepare_mutex);
|
||||
|
||||
ipc = devm_kzalloc(dev, sizeof(*ipc), GFP_KERNEL);
|
||||
if (!ipc)
|
||||
return -ENOMEM;
|
||||
ret = avs_ipc_init(ipc, dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
adev->modcfg_buf = devm_kzalloc(dev, AVS_MAILBOX_SIZE, GFP_KERNEL);
|
||||
if (!adev->modcfg_buf)
|
||||
return -ENOMEM;
|
||||
|
||||
adev->dev = dev;
|
||||
adev->spec = (const struct avs_spec *)id->driver_data;
|
||||
adev->ipc = ipc;
|
||||
|
|
@ -456,13 +457,14 @@ static int avs_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
|
|||
|
||||
ret = pcim_request_all_regions(pci, "AVS HDAudio");
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto err_request_regions;
|
||||
|
||||
bus->addr = pci_resource_start(pci, 0);
|
||||
bus->remap_addr = pci_ioremap_bar(pci, 0);
|
||||
if (!bus->remap_addr) {
|
||||
dev_err(bus->dev, "ioremap error\n");
|
||||
return -ENXIO;
|
||||
ret = -ENXIO;
|
||||
goto err_request_regions;
|
||||
}
|
||||
|
||||
adev->dsp_ba = pci_ioremap_bar(pci, 4);
|
||||
|
|
@ -519,6 +521,8 @@ static int avs_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
|
|||
iounmap(adev->dsp_ba);
|
||||
err_remap_bar4:
|
||||
iounmap(bus->remap_addr);
|
||||
err_request_regions:
|
||||
snd_hdac_ext_bus_exit(bus);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user