ASoC: tas2552: Add support for word length configuration
authorPeter Ujfalusi <peter.ujfalusi@ti.com>
Thu, 4 Jun 2015 13:04:29 +0000 (16:04 +0300)
committerMark Brown <broonie@kernel.org>
Fri, 5 Jun 2015 17:53:36 +0000 (18:53 +0100)
Configure the word length based on the params_width of the stream.
Also configure the clock per frame value which is used when tas2552 is bus
master.

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

index 9c08134..13b435f 100644 (file)
@@ -166,7 +166,45 @@ static int tas2552_hw_params(struct snd_pcm_substream *substream,
        struct tas2552_data *tas2552 = dev_get_drvdata(codec->dev);
        int sample_rate, pll_clk;
        int d;
+       int cpf;
        u8 p, j;
+       u8 ser_ctrl1_reg;
+
+       switch (params_width(params)) {
+       case 16:
+               ser_ctrl1_reg = TAS2552_WORDLENGTH_16BIT;
+               cpf = 32 + tas2552->tdm_delay;
+               break;
+       case 20:
+               ser_ctrl1_reg = TAS2552_WORDLENGTH_20BIT;
+               cpf = 64 + tas2552->tdm_delay;
+               break;
+       case 24:
+               ser_ctrl1_reg = TAS2552_WORDLENGTH_24BIT;
+               cpf = 64 + tas2552->tdm_delay;
+               break;
+       case 32:
+               ser_ctrl1_reg = TAS2552_WORDLENGTH_32BIT;
+               cpf = 64 + tas2552->tdm_delay;
+               break;
+       default:
+               dev_err(codec->dev, "Not supported sample size: %d\n",
+                       params_width(params));
+               return -EINVAL;
+       }
+
+       if (cpf <= 32)
+               ser_ctrl1_reg |= TAS2552_CLKSPERFRAME_32;
+       else if (cpf <= 64)
+               ser_ctrl1_reg |= TAS2552_CLKSPERFRAME_64;
+       else if (cpf <= 128)
+               ser_ctrl1_reg |= TAS2552_CLKSPERFRAME_128;
+       else
+               ser_ctrl1_reg |= TAS2552_CLKSPERFRAME_256;
+
+       snd_soc_update_bits(codec, TAS2552_SER_CTRL_1,
+                           TAS2552_WORDLENGTH_MASK | TAS2552_CLKSPERFRAME_MASK,
+                           ser_ctrl1_reg);
 
        if (!tas2552->pll_clkin)
                return -EINVAL;
index 5bdc7ea..de0ab0d 100644 (file)
 #define TAS2552_SDOUT_TRISTATE         (1 << 2)
 
 /* Serial Interface Control Register Masks */
+#define TAS2552_WORDLENGTH_16BIT       (0x0 << 0)
+#define TAS2552_WORDLENGTH_20BIT       (0x1 << 0)
+#define TAS2552_WORDLENGTH_24BIT       (0x2 << 0)
+#define TAS2552_WORDLENGTH_32BIT       (0x3 << 0)
+#define TAS2552_WORDLENGTH_MASK                TAS2552_WORDLENGTH_32BIT
 #define TAS2552_DATAFORMAT_I2S         (0x0 << 2)
 #define TAS2552_DATAFORMAT_DSP         (0x1 << 2)
 #define TAS2552_DATAFORMAT_RIGHT_J     (0x2 << 2)
 #define TAS2552_DATAFORMAT_LEFT_J      (0x3 << 2)
 #define TAS2552_DATAFORMAT_MASK                TAS2552_DATAFORMAT_LEFT_J
+#define TAS2552_CLKSPERFRAME_32                (0x0 << 4)
+#define TAS2552_CLKSPERFRAME_64                (0x1 << 4)
+#define TAS2552_CLKSPERFRAME_128       (0x2 << 4)
+#define TAS2552_CLKSPERFRAME_256       (0x3 << 4)
+#define TAS2552_CLKSPERFRAME_MASK      TAS2552_CLKSPERFRAME_256
 #define TAS2552_BCLKDIR                        (1 << 6)
 #define TAS2552_WCLKDIR                        (1 << 7)