diff options
| author | Takashi Iwai <tiwai@suse.de> | 2026-06-15 09:28:24 +0200 |
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2026-06-15 09:28:30 +0200 |
| commit | 9afa4bc774d2b0d4fbebdbe7e8e8492ffef9c6e0 (patch) | |
| tree | 8b52b69a3487c8ae875361983fc5fd2acea78466 /sound/soc/sdca/sdca_function_device.c | |
| parent | 100407f548ca54a8c235fafba9d7c60c953c0d7e (diff) | |
| parent | b0d1553d51c3d188baae6d77e6f3dfb415a7b623 (diff) | |
| download | lwn-9afa4bc774d2b0d4fbebdbe7e8e8492ffef9c6e0.tar.gz lwn-9afa4bc774d2b0d4fbebdbe7e8e8492ffef9c6e0.zip | |
Merge branch 'for-linus' into for-next
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/soc/sdca/sdca_function_device.c')
| -rw-r--r-- | sound/soc/sdca/sdca_function_device.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/sound/soc/sdca/sdca_function_device.c b/sound/soc/sdca/sdca_function_device.c index feacfbc6a518..b5ca98283a88 100644 --- a/sound/soc/sdca/sdca_function_device.c +++ b/sound/soc/sdca/sdca_function_device.c @@ -82,6 +82,9 @@ static struct sdca_dev *sdca_dev_register(struct device *parent, static void sdca_dev_unregister(struct sdca_dev *sdev) { + if (!sdev) + return; + auxiliary_device_delete(&sdev->auxdev); auxiliary_device_uninit(&sdev->auxdev); } @@ -90,14 +93,24 @@ int sdca_dev_register_functions(struct sdw_slave *slave) { struct sdca_device_data *sdca_data = &slave->sdca_data; int i; + int ret; for (i = 0; i < sdca_data->num_functions; i++) { struct sdca_dev *func_dev; func_dev = sdca_dev_register(&slave->dev, &sdca_data->function[i]); - if (IS_ERR(func_dev)) - return PTR_ERR(func_dev); + if (IS_ERR(func_dev)) { + ret = PTR_ERR(func_dev); + /* + * Unregister functions that were successfully + * registered before this failure. This also + * sets func_dev to NULL so the caller will not + * try to unregister them again. + */ + sdca_dev_unregister_functions(slave); + return ret; + } sdca_data->function[i].func_dev = func_dev; } @@ -111,7 +124,12 @@ void sdca_dev_unregister_functions(struct sdw_slave *slave) struct sdca_device_data *sdca_data = &slave->sdca_data; int i; - for (i = 0; i < sdca_data->num_functions; i++) + for (i = 0; i < sdca_data->num_functions; i++) { + if (!sdca_data->function[i].func_dev) + continue; + sdca_dev_unregister(sdca_data->function[i].func_dev); + sdca_data->function[i].func_dev = NULL; + } } EXPORT_SYMBOL_NS(sdca_dev_unregister_functions, "SND_SOC_SDCA"); |
