mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
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:
parent
3629acb34c
commit
3a06525741
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user