[PATCH 3/9] soundwire: amd: allocate sdw_amd_ctx pdev array dynamically

From: Vijendar Mukunda

Date: Thu Sep 17 2026 - 05:06:23 EST


Replace the fixed-size pdev[AMD_ACP63_SDW_MAX_MANAGER_COUNT] member of
struct sdw_amd_ctx with a dynamically allocated pointer array. The array
is sized by max_manager_count via kcalloc() in sdw_amd_probe_controller()
and freed on all error paths and in sdw_amd_cleanup().

Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@xxxxxxx>
---
drivers/soundwire/amd_init.c | 12 ++++++++++++
include/linux/soundwire/sdw_amd.h | 2 +-
2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/drivers/soundwire/amd_init.c b/drivers/soundwire/amd_init.c
index 15d117172bdb..94d766b3f8af 100644
--- a/drivers/soundwire/amd_init.c
+++ b/drivers/soundwire/amd_init.c
@@ -62,6 +62,7 @@ static int sdw_amd_cleanup(struct sdw_amd_ctx *ctx)
continue;
platform_device_unregister(ctx->pdev[i]);
}
+ kfree(ctx->pdev);

return 0;
}
@@ -116,8 +117,16 @@ static struct sdw_amd_ctx *sdw_amd_probe_controller(struct sdw_amd_res *res)

ctx->count = count;
ctx->link_mask = res->link_mask;
+
+ ctx->pdev = kcalloc(max_manager_count, sizeof(*ctx->pdev), GFP_KERNEL);
+ if (!ctx->pdev) {
+ kfree(ctx);
+ return NULL;
+ }
+
struct resource *sdw_res __free(kfree) = kzalloc_obj(*sdw_res);
if (!sdw_res) {
+ kfree(ctx->pdev);
kfree(ctx);
return NULL;
}
@@ -127,6 +136,7 @@ static struct sdw_amd_ctx *sdw_amd_probe_controller(struct sdw_amd_res *res)

sdw_pdata = kcalloc(max_manager_count, sizeof(*sdw_pdata), GFP_KERNEL);
if (!sdw_pdata) {
+ kfree(ctx->pdev);
kfree(ctx);
return NULL;
}
@@ -134,6 +144,7 @@ static struct sdw_amd_ctx *sdw_amd_probe_controller(struct sdw_amd_res *res)
pdevinfo = kcalloc(max_manager_count, sizeof(*pdevinfo), GFP_KERNEL);
if (!pdevinfo) {
kfree(sdw_pdata);
+ kfree(ctx->pdev);
kfree(ctx);
return NULL;
}
@@ -171,6 +182,7 @@ static struct sdw_amd_ctx *sdw_amd_probe_controller(struct sdw_amd_res *res)

kfree(pdevinfo);
kfree(sdw_pdata);
+ kfree(ctx->pdev);
kfree(ctx);
return NULL;
}
diff --git a/include/linux/soundwire/sdw_amd.h b/include/linux/soundwire/sdw_amd.h
index 40ba84c3b2cc..476de2c30389 100644
--- a/include/linux/soundwire/sdw_amd.h
+++ b/include/linux/soundwire/sdw_amd.h
@@ -139,7 +139,7 @@ struct sdw_amd_acpi_info {
struct sdw_amd_ctx {
int count;
u32 link_mask;
- struct platform_device *pdev[AMD_ACP63_SDW_MAX_MANAGER_COUNT];
+ struct platform_device **pdev;
struct sdw_peripherals *peripherals;
};

--
2.48.1