]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ASoC: rockchip: i2s: add other configurable formats
authorzhangjun <zhangjun@rock-chips.com>
Fri, 9 Jun 2017 08:52:48 +0000 (16:52 +0800)
committerMark Brown <broonie@kernel.org>
Tue, 13 Jun 2017 20:47:40 +0000 (21:47 +0100)
simple-audio-card,bitclock-inversion = <1> : bclk falling edge taken
simple-audio-card,format = "dsp_a" : pcm no delay mode
simple-audio-card,format = "dsp_b" : pcm late 1 mode

Signed-off-by: zhangjun <zhangjun@rock-chips.com>
Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/rockchip/rockchip_i2s.c
sound/soc/rockchip/rockchip_i2s.h

index 974915cb4c4fd8a0c0f44c8d5cd2935411c10646..66a26c56c6589e77dae5356bb4a7182a51fccde5 100644 (file)
@@ -204,7 +204,21 @@ static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
 
        regmap_update_bits(i2s->regmap, I2S_CKR, mask, val);
 
-       mask = I2S_TXCR_IBM_MASK;
+       mask = I2S_CKR_CKP_MASK;
+       switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
+       case SND_SOC_DAIFMT_NB_NF:
+               val = I2S_CKR_CKP_NEG;
+               break;
+       case SND_SOC_DAIFMT_IB_NF:
+               val = I2S_CKR_CKP_POS;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       regmap_update_bits(i2s->regmap, I2S_CKR, mask, val);
+
+       mask = I2S_TXCR_IBM_MASK | I2S_TXCR_TFS_MASK | I2S_TXCR_PBM_MASK;
        switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
        case SND_SOC_DAIFMT_RIGHT_J:
                val = I2S_TXCR_IBM_RSJM;
@@ -215,13 +229,19 @@ static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
        case SND_SOC_DAIFMT_I2S:
                val = I2S_TXCR_IBM_NORMAL;
                break;
+       case SND_SOC_DAIFMT_DSP_A: /* PCM no delay mode */
+               val = I2S_TXCR_TFS_PCM;
+               break;
+       case SND_SOC_DAIFMT_DSP_B: /* PCM delay 1 mode */
+               val = I2S_TXCR_TFS_PCM | I2S_TXCR_PBM_MODE(1);
+               break;
        default:
                return -EINVAL;
        }
 
        regmap_update_bits(i2s->regmap, I2S_TXCR, mask, val);
 
-       mask = I2S_RXCR_IBM_MASK;
+       mask = I2S_RXCR_IBM_MASK | I2S_RXCR_TFS_MASK | I2S_RXCR_PBM_MASK;
        switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
        case SND_SOC_DAIFMT_RIGHT_J:
                val = I2S_RXCR_IBM_RSJM;
@@ -232,6 +252,12 @@ static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
        case SND_SOC_DAIFMT_I2S:
                val = I2S_RXCR_IBM_NORMAL;
                break;
+       case SND_SOC_DAIFMT_DSP_A: /* PCM no delay mode */
+               val = I2S_RXCR_TFS_PCM;
+               break;
+       case SND_SOC_DAIFMT_DSP_B: /* PCM delay 1 mode */
+               val = I2S_RXCR_TFS_PCM | I2S_RXCR_PBM_MODE(1);
+               break;
        default:
                return -EINVAL;
        }
index 31f11fd25393ac37d0a696bdc3e5de5b37150590..a7b8527d8a731fcaf8ba6327f40f2e4738e1ab22 100644 (file)
@@ -41,6 +41,7 @@
 #define I2S_TXCR_TFS_SHIFT     5
 #define I2S_TXCR_TFS_I2S       (0 << I2S_TXCR_TFS_SHIFT)
 #define I2S_TXCR_TFS_PCM       (1 << I2S_TXCR_TFS_SHIFT)
+#define I2S_TXCR_TFS_MASK      (1 << I2S_TXCR_TFS_SHIFT)
 #define I2S_TXCR_VDW_SHIFT     0
 #define I2S_TXCR_VDW(x)                ((x - 1) << I2S_TXCR_VDW_SHIFT)
 #define I2S_TXCR_VDW_MASK      (0x1f << I2S_TXCR_VDW_SHIFT)
@@ -70,6 +71,7 @@
 #define I2S_RXCR_TFS_SHIFT     5
 #define I2S_RXCR_TFS_I2S       (0 << I2S_RXCR_TFS_SHIFT)
 #define I2S_RXCR_TFS_PCM       (1 << I2S_RXCR_TFS_SHIFT)
+#define I2S_RXCR_TFS_MASK      (1 << I2S_RXCR_TFS_SHIFT)
 #define I2S_RXCR_VDW_SHIFT     0
 #define I2S_RXCR_VDW(x)                ((x - 1) << I2S_RXCR_VDW_SHIFT)
 #define I2S_RXCR_VDW_MASK      (0x1f << I2S_RXCR_VDW_SHIFT)
@@ -91,6 +93,7 @@
 #define I2S_CKR_CKP_SHIFT      26
 #define I2S_CKR_CKP_NEG                (0 << I2S_CKR_CKP_SHIFT)
 #define I2S_CKR_CKP_POS                (1 << I2S_CKR_CKP_SHIFT)
+#define I2S_CKR_CKP_MASK       (1 << I2S_CKR_CKP_SHIFT)
 #define I2S_CKR_RLP_SHIFT      25
 #define I2S_CKR_RLP_NORMAL     (0 << I2S_CKR_RLP_SHIFT)
 #define I2S_CKR_RLP_OPPSITE    (1 << I2S_CKR_RLP_SHIFT)