diff options
author | Richard Fitzgerald <rf@opensource.wolfsonmicro.com> | 2014-11-12 11:12:46 -0500 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2014-11-12 12:32:50 -0500 |
commit | e9c7f34a7eba13e1a53212246c607d13574f9eff (patch) | |
tree | f6b4c24d7d02df6229d949cba96e51a6f87c9ef1 | |
parent | ef326f4bb2675e9309ba318b19442d9823e58ee2 (diff) |
ASoC: arizona: Add DSP_B and LEFT_J mode support
Signed-off-by: Richard Fitzgerald <rf@opensource.wolfsonmicro.com>
Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | sound/soc/codecs/arizona.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c index 786464f5a23c..19887bfffbf9 100644 --- a/sound/soc/codecs/arizona.c +++ b/sound/soc/codecs/arizona.c | |||
@@ -61,6 +61,11 @@ | |||
61 | #define ARIZONA_FLL_MIN_OUTDIV 2 | 61 | #define ARIZONA_FLL_MIN_OUTDIV 2 |
62 | #define ARIZONA_FLL_MAX_OUTDIV 7 | 62 | #define ARIZONA_FLL_MAX_OUTDIV 7 |
63 | 63 | ||
64 | #define ARIZONA_FMT_DSP_MODE_A 0 | ||
65 | #define ARIZONA_FMT_DSP_MODE_B 1 | ||
66 | #define ARIZONA_FMT_I2S_MODE 2 | ||
67 | #define ARIZONA_FMT_LEFT_JUSTIFIED_MODE 3 | ||
68 | |||
64 | #define arizona_fll_err(_fll, fmt, ...) \ | 69 | #define arizona_fll_err(_fll, fmt, ...) \ |
65 | dev_err(_fll->arizona->dev, "FLL%d: " fmt, _fll->id, ##__VA_ARGS__) | 70 | dev_err(_fll->arizona->dev, "FLL%d: " fmt, _fll->id, ##__VA_ARGS__) |
66 | #define arizona_fll_warn(_fll, fmt, ...) \ | 71 | #define arizona_fll_warn(_fll, fmt, ...) \ |
@@ -946,10 +951,26 @@ static int arizona_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) | |||
946 | 951 | ||
947 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { | 952 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { |
948 | case SND_SOC_DAIFMT_DSP_A: | 953 | case SND_SOC_DAIFMT_DSP_A: |
949 | mode = 0; | 954 | mode = ARIZONA_FMT_DSP_MODE_A; |
955 | break; | ||
956 | case SND_SOC_DAIFMT_DSP_B: | ||
957 | if ((fmt & SND_SOC_DAIFMT_MASTER_MASK) | ||
958 | != SND_SOC_DAIFMT_CBM_CFM) { | ||
959 | arizona_aif_err(dai, "DSP_B not valid in slave mode\n"); | ||
960 | return -EINVAL; | ||
961 | } | ||
962 | mode = ARIZONA_FMT_DSP_MODE_B; | ||
950 | break; | 963 | break; |
951 | case SND_SOC_DAIFMT_I2S: | 964 | case SND_SOC_DAIFMT_I2S: |
952 | mode = 2; | 965 | mode = ARIZONA_FMT_I2S_MODE; |
966 | break; | ||
967 | case SND_SOC_DAIFMT_LEFT_J: | ||
968 | if ((fmt & SND_SOC_DAIFMT_MASTER_MASK) | ||
969 | != SND_SOC_DAIFMT_CBM_CFM) { | ||
970 | arizona_aif_err(dai, "LEFT_J not valid in slave mode\n"); | ||
971 | return -EINVAL; | ||
972 | } | ||
973 | mode = ARIZONA_FMT_LEFT_JUSTIFIED_MODE; | ||
953 | break; | 974 | break; |
954 | default: | 975 | default: |
955 | arizona_aif_err(dai, "Unsupported DAI format %d\n", | 976 | arizona_aif_err(dai, "Unsupported DAI format %d\n", |
@@ -1298,7 +1319,8 @@ static int arizona_hw_params(struct snd_pcm_substream *substream, | |||
1298 | 1319 | ||
1299 | /* Force multiple of 2 channels for I2S mode */ | 1320 | /* Force multiple of 2 channels for I2S mode */ |
1300 | val = snd_soc_read(codec, base + ARIZONA_AIF_FORMAT); | 1321 | val = snd_soc_read(codec, base + ARIZONA_AIF_FORMAT); |
1301 | if ((channels & 1) && (val & ARIZONA_AIF1_FMT_MASK)) { | 1322 | val &= ARIZONA_AIF1_FMT_MASK; |
1323 | if ((channels & 1) && (val == ARIZONA_FMT_I2S_MODE)) { | ||
1302 | arizona_aif_dbg(dai, "Forcing stereo mode\n"); | 1324 | arizona_aif_dbg(dai, "Forcing stereo mode\n"); |
1303 | bclk_target /= channels; | 1325 | bclk_target /= channels; |
1304 | bclk_target *= channels + 1; | 1326 | bclk_target *= channels + 1; |