Message ID | 20200505205327.642282-6-alexander.deucher@amd.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add Renoir ACP driver | expand |
> +static struct snd_soc_dai_ops acp_pdm_dai_ops = { > + .hw_params = NULL, > + .trigger = NULL, > +}; doesn't seem very useful? can you remove this pdm_dai_ops? > + > +static struct snd_soc_dai_driver acp_pdm_dai_driver = { > + .capture = { > + .rates = SNDRV_PCM_RATE_48000, > + .formats = SNDRV_PCM_FMTBIT_S24_LE | > + SNDRV_PCM_FMTBIT_S32_LE, > + .channels_min = 2, > + .channels_max = 2, > + .rate_min = 48000, > + .rate_max = 48000, > + }, > + .ops = &acp_pdm_dai_ops, > +}; > + > +static const struct snd_soc_component_driver acp_pdm_component = { > + .name = DRV_NAME, > +}; > + > +static int acp_pdm_audio_probe(struct platform_device *pdev) > +{ > + struct resource *res; > + struct pdm_dev_data *adata; > + unsigned int irqflags; > + int status; > + > + if (!pdev->dev.platform_data) { > + dev_err(&pdev->dev, "platform_data not retrieved\n"); > + return -ENODEV; > + } is this test needed? > + irqflags = *((unsigned int *)(pdev->dev.platform_data)); > + > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + if (!res) { > + dev_err(&pdev->dev, "IORESOURCE_MEM FAILED\n"); > + return -ENODEV; > + } > + > + adata = devm_kzalloc(&pdev->dev, sizeof(*adata), GFP_KERNEL); > + if (!adata) > + return -ENOMEM; > + > + adata->acp_base = devm_ioremap(&pdev->dev, res->start, > + resource_size(res)); > + if (!adata->acp_base) > + return -ENOMEM; > + > + adata->capture_stream = NULL; > + > + dev_set_drvdata(&pdev->dev, adata); > + status = devm_snd_soc_register_component(&pdev->dev, > + &acp_pdm_component, > + &acp_pdm_dai_driver, 1); > + if (status) { > + dev_err(&pdev->dev, "Fail to register acp pdm dai\n"); > + > + return -ENODEV; return status; > + } > + return 0; > +} > + > +static int acp_pdm_audio_remove(struct platform_device *pdev) > +{ > + return 0; > +} not needed? > + > +static struct platform_driver acp_pdm_dma_driver = { > + .probe = acp_pdm_audio_probe, > + .remove = acp_pdm_audio_remove, > + .driver = { > + .name = "acp_rn_pdm_dma", > + }, > +}; > + > +module_platform_driver(acp_pdm_dma_driver);
[AMD Official Use Only - Internal Distribution Only] > -----Original Message----- > From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> > Sent: Wednesday, May 6, 2020 3:33 AM > To: Alex Deucher <alexdeucher@gmail.com>; alsa-devel@alsa-project.org; > broonie@kernel.org; Mukunda, Vijendar <Vijendar.Mukunda@amd.com>; > tiwai@suse.de > Cc: Deucher, Alexander <Alexander.Deucher@amd.com> > Subject: Re: [PATCH 05/14] ASoC: amd: add ACP3x PDM platform driver > > > > > > +static struct snd_soc_dai_ops acp_pdm_dai_ops = { > > + .hw_params = NULL, > > + .trigger = NULL, > > +}; > > doesn't seem very useful? can you remove this pdm_dai_ops? Will remove it . > > > + > > +static struct snd_soc_dai_driver acp_pdm_dai_driver = { > > + .capture = { > > + .rates = SNDRV_PCM_RATE_48000, > > + .formats = SNDRV_PCM_FMTBIT_S24_LE | > > + SNDRV_PCM_FMTBIT_S32_LE, > > + .channels_min = 2, > > + .channels_max = 2, > > + .rate_min = 48000, > > + .rate_max = 48000, > > + }, > > + .ops = &acp_pdm_dai_ops, > > +}; > > + > > +static const struct snd_soc_component_driver acp_pdm_component = { > > + .name = DRV_NAME, > > +}; > > + > > +static int acp_pdm_audio_probe(struct platform_device *pdev) > > +{ > > + struct resource *res; > > + struct pdm_dev_data *adata; > > + unsigned int irqflags; > > + int status; > > + > > + if (!pdev->dev.platform_data) { > > + dev_err(&pdev->dev, "platform_data not retrieved\n"); > > + return -ENODEV; > > + } > > is this test needed? Its only provides an extra check. This is a child device created by ACP device. ACP device passes memory and IRQ resources to this child device. > > > + irqflags = *((unsigned int *)(pdev->dev.platform_data)); > > + > > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > + if (!res) { > > + dev_err(&pdev->dev, "IORESOURCE_MEM FAILED\n"); > > + return -ENODEV; > > + } > > + > > + adata = devm_kzalloc(&pdev->dev, sizeof(*adata), GFP_KERNEL); > > + if (!adata) > > + return -ENOMEM; > > + > > + adata->acp_base = devm_ioremap(&pdev->dev, res->start, > > + resource_size(res)); > > + if (!adata->acp_base) > > + return -ENOMEM; > > + > > + adata->capture_stream = NULL; > > + > > + dev_set_drvdata(&pdev->dev, adata); > > + status = devm_snd_soc_register_component(&pdev->dev, > > + &acp_pdm_component, > > + &acp_pdm_dai_driver, 1); > > + if (status) { > > + dev_err(&pdev->dev, "Fail to register acp pdm dai\n"); > > + > > + return -ENODEV; > > return status; > > > + } > > + return 0; > > +} > > + > > +static int acp_pdm_audio_remove(struct platform_device *pdev) > > +{ > > + return 0; > > +} > > not needed? It gets filled in future patch. > > > + > > +static struct platform_driver acp_pdm_dma_driver = { > > + .probe = acp_pdm_audio_probe, > > + .remove = acp_pdm_audio_remove, > > + .driver = { > > + .name = "acp_rn_pdm_dma", > > + }, > > +}; > > + > > +module_platform_driver(acp_pdm_dma_driver);
diff --git a/sound/soc/amd/renoir/acp3x-pdm-dma.c b/sound/soc/amd/renoir/acp3x-pdm-dma.c new file mode 100644 index 000000000000..680b2505d65d --- /dev/null +++ b/sound/soc/amd/renoir/acp3x-pdm-dma.c @@ -0,0 +1,101 @@ +// SPDX-License-Identifier: GPL-2.0+ +// +// AMD ALSA SoC PDM Driver +// +//Copyright 2020 Advanced Micro Devices, Inc. + +#include <linux/platform_device.h> +#include <linux/module.h> +#include <linux/err.h> +#include <linux/io.h> +#include <sound/pcm_params.h> +#include <sound/soc.h> +#include <sound/soc-dai.h> + +#include "rn_acp3x.h" + +#define DRV_NAME "acp_rn_pdm_dma" + +static struct snd_soc_dai_ops acp_pdm_dai_ops = { + .hw_params = NULL, + .trigger = NULL, +}; + +static struct snd_soc_dai_driver acp_pdm_dai_driver = { + .capture = { + .rates = SNDRV_PCM_RATE_48000, + .formats = SNDRV_PCM_FMTBIT_S24_LE | + SNDRV_PCM_FMTBIT_S32_LE, + .channels_min = 2, + .channels_max = 2, + .rate_min = 48000, + .rate_max = 48000, + }, + .ops = &acp_pdm_dai_ops, +}; + +static const struct snd_soc_component_driver acp_pdm_component = { + .name = DRV_NAME, +}; + +static int acp_pdm_audio_probe(struct platform_device *pdev) +{ + struct resource *res; + struct pdm_dev_data *adata; + unsigned int irqflags; + int status; + + if (!pdev->dev.platform_data) { + dev_err(&pdev->dev, "platform_data not retrieved\n"); + return -ENODEV; + } + irqflags = *((unsigned int *)(pdev->dev.platform_data)); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(&pdev->dev, "IORESOURCE_MEM FAILED\n"); + return -ENODEV; + } + + adata = devm_kzalloc(&pdev->dev, sizeof(*adata), GFP_KERNEL); + if (!adata) + return -ENOMEM; + + adata->acp_base = devm_ioremap(&pdev->dev, res->start, + resource_size(res)); + if (!adata->acp_base) + return -ENOMEM; + + adata->capture_stream = NULL; + + dev_set_drvdata(&pdev->dev, adata); + status = devm_snd_soc_register_component(&pdev->dev, + &acp_pdm_component, + &acp_pdm_dai_driver, 1); + if (status) { + dev_err(&pdev->dev, "Fail to register acp pdm dai\n"); + + return -ENODEV; + } + return 0; +} + +static int acp_pdm_audio_remove(struct platform_device *pdev) +{ + return 0; +} + +static struct platform_driver acp_pdm_dma_driver = { + .probe = acp_pdm_audio_probe, + .remove = acp_pdm_audio_remove, + .driver = { + .name = "acp_rn_pdm_dma", + }, +}; + +module_platform_driver(acp_pdm_dma_driver); + +MODULE_AUTHOR("Vijendar.Mukunda@amd.com"); +MODULE_DESCRIPTION("AMD ACP3x Renior PDM Driver"); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:" DRV_NAME); diff --git a/sound/soc/amd/renoir/rn_acp3x.h b/sound/soc/amd/renoir/rn_acp3x.h index 5e4fd99397d5..0b450882c6c4 100644 --- a/sound/soc/amd/renoir/rn_acp3x.h +++ b/sound/soc/amd/renoir/rn_acp3x.h @@ -29,6 +29,11 @@ #define ACP_ERROR_MASK 0x20000000 #define ACP_EXT_INTR_STAT_CLEAR_MASK 0xFFFFFFFF +struct pdm_dev_data { + void __iomem *acp_base; + struct snd_pcm_substream *capture_stream; +}; + static inline u32 rn_readl(void __iomem *base_addr) { return readl(base_addr - ACP_PHY_BASE_ADDRESS);