1 /* 2 * AD193X Audio Codec driver supporting AD1936/7/8/9 3 * 4 * Copyright 2010 Analog Devices Inc. 5 * 6 * Licensed under the GPL-2 or later. 7 */ 8 9 #include <linux/init.h> 10 #include <linux/module.h> 11 #include <linux/kernel.h> 12 #include <linux/device.h> 13 #include <linux/i2c.h> 14 #include <linux/spi/spi.h> 15 #include <linux/slab.h> 16 #include <sound/core.h> 17 #include <sound/pcm.h> 18 #include <sound/pcm_params.h> 19 #include <sound/initval.h> 20 #include <sound/soc.h> 21 #include <sound/tlv.h> 22 #include "ad193x.h" 23 24 /* codec private data */ 25 struct ad193x_priv { 26 struct regmap *regmap; 27 int sysclk; 28 }; 29 30 /* 31 * AD193X volume/mute/de-emphasis etc. controls 32 */ 33 static const char * const ad193x_deemp[] = {"None", "48kHz", "44.1kHz", "32kHz"}; 34 35 static const struct soc_enum ad193x_deemp_enum = 36 SOC_ENUM_SINGLE(AD193X_DAC_CTRL2, 1, 4, ad193x_deemp); 37 38 static const DECLARE_TLV_DB_MINMAX(adau193x_tlv, -9563, 0); 39 40 static const struct snd_kcontrol_new ad193x_snd_controls[] = { 41 /* DAC volume control */ 42 SOC_DOUBLE_R_TLV("DAC1 Volume", AD193X_DAC_L1_VOL, 43 AD193X_DAC_R1_VOL, 0, 0xFF, 1, adau193x_tlv), 44 SOC_DOUBLE_R_TLV("DAC2 Volume", AD193X_DAC_L2_VOL, 45 AD193X_DAC_R2_VOL, 0, 0xFF, 1, adau193x_tlv), 46 SOC_DOUBLE_R_TLV("DAC3 Volume", AD193X_DAC_L3_VOL, 47 AD193X_DAC_R3_VOL, 0, 0xFF, 1, adau193x_tlv), 48 SOC_DOUBLE_R_TLV("DAC4 Volume", AD193X_DAC_L4_VOL, 49 AD193X_DAC_R4_VOL, 0, 0xFF, 1, adau193x_tlv), 50 51 /* ADC switch control */ 52 SOC_DOUBLE("ADC1 Switch", AD193X_ADC_CTRL0, AD193X_ADCL1_MUTE, 53 AD193X_ADCR1_MUTE, 1, 1), 54 SOC_DOUBLE("ADC2 Switch", AD193X_ADC_CTRL0, AD193X_ADCL2_MUTE, 55 AD193X_ADCR2_MUTE, 1, 1), 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 /* ADC high-pass filter */ 68 SOC_SINGLE("ADC High Pass Filter Switch", AD193X_ADC_CTRL0, 69 AD193X_ADC_HIGHPASS_FILTER, 1, 0), 70 71 /* DAC de-emphasis */ 72 SOC_ENUM("Playback Deemphasis", ad193x_deemp_enum), 73 }; 74 75 static const struct snd_soc_dapm_widget ad193x_dapm_widgets[] = { 76 SND_SOC_DAPM_DAC("DAC", "Playback", AD193X_DAC_CTRL0, 0, 1), 77 SND_SOC_DAPM_ADC("ADC", "Capture", SND_SOC_NOPM, 0, 0), 78 SND_SOC_DAPM_SUPPLY("PLL_PWR", AD193X_PLL_CLK_CTRL0, 0, 1, NULL, 0), 79 SND_SOC_DAPM_SUPPLY("ADC_PWR", AD193X_ADC_CTRL0, 0, 1, NULL, 0), 80 SND_SOC_DAPM_SUPPLY("SYSCLK", AD193X_PLL_CLK_CTRL0, 7, 0, NULL, 0), 81 SND_SOC_DAPM_OUTPUT("DAC1OUT"), 82 SND_SOC_DAPM_OUTPUT("DAC2OUT"), 83 SND_SOC_DAPM_OUTPUT("DAC3OUT"), 84 SND_SOC_DAPM_OUTPUT("DAC4OUT"), 85 SND_SOC_DAPM_INPUT("ADC1IN"), 86 SND_SOC_DAPM_INPUT("ADC2IN"), 87 }; 88 89 static const struct snd_soc_dapm_route audio_paths[] = { 90 { "DAC", NULL, "SYSCLK" }, 91 { "ADC", NULL, "SYSCLK" }, 92 { "DAC", NULL, "ADC_PWR" }, 93 { "ADC", NULL, "ADC_PWR" }, 94 { "DAC1OUT", NULL, "DAC" }, 95 { "DAC2OUT", NULL, "DAC" }, 96 { "DAC3OUT", NULL, "DAC" }, 97 { "DAC4OUT", NULL, "DAC" }, 98 { "ADC", NULL, "ADC1IN" }, 99 { "ADC", NULL, "ADC2IN" }, 100 { "SYSCLK", NULL, "PLL_PWR" }, 101 }; 102 103 /* 104 * DAI ops entries 105 */ 106 107 static int ad193x_mute(struct snd_soc_dai *dai, int mute) 108 { 109 struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(dai->codec); 110 111 if (mute) 112 regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL2, 113 AD193X_DAC_MASTER_MUTE, 114 AD193X_DAC_MASTER_MUTE); 115 else 116 regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL2, 117 AD193X_DAC_MASTER_MUTE, 0); 118 119 return 0; 120 } 121 122 static int ad193x_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, 123 unsigned int rx_mask, int slots, int width) 124 { 125 struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(dai->codec); 126 unsigned int channels; 127 128 switch (slots) { 129 case 2: 130 channels = AD193X_2_CHANNELS; 131 break; 132 case 4: 133 channels = AD193X_4_CHANNELS; 134 break; 135 case 8: 136 channels = AD193X_8_CHANNELS; 137 break; 138 case 16: 139 channels = AD193X_16_CHANNELS; 140 break; 141 default: 142 return -EINVAL; 143 } 144 145 regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL1, 146 AD193X_DAC_CHAN_MASK, channels << AD193X_DAC_CHAN_SHFT); 147 regmap_update_bits(ad193x->regmap, AD193X_ADC_CTRL2, 148 AD193X_ADC_CHAN_MASK, channels << AD193X_ADC_CHAN_SHFT); 149 150 return 0; 151 } 152 153 static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai, 154 unsigned int fmt) 155 { 156 struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec_dai->codec); 157 unsigned int adc_serfmt = 0; 158 unsigned int adc_fmt = 0; 159 unsigned int dac_fmt = 0; 160 161 /* At present, the driver only support AUX ADC mode(SND_SOC_DAIFMT_I2S 162 * with TDM) and ADC&DAC TDM mode(SND_SOC_DAIFMT_DSP_A) 163 */ 164 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 165 case SND_SOC_DAIFMT_I2S: 166 adc_serfmt |= AD193X_ADC_SERFMT_TDM; 167 break; 168 case SND_SOC_DAIFMT_DSP_A: 169 adc_serfmt |= AD193X_ADC_SERFMT_AUX; 170 break; 171 default: 172 return -EINVAL; 173 } 174 175 switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 176 case SND_SOC_DAIFMT_NB_NF: /* normal bit clock + frame */ 177 break; 178 case SND_SOC_DAIFMT_NB_IF: /* normal bclk + invert frm */ 179 adc_fmt |= AD193X_ADC_LEFT_HIGH; 180 dac_fmt |= AD193X_DAC_LEFT_HIGH; 181 break; 182 case SND_SOC_DAIFMT_IB_NF: /* invert bclk + normal frm */ 183 adc_fmt |= AD193X_ADC_BCLK_INV; 184 dac_fmt |= AD193X_DAC_BCLK_INV; 185 break; 186 case SND_SOC_DAIFMT_IB_IF: /* invert bclk + frm */ 187 adc_fmt |= AD193X_ADC_LEFT_HIGH; 188 adc_fmt |= AD193X_ADC_BCLK_INV; 189 dac_fmt |= AD193X_DAC_LEFT_HIGH; 190 dac_fmt |= AD193X_DAC_BCLK_INV; 191 break; 192 default: 193 return -EINVAL; 194 } 195 196 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 197 case SND_SOC_DAIFMT_CBM_CFM: /* codec clk & frm master */ 198 adc_fmt |= AD193X_ADC_LCR_MASTER; 199 adc_fmt |= AD193X_ADC_BCLK_MASTER; 200 dac_fmt |= AD193X_DAC_LCR_MASTER; 201 dac_fmt |= AD193X_DAC_BCLK_MASTER; 202 break; 203 case SND_SOC_DAIFMT_CBS_CFM: /* codec clk slave & frm master */ 204 adc_fmt |= AD193X_ADC_LCR_MASTER; 205 dac_fmt |= AD193X_DAC_LCR_MASTER; 206 break; 207 case SND_SOC_DAIFMT_CBM_CFS: /* codec clk master & frame slave */ 208 adc_fmt |= AD193X_ADC_BCLK_MASTER; 209 dac_fmt |= AD193X_DAC_BCLK_MASTER; 210 break; 211 case SND_SOC_DAIFMT_CBS_CFS: /* codec clk & frm slave */ 212 break; 213 default: 214 return -EINVAL; 215 } 216 217 regmap_update_bits(ad193x->regmap, AD193X_ADC_CTRL1, 218 AD193X_ADC_SERFMT_MASK, adc_serfmt); 219 regmap_update_bits(ad193x->regmap, AD193X_ADC_CTRL2, 220 AD193X_ADC_FMT_MASK, adc_fmt); 221 regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL1, 222 AD193X_DAC_FMT_MASK, dac_fmt); 223 224 return 0; 225 } 226 227 static int ad193x_set_dai_sysclk(struct snd_soc_dai *codec_dai, 228 int clk_id, unsigned int freq, int dir) 229 { 230 struct snd_soc_codec *codec = codec_dai->codec; 231 struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec); 232 switch (freq) { 233 case 12288000: 234 case 18432000: 235 case 24576000: 236 case 36864000: 237 ad193x->sysclk = freq; 238 return 0; 239 } 240 return -EINVAL; 241 } 242 243 static int ad193x_hw_params(struct snd_pcm_substream *substream, 244 struct snd_pcm_hw_params *params, 245 struct snd_soc_dai *dai) 246 { 247 int word_len = 0, master_rate = 0; 248 249 struct snd_soc_pcm_runtime *rtd = substream->private_data; 250 struct snd_soc_codec *codec = rtd->codec; 251 struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec); 252 253 /* bit size */ 254 switch (params_format(params)) { 255 case SNDRV_PCM_FORMAT_S16_LE: 256 word_len = 3; 257 break; 258 case SNDRV_PCM_FORMAT_S20_3LE: 259 word_len = 1; 260 break; 261 case SNDRV_PCM_FORMAT_S24_LE: 262 case SNDRV_PCM_FORMAT_S32_LE: 263 word_len = 0; 264 break; 265 } 266 267 switch (ad193x->sysclk) { 268 case 12288000: 269 master_rate = AD193X_PLL_INPUT_256; 270 break; 271 case 18432000: 272 master_rate = AD193X_PLL_INPUT_384; 273 break; 274 case 24576000: 275 master_rate = AD193X_PLL_INPUT_512; 276 break; 277 case 36864000: 278 master_rate = AD193X_PLL_INPUT_768; 279 break; 280 } 281 282 regmap_update_bits(ad193x->regmap, AD193X_PLL_CLK_CTRL0, 283 AD193X_PLL_INPUT_MASK, master_rate); 284 285 regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL2, 286 AD193X_DAC_WORD_LEN_MASK, 287 word_len << AD193X_DAC_WORD_LEN_SHFT); 288 289 regmap_update_bits(ad193x->regmap, AD193X_ADC_CTRL1, 290 AD193X_ADC_WORD_LEN_MASK, word_len); 291 292 return 0; 293 } 294 295 static const struct snd_soc_dai_ops ad193x_dai_ops = { 296 .hw_params = ad193x_hw_params, 297 .digital_mute = ad193x_mute, 298 .set_tdm_slot = ad193x_set_tdm_slot, 299 .set_sysclk = ad193x_set_dai_sysclk, 300 .set_fmt = ad193x_set_dai_fmt, 301 }; 302 303 /* codec DAI instance */ 304 static struct snd_soc_dai_driver ad193x_dai = { 305 .name = "ad193x-hifi", 306 .playback = { 307 .stream_name = "Playback", 308 .channels_min = 2, 309 .channels_max = 8, 310 .rates = SNDRV_PCM_RATE_48000, 311 .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE | 312 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE, 313 }, 314 .capture = { 315 .stream_name = "Capture", 316 .channels_min = 2, 317 .channels_max = 4, 318 .rates = SNDRV_PCM_RATE_48000, 319 .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE | 320 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE, 321 }, 322 .ops = &ad193x_dai_ops, 323 }; 324 325 static int ad193x_probe(struct snd_soc_codec *codec) 326 { 327 struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec); 328 int ret; 329 330 codec->control_data = ad193x->regmap; 331 ret = snd_soc_codec_set_cache_io(codec, 0, 0, SND_SOC_REGMAP); 332 if (ret < 0) { 333 dev_err(codec->dev, "failed to set cache I/O: %d\n", ret); 334 return ret; 335 } 336 337 /* default setting for ad193x */ 338 339 /* unmute dac channels */ 340 regmap_write(ad193x->regmap, AD193X_DAC_CHNL_MUTE, 0x0); 341 /* de-emphasis: 48kHz, powedown dac */ 342 regmap_write(ad193x->regmap, AD193X_DAC_CTRL2, 0x1A); 343 /* powerdown dac, dac in tdm mode */ 344 regmap_write(ad193x->regmap, AD193X_DAC_CTRL0, 0x41); 345 /* high-pass filter enable */ 346 regmap_write(ad193x->regmap, AD193X_ADC_CTRL0, 0x3); 347 /* sata delay=1, adc aux mode */ 348 regmap_write(ad193x->regmap, AD193X_ADC_CTRL1, 0x43); 349 /* pll input: mclki/xi */ 350 regmap_write(ad193x->regmap, AD193X_PLL_CLK_CTRL0, 0x99); /* mclk=24.576Mhz: 0x9D; mclk=12.288Mhz: 0x99 */ 351 regmap_write(ad193x->regmap, AD193X_PLL_CLK_CTRL1, 0x04); 352 353 return ret; 354 } 355 356 static struct snd_soc_codec_driver soc_codec_dev_ad193x = { 357 .probe = ad193x_probe, 358 .controls = ad193x_snd_controls, 359 .num_controls = ARRAY_SIZE(ad193x_snd_controls), 360 .dapm_widgets = ad193x_dapm_widgets, 361 .num_dapm_widgets = ARRAY_SIZE(ad193x_dapm_widgets), 362 .dapm_routes = audio_paths, 363 .num_dapm_routes = ARRAY_SIZE(audio_paths), 364 }; 365 366 static bool adau193x_reg_volatile(struct device *dev, unsigned int reg) 367 { 368 return false; 369 } 370 371 #if defined(CONFIG_SPI_MASTER) 372 373 static const struct regmap_config ad193x_spi_regmap_config = { 374 .val_bits = 8, 375 .reg_bits = 16, 376 .read_flag_mask = 0x09, 377 .write_flag_mask = 0x08, 378 379 .max_register = AD193X_NUM_REGS - 1, 380 .volatile_reg = adau193x_reg_volatile, 381 }; 382 383 static int __devinit ad193x_spi_probe(struct spi_device *spi) 384 { 385 struct ad193x_priv *ad193x; 386 int ret; 387 388 ad193x = devm_kzalloc(&spi->dev, sizeof(struct ad193x_priv), 389 GFP_KERNEL); 390 if (ad193x == NULL) 391 return -ENOMEM; 392 393 ad193x->regmap = regmap_init_spi(spi, &ad193x_spi_regmap_config); 394 if (IS_ERR(ad193x->regmap)) { 395 ret = PTR_ERR(ad193x->regmap); 396 goto err_out; 397 } 398 399 spi_set_drvdata(spi, ad193x); 400 401 ret = snd_soc_register_codec(&spi->dev, 402 &soc_codec_dev_ad193x, &ad193x_dai, 1); 403 if (ret < 0) 404 goto err_regmap_exit; 405 406 return 0; 407 408 err_regmap_exit: 409 regmap_exit(ad193x->regmap); 410 err_out: 411 return ret; 412 } 413 414 static int __devexit ad193x_spi_remove(struct spi_device *spi) 415 { 416 struct ad193x_priv *ad193x = spi_get_drvdata(spi); 417 418 snd_soc_unregister_codec(&spi->dev); 419 regmap_exit(ad193x->regmap); 420 return 0; 421 } 422 423 static struct spi_driver ad193x_spi_driver = { 424 .driver = { 425 .name = "ad193x", 426 .owner = THIS_MODULE, 427 }, 428 .probe = ad193x_spi_probe, 429 .remove = __devexit_p(ad193x_spi_remove), 430 }; 431 #endif 432 433 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) 434 435 static const struct regmap_config ad193x_i2c_regmap_config = { 436 .val_bits = 8, 437 .reg_bits = 8, 438 439 .max_register = AD193X_NUM_REGS - 1, 440 .volatile_reg = adau193x_reg_volatile, 441 }; 442 443 static const struct i2c_device_id ad193x_id[] = { 444 { "ad1936", 0 }, 445 { "ad1937", 0 }, 446 { } 447 }; 448 MODULE_DEVICE_TABLE(i2c, ad193x_id); 449 450 static int __devinit ad193x_i2c_probe(struct i2c_client *client, 451 const struct i2c_device_id *id) 452 { 453 struct ad193x_priv *ad193x; 454 int ret; 455 456 ad193x = devm_kzalloc(&client->dev, sizeof(struct ad193x_priv), 457 GFP_KERNEL); 458 if (ad193x == NULL) 459 return -ENOMEM; 460 461 ad193x->regmap = regmap_init_i2c(client, &ad193x_i2c_regmap_config); 462 if (IS_ERR(ad193x->regmap)) { 463 ret = PTR_ERR(ad193x->regmap); 464 goto err_out; 465 } 466 467 i2c_set_clientdata(client, ad193x); 468 469 ret = snd_soc_register_codec(&client->dev, 470 &soc_codec_dev_ad193x, &ad193x_dai, 1); 471 if (ret < 0) 472 goto err_regmap_exit; 473 474 return 0; 475 476 err_regmap_exit: 477 regmap_exit(ad193x->regmap); 478 err_out: 479 return ret; 480 } 481 482 static int __devexit ad193x_i2c_remove(struct i2c_client *client) 483 { 484 struct ad193x_priv *ad193x = i2c_get_clientdata(client); 485 486 snd_soc_unregister_codec(&client->dev); 487 regmap_exit(ad193x->regmap); 488 return 0; 489 } 490 491 static struct i2c_driver ad193x_i2c_driver = { 492 .driver = { 493 .name = "ad193x", 494 }, 495 .probe = ad193x_i2c_probe, 496 .remove = __devexit_p(ad193x_i2c_remove), 497 .id_table = ad193x_id, 498 }; 499 #endif 500 501 static int __init ad193x_modinit(void) 502 { 503 int ret; 504 505 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) 506 ret = i2c_add_driver(&ad193x_i2c_driver); 507 if (ret != 0) { 508 printk(KERN_ERR "Failed to register AD193X I2C driver: %d\n", 509 ret); 510 } 511 #endif 512 513 #if defined(CONFIG_SPI_MASTER) 514 ret = spi_register_driver(&ad193x_spi_driver); 515 if (ret != 0) { 516 printk(KERN_ERR "Failed to register AD193X SPI driver: %d\n", 517 ret); 518 } 519 #endif 520 return ret; 521 } 522 module_init(ad193x_modinit); 523 524 static void __exit ad193x_modexit(void) 525 { 526 #if defined(CONFIG_SPI_MASTER) 527 spi_unregister_driver(&ad193x_spi_driver); 528 #endif 529 530 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) 531 i2c_del_driver(&ad193x_i2c_driver); 532 #endif 533 } 534 module_exit(ad193x_modexit); 535 536 MODULE_DESCRIPTION("ASoC ad193x driver"); 537 MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); 538 MODULE_LICENSE("GPL"); 539