aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRyan Lee <ryans.lee@maximintegrated.com>2017-09-14 20:30:38 -0400
committerMark Brown <broonie@kernel.org>2017-09-25 15:48:14 -0400
commit4eee20246c0fa77a7a7b189ac806d5f78d675546 (patch)
tree5e17f854e6d2b290cb5bab936f8d62f5e5a7a0d2
parent2bd6bf03f4c1c59381d62c61d03f6cc3fe71f66e (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.c35
-rw-r--r--sound/soc/codecs/max98927.h6
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)