ASoC: davinci-mcasp: Simplify and clean up the AFIFO configuration code
authorPeter Ujfalusi <peter.ujfalusi@ti.com>
Tue, 1 Apr 2014 12:55:09 +0000 (15:55 +0300)
committerMark Brown <broonie@linaro.org>
Mon, 14 Apr 2014 16:24:11 +0000 (17:24 +0100)
We can have more linear code flow by using variables in
mcasp_common_hw_param() related to the AFIFO configuration.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
sound/soc/davinci/davinci-mcasp.c
sound/soc/davinci/davinci-mcasp.h

index eb46dc69248f7fc3287e68cb1252da442fbf17bd..aa063a4e7b0c7878aa8c27681d093f2e6a23bd31 100644 (file)
@@ -37,6 +37,8 @@
 #include "davinci-pcm.h"
 #include "davinci-mcasp.h"
 
+#define MCASP_MAX_AFIFO_DEPTH  64
+
 struct davinci_mcasp_context {
        u32     txfmtctl;
        u32     rxfmtctl;
@@ -469,9 +471,9 @@ static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream,
        int i;
        u8 tx_ser = 0;
        u8 rx_ser = 0;
-       u8 ser;
        u8 slots = mcasp->tdm_slots;
        u8 max_active_serializers = (channels + slots - 1) / slots;
+       u8 active_serializers, numevt;
        u32 reg;
        /* Default configuration */
        if (mcasp->version != MCASP_VERSION_4)
@@ -505,36 +507,34 @@ static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream,
                }
        }
 
-       if (stream == SNDRV_PCM_STREAM_PLAYBACK)
-               ser = tx_ser;
-       else
-               ser = rx_ser;
+       if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
+               active_serializers = tx_ser;
+               numevt = mcasp->txnumevt;
+               reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
+       } else {
+               active_serializers = rx_ser;
+               numevt = mcasp->rxnumevt;
+               reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
+       }
 
-       if (ser < max_active_serializers) {
+       if (active_serializers < max_active_serializers) {
                dev_warn(mcasp->dev, "stream has more channels (%d) than are "
-                       "enabled in mcasp (%d)\n", channels, ser * slots);
+                        "enabled in mcasp (%d)\n", channels,
+                        active_serializers * slots);
                return -EINVAL;
        }
 
-       if (mcasp->txnumevt && stream == SNDRV_PCM_STREAM_PLAYBACK) {
-               if (mcasp->txnumevt * tx_ser > 64)
-                       mcasp->txnumevt = 1;
-
-               reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
-               mcasp_mod_bits(mcasp, reg, tx_ser, NUMDMA_MASK);
-               mcasp_mod_bits(mcasp, reg, ((mcasp->txnumevt * tx_ser) << 8),
-                              NUMEVT_MASK);
-       }
+       /* AFIFO is not in use */
+       if (!numevt)
+               return 0;
 
-       if (mcasp->rxnumevt && stream == SNDRV_PCM_STREAM_CAPTURE) {
-               if (mcasp->rxnumevt * rx_ser > 64)
-                       mcasp->rxnumevt = 1;
+       if (numevt * active_serializers > MCASP_MAX_AFIFO_DEPTH)
+               numevt = active_serializers;
 
-               reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
-               mcasp_mod_bits(mcasp, reg, rx_ser, NUMDMA_MASK);
-               mcasp_mod_bits(mcasp, reg, ((mcasp->rxnumevt * rx_ser) << 8),
-                              NUMEVT_MASK);
-       }
+       /* Configure the AFIFO */
+       numevt *= active_serializers;
+       mcasp_mod_bits(mcasp, reg, active_serializers, NUMDMA_MASK);
+       mcasp_mod_bits(mcasp, reg, NUMEVT(numevt), NUMEVT_MASK);
 
        return 0;
 }
index 8fed757d60876310ea4138e69a5575feed7cea60..98fbc451892a5e94d851d53001ac89551ed1e3e8 100644 (file)
  */
 #define FIFO_ENABLE    BIT(16)
 #define NUMEVT_MASK    (0xFF << 8)
+#define NUMEVT(x)      (((x) & 0xFF) << 8)
 #define NUMDMA_MASK    (0xFF)
 
 #endif /* DAVINCI_MCASP_H */