1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * AD193X Audio Codec driver supporting AD1936/7/8/9 4 * 5 * Copyright 2010 Analog Devices Inc. 6 */ 7 8 #include <linux/module.h> 9 #include <linux/kernel.h> 10 #include <linux/device.h> 11 #include <linux/regmap.h> 12 #include <linux/slab.h> 13 #include <sound/core.h> 14 #include <sound/pcm.h> 15 #include <sound/pcm_params.h> 16 #include <sound/initval.h> 17 #include <sound/soc.h> 18 #include <sound/tlv.h> 19 20 #include "ad193x.h" 21 22 /* codec private data */ 23 struct ad193x_priv { 24 struct regmap *regmap; 25 enum ad193x_type type; 26 int sysclk; 27 }; 28 29 /* 30 * AD193X volume/mute/de-emphasis etc. controls 31 */ 32 static const char * const ad193x_deemp[] = {"None", "48kHz", "44.1kHz", "32kHz"}; 33 34 static SOC_ENUM_SINGLE_DECL(ad193x_deemp_enum, AD193X_DAC_CTRL2, 1, 35 ad193x_deemp); 36 37 static const DECLARE_TLV_DB_MINMAX(adau193x_tlv, -9563, 0); 38 39 static const unsigned int ad193x_sb[] = {32}; 40 41 static struct snd_pcm_hw_constraint_list constr = { 42 .list = ad193x_sb, 43 .count = ARRAY_SIZE(ad193x_sb), 44 }; 45 46 static const struct snd_kcontrol_new ad193x_snd_controls[] = { 47 /* DAC volume control */ 48 SOC_DOUBLE_R_TLV("DAC1 Volume", AD193X_DAC_L1_VOL, 49 AD193X_DAC_R1_VOL, 0, 0xFF, 1, adau193x_tlv), 50 SOC_DOUBLE_R_TLV("DAC2 Volume", AD193X_DAC_L2_VOL, 51 AD193X_DAC_R2_VOL, 0, 0xFF, 1, adau193x_tlv), 52 SOC_DOUBLE_R_TLV("DAC3 Volume", AD193X_DAC_L3_VOL, 53 AD193X_DAC_R3_VOL, 0, 0xFF, 1, adau193x_tlv), 54 SOC_DOUBLE_R_TLV("DAC4 Volume", AD193X_DAC_L4_VOL, 55 AD193X_DAC_R4_VOL, 0, 0xFF, 1, adau193x_tlv), 56 57 /* DAC switch control */ 58 SOC_DOUBLE("DAC1 Switch", AD193X_DAC_CHNL_MUTE, AD193X_DACL1_MUTE, 59 AD193X_DACR1_MUTE, 1, 1), 60 SOC_DOUBLE("DAC2 Switch", AD193X_DAC_CHNL_MUTE, AD193X_DACL2_MUTE, 61 AD193X_DACR2_MUTE, 1, 1), 62 SOC_DOUBLE("DAC3 Switch", AD193X_DAC_CHNL_MUTE, AD193X_DACL3_MUTE, 63 AD193X_DACR3_MUTE, 1, 1), 64 SOC_DOUBLE("DAC4 Switch", AD193X_DAC_CHNL_MUTE, AD193X_DACL4_MUTE, 65 AD193X_DACR4_MUTE, 1, 1), 66 67 /* DAC de-emphasis */ 68 SOC_ENUM("Playback Deemphasis", ad193x_deemp_enum), 69 }; 70 71 static const struct snd_kcontrol_new ad193x_adc_snd_controls[] = { 72 /* ADC switch control */ 73 SOC_DOUBLE("ADC1 Switch", AD193X_ADC_CTRL0, AD193X_ADCL1_MUTE, 74 AD193X_ADCR1_MUTE, 1, 1), 75 SOC_DOUBLE("ADC2 Switch", AD193X_ADC_CTRL0, AD193X_ADCL2_MUTE, 76 AD193X_ADCR2_MUTE, 1, 1), 77 78 /* ADC high-pass filter */ 79 SOC_SINGLE("ADC High Pass Filter Switch", AD193X_ADC_CTRL0, 80 AD193X_ADC_HIGHPASS_FILTER, 1, 0), 81 }; 82 83 static const struct snd_soc_dapm_widget ad193x_dapm_widgets[] = { 84 SND_SOC_DAPM_DAC("DAC", "Playback", SND_SOC_NOPM, 0, 0), 85 SND_SOC_DAPM_PGA("DAC Output", AD193X_DAC_CTRL0, 0, 1, NULL, 0), 86 SND_SOC_DAPM_SUPPLY("PLL_PWR", AD193X_PLL_CLK_CTRL0, 0, 1, NULL, 0), 87 SND_SOC_DAPM_SUPPLY("SYSCLK", AD193X_PLL_CLK_CTRL0, 7, 0, NULL, 0), 88 SND_SOC_DAPM_VMID("VMID"), 89 SND_SOC_DAPM_OUTPUT("DAC1OUT"), 90 SND_SOC_DAPM_OUTPUT("DAC2OUT"), 91 SND_SOC_DAPM_OUTPUT("DAC3OUT"), 92 SND_SOC_DAPM_OUTPUT("DAC4OUT"), 93 }; 94 95 static const struct snd_soc_dapm_widget ad193x_adc_widgets[] = { 96 SND_SOC_DAPM_ADC("ADC", "Capture", SND_SOC_NOPM, 0, 0), 97 SND_SOC_DAPM_SUPPLY("ADC_PWR", AD193X_ADC_CTRL0, 0, 1, NULL, 0), 98 SND_SOC_DAPM_INPUT("ADC1IN"), 99 SND_SOC_DAPM_INPUT("ADC2IN"), 100 }; 101 102 static int ad193x_check_pll(struct snd_soc_dapm_widget *source, 103 struct snd_soc_dapm_widget *sink) 104 { 105 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); 106 struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(component); 107 108 return !!ad193x->sysclk; 109 } 110 111 static const struct snd_soc_dapm_route audio_paths[] = { 112 { "DAC", NULL, "SYSCLK" }, 113 { "DAC Output", NULL, "DAC" }, 114 { "DAC Output", NULL, "VMID" }, 115 { "DAC1OUT", NULL, "DAC Output" }, 116 { "DAC2OUT", NULL, "DAC Output" }, 117 { "DAC3OUT", NULL, "DAC Output" }, 118 { "DAC4OUT", NULL, "DAC Output" }, 119 { "SYSCLK", NULL, "PLL_PWR", &ad193x_check_pll }, 120 }; 121 122 static const struct snd_soc_dapm_route ad193x_adc_audio_paths[] = { 123 { "ADC", NULL, "SYSCLK" }, 124 { "ADC", NULL, "ADC_PWR" }, 125 { "ADC", NULL, "ADC1IN" }, 126 { "ADC", NULL, "ADC2IN" }, 127 }; 128 129 static inline bool ad193x_has_adc(const struct ad193x_priv *ad193x) 130 { 131 switch (ad193x->type) { 132 case AD1933: 133 case AD1934: 134 return false; 135 default: 136 break; 137 } 138 139 return true; 140 } 141 142 /* 143 * DAI ops entries 144 */ 145 146 static int ad193x_mute(struct snd_soc_dai *dai, int mute) 147 { 148 struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(dai->component); 149 150 if (mute) 151 regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL2, 152 AD193X_DAC_MASTER_MUTE, 153 AD193X_DAC_MASTER_MUTE); 154 else 155 regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL2, 156 AD193X_DAC_MASTER_MUTE, 0); 157 158 return 0; 159 } 160 161 static int ad193x_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, 162 unsigned int rx_mask, int slots, int width) 163 { 164 struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(dai->component); 165 unsigned int channels; 166 167 switch (slots) { 168 case 2: 169 channels = AD193X_2_CHANNELS; 170 break; 171 case 4: 172 channels = AD193X_4_CHANNELS; 173 break; 174 case 8: 175 channels = AD193X_8_CHANNELS; 176 break; 177 case 16: 178 channels = AD193X_16_CHANNELS; 179 break; 180 default: 181 return -EINVAL; 182 } 183 184 regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL1, 185 AD193X_DAC_CHAN_MASK, channels << AD193X_DAC_CHAN_SHFT); 186 if (ad193x_has_adc(ad193x)) 187 regmap_update_bits(ad193x->regmap, AD193X_ADC_CTRL2, 188 AD193X_ADC_CHAN_MASK, 189 channels << AD193X_ADC_CHAN_SHFT); 190 191 return 0; 192 } 193 194 static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai, 195 unsigned int fmt) 196 { 197 struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(codec_dai->component); 198 unsigned int adc_serfmt = 0; 199 unsigned int dac_serfmt = 0; 200 unsigned int adc_fmt = 0; 201 unsigned int dac_fmt = 0; 202 203 /* At present, the driver only support AUX ADC mode(SND_SOC_DAIFMT_I2S 204 * with TDM), ADC&DAC TDM mode(SND_SOC_DAIFMT_DSP_A) and DAC I2S mode 205 * (SND_SOC_DAIFMT_I2S) 206 */ 207 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 208 case SND_SOC_DAIFMT_I2S: 209 adc_serfmt |= AD193X_ADC_SERFMT_TDM; 210 dac_serfmt |= AD193X_DAC_SERFMT_STEREO; 211 break; 212 case SND_SOC_DAIFMT_DSP_A: 213 adc_serfmt |= AD193X_ADC_SERFMT_AUX; 214 dac_serfmt |= AD193X_DAC_SERFMT_TDM; 215 break; 216 default: 217 if (ad193x_has_adc(ad193x)) 218 return -EINVAL; 219 } 220 221 switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 222 case SND_SOC_DAIFMT_NB_NF: /* normal bit clock + frame */ 223 break; 224 case SND_SOC_DAIFMT_NB_IF: /* normal bclk + invert frm */ 225 adc_fmt |= AD193X_ADC_LEFT_HIGH; 226 dac_fmt |= AD193X_DAC_LEFT_HIGH; 227 break; 228 case SND_SOC_DAIFMT_IB_NF: /* invert bclk + normal frm */ 229 adc_fmt |= AD193X_ADC_BCLK_INV; 230 dac_fmt |= AD193X_DAC_BCLK_INV; 231 break; 232 case SND_SOC_DAIFMT_IB_IF: /* invert bclk + frm */ 233 adc_fmt |= AD193X_ADC_LEFT_HIGH; 234 adc_fmt |= AD193X_ADC_BCLK_INV; 235 dac_fmt |= AD193X_DAC_LEFT_HIGH; 236 dac_fmt |= AD193X_DAC_BCLK_INV; 237 break; 238 default: 239 return -EINVAL; 240 } 241 242 /* For DSP_*, LRCLK's polarity must be inverted */ 243 if (fmt & SND_SOC_DAIFMT_DSP_A) { 244 change_bit(ffs(AD193X_DAC_LEFT_HIGH) - 1, 245 (unsigned long *)&dac_fmt); 246 } 247 248 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 249 case SND_SOC_DAIFMT_CBM_CFM: /* codec clk & frm master */ 250 adc_fmt |= AD193X_ADC_LCR_MASTER; 251 adc_fmt |= AD193X_ADC_BCLK_MASTER; 252 dac_fmt |= AD193X_DAC_LCR_MASTER; 253 dac_fmt |= AD193X_DAC_BCLK_MASTER; 254 break; 255 case SND_SOC_DAIFMT_CBS_CFM: /* codec clk slave & frm master */ 256 adc_fmt |= AD193X_ADC_LCR_MASTER; 257 dac_fmt |= AD193X_DAC_LCR_MASTER; 258 break; 259 case SND_SOC_DAIFMT_CBM_CFS: /* codec clk master & frame slave */ 260 adc_fmt |= AD193X_ADC_BCLK_MASTER; 261 dac_fmt |= AD193X_DAC_BCLK_MASTER; 262 break; 263 case SND_SOC_DAIFMT_CBS_CFS: /* codec clk & frm slave */ 264 break; 265 default: 266 return -EINVAL; 267 } 268 269 if (ad193x_has_adc(ad193x)) { 270 regmap_update_bits(ad193x->regmap, AD193X_ADC_CTRL1, 271 AD193X_ADC_SERFMT_MASK, adc_serfmt); 272 regmap_update_bits(ad193x->regmap, AD193X_ADC_CTRL2, 273 AD193X_ADC_FMT_MASK, adc_fmt); 274 } 275 regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL0, 276 AD193X_DAC_SERFMT_MASK, dac_serfmt); 277 regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL1, 278 AD193X_DAC_FMT_MASK, dac_fmt); 279 280 return 0; 281 } 282 283 static int ad193x_set_dai_sysclk(struct snd_soc_dai *codec_dai, 284 int clk_id, unsigned int freq, int dir) 285 { 286 struct snd_soc_component *component = codec_dai->component; 287 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); 288 struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(component); 289 290 if (clk_id == AD193X_SYSCLK_MCLK) { 291 /* MCLK must be 512 x fs */ 292 if (dir == SND_SOC_CLOCK_OUT || freq != 24576000) 293 return -EINVAL; 294 295 regmap_update_bits(ad193x->regmap, AD193X_PLL_CLK_CTRL1, 296 AD193X_PLL_SRC_MASK, 297 AD193X_PLL_DAC_SRC_MCLK | 298 AD193X_PLL_CLK_SRC_MCLK); 299 300 snd_soc_dapm_sync(dapm); 301 return 0; 302 } 303 switch (freq) { 304 case 12288000: 305 case 18432000: 306 case 24576000: 307 case 36864000: 308 ad193x->sysclk = freq; 309 return 0; 310 } 311 return -EINVAL; 312 } 313 314 static int ad193x_hw_params(struct snd_pcm_substream *substream, 315 struct snd_pcm_hw_params *params, 316 struct snd_soc_dai *dai) 317 { 318 int word_len = 0, master_rate = 0; 319 struct snd_soc_component *component = dai->component; 320 struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(component); 321 322 /* bit size */ 323 switch (params_width(params)) { 324 case 16: 325 word_len = 3; 326 break; 327 case 20: 328 word_len = 1; 329 break; 330 case 24: 331 case 32: 332 word_len = 0; 333 break; 334 } 335 336 switch (ad193x->sysclk) { 337 case 12288000: 338 master_rate = AD193X_PLL_INPUT_256; 339 break; 340 case 18432000: 341 master_rate = AD193X_PLL_INPUT_384; 342 break; 343 case 24576000: 344 master_rate = AD193X_PLL_INPUT_512; 345 break; 346 case 36864000: 347 master_rate = AD193X_PLL_INPUT_768; 348 break; 349 } 350 351 regmap_update_bits(ad193x->regmap, AD193X_PLL_CLK_CTRL0, 352 AD193X_PLL_INPUT_MASK, master_rate); 353 354 regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL2, 355 AD193X_DAC_WORD_LEN_MASK, 356 word_len << AD193X_DAC_WORD_LEN_SHFT); 357 358 if (ad193x_has_adc(ad193x)) 359 regmap_update_bits(ad193x->regmap, AD193X_ADC_CTRL1, 360 AD193X_ADC_WORD_LEN_MASK, word_len); 361 362 return 0; 363 } 364 365 static int ad193x_startup(struct snd_pcm_substream *substream, 366 struct snd_soc_dai *dai) 367 { 368 return snd_pcm_hw_constraint_list(substream->runtime, 0, 369 SNDRV_PCM_HW_PARAM_SAMPLE_BITS, 370 &constr); 371 } 372 373 static const struct snd_soc_dai_ops ad193x_dai_ops = { 374 .startup = ad193x_startup, 375 .hw_params = ad193x_hw_params, 376 .digital_mute = ad193x_mute, 377 .set_tdm_slot = ad193x_set_tdm_slot, 378 .set_sysclk = ad193x_set_dai_sysclk, 379 .set_fmt = ad193x_set_dai_fmt, 380 }; 381 382 /* codec DAI instance */ 383 static struct snd_soc_dai_driver ad193x_dai = { 384 .name = "ad193x-hifi", 385 .playback = { 386 .stream_name = "Playback", 387 .channels_min = 2, 388 .channels_max = 8, 389 .rates = SNDRV_PCM_RATE_48000, 390 .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE | 391 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE, 392 }, 393 .capture = { 394 .stream_name = "Capture", 395 .channels_min = 2, 396 .channels_max = 4, 397 .rates = SNDRV_PCM_RATE_48000, 398 .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE | 399 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE, 400 }, 401 .ops = &ad193x_dai_ops, 402 }; 403 404 /* codec DAI instance for DAC only */ 405 static struct snd_soc_dai_driver ad193x_no_adc_dai = { 406 .name = "ad193x-hifi", 407 .playback = { 408 .stream_name = "Playback", 409 .channels_min = 2, 410 .channels_max = 8, 411 .rates = SNDRV_PCM_RATE_48000, 412 .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE | 413 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE, 414 }, 415 .ops = &ad193x_dai_ops, 416 }; 417 418 static int ad193x_component_probe(struct snd_soc_component *component) 419 { 420 struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(component); 421 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); 422 int num, ret; 423 424 /* default setting for ad193x */ 425 426 /* unmute dac channels */ 427 regmap_write(ad193x->regmap, AD193X_DAC_CHNL_MUTE, 0x0); 428 /* de-emphasis: 48kHz, powedown dac */ 429 regmap_write(ad193x->regmap, AD193X_DAC_CTRL2, 0x1A); 430 /* dac in tdm mode */ 431 regmap_write(ad193x->regmap, AD193X_DAC_CTRL0, 0x40); 432 433 /* adc only */ 434 if (ad193x_has_adc(ad193x)) { 435 /* high-pass filter enable */ 436 regmap_write(ad193x->regmap, AD193X_ADC_CTRL0, 0x3); 437 /* sata delay=1, adc aux mode */ 438 regmap_write(ad193x->regmap, AD193X_ADC_CTRL1, 0x43); 439 } 440 441 /* pll input: mclki/xi */ 442 regmap_write(ad193x->regmap, AD193X_PLL_CLK_CTRL0, 0x99); /* mclk=24.576Mhz: 0x9D; mclk=12.288Mhz: 0x99 */ 443 regmap_write(ad193x->regmap, AD193X_PLL_CLK_CTRL1, 0x04); 444 445 /* adc only */ 446 if (ad193x_has_adc(ad193x)) { 447 /* add adc controls */ 448 num = ARRAY_SIZE(ad193x_adc_snd_controls); 449 ret = snd_soc_add_component_controls(component, 450 ad193x_adc_snd_controls, 451 num); 452 if (ret) 453 return ret; 454 455 /* add adc widgets */ 456 num = ARRAY_SIZE(ad193x_adc_widgets); 457 ret = snd_soc_dapm_new_controls(dapm, 458 ad193x_adc_widgets, 459 num); 460 if (ret) 461 return ret; 462 463 /* add adc routes */ 464 num = ARRAY_SIZE(ad193x_adc_audio_paths); 465 ret = snd_soc_dapm_add_routes(dapm, 466 ad193x_adc_audio_paths, 467 num); 468 if (ret) 469 return ret; 470 } 471 472 return 0; 473 } 474 475 static const struct snd_soc_component_driver soc_component_dev_ad193x = { 476 .probe = ad193x_component_probe, 477 .controls = ad193x_snd_controls, 478 .num_controls = ARRAY_SIZE(ad193x_snd_controls), 479 .dapm_widgets = ad193x_dapm_widgets, 480 .num_dapm_widgets = ARRAY_SIZE(ad193x_dapm_widgets), 481 .dapm_routes = audio_paths, 482 .num_dapm_routes = ARRAY_SIZE(audio_paths), 483 .idle_bias_on = 1, 484 .use_pmdown_time = 1, 485 .endianness = 1, 486 .non_legacy_dai_naming = 1, 487 }; 488 489 const struct regmap_config ad193x_regmap_config = { 490 .max_register = AD193X_NUM_REGS - 1, 491 }; 492 EXPORT_SYMBOL_GPL(ad193x_regmap_config); 493 494 int ad193x_probe(struct device *dev, struct regmap *regmap, 495 enum ad193x_type type) 496 { 497 struct ad193x_priv *ad193x; 498 499 if (IS_ERR(regmap)) 500 return PTR_ERR(regmap); 501 502 ad193x = devm_kzalloc(dev, sizeof(*ad193x), GFP_KERNEL); 503 if (ad193x == NULL) 504 return -ENOMEM; 505 506 ad193x->regmap = regmap; 507 ad193x->type = type; 508 509 dev_set_drvdata(dev, ad193x); 510 511 if (ad193x_has_adc(ad193x)) 512 return devm_snd_soc_register_component(dev, &soc_component_dev_ad193x, 513 &ad193x_dai, 1); 514 return devm_snd_soc_register_component(dev, &soc_component_dev_ad193x, 515 &ad193x_no_adc_dai, 1); 516 } 517 EXPORT_SYMBOL_GPL(ad193x_probe); 518 519 MODULE_DESCRIPTION("ASoC ad193x driver"); 520 MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); 521 MODULE_LICENSE("GPL"); 522