0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/module.h>
0009 #include <linux/kernel.h>
0010 #include <linux/device.h>
0011 #include <linux/regmap.h>
0012 #include <linux/slab.h>
0013 #include <sound/core.h>
0014 #include <sound/pcm.h>
0015 #include <sound/pcm_params.h>
0016 #include <sound/initval.h>
0017 #include <sound/soc.h>
0018 #include <sound/tlv.h>
0019
0020 #include "ad193x.h"
0021
0022
0023 struct ad193x_priv {
0024 struct regmap *regmap;
0025 enum ad193x_type type;
0026 int sysclk;
0027 };
0028
0029
0030
0031
0032 static const char * const ad193x_deemp[] = {"None", "48kHz", "44.1kHz", "32kHz"};
0033
0034 static SOC_ENUM_SINGLE_DECL(ad193x_deemp_enum, AD193X_DAC_CTRL2, 1,
0035 ad193x_deemp);
0036
0037 static const DECLARE_TLV_DB_MINMAX(adau193x_tlv, -9563, 0);
0038
0039 static const unsigned int ad193x_sb[] = {32};
0040
0041 static struct snd_pcm_hw_constraint_list constr = {
0042 .list = ad193x_sb,
0043 .count = ARRAY_SIZE(ad193x_sb),
0044 };
0045
0046 static const struct snd_kcontrol_new ad193x_snd_controls[] = {
0047
0048 SOC_DOUBLE_R_TLV("DAC1 Volume", AD193X_DAC_L1_VOL,
0049 AD193X_DAC_R1_VOL, 0, 0xFF, 1, adau193x_tlv),
0050 SOC_DOUBLE_R_TLV("DAC2 Volume", AD193X_DAC_L2_VOL,
0051 AD193X_DAC_R2_VOL, 0, 0xFF, 1, adau193x_tlv),
0052 SOC_DOUBLE_R_TLV("DAC3 Volume", AD193X_DAC_L3_VOL,
0053 AD193X_DAC_R3_VOL, 0, 0xFF, 1, adau193x_tlv),
0054 SOC_DOUBLE_R_TLV("DAC4 Volume", AD193X_DAC_L4_VOL,
0055 AD193X_DAC_R4_VOL, 0, 0xFF, 1, adau193x_tlv),
0056
0057
0058 SOC_DOUBLE("DAC1 Switch", AD193X_DAC_CHNL_MUTE, AD193X_DACL1_MUTE,
0059 AD193X_DACR1_MUTE, 1, 1),
0060 SOC_DOUBLE("DAC2 Switch", AD193X_DAC_CHNL_MUTE, AD193X_DACL2_MUTE,
0061 AD193X_DACR2_MUTE, 1, 1),
0062 SOC_DOUBLE("DAC3 Switch", AD193X_DAC_CHNL_MUTE, AD193X_DACL3_MUTE,
0063 AD193X_DACR3_MUTE, 1, 1),
0064 SOC_DOUBLE("DAC4 Switch", AD193X_DAC_CHNL_MUTE, AD193X_DACL4_MUTE,
0065 AD193X_DACR4_MUTE, 1, 1),
0066
0067
0068 SOC_ENUM("Playback Deemphasis", ad193x_deemp_enum),
0069 };
0070
0071 static const struct snd_kcontrol_new ad193x_adc_snd_controls[] = {
0072
0073 SOC_DOUBLE("ADC1 Switch", AD193X_ADC_CTRL0, AD193X_ADCL1_MUTE,
0074 AD193X_ADCR1_MUTE, 1, 1),
0075 SOC_DOUBLE("ADC2 Switch", AD193X_ADC_CTRL0, AD193X_ADCL2_MUTE,
0076 AD193X_ADCR2_MUTE, 1, 1),
0077
0078
0079 SOC_SINGLE("ADC High Pass Filter Switch", AD193X_ADC_CTRL0,
0080 AD193X_ADC_HIGHPASS_FILTER, 1, 0),
0081 };
0082
0083 static const struct snd_soc_dapm_widget ad193x_dapm_widgets[] = {
0084 SND_SOC_DAPM_DAC("DAC", "Playback", SND_SOC_NOPM, 0, 0),
0085 SND_SOC_DAPM_PGA("DAC Output", AD193X_DAC_CTRL0, 0, 1, NULL, 0),
0086 SND_SOC_DAPM_SUPPLY("PLL_PWR", AD193X_PLL_CLK_CTRL0, 0, 1, NULL, 0),
0087 SND_SOC_DAPM_SUPPLY("SYSCLK", AD193X_PLL_CLK_CTRL0, 7, 0, NULL, 0),
0088 SND_SOC_DAPM_VMID("VMID"),
0089 SND_SOC_DAPM_OUTPUT("DAC1OUT"),
0090 SND_SOC_DAPM_OUTPUT("DAC2OUT"),
0091 SND_SOC_DAPM_OUTPUT("DAC3OUT"),
0092 SND_SOC_DAPM_OUTPUT("DAC4OUT"),
0093 };
0094
0095 static const struct snd_soc_dapm_widget ad193x_adc_widgets[] = {
0096 SND_SOC_DAPM_ADC("ADC", "Capture", SND_SOC_NOPM, 0, 0),
0097 SND_SOC_DAPM_SUPPLY("ADC_PWR", AD193X_ADC_CTRL0, 0, 1, NULL, 0),
0098 SND_SOC_DAPM_INPUT("ADC1IN"),
0099 SND_SOC_DAPM_INPUT("ADC2IN"),
0100 };
0101
0102 static int ad193x_check_pll(struct snd_soc_dapm_widget *source,
0103 struct snd_soc_dapm_widget *sink)
0104 {
0105 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
0106 struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(component);
0107
0108 return !!ad193x->sysclk;
0109 }
0110
0111 static const struct snd_soc_dapm_route audio_paths[] = {
0112 { "DAC", NULL, "SYSCLK" },
0113 { "DAC Output", NULL, "DAC" },
0114 { "DAC Output", NULL, "VMID" },
0115 { "DAC1OUT", NULL, "DAC Output" },
0116 { "DAC2OUT", NULL, "DAC Output" },
0117 { "DAC3OUT", NULL, "DAC Output" },
0118 { "DAC4OUT", NULL, "DAC Output" },
0119 { "SYSCLK", NULL, "PLL_PWR", &ad193x_check_pll },
0120 };
0121
0122 static const struct snd_soc_dapm_route ad193x_adc_audio_paths[] = {
0123 { "ADC", NULL, "SYSCLK" },
0124 { "ADC", NULL, "ADC_PWR" },
0125 { "ADC", NULL, "ADC1IN" },
0126 { "ADC", NULL, "ADC2IN" },
0127 };
0128
0129 static inline bool ad193x_has_adc(const struct ad193x_priv *ad193x)
0130 {
0131 switch (ad193x->type) {
0132 case AD1933:
0133 case AD1934:
0134 return false;
0135 default:
0136 break;
0137 }
0138
0139 return true;
0140 }
0141
0142
0143
0144
0145
0146 static int ad193x_mute(struct snd_soc_dai *dai, int mute, int direction)
0147 {
0148 struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(dai->component);
0149
0150 if (mute)
0151 regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL2,
0152 AD193X_DAC_MASTER_MUTE,
0153 AD193X_DAC_MASTER_MUTE);
0154 else
0155 regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL2,
0156 AD193X_DAC_MASTER_MUTE, 0);
0157
0158 return 0;
0159 }
0160
0161 static int ad193x_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
0162 unsigned int rx_mask, int slots, int width)
0163 {
0164 struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(dai->component);
0165 unsigned int channels;
0166
0167 switch (slots) {
0168 case 2:
0169 channels = AD193X_2_CHANNELS;
0170 break;
0171 case 4:
0172 channels = AD193X_4_CHANNELS;
0173 break;
0174 case 8:
0175 channels = AD193X_8_CHANNELS;
0176 break;
0177 case 16:
0178 channels = AD193X_16_CHANNELS;
0179 break;
0180 default:
0181 return -EINVAL;
0182 }
0183
0184 regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL1,
0185 AD193X_DAC_CHAN_MASK, channels << AD193X_DAC_CHAN_SHFT);
0186 if (ad193x_has_adc(ad193x))
0187 regmap_update_bits(ad193x->regmap, AD193X_ADC_CTRL2,
0188 AD193X_ADC_CHAN_MASK,
0189 channels << AD193X_ADC_CHAN_SHFT);
0190
0191 return 0;
0192 }
0193
0194 static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai,
0195 unsigned int fmt)
0196 {
0197 struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(codec_dai->component);
0198 unsigned int adc_serfmt = 0;
0199 unsigned int dac_serfmt = 0;
0200 unsigned int adc_fmt = 0;
0201 unsigned int dac_fmt = 0;
0202
0203
0204
0205
0206
0207 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
0208 case SND_SOC_DAIFMT_I2S:
0209 adc_serfmt |= AD193X_ADC_SERFMT_TDM;
0210 dac_serfmt |= AD193X_DAC_SERFMT_STEREO;
0211 break;
0212 case SND_SOC_DAIFMT_DSP_A:
0213 adc_serfmt |= AD193X_ADC_SERFMT_AUX;
0214 dac_serfmt |= AD193X_DAC_SERFMT_TDM;
0215 break;
0216 default:
0217 if (ad193x_has_adc(ad193x))
0218 return -EINVAL;
0219 }
0220
0221 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
0222 case SND_SOC_DAIFMT_NB_NF:
0223 break;
0224 case SND_SOC_DAIFMT_NB_IF:
0225 adc_fmt |= AD193X_ADC_LEFT_HIGH;
0226 dac_fmt |= AD193X_DAC_LEFT_HIGH;
0227 break;
0228 case SND_SOC_DAIFMT_IB_NF:
0229 adc_fmt |= AD193X_ADC_BCLK_INV;
0230 dac_fmt |= AD193X_DAC_BCLK_INV;
0231 break;
0232 case SND_SOC_DAIFMT_IB_IF:
0233 adc_fmt |= AD193X_ADC_LEFT_HIGH;
0234 adc_fmt |= AD193X_ADC_BCLK_INV;
0235 dac_fmt |= AD193X_DAC_LEFT_HIGH;
0236 dac_fmt |= AD193X_DAC_BCLK_INV;
0237 break;
0238 default:
0239 return -EINVAL;
0240 }
0241
0242
0243 if (fmt & SND_SOC_DAIFMT_DSP_A)
0244 dac_fmt ^= AD193X_DAC_LEFT_HIGH;
0245
0246 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
0247 case SND_SOC_DAIFMT_CBP_CFP:
0248 adc_fmt |= AD193X_ADC_LCR_MASTER;
0249 adc_fmt |= AD193X_ADC_BCLK_MASTER;
0250 dac_fmt |= AD193X_DAC_LCR_MASTER;
0251 dac_fmt |= AD193X_DAC_BCLK_MASTER;
0252 break;
0253 case SND_SOC_DAIFMT_CBC_CFP:
0254 adc_fmt |= AD193X_ADC_LCR_MASTER;
0255 dac_fmt |= AD193X_DAC_LCR_MASTER;
0256 break;
0257 case SND_SOC_DAIFMT_CBP_CFC:
0258 adc_fmt |= AD193X_ADC_BCLK_MASTER;
0259 dac_fmt |= AD193X_DAC_BCLK_MASTER;
0260 break;
0261 case SND_SOC_DAIFMT_CBC_CFC:
0262 break;
0263 default:
0264 return -EINVAL;
0265 }
0266
0267 if (ad193x_has_adc(ad193x)) {
0268 regmap_update_bits(ad193x->regmap, AD193X_ADC_CTRL1,
0269 AD193X_ADC_SERFMT_MASK, adc_serfmt);
0270 regmap_update_bits(ad193x->regmap, AD193X_ADC_CTRL2,
0271 AD193X_ADC_FMT_MASK, adc_fmt);
0272 }
0273 regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL0,
0274 AD193X_DAC_SERFMT_MASK, dac_serfmt);
0275 regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL1,
0276 AD193X_DAC_FMT_MASK, dac_fmt);
0277
0278 return 0;
0279 }
0280
0281 static int ad193x_set_dai_sysclk(struct snd_soc_dai *codec_dai,
0282 int clk_id, unsigned int freq, int dir)
0283 {
0284 struct snd_soc_component *component = codec_dai->component;
0285 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
0286 struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(component);
0287
0288 if (clk_id == AD193X_SYSCLK_MCLK) {
0289
0290 if (dir == SND_SOC_CLOCK_OUT || freq != 24576000)
0291 return -EINVAL;
0292
0293 regmap_update_bits(ad193x->regmap, AD193X_PLL_CLK_CTRL1,
0294 AD193X_PLL_SRC_MASK,
0295 AD193X_PLL_DAC_SRC_MCLK |
0296 AD193X_PLL_CLK_SRC_MCLK);
0297
0298 snd_soc_dapm_sync(dapm);
0299 return 0;
0300 }
0301 switch (freq) {
0302 case 12288000:
0303 case 18432000:
0304 case 24576000:
0305 case 36864000:
0306 ad193x->sysclk = freq;
0307 return 0;
0308 }
0309 return -EINVAL;
0310 }
0311
0312 static int ad193x_hw_params(struct snd_pcm_substream *substream,
0313 struct snd_pcm_hw_params *params,
0314 struct snd_soc_dai *dai)
0315 {
0316 int word_len = 0, master_rate = 0;
0317 struct snd_soc_component *component = dai->component;
0318 struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(component);
0319 bool is_playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
0320 u8 dacc0;
0321
0322 dev_dbg(dai->dev, "%s() rate=%u format=%#x width=%u channels=%u\n",
0323 __func__, params_rate(params), params_format(params),
0324 params_width(params), params_channels(params));
0325
0326
0327
0328 switch (params_width(params)) {
0329 case 16:
0330 word_len = 3;
0331 break;
0332 case 20:
0333 word_len = 1;
0334 break;
0335 case 24:
0336 case 32:
0337 word_len = 0;
0338 break;
0339 }
0340
0341 switch (ad193x->sysclk) {
0342 case 12288000:
0343 master_rate = AD193X_PLL_INPUT_256;
0344 break;
0345 case 18432000:
0346 master_rate = AD193X_PLL_INPUT_384;
0347 break;
0348 case 24576000:
0349 master_rate = AD193X_PLL_INPUT_512;
0350 break;
0351 case 36864000:
0352 master_rate = AD193X_PLL_INPUT_768;
0353 break;
0354 }
0355
0356 if (is_playback) {
0357 switch (params_rate(params)) {
0358 case 48000:
0359 dacc0 = AD193X_DAC_SR_48;
0360 break;
0361 case 96000:
0362 dacc0 = AD193X_DAC_SR_96;
0363 break;
0364 case 192000:
0365 dacc0 = AD193X_DAC_SR_192;
0366 break;
0367 default:
0368 dev_err(dai->dev, "invalid sampling rate: %d\n", params_rate(params));
0369 return -EINVAL;
0370 }
0371
0372 regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL0, AD193X_DAC_SR_MASK, dacc0);
0373 }
0374
0375 regmap_update_bits(ad193x->regmap, AD193X_PLL_CLK_CTRL0,
0376 AD193X_PLL_INPUT_MASK, master_rate);
0377
0378 regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL2,
0379 AD193X_DAC_WORD_LEN_MASK,
0380 word_len << AD193X_DAC_WORD_LEN_SHFT);
0381
0382 if (ad193x_has_adc(ad193x))
0383 regmap_update_bits(ad193x->regmap, AD193X_ADC_CTRL1,
0384 AD193X_ADC_WORD_LEN_MASK, word_len);
0385
0386 return 0;
0387 }
0388
0389 static int ad193x_startup(struct snd_pcm_substream *substream,
0390 struct snd_soc_dai *dai)
0391 {
0392 return snd_pcm_hw_constraint_list(substream->runtime, 0,
0393 SNDRV_PCM_HW_PARAM_SAMPLE_BITS,
0394 &constr);
0395 }
0396
0397 static const struct snd_soc_dai_ops ad193x_dai_ops = {
0398 .startup = ad193x_startup,
0399 .hw_params = ad193x_hw_params,
0400 .mute_stream = ad193x_mute,
0401 .set_tdm_slot = ad193x_set_tdm_slot,
0402 .set_sysclk = ad193x_set_dai_sysclk,
0403 .set_fmt = ad193x_set_dai_fmt,
0404 .no_capture_mute = 1,
0405 };
0406
0407
0408 static struct snd_soc_dai_driver ad193x_dai = {
0409 .name = "ad193x-hifi",
0410 .playback = {
0411 .stream_name = "Playback",
0412 .channels_min = 2,
0413 .channels_max = 8,
0414 .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000,
0415 .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE |
0416 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE,
0417 },
0418 .capture = {
0419 .stream_name = "Capture",
0420 .channels_min = 2,
0421 .channels_max = 4,
0422 .rates = SNDRV_PCM_RATE_48000,
0423 .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE |
0424 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE,
0425 },
0426 .ops = &ad193x_dai_ops,
0427 };
0428
0429
0430 static struct snd_soc_dai_driver ad193x_no_adc_dai = {
0431 .name = "ad193x-hifi",
0432 .playback = {
0433 .stream_name = "Playback",
0434 .channels_min = 2,
0435 .channels_max = 8,
0436 .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000,
0437 .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE |
0438 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE,
0439 },
0440 .ops = &ad193x_dai_ops,
0441 };
0442
0443
0444 static void ad193x_reg_default_init(struct ad193x_priv *ad193x)
0445 {
0446 static const struct reg_sequence reg_init[] = {
0447 { 0, 0x99 },
0448 { 1, 0x04 },
0449 { 2, 0x40 },
0450 { 3, 0x00 },
0451 { 4, 0x1A },
0452 { 5, 0x00 },
0453 { 6, 0x00 },
0454 { 7, 0x00 },
0455 { 8, 0x00 },
0456 { 9, 0x00 },
0457 { 10, 0x00 },
0458 { 11, 0x00 },
0459 { 12, 0x00 },
0460 { 13, 0x00 },
0461 };
0462 static const struct reg_sequence reg_adc_init[] = {
0463 { 14, 0x03 },
0464 { 15, 0x43 },
0465 { 16, 0x00 },
0466 };
0467
0468 regmap_multi_reg_write(ad193x->regmap, reg_init, ARRAY_SIZE(reg_init));
0469
0470 if (ad193x_has_adc(ad193x)) {
0471 regmap_multi_reg_write(ad193x->regmap, reg_adc_init,
0472 ARRAY_SIZE(reg_adc_init));
0473 }
0474 }
0475
0476 static int ad193x_component_probe(struct snd_soc_component *component)
0477 {
0478 struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(component);
0479 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
0480 int num, ret;
0481
0482
0483 ad193x_reg_default_init(ad193x);
0484
0485
0486 if (ad193x_has_adc(ad193x)) {
0487
0488 num = ARRAY_SIZE(ad193x_adc_snd_controls);
0489 ret = snd_soc_add_component_controls(component,
0490 ad193x_adc_snd_controls,
0491 num);
0492 if (ret)
0493 return ret;
0494
0495
0496 num = ARRAY_SIZE(ad193x_adc_widgets);
0497 ret = snd_soc_dapm_new_controls(dapm,
0498 ad193x_adc_widgets,
0499 num);
0500 if (ret)
0501 return ret;
0502
0503
0504 num = ARRAY_SIZE(ad193x_adc_audio_paths);
0505 ret = snd_soc_dapm_add_routes(dapm,
0506 ad193x_adc_audio_paths,
0507 num);
0508 if (ret)
0509 return ret;
0510 }
0511
0512 return 0;
0513 }
0514
0515 static const struct snd_soc_component_driver soc_component_dev_ad193x = {
0516 .probe = ad193x_component_probe,
0517 .controls = ad193x_snd_controls,
0518 .num_controls = ARRAY_SIZE(ad193x_snd_controls),
0519 .dapm_widgets = ad193x_dapm_widgets,
0520 .num_dapm_widgets = ARRAY_SIZE(ad193x_dapm_widgets),
0521 .dapm_routes = audio_paths,
0522 .num_dapm_routes = ARRAY_SIZE(audio_paths),
0523 .idle_bias_on = 1,
0524 .use_pmdown_time = 1,
0525 .endianness = 1,
0526 };
0527
0528 const struct regmap_config ad193x_regmap_config = {
0529 .max_register = AD193X_NUM_REGS - 1,
0530 };
0531 EXPORT_SYMBOL_GPL(ad193x_regmap_config);
0532
0533 int ad193x_probe(struct device *dev, struct regmap *regmap,
0534 enum ad193x_type type)
0535 {
0536 struct ad193x_priv *ad193x;
0537
0538 if (IS_ERR(regmap))
0539 return PTR_ERR(regmap);
0540
0541 ad193x = devm_kzalloc(dev, sizeof(*ad193x), GFP_KERNEL);
0542 if (ad193x == NULL)
0543 return -ENOMEM;
0544
0545 ad193x->regmap = regmap;
0546 ad193x->type = type;
0547
0548 dev_set_drvdata(dev, ad193x);
0549
0550 if (ad193x_has_adc(ad193x))
0551 return devm_snd_soc_register_component(dev, &soc_component_dev_ad193x,
0552 &ad193x_dai, 1);
0553 return devm_snd_soc_register_component(dev, &soc_component_dev_ad193x,
0554 &ad193x_no_adc_dai, 1);
0555 }
0556 EXPORT_SYMBOL_GPL(ad193x_probe);
0557
0558 MODULE_DESCRIPTION("ASoC ad193x driver");
0559 MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
0560 MODULE_LICENSE("GPL");