diff options
| author | Ryan Lee <ryans.lee@maximintegrated.com> | 2017-09-14 20:30:38 -0400 |
|---|---|---|
| committer | Mark Brown <broonie@kernel.org> | 2017-09-25 15:48:14 -0400 |
| commit | 4eee20246c0fa77a7a7b189ac806d5f78d675546 (patch) | |
| tree | 5e17f854e6d2b290cb5bab936f8d62f5e5a7a0d2 | |
| parent | 2bd6bf03f4c1c59381d62c61d03f6cc3fe71f66e (diff) | |
ASoC: max98927: Added support for DSP_A and DSP_B format
Signed-off-by: Ryan Lee <ryans.lee@maximintegrated.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
| -rw-r--r-- | sound/soc/codecs/max98927.c | 35 | ||||
| -rw-r--r-- | sound/soc/codecs/max98927.h | 6 |
2 files changed, 24 insertions, 17 deletions
diff --git a/sound/soc/codecs/max98927.c b/sound/soc/codecs/max98927.c index d9dbbe72f8ad..6f7b3ef48e25 100644 --- a/sound/soc/codecs/max98927.c +++ b/sound/soc/codecs/max98927.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * max98927.c -- MAX98927 ALSA Soc Audio driver | 2 | * max98927.c -- MAX98927 ALSA Soc Audio driver |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2016 Maxim Integrated Products | 4 | * Copyright (C) 2016-2017 Maxim Integrated Products |
| 5 | * Author: Ryan Lee <ryans.lee@maximintegrated.com> | 5 | * Author: Ryan Lee <ryans.lee@maximintegrated.com> |
| 6 | * | 6 | * |
| 7 | * This program is free software; you can redistribute it and/or modify it | 7 | * This program is free software; you can redistribute it and/or modify it |
| @@ -146,6 +146,7 @@ static int max98927_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) | |||
| 146 | struct max98927_priv *max98927 = snd_soc_codec_get_drvdata(codec); | 146 | struct max98927_priv *max98927 = snd_soc_codec_get_drvdata(codec); |
| 147 | unsigned int mode = 0; | 147 | unsigned int mode = 0; |
| 148 | unsigned int format = 0; | 148 | unsigned int format = 0; |
| 149 | bool use_pdm = false; | ||
| 149 | unsigned int invert = 0; | 150 | unsigned int invert = 0; |
| 150 | 151 | ||
| 151 | dev_dbg(codec->dev, "%s: fmt 0x%08X\n", __func__, fmt); | 152 | dev_dbg(codec->dev, "%s: fmt 0x%08X\n", __func__, fmt); |
| @@ -187,22 +188,27 @@ static int max98927_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) | |||
| 187 | /* interface format */ | 188 | /* interface format */ |
| 188 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { | 189 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { |
| 189 | case SND_SOC_DAIFMT_I2S: | 190 | case SND_SOC_DAIFMT_I2S: |
| 190 | max98927->iface |= SND_SOC_DAIFMT_I2S; | ||
| 191 | format = MAX98927_PCM_FORMAT_I2S; | 191 | format = MAX98927_PCM_FORMAT_I2S; |
| 192 | break; | 192 | break; |
| 193 | case SND_SOC_DAIFMT_LEFT_J: | 193 | case SND_SOC_DAIFMT_LEFT_J: |
| 194 | max98927->iface |= SND_SOC_DAIFMT_LEFT_J; | ||
| 195 | format = MAX98927_PCM_FORMAT_LJ; | 194 | format = MAX98927_PCM_FORMAT_LJ; |
| 196 | break; | 195 | break; |
| 196 | case SND_SOC_DAIFMT_DSP_A: | ||
| 197 | format = MAX98927_PCM_FORMAT_TDM_MODE1; | ||
| 198 | break; | ||
| 199 | case SND_SOC_DAIFMT_DSP_B: | ||
| 200 | format = MAX98927_PCM_FORMAT_TDM_MODE0; | ||
| 201 | break; | ||
| 197 | case SND_SOC_DAIFMT_PDM: | 202 | case SND_SOC_DAIFMT_PDM: |
| 198 | max98927->iface |= SND_SOC_DAIFMT_PDM; | 203 | use_pdm = true; |
| 199 | break; | 204 | break; |
| 200 | default: | 205 | default: |
| 201 | return -EINVAL; | 206 | return -EINVAL; |
| 202 | } | 207 | } |
| 208 | max98927->iface = fmt & SND_SOC_DAIFMT_FORMAT_MASK; | ||
| 203 | 209 | ||
| 204 | /* pcm channel configuration */ | 210 | if (!use_pdm) { |
| 205 | if (max98927->iface & (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J)) { | 211 | /* pcm channel configuration */ |
| 206 | regmap_update_bits(max98927->regmap, | 212 | regmap_update_bits(max98927->regmap, |
| 207 | MAX98927_R0018_PCM_RX_EN_A, | 213 | MAX98927_R0018_PCM_RX_EN_A, |
| 208 | MAX98927_PCM_RX_CH0_EN | MAX98927_PCM_RX_CH1_EN, | 214 | MAX98927_PCM_RX_CH0_EN | MAX98927_PCM_RX_CH1_EN, |
| @@ -217,13 +223,11 @@ static int max98927_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) | |||
| 217 | MAX98927_R003B_SPK_SRC_SEL, | 223 | MAX98927_R003B_SPK_SRC_SEL, |
| 218 | MAX98927_SPK_SRC_MASK, 0); | 224 | MAX98927_SPK_SRC_MASK, 0); |
| 219 | 225 | ||
| 220 | } else | ||
| 221 | regmap_update_bits(max98927->regmap, | 226 | regmap_update_bits(max98927->regmap, |
| 222 | MAX98927_R0018_PCM_RX_EN_A, | 227 | MAX98927_R0035_PDM_RX_CTRL, |
| 223 | MAX98927_PCM_RX_CH0_EN | MAX98927_PCM_RX_CH1_EN, 0); | 228 | MAX98927_PDM_RX_EN_MASK, 0); |
| 224 | 229 | } else { | |
| 225 | /* pdm channel configuration */ | 230 | /* pdm channel configuration */ |
| 226 | if (max98927->iface & SND_SOC_DAIFMT_PDM) { | ||
| 227 | regmap_update_bits(max98927->regmap, | 231 | regmap_update_bits(max98927->regmap, |
| 228 | MAX98927_R0035_PDM_RX_CTRL, | 232 | MAX98927_R0035_PDM_RX_CTRL, |
| 229 | MAX98927_PDM_RX_EN_MASK, 1); | 233 | MAX98927_PDM_RX_EN_MASK, 1); |
| @@ -231,10 +235,11 @@ static int max98927_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) | |||
| 231 | regmap_update_bits(max98927->regmap, | 235 | regmap_update_bits(max98927->regmap, |
| 232 | MAX98927_R003B_SPK_SRC_SEL, | 236 | MAX98927_R003B_SPK_SRC_SEL, |
| 233 | MAX98927_SPK_SRC_MASK, 3); | 237 | MAX98927_SPK_SRC_MASK, 3); |
| 234 | } else | 238 | |
| 235 | regmap_update_bits(max98927->regmap, | 239 | regmap_update_bits(max98927->regmap, |
| 236 | MAX98927_R0035_PDM_RX_CTRL, | 240 | MAX98927_R0018_PCM_RX_EN_A, |
| 237 | MAX98927_PDM_RX_EN_MASK, 0); | 241 | MAX98927_PCM_RX_CH0_EN | MAX98927_PCM_RX_CH1_EN, 0); |
| 242 | } | ||
| 238 | return 0; | 243 | return 0; |
| 239 | } | 244 | } |
| 240 | 245 | ||
diff --git a/sound/soc/codecs/max98927.h b/sound/soc/codecs/max98927.h index ece6a608cbe1..bf7a6f92562a 100644 --- a/sound/soc/codecs/max98927.h +++ b/sound/soc/codecs/max98927.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * max98927.h -- MAX98927 ALSA Soc Audio driver | 2 | * max98927.h -- MAX98927 ALSA Soc Audio driver |
| 3 | * | 3 | * |
| 4 | * Copyright 2013-15 Maxim Integrated Products | 4 | * Copyright (C) 2016-2017 Maxim Integrated Products |
| 5 | * Author: Ryan Lee <ryans.lee@maximintegrated.com> | 5 | * Author: Ryan Lee <ryans.lee@maximintegrated.com> |
| 6 | * | 6 | * |
| 7 | * This program is free software; you can redistribute it and/or modify it | 7 | * This program is free software; you can redistribute it and/or modify it |
| @@ -161,7 +161,9 @@ | |||
| 161 | #define MAX98927_PCM_MODE_CFG_FORMAT_SHIFT (3) | 161 | #define MAX98927_PCM_MODE_CFG_FORMAT_SHIFT (3) |
| 162 | #define MAX98927_PCM_FORMAT_I2S (0x0 << 0) | 162 | #define MAX98927_PCM_FORMAT_I2S (0x0 << 0) |
| 163 | #define MAX98927_PCM_FORMAT_LJ (0x1 << 0) | 163 | #define MAX98927_PCM_FORMAT_LJ (0x1 << 0) |
| 164 | 164 | #define MAX98927_PCM_FORMAT_TDM_MODE0 (0x3 << 0) | |
| 165 | #define MAX98927_PCM_FORMAT_TDM_MODE1 (0x4 << 0) | ||
| 166 | #define MAX98927_PCM_FORMAT_TDM_MODE2 (0x5 << 0) | ||
| 165 | #define MAX98927_PCM_MODE_CFG_CHANSZ_MASK (0x3 << 6) | 167 | #define MAX98927_PCM_MODE_CFG_CHANSZ_MASK (0x3 << 6) |
| 166 | #define MAX98927_PCM_MODE_CFG_CHANSZ_16 (0x1 << 6) | 168 | #define MAX98927_PCM_MODE_CFG_CHANSZ_16 (0x1 << 6) |
| 167 | #define MAX98927_PCM_MODE_CFG_CHANSZ_24 (0x2 << 6) | 169 | #define MAX98927_PCM_MODE_CFG_CHANSZ_24 (0x2 << 6) |
