aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/fsl
diff options
context:
space:
mode:
authorXiubo Li <Li.Xiubo@freescale.com>2014-02-25 04:54:51 -0500
committerMark Brown <broonie@linaro.org>2014-02-25 18:51:24 -0500
commit13cde090030c7d00e991c85b87c12891cc8e4df4 (patch)
tree5f30766346e0326b272deb23f1f4ad759c64a29b /sound/soc/fsl
parent7d150c60f1a29c62e115e0ee2a5678400e724873 (diff)
ASoC: fsl-sai: fix Freescale SAI DAI format setting.
o Fix some bugs of fsl_sai_set_dai_fmt_tr(). o Add SND_SOC_DAIFMT_LEFT_J support. o Add SND_SOC_DAIFMT_CBS_CFM support. o Add SND_SOC_DAIFMT_CBM_CFS support. o And SND_SOC_DAIFMT_RIGHT_J need to be done in the future. Signed-off-by: Xiubo Li <Li.Xiubo@freescale.com> Signed-off-by: Mark Brown <broonie@linaro.org>
Diffstat (limited to 'sound/soc/fsl')
-rw-r--r--sound/soc/fsl/fsl_sai.c38
1 files changed, 29 insertions, 9 deletions
diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c
index faa65afb6951..26d9f5ed6959 100644
--- a/sound/soc/fsl/fsl_sai.c
+++ b/sound/soc/fsl/fsl_sai.c
@@ -105,35 +105,47 @@ static int fsl_sai_set_dai_fmt_tr(struct snd_soc_dai *cpu_dai,
105 else 105 else
106 val_cr4 |= FSL_SAI_CR4_MF; 106 val_cr4 |= FSL_SAI_CR4_MF;
107 107
108 /* DAI mode */
108 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 109 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
109 case SND_SOC_DAIFMT_I2S: 110 case SND_SOC_DAIFMT_I2S:
110 val_cr4 |= FSL_SAI_CR4_FSE; 111 /* Data on rising edge of bclk, frame low, 1clk before data */
112 val_cr2 &= ~FSL_SAI_CR2_BCP;
113 val_cr4 |= FSL_SAI_CR4_FSE | FSL_SAI_CR4_FSP;
114 break;
115 case SND_SOC_DAIFMT_LEFT_J:
116 /* Data on rising edge of bclk, frame high, 0clk before data */
117 val_cr2 &= ~FSL_SAI_CR2_BCP;
118 val_cr4 &= ~(FSL_SAI_CR4_FSE | FSL_SAI_CR4_FSP);
111 break; 119 break;
120 case SND_SOC_DAIFMT_RIGHT_J:
121 /* To be done */
112 default: 122 default:
113 return -EINVAL; 123 return -EINVAL;
114 } 124 }
115 125
126 /* DAI clock inversion */
116 switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 127 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
117 case SND_SOC_DAIFMT_IB_IF: 128 case SND_SOC_DAIFMT_IB_IF:
118 val_cr4 |= FSL_SAI_CR4_FSP; 129 /* Invert both clocks */
119 val_cr2 &= ~FSL_SAI_CR2_BCP; 130 val_cr2 ^= FSL_SAI_CR2_BCP;
131 val_cr4 ^= FSL_SAI_CR4_FSP;
120 break; 132 break;
121 case SND_SOC_DAIFMT_IB_NF: 133 case SND_SOC_DAIFMT_IB_NF:
122 val_cr4 &= ~FSL_SAI_CR4_FSP; 134 /* Invert bit clock */
123 val_cr2 &= ~FSL_SAI_CR2_BCP; 135 val_cr2 ^= FSL_SAI_CR2_BCP;
124 break; 136 break;
125 case SND_SOC_DAIFMT_NB_IF: 137 case SND_SOC_DAIFMT_NB_IF:
126 val_cr4 |= FSL_SAI_CR4_FSP; 138 /* Invert frame clock */
127 val_cr2 |= FSL_SAI_CR2_BCP; 139 val_cr4 ^= FSL_SAI_CR4_FSP;
128 break; 140 break;
129 case SND_SOC_DAIFMT_NB_NF: 141 case SND_SOC_DAIFMT_NB_NF:
130 val_cr4 &= ~FSL_SAI_CR4_FSP; 142 /* Nothing to do for both normal cases */
131 val_cr2 |= FSL_SAI_CR2_BCP;
132 break; 143 break;
133 default: 144 default:
134 return -EINVAL; 145 return -EINVAL;
135 } 146 }
136 147
148 /* DAI clock master masks */
137 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 149 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
138 case SND_SOC_DAIFMT_CBS_CFS: 150 case SND_SOC_DAIFMT_CBS_CFS:
139 val_cr2 |= FSL_SAI_CR2_BCD_MSTR; 151 val_cr2 |= FSL_SAI_CR2_BCD_MSTR;
@@ -143,6 +155,14 @@ static int fsl_sai_set_dai_fmt_tr(struct snd_soc_dai *cpu_dai,
143 val_cr2 &= ~FSL_SAI_CR2_BCD_MSTR; 155 val_cr2 &= ~FSL_SAI_CR2_BCD_MSTR;
144 val_cr4 &= ~FSL_SAI_CR4_FSD_MSTR; 156 val_cr4 &= ~FSL_SAI_CR4_FSD_MSTR;
145 break; 157 break;
158 case SND_SOC_DAIFMT_CBS_CFM:
159 val_cr2 |= FSL_SAI_CR2_BCD_MSTR;
160 val_cr4 &= ~FSL_SAI_CR4_FSD_MSTR;
161 break;
162 case SND_SOC_DAIFMT_CBM_CFS:
163 val_cr2 &= ~FSL_SAI_CR2_BCD_MSTR;
164 val_cr4 |= FSL_SAI_CR4_FSD_MSTR;
165 break;
146 default: 166 default:
147 return -EINVAL; 167 return -EINVAL;
148 } 168 }