diff options
author | Xiubo Li <Li.Xiubo@freescale.com> | 2014-02-25 04:54:51 -0500 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2014-02-25 18:51:24 -0500 |
commit | 13cde090030c7d00e991c85b87c12891cc8e4df4 (patch) | |
tree | 5f30766346e0326b272deb23f1f4ad759c64a29b /sound/soc/fsl | |
parent | 7d150c60f1a29c62e115e0ee2a5678400e724873 (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.c | 38 |
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 | } |