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

From: Vinod Koul

Date: Sat Oct 03 2026 - 03:53:13 EST


On 17-09-26, 14:32, Vijendar Mukunda wrote:
> 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);

why not use managed api for this?

> + 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

--
~Vinod