ASoC: fsl: mpc5200_dma: use platform helpers and devm cleanup

Convert mpc5200_audio_dma_create() to the managed APIs. Replace the
open-coded of_address_to_resource() + devm_ioremap() of the PSC registers
with devm_platform_get_and_ioremap_resource(), and irq_of_parse_and_map()
with platform_get_irq() (which returns a negative errno instead of 0).
Switch the allocation to devm_kzalloc(), the three interrupt requests to
devm_request_irq(), and drop the now-unneeded error-path cleanup and the
manual teardown in mpc5200_audio_dma_destroy().

The PSC register window is owned solely by this driver, so the new region
request from devm_platform_get_and_ioremap_resource() cannot conflict
with another claimant, and it is mapped exactly once (no double mapping).
The resource pointer is still used (res->start) to compute the FIFO
physical address.

No functional change; built for powerpc (allmodconfig + CONFIG_SND_SOC_MPC5200_DMA)
with LLVM=1 and sound/soc/fsl/mpc5200_dma.o compiles cleanly.

Assisted-by: opencode:hy3-free
Signed-off-by: Rosen Penev <rosenp@gmail.com>
Link: https://patch.msgid.link/20260721225936.838299-1-rosenp@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Rosen Penev 2026-07-21 15:59:36 -07:00 committed by Mark Brown
parent 3629acb34c
commit 3a06525741
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
3 changed files with 20 additions and 45 deletions

View File

@ -314,35 +314,29 @@ int mpc5200_audio_dma_create(struct platform_device *op)
{
phys_addr_t fifo;
struct psc_dma *psc_dma;
struct resource res;
struct resource *res;
int size, irq, rc;
const __be32 *prop;
void __iomem *regs;
int ret;
regs = devm_platform_get_and_ioremap_resource(op, 0, &res);
if (IS_ERR(regs))
return PTR_ERR(regs);
/* Fetch the registers and IRQ of the PSC */
irq = irq_of_parse_and_map(op->dev.of_node, 0);
if (of_address_to_resource(op->dev.of_node, 0, &res)) {
dev_err(&op->dev, "Missing reg property\n");
return -ENODEV;
}
regs = devm_ioremap(&op->dev, res.start, resource_size(&res));
if (!regs) {
dev_err(&op->dev, "Could not map registers\n");
return -ENODEV;
}
irq = platform_get_irq(op, 0);
if (irq < 0)
return irq;
/* Allocate and initialize the driver private data */
psc_dma = kzalloc_obj(*psc_dma);
psc_dma = devm_kzalloc(&op->dev, sizeof(*psc_dma), GFP_KERNEL);
if (!psc_dma)
return -ENOMEM;
/* Get the PSC ID */
prop = of_get_property(op->dev.of_node, "cell-index", &size);
if (!prop || size < sizeof *prop) {
ret = -ENODEV;
goto out_free;
}
if (!prop || size < sizeof *prop)
return -ENODEV;
spin_lock_init(&psc_dma->lock);
mutex_init(&psc_dma->mutex);
@ -357,7 +351,7 @@ int mpc5200_audio_dma_create(struct platform_device *op)
/* Find the address of the fifo data registers and setup the
* DMA tasks */
fifo = res.start + offsetof(struct mpc52xx_psc, buffer.buffer_32);
fifo = res->start + offsetof(struct mpc52xx_psc, buffer.buffer_32);
psc_dma->capture.bcom_task =
bcom_psc_gen_bd_rx_init(psc_dma->id, 10, fifo, 512);
psc_dma->playback.bcom_task =
@ -365,8 +359,7 @@ int mpc5200_audio_dma_create(struct platform_device *op)
if (!psc_dma->capture.bcom_task ||
!psc_dma->playback.bcom_task) {
dev_err(&op->dev, "Could not allocate bestcomm tasks\n");
ret = -ENODEV;
goto out_free;
return -ENODEV;
}
/* Disable all interrupts and reset the PSC */
@ -399,16 +392,14 @@ int mpc5200_audio_dma_create(struct platform_device *op)
psc_dma->capture.irq =
bcom_get_task_irq(psc_dma->capture.bcom_task);
rc = request_irq(psc_dma->irq, &psc_dma_status_irq, IRQF_SHARED,
rc = devm_request_irq(&op->dev, psc_dma->irq, &psc_dma_status_irq, IRQF_SHARED,
"psc-dma-status", psc_dma);
rc |= request_irq(psc_dma->capture.irq, &psc_dma_bcom_irq, IRQF_SHARED,
rc |= devm_request_irq(&op->dev, psc_dma->capture.irq, &psc_dma_bcom_irq, IRQF_SHARED,
"psc-dma-capture", &psc_dma->capture);
rc |= request_irq(psc_dma->playback.irq, &psc_dma_bcom_irq, IRQF_SHARED,
rc |= devm_request_irq(&op->dev, psc_dma->playback.irq, &psc_dma_bcom_irq, IRQF_SHARED,
"psc-dma-playback", &psc_dma->playback);
if (rc) {
ret = -ENODEV;
goto out_irq;
}
if (rc)
return -ENODEV;
/* Save what we've done so it can be found again later */
dev_set_drvdata(&op->dev, psc_dma);
@ -416,13 +407,6 @@ int mpc5200_audio_dma_create(struct platform_device *op)
/* Tell the ASoC OF helpers about it */
return devm_snd_soc_register_component(&op->dev,
&mpc5200_audio_dma_component, NULL, 0);
out_irq:
free_irq(psc_dma->irq, psc_dma);
free_irq(psc_dma->capture.irq, &psc_dma->capture);
free_irq(psc_dma->playback.irq, &psc_dma->playback);
out_free:
kfree(psc_dma);
return ret;
}
EXPORT_SYMBOL_GPL(mpc5200_audio_dma_create);
@ -435,12 +419,6 @@ int mpc5200_audio_dma_destroy(struct platform_device *op)
bcom_gen_bd_rx_release(psc_dma->capture.bcom_task);
bcom_gen_bd_tx_release(psc_dma->playback.bcom_task);
/* Release irqs */
free_irq(psc_dma->irq, psc_dma);
free_irq(psc_dma->capture.irq, &psc_dma->capture);
free_irq(psc_dma->playback.irq, &psc_dma->playback);
kfree(psc_dma);
dev_set_drvdata(&op->dev, NULL);
return 0;

View File

@ -276,7 +276,7 @@ static int psc_ac97_of_probe(struct platform_device *op)
return rc;
}
rc = snd_soc_register_component(&op->dev, &psc_ac97_component,
rc = devm_snd_soc_register_component(&op->dev, &psc_ac97_component,
psc_ac97_dai, ARRAY_SIZE(psc_ac97_dai));
if (rc != 0) {
dev_err(&op->dev, "Failed to register DAI\n");
@ -302,8 +302,6 @@ static int psc_ac97_of_probe(struct platform_device *op)
static void psc_ac97_of_remove(struct platform_device *op)
{
mpc5200_audio_dma_destroy(op);
snd_soc_unregister_component(&op->dev);
snd_soc_set_ac97_ops(NULL);
}
/* Match table for of_platform binding */

View File

@ -166,7 +166,7 @@ static int psc_i2s_of_probe(struct platform_device *op)
if (rc != 0)
return rc;
rc = snd_soc_register_component(&op->dev, &psc_i2s_component,
rc = devm_snd_soc_register_component(&op->dev, &psc_i2s_component,
psc_i2s_dai, ARRAY_SIZE(psc_i2s_dai));
if (rc != 0) {
pr_err("Failed to register DAI\n");
@ -213,7 +213,6 @@ static int psc_i2s_of_probe(struct platform_device *op)
static void psc_i2s_of_remove(struct platform_device *op)
{
mpc5200_audio_dma_destroy(op);
snd_soc_unregister_component(&op->dev);
}
/* Match table for of_platform binding */