[alsa-devel] [PATCH v2 0/7] ASoC: omap: Deprecate omap-pcm for sdma-pcm
Hi,
Changes since v1: - Rebased on the n810 patches (Kconfig conflict) - Delete the omap-pcm as the last step instead of keeping the .c/.h file. If there is a need it can be resurrected with a simple revert. - I left out the Acked-by from Jarkko for the last patch since I have changed it
omap-pcm served us well over the years, but there is no reason to keep it around as we can rely on generic dmaengine_pcm code without the need to maintain custom code.
The series has been tested on: omap2 n810, omap3 beagle-xm, omap4 PandaES, omap4 Blaze (SDP), am57xx beagle-x15, dra7 evm.
McBSP, McASP, McPDM, DMIC and HDMI audio was tested and I have found no issue with them.
I was not able to test on OMAP1 for various reasons, but mainly because the Nokia 770 audio is not supported in mainline...
Regards, Peter --- Peter Ujfalusi (7): ASoC: omap: Introduce the generic_dmaengine_pcm based sdma-pcm ASoC: davinci-mcasp: Convert to use the sdma-pcm instead of omap-pcm ASoC: omap-hdmi-audio: Convert to use the sdma-pcm instead of omap-pcm ASoC: omap-dmic: Convert to use the sdma-pcm instead of omap-pcm ASoC: omap-mcpdm: Convert to use the sdma-pcm instead of omap-pcm ASoC: omap-mcbsp: Convert to use the sdma-pcm instead of omap-pcm ASoC: omap: Delete the obsolete omap-pcm
include/sound/omap-pcm.h | 30 ---- sound/soc/davinci/Kconfig | 2 +- sound/soc/davinci/davinci-mcasp.c | 8 +- sound/soc/omap/Kconfig | 33 ++-- sound/soc/omap/Makefile | 4 +- sound/soc/omap/omap-dmic.c | 4 +- sound/soc/omap/omap-hdmi-audio.c | 5 +- sound/soc/omap/omap-mcbsp.c | 4 +- sound/soc/omap/omap-mcpdm.c | 4 +- sound/soc/omap/omap-pcm.c | 262 ------------------------------ sound/soc/omap/sdma-pcm.c | 68 ++++++++ sound/soc/omap/sdma-pcm.h | 21 +++ 12 files changed, 124 insertions(+), 321 deletions(-) delete mode 100644 include/sound/omap-pcm.h delete mode 100644 sound/soc/omap/omap-pcm.c create mode 100644 sound/soc/omap/sdma-pcm.c create mode 100644 sound/soc/omap/sdma-pcm.h
With the generic dmaengine_pcm support the omap-cpm can be replaced with a much smaller wrapper.
CPU DAI drivers can use the: int sdma_pcm_platform_register(struct device *dev, char *txdmachan, char *rxdmachan);
To register the platform driver, txdmachan/rxdmachan is only needed to be provided if the DMA channel names are not standard tx/rx, like in case of McPDM, or the DAI is only capable of one audio direction (DMIC, HDMI).
This patch only introduces the source file and changes to the Kconfig/Makefile, but does not change any of the DAI drivers to use it.
Signed-off-by: Peter Ujfalusi peter.ujfalusi@ti.com Acked-by: Jarkko Nikula jarkko.nikula@bitmer.com --- sound/soc/omap/Kconfig | 6 ++++ sound/soc/omap/Makefile | 2 ++ sound/soc/omap/sdma-pcm.c | 68 +++++++++++++++++++++++++++++++++++++++ sound/soc/omap/sdma-pcm.h | 21 ++++++++++++ 4 files changed, 97 insertions(+) create mode 100644 sound/soc/omap/sdma-pcm.c create mode 100644 sound/soc/omap/sdma-pcm.h
diff --git a/sound/soc/omap/Kconfig b/sound/soc/omap/Kconfig index 65864a60d0e2..22e216345a94 100644 --- a/sound/soc/omap/Kconfig +++ b/sound/soc/omap/Kconfig @@ -2,6 +2,12 @@ config SND_OMAP_SOC tristate "SoC Audio for Texas Instruments OMAP chips" depends on (ARCH_OMAP && DMA_OMAP) || (ARM && COMPILE_TEST) select SND_DMAENGINE_PCM + select SND_SDMA_SOC + +config SND_SDMA_SOC + tristate "SoC Audio for Texas Instruments chips using sDMA" + depends on DMA_OMAP + select SND_SOC_GENERIC_DMAENGINE_PCM
config SND_OMAP_SOC_DMIC tristate "TI Digital Microphone Module (DMIC) support" diff --git a/sound/soc/omap/Makefile b/sound/soc/omap/Makefile index a6785dc4fc90..0619a5b3bd9f 100644 --- a/sound/soc/omap/Makefile +++ b/sound/soc/omap/Makefile @@ -1,12 +1,14 @@ # SPDX-License-Identifier: GPL-2.0 # OMAP Platform Support snd-soc-omap-objs := omap-pcm.o +snd-soc-sdma-objs := sdma-pcm.o snd-soc-omap-dmic-objs := omap-dmic.o snd-soc-omap-mcbsp-objs := omap-mcbsp.o mcbsp.o snd-soc-omap-mcpdm-objs := omap-mcpdm.o snd-soc-omap-hdmi-audio-objs := omap-hdmi-audio.o
obj-$(CONFIG_SND_OMAP_SOC) += snd-soc-omap.o +obj-$(CONFIG_SND_SDMA_SOC) += snd-soc-sdma.o obj-$(CONFIG_SND_OMAP_SOC_DMIC) += snd-soc-omap-dmic.o obj-$(CONFIG_SND_OMAP_SOC_MCBSP) += snd-soc-omap-mcbsp.o obj-$(CONFIG_SND_OMAP_SOC_MCPDM) += snd-soc-omap-mcpdm.o diff --git a/sound/soc/omap/sdma-pcm.c b/sound/soc/omap/sdma-pcm.c new file mode 100644 index 000000000000..f7b2b5b69d27 --- /dev/null +++ b/sound/soc/omap/sdma-pcm.c @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com + * Author: Peter Ujfalusi peter.ujfalusi@ti.com + */ + +#include <sound/core.h> +#include <sound/pcm.h> +#include <sound/pcm_params.h> +#include <sound/soc.h> +#include <sound/dmaengine_pcm.h> +#include <linux/omap-dma.h> + +#include "sdma-pcm.h" + +static const struct snd_pcm_hardware sdma_pcm_hardware = { + .info = SNDRV_PCM_INFO_MMAP | + SNDRV_PCM_INFO_MMAP_VALID | + SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME | + SNDRV_PCM_INFO_NO_PERIOD_WAKEUP | + SNDRV_PCM_INFO_INTERLEAVED, + .period_bytes_min = 32, + .period_bytes_max = 64 * 1024, + .buffer_bytes_max = 128 * 1024, + .periods_min = 2, + .periods_max = 255, +}; + +static const struct snd_dmaengine_pcm_config sdma_dmaengine_pcm_config = { + .pcm_hardware = &sdma_pcm_hardware, + .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config, + .compat_filter_fn = omap_dma_filter_fn, + .prealloc_buffer_size = 128 * 1024, +}; + +int sdma_pcm_platform_register(struct device *dev, + char *txdmachan, char *rxdmachan) +{ + struct snd_dmaengine_pcm_config *config; + unsigned int flags = SND_DMAENGINE_PCM_FLAG_COMPAT; + + /* Standard names for the directions: 'tx' and 'rx' */ + if (!txdmachan && !rxdmachan) + return devm_snd_dmaengine_pcm_register(dev, + &sdma_dmaengine_pcm_config, + flags); + + config = devm_kzalloc(dev, sizeof(*config), GFP_KERNEL); + if (!config) + return -ENOMEM; + + *config = sdma_dmaengine_pcm_config; + + if (!txdmachan || !rxdmachan) { + /* One direction only PCM */ + flags |= SND_DMAENGINE_PCM_FLAG_HALF_DUPLEX; + if (!txdmachan) { + txdmachan = rxdmachan; + rxdmachan = NULL; + } + } + + config->chan_names[0] = txdmachan; + config->chan_names[1] = rxdmachan; + + return devm_snd_dmaengine_pcm_register(dev, config, flags); +} +EXPORT_SYMBOL_GPL(sdma_pcm_platform_register); diff --git a/sound/soc/omap/sdma-pcm.h b/sound/soc/omap/sdma-pcm.h new file mode 100644 index 000000000000..ce13edfc52d8 --- /dev/null +++ b/sound/soc/omap/sdma-pcm.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com + * Author: Peter Ujfalusi peter.ujfalusi@ti.com + */ + +#ifndef __SDMA_PCM_H__ +#define __SDMA_PCM_H__ + +#if IS_ENABLED(CONFIG_SND_SDMA_SOC) +int sdma_pcm_platform_register(struct device *dev, + char *txdmachan, char *rxdmachan); +#else +static inline int sdma_pcm_platform_register(struct device *dev, + char *txdmachan, char *rxdmachan) +{ + return 0; +} +#endif /* CONFIG_SND_SDMA_SOC */ + +#endif /* __SDMA_PCM_H__ */
Hi,
On Mon, Apr 30, 2018 at 09:57:42AM +0300, Peter Ujfalusi wrote:
[...] diff --git a/sound/soc/omap/sdma-pcm.h b/sound/soc/omap/sdma-pcm.h new file mode 100644 index 000000000000..ce13edfc52d8 --- /dev/null +++ b/sound/soc/omap/sdma-pcm.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/*
- Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com
- Author: Peter Ujfalusi peter.ujfalusi@ti.com
- */
+#ifndef __SDMA_PCM_H__ +#define __SDMA_PCM_H__
+#if IS_ENABLED(CONFIG_SND_SDMA_SOC) +int sdma_pcm_platform_register(struct device *dev,
char *txdmachan, char *rxdmachan);
+#else +static inline int sdma_pcm_platform_register(struct device *dev,
char *txdmachan, char *rxdmachan)
+{
- return 0;
I would expect some error code instead?
+} +#endif /* CONFIG_SND_SDMA_SOC */
+#endif /* __SDMA_PCM_H__ */
-- Sebastian
On 2018-04-30 13:55, Sebastian Reichel wrote:
Hi,
On Mon, Apr 30, 2018 at 09:57:42AM +0300, Peter Ujfalusi wrote:
[...] diff --git a/sound/soc/omap/sdma-pcm.h b/sound/soc/omap/sdma-pcm.h new file mode 100644 index 000000000000..ce13edfc52d8 --- /dev/null +++ b/sound/soc/omap/sdma-pcm.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/*
- Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com
- Author: Peter Ujfalusi peter.ujfalusi@ti.com
- */
+#ifndef __SDMA_PCM_H__ +#define __SDMA_PCM_H__
+#if IS_ENABLED(CONFIG_SND_SDMA_SOC) +int sdma_pcm_platform_register(struct device *dev,
char *txdmachan, char *rxdmachan);
+#else +static inline int sdma_pcm_platform_register(struct device *dev,
char *txdmachan, char *rxdmachan)
+{
- return 0;
I would expect some error code instead?
Yeah, it could return -ENODEV. It is there so the McASP can be compiled for daVinci/am335x/am43xx where we do not have sDMA, only EDMA.
+} +#endif /* CONFIG_SND_SDMA_SOC */
+#endif /* __SDMA_PCM_H__ */
-- Sebastian
- Péter
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
Hi,
On Mon, Apr 30, 2018 at 02:05:06PM +0300, Peter Ujfalusi wrote:
On 2018-04-30 13:55, Sebastian Reichel wrote:
On Mon, Apr 30, 2018 at 09:57:42AM +0300, Peter Ujfalusi wrote:
[...] diff --git a/sound/soc/omap/sdma-pcm.h b/sound/soc/omap/sdma-pcm.h new file mode 100644 index 000000000000..ce13edfc52d8 --- /dev/null +++ b/sound/soc/omap/sdma-pcm.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/*
- Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com
- Author: Peter Ujfalusi peter.ujfalusi@ti.com
- */
+#ifndef __SDMA_PCM_H__ +#define __SDMA_PCM_H__
+#if IS_ENABLED(CONFIG_SND_SDMA_SOC) +int sdma_pcm_platform_register(struct device *dev,
char *txdmachan, char *rxdmachan);
+#else +static inline int sdma_pcm_platform_register(struct device *dev,
char *txdmachan, char *rxdmachan)
+{
- return 0;
I would expect some error code instead?
Yeah, it could return -ENODEV.
I think it should. Returning success without providing the intended functionality is bad API design.
It is there so the McASP can be compiled for daVinci/am335x/am43xx where we do not have sDMA, only EDMA.
Are you sure, that you need the stub at all? Looking at the next patch the call is guarded with #if IS_BUILTIN(CONFIG_SND_SDMA_SOC) || IS_MODULE(CONFIG_SND_SDMA_SOC). I don't think it is called with CONFIG_SND_SDMA_SOC being disabled.
-- Sebastian
On 2018-04-30 14:39, Sebastian Reichel wrote:
Hi,
On Mon, Apr 30, 2018 at 02:05:06PM +0300, Peter Ujfalusi wrote:
On 2018-04-30 13:55, Sebastian Reichel wrote:
On Mon, Apr 30, 2018 at 09:57:42AM +0300, Peter Ujfalusi wrote:
[...] diff --git a/sound/soc/omap/sdma-pcm.h b/sound/soc/omap/sdma-pcm.h new file mode 100644 index 000000000000..ce13edfc52d8 --- /dev/null +++ b/sound/soc/omap/sdma-pcm.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/*
- Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com
- Author: Peter Ujfalusi peter.ujfalusi@ti.com
- */
+#ifndef __SDMA_PCM_H__ +#define __SDMA_PCM_H__
+#if IS_ENABLED(CONFIG_SND_SDMA_SOC) +int sdma_pcm_platform_register(struct device *dev,
char *txdmachan, char *rxdmachan);
+#else +static inline int sdma_pcm_platform_register(struct device *dev,
char *txdmachan, char *rxdmachan)
+{
- return 0;
I would expect some error code instead?
Yeah, it could return -ENODEV.
I think it should. Returning success without providing the intended functionality is bad API design.
It is there so the McASP can be compiled for daVinci/am335x/am43xx where we do not have sDMA, only EDMA.
Are you sure, that you need the stub at all? Looking at the next patch the call is guarded with #if IS_BUILTIN(CONFIG_SND_SDMA_SOC) || IS_MODULE(CONFIG_SND_SDMA_SOC). I don't think it is called with CONFIG_SND_SDMA_SOC being disabled.
True.
-- Sebastian
- Péter
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
Use the new platform driver in case of sDMA.
Signed-off-by: Peter Ujfalusi peter.ujfalusi@ti.com --- sound/soc/davinci/Kconfig | 2 +- sound/soc/davinci/davinci-mcasp.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/sound/soc/davinci/Kconfig b/sound/soc/davinci/Kconfig index 21bf301ba87a..792b75a25951 100644 --- a/sound/soc/davinci/Kconfig +++ b/sound/soc/davinci/Kconfig @@ -24,7 +24,7 @@ config SND_DAVINCI_SOC_I2S
config SND_DAVINCI_SOC_MCASP tristate "TI Multichannel Audio Serial Port (McASP) support" - depends on SND_OMAP_SOC || SND_EDMA_SOC + depends on SND_SDMA_SOC || SND_EDMA_SOC help Say Y or M here if you want to have support for McASP IP found in various Texas Instruments SoCs like: diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c index ba4da45902b8..90edd5a6880c 100644 --- a/sound/soc/davinci/davinci-mcasp.c +++ b/sound/soc/davinci/davinci-mcasp.c @@ -36,10 +36,10 @@ #include <sound/initval.h> #include <sound/soc.h> #include <sound/dmaengine_pcm.h> -#include <sound/omap-pcm.h> #include <dt-bindings/sound/ti-mcasp.h>
#include "edma-pcm.h" +#include "../omap/sdma-pcm.h" #include "davinci-mcasp.h"
#define MCASP_MAX_AFIFO_DEPTH 64 @@ -2069,10 +2069,10 @@ static int davinci_mcasp_probe(struct platform_device *pdev) #endif break; case PCM_SDMA: -#if IS_BUILTIN(CONFIG_SND_OMAP_SOC) || \ +#if IS_BUILTIN(CONFIG_SND_SDMA_SOC) || \ (IS_MODULE(CONFIG_SND_DAVINCI_SOC_MCASP) && \ - IS_MODULE(CONFIG_SND_OMAP_SOC)) - ret = omap_pcm_platform_register(&pdev->dev); + IS_MODULE(CONFIG_SND_SDMA_SOC)) + ret = sdma_pcm_platform_register(&pdev->dev, NULL, NULL); #else dev_err(&pdev->dev, "Missing SND_SDMA_SOC\n"); ret = -EINVAL;
Use the new platform driver.
Signed-off-by: Peter Ujfalusi peter.ujfalusi@ti.com Acked-by: Jarkko Nikula jarkko.nikula@bitmer.com --- sound/soc/omap/Kconfig | 2 +- sound/soc/omap/omap-hdmi-audio.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/sound/soc/omap/Kconfig b/sound/soc/omap/Kconfig index 22e216345a94..359064cec550 100644 --- a/sound/soc/omap/Kconfig +++ b/sound/soc/omap/Kconfig @@ -32,7 +32,7 @@ config SND_OMAP_SOC_MCPDM
config SND_OMAP_SOC_HDMI_AUDIO tristate "HDMI audio support for OMAP4+ based SoCs" - depends on SND_OMAP_SOC + depends on SND_SDMA_SOC help For HDMI audio to work OMAPDSS HDMI support should be enabled. diff --git a/sound/soc/omap/omap-hdmi-audio.c b/sound/soc/omap/omap-hdmi-audio.c index 8eeac7cab1c1..8a99a8837dc9 100644 --- a/sound/soc/omap/omap-hdmi-audio.c +++ b/sound/soc/omap/omap-hdmi-audio.c @@ -26,9 +26,10 @@ #include <sound/dmaengine_pcm.h> #include <uapi/sound/asound.h> #include <sound/asoundef.h> -#include <sound/omap-pcm.h> #include <sound/omap-hdmi-audio.h>
+#include "sdma-pcm.h" + #define DRV_NAME "omap-hdmi-audio"
struct hdmi_audio_data { @@ -352,7 +353,7 @@ static int omap_hdmi_audio_probe(struct platform_device *pdev) if (ret) return ret;
- ret = omap_pcm_platform_register(ad->dssdev); + ret = sdma_pcm_platform_register(ad->dssdev, "audio_tx", NULL); if (ret) return ret;
Use the new platform driver.
Signed-off-by: Peter Ujfalusi peter.ujfalusi@ti.com Acked-by: Jarkko Nikula jarkko.nikula@bitmer.com --- sound/soc/omap/Kconfig | 4 ++-- sound/soc/omap/omap-dmic.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/sound/soc/omap/Kconfig b/sound/soc/omap/Kconfig index 359064cec550..19413afc3b23 100644 --- a/sound/soc/omap/Kconfig +++ b/sound/soc/omap/Kconfig @@ -11,7 +11,7 @@ config SND_SDMA_SOC
config SND_OMAP_SOC_DMIC tristate "TI Digital Microphone Module (DMIC) support" - depends on SND_OMAP_SOC && (ARCH_OMAP4 || SOC_OMAP5) + depends on SND_SDMA_SOC && (ARCH_OMAP4 || SOC_OMAP5) help Say Y or M here if you want to have support for DMIC IP found in OMAP4 and OMAP5. @@ -117,7 +117,7 @@ config SND_OMAP_SOC_OMAP_TWL4030
config SND_OMAP_SOC_OMAP_ABE_TWL6040 tristate "SoC Audio support for OMAP boards using ABE and twl6040 codec" - depends on TWL6040_CORE && SND_OMAP_SOC && COMMON_CLK + depends on TWL6040_CORE && SND_OMAP_SOC && SND_SDMA_SOC && COMMON_CLK depends on ARCH_OMAP4 || (SOC_OMAP5 && MFD_PALMAS) || COMPILE_TEST select SND_OMAP_SOC_DMIC select SND_OMAP_SOC_MCPDM diff --git a/sound/soc/omap/omap-dmic.c b/sound/soc/omap/omap-dmic.c index b2f5d2fa354d..51dd7c65096b 100644 --- a/sound/soc/omap/omap-dmic.c +++ b/sound/soc/omap/omap-dmic.c @@ -40,9 +40,9 @@ #include <sound/initval.h> #include <sound/soc.h> #include <sound/dmaengine_pcm.h> -#include <sound/omap-pcm.h>
#include "omap-dmic.h" +#include "sdma-pcm.h"
struct omap_dmic { struct device *dev; @@ -501,7 +501,7 @@ static int asoc_dmic_probe(struct platform_device *pdev) if (ret) return ret;
- ret = omap_pcm_platform_register(&pdev->dev); + ret = sdma_pcm_platform_register(&pdev->dev, NULL, "up_link"); if (ret) return ret;
Use the new platform driver.
Signed-off-by: Peter Ujfalusi peter.ujfalusi@ti.com Acked-by: Jarkko Nikula jarkko.nikula@bitmer.com --- sound/soc/omap/Kconfig | 4 ++-- sound/soc/omap/omap-mcpdm.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/sound/soc/omap/Kconfig b/sound/soc/omap/Kconfig index 19413afc3b23..6a60a8926ecf 100644 --- a/sound/soc/omap/Kconfig +++ b/sound/soc/omap/Kconfig @@ -25,7 +25,7 @@ config SND_OMAP_SOC_MCBSP
config SND_OMAP_SOC_MCPDM tristate "TI Multichannel PDM Controller (McPDM) support" - depends on SND_OMAP_SOC && (ARCH_OMAP4 || SOC_OMAP5) + depends on SND_SDMA_SOC && (ARCH_OMAP4 || SOC_OMAP5) help Say Y or M here if you want to have support for McPDM IP found in OMAP4 and OMAP5. @@ -117,7 +117,7 @@ config SND_OMAP_SOC_OMAP_TWL4030
config SND_OMAP_SOC_OMAP_ABE_TWL6040 tristate "SoC Audio support for OMAP boards using ABE and twl6040 codec" - depends on TWL6040_CORE && SND_OMAP_SOC && SND_SDMA_SOC && COMMON_CLK + depends on TWL6040_CORE && SND_SDMA_SOC && COMMON_CLK depends on ARCH_OMAP4 || (SOC_OMAP5 && MFD_PALMAS) || COMPILE_TEST select SND_OMAP_SOC_DMIC select SND_OMAP_SOC_MCPDM diff --git a/sound/soc/omap/omap-mcpdm.c b/sound/soc/omap/omap-mcpdm.c index 04f4f3cb0f46..3f3e7c4ee175 100644 --- a/sound/soc/omap/omap-mcpdm.c +++ b/sound/soc/omap/omap-mcpdm.c @@ -41,9 +41,9 @@ #include <sound/pcm_params.h> #include <sound/soc.h> #include <sound/dmaengine_pcm.h> -#include <sound/omap-pcm.h>
#include "omap-mcpdm.h" +#include "sdma-pcm.h"
struct mcpdm_link_config { u32 link_mask; /* channel mask for the direction */ @@ -565,7 +565,7 @@ static int asoc_mcpdm_probe(struct platform_device *pdev) if (ret) return ret;
- return omap_pcm_platform_register(&pdev->dev); + return sdma_pcm_platform_register(&pdev->dev, "dn_link", "up_link"); }
static const struct of_device_id omap_mcpdm_of_match[] = {
Use the new platform driver.
Signed-off-by: Peter Ujfalusi peter.ujfalusi@ti.com Acked-by: Jarkko Nikula jarkko.nikula@bitmer.com --- sound/soc/omap/Kconfig | 16 ++++++++-------- sound/soc/omap/omap-mcbsp.c | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/sound/soc/omap/Kconfig b/sound/soc/omap/Kconfig index 6a60a8926ecf..4ee7f9e25d71 100644 --- a/sound/soc/omap/Kconfig +++ b/sound/soc/omap/Kconfig @@ -18,7 +18,7 @@ config SND_OMAP_SOC_DMIC
config SND_OMAP_SOC_MCBSP tristate "TI Multichannel Buffered Serial Port (McBSP) support" - depends on SND_OMAP_SOC + depends on SND_SDMA_SOC help Say Y or M here if you want to have support for McBSP IP found in Texas Instruments OMAP1/2/3/4/5 SoCs. @@ -47,7 +47,7 @@ config SND_OMAP_SOC_HDMI_AUDIO
config SND_OMAP_SOC_N810 tristate "SoC Audio support for Nokia N810" - depends on SND_OMAP_SOC && MACH_NOKIA_N810 && I2C + depends on SND_SDMA_SOC && MACH_NOKIA_N810 && I2C select SND_OMAP_SOC_MCBSP select SND_SOC_TLV320AIC3X help @@ -55,7 +55,7 @@ config SND_OMAP_SOC_N810
config SND_OMAP_SOC_RX51 tristate "SoC Audio support for Nokia N900 (RX-51)" - depends on SND_OMAP_SOC && ARM && I2C + depends on SND_SDMA_SOC && ARM && I2C select SND_OMAP_SOC_MCBSP select SND_SOC_TLV320AIC3X select SND_SOC_TPA6130A2 @@ -66,7 +66,7 @@ config SND_OMAP_SOC_RX51
config SND_OMAP_SOC_AMS_DELTA tristate "SoC Audio support for Amstrad E3 (Delta) videophone" - depends on SND_OMAP_SOC && MACH_AMS_DELTA && TTY + depends on SND_SDMA_SOC && MACH_AMS_DELTA && TTY select SND_OMAP_SOC_MCBSP select SND_SOC_CX20442 help @@ -85,7 +85,7 @@ config SND_OMAP_SOC_AMS_DELTA
config SND_OMAP_SOC_OSK5912 tristate "SoC Audio support for omap osk5912" - depends on SND_OMAP_SOC && MACH_OMAP_OSK && I2C + depends on SND_SDMA_SOC && MACH_OMAP_OSK && I2C select SND_OMAP_SOC_MCBSP select SND_SOC_TLV320AIC23_I2C help @@ -93,7 +93,7 @@ config SND_OMAP_SOC_OSK5912
config SND_OMAP_SOC_AM3517EVM tristate "SoC Audio support for OMAP3517 / AM3517 EVM" - depends on SND_OMAP_SOC && MACH_OMAP3517EVM && I2C + depends on SND_SDMA_SOC && MACH_OMAP3517EVM && I2C select SND_OMAP_SOC_MCBSP select SND_SOC_TLV320AIC23_I2C help @@ -102,7 +102,7 @@ config SND_OMAP_SOC_AM3517EVM
config SND_OMAP_SOC_OMAP_TWL4030 tristate "SoC Audio support for TI SoC based boards with twl4030 codec" - depends on TWL4030_CORE && SND_OMAP_SOC + depends on TWL4030_CORE && SND_SDMA_SOC select SND_OMAP_SOC_MCBSP select SND_SOC_TWL4030 help @@ -135,7 +135,7 @@ config SND_OMAP_SOC_OMAP_ABE_TWL6040
config SND_OMAP_SOC_OMAP3_PANDORA tristate "SoC Audio support for OMAP3 Pandora" - depends on TWL4030_CORE && SND_OMAP_SOC && MACH_OMAP3_PANDORA + depends on TWL4030_CORE && SND_SDMA_SOC && MACH_OMAP3_PANDORA select SND_OMAP_SOC_MCBSP select SND_SOC_TWL4030 help diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index 6b40bdbef336..d0ebb6b9bfac 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c @@ -34,11 +34,11 @@ #include <sound/initval.h> #include <sound/soc.h> #include <sound/dmaengine_pcm.h> -#include <sound/omap-pcm.h>
#include <linux/platform_data/asoc-ti-mcbsp.h> #include "mcbsp.h" #include "omap-mcbsp.h" +#include "sdma-pcm.h"
#define OMAP_MCBSP_RATES (SNDRV_PCM_RATE_8000_96000)
@@ -868,7 +868,7 @@ static int asoc_mcbsp_probe(struct platform_device *pdev) if (ret) return ret;
- return omap_pcm_platform_register(&pdev->dev); + return sdma_pcm_platform_register(&pdev->dev, NULL, NULL); }
static int asoc_mcbsp_remove(struct platform_device *pdev)
All DAI drivers are now using the new sdma-pcm platform driver. The omap-pcm can be removed from the tree, but we need to keep the SND_OMAP_SOC Kconfig option until the relevant defconfigs are updated to avoid regression due to missing audio.
Signed-off-by: Peter Ujfalusi peter.ujfalusi@ti.com --- include/sound/omap-pcm.h | 30 ----- sound/soc/omap/Kconfig | 3 +- sound/soc/omap/Makefile | 2 - sound/soc/omap/omap-pcm.c | 262 -------------------------------------- 4 files changed, 1 insertion(+), 296 deletions(-) delete mode 100644 include/sound/omap-pcm.h delete mode 100644 sound/soc/omap/omap-pcm.c
diff --git a/include/sound/omap-pcm.h b/include/sound/omap-pcm.h deleted file mode 100644 index c1d2f31d71e9..000000000000 --- a/include/sound/omap-pcm.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * omap-pcm.h - OMAP PCM driver - * - * Copyright (C) 2014 Texas Instruments, Inc. - * - * Author: Peter Ujfalusi peter.ujfalusi@ti.com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - */ - -#ifndef __OMAP_PCM_H__ -#define __OMAP_PCM_H__ - -#if IS_ENABLED(CONFIG_SND_OMAP_SOC) -int omap_pcm_platform_register(struct device *dev); -#else -static inline int omap_pcm_platform_register(struct device *dev) -{ - return 0; -} -#endif /* CONFIG_SND_OMAP_SOC */ - -#endif /* __OMAP_PCM_H__ */ diff --git a/sound/soc/omap/Kconfig b/sound/soc/omap/Kconfig index 4ee7f9e25d71..03f4f4f8a17e 100644 --- a/sound/soc/omap/Kconfig +++ b/sound/soc/omap/Kconfig @@ -1,7 +1,6 @@ config SND_OMAP_SOC - tristate "SoC Audio for Texas Instruments OMAP chips" + tristate "SoC Audio for Texas Instruments OMAP chips (deprecated)" depends on (ARCH_OMAP && DMA_OMAP) || (ARM && COMPILE_TEST) - select SND_DMAENGINE_PCM select SND_SDMA_SOC
config SND_SDMA_SOC diff --git a/sound/soc/omap/Makefile b/sound/soc/omap/Makefile index 0619a5b3bd9f..53eba3413485 100644 --- a/sound/soc/omap/Makefile +++ b/sound/soc/omap/Makefile @@ -1,13 +1,11 @@ # SPDX-License-Identifier: GPL-2.0 # OMAP Platform Support -snd-soc-omap-objs := omap-pcm.o snd-soc-sdma-objs := sdma-pcm.o snd-soc-omap-dmic-objs := omap-dmic.o snd-soc-omap-mcbsp-objs := omap-mcbsp.o mcbsp.o snd-soc-omap-mcpdm-objs := omap-mcpdm.o snd-soc-omap-hdmi-audio-objs := omap-hdmi-audio.o
-obj-$(CONFIG_SND_OMAP_SOC) += snd-soc-omap.o obj-$(CONFIG_SND_SDMA_SOC) += snd-soc-sdma.o obj-$(CONFIG_SND_OMAP_SOC_DMIC) += snd-soc-omap-dmic.o obj-$(CONFIG_SND_OMAP_SOC_MCBSP) += snd-soc-omap-mcbsp.o diff --git a/sound/soc/omap/omap-pcm.c b/sound/soc/omap/omap-pcm.c deleted file mode 100644 index 778cc8f75b6a..000000000000 --- a/sound/soc/omap/omap-pcm.c +++ /dev/null @@ -1,262 +0,0 @@ -/* - * omap-pcm.c -- ALSA PCM interface for the OMAP SoC - * - * Copyright (C) 2008 Nokia Corporation - * - * Contact: Jarkko Nikula jarkko.nikula@bitmer.com - * Peter Ujfalusi peter.ujfalusi@ti.com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA - * - */ - -#include <linux/dma-mapping.h> -#include <linux/slab.h> -#include <linux/module.h> -#include <linux/omap-dma.h> -#include <sound/core.h> -#include <sound/pcm.h> -#include <sound/pcm_params.h> -#include <sound/dmaengine_pcm.h> -#include <sound/soc.h> -#include <sound/omap-pcm.h> - -#ifdef CONFIG_ARCH_OMAP1 -#define pcm_omap1510() cpu_is_omap1510() -#else -#define pcm_omap1510() 0 -#endif - -static struct snd_pcm_hardware omap_pcm_hardware = { - .info = SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_PAUSE | - SNDRV_PCM_INFO_RESUME | - SNDRV_PCM_INFO_NO_PERIOD_WAKEUP, - .period_bytes_min = 32, - .period_bytes_max = 64 * 1024, - .periods_min = 2, - .periods_max = 255, - .buffer_bytes_max = 128 * 1024, -}; - -/* sDMA supports only 1, 2, and 4 byte transfer elements. */ -static void omap_pcm_limit_supported_formats(void) -{ - int i; - - for (i = 0; i <= SNDRV_PCM_FORMAT_LAST; i++) { - switch (snd_pcm_format_physical_width(i)) { - case 8: - case 16: - case 32: - omap_pcm_hardware.formats |= (1LL << i); - break; - default: - break; - } - } -} - -/* this may get called several times by oss emulation */ -static int omap_pcm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct omap_pcm_dma_data *dma_data; - struct dma_slave_config config; - struct dma_chan *chan; - int err = 0; - - memset(&config, 0x00, sizeof(config)); - - dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); - - /* return if this is a bufferless transfer e.g. - * codec <--> BT codec or GSM modem -- lg FIXME */ - if (!dma_data) - return 0; - - snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); - runtime->dma_bytes = params_buffer_bytes(params); - - chan = snd_dmaengine_pcm_get_chan(substream); - if (!chan) - return -EINVAL; - - /* fills in addr_width and direction */ - err = snd_hwparams_to_dma_slave_config(substream, params, &config); - if (err) - return err; - - snd_dmaengine_pcm_set_config_from_dai_data(substream, - snd_soc_dai_get_dma_data(rtd->cpu_dai, substream), - &config); - - return dmaengine_slave_config(chan, &config); -} - -static int omap_pcm_hw_free(struct snd_pcm_substream *substream) -{ - snd_pcm_set_runtime_buffer(substream, NULL); - return 0; -} - -static snd_pcm_uframes_t omap_pcm_pointer(struct snd_pcm_substream *substream) -{ - snd_pcm_uframes_t offset; - - if (pcm_omap1510()) - offset = snd_dmaengine_pcm_pointer_no_residue(substream); - else - offset = snd_dmaengine_pcm_pointer(substream); - - return offset; -} - -static int omap_pcm_open(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_dmaengine_dai_dma_data *dma_data; - int ret; - - snd_soc_set_runtime_hwparams(substream, &omap_pcm_hardware); - - dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); - - /* DT boot: filter_data is the DMA name */ - if (rtd->cpu_dai->dev->of_node) { - struct dma_chan *chan; - - chan = dma_request_slave_channel(rtd->cpu_dai->dev, - dma_data->filter_data); - ret = snd_dmaengine_pcm_open(substream, chan); - } else { - ret = snd_dmaengine_pcm_open_request_chan(substream, - omap_dma_filter_fn, - dma_data->filter_data); - } - return ret; -} - -static int omap_pcm_mmap(struct snd_pcm_substream *substream, - struct vm_area_struct *vma) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - - return dma_mmap_wc(substream->pcm->card->dev, vma, runtime->dma_area, - runtime->dma_addr, runtime->dma_bytes); -} - -static const struct snd_pcm_ops omap_pcm_ops = { - .open = omap_pcm_open, - .close = snd_dmaengine_pcm_close_release_chan, - .ioctl = snd_pcm_lib_ioctl, - .hw_params = omap_pcm_hw_params, - .hw_free = omap_pcm_hw_free, - .trigger = snd_dmaengine_pcm_trigger, - .pointer = omap_pcm_pointer, - .mmap = omap_pcm_mmap, -}; - -static int omap_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, - int stream) -{ - struct snd_pcm_substream *substream = pcm->streams[stream].substream; - struct snd_dma_buffer *buf = &substream->dma_buffer; - size_t size = omap_pcm_hardware.buffer_bytes_max; - - buf->dev.type = SNDRV_DMA_TYPE_DEV; - buf->dev.dev = pcm->card->dev; - buf->private_data = NULL; - buf->area = dma_alloc_wc(pcm->card->dev, size, &buf->addr, GFP_KERNEL); - if (!buf->area) - return -ENOMEM; - - buf->bytes = size; - return 0; -} - -static void omap_pcm_free_dma_buffers(struct snd_pcm *pcm) -{ - struct snd_pcm_substream *substream; - struct snd_dma_buffer *buf; - int stream; - - for (stream = 0; stream < 2; stream++) { - substream = pcm->streams[stream].substream; - if (!substream) - continue; - - buf = &substream->dma_buffer; - if (!buf->area) - continue; - - dma_free_wc(pcm->card->dev, buf->bytes, buf->area, buf->addr); - buf->area = NULL; - } -} - -static int omap_pcm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - struct snd_pcm *pcm = rtd->pcm; - int ret; - - ret = dma_coerce_mask_and_coherent(card->dev, DMA_BIT_MASK(32)); - if (ret) - return ret; - - if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) { - ret = omap_pcm_preallocate_dma_buffer(pcm, - SNDRV_PCM_STREAM_PLAYBACK); - if (ret) - goto out; - } - - if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) { - ret = omap_pcm_preallocate_dma_buffer(pcm, - SNDRV_PCM_STREAM_CAPTURE); - if (ret) - goto out; - } - -out: - /* free preallocated buffers in case of error */ - if (ret) - omap_pcm_free_dma_buffers(pcm); - - return ret; -} - -static const struct snd_soc_component_driver omap_soc_component = { - .ops = &omap_pcm_ops, - .pcm_new = omap_pcm_new, - .pcm_free = omap_pcm_free_dma_buffers, -}; - -int omap_pcm_platform_register(struct device *dev) -{ - omap_pcm_limit_supported_formats(); - return devm_snd_soc_register_component(dev, &omap_soc_component, - NULL, 0); -} -EXPORT_SYMBOL_GPL(omap_pcm_platform_register); - -MODULE_AUTHOR("Jarkko Nikula jarkko.nikula@bitmer.com"); -MODULE_DESCRIPTION("OMAP PCM DMA module"); -MODULE_LICENSE("GPL");
participants (2)
-
Peter Ujfalusi
-
Sebastian Reichel