Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: amd: ps: fix for acp_lock access in pdm driver

Sending the mutex address(acp_lock) as platform
data during ACP PDM platform driver register sequence,
its creating copy of the platform data.
Referencing this platform data in ACP PDM driver results
incorrect reference to the common lock usage.

Instead of directly passing the lock address as platform
data, retrieve it from parent driver data structure
and use the same lock reference in ACP PDM driver.

Fixes: 45aa83cb9388 ("ASoC: amd: ps: use acp_lock to protect common registers in pdm driver")

Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
Link: https://lore.kernel.org/r/20230525113000.1290758-1-Vijendar.Mukunda@amd.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Vijendar Mukunda and committed by
Mark Brown
b6b5c642 8938f75a

+6 -7
+1 -2
sound/soc/amd/ps/pci-ps.c
··· 211 211 case ACP63_PDM_DEV_MASK: 212 212 adata->pdm_dev_index = 0; 213 213 acp63_fill_platform_dev_info(&pdevinfo[0], parent, NULL, "acp_ps_pdm_dma", 214 - 0, adata->res, 1, &adata->acp_lock, 215 - sizeof(adata->acp_lock)); 214 + 0, adata->res, 1, NULL, 0); 216 215 acp63_fill_platform_dev_info(&pdevinfo[1], parent, NULL, "dmic-codec", 217 216 0, NULL, 0, NULL, 0); 218 217 acp63_fill_platform_dev_info(&pdevinfo[2], parent, NULL, "acp_ps_mach",
+5 -5
sound/soc/amd/ps/ps-pdm-dma.c
··· 361 361 { 362 362 struct resource *res; 363 363 struct pdm_dev_data *adata; 364 + struct acp63_dev_data *acp_data; 365 + struct device *parent; 364 366 int status; 365 367 366 - if (!pdev->dev.platform_data) { 367 - dev_err(&pdev->dev, "platform_data not retrieved\n"); 368 - return -ENODEV; 369 - } 368 + parent = pdev->dev.parent; 369 + acp_data = dev_get_drvdata(parent); 370 370 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 371 371 if (!res) { 372 372 dev_err(&pdev->dev, "IORESOURCE_MEM FAILED\n"); ··· 382 382 return -ENOMEM; 383 383 384 384 adata->capture_stream = NULL; 385 - adata->acp_lock = pdev->dev.platform_data; 385 + adata->acp_lock = &acp_data->acp_lock; 386 386 dev_set_drvdata(&pdev->dev, adata); 387 387 status = devm_snd_soc_register_component(&pdev->dev, 388 388 &acp63_pdm_component,