Message ID | 20210719165140.16143-6-vijendar.mukunda@amd.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Add Vangogh ACP ASoC driver | expand |
> +static int acp5x_audio_probe(struct platform_device *pdev) > +{ > + struct resource *res; > + struct i2s_dev_data *adata; > + 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->acp5x_base = devm_ioremap(&pdev->dev, res->start, > + resource_size(res)); > + if (!adata->acp5x_base) > + return -ENOMEM; > + dev_set_drvdata(&pdev->dev, adata); > + status = devm_snd_soc_register_component(&pdev->dev, > + &acp5x_i2s_component, > + NULL, 0); > + if (status) { > + dev_err(&pdev->dev, "Fail to register acp i2s component\n"); > + return -ENODEV; Unclear why you need to change the error code explicitly to -ENODEV? return status? > + } > + return 0; > +} > +
On 7/19/21 11:39 PM, Pierre-Louis Bossart wrote: > >> +static int acp5x_audio_probe(struct platform_device *pdev) >> +{ >> + struct resource *res; >> + struct i2s_dev_data *adata; >> + 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->acp5x_base = devm_ioremap(&pdev->dev, res->start, >> + resource_size(res)); >> + if (!adata->acp5x_base) >> + return -ENOMEM; >> + dev_set_drvdata(&pdev->dev, adata); >> + status = devm_snd_soc_register_component(&pdev->dev, >> + &acp5x_i2s_component, >> + NULL, 0); >> + if (status) { >> + dev_err(&pdev->dev, "Fail to register acp i2s component\n"); >> + return -ENODEV; > > Unclear why you need to change the error code explicitly to -ENODEV? > > return status? yes, we can return status rather than forcing error as -ENODEV. Will fix it and post the new version. > > >> + } >> + return 0; >> +} >> +
diff --git a/sound/soc/amd/vangogh/acp5x-pcm-dma.c b/sound/soc/amd/vangogh/acp5x-pcm-dma.c new file mode 100644 index 000000000000..2ff11bb88305 --- /dev/null +++ b/sound/soc/amd/vangogh/acp5x-pcm-dma.c @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: GPL-2.0+ +// +// AMD ALSA SoC PCM Driver +// +// Copyright (C) 2021 Advanced Micro Devices, Inc. All rights reserved. + +#include <linux/platform_device.h> +#include <linux/module.h> +#include <linux/err.h> +#include <linux/io.h> +#include <sound/pcm.h> +#include <sound/pcm_params.h> +#include <sound/soc.h> +#include <sound/soc-dai.h> + +#include "acp5x.h" + +#define DRV_NAME "acp5x_i2s_dma" + +static const struct snd_soc_component_driver acp5x_i2s_component = { + .name = DRV_NAME, +}; + +static int acp5x_audio_probe(struct platform_device *pdev) +{ + struct resource *res; + struct i2s_dev_data *adata; + 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->acp5x_base = devm_ioremap(&pdev->dev, res->start, + resource_size(res)); + if (!adata->acp5x_base) + return -ENOMEM; + dev_set_drvdata(&pdev->dev, adata); + status = devm_snd_soc_register_component(&pdev->dev, + &acp5x_i2s_component, + NULL, 0); + if (status) { + dev_err(&pdev->dev, "Fail to register acp i2s component\n"); + return -ENODEV; + } + return 0; +} + +static struct platform_driver acp5x_dma_driver = { + .probe = acp5x_audio_probe, + .driver = { + .name = "acp5x_i2s_dma", + }, +}; + +module_platform_driver(acp5x_dma_driver); + +MODULE_AUTHOR("Vijendar.Mukunda@amd.com"); +MODULE_DESCRIPTION("AMD ACP 5.x PCM Driver"); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:" DRV_NAME); diff --git a/sound/soc/amd/vangogh/acp5x.h b/sound/soc/amd/vangogh/acp5x.h index bbf29fd2b12f..d2853738eb17 100644 --- a/sound/soc/amd/vangogh/acp5x.h +++ b/sound/soc/amd/vangogh/acp5x.h @@ -32,6 +32,10 @@ #define I2S_MODE 0x00 #define ACP5x_I2S_MODE 0x00 +struct i2s_dev_data { + void __iomem *acp5x_base; +}; + /* common header file uses exact offset rather than relative * offset which requires substraction logic from base_addr * for accessing ACP5x MMIO space registers
PCM platform driver binds to the platform device created by ACP5x PCI device. PCM driver registers ALSA DMA components with ASoC framework. Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com> --- sound/soc/amd/vangogh/acp5x-pcm-dma.c | 73 +++++++++++++++++++++++++++ sound/soc/amd/vangogh/acp5x.h | 4 ++ 2 files changed, 77 insertions(+) create mode 100644 sound/soc/amd/vangogh/acp5x-pcm-dma.c