]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00233056 ALSA: adjust dma wm & buffersize configuration strategy
authorNicolin Chen <b42378@freescale.com>
Fri, 9 Nov 2012 07:44:33 +0000 (15:44 +0800)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 24 May 2013 06:35:41 +0000 (08:35 +0200)
 Previously SSI/ESAI/SPDIF used one same-sized buffers and watermark(the
WM in the title) for every alsa driver.

 This patch allow each driver config its own buffer size and watermark,
which is obviously more flexible.

 Also, it sets SSI's buffersize from 256k to 64k.

Signed-off-by: Nicolin Chen <b42378@freescale.com>
sound/soc/imx/imx-esai.h
sound/soc/imx/imx-pcm-dma-mx2.c
sound/soc/imx/imx-pcm.h
sound/soc/imx/imx-ssi.c
sound/soc/imx/imx-ssi.h

index d27cbd00ae9634a65b29a2a9b5ae508c4ec7e5c0..53c899e1b654393b54d6997999699b8982a5758c 100644 (file)
 #define ESAI_RX_DIV_PM 4
 #define ESAI_RX_DIV_FP 5
 
-#define IMX_ESAI_DMABUF_SIZE     (64 * 1024)
-
 #define DRV_NAME "imx-esai"
 
 #include <linux/dmaengine.h>
index ad8d5a3329c74071846ce07d9fd9d1afa2297ec6..3065dfd38b71084630a171a2157c0f88933f7e60 100644 (file)
@@ -405,7 +405,7 @@ static struct snd_pcm_hardware snd_imx_hardware = {
        .rate_min = 8000,
        .channels_min = 2,
        .channels_max = 2,
-       .buffer_bytes_max = IMX_SSI_DMABUF_SIZE,
+       .buffer_bytes_max = IMX_DEFAULT_DMABUF_SIZE,
        .period_bytes_min = 128,
        .period_bytes_max = 65535, /* Limited by SDMA engine */
        .periods_min = 2,
@@ -439,6 +439,15 @@ static int snd_imx_open(struct snd_pcm_substream *substream)
                return ret;
        }
 
+       if (!strncmp(rtd->cpu_dai->name, "imx-ssi", strlen("imx-ssi")))
+               snd_imx_hardware.buffer_bytes_max = IMX_SSI_DMABUF_SIZE;
+       else if (!strncmp(rtd->cpu_dai->name, "imx-esai", strlen("imx-esai")))
+               snd_imx_hardware.buffer_bytes_max = IMX_ESAI_DMABUF_SIZE;
+       else if (!strncmp(rtd->cpu_dai->name, "imx-spdif", strlen("imx-spdif")))
+               snd_imx_hardware.buffer_bytes_max = IMX_SPDIF_DMABUF_SIZE;
+       else
+               snd_imx_hardware.buffer_bytes_max = IMX_DEFAULT_DMABUF_SIZE;
+
        snd_soc_set_runtime_hwparams(substream, &snd_imx_hardware);
 
        return 0;
@@ -476,8 +485,11 @@ static int __devinit imx_soc_platform_probe(struct platform_device *pdev)
 {
        struct imx_ssi *ssi = platform_get_drvdata(pdev);
 
-       ssi->dma_params_tx.burstsize = 6;
-       ssi->dma_params_rx.burstsize = 4;
+       if (ssi->dma_params_tx.burstsize == 0
+                       && ssi->dma_params_rx.burstsize == 0) {
+               ssi->dma_params_tx.burstsize = 6;
+               ssi->dma_params_rx.burstsize = 4;
+       }
 
        return snd_soc_register_platform(&pdev->dev, &imx_soc_platform_mx2);
 }
index c6126216a9cd7d403c0fa8a40697a1ca2a3f54e6..9b5e1e03fd4024490a9a826997565644475a24dc 100644 (file)
 
 #include <mach/dma.h>
 
+#define IMX_DEFAULT_DMABUF_SIZE                (64 * 1024)
+#define IMX_SSI_DMABUF_SIZE                    (64 * 1024)
+#define IMX_ESAI_DMABUF_SIZE           (256 * 1024)
+#define IMX_SPDIF_DMABUF_SIZE          (64 * 1024)
+
 struct imx_pcm_runtime_data {
        int period_bytes;
        int periods;
index e9b102db7f01a51230e8a71687e8eca2e4d9a861..b4c3aea562785a5b4a04e72ff553a5321374e1a7 100644 (file)
@@ -56,6 +56,7 @@
 #include <mach/hardware.h>
 
 #include "imx-ssi.h"
+#include "imx-pcm.h"
 
 #define SSI_SACNT_DEFAULT (SSI_SACNT_AC97EN | SSI_SACNT_FV)
 #define IMX_SSI_FORMATS \
@@ -743,7 +744,7 @@ static int imx_ssi_probe(struct platform_device *pdev)
        ssi->dma_params_rx.dma_addr = res->start + SSI_SRX0;
        ssi->dma_params_tx.dma_addr = res->start + SSI_STX0;
 
-       ssi->dma_params_tx.burstsize = 4;
+       ssi->dma_params_tx.burstsize = 6;
        ssi->dma_params_rx.burstsize = 4;
 
        ssi->dma_params_tx.peripheral_type = IMX_DMATYPE_SSI_SP;
index c57f9fe4edaaecf7f5eb68e7304ea4c911305726..af8e5a2a7820861b78f9391b7ba132418e88b16e 100644 (file)
@@ -222,7 +222,4 @@ int snd_imx_pcm_mmap(struct snd_pcm_substream *substream, struct vm_area_struct
 int imx_pcm_new(struct snd_card *card, struct snd_soc_dai *dai,
        struct snd_pcm *pcm);
 void imx_pcm_free(struct snd_pcm *pcm);
-
-#define IMX_SSI_DMABUF_SIZE    (256 * 1024)
-
 #endif /* _IMX_SSI_H */