ASoC: sirf: usp: Add bitclock inversion support
[cascardo/linux.git] / sound / soc / sirf / sirf-usp.c
index 3a73037..186dc7f 100644 (file)
@@ -100,6 +100,16 @@ static int sirf_usp_pcm_set_dai_fmt(struct snd_soc_dai *dai,
                return -EINVAL;
        }
 
+       switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
+       case SND_SOC_DAIFMT_NB_NF:
+               break;
+       case SND_SOC_DAIFMT_IB_NF:
+               usp->daifmt_format |= (fmt & SND_SOC_DAIFMT_INV_MASK);
+               break;
+       default:
+               return -EINVAL;
+       }
+
        return 0;
 }
 
@@ -177,7 +187,7 @@ static int sirf_usp_pcm_hw_params(struct snd_pcm_substream *substream,
 
        shifter_len = data_len;
 
-       switch (usp->daifmt_format) {
+       switch (usp->daifmt_format & SND_SOC_DAIFMT_FORMAT_MASK) {
        case SND_SOC_DAIFMT_I2S:
                regmap_update_bits(usp->regmap, USP_RX_FRAME_CTRL,
                        USP_I2S_SYNC_CHG, USP_I2S_SYNC_CHG);
@@ -193,6 +203,18 @@ static int sirf_usp_pcm_hw_params(struct snd_pcm_substream *substream,
                return -EINVAL;
        }
 
+       switch (usp->daifmt_format & SND_SOC_DAIFMT_INV_MASK) {
+       case SND_SOC_DAIFMT_NB_NF:
+               break;
+       case SND_SOC_DAIFMT_IB_NF:
+               regmap_update_bits(usp->regmap, USP_MODE1,
+                       USP_RXD_ACT_EDGE_FALLING | USP_TXD_ACT_EDGE_FALLING,
+                       USP_RXD_ACT_EDGE_FALLING);
+               break;
+       default:
+               return -EINVAL;
+       }
+
        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
                regmap_update_bits(usp->regmap, USP_TX_FRAME_CTRL,
                        USP_TXC_DATA_LEN_MASK | USP_TXC_FRAME_LEN_MASK