summaryrefslogtreecommitdiff
path: root/sound/soc/sdca/sdca_function_device.c
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2026-06-15 09:28:24 +0200
committerTakashi Iwai <tiwai@suse.de>2026-06-15 09:28:30 +0200
commit9afa4bc774d2b0d4fbebdbe7e8e8492ffef9c6e0 (patch)
tree8b52b69a3487c8ae875361983fc5fd2acea78466 /sound/soc/sdca/sdca_function_device.c
parent100407f548ca54a8c235fafba9d7c60c953c0d7e (diff)
parentb0d1553d51c3d188baae6d77e6f3dfb415a7b623 (diff)
downloadlwn-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.c24
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");