[alsa-devel] [PATCH 0/5] ASoC: OMAP2+: Update Audio IP with sDMA binding for DT boot
This patch serie is converting OMAP Audio IPs in order to use OMAP sDMA DT binding in case of DT boot on OMAP2+ platforms.
It is depending on the next patches:
[1] http://www.spinics.net/lists/arm-kernel/msg227836.html [2] http://www.mail-archive.com/linux-omap@vger.kernel.org/msg84668.html
It has been tested on: - OMAP5 (sEVM/panda)in DT boot (McPDM/DMIC). - OMAP4 (SDP4430/Panda) in both DT/non DT boot (McPDM/DMIC) - OMAP3 (Beagle XM) in both DT/non DT boot (McBSP)
Sebastien Guiriec (5): ASoC: omap-pcm: Move to generic DMA for DT binding ASoC: omap-dmic: Update driver for DMA DT binding. ASoC: omap-mcpdm: Update driver for DMA DT binding. ASoC: omap-mcbsp:Update driver for DMA DT binding. ARM: dts: OMAP2+: Add SDMA Audio IPs bindings
arch/arm/boot/dts/omap2420.dtsi | 6 ++++++ arch/arm/boot/dts/omap2430.dtsi | 15 +++++++++++++++ arch/arm/boot/dts/omap3.dtsi | 15 +++++++++++++++ arch/arm/boot/dts/omap4.dtsi | 17 +++++++++++++++++ arch/arm/boot/dts/omap5.dtsi | 14 ++++++++++++++ sound/soc/omap/mcbsp.c | 26 ++++++++++++++++---------- sound/soc/omap/omap-dmic.c | 15 +++++++++------ sound/soc/omap/omap-mcpdm.c | 22 ++++++++++++++-------- sound/soc/omap/omap-pcm.c | 12 ++++++++++-- sound/soc/omap/omap-pcm.h | 1 + 10 files changed, 117 insertions(+), 26 deletions(-)
Update in order to use OMAP DMA DT binding for OMAP2+. In case of DT boot snd_dmaengine_generic_pcm_open function is used.
Signed-off-by: Sebastien Guiriec s-guiriec@ti.com --- sound/soc/omap/omap-pcm.c | 12 ++++++++++-- sound/soc/omap/omap-pcm.h | 1 + 2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/sound/soc/omap/omap-pcm.c b/sound/soc/omap/omap-pcm.c index c722c2e..df01a95 100644 --- a/sound/soc/omap/omap-pcm.c +++ b/sound/soc/omap/omap-pcm.c @@ -176,13 +176,21 @@ static int omap_pcm_open(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct omap_pcm_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);
- return snd_dmaengine_pcm_open(substream, omap_dma_filter_fn, - &dma_data->dma_req); + if (rtd->cpu_dai->dev->of_node) + ret = snd_dmaengine_generic_pcm_open(substream, + rtd->cpu_dai->dev, + dma_data->dma_name); + else + ret = snd_dmaengine_pcm_open(substream, omap_dma_filter_fn, + &dma_data->dma_req); + + return ret; }
static int omap_pcm_close(struct snd_pcm_substream *substream) diff --git a/sound/soc/omap/omap-pcm.h b/sound/soc/omap/omap-pcm.h index cabe74c..06faa38 100644 --- a/sound/soc/omap/omap-pcm.h +++ b/sound/soc/omap/omap-pcm.h @@ -29,6 +29,7 @@ struct snd_pcm_substream;
struct omap_pcm_dma_data { char *name; /* stream identifier */ + char *dma_name; /* DMA request name */ int dma_req; /* DMA request line */ unsigned long port_addr; /* transmit/receive register */ void (*set_threshold)(struct snd_pcm_substream *substream);
Update the driver in order to use OMAP DMA DT binding instead of hwmod data for DT boot.
Signed-off-by: Sebastien Guiriec s-guiriec@ti.com --- sound/soc/omap/omap-dmic.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/sound/soc/omap/omap-dmic.c b/sound/soc/omap/omap-dmic.c index ba49ccd..8695b32 100644 --- a/sound/soc/omap/omap-dmic.c +++ b/sound/soc/omap/omap-dmic.c @@ -62,6 +62,7 @@ struct omap_dmic { */ static struct omap_pcm_dma_data omap_dmic_dai_dma_params = { .name = "DMIC capture", + .dma_name = "up_link", };
static inline void omap_dmic_write(struct omap_dmic *dmic, u16 reg, u32 val) @@ -478,13 +479,15 @@ static int asoc_dmic_probe(struct platform_device *pdev) } omap_dmic_dai_dma_params.port_addr = res->start + OMAP_DMIC_DATA_REG;
- res = platform_get_resource(pdev, IORESOURCE_DMA, 0); - if (!res) { - dev_err(dmic->dev, "invalid dma resource\n"); - ret = -ENODEV; - goto err_put_clk; + if (!pdev->dev.of_node) { + res = platform_get_resource(pdev, IORESOURCE_DMA, 0); + if (!res) { + dev_err(dmic->dev, "invalid dma resource\n"); + ret = -ENODEV; + goto err_put_clk; + } + omap_dmic_dai_dma_params.dma_req = res->start; } - omap_dmic_dai_dma_params.dma_req = res->start;
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu"); if (!res) {
Update the driver in order to use OMAP DMA DT binding instead of hwmod data for DT boot.
Signed-off-by: Sebastien Guiriec s-guiriec@ti.com --- sound/soc/omap/omap-mcpdm.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/sound/soc/omap/omap-mcpdm.c b/sound/soc/omap/omap-mcpdm.c index 5ca11bd..f41bac8 100644 --- a/sound/soc/omap/omap-mcpdm.c +++ b/sound/soc/omap/omap-mcpdm.c @@ -71,9 +71,11 @@ struct omap_mcpdm { static struct omap_pcm_dma_data omap_mcpdm_dai_dma_params[] = { { .name = "Audio playback", + .dma_name = "dn_link", }, { .name = "Audio capture", + .dma_name = "up_link", }, };
@@ -449,17 +451,21 @@ static int asoc_mcpdm_probe(struct platform_device *pdev) omap_mcpdm_dai_dma_params[0].port_addr = res->start + MCPDM_REG_DN_DATA; omap_mcpdm_dai_dma_params[1].port_addr = res->start + MCPDM_REG_UP_DATA;
- res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "dn_link"); - if (!res) - return -ENODEV; + if (!pdev->dev.of_node) { + res = platform_get_resource_byname(pdev, IORESOURCE_DMA, + "dn_link"); + if (!res) + return -ENODEV;
- omap_mcpdm_dai_dma_params[0].dma_req = res->start; + omap_mcpdm_dai_dma_params[0].dma_req = res->start;
- res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "up_link"); - if (!res) - return -ENODEV; + res = platform_get_resource_byname(pdev, IORESOURCE_DMA, + "up_link"); + if (!res) + return -ENODEV;
- omap_mcpdm_dai_dma_params[1].dma_req = res->start; + omap_mcpdm_dai_dma_params[1].dma_req = res->start; + }
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu"); if (res == NULL)
Update the driver in order to use OMAP DMA DT binding instead of hwmod data for DT boot.
Signed-off-by: Sebastien Guiriec s-guiriec@ti.com --- sound/soc/omap/mcbsp.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-)
diff --git a/sound/soc/omap/mcbsp.c b/sound/soc/omap/mcbsp.c index 285c836..16936493 100644 --- a/sound/soc/omap/mcbsp.c +++ b/sound/soc/omap/mcbsp.c @@ -1012,24 +1012,30 @@ int omap_mcbsp_init(struct platform_device *pdev) } }
- res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "rx"); - if (!res) { - dev_err(&pdev->dev, "invalid rx DMA channel\n"); - return -ENODEV; + if (!pdev->dev.of_node) { + res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "rx"); + if (!res) { + dev_err(&pdev->dev, "invalid rx DMA channel\n"); + return -ENODEV; + } + mcbsp->dma_data[1].dma_req = res->start; } /* RX DMA request number, and port address configuration */ mcbsp->dma_data[1].name = "Audio Capture"; - mcbsp->dma_data[1].dma_req = res->start; + mcbsp->dma_data[1].dma_name = "rx"; mcbsp->dma_data[1].port_addr = omap_mcbsp_dma_reg_params(mcbsp, 1);
- res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "tx"); - if (!res) { - dev_err(&pdev->dev, "invalid tx DMA channel\n"); - return -ENODEV; + if (!pdev->dev.of_node) { + res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "tx"); + if (!res) { + dev_err(&pdev->dev, "invalid tx DMA channel\n"); + return -ENODEV; + } + mcbsp->dma_data[0].dma_req = res->start; } /* TX DMA request number, and port address configuration */ mcbsp->dma_data[0].name = "Audio Playback"; - mcbsp->dma_data[0].dma_req = res->start; + mcbsp->dma_data[0].dma_name = "tx"; mcbsp->dma_data[0].port_addr = omap_mcbsp_dma_reg_params(mcbsp, 0);
mcbsp->fclk = clk_get(&pdev->dev, "fck");
Populate DMA client information for McBSP DMIC and McPDM periperhal on OMAP2+ devices.
Signed-off-by: Sebastien Guiriec s-guiriec@ti.com --- arch/arm/boot/dts/omap2420.dtsi | 6 ++++++ arch/arm/boot/dts/omap2430.dtsi | 15 +++++++++++++++ arch/arm/boot/dts/omap3.dtsi | 15 +++++++++++++++ arch/arm/boot/dts/omap4.dtsi | 17 +++++++++++++++++ arch/arm/boot/dts/omap5.dtsi | 14 ++++++++++++++ 5 files changed, 67 insertions(+)
diff --git a/arch/arm/boot/dts/omap2420.dtsi b/arch/arm/boot/dts/omap2420.dtsi index af65609..45930f2 100644 --- a/arch/arm/boot/dts/omap2420.dtsi +++ b/arch/arm/boot/dts/omap2420.dtsi @@ -37,6 +37,9 @@ <60>; /* RX interrupt */ interrupt-names = "tx", "rx"; ti,hwmods = "mcbsp1"; + dmas = <&sdma 31>, + <&sdma 32>; + dma-names = "tx", "rx"; };
mcbsp2: mcbsp@48076000 { @@ -47,6 +50,9 @@ <63>; /* RX interrupt */ interrupt-names = "tx", "rx"; ti,hwmods = "mcbsp2"; + dmas = <&sdma 33>, + <&sdma 34>; + dma-names = "tx", "rx"; };
timer1: timer@48028000 { diff --git a/arch/arm/boot/dts/omap2430.dtsi b/arch/arm/boot/dts/omap2430.dtsi index c392445..cfe7ed9 100644 --- a/arch/arm/boot/dts/omap2430.dtsi +++ b/arch/arm/boot/dts/omap2430.dtsi @@ -40,6 +40,9 @@ interrupt-names = "common", "tx", "rx", "rx_overflow"; ti,buffer-size = <128>; ti,hwmods = "mcbsp1"; + dmas = <&sdma 31>, + <&sdma 32>; + dma-names = "tx", "rx"; };
mcbsp2: mcbsp@48076000 { @@ -52,6 +55,9 @@ interrupt-names = "common", "tx", "rx"; ti,buffer-size = <128>; ti,hwmods = "mcbsp2"; + dmas = <&sdma 33>, + <&sdma 34>; + dma-names = "tx", "rx"; };
mcbsp3: mcbsp@4808c000 { @@ -64,6 +70,9 @@ interrupt-names = "common", "tx", "rx"; ti,buffer-size = <128>; ti,hwmods = "mcbsp3"; + dmas = <&sdma 17>, + <&sdma 18>; + dma-names = "tx", "rx"; };
mcbsp4: mcbsp@4808e000 { @@ -76,6 +85,9 @@ interrupt-names = "common", "tx", "rx"; ti,buffer-size = <128>; ti,hwmods = "mcbsp4"; + dmas = <&sdma 19>, + <&sdma 20>; + dma-names = "tx", "rx"; };
mcbsp5: mcbsp@48096000 { @@ -88,6 +100,9 @@ interrupt-names = "common", "tx", "rx"; ti,buffer-size = <128>; ti,hwmods = "mcbsp5"; + dmas = <&sdma 21>, + <&sdma 22>; + dma-names = "tx", "rx"; };
timer1: timer@49018000 { diff --git a/arch/arm/boot/dts/omap3.dtsi b/arch/arm/boot/dts/omap3.dtsi index 4e7acb6..f901404 100644 --- a/arch/arm/boot/dts/omap3.dtsi +++ b/arch/arm/boot/dts/omap3.dtsi @@ -289,6 +289,9 @@ interrupt-names = "common", "tx", "rx"; ti,buffer-size = <128>; ti,hwmods = "mcbsp1"; + dmas = <&sdma 31>, + <&sdma 32>; + dma-names = "tx", "rx"; };
mcbsp2: mcbsp@49022000 { @@ -303,6 +306,9 @@ interrupt-names = "common", "tx", "rx", "sidetone"; ti,buffer-size = <1280>; ti,hwmods = "mcbsp2", "mcbsp2_sidetone"; + dmas = <&sdma 33>, + <&sdma 34>; + dma-names = "tx", "rx"; };
mcbsp3: mcbsp@49024000 { @@ -317,6 +323,9 @@ interrupt-names = "common", "tx", "rx", "sidetone"; ti,buffer-size = <128>; ti,hwmods = "mcbsp3", "mcbsp3_sidetone"; + dmas = <&sdma 17>, + <&sdma 18>; + dma-names = "tx", "rx"; };
mcbsp4: mcbsp@49026000 { @@ -329,6 +338,9 @@ interrupt-names = "common", "tx", "rx"; ti,buffer-size = <128>; ti,hwmods = "mcbsp4"; + dmas = <&sdma 19>, + <&sdma 20>; + dma-names = "tx", "rx"; };
mcbsp5: mcbsp@48096000 { @@ -341,6 +353,9 @@ interrupt-names = "common", "tx", "rx"; ti,buffer-size = <128>; ti,hwmods = "mcbsp5"; + dmas = <&sdma 21>, + <&sdma 22>; + dma-names = "tx", "rx"; };
timer1: timer@48318000 { diff --git a/arch/arm/boot/dts/omap4.dtsi b/arch/arm/boot/dts/omap4.dtsi index 827f6f3..413c683 100644 --- a/arch/arm/boot/dts/omap4.dtsi +++ b/arch/arm/boot/dts/omap4.dtsi @@ -388,6 +388,9 @@ reg-names = "mpu", "dma"; interrupts = <0 112 0x4>; ti,hwmods = "mcpdm"; + dmas = <&sdma 65>, + <&sdma 66>; + dma-names = "up_link", "dn_link"; };
dmic: dmic@4012e000 { @@ -397,6 +400,8 @@ reg-names = "mpu", "dma"; interrupts = <0 114 0x4>; ti,hwmods = "dmic"; + dmas = <&sdma 67>; + dma-names = "up_link"; };
mcbsp1: mcbsp@40122000 { @@ -408,6 +413,9 @@ interrupt-names = "common"; ti,buffer-size = <128>; ti,hwmods = "mcbsp1"; + dmas = <&sdma 33>, + <&sdma 34>; + dma-names = "tx", "rx"; };
mcbsp2: mcbsp@40124000 { @@ -419,6 +427,9 @@ interrupt-names = "common"; ti,buffer-size = <128>; ti,hwmods = "mcbsp2"; + dmas = <&sdma 17>, + <&sdma 18>; + dma-names = "tx", "rx"; };
mcbsp3: mcbsp@40126000 { @@ -430,6 +441,9 @@ interrupt-names = "common"; ti,buffer-size = <128>; ti,hwmods = "mcbsp3"; + dmas = <&sdma 19>, + <&sdma 20>; + dma-names = "tx", "rx"; };
mcbsp4: mcbsp@48096000 { @@ -440,6 +454,9 @@ interrupt-names = "common"; ti,buffer-size = <128>; ti,hwmods = "mcbsp4"; + dmas = <&sdma 31>, + <&sdma 32>; + dma-names = "tx", "rx"; };
keypad: keypad@4a31c000 { diff --git a/arch/arm/boot/dts/omap5.dtsi b/arch/arm/boot/dts/omap5.dtsi index 39b8d76..5aa6086 100644 --- a/arch/arm/boot/dts/omap5.dtsi +++ b/arch/arm/boot/dts/omap5.dtsi @@ -364,6 +364,9 @@ reg-names = "mpu", "dma"; interrupts = <0 112 0x4>; ti,hwmods = "mcpdm"; + dmas = <&sdma 65>, + <&sdma 66>; + dma-names = "up_link", "dn_link"; };
dmic: dmic@4012e000 { @@ -373,6 +376,8 @@ reg-names = "mpu", "dma"; interrupts = <0 114 0x4>; ti,hwmods = "dmic"; + dmas = <&sdma 67>; + dma-names = "up_link"; };
mcbsp1: mcbsp@40122000 { @@ -384,6 +389,9 @@ interrupt-names = "common"; ti,buffer-size = <128>; ti,hwmods = "mcbsp1"; + dmas = <&sdma 33>, + <&sdma 34>; + dma-names = "tx", "rx"; };
mcbsp2: mcbsp@40124000 { @@ -395,6 +403,9 @@ interrupt-names = "common"; ti,buffer-size = <128>; ti,hwmods = "mcbsp2"; + dmas = <&sdma 17>, + <&sdma 18>; + dma-names = "tx", "rx"; };
mcbsp3: mcbsp@40126000 { @@ -406,6 +417,9 @@ interrupt-names = "common"; ti,buffer-size = <128>; ti,hwmods = "mcbsp3"; + dmas = <&sdma 19>, + <&sdma 20>; + dma-names = "tx", "rx"; };
timer1: timer@4ae18000 {
Hi Sebastien,
On 03/07/2013 01:43 PM, Sebastien Guiriec wrote:
This patch serie is converting OMAP Audio IPs in order to use OMAP sDMA DT binding in case of DT boot on OMAP2+ platforms.
The content of the patches looks about right for me, however I would squash together the IP and platform driver patches so we avoid breakage within the series. Also I would put the patch for the .dtsi files as first one.
On Thu, 7 Mar 2013 14:03:31 +0100 Peter Ujfalusi peter.ujfalusi@ti.com wrote:
Hi Sebastien,
On 03/07/2013 01:43 PM, Sebastien Guiriec wrote:
This patch serie is converting OMAP Audio IPs in order to use OMAP sDMA DT binding in case of DT boot on OMAP2+ platforms.
The content of the patches looks about right for me, however I would squash together the IP and platform driver patches so we avoid breakage within the series. Also I would put the patch for the .dtsi files as first one.
Looks ok to me too at quick look. Would it be possible to avoid possible breakage if first patch is divided to omap-pcm.h change which come before audio link driver changes and do omap-pcm.c change last?
On 03/08/2013 08:25 AM, Jarkko Nikula wrote:
The content of the patches looks about right for me, however I would squash together the IP and platform driver patches so we avoid breakage within the series. Also I would put the patch for the .dtsi files as first one.
Looks ok to me too at quick look. Would it be possible to avoid possible breakage if first patch is divided to omap-pcm.h change which come before audio link driver changes and do omap-pcm.c change last?
If we have them as separate we will have runtime regression between the patches. It is better to have them squashed together.
On Fri, Mar 08, 2013 at 10:23:41AM +0100, Peter Ujfalusi wrote:
If we have them as separate we will have runtime regression between the patches. It is better to have them squashed together.
Other than the issues mentioned this looks OK to me.
participants (4)
-
Jarkko Nikula
-
Mark Brown
-
Peter Ujfalusi
-
Sebastien Guiriec