1 /* 2 * ak4613.c -- Asahi Kasei ALSA Soc Audio driver 3 * 4 * Copyright (C) 2015 Renesas Electronics Corporation 5 * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> 6 * 7 * Based on ak4642.c by Kuninori Morimoto 8 * Based on wm8731.c by Richard Purdie 9 * Based on ak4535.c by Richard Purdie 10 * Based on wm8753.c by Liam Girdwood 11 * 12 * This program is free software; you can redistribute it and/or modify 13 * it under the terms of the GNU General Public License version 2 as 14 * published by the Free Software Foundation. 15 */ 16 17 #include <linux/clk.h> 18 #include <linux/i2c.h> 19 #include <linux/slab.h> 20 #include <linux/of_device.h> 21 #include <linux/module.h> 22 #include <linux/regmap.h> 23 #include <sound/soc.h> 24 #include <sound/pcm_params.h> 25 #include <sound/tlv.h> 26 27 #define PW_MGMT1 0x00 /* Power Management 1 */ 28 #define PW_MGMT2 0x01 /* Power Management 2 */ 29 #define PW_MGMT3 0x02 /* Power Management 3 */ 30 #define CTRL1 0x03 /* Control 1 */ 31 #define CTRL2 0x04 /* Control 2 */ 32 #define DEMP1 0x05 /* De-emphasis1 */ 33 #define DEMP2 0x06 /* De-emphasis2 */ 34 #define OFD 0x07 /* Overflow Detect */ 35 #define ZRD 0x08 /* Zero Detect */ 36 #define ICTRL 0x09 /* Input Control */ 37 #define OCTRL 0x0a /* Output Control */ 38 #define LOUT1 0x0b /* LOUT1 Volume Control */ 39 #define ROUT1 0x0c /* ROUT1 Volume Control */ 40 #define LOUT2 0x0d /* LOUT2 Volume Control */ 41 #define ROUT2 0x0e /* ROUT2 Volume Control */ 42 #define LOUT3 0x0f /* LOUT3 Volume Control */ 43 #define ROUT3 0x10 /* ROUT3 Volume Control */ 44 #define LOUT4 0x11 /* LOUT4 Volume Control */ 45 #define ROUT4 0x12 /* ROUT4 Volume Control */ 46 #define LOUT5 0x13 /* LOUT5 Volume Control */ 47 #define ROUT5 0x14 /* ROUT5 Volume Control */ 48 #define LOUT6 0x15 /* LOUT6 Volume Control */ 49 #define ROUT6 0x16 /* ROUT6 Volume Control */ 50 51 /* PW_MGMT1 */ 52 #define RSTN BIT(0) 53 #define PMDAC BIT(1) 54 #define PMADC BIT(2) 55 #define PMVR BIT(3) 56 57 /* PW_MGMT2 */ 58 #define PMAD_ALL 0x7 59 60 /* PW_MGMT3 */ 61 #define PMDA_ALL 0x3f 62 63 /* CTRL1 */ 64 #define DIF0 BIT(3) 65 #define DIF1 BIT(4) 66 #define DIF2 BIT(5) 67 #define TDM0 BIT(6) 68 #define TDM1 BIT(7) 69 #define NO_FMT (0xff) 70 #define FMT_MASK (0xf8) 71 72 /* CTRL2 */ 73 #define DFS_MASK (3 << 2) 74 #define DFS_NORMAL_SPEED (0 << 2) 75 #define DFS_DOUBLE_SPEED (1 << 2) 76 #define DFS_QUAD_SPEED (2 << 2) 77 78 struct ak4613_formats { 79 unsigned int width; 80 unsigned int fmt; 81 }; 82 83 struct ak4613_interface { 84 struct ak4613_formats capture; 85 struct ak4613_formats playback; 86 }; 87 88 struct ak4613_priv { 89 struct mutex lock; 90 const struct ak4613_interface *iface; 91 92 unsigned int fmt; 93 u8 oc; 94 u8 ic; 95 int cnt; 96 }; 97 98 /* 99 * Playback Volume 100 * 101 * max : 0x00 : 0 dB 102 * ( 0.5 dB step ) 103 * min : 0xFE : -127.0 dB 104 * mute: 0xFF 105 */ 106 static const DECLARE_TLV_DB_SCALE(out_tlv, -12750, 50, 1); 107 108 static const struct snd_kcontrol_new ak4613_snd_controls[] = { 109 SOC_DOUBLE_R_TLV("Digital Playback Volume1", LOUT1, ROUT1, 110 0, 0xFF, 1, out_tlv), 111 SOC_DOUBLE_R_TLV("Digital Playback Volume2", LOUT2, ROUT2, 112 0, 0xFF, 1, out_tlv), 113 SOC_DOUBLE_R_TLV("Digital Playback Volume3", LOUT3, ROUT3, 114 0, 0xFF, 1, out_tlv), 115 SOC_DOUBLE_R_TLV("Digital Playback Volume4", LOUT4, ROUT4, 116 0, 0xFF, 1, out_tlv), 117 SOC_DOUBLE_R_TLV("Digital Playback Volume5", LOUT5, ROUT5, 118 0, 0xFF, 1, out_tlv), 119 SOC_DOUBLE_R_TLV("Digital Playback Volume6", LOUT6, ROUT6, 120 0, 0xFF, 1, out_tlv), 121 }; 122 123 static const struct reg_default ak4613_reg[] = { 124 { 0x0, 0x0f }, { 0x1, 0x07 }, { 0x2, 0x3f }, { 0x3, 0x20 }, 125 { 0x4, 0x20 }, { 0x5, 0x55 }, { 0x6, 0x05 }, { 0x7, 0x07 }, 126 { 0x8, 0x0f }, { 0x9, 0x07 }, { 0xa, 0x3f }, { 0xb, 0x00 }, 127 { 0xc, 0x00 }, { 0xd, 0x00 }, { 0xe, 0x00 }, { 0xf, 0x00 }, 128 { 0x10, 0x00 }, { 0x11, 0x00 }, { 0x12, 0x00 }, { 0x13, 0x00 }, 129 { 0x14, 0x00 }, { 0x15, 0x00 }, { 0x16, 0x00 }, 130 }; 131 132 #define AUDIO_IFACE_TO_VAL(fmts) ((fmts - ak4613_iface) << 3) 133 #define AUDIO_IFACE(b, fmt) { b, SND_SOC_DAIFMT_##fmt } 134 static const struct ak4613_interface ak4613_iface[] = { 135 /* capture */ /* playback */ 136 [0] = { AUDIO_IFACE(24, LEFT_J), AUDIO_IFACE(16, RIGHT_J) }, 137 [1] = { AUDIO_IFACE(24, LEFT_J), AUDIO_IFACE(20, RIGHT_J) }, 138 [2] = { AUDIO_IFACE(24, LEFT_J), AUDIO_IFACE(24, RIGHT_J) }, 139 [3] = { AUDIO_IFACE(24, LEFT_J), AUDIO_IFACE(24, LEFT_J) }, 140 [4] = { AUDIO_IFACE(24, I2S), AUDIO_IFACE(24, I2S) }, 141 }; 142 143 static const struct regmap_config ak4613_regmap_cfg = { 144 .reg_bits = 8, 145 .val_bits = 8, 146 .max_register = 0x16, 147 .reg_defaults = ak4613_reg, 148 .num_reg_defaults = ARRAY_SIZE(ak4613_reg), 149 }; 150 151 static const struct of_device_id ak4613_of_match[] = { 152 { .compatible = "asahi-kasei,ak4613", .data = &ak4613_regmap_cfg }, 153 {}, 154 }; 155 MODULE_DEVICE_TABLE(of, ak4613_of_match); 156 157 static const struct i2c_device_id ak4613_i2c_id[] = { 158 { "ak4613", (kernel_ulong_t)&ak4613_regmap_cfg }, 159 { } 160 }; 161 MODULE_DEVICE_TABLE(i2c, ak4613_i2c_id); 162 163 static const struct snd_soc_dapm_widget ak4613_dapm_widgets[] = { 164 165 /* Outputs */ 166 SND_SOC_DAPM_OUTPUT("LOUT1"), 167 SND_SOC_DAPM_OUTPUT("LOUT2"), 168 SND_SOC_DAPM_OUTPUT("LOUT3"), 169 SND_SOC_DAPM_OUTPUT("LOUT4"), 170 SND_SOC_DAPM_OUTPUT("LOUT5"), 171 SND_SOC_DAPM_OUTPUT("LOUT6"), 172 173 SND_SOC_DAPM_OUTPUT("ROUT1"), 174 SND_SOC_DAPM_OUTPUT("ROUT2"), 175 SND_SOC_DAPM_OUTPUT("ROUT3"), 176 SND_SOC_DAPM_OUTPUT("ROUT4"), 177 SND_SOC_DAPM_OUTPUT("ROUT5"), 178 SND_SOC_DAPM_OUTPUT("ROUT6"), 179 180 /* Inputs */ 181 SND_SOC_DAPM_INPUT("LIN1"), 182 SND_SOC_DAPM_INPUT("LIN2"), 183 184 SND_SOC_DAPM_INPUT("RIN1"), 185 SND_SOC_DAPM_INPUT("RIN2"), 186 187 /* DAC */ 188 SND_SOC_DAPM_DAC("DAC1", NULL, PW_MGMT3, 0, 0), 189 SND_SOC_DAPM_DAC("DAC2", NULL, PW_MGMT3, 1, 0), 190 SND_SOC_DAPM_DAC("DAC3", NULL, PW_MGMT3, 2, 0), 191 SND_SOC_DAPM_DAC("DAC4", NULL, PW_MGMT3, 3, 0), 192 SND_SOC_DAPM_DAC("DAC5", NULL, PW_MGMT3, 4, 0), 193 SND_SOC_DAPM_DAC("DAC6", NULL, PW_MGMT3, 5, 0), 194 195 /* ADC */ 196 SND_SOC_DAPM_ADC("ADC1", NULL, PW_MGMT2, 0, 0), 197 SND_SOC_DAPM_ADC("ADC2", NULL, PW_MGMT2, 1, 0), 198 }; 199 200 static const struct snd_soc_dapm_route ak4613_intercon[] = { 201 {"LOUT1", NULL, "DAC1"}, 202 {"LOUT2", NULL, "DAC2"}, 203 {"LOUT3", NULL, "DAC3"}, 204 {"LOUT4", NULL, "DAC4"}, 205 {"LOUT5", NULL, "DAC5"}, 206 {"LOUT6", NULL, "DAC6"}, 207 208 {"ROUT1", NULL, "DAC1"}, 209 {"ROUT2", NULL, "DAC2"}, 210 {"ROUT3", NULL, "DAC3"}, 211 {"ROUT4", NULL, "DAC4"}, 212 {"ROUT5", NULL, "DAC5"}, 213 {"ROUT6", NULL, "DAC6"}, 214 215 {"DAC1", NULL, "Playback"}, 216 {"DAC2", NULL, "Playback"}, 217 {"DAC3", NULL, "Playback"}, 218 {"DAC4", NULL, "Playback"}, 219 {"DAC5", NULL, "Playback"}, 220 {"DAC6", NULL, "Playback"}, 221 222 {"Capture", NULL, "ADC1"}, 223 {"Capture", NULL, "ADC2"}, 224 225 {"ADC1", NULL, "LIN1"}, 226 {"ADC2", NULL, "LIN2"}, 227 228 {"ADC1", NULL, "RIN1"}, 229 {"ADC2", NULL, "RIN2"}, 230 }; 231 232 static void ak4613_dai_shutdown(struct snd_pcm_substream *substream, 233 struct snd_soc_dai *dai) 234 { 235 struct snd_soc_codec *codec = dai->codec; 236 struct ak4613_priv *priv = snd_soc_codec_get_drvdata(codec); 237 struct device *dev = codec->dev; 238 239 mutex_lock(&priv->lock); 240 priv->cnt--; 241 if (priv->cnt < 0) { 242 dev_err(dev, "unexpected counter error\n"); 243 priv->cnt = 0; 244 } 245 if (!priv->cnt) 246 priv->iface = NULL; 247 mutex_unlock(&priv->lock); 248 } 249 250 static int ak4613_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) 251 { 252 struct snd_soc_codec *codec = dai->codec; 253 struct ak4613_priv *priv = snd_soc_codec_get_drvdata(codec); 254 255 fmt &= SND_SOC_DAIFMT_FORMAT_MASK; 256 257 switch (fmt) { 258 case SND_SOC_DAIFMT_RIGHT_J: 259 case SND_SOC_DAIFMT_LEFT_J: 260 case SND_SOC_DAIFMT_I2S: 261 priv->fmt = fmt; 262 263 break; 264 default: 265 return -EINVAL; 266 } 267 268 return 0; 269 } 270 271 static bool ak4613_dai_fmt_matching(const struct ak4613_interface *iface, 272 int is_play, 273 unsigned int fmt, unsigned int width) 274 { 275 const struct ak4613_formats *fmts; 276 277 fmts = (is_play) ? &iface->playback : &iface->capture; 278 279 if (fmts->fmt != fmt) 280 return false; 281 282 if (fmt == SND_SOC_DAIFMT_RIGHT_J) { 283 if (fmts->width != width) 284 return false; 285 } else { 286 if (fmts->width < width) 287 return false; 288 } 289 290 return true; 291 } 292 293 static int ak4613_dai_hw_params(struct snd_pcm_substream *substream, 294 struct snd_pcm_hw_params *params, 295 struct snd_soc_dai *dai) 296 { 297 struct snd_soc_codec *codec = dai->codec; 298 struct ak4613_priv *priv = snd_soc_codec_get_drvdata(codec); 299 const struct ak4613_interface *iface; 300 struct device *dev = codec->dev; 301 unsigned int width = params_width(params); 302 unsigned int fmt = priv->fmt; 303 unsigned int rate; 304 int is_play = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 305 int i, ret; 306 u8 fmt_ctrl, ctrl2; 307 308 rate = params_rate(params); 309 switch (rate) { 310 case 32000: 311 case 44100: 312 case 48000: 313 ctrl2 = DFS_NORMAL_SPEED; 314 break; 315 case 88200: 316 case 96000: 317 ctrl2 = DFS_DOUBLE_SPEED; 318 break; 319 case 176400: 320 case 192000: 321 ctrl2 = DFS_QUAD_SPEED; 322 break; 323 default: 324 return -EINVAL; 325 } 326 327 /* 328 * FIXME 329 * 330 * It doesn't support TDM at this point 331 */ 332 fmt_ctrl = NO_FMT; 333 ret = -EINVAL; 334 iface = NULL; 335 336 mutex_lock(&priv->lock); 337 if (priv->iface) { 338 if (ak4613_dai_fmt_matching(priv->iface, is_play, fmt, width)) 339 iface = priv->iface; 340 } else { 341 for (i = ARRAY_SIZE(ak4613_iface); i >= 0; i--) { 342 if (!ak4613_dai_fmt_matching(ak4613_iface + i, 343 is_play, 344 fmt, width)) 345 continue; 346 iface = ak4613_iface + i; 347 break; 348 } 349 } 350 351 if ((priv->iface == NULL) || 352 (priv->iface == iface)) { 353 priv->iface = iface; 354 priv->cnt++; 355 ret = 0; 356 } 357 mutex_unlock(&priv->lock); 358 359 if (ret < 0) 360 goto hw_params_end; 361 362 fmt_ctrl = AUDIO_IFACE_TO_VAL(iface); 363 364 snd_soc_update_bits(codec, CTRL1, FMT_MASK, fmt_ctrl); 365 snd_soc_update_bits(codec, CTRL2, DFS_MASK, ctrl2); 366 367 snd_soc_write(codec, ICTRL, priv->ic); 368 snd_soc_write(codec, OCTRL, priv->oc); 369 370 hw_params_end: 371 if (ret < 0) 372 dev_warn(dev, "unsupported data width/format combination\n"); 373 374 return ret; 375 } 376 377 static int ak4613_set_bias_level(struct snd_soc_codec *codec, 378 enum snd_soc_bias_level level) 379 { 380 u8 mgmt1 = 0; 381 382 switch (level) { 383 case SND_SOC_BIAS_ON: 384 mgmt1 |= RSTN; 385 /* fall through */ 386 case SND_SOC_BIAS_PREPARE: 387 mgmt1 |= PMADC | PMDAC; 388 /* fall through */ 389 case SND_SOC_BIAS_STANDBY: 390 mgmt1 |= PMVR; 391 /* fall through */ 392 case SND_SOC_BIAS_OFF: 393 default: 394 break; 395 } 396 397 snd_soc_write(codec, PW_MGMT1, mgmt1); 398 399 return 0; 400 } 401 402 static const struct snd_soc_dai_ops ak4613_dai_ops = { 403 .shutdown = ak4613_dai_shutdown, 404 .set_fmt = ak4613_dai_set_fmt, 405 .hw_params = ak4613_dai_hw_params, 406 }; 407 408 #define AK4613_PCM_RATE (SNDRV_PCM_RATE_32000 |\ 409 SNDRV_PCM_RATE_44100 |\ 410 SNDRV_PCM_RATE_48000 |\ 411 SNDRV_PCM_RATE_64000 |\ 412 SNDRV_PCM_RATE_88200 |\ 413 SNDRV_PCM_RATE_96000 |\ 414 SNDRV_PCM_RATE_176400 |\ 415 SNDRV_PCM_RATE_192000) 416 #define AK4613_PCM_FMTBIT (SNDRV_PCM_FMTBIT_S16_LE |\ 417 SNDRV_PCM_FMTBIT_S24_LE) 418 419 static struct snd_soc_dai_driver ak4613_dai = { 420 .name = "ak4613-hifi", 421 .playback = { 422 .stream_name = "Playback", 423 .channels_min = 2, 424 .channels_max = 2, 425 .rates = AK4613_PCM_RATE, 426 .formats = AK4613_PCM_FMTBIT, 427 }, 428 .capture = { 429 .stream_name = "Capture", 430 .channels_min = 2, 431 .channels_max = 2, 432 .rates = AK4613_PCM_RATE, 433 .formats = AK4613_PCM_FMTBIT, 434 }, 435 .ops = &ak4613_dai_ops, 436 .symmetric_rates = 1, 437 }; 438 439 static int ak4613_resume(struct snd_soc_codec *codec) 440 { 441 struct regmap *regmap = dev_get_regmap(codec->dev, NULL); 442 443 regcache_mark_dirty(regmap); 444 return regcache_sync(regmap); 445 } 446 447 static struct snd_soc_codec_driver soc_codec_dev_ak4613 = { 448 .resume = ak4613_resume, 449 .set_bias_level = ak4613_set_bias_level, 450 .controls = ak4613_snd_controls, 451 .num_controls = ARRAY_SIZE(ak4613_snd_controls), 452 .dapm_widgets = ak4613_dapm_widgets, 453 .num_dapm_widgets = ARRAY_SIZE(ak4613_dapm_widgets), 454 .dapm_routes = ak4613_intercon, 455 .num_dapm_routes = ARRAY_SIZE(ak4613_intercon), 456 }; 457 458 static void ak4613_parse_of(struct ak4613_priv *priv, 459 struct device *dev) 460 { 461 struct device_node *np = dev->of_node; 462 char prop[32]; 463 int i; 464 465 /* Input 1 - 2 */ 466 for (i = 0; i < 2; i++) { 467 snprintf(prop, sizeof(prop), "asahi-kasei,in%d-single-end", i + 1); 468 if (!of_get_property(np, prop, NULL)) 469 priv->ic |= 1 << i; 470 } 471 472 /* Output 1 - 6 */ 473 for (i = 0; i < 6; i++) { 474 snprintf(prop, sizeof(prop), "asahi-kasei,out%d-single-end", i + 1); 475 if (!of_get_property(np, prop, NULL)) 476 priv->oc |= 1 << i; 477 } 478 } 479 480 static int ak4613_i2c_probe(struct i2c_client *i2c, 481 const struct i2c_device_id *id) 482 { 483 struct device *dev = &i2c->dev; 484 struct device_node *np = dev->of_node; 485 const struct regmap_config *regmap_cfg; 486 struct regmap *regmap; 487 struct ak4613_priv *priv; 488 489 regmap_cfg = NULL; 490 if (np) { 491 const struct of_device_id *of_id; 492 493 of_id = of_match_device(ak4613_of_match, dev); 494 if (of_id) 495 regmap_cfg = of_id->data; 496 } else { 497 regmap_cfg = (const struct regmap_config *)id->driver_data; 498 } 499 500 if (!regmap_cfg) 501 return -EINVAL; 502 503 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 504 if (!priv) 505 return -ENOMEM; 506 507 ak4613_parse_of(priv, dev); 508 509 priv->iface = NULL; 510 priv->cnt = 0; 511 512 mutex_init(&priv->lock); 513 514 i2c_set_clientdata(i2c, priv); 515 516 regmap = devm_regmap_init_i2c(i2c, regmap_cfg); 517 if (IS_ERR(regmap)) 518 return PTR_ERR(regmap); 519 520 return snd_soc_register_codec(dev, &soc_codec_dev_ak4613, 521 &ak4613_dai, 1); 522 } 523 524 static int ak4613_i2c_remove(struct i2c_client *client) 525 { 526 snd_soc_unregister_codec(&client->dev); 527 return 0; 528 } 529 530 static struct i2c_driver ak4613_i2c_driver = { 531 .driver = { 532 .name = "ak4613-codec", 533 .owner = THIS_MODULE, 534 .of_match_table = ak4613_of_match, 535 }, 536 .probe = ak4613_i2c_probe, 537 .remove = ak4613_i2c_remove, 538 .id_table = ak4613_i2c_id, 539 }; 540 541 module_i2c_driver(ak4613_i2c_driver); 542 543 MODULE_DESCRIPTION("Soc AK4613 driver"); 544 MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>"); 545 MODULE_LICENSE("GPL v2"); 546