Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: rt700: add rt700 codec driver

This is the initial codec driver for rt700.

Signed-off-by: Shuming Fan <shumingf@realtek.com>
Tested-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20200110014552.17252-1-shumingf@realtek.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Shuming Fan and committed by
Mark Brown
7d2a5f9a 613fb500

+2310
+10
sound/soc/codecs/Kconfig
··· 165 165 select SND_SOC_RT5670 if I2C 166 166 select SND_SOC_RT5677 if I2C && SPI_MASTER 167 167 select SND_SOC_RT5682 if I2C 168 + select SND_SOC_RT700_SDW if SOUNDWIRE 168 169 select SND_SOC_RT711_SDW if SOUNDWIRE 169 170 select SND_SOC_SGTL5000 if I2C 170 171 select SND_SOC_SI476X if MFD_SI476X_CORE ··· 1060 1059 1061 1060 config SND_SOC_RT5682 1062 1061 tristate 1062 + 1063 + config SND_SOC_RT700 1064 + tristate 1065 + 1066 + config SND_SOC_RT700_SDW 1067 + tristate "Realtek RT700 Codec - SDW" 1068 + depends on SOUNDWIRE 1069 + select SND_SOC_RT700 1070 + select REGMAP_SOUNDWIRE 1063 1071 1064 1072 config SND_SOC_RT711 1065 1073 tristate
+2
sound/soc/codecs/Makefile
··· 173 173 snd-soc-rt5677-objs := rt5677.o 174 174 snd-soc-rt5677-spi-objs := rt5677-spi.o 175 175 snd-soc-rt5682-objs := rt5682.o 176 + snd-soc-rt700-objs := rt700.o rt700-sdw.o 176 177 snd-soc-rt711-objs := rt711.o rt711-sdw.o 177 178 snd-soc-sgtl5000-objs := sgtl5000.o 178 179 snd-soc-alc5623-objs := alc5623.o ··· 467 466 obj-$(CONFIG_SND_SOC_RT5677) += snd-soc-rt5677.o 468 467 obj-$(CONFIG_SND_SOC_RT5677_SPI) += snd-soc-rt5677-spi.o 469 468 obj-$(CONFIG_SND_SOC_RT5682) += snd-soc-rt5682.o 469 + obj-$(CONFIG_SND_SOC_RT700) += snd-soc-rt700.o 470 470 obj-$(CONFIG_SND_SOC_RT711) += snd-soc-rt711.o 471 471 obj-$(CONFIG_SND_SOC_SGTL5000) += snd-soc-sgtl5000.o 472 472 obj-$(CONFIG_SND_SOC_SIGMADSP) += snd-soc-sigmadsp.o
+551
sound/soc/codecs/rt700-sdw.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + // 3 + // rt700-sdw.c -- rt700 ALSA SoC audio driver 4 + // 5 + // Copyright(c) 2019 Realtek Semiconductor Corp. 6 + // 7 + // 8 + 9 + #include <linux/delay.h> 10 + #include <linux/device.h> 11 + #include <linux/mod_devicetable.h> 12 + #include <linux/soundwire/sdw.h> 13 + #include <linux/soundwire/sdw_type.h> 14 + #include <linux/module.h> 15 + #include <linux/regmap.h> 16 + #include <sound/soc.h> 17 + #include "rt700.h" 18 + #include "rt700-sdw.h" 19 + 20 + static bool rt700_readable_register(struct device *dev, unsigned int reg) 21 + { 22 + switch (reg) { 23 + case 0x00e0: 24 + case 0x00f0: 25 + case 0x2000 ... 0x200e: 26 + case 0x2012 ... 0x2016: 27 + case 0x201a ... 0x2027: 28 + case 0x2029 ... 0x202a: 29 + case 0x202d ... 0x2034: 30 + case 0x2200 ... 0x2204: 31 + case 0x2206 ... 0x2212: 32 + case 0x2220 ... 0x2223: 33 + case 0x2230 ... 0x2231: 34 + case 0x3000 ... 0x3fff: 35 + case 0x7000 ... 0x7fff: 36 + case 0x8300 ... 0x83ff: 37 + case 0x9c00 ... 0x9cff: 38 + case 0xb900 ... 0xb9ff: 39 + case 0x75201a: 40 + case 0x752045: 41 + case 0x752046: 42 + case 0x752048: 43 + case 0x75204a: 44 + case 0x75206b: 45 + case 0x752080: 46 + case 0x752081: 47 + return true; 48 + default: 49 + return false; 50 + } 51 + } 52 + 53 + static bool rt700_volatile_register(struct device *dev, unsigned int reg) 54 + { 55 + switch (reg) { 56 + case 0x2009: 57 + case 0x2016: 58 + case 0x201b: 59 + case 0x201c: 60 + case 0x201d: 61 + case 0x201f: 62 + case 0x2021: 63 + case 0x2023: 64 + case 0x2230: 65 + case 0x200b ... 0x200e: /* i2c read */ 66 + case 0x2012 ... 0x2015: /* HD-A read */ 67 + case 0x202d ... 0x202f: /* BRA */ 68 + case 0x2201 ... 0x2212: /* i2c debug */ 69 + case 0x2220 ... 0x2223: /* decoded HD-A */ 70 + case 0x9c00 ... 0x9cff: 71 + case 0xb900 ... 0xb9ff: 72 + case 0xff01: 73 + case 0x75201a: 74 + case 0x752046: 75 + case 0x752080: 76 + case 0x752081: 77 + return true; 78 + default: 79 + return false; 80 + } 81 + } 82 + 83 + static int rt700_sdw_read(void *context, unsigned int reg, unsigned int *val) 84 + { 85 + struct device *dev = context; 86 + struct rt700_priv *rt700 = dev_get_drvdata(dev); 87 + unsigned int sdw_data_3, sdw_data_2, sdw_data_1, sdw_data_0; 88 + unsigned int reg2 = 0, reg3 = 0, reg4 = 0, mask, nid, val2; 89 + unsigned int is_hda_reg = 1, is_index_reg = 0; 90 + int ret; 91 + 92 + if (reg > 0xffff) 93 + is_index_reg = 1; 94 + 95 + mask = reg & 0xf000; 96 + 97 + if (is_index_reg) { /* index registers */ 98 + val2 = reg & 0xff; 99 + reg = reg >> 8; 100 + nid = reg & 0xff; 101 + ret = regmap_write(rt700->sdw_regmap, reg, 0); 102 + if (ret < 0) 103 + return ret; 104 + reg2 = reg + 0x1000; 105 + reg2 |= 0x80; 106 + ret = regmap_write(rt700->sdw_regmap, reg2, val2); 107 + if (ret < 0) 108 + return ret; 109 + 110 + reg3 = RT700_PRIV_DATA_R_H | nid; 111 + ret = regmap_write(rt700->sdw_regmap, 112 + reg3, ((*val >> 8) & 0xff)); 113 + if (ret < 0) 114 + return ret; 115 + reg4 = reg3 + 0x1000; 116 + reg4 |= 0x80; 117 + ret = regmap_write(rt700->sdw_regmap, reg4, (*val & 0xff)); 118 + if (ret < 0) 119 + return ret; 120 + } else if (mask == 0x3000) { 121 + reg += 0x8000; 122 + ret = regmap_write(rt700->sdw_regmap, reg, *val); 123 + if (ret < 0) 124 + return ret; 125 + } else if (mask == 0x7000) { 126 + reg += 0x2000; 127 + reg |= 0x800; 128 + ret = regmap_write(rt700->sdw_regmap, 129 + reg, ((*val >> 8) & 0xff)); 130 + if (ret < 0) 131 + return ret; 132 + reg2 = reg + 0x1000; 133 + reg2 |= 0x80; 134 + ret = regmap_write(rt700->sdw_regmap, reg2, (*val & 0xff)); 135 + if (ret < 0) 136 + return ret; 137 + } else if ((reg & 0xff00) == 0x8300) { /* for R channel */ 138 + reg2 = reg - 0x1000; 139 + reg2 &= ~0x80; 140 + ret = regmap_write(rt700->sdw_regmap, 141 + reg2, ((*val >> 8) & 0xff)); 142 + if (ret < 0) 143 + return ret; 144 + ret = regmap_write(rt700->sdw_regmap, reg, (*val & 0xff)); 145 + if (ret < 0) 146 + return ret; 147 + } else if (mask == 0x9000) { 148 + ret = regmap_write(rt700->sdw_regmap, 149 + reg, ((*val >> 8) & 0xff)); 150 + if (ret < 0) 151 + return ret; 152 + reg2 = reg + 0x1000; 153 + reg2 |= 0x80; 154 + ret = regmap_write(rt700->sdw_regmap, reg2, (*val & 0xff)); 155 + if (ret < 0) 156 + return ret; 157 + } else if (mask == 0xb000) { 158 + ret = regmap_write(rt700->sdw_regmap, reg, *val); 159 + if (ret < 0) 160 + return ret; 161 + } else { 162 + ret = regmap_read(rt700->sdw_regmap, reg, val); 163 + if (ret < 0) 164 + return ret; 165 + is_hda_reg = 0; 166 + } 167 + 168 + if (is_hda_reg || is_index_reg) { 169 + sdw_data_3 = 0; 170 + sdw_data_2 = 0; 171 + sdw_data_1 = 0; 172 + sdw_data_0 = 0; 173 + ret = regmap_read(rt700->sdw_regmap, 174 + RT700_READ_HDA_3, &sdw_data_3); 175 + if (ret < 0) 176 + return ret; 177 + ret = regmap_read(rt700->sdw_regmap, 178 + RT700_READ_HDA_2, &sdw_data_2); 179 + if (ret < 0) 180 + return ret; 181 + ret = regmap_read(rt700->sdw_regmap, 182 + RT700_READ_HDA_1, &sdw_data_1); 183 + if (ret < 0) 184 + return ret; 185 + ret = regmap_read(rt700->sdw_regmap, 186 + RT700_READ_HDA_0, &sdw_data_0); 187 + if (ret < 0) 188 + return ret; 189 + *val = ((sdw_data_3 & 0xff) << 24) | 190 + ((sdw_data_2 & 0xff) << 16) | 191 + ((sdw_data_1 & 0xff) << 8) | (sdw_data_0 & 0xff); 192 + } 193 + 194 + if (is_hda_reg == 0) 195 + dev_dbg(dev, "[%s] %04x => %08x\n", __func__, reg, *val); 196 + else if (is_index_reg) 197 + dev_dbg(dev, "[%s] %04x %04x %04x %04x => %08x\n", 198 + __func__, reg, reg2, reg3, reg4, *val); 199 + else 200 + dev_dbg(dev, "[%s] %04x %04x => %08x\n", 201 + __func__, reg, reg2, *val); 202 + 203 + return 0; 204 + } 205 + 206 + static int rt700_sdw_write(void *context, unsigned int reg, unsigned int val) 207 + { 208 + struct device *dev = context; 209 + struct rt700_priv *rt700 = dev_get_drvdata(dev); 210 + unsigned int reg2 = 0, reg3, reg4, nid, mask, val2; 211 + unsigned int is_index_reg = 0; 212 + int ret; 213 + 214 + if (reg > 0xffff) 215 + is_index_reg = 1; 216 + 217 + mask = reg & 0xf000; 218 + 219 + if (is_index_reg) { /* index registers */ 220 + val2 = reg & 0xff; 221 + reg = reg >> 8; 222 + nid = reg & 0xff; 223 + ret = regmap_write(rt700->sdw_regmap, reg, 0); 224 + if (ret < 0) 225 + return ret; 226 + reg2 = reg + 0x1000; 227 + reg2 |= 0x80; 228 + ret = regmap_write(rt700->sdw_regmap, reg2, val2); 229 + if (ret < 0) 230 + return ret; 231 + 232 + reg3 = RT700_PRIV_DATA_W_H | nid; 233 + ret = regmap_write(rt700->sdw_regmap, 234 + reg3, ((val >> 8) & 0xff)); 235 + if (ret < 0) 236 + return ret; 237 + reg4 = reg3 + 0x1000; 238 + reg4 |= 0x80; 239 + ret = regmap_write(rt700->sdw_regmap, reg4, (val & 0xff)); 240 + if (ret < 0) 241 + return ret; 242 + is_index_reg = 1; 243 + } else if (reg < 0x4fff) { 244 + ret = regmap_write(rt700->sdw_regmap, reg, val); 245 + if (ret < 0) 246 + return ret; 247 + } else if (reg == 0xff01) { 248 + ret = regmap_write(rt700->sdw_regmap, reg, val); 249 + if (ret < 0) 250 + return ret; 251 + } else if (mask == 0x7000) { 252 + ret = regmap_write(rt700->sdw_regmap, 253 + reg, ((val >> 8) & 0xff)); 254 + if (ret < 0) 255 + return ret; 256 + reg2 = reg + 0x1000; 257 + reg2 |= 0x80; 258 + ret = regmap_write(rt700->sdw_regmap, reg2, (val & 0xff)); 259 + if (ret < 0) 260 + return ret; 261 + } else if ((reg & 0xff00) == 0x8300) { /* for R channel */ 262 + reg2 = reg - 0x1000; 263 + reg2 &= ~0x80; 264 + ret = regmap_write(rt700->sdw_regmap, 265 + reg2, ((val >> 8) & 0xff)); 266 + if (ret < 0) 267 + return ret; 268 + ret = regmap_write(rt700->sdw_regmap, reg, (val & 0xff)); 269 + if (ret < 0) 270 + return ret; 271 + } 272 + 273 + if (reg2 == 0) 274 + dev_dbg(dev, "[%s] %04x <= %04x\n", __func__, reg, val); 275 + else if (is_index_reg) 276 + dev_dbg(dev, "[%s] %04x %04x %04x %04x <= %04x %04x\n", 277 + __func__, reg, reg2, reg3, reg4, val2, val); 278 + else 279 + dev_dbg(dev, "[%s] %04x %04x <= %04x\n", 280 + __func__, reg, reg2, val); 281 + 282 + return 0; 283 + } 284 + 285 + static const struct regmap_config rt700_regmap = { 286 + .reg_bits = 24, 287 + .val_bits = 32, 288 + .readable_reg = rt700_readable_register, 289 + .volatile_reg = rt700_volatile_register, 290 + .max_register = 0x755800, 291 + .reg_defaults = rt700_reg_defaults, 292 + .num_reg_defaults = ARRAY_SIZE(rt700_reg_defaults), 293 + .cache_type = REGCACHE_RBTREE, 294 + .use_single_read = true, 295 + .use_single_write = true, 296 + .reg_read = rt700_sdw_read, 297 + .reg_write = rt700_sdw_write, 298 + }; 299 + 300 + static const struct regmap_config rt700_sdw_regmap = { 301 + .name = "sdw", 302 + .reg_bits = 32, 303 + .val_bits = 8, 304 + .readable_reg = rt700_readable_register, 305 + .max_register = 0xff01, 306 + .cache_type = REGCACHE_NONE, 307 + .use_single_read = true, 308 + .use_single_write = true, 309 + }; 310 + 311 + static int rt700_update_status(struct sdw_slave *slave, 312 + enum sdw_slave_status status) 313 + { 314 + struct rt700_priv *rt700 = dev_get_drvdata(&slave->dev); 315 + 316 + /* Update the status */ 317 + rt700->status = status; 318 + 319 + if (status == SDW_SLAVE_UNATTACHED) 320 + rt700->hw_init = false; 321 + 322 + /* 323 + * Perform initialization only if slave status is present and 324 + * hw_init flag is false 325 + */ 326 + if (rt700->hw_init || rt700->status != SDW_SLAVE_ATTACHED) 327 + return 0; 328 + 329 + /* perform I/O transfers required for Slave initialization */ 330 + return rt700_io_init(&slave->dev, slave); 331 + } 332 + 333 + static int rt700_read_prop(struct sdw_slave *slave) 334 + { 335 + struct sdw_slave_prop *prop = &slave->prop; 336 + int nval, i, num_of_ports = 1; 337 + u32 bit; 338 + unsigned long addr; 339 + struct sdw_dpn_prop *dpn; 340 + 341 + prop->paging_support = false; 342 + 343 + /* first we need to allocate memory for set bits in port lists */ 344 + prop->source_ports = 0x14; /* BITMAP: 00010100 */ 345 + prop->sink_ports = 0xA; /* BITMAP: 00001010 */ 346 + 347 + nval = hweight32(prop->source_ports); 348 + num_of_ports += nval; 349 + prop->src_dpn_prop = devm_kcalloc(&slave->dev, nval, 350 + sizeof(*prop->src_dpn_prop), 351 + GFP_KERNEL); 352 + if (!prop->src_dpn_prop) 353 + return -ENOMEM; 354 + 355 + i = 0; 356 + dpn = prop->src_dpn_prop; 357 + addr = prop->source_ports; 358 + for_each_set_bit(bit, &addr, 32) { 359 + dpn[i].num = bit; 360 + dpn[i].type = SDW_DPN_FULL; 361 + dpn[i].simple_ch_prep_sm = true; 362 + dpn[i].ch_prep_timeout = 10; 363 + i++; 364 + } 365 + 366 + /* do this again for sink now */ 367 + nval = hweight32(prop->sink_ports); 368 + num_of_ports += nval; 369 + prop->sink_dpn_prop = devm_kcalloc(&slave->dev, nval, 370 + sizeof(*prop->sink_dpn_prop), 371 + GFP_KERNEL); 372 + if (!prop->sink_dpn_prop) 373 + return -ENOMEM; 374 + 375 + i = 0; 376 + dpn = prop->sink_dpn_prop; 377 + addr = prop->sink_ports; 378 + for_each_set_bit(bit, &addr, 32) { 379 + dpn[i].num = bit; 380 + dpn[i].type = SDW_DPN_FULL; 381 + dpn[i].simple_ch_prep_sm = true; 382 + dpn[i].ch_prep_timeout = 10; 383 + i++; 384 + } 385 + 386 + /* Allocate port_ready based on num_of_ports */ 387 + slave->port_ready = devm_kcalloc(&slave->dev, num_of_ports, 388 + sizeof(*slave->port_ready), 389 + GFP_KERNEL); 390 + if (!slave->port_ready) 391 + return -ENOMEM; 392 + 393 + /* Initialize completion */ 394 + for (i = 0; i < num_of_ports; i++) 395 + init_completion(&slave->port_ready[i]); 396 + 397 + /* set the timeout values */ 398 + prop->clk_stop_timeout = 20; 399 + 400 + /* wake-up event */ 401 + prop->wake_capable = 1; 402 + 403 + return 0; 404 + } 405 + 406 + static int rt700_bus_config(struct sdw_slave *slave, 407 + struct sdw_bus_params *params) 408 + { 409 + struct rt700_priv *rt700 = dev_get_drvdata(&slave->dev); 410 + int ret; 411 + 412 + memcpy(&rt700->params, params, sizeof(*params)); 413 + 414 + ret = rt700_clock_config(&slave->dev); 415 + if (ret < 0) 416 + dev_err(&slave->dev, "Invalid clk config"); 417 + 418 + return ret; 419 + } 420 + 421 + static int rt700_interrupt_callback(struct sdw_slave *slave, 422 + struct sdw_slave_intr_status *status) 423 + { 424 + struct rt700_priv *rt700 = dev_get_drvdata(&slave->dev); 425 + 426 + dev_dbg(&slave->dev, 427 + "%s control_port_stat=%x", __func__, status->control_port); 428 + 429 + if (status->control_port & 0x4) { 430 + mod_delayed_work(system_power_efficient_wq, 431 + &rt700->jack_detect_work, msecs_to_jiffies(250)); 432 + } 433 + 434 + return 0; 435 + } 436 + 437 + /* 438 + * slave_ops: callbacks for get_clock_stop_mode, clock_stop and 439 + * port_prep are not defined for now 440 + */ 441 + static struct sdw_slave_ops rt700_slave_ops = { 442 + .read_prop = rt700_read_prop, 443 + .interrupt_callback = rt700_interrupt_callback, 444 + .update_status = rt700_update_status, 445 + .bus_config = rt700_bus_config, 446 + }; 447 + 448 + static int rt700_sdw_probe(struct sdw_slave *slave, 449 + const struct sdw_device_id *id) 450 + { 451 + struct regmap *sdw_regmap, *regmap; 452 + 453 + /* Assign ops */ 454 + slave->ops = &rt700_slave_ops; 455 + 456 + /* Regmap Initialization */ 457 + sdw_regmap = devm_regmap_init_sdw(slave, &rt700_sdw_regmap); 458 + if (!sdw_regmap) 459 + return -EINVAL; 460 + 461 + regmap = devm_regmap_init(&slave->dev, NULL, 462 + &slave->dev, &rt700_regmap); 463 + if (!regmap) 464 + return -EINVAL; 465 + 466 + rt700_init(&slave->dev, sdw_regmap, regmap, slave); 467 + 468 + return 0; 469 + } 470 + 471 + static int rt700_sdw_remove(struct sdw_slave *slave) 472 + { 473 + struct rt700_priv *rt700 = dev_get_drvdata(&slave->dev); 474 + 475 + if (rt700 && rt700->hw_init) { 476 + cancel_delayed_work(&rt700->jack_detect_work); 477 + cancel_delayed_work(&rt700->jack_btn_check_work); 478 + } 479 + 480 + return 0; 481 + } 482 + 483 + static const struct sdw_device_id rt700_id[] = { 484 + SDW_SLAVE_ENTRY(0x025d, 0x700, 0), 485 + {}, 486 + }; 487 + MODULE_DEVICE_TABLE(sdw, rt700_id); 488 + 489 + static int rt700_dev_suspend(struct device *dev) 490 + { 491 + struct rt700_priv *rt700 = dev_get_drvdata(dev); 492 + 493 + if (!rt700->hw_init) 494 + return 0; 495 + 496 + regcache_cache_only(rt700->regmap, true); 497 + 498 + return 0; 499 + } 500 + 501 + #define RT700_PROBE_TIMEOUT 2000 502 + 503 + static int rt700_dev_resume(struct device *dev) 504 + { 505 + struct sdw_slave *slave = dev_to_sdw_dev(dev); 506 + struct rt700_priv *rt700 = dev_get_drvdata(dev); 507 + unsigned long time; 508 + 509 + if (!rt700->hw_init) 510 + return 0; 511 + 512 + if (!slave->unattach_request) 513 + goto regmap_sync; 514 + 515 + time = wait_for_completion_timeout(&slave->initialization_complete, 516 + msecs_to_jiffies(RT700_PROBE_TIMEOUT)); 517 + if (!time) { 518 + dev_err(&slave->dev, "Initialization not complete, timed out\n"); 519 + return -ETIMEDOUT; 520 + } 521 + 522 + regmap_sync: 523 + slave->unattach_request = 0; 524 + regcache_cache_only(rt700->regmap, false); 525 + regcache_sync_region(rt700->regmap, 0x3000, 0x8fff); 526 + regcache_sync_region(rt700->regmap, 0x752010, 0x75206b); 527 + 528 + return 0; 529 + } 530 + 531 + static const struct dev_pm_ops rt700_pm = { 532 + SET_SYSTEM_SLEEP_PM_OPS(rt700_dev_suspend, rt700_dev_resume) 533 + SET_RUNTIME_PM_OPS(rt700_dev_suspend, rt700_dev_resume, NULL) 534 + }; 535 + 536 + static struct sdw_driver rt700_sdw_driver = { 537 + .driver = { 538 + .name = "rt700", 539 + .owner = THIS_MODULE, 540 + .pm = &rt700_pm, 541 + }, 542 + .probe = rt700_sdw_probe, 543 + .remove = rt700_sdw_remove, 544 + .ops = &rt700_slave_ops, 545 + .id_table = rt700_id, 546 + }; 547 + module_sdw_driver(rt700_sdw_driver); 548 + 549 + MODULE_DESCRIPTION("ASoC RT700 driver SDW"); 550 + MODULE_AUTHOR("Shuming Fan <shumingf@realtek.com>"); 551 + MODULE_LICENSE("GPL v2");
+335
sound/soc/codecs/rt700-sdw.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * rt700-sdw.h -- RT700 ALSA SoC audio driver header 4 + * 5 + * Copyright(c) 2019 Realtek Semiconductor Corp. 6 + */ 7 + 8 + #ifndef __RT700_SDW_H__ 9 + #define __RT700_SDW_H__ 10 + 11 + static const struct reg_default rt700_reg_defaults[] = { 12 + { 0x0000, 0x0000 }, 13 + { 0x0001, 0x0000 }, 14 + { 0x0002, 0x0000 }, 15 + { 0x0003, 0x0000 }, 16 + { 0x0004, 0x0000 }, 17 + { 0x0005, 0x0001 }, 18 + { 0x0020, 0x0000 }, 19 + { 0x0022, 0x0000 }, 20 + { 0x0023, 0x0000 }, 21 + { 0x0024, 0x0000 }, 22 + { 0x0025, 0x0000 }, 23 + { 0x0026, 0x0000 }, 24 + { 0x0030, 0x0000 }, 25 + { 0x0032, 0x0000 }, 26 + { 0x0033, 0x0000 }, 27 + { 0x0034, 0x0000 }, 28 + { 0x0035, 0x0000 }, 29 + { 0x0036, 0x0000 }, 30 + { 0x0040, 0x0000 }, 31 + { 0x0041, 0x0000 }, 32 + { 0x0042, 0x0000 }, 33 + { 0x0043, 0x0000 }, 34 + { 0x0044, 0x0020 }, 35 + { 0x0045, 0x0001 }, 36 + { 0x0046, 0x0000 }, 37 + { 0x0050, 0x0000 }, 38 + { 0x0051, 0x0000 }, 39 + { 0x0052, 0x0000 }, 40 + { 0x0053, 0x0000 }, 41 + { 0x0054, 0x0000 }, 42 + { 0x0055, 0x0000 }, 43 + { 0x0060, 0x0000 }, 44 + { 0x0070, 0x0000 }, 45 + { 0x00e0, 0x0000 }, 46 + { 0x00f0, 0x0000 }, 47 + { 0x0100, 0x0000 }, 48 + { 0x0101, 0x0000 }, 49 + { 0x0102, 0x0000 }, 50 + { 0x0103, 0x0000 }, 51 + { 0x0104, 0x0000 }, 52 + { 0x0105, 0x0000 }, 53 + { 0x0120, 0x0000 }, 54 + { 0x0121, 0x0000 }, 55 + { 0x0122, 0x0000 }, 56 + { 0x0123, 0x0000 }, 57 + { 0x0124, 0x0000 }, 58 + { 0x0125, 0x0000 }, 59 + { 0x0126, 0x0000 }, 60 + { 0x0127, 0x0000 }, 61 + { 0x0130, 0x0000 }, 62 + { 0x0131, 0x0000 }, 63 + { 0x0132, 0x0000 }, 64 + { 0x0133, 0x0000 }, 65 + { 0x0134, 0x0000 }, 66 + { 0x0135, 0x0000 }, 67 + { 0x0136, 0x0000 }, 68 + { 0x0137, 0x0000 }, 69 + { 0x0200, 0x0000 }, 70 + { 0x0201, 0x0000 }, 71 + { 0x0202, 0x0000 }, 72 + { 0x0203, 0x0000 }, 73 + { 0x0204, 0x0000 }, 74 + { 0x0205, 0x0000 }, 75 + { 0x0220, 0x0000 }, 76 + { 0x0221, 0x0000 }, 77 + { 0x0222, 0x0000 }, 78 + { 0x0223, 0x0000 }, 79 + { 0x0224, 0x0000 }, 80 + { 0x0225, 0x0000 }, 81 + { 0x0226, 0x0000 }, 82 + { 0x0227, 0x0000 }, 83 + { 0x0230, 0x0000 }, 84 + { 0x0231, 0x0000 }, 85 + { 0x0232, 0x0000 }, 86 + { 0x0233, 0x0000 }, 87 + { 0x0234, 0x0000 }, 88 + { 0x0235, 0x0000 }, 89 + { 0x0236, 0x0000 }, 90 + { 0x0237, 0x0000 }, 91 + { 0x0300, 0x0000 }, 92 + { 0x0301, 0x0000 }, 93 + { 0x0302, 0x0000 }, 94 + { 0x0303, 0x0000 }, 95 + { 0x0304, 0x0000 }, 96 + { 0x0305, 0x0000 }, 97 + { 0x0320, 0x0000 }, 98 + { 0x0321, 0x0000 }, 99 + { 0x0322, 0x0000 }, 100 + { 0x0323, 0x0000 }, 101 + { 0x0324, 0x0000 }, 102 + { 0x0325, 0x0000 }, 103 + { 0x0326, 0x0000 }, 104 + { 0x0327, 0x0000 }, 105 + { 0x0330, 0x0000 }, 106 + { 0x0331, 0x0000 }, 107 + { 0x0332, 0x0000 }, 108 + { 0x0333, 0x0000 }, 109 + { 0x0334, 0x0000 }, 110 + { 0x0335, 0x0000 }, 111 + { 0x0336, 0x0000 }, 112 + { 0x0337, 0x0000 }, 113 + { 0x0400, 0x0000 }, 114 + { 0x0401, 0x0000 }, 115 + { 0x0402, 0x0000 }, 116 + { 0x0403, 0x0000 }, 117 + { 0x0404, 0x0000 }, 118 + { 0x0405, 0x0000 }, 119 + { 0x0420, 0x0000 }, 120 + { 0x0421, 0x0000 }, 121 + { 0x0422, 0x0000 }, 122 + { 0x0423, 0x0000 }, 123 + { 0x0424, 0x0000 }, 124 + { 0x0425, 0x0000 }, 125 + { 0x0426, 0x0000 }, 126 + { 0x0427, 0x0000 }, 127 + { 0x0430, 0x0000 }, 128 + { 0x0431, 0x0000 }, 129 + { 0x0432, 0x0000 }, 130 + { 0x0433, 0x0000 }, 131 + { 0x0434, 0x0000 }, 132 + { 0x0435, 0x0000 }, 133 + { 0x0436, 0x0000 }, 134 + { 0x0437, 0x0000 }, 135 + { 0x0500, 0x0000 }, 136 + { 0x0501, 0x0000 }, 137 + { 0x0502, 0x0000 }, 138 + { 0x0503, 0x0000 }, 139 + { 0x0504, 0x0000 }, 140 + { 0x0505, 0x0000 }, 141 + { 0x0520, 0x0000 }, 142 + { 0x0521, 0x0000 }, 143 + { 0x0522, 0x0000 }, 144 + { 0x0523, 0x0000 }, 145 + { 0x0524, 0x0000 }, 146 + { 0x0525, 0x0000 }, 147 + { 0x0526, 0x0000 }, 148 + { 0x0527, 0x0000 }, 149 + { 0x0530, 0x0000 }, 150 + { 0x0531, 0x0000 }, 151 + { 0x0532, 0x0000 }, 152 + { 0x0533, 0x0000 }, 153 + { 0x0534, 0x0000 }, 154 + { 0x0535, 0x0000 }, 155 + { 0x0536, 0x0000 }, 156 + { 0x0537, 0x0000 }, 157 + { 0x0600, 0x0000 }, 158 + { 0x0601, 0x0000 }, 159 + { 0x0602, 0x0000 }, 160 + { 0x0603, 0x0000 }, 161 + { 0x0604, 0x0000 }, 162 + { 0x0605, 0x0000 }, 163 + { 0x0620, 0x0000 }, 164 + { 0x0621, 0x0000 }, 165 + { 0x0622, 0x0000 }, 166 + { 0x0623, 0x0000 }, 167 + { 0x0624, 0x0000 }, 168 + { 0x0625, 0x0000 }, 169 + { 0x0626, 0x0000 }, 170 + { 0x0627, 0x0000 }, 171 + { 0x0630, 0x0000 }, 172 + { 0x0631, 0x0000 }, 173 + { 0x0632, 0x0000 }, 174 + { 0x0633, 0x0000 }, 175 + { 0x0634, 0x0000 }, 176 + { 0x0635, 0x0000 }, 177 + { 0x0636, 0x0000 }, 178 + { 0x0637, 0x0000 }, 179 + { 0x0700, 0x0000 }, 180 + { 0x0701, 0x0000 }, 181 + { 0x0702, 0x0000 }, 182 + { 0x0703, 0x0000 }, 183 + { 0x0704, 0x0000 }, 184 + { 0x0705, 0x0000 }, 185 + { 0x0720, 0x0000 }, 186 + { 0x0721, 0x0000 }, 187 + { 0x0722, 0x0000 }, 188 + { 0x0723, 0x0000 }, 189 + { 0x0724, 0x0000 }, 190 + { 0x0725, 0x0000 }, 191 + { 0x0726, 0x0000 }, 192 + { 0x0727, 0x0000 }, 193 + { 0x0730, 0x0000 }, 194 + { 0x0731, 0x0000 }, 195 + { 0x0732, 0x0000 }, 196 + { 0x0733, 0x0000 }, 197 + { 0x0734, 0x0000 }, 198 + { 0x0735, 0x0000 }, 199 + { 0x0736, 0x0000 }, 200 + { 0x0737, 0x0000 }, 201 + { 0x0800, 0x0000 }, 202 + { 0x0801, 0x0000 }, 203 + { 0x0802, 0x0000 }, 204 + { 0x0803, 0x0000 }, 205 + { 0x0804, 0x0000 }, 206 + { 0x0805, 0x0000 }, 207 + { 0x0820, 0x0000 }, 208 + { 0x0821, 0x0000 }, 209 + { 0x0822, 0x0000 }, 210 + { 0x0823, 0x0000 }, 211 + { 0x0824, 0x0000 }, 212 + { 0x0825, 0x0000 }, 213 + { 0x0826, 0x0000 }, 214 + { 0x0827, 0x0000 }, 215 + { 0x0830, 0x0000 }, 216 + { 0x0831, 0x0000 }, 217 + { 0x0832, 0x0000 }, 218 + { 0x0833, 0x0000 }, 219 + { 0x0834, 0x0000 }, 220 + { 0x0835, 0x0000 }, 221 + { 0x0836, 0x0000 }, 222 + { 0x0837, 0x0000 }, 223 + { 0x0f00, 0x0000 }, 224 + { 0x0f01, 0x0000 }, 225 + { 0x0f02, 0x0000 }, 226 + { 0x0f03, 0x0000 }, 227 + { 0x0f04, 0x0000 }, 228 + { 0x0f05, 0x0000 }, 229 + { 0x0f20, 0x0000 }, 230 + { 0x0f21, 0x0000 }, 231 + { 0x0f22, 0x0000 }, 232 + { 0x0f23, 0x0000 }, 233 + { 0x0f24, 0x0000 }, 234 + { 0x0f25, 0x0000 }, 235 + { 0x0f26, 0x0000 }, 236 + { 0x0f27, 0x0000 }, 237 + { 0x0f30, 0x0000 }, 238 + { 0x0f31, 0x0000 }, 239 + { 0x0f32, 0x0000 }, 240 + { 0x0f33, 0x0000 }, 241 + { 0x0f34, 0x0000 }, 242 + { 0x0f35, 0x0000 }, 243 + { 0x0f36, 0x0000 }, 244 + { 0x0f37, 0x0000 }, 245 + { 0x2000, 0x0000 }, 246 + { 0x2001, 0x0000 }, 247 + { 0x2002, 0x0000 }, 248 + { 0x2003, 0x0000 }, 249 + { 0x2004, 0x0000 }, 250 + { 0x2005, 0x0000 }, 251 + { 0x2006, 0x0000 }, 252 + { 0x2007, 0x0000 }, 253 + { 0x2008, 0x0000 }, 254 + { 0x2009, 0x0003 }, 255 + { 0x200a, 0x0003 }, 256 + { 0x200b, 0x0000 }, 257 + { 0x200c, 0x0000 }, 258 + { 0x200d, 0x0000 }, 259 + { 0x200e, 0x0000 }, 260 + { 0x2012, 0x0000 }, 261 + { 0x2013, 0x0000 }, 262 + { 0x2014, 0x0000 }, 263 + { 0x2015, 0x0000 }, 264 + { 0x2016, 0x0000 }, 265 + { 0x201a, 0x0000 }, 266 + { 0x201b, 0x0000 }, 267 + { 0x201c, 0x0000 }, 268 + { 0x201d, 0x0000 }, 269 + { 0x201e, 0x0000 }, 270 + { 0x201f, 0x0000 }, 271 + { 0x2020, 0x0000 }, 272 + { 0x2021, 0x0000 }, 273 + { 0x2022, 0x0000 }, 274 + { 0x2023, 0x0000 }, 275 + { 0x2024, 0x0000 }, 276 + { 0x2025, 0x0002 }, 277 + { 0x2026, 0x0000 }, 278 + { 0x2027, 0x0000 }, 279 + { 0x2029, 0x0000 }, 280 + { 0x202a, 0x0000 }, 281 + { 0x202d, 0x0000 }, 282 + { 0x202e, 0x0000 }, 283 + { 0x202f, 0x0000 }, 284 + { 0x2030, 0x0000 }, 285 + { 0x2031, 0x0000 }, 286 + { 0x2032, 0x0000 }, 287 + { 0x2033, 0x0000 }, 288 + { 0x2034, 0x0000 }, 289 + { 0x2200, 0x0000 }, 290 + { 0x2201, 0x0000 }, 291 + { 0x2202, 0x0000 }, 292 + { 0x2203, 0x0000 }, 293 + { 0x2204, 0x0000 }, 294 + { 0x2206, 0x0000 }, 295 + { 0x2207, 0x0000 }, 296 + { 0x2208, 0x0000 }, 297 + { 0x2209, 0x0000 }, 298 + { 0x220a, 0x0000 }, 299 + { 0x220b, 0x0000 }, 300 + { 0x220c, 0x0000 }, 301 + { 0x220d, 0x0000 }, 302 + { 0x220e, 0x0000 }, 303 + { 0x220f, 0x0000 }, 304 + { 0x2211, 0x0000 }, 305 + { 0x2212, 0x0000 }, 306 + { 0x2220, 0x0000 }, 307 + { 0x2221, 0x0000 }, 308 + { 0x2222, 0x0000 }, 309 + { 0x2223, 0x0000 }, 310 + { 0x2230, 0x0000 }, 311 + { 0x2231, 0x0000 }, 312 + { 0x3121, 0x0001 }, 313 + { 0x3122, 0x0000 }, 314 + { 0x3123, 0x0000 }, 315 + { 0x7303, 0x0057 }, 316 + { 0x7303, 0x0057 }, 317 + { 0x8383, 0x0057 }, 318 + { 0x7308, 0x0097 }, 319 + { 0x8388, 0x0097 }, 320 + { 0x7309, 0x0097 }, 321 + { 0x8389, 0x0097 }, 322 + { 0x7312, 0x0000 }, 323 + { 0x8392, 0x0000 }, 324 + { 0x7313, 0x0000 }, 325 + { 0x8393, 0x0000 }, 326 + { 0x7319, 0x0000 }, 327 + { 0x8399, 0x0000 }, 328 + { 0x75201a, 0x8003 }, 329 + { 0x752045, 0x5289 }, 330 + { 0x752048, 0xd049 }, 331 + { 0x75204a, 0xa83b }, 332 + { 0x75206b, 0x5064 }, 333 + }; 334 + 335 + #endif /* __RT700_H__ */
+1238
sound/soc/codecs/rt700.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + // 3 + // rt700.c -- rt700 ALSA SoC audio driver 4 + // 5 + // Copyright(c) 2019 Realtek Semiconductor Corp. 6 + // 7 + // 8 + 9 + #include <linux/module.h> 10 + #include <linux/moduleparam.h> 11 + #include <linux/version.h> 12 + #include <linux/kernel.h> 13 + #include <linux/init.h> 14 + #include <linux/delay.h> 15 + #include <linux/pm_runtime.h> 16 + #include <linux/pm.h> 17 + #include <linux/soundwire/sdw.h> 18 + #include <linux/regmap.h> 19 + #include <linux/slab.h> 20 + #include <sound/core.h> 21 + #include <sound/pcm.h> 22 + #include <sound/pcm_params.h> 23 + #include <sound/soc.h> 24 + #include <sound/soc-dapm.h> 25 + #include <sound/initval.h> 26 + #include <sound/tlv.h> 27 + #include <sound/hda_verbs.h> 28 + #include <sound/jack.h> 29 + 30 + #include "rt700.h" 31 + 32 + static int rt700_index_write(struct regmap *regmap, 33 + unsigned int reg, unsigned int value) 34 + { 35 + int ret; 36 + unsigned int addr = (RT700_PRIV_INDEX_W_H << 8) | reg; 37 + 38 + ret = regmap_write(regmap, addr, value); 39 + if (ret < 0) 40 + pr_err("Failed to set private value: %06x <= %04x ret=%d\n", 41 + addr, value, ret); 42 + 43 + return ret; 44 + } 45 + 46 + static int rt700_index_read(struct regmap *regmap, 47 + unsigned int reg, unsigned int *value) 48 + { 49 + int ret; 50 + unsigned int addr = (RT700_PRIV_INDEX_W_H << 8) | reg; 51 + 52 + *value = 0; 53 + ret = regmap_read(regmap, addr, value); 54 + if (ret < 0) 55 + pr_err("Failed to get private value: %06x => %04x ret=%d\n", 56 + addr, *value, ret); 57 + 58 + return ret; 59 + } 60 + 61 + static unsigned int rt700_button_detect(struct rt700_priv *rt700) 62 + { 63 + unsigned int btn_type = 0, val80, val81; 64 + int ret; 65 + 66 + ret = rt700_index_read(rt700->regmap, RT700_IRQ_FLAG_TABLE1, &val80); 67 + if (ret < 0) 68 + goto read_error; 69 + ret = rt700_index_read(rt700->regmap, RT700_IRQ_FLAG_TABLE2, &val81); 70 + if (ret < 0) 71 + goto read_error; 72 + 73 + val80 &= 0x0381; 74 + val81 &= 0xff00; 75 + 76 + switch (val80) { 77 + case 0x0200: 78 + case 0x0100: 79 + case 0x0080: 80 + btn_type |= SND_JACK_BTN_0; 81 + break; 82 + case 0x0001: 83 + btn_type |= SND_JACK_BTN_3; 84 + break; 85 + } 86 + switch (val81) { 87 + case 0x8000: 88 + case 0x4000: 89 + case 0x2000: 90 + btn_type |= SND_JACK_BTN_1; 91 + break; 92 + case 0x1000: 93 + case 0x0800: 94 + case 0x0400: 95 + btn_type |= SND_JACK_BTN_2; 96 + break; 97 + case 0x0200: 98 + case 0x0100: 99 + btn_type |= SND_JACK_BTN_3; 100 + break; 101 + } 102 + read_error: 103 + return btn_type; 104 + } 105 + 106 + static int rt700_headset_detect(struct rt700_priv *rt700) 107 + { 108 + unsigned int buf, loop = 0; 109 + int ret; 110 + unsigned int jack_status = 0, reg; 111 + 112 + ret = rt700_index_read(rt700->regmap, 113 + RT700_COMBO_JACK_AUTO_CTL2, &buf); 114 + if (ret < 0) 115 + goto io_error; 116 + 117 + while (loop < 500 && 118 + (buf & RT700_COMBOJACK_AUTO_DET_STATUS) == 0) { 119 + loop++; 120 + 121 + usleep_range(9000, 10000); 122 + ret = rt700_index_read(rt700->regmap, 123 + RT700_COMBO_JACK_AUTO_CTL2, &buf); 124 + if (ret < 0) 125 + goto io_error; 126 + 127 + reg = RT700_VERB_GET_PIN_SENSE | RT700_HP_OUT; 128 + ret = regmap_read(rt700->regmap, reg, &jack_status); 129 + if ((jack_status & (1 << 31)) == 0) 130 + goto remove_error; 131 + } 132 + 133 + if (loop >= 500) 134 + goto to_error; 135 + 136 + if (buf & RT700_COMBOJACK_AUTO_DET_TRS) 137 + rt700->jack_type = SND_JACK_HEADPHONE; 138 + else if ((buf & RT700_COMBOJACK_AUTO_DET_CTIA) || 139 + (buf & RT700_COMBOJACK_AUTO_DET_OMTP)) 140 + rt700->jack_type = SND_JACK_HEADSET; 141 + 142 + return 0; 143 + 144 + to_error: 145 + ret = -ETIMEDOUT; 146 + pr_err_ratelimited("Time-out error in %s\n", __func__); 147 + return ret; 148 + io_error: 149 + pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret); 150 + return ret; 151 + remove_error: 152 + pr_err_ratelimited("Jack removal in %s\n", __func__); 153 + return -ENODEV; 154 + } 155 + 156 + static void rt700_jack_detect_handler(struct work_struct *work) 157 + { 158 + struct rt700_priv *rt700 = 159 + container_of(work, struct rt700_priv, jack_detect_work.work); 160 + int btn_type = 0, ret; 161 + unsigned int jack_status = 0, reg; 162 + 163 + if (!rt700->hs_jack) 164 + return; 165 + 166 + if (!rt700->component->card->instantiated) 167 + return; 168 + 169 + reg = RT700_VERB_GET_PIN_SENSE | RT700_HP_OUT; 170 + ret = regmap_read(rt700->regmap, reg, &jack_status); 171 + if (ret < 0) 172 + goto io_error; 173 + 174 + /* pin attached */ 175 + if (jack_status & (1 << 31)) { 176 + /* jack in */ 177 + if (rt700->jack_type == 0) { 178 + ret = rt700_headset_detect(rt700); 179 + if (ret < 0) 180 + return; 181 + if (rt700->jack_type == SND_JACK_HEADSET) 182 + btn_type = rt700_button_detect(rt700); 183 + } else if (rt700->jack_type == SND_JACK_HEADSET) { 184 + /* jack is already in, report button event */ 185 + btn_type = rt700_button_detect(rt700); 186 + } 187 + } else { 188 + /* jack out */ 189 + rt700->jack_type = 0; 190 + } 191 + 192 + dev_dbg(&rt700->slave->dev, 193 + "in %s, jack_type=0x%x\n", __func__, rt700->jack_type); 194 + dev_dbg(&rt700->slave->dev, 195 + "in %s, btn_type=0x%x\n", __func__, btn_type); 196 + 197 + snd_soc_jack_report(rt700->hs_jack, rt700->jack_type | btn_type, 198 + SND_JACK_HEADSET | 199 + SND_JACK_BTN_0 | SND_JACK_BTN_1 | 200 + SND_JACK_BTN_2 | SND_JACK_BTN_3); 201 + 202 + if (btn_type) { 203 + /* button released */ 204 + snd_soc_jack_report(rt700->hs_jack, rt700->jack_type, 205 + SND_JACK_HEADSET | 206 + SND_JACK_BTN_0 | SND_JACK_BTN_1 | 207 + SND_JACK_BTN_2 | SND_JACK_BTN_3); 208 + 209 + mod_delayed_work(system_power_efficient_wq, 210 + &rt700->jack_btn_check_work, msecs_to_jiffies(200)); 211 + } 212 + 213 + return; 214 + 215 + io_error: 216 + pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret); 217 + } 218 + 219 + static void rt700_btn_check_handler(struct work_struct *work) 220 + { 221 + struct rt700_priv *rt700 = container_of(work, struct rt700_priv, 222 + jack_btn_check_work.work); 223 + int btn_type = 0, ret; 224 + unsigned int jack_status = 0, reg; 225 + 226 + reg = RT700_VERB_GET_PIN_SENSE | RT700_HP_OUT; 227 + ret = regmap_read(rt700->regmap, reg, &jack_status); 228 + if (ret < 0) 229 + goto io_error; 230 + 231 + /* pin attached */ 232 + if (jack_status & (1 << 31)) { 233 + if (rt700->jack_type == SND_JACK_HEADSET) { 234 + /* jack is already in, report button event */ 235 + btn_type = rt700_button_detect(rt700); 236 + } 237 + } else { 238 + rt700->jack_type = 0; 239 + } 240 + 241 + /* cbj comparator */ 242 + ret = rt700_index_read(rt700->regmap, RT700_COMBO_JACK_AUTO_CTL2, &reg); 243 + if (ret < 0) 244 + goto io_error; 245 + 246 + if ((reg & 0xf0) == 0xf0) 247 + btn_type = 0; 248 + 249 + dev_dbg(&rt700->slave->dev, 250 + "%s, btn_type=0x%x\n", __func__, btn_type); 251 + snd_soc_jack_report(rt700->hs_jack, rt700->jack_type | btn_type, 252 + SND_JACK_HEADSET | 253 + SND_JACK_BTN_0 | SND_JACK_BTN_1 | 254 + SND_JACK_BTN_2 | SND_JACK_BTN_3); 255 + 256 + if (btn_type) { 257 + /* button released */ 258 + snd_soc_jack_report(rt700->hs_jack, rt700->jack_type, 259 + SND_JACK_HEADSET | 260 + SND_JACK_BTN_0 | SND_JACK_BTN_1 | 261 + SND_JACK_BTN_2 | SND_JACK_BTN_3); 262 + 263 + mod_delayed_work(system_power_efficient_wq, 264 + &rt700->jack_btn_check_work, msecs_to_jiffies(200)); 265 + } 266 + 267 + return; 268 + 269 + io_error: 270 + pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret); 271 + } 272 + 273 + static void rt700_jack_init(struct rt700_priv *rt700) 274 + { 275 + struct snd_soc_dapm_context *dapm = 276 + snd_soc_component_get_dapm(rt700->component); 277 + 278 + /* power on */ 279 + if (dapm->bias_level <= SND_SOC_BIAS_STANDBY) 280 + regmap_write(rt700->regmap, 281 + RT700_SET_AUDIO_POWER_STATE, AC_PWRST_D0); 282 + 283 + if (rt700->hs_jack) { 284 + /* Enable Jack Detection */ 285 + regmap_write(rt700->regmap, 286 + RT700_SET_MIC2_UNSOLICITED_ENABLE, 0x82); 287 + regmap_write(rt700->regmap, 288 + RT700_SET_HP_UNSOLICITED_ENABLE, 0x81); 289 + regmap_write(rt700->regmap, 290 + RT700_SET_INLINE_UNSOLICITED_ENABLE, 0x83); 291 + rt700_index_write(rt700->regmap, 0x10, 0x2420); 292 + rt700_index_write(rt700->regmap, 0x19, 0x2e11); 293 + 294 + dev_dbg(&rt700->slave->dev, "in %s enable\n", __func__); 295 + 296 + mod_delayed_work(system_power_efficient_wq, 297 + &rt700->jack_detect_work, msecs_to_jiffies(250)); 298 + } else { 299 + regmap_write(rt700->regmap, 300 + RT700_SET_MIC2_UNSOLICITED_ENABLE, 0x00); 301 + regmap_write(rt700->regmap, 302 + RT700_SET_HP_UNSOLICITED_ENABLE, 0x00); 303 + regmap_write(rt700->regmap, 304 + RT700_SET_INLINE_UNSOLICITED_ENABLE, 0x00); 305 + 306 + dev_dbg(&rt700->slave->dev, "in %s disable\n", __func__); 307 + } 308 + 309 + /* power off */ 310 + if (dapm->bias_level <= SND_SOC_BIAS_STANDBY) 311 + regmap_write(rt700->regmap, 312 + RT700_SET_AUDIO_POWER_STATE, AC_PWRST_D3); 313 + } 314 + 315 + static int rt700_set_jack_detect(struct snd_soc_component *component, 316 + struct snd_soc_jack *hs_jack, void *data) 317 + { 318 + struct rt700_priv *rt700 = snd_soc_component_get_drvdata(component); 319 + 320 + rt700->hs_jack = hs_jack; 321 + 322 + if (!rt700->hw_init) { 323 + dev_dbg(&rt700->slave->dev, 324 + "%s hw_init not ready yet\n", __func__); 325 + return 0; 326 + } 327 + 328 + rt700_jack_init(rt700); 329 + 330 + return 0; 331 + } 332 + 333 + static void rt700_get_gain(struct rt700_priv *rt700, unsigned int addr_h, 334 + unsigned int addr_l, unsigned int val_h, 335 + unsigned int *r_val, unsigned int *l_val) 336 + { 337 + /* R Channel */ 338 + *r_val = (val_h << 8); 339 + regmap_read(rt700->regmap, addr_l, r_val); 340 + 341 + /* L Channel */ 342 + val_h |= 0x20; 343 + *l_val = (val_h << 8); 344 + regmap_read(rt700->regmap, addr_h, l_val); 345 + } 346 + 347 + /* For Verb-Set Amplifier Gain (Verb ID = 3h) */ 348 + static int rt700_set_amp_gain_put(struct snd_kcontrol *kcontrol, 349 + struct snd_ctl_elem_value *ucontrol) 350 + { 351 + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 352 + struct snd_soc_dapm_context *dapm = 353 + snd_soc_component_get_dapm(component); 354 + struct soc_mixer_control *mc = 355 + (struct soc_mixer_control *)kcontrol->private_value; 356 + struct rt700_priv *rt700 = snd_soc_component_get_drvdata(component); 357 + unsigned int addr_h, addr_l, val_h, val_ll, val_lr; 358 + unsigned int read_ll, read_rl; 359 + int i; 360 + 361 + /* Can't use update bit function, so read the original value first */ 362 + addr_h = mc->reg; 363 + addr_l = mc->rreg; 364 + if (mc->shift == RT700_DIR_OUT_SFT) /* output */ 365 + val_h = 0x80; 366 + else /* input */ 367 + val_h = 0x0; 368 + 369 + rt700_get_gain(rt700, addr_h, addr_l, val_h, &read_rl, &read_ll); 370 + 371 + /* L Channel */ 372 + if (mc->invert) { 373 + /* for mute */ 374 + val_ll = (mc->max - ucontrol->value.integer.value[0]) << 7; 375 + /* keep gain */ 376 + read_ll = read_ll & 0x7f; 377 + val_ll |= read_ll; 378 + } else { 379 + /* for gain */ 380 + val_ll = ((ucontrol->value.integer.value[0]) & 0x7f); 381 + if (val_ll > mc->max) 382 + val_ll = mc->max; 383 + /* keep mute status */ 384 + read_ll = read_ll & 0x80; 385 + val_ll |= read_ll; 386 + } 387 + 388 + if (dapm->bias_level <= SND_SOC_BIAS_STANDBY) 389 + regmap_write(rt700->regmap, 390 + RT700_SET_AUDIO_POWER_STATE, AC_PWRST_D0); 391 + 392 + /* R Channel */ 393 + if (mc->invert) { 394 + /* for mute */ 395 + val_lr = (mc->max - ucontrol->value.integer.value[1]) << 7; 396 + /* keep gain */ 397 + read_rl = read_rl & 0x7f; 398 + val_lr |= read_rl; 399 + } else { 400 + /* for gain */ 401 + val_lr = ((ucontrol->value.integer.value[1]) & 0x7f); 402 + if (val_lr > mc->max) 403 + val_lr = mc->max; 404 + /* keep mute status */ 405 + read_rl = read_rl & 0x80; 406 + val_lr |= read_rl; 407 + } 408 + 409 + for (i = 0; i < 3; i++) { /* retry 3 times at most */ 410 + if (val_ll == val_lr) { 411 + /* Set both L/R channels at the same time */ 412 + val_h = (1 << mc->shift) | (3 << 4); 413 + regmap_write(rt700->regmap, 414 + addr_h, (val_h << 8 | val_ll)); 415 + regmap_write(rt700->regmap, 416 + addr_l, (val_h << 8 | val_ll)); 417 + } else { 418 + /* Lch*/ 419 + val_h = (1 << mc->shift) | (1 << 5); 420 + regmap_write(rt700->regmap, 421 + addr_h, (val_h << 8 | val_ll)); 422 + 423 + /* Rch */ 424 + val_h = (1 << mc->shift) | (1 << 4); 425 + regmap_write(rt700->regmap, 426 + addr_l, (val_h << 8 | val_lr)); 427 + } 428 + /* check result */ 429 + if (mc->shift == RT700_DIR_OUT_SFT) /* output */ 430 + val_h = 0x80; 431 + else /* input */ 432 + val_h = 0x0; 433 + 434 + rt700_get_gain(rt700, addr_h, addr_l, val_h, 435 + &read_rl, &read_ll); 436 + if (read_rl == val_lr && read_ll == val_ll) 437 + break; 438 + } 439 + 440 + if (dapm->bias_level <= SND_SOC_BIAS_STANDBY) 441 + regmap_write(rt700->regmap, 442 + RT700_SET_AUDIO_POWER_STATE, AC_PWRST_D3); 443 + return 0; 444 + } 445 + 446 + static int rt700_set_amp_gain_get(struct snd_kcontrol *kcontrol, 447 + struct snd_ctl_elem_value *ucontrol) 448 + { 449 + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 450 + struct rt700_priv *rt700 = snd_soc_component_get_drvdata(component); 451 + struct soc_mixer_control *mc = 452 + (struct soc_mixer_control *)kcontrol->private_value; 453 + unsigned int addr_h, addr_l, val_h; 454 + unsigned int read_ll, read_rl; 455 + 456 + addr_h = mc->reg; 457 + addr_l = mc->rreg; 458 + if (mc->shift == RT700_DIR_OUT_SFT) /* output */ 459 + val_h = 0x80; 460 + else /* input */ 461 + val_h = 0x0; 462 + 463 + rt700_get_gain(rt700, addr_h, addr_l, val_h, &read_rl, &read_ll); 464 + 465 + if (mc->invert) { 466 + /* for mute status */ 467 + read_ll = !((read_ll & 0x80) >> RT700_MUTE_SFT); 468 + read_rl = !((read_rl & 0x80) >> RT700_MUTE_SFT); 469 + } else { 470 + /* for gain */ 471 + read_ll = read_ll & 0x7f; 472 + read_rl = read_rl & 0x7f; 473 + } 474 + ucontrol->value.integer.value[0] = read_ll; 475 + ucontrol->value.integer.value[1] = read_rl; 476 + 477 + return 0; 478 + } 479 + 480 + static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -6525, 75, 0); 481 + static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -1725, 75, 0); 482 + static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, 0, 1000, 0); 483 + 484 + static const struct snd_kcontrol_new rt700_snd_controls[] = { 485 + SOC_DOUBLE_R_EXT_TLV("DAC Front Playback Volume", 486 + RT700_SET_GAIN_DAC1_H, RT700_SET_GAIN_DAC1_L, 487 + RT700_DIR_OUT_SFT, 0x57, 0, 488 + rt700_set_amp_gain_get, rt700_set_amp_gain_put, out_vol_tlv), 489 + SOC_DOUBLE_R_EXT("ADC 08 Capture Switch", 490 + RT700_SET_GAIN_ADC2_H, RT700_SET_GAIN_ADC2_L, 491 + RT700_DIR_IN_SFT, 1, 1, 492 + rt700_set_amp_gain_get, rt700_set_amp_gain_put), 493 + SOC_DOUBLE_R_EXT("ADC 09 Capture Switch", 494 + RT700_SET_GAIN_ADC1_H, RT700_SET_GAIN_ADC1_L, 495 + RT700_DIR_IN_SFT, 1, 1, 496 + rt700_set_amp_gain_get, rt700_set_amp_gain_put), 497 + SOC_DOUBLE_R_EXT_TLV("ADC 08 Capture Volume", 498 + RT700_SET_GAIN_ADC2_H, RT700_SET_GAIN_ADC2_L, 499 + RT700_DIR_IN_SFT, 0x3f, 0, 500 + rt700_set_amp_gain_get, rt700_set_amp_gain_put, in_vol_tlv), 501 + SOC_DOUBLE_R_EXT_TLV("ADC 09 Capture Volume", 502 + RT700_SET_GAIN_ADC1_H, RT700_SET_GAIN_ADC1_L, 503 + RT700_DIR_IN_SFT, 0x3f, 0, 504 + rt700_set_amp_gain_get, rt700_set_amp_gain_put, in_vol_tlv), 505 + SOC_DOUBLE_R_EXT_TLV("AMIC Volume", 506 + RT700_SET_GAIN_AMIC_H, RT700_SET_GAIN_AMIC_L, 507 + RT700_DIR_IN_SFT, 3, 0, 508 + rt700_set_amp_gain_get, rt700_set_amp_gain_put, mic_vol_tlv), 509 + }; 510 + 511 + static int rt700_mux_get(struct snd_kcontrol *kcontrol, 512 + struct snd_ctl_elem_value *ucontrol) 513 + { 514 + struct snd_soc_component *component = 515 + snd_soc_dapm_kcontrol_component(kcontrol); 516 + struct rt700_priv *rt700 = snd_soc_component_get_drvdata(component); 517 + unsigned int reg, val = 0, nid; 518 + int ret; 519 + 520 + if (strstr(ucontrol->id.name, "HPO Mux")) 521 + nid = RT700_HP_OUT; 522 + else if (strstr(ucontrol->id.name, "ADC 22 Mux")) 523 + nid = RT700_MIXER_IN1; 524 + else if (strstr(ucontrol->id.name, "ADC 23 Mux")) 525 + nid = RT700_MIXER_IN2; 526 + else 527 + return -EINVAL; 528 + 529 + /* vid = 0xf01 */ 530 + reg = RT700_VERB_SET_CONNECT_SEL | nid; 531 + ret = regmap_read(rt700->regmap, reg, &val); 532 + if (ret < 0) 533 + return ret; 534 + 535 + ucontrol->value.enumerated.item[0] = val; 536 + 537 + return 0; 538 + } 539 + 540 + static int rt700_mux_put(struct snd_kcontrol *kcontrol, 541 + struct snd_ctl_elem_value *ucontrol) 542 + { 543 + struct snd_soc_component *component = 544 + snd_soc_dapm_kcontrol_component(kcontrol); 545 + struct snd_soc_dapm_context *dapm = 546 + snd_soc_dapm_kcontrol_dapm(kcontrol); 547 + struct rt700_priv *rt700 = snd_soc_component_get_drvdata(component); 548 + struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 549 + unsigned int *item = ucontrol->value.enumerated.item; 550 + unsigned int val, val2 = 0, change, reg, nid; 551 + int ret; 552 + 553 + if (item[0] >= e->items) 554 + return -EINVAL; 555 + 556 + if (strstr(ucontrol->id.name, "HPO Mux")) 557 + nid = RT700_HP_OUT; 558 + else if (strstr(ucontrol->id.name, "ADC 22 Mux")) 559 + nid = RT700_MIXER_IN1; 560 + else if (strstr(ucontrol->id.name, "ADC 23 Mux")) 561 + nid = RT700_MIXER_IN2; 562 + else 563 + return -EINVAL; 564 + 565 + /* Verb ID = 0x701h */ 566 + val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l; 567 + 568 + reg = RT700_VERB_SET_CONNECT_SEL | nid; 569 + ret = regmap_read(rt700->regmap, reg, &val2); 570 + if (ret < 0) 571 + return ret; 572 + 573 + if (val == val2) 574 + change = 0; 575 + else 576 + change = 1; 577 + 578 + if (change) { 579 + reg = RT700_VERB_SET_CONNECT_SEL | nid; 580 + regmap_write(rt700->regmap, reg, val); 581 + } 582 + 583 + snd_soc_dapm_mux_update_power(dapm, kcontrol, 584 + item[0], e, NULL); 585 + 586 + return change; 587 + } 588 + 589 + static const char * const adc_mux_text[] = { 590 + "MIC2", 591 + "LINE1", 592 + "LINE2", 593 + "DMIC", 594 + }; 595 + 596 + static SOC_ENUM_SINGLE_DECL( 597 + rt700_adc22_enum, SND_SOC_NOPM, 0, adc_mux_text); 598 + 599 + static SOC_ENUM_SINGLE_DECL( 600 + rt700_adc23_enum, SND_SOC_NOPM, 0, adc_mux_text); 601 + 602 + static const struct snd_kcontrol_new rt700_adc22_mux = 603 + SOC_DAPM_ENUM_EXT("ADC 22 Mux", rt700_adc22_enum, 604 + rt700_mux_get, rt700_mux_put); 605 + 606 + static const struct snd_kcontrol_new rt700_adc23_mux = 607 + SOC_DAPM_ENUM_EXT("ADC 23 Mux", rt700_adc23_enum, 608 + rt700_mux_get, rt700_mux_put); 609 + 610 + static const char * const out_mux_text[] = { 611 + "Front", 612 + "Surround", 613 + }; 614 + 615 + static SOC_ENUM_SINGLE_DECL( 616 + rt700_hp_enum, SND_SOC_NOPM, 0, out_mux_text); 617 + 618 + static const struct snd_kcontrol_new rt700_hp_mux = 619 + SOC_DAPM_ENUM_EXT("HP Mux", rt700_hp_enum, 620 + rt700_mux_get, rt700_mux_put); 621 + 622 + static int rt700_dac_front_event(struct snd_soc_dapm_widget *w, 623 + struct snd_kcontrol *kcontrol, int event) 624 + { 625 + struct snd_soc_component *component = 626 + snd_soc_dapm_to_component(w->dapm); 627 + struct rt700_priv *rt700 = snd_soc_component_get_drvdata(component); 628 + 629 + switch (event) { 630 + case SND_SOC_DAPM_POST_PMU: 631 + regmap_write(rt700->regmap, 632 + RT700_SET_STREAMID_DAC1, 0x10); 633 + break; 634 + case SND_SOC_DAPM_PRE_PMD: 635 + regmap_write(rt700->regmap, 636 + RT700_SET_STREAMID_DAC1, 0x00); 637 + break; 638 + } 639 + return 0; 640 + } 641 + 642 + static int rt700_dac_surround_event(struct snd_soc_dapm_widget *w, 643 + struct snd_kcontrol *kcontrol, int event) 644 + { 645 + struct snd_soc_component *component = 646 + snd_soc_dapm_to_component(w->dapm); 647 + struct rt700_priv *rt700 = snd_soc_component_get_drvdata(component); 648 + 649 + switch (event) { 650 + case SND_SOC_DAPM_POST_PMU: 651 + regmap_write(rt700->regmap, 652 + RT700_SET_STREAMID_DAC2, 0x10); 653 + break; 654 + case SND_SOC_DAPM_PRE_PMD: 655 + regmap_write(rt700->regmap, 656 + RT700_SET_STREAMID_DAC2, 0x00); 657 + break; 658 + } 659 + return 0; 660 + } 661 + 662 + static int rt700_adc_09_event(struct snd_soc_dapm_widget *w, 663 + struct snd_kcontrol *kcontrol, int event) 664 + { 665 + struct snd_soc_component *component = 666 + snd_soc_dapm_to_component(w->dapm); 667 + struct rt700_priv *rt700 = snd_soc_component_get_drvdata(component); 668 + 669 + switch (event) { 670 + case SND_SOC_DAPM_POST_PMU: 671 + regmap_write(rt700->regmap, 672 + RT700_SET_STREAMID_ADC1, 0x10); 673 + break; 674 + case SND_SOC_DAPM_PRE_PMD: 675 + regmap_write(rt700->regmap, 676 + RT700_SET_STREAMID_ADC1, 0x00); 677 + break; 678 + } 679 + return 0; 680 + } 681 + 682 + static int rt700_adc_08_event(struct snd_soc_dapm_widget *w, 683 + struct snd_kcontrol *kcontrol, int event) 684 + { 685 + struct snd_soc_component *component = 686 + snd_soc_dapm_to_component(w->dapm); 687 + struct rt700_priv *rt700 = snd_soc_component_get_drvdata(component); 688 + 689 + switch (event) { 690 + case SND_SOC_DAPM_POST_PMU: 691 + regmap_write(rt700->regmap, 692 + RT700_SET_STREAMID_ADC2, 0x10); 693 + break; 694 + case SND_SOC_DAPM_PRE_PMD: 695 + regmap_write(rt700->regmap, 696 + RT700_SET_STREAMID_ADC2, 0x00); 697 + break; 698 + } 699 + return 0; 700 + } 701 + 702 + static int rt700_hpo_mux_event(struct snd_soc_dapm_widget *w, 703 + struct snd_kcontrol *kcontrol, int event) 704 + { 705 + struct snd_soc_component *component = 706 + snd_soc_dapm_to_component(w->dapm); 707 + struct rt700_priv *rt700 = snd_soc_component_get_drvdata(component); 708 + unsigned int val_h = (1 << RT700_DIR_OUT_SFT) | (0x3 << 4); 709 + unsigned int val_l; 710 + 711 + switch (event) { 712 + case SND_SOC_DAPM_POST_PMU: 713 + val_l = 0x00; 714 + regmap_write(rt700->regmap, 715 + RT700_SET_GAIN_HP_H, (val_h << 8 | val_l)); 716 + break; 717 + case SND_SOC_DAPM_PRE_PMD: 718 + val_l = (1 << RT700_MUTE_SFT); 719 + regmap_write(rt700->regmap, 720 + RT700_SET_GAIN_HP_H, (val_h << 8 | val_l)); 721 + usleep_range(50000, 55000); 722 + break; 723 + } 724 + return 0; 725 + } 726 + 727 + static int rt700_spk_pga_event(struct snd_soc_dapm_widget *w, 728 + struct snd_kcontrol *kcontrol, int event) 729 + { 730 + struct snd_soc_component *component = 731 + snd_soc_dapm_to_component(w->dapm); 732 + struct rt700_priv *rt700 = snd_soc_component_get_drvdata(component); 733 + unsigned int val_h = (1 << RT700_DIR_OUT_SFT) | (0x3 << 4); 734 + unsigned int val_l; 735 + 736 + switch (event) { 737 + case SND_SOC_DAPM_POST_PMU: 738 + val_l = 0x00; 739 + regmap_write(rt700->regmap, 740 + RT700_SET_GAIN_SPK_H, (val_h << 8 | val_l)); 741 + break; 742 + case SND_SOC_DAPM_PRE_PMD: 743 + val_l = (1 << RT700_MUTE_SFT); 744 + regmap_write(rt700->regmap, 745 + RT700_SET_GAIN_SPK_H, (val_h << 8 | val_l)); 746 + break; 747 + } 748 + return 0; 749 + } 750 + 751 + static const struct snd_soc_dapm_widget rt700_dapm_widgets[] = { 752 + SND_SOC_DAPM_OUTPUT("HP"), 753 + SND_SOC_DAPM_OUTPUT("SPK"), 754 + SND_SOC_DAPM_INPUT("DMIC1"), 755 + SND_SOC_DAPM_INPUT("DMIC2"), 756 + SND_SOC_DAPM_INPUT("MIC2"), 757 + SND_SOC_DAPM_INPUT("LINE1"), 758 + SND_SOC_DAPM_INPUT("LINE2"), 759 + SND_SOC_DAPM_DAC_E("DAC Front", NULL, SND_SOC_NOPM, 0, 0, 760 + rt700_dac_front_event, 761 + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), 762 + SND_SOC_DAPM_DAC_E("DAC Surround", NULL, SND_SOC_NOPM, 0, 0, 763 + rt700_dac_surround_event, 764 + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), 765 + SND_SOC_DAPM_MUX_E("HPO Mux", SND_SOC_NOPM, 0, 0, &rt700_hp_mux, 766 + rt700_hpo_mux_event, 767 + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), 768 + SND_SOC_DAPM_PGA_E("SPK PGA", SND_SOC_NOPM, 0, 0, NULL, 0, 769 + rt700_spk_pga_event, 770 + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), 771 + SND_SOC_DAPM_ADC_E("ADC 09", NULL, SND_SOC_NOPM, 0, 0, 772 + rt700_adc_09_event, 773 + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), 774 + SND_SOC_DAPM_ADC_E("ADC 08", NULL, SND_SOC_NOPM, 0, 0, 775 + rt700_adc_08_event, 776 + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), 777 + SND_SOC_DAPM_MUX("ADC 22 Mux", SND_SOC_NOPM, 0, 0, 778 + &rt700_adc22_mux), 779 + SND_SOC_DAPM_MUX("ADC 23 Mux", SND_SOC_NOPM, 0, 0, 780 + &rt700_adc23_mux), 781 + SND_SOC_DAPM_AIF_IN("DP1RX", "DP1 Playback", 0, SND_SOC_NOPM, 0, 0), 782 + SND_SOC_DAPM_AIF_IN("DP3RX", "DP3 Playback", 0, SND_SOC_NOPM, 0, 0), 783 + SND_SOC_DAPM_AIF_OUT("DP2TX", "DP2 Capture", 0, SND_SOC_NOPM, 0, 0), 784 + SND_SOC_DAPM_AIF_OUT("DP4TX", "DP4 Capture", 0, SND_SOC_NOPM, 0, 0), 785 + }; 786 + 787 + static const struct snd_soc_dapm_route rt700_audio_map[] = { 788 + {"DAC Front", NULL, "DP1RX"}, 789 + {"DAC Surround", NULL, "DP3RX"}, 790 + {"DP2TX", NULL, "ADC 09"}, 791 + {"DP4TX", NULL, "ADC 08"}, 792 + {"ADC 09", NULL, "ADC 22 Mux"}, 793 + {"ADC 08", NULL, "ADC 23 Mux"}, 794 + {"ADC 22 Mux", "DMIC", "DMIC1"}, 795 + {"ADC 22 Mux", "LINE1", "LINE1"}, 796 + {"ADC 22 Mux", "LINE2", "LINE2"}, 797 + {"ADC 22 Mux", "MIC2", "MIC2"}, 798 + {"ADC 23 Mux", "DMIC", "DMIC2"}, 799 + {"ADC 23 Mux", "LINE1", "LINE1"}, 800 + {"ADC 23 Mux", "LINE2", "LINE2"}, 801 + {"ADC 23 Mux", "MIC2", "MIC2"}, 802 + {"HPO Mux", "Front", "DAC Front"}, 803 + {"HPO Mux", "Surround", "DAC Surround"}, 804 + {"HP", NULL, "HPO Mux"}, 805 + {"SPK PGA", NULL, "DAC Front"}, 806 + {"SPK", NULL, "SPK PGA"}, 807 + }; 808 + 809 + static int rt700_probe(struct snd_soc_component *component) 810 + { 811 + struct rt700_priv *rt700 = snd_soc_component_get_drvdata(component); 812 + 813 + rt700->component = component; 814 + 815 + return 0; 816 + } 817 + 818 + static int rt700_set_bias_level(struct snd_soc_component *component, 819 + enum snd_soc_bias_level level) 820 + { 821 + struct snd_soc_dapm_context *dapm = 822 + snd_soc_component_get_dapm(component); 823 + struct rt700_priv *rt700 = snd_soc_component_get_drvdata(component); 824 + 825 + switch (level) { 826 + case SND_SOC_BIAS_PREPARE: 827 + if (dapm->bias_level == SND_SOC_BIAS_STANDBY) { 828 + regmap_write(rt700->regmap, 829 + RT700_SET_AUDIO_POWER_STATE, 830 + AC_PWRST_D0); 831 + } 832 + break; 833 + 834 + case SND_SOC_BIAS_STANDBY: 835 + regmap_write(rt700->regmap, 836 + RT700_SET_AUDIO_POWER_STATE, 837 + AC_PWRST_D3); 838 + break; 839 + 840 + default: 841 + break; 842 + } 843 + dapm->bias_level = level; 844 + return 0; 845 + } 846 + 847 + static const struct snd_soc_component_driver soc_codec_dev_rt700 = { 848 + .probe = rt700_probe, 849 + .set_bias_level = rt700_set_bias_level, 850 + .controls = rt700_snd_controls, 851 + .num_controls = ARRAY_SIZE(rt700_snd_controls), 852 + .dapm_widgets = rt700_dapm_widgets, 853 + .num_dapm_widgets = ARRAY_SIZE(rt700_dapm_widgets), 854 + .dapm_routes = rt700_audio_map, 855 + .num_dapm_routes = ARRAY_SIZE(rt700_audio_map), 856 + .set_jack = rt700_set_jack_detect, 857 + }; 858 + 859 + static int rt700_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, 860 + int direction) 861 + { 862 + struct sdw_stream_data *stream; 863 + 864 + stream = kzalloc(sizeof(*stream), GFP_KERNEL); 865 + if (!stream) 866 + return -ENOMEM; 867 + 868 + stream->sdw_stream = (struct sdw_stream_runtime *)sdw_stream; 869 + 870 + /* Use tx_mask or rx_mask to configure stream tag and set dma_data */ 871 + if (direction == SNDRV_PCM_STREAM_PLAYBACK) 872 + dai->playback_dma_data = stream; 873 + else 874 + dai->capture_dma_data = stream; 875 + 876 + return 0; 877 + } 878 + 879 + static void rt700_shutdown(struct snd_pcm_substream *substream, 880 + struct snd_soc_dai *dai) 881 + { 882 + struct sdw_stream_data *stream; 883 + 884 + stream = snd_soc_dai_get_dma_data(dai, substream); 885 + snd_soc_dai_set_dma_data(dai, substream, NULL); 886 + kfree(stream); 887 + } 888 + 889 + static int rt700_pcm_hw_params(struct snd_pcm_substream *substream, 890 + struct snd_pcm_hw_params *params, 891 + struct snd_soc_dai *dai) 892 + { 893 + struct snd_soc_component *component = dai->component; 894 + struct rt700_priv *rt700 = snd_soc_component_get_drvdata(component); 895 + struct sdw_stream_config stream_config; 896 + struct sdw_port_config port_config; 897 + enum sdw_data_direction direction; 898 + struct sdw_stream_data *stream; 899 + int retval, port, num_channels; 900 + unsigned int val = 0; 901 + 902 + dev_dbg(dai->dev, "%s %s", __func__, dai->name); 903 + stream = snd_soc_dai_get_dma_data(dai, substream); 904 + 905 + if (!stream) 906 + return -EINVAL; 907 + 908 + if (!rt700->slave) 909 + return -EINVAL; 910 + 911 + /* SoundWire specific configuration */ 912 + /* This code assumes port 1 for playback and port 2 for capture */ 913 + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { 914 + direction = SDW_DATA_DIR_RX; 915 + port = 1; 916 + } else { 917 + direction = SDW_DATA_DIR_TX; 918 + port = 2; 919 + } 920 + 921 + switch (dai->id) { 922 + case RT700_AIF1: 923 + break; 924 + case RT700_AIF2: 925 + port += 2; 926 + break; 927 + default: 928 + dev_err(component->dev, "Invalid DAI id %d\n", dai->id); 929 + return -EINVAL; 930 + } 931 + 932 + stream_config.frame_rate = params_rate(params); 933 + stream_config.ch_count = params_channels(params); 934 + stream_config.bps = snd_pcm_format_width(params_format(params)); 935 + stream_config.direction = direction; 936 + 937 + num_channels = params_channels(params); 938 + port_config.ch_mask = (1 << (num_channels)) - 1; 939 + port_config.num = port; 940 + 941 + retval = sdw_stream_add_slave(rt700->slave, &stream_config, 942 + &port_config, 1, stream->sdw_stream); 943 + if (retval) { 944 + dev_err(dai->dev, "Unable to configure port\n"); 945 + return retval; 946 + } 947 + 948 + if (params_channels(params) <= 16) { 949 + /* bit 3:0 Number of Channel */ 950 + val |= (params_channels(params) - 1); 951 + } else { 952 + dev_err(component->dev, "Unsupported channels %d\n", 953 + params_channels(params)); 954 + return -EINVAL; 955 + } 956 + 957 + switch (params_width(params)) { 958 + /* bit 6:4 Bits per Sample */ 959 + case 8: 960 + break; 961 + case 16: 962 + val |= (0x1 << 4); 963 + break; 964 + case 20: 965 + val |= (0x2 << 4); 966 + break; 967 + case 24: 968 + val |= (0x3 << 4); 969 + break; 970 + case 32: 971 + val |= (0x4 << 4); 972 + break; 973 + default: 974 + return -EINVAL; 975 + } 976 + 977 + /* 48Khz */ 978 + regmap_write(rt700->regmap, RT700_DAC_FORMAT_H, val); 979 + regmap_write(rt700->regmap, RT700_ADC_FORMAT_H, val); 980 + 981 + return retval; 982 + } 983 + 984 + static int rt700_pcm_hw_free(struct snd_pcm_substream *substream, 985 + struct snd_soc_dai *dai) 986 + { 987 + struct snd_soc_component *component = dai->component; 988 + struct rt700_priv *rt700 = snd_soc_component_get_drvdata(component); 989 + struct sdw_stream_data *stream = 990 + snd_soc_dai_get_dma_data(dai, substream); 991 + 992 + if (!rt700->slave) 993 + return -EINVAL; 994 + 995 + sdw_stream_remove_slave(rt700->slave, stream->sdw_stream); 996 + return 0; 997 + } 998 + 999 + #define RT700_STEREO_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000) 1000 + #define RT700_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \ 1001 + SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8) 1002 + 1003 + static struct snd_soc_dai_ops rt700_ops = { 1004 + .hw_params = rt700_pcm_hw_params, 1005 + .hw_free = rt700_pcm_hw_free, 1006 + .set_sdw_stream = rt700_set_sdw_stream, 1007 + .shutdown = rt700_shutdown, 1008 + }; 1009 + 1010 + static struct snd_soc_dai_driver rt700_dai[] = { 1011 + { 1012 + .name = "rt700-aif1", 1013 + .id = RT700_AIF1, 1014 + .playback = { 1015 + .stream_name = "DP1 Playback", 1016 + .channels_min = 1, 1017 + .channels_max = 2, 1018 + .rates = RT700_STEREO_RATES, 1019 + .formats = RT700_FORMATS, 1020 + }, 1021 + .capture = { 1022 + .stream_name = "DP2 Capture", 1023 + .channels_min = 1, 1024 + .channels_max = 2, 1025 + .rates = RT700_STEREO_RATES, 1026 + .formats = RT700_FORMATS, 1027 + }, 1028 + .ops = &rt700_ops, 1029 + }, 1030 + { 1031 + .name = "rt700-aif2", 1032 + .id = RT700_AIF2, 1033 + .playback = { 1034 + .stream_name = "DP3 Playback", 1035 + .channels_min = 1, 1036 + .channels_max = 2, 1037 + .rates = RT700_STEREO_RATES, 1038 + .formats = RT700_FORMATS, 1039 + }, 1040 + .capture = { 1041 + .stream_name = "DP4 Capture", 1042 + .channels_min = 1, 1043 + .channels_max = 2, 1044 + .rates = RT700_STEREO_RATES, 1045 + .formats = RT700_FORMATS, 1046 + }, 1047 + .ops = &rt700_ops, 1048 + }, 1049 + }; 1050 + 1051 + /* Bus clock frequency */ 1052 + #define RT700_CLK_FREQ_9600000HZ 9600000 1053 + #define RT700_CLK_FREQ_12000000HZ 12000000 1054 + #define RT700_CLK_FREQ_6000000HZ 6000000 1055 + #define RT700_CLK_FREQ_4800000HZ 4800000 1056 + #define RT700_CLK_FREQ_2400000HZ 2400000 1057 + #define RT700_CLK_FREQ_12288000HZ 12288000 1058 + 1059 + int rt700_clock_config(struct device *dev) 1060 + { 1061 + struct rt700_priv *rt700 = dev_get_drvdata(dev); 1062 + unsigned int clk_freq, value; 1063 + 1064 + clk_freq = (rt700->params.curr_dr_freq >> 1); 1065 + 1066 + switch (clk_freq) { 1067 + case RT700_CLK_FREQ_12000000HZ: 1068 + value = 0x0; 1069 + break; 1070 + case RT700_CLK_FREQ_6000000HZ: 1071 + value = 0x1; 1072 + break; 1073 + case RT700_CLK_FREQ_9600000HZ: 1074 + value = 0x2; 1075 + break; 1076 + case RT700_CLK_FREQ_4800000HZ: 1077 + value = 0x3; 1078 + break; 1079 + case RT700_CLK_FREQ_2400000HZ: 1080 + value = 0x4; 1081 + break; 1082 + case RT700_CLK_FREQ_12288000HZ: 1083 + value = 0x5; 1084 + break; 1085 + default: 1086 + return -EINVAL; 1087 + } 1088 + 1089 + regmap_write(rt700->regmap, 0xe0, value); 1090 + regmap_write(rt700->regmap, 0xf0, value); 1091 + 1092 + dev_dbg(dev, "%s complete, clk_freq=%d\n", __func__, clk_freq); 1093 + 1094 + return 0; 1095 + } 1096 + 1097 + int rt700_init(struct device *dev, struct regmap *sdw_regmap, 1098 + struct regmap *regmap, struct sdw_slave *slave) 1099 + 1100 + { 1101 + struct rt700_priv *rt700; 1102 + int ret; 1103 + 1104 + rt700 = devm_kzalloc(dev, sizeof(*rt700), GFP_KERNEL); 1105 + if (!rt700) 1106 + return -ENOMEM; 1107 + 1108 + dev_set_drvdata(dev, rt700); 1109 + rt700->slave = slave; 1110 + rt700->sdw_regmap = sdw_regmap; 1111 + rt700->regmap = regmap; 1112 + 1113 + /* 1114 + * Mark hw_init to false 1115 + * HW init will be performed when device reports present 1116 + */ 1117 + rt700->hw_init = false; 1118 + rt700->first_hw_init = false; 1119 + 1120 + ret = devm_snd_soc_register_component(dev, 1121 + &soc_codec_dev_rt700, 1122 + rt700_dai, 1123 + ARRAY_SIZE(rt700_dai)); 1124 + 1125 + dev_dbg(&slave->dev, "%s\n", __func__); 1126 + 1127 + return ret; 1128 + } 1129 + 1130 + int rt700_io_init(struct device *dev, struct sdw_slave *slave) 1131 + { 1132 + struct rt700_priv *rt700 = dev_get_drvdata(dev); 1133 + 1134 + if (rt700->hw_init) 1135 + return 0; 1136 + 1137 + if (rt700->first_hw_init) { 1138 + regcache_cache_only(rt700->regmap, false); 1139 + regcache_cache_bypass(rt700->regmap, true); 1140 + } 1141 + 1142 + /* 1143 + * PM runtime is only enabled when a Slave reports as Attached 1144 + */ 1145 + if (!rt700->first_hw_init) { 1146 + /* set autosuspend parameters */ 1147 + pm_runtime_set_autosuspend_delay(&slave->dev, 3000); 1148 + pm_runtime_use_autosuspend(&slave->dev); 1149 + 1150 + /* update count of parent 'active' children */ 1151 + pm_runtime_set_active(&slave->dev); 1152 + 1153 + /* make sure the device does not suspend immediately */ 1154 + pm_runtime_mark_last_busy(&slave->dev); 1155 + 1156 + pm_runtime_enable(&slave->dev); 1157 + } 1158 + 1159 + pm_runtime_get_noresume(&slave->dev); 1160 + 1161 + /* reset */ 1162 + regmap_write(rt700->regmap, 0xff01, 0x0000); 1163 + regmap_write(rt700->regmap, 0x7520, 0x001a); 1164 + regmap_write(rt700->regmap, 0x7420, 0xc003); 1165 + 1166 + /* power on */ 1167 + regmap_write(rt700->regmap, RT700_SET_AUDIO_POWER_STATE, AC_PWRST_D0); 1168 + /* Set Pin Widget */ 1169 + regmap_write(rt700->regmap, RT700_SET_PIN_HP, 0x40); 1170 + regmap_write(rt700->regmap, RT700_SET_PIN_SPK, 0x40); 1171 + regmap_write(rt700->regmap, RT700_SET_EAPD_SPK, RT700_EAPD_HIGH); 1172 + regmap_write(rt700->regmap, RT700_SET_PIN_DMIC1, 0x20); 1173 + regmap_write(rt700->regmap, RT700_SET_PIN_DMIC2, 0x20); 1174 + regmap_write(rt700->regmap, RT700_SET_PIN_MIC2, 0x20); 1175 + 1176 + /* Set Configuration Default */ 1177 + regmap_write(rt700->regmap, 0x4f12, 0x91); 1178 + regmap_write(rt700->regmap, 0x4e12, 0xd6); 1179 + regmap_write(rt700->regmap, 0x4d12, 0x11); 1180 + regmap_write(rt700->regmap, 0x4c12, 0x20); 1181 + regmap_write(rt700->regmap, 0x4f13, 0x91); 1182 + regmap_write(rt700->regmap, 0x4e13, 0xd6); 1183 + regmap_write(rt700->regmap, 0x4d13, 0x11); 1184 + regmap_write(rt700->regmap, 0x4c13, 0x21); 1185 + 1186 + regmap_write(rt700->regmap, 0x4f19, 0x02); 1187 + regmap_write(rt700->regmap, 0x4e19, 0xa1); 1188 + regmap_write(rt700->regmap, 0x4d19, 0x90); 1189 + regmap_write(rt700->regmap, 0x4c19, 0x80); 1190 + 1191 + /* Enable Line2 */ 1192 + regmap_write(rt700->regmap, 0x371b, 0x40); 1193 + regmap_write(rt700->regmap, 0x731b, 0xb0); 1194 + regmap_write(rt700->regmap, 0x839b, 0x00); 1195 + 1196 + /* Set index */ 1197 + rt700_index_write(rt700->regmap, 0x4a, 0x201b); 1198 + rt700_index_write(rt700->regmap, 0x45, 0x5089); 1199 + rt700_index_write(rt700->regmap, 0x6b, 0x5064); 1200 + rt700_index_write(rt700->regmap, 0x48, 0xd249); 1201 + 1202 + /* Finish Initial Settings, set power to D3 */ 1203 + regmap_write(rt700->regmap, RT700_SET_AUDIO_POWER_STATE, AC_PWRST_D3); 1204 + 1205 + if (!rt700->first_hw_init) { 1206 + INIT_DELAYED_WORK(&rt700->jack_detect_work, 1207 + rt700_jack_detect_handler); 1208 + INIT_DELAYED_WORK(&rt700->jack_btn_check_work, 1209 + rt700_btn_check_handler); 1210 + } 1211 + 1212 + /* 1213 + * if set_jack callback occurred early than io_init, 1214 + * we set up the jack detection function now 1215 + */ 1216 + if (rt700->hs_jack) 1217 + rt700_jack_init(rt700); 1218 + 1219 + if (rt700->first_hw_init) { 1220 + regcache_cache_bypass(rt700->regmap, false); 1221 + regcache_mark_dirty(rt700->regmap); 1222 + } else 1223 + rt700->first_hw_init = true; 1224 + 1225 + /* Mark Slave initialization complete */ 1226 + rt700->hw_init = true; 1227 + 1228 + pm_runtime_mark_last_busy(&slave->dev); 1229 + pm_runtime_put_autosuspend(&slave->dev); 1230 + 1231 + dev_dbg(&slave->dev, "%s hw_init complete\n", __func__); 1232 + 1233 + return 0; 1234 + } 1235 + 1236 + MODULE_DESCRIPTION("ASoC RT700 driver SDW"); 1237 + MODULE_AUTHOR("Shuming Fan <shumingf@realtek.com>"); 1238 + MODULE_LICENSE("GPL v2");
+174
sound/soc/codecs/rt700.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * rt700.h -- RT700 ALSA SoC audio driver header 4 + * 5 + * Copyright(c) 2019 Realtek Semiconductor Corp. 6 + */ 7 + 8 + #ifndef __RT700_H__ 9 + #define __RT700_H__ 10 + 11 + extern const struct dev_pm_ops rt700_runtime_pm; 12 + 13 + struct rt700_priv { 14 + struct snd_soc_component *component; 15 + struct regmap *regmap; 16 + struct regmap *sdw_regmap; 17 + struct sdw_slave *slave; 18 + enum sdw_slave_status status; 19 + struct sdw_bus_params params; 20 + bool hw_init; 21 + bool first_hw_init; 22 + struct snd_soc_jack *hs_jack; 23 + struct delayed_work jack_detect_work; 24 + struct delayed_work jack_btn_check_work; 25 + int jack_type; 26 + }; 27 + 28 + struct sdw_stream_data { 29 + struct sdw_stream_runtime *sdw_stream; 30 + }; 31 + 32 + /* NID */ 33 + #define RT700_AUDIO_FUNCTION_GROUP 0x01 34 + #define RT700_DAC_OUT1 0x02 35 + #define RT700_DAC_OUT2 0x03 36 + #define RT700_ADC_IN1 0x09 37 + #define RT700_ADC_IN2 0x08 38 + #define RT700_DMIC1 0x12 39 + #define RT700_DMIC2 0x13 40 + #define RT700_SPK_OUT 0x14 41 + #define RT700_MIC2 0x19 42 + #define RT700_LINE1 0x1a 43 + #define RT700_LINE2 0x1b 44 + #define RT700_BEEP 0x1d 45 + #define RT700_SPDIF 0x1e 46 + #define RT700_VENDOR_REGISTERS 0x20 47 + #define RT700_HP_OUT 0x21 48 + #define RT700_MIXER_IN1 0x22 49 + #define RT700_MIXER_IN2 0x23 50 + #define RT700_INLINE_CMD 0x55 51 + 52 + /* Index (NID:20h) */ 53 + #define RT700_DAC_DC_CALI_CTL1 0x00 54 + #define RT700_PARA_VERB_CTL 0x1a 55 + #define RT700_COMBO_JACK_AUTO_CTL1 0x45 56 + #define RT700_COMBO_JACK_AUTO_CTL2 0x46 57 + #define RT700_INLINE_CMD_CTL 0x48 58 + #define RT700_DIGITAL_MISC_CTRL4 0x4a 59 + #define RT700_VREFOUT_CTL 0x6b 60 + #define RT700_FSM_CTL 0x6f 61 + #define RT700_IRQ_FLAG_TABLE1 0x80 62 + #define RT700_IRQ_FLAG_TABLE2 0x81 63 + #define RT700_IRQ_FLAG_TABLE3 0x82 64 + 65 + /* Verb */ 66 + #define RT700_VERB_SET_CONNECT_SEL 0x3100 67 + #define RT700_VERB_SET_EAPD_BTLENABLE 0x3c00 68 + #define RT700_VERB_GET_CONNECT_SEL 0xb100 69 + #define RT700_VERB_SET_POWER_STATE 0x3500 70 + #define RT700_VERB_SET_CHANNEL_STREAMID 0x3600 71 + #define RT700_VERB_SET_PIN_WIDGET_CONTROL 0x3700 72 + #define RT700_VERB_SET_UNSOLICITED_ENABLE 0x3800 73 + #define RT700_SET_AMP_GAIN_MUTE_H 0x7300 74 + #define RT700_SET_AMP_GAIN_MUTE_L 0x8380 75 + #define RT700_VERB_GET_PIN_SENSE 0xb900 76 + 77 + #define RT700_READ_HDA_3 0x2012 78 + #define RT700_READ_HDA_2 0x2013 79 + #define RT700_READ_HDA_1 0x2014 80 + #define RT700_READ_HDA_0 0x2015 81 + #define RT700_PRIV_INDEX_W_H 0x7520 82 + #define RT700_PRIV_INDEX_W_L 0x85a0 83 + #define RT700_PRIV_DATA_W_H 0x7420 84 + #define RT700_PRIV_DATA_W_L 0x84a0 85 + #define RT700_PRIV_INDEX_R_H 0x9d20 86 + #define RT700_PRIV_INDEX_R_L 0xada0 87 + #define RT700_PRIV_DATA_R_H 0x9c20 88 + #define RT700_PRIV_DATA_R_L 0xaca0 89 + #define RT700_DAC_FORMAT_H 0x7203 90 + #define RT700_DAC_FORMAT_L 0x8283 91 + #define RT700_ADC_FORMAT_H 0x7209 92 + #define RT700_ADC_FORMAT_L 0x8289 93 + #define RT700_SET_AUDIO_POWER_STATE\ 94 + (RT700_VERB_SET_POWER_STATE | RT700_AUDIO_FUNCTION_GROUP) 95 + #define RT700_SET_PIN_DMIC1\ 96 + (RT700_VERB_SET_PIN_WIDGET_CONTROL | RT700_DMIC1) 97 + #define RT700_SET_PIN_DMIC2\ 98 + (RT700_VERB_SET_PIN_WIDGET_CONTROL | RT700_DMIC2) 99 + #define RT700_SET_PIN_SPK\ 100 + (RT700_VERB_SET_PIN_WIDGET_CONTROL | RT700_SPK_OUT) 101 + #define RT700_SET_PIN_HP\ 102 + (RT700_VERB_SET_PIN_WIDGET_CONTROL | RT700_HP_OUT) 103 + #define RT700_SET_PIN_MIC2\ 104 + (RT700_VERB_SET_PIN_WIDGET_CONTROL | RT700_MIC2) 105 + #define RT700_SET_PIN_LINE1\ 106 + (RT700_VERB_SET_PIN_WIDGET_CONTROL | RT700_LINE1) 107 + #define RT700_SET_PIN_LINE2\ 108 + (RT700_VERB_SET_PIN_WIDGET_CONTROL | RT700_LINE2) 109 + #define RT700_SET_MIC2_UNSOLICITED_ENABLE\ 110 + (RT700_VERB_SET_UNSOLICITED_ENABLE | RT700_MIC2) 111 + #define RT700_SET_HP_UNSOLICITED_ENABLE\ 112 + (RT700_VERB_SET_UNSOLICITED_ENABLE | RT700_HP_OUT) 113 + #define RT700_SET_INLINE_UNSOLICITED_ENABLE\ 114 + (RT700_VERB_SET_UNSOLICITED_ENABLE | RT700_INLINE_CMD) 115 + #define RT700_SET_STREAMID_DAC1\ 116 + (RT700_VERB_SET_CHANNEL_STREAMID | RT700_DAC_OUT1) 117 + #define RT700_SET_STREAMID_DAC2\ 118 + (RT700_VERB_SET_CHANNEL_STREAMID | RT700_DAC_OUT2) 119 + #define RT700_SET_STREAMID_ADC1\ 120 + (RT700_VERB_SET_CHANNEL_STREAMID | RT700_ADC_IN1) 121 + #define RT700_SET_STREAMID_ADC2\ 122 + (RT700_VERB_SET_CHANNEL_STREAMID | RT700_ADC_IN2) 123 + #define RT700_SET_GAIN_DAC1_L\ 124 + (RT700_SET_AMP_GAIN_MUTE_L | RT700_DAC_OUT1) 125 + #define RT700_SET_GAIN_DAC1_H\ 126 + (RT700_SET_AMP_GAIN_MUTE_H | RT700_DAC_OUT1) 127 + #define RT700_SET_GAIN_ADC1_L\ 128 + (RT700_SET_AMP_GAIN_MUTE_L | RT700_ADC_IN1) 129 + #define RT700_SET_GAIN_ADC1_H\ 130 + (RT700_SET_AMP_GAIN_MUTE_H | RT700_ADC_IN1) 131 + #define RT700_SET_GAIN_ADC2_L\ 132 + (RT700_SET_AMP_GAIN_MUTE_L | RT700_ADC_IN2) 133 + #define RT700_SET_GAIN_ADC2_H\ 134 + (RT700_SET_AMP_GAIN_MUTE_H | RT700_ADC_IN2) 135 + #define RT700_SET_GAIN_AMIC_L\ 136 + (RT700_SET_AMP_GAIN_MUTE_L | RT700_MIC2) 137 + #define RT700_SET_GAIN_AMIC_H\ 138 + (RT700_SET_AMP_GAIN_MUTE_H | RT700_MIC2) 139 + #define RT700_SET_GAIN_HP_L\ 140 + (RT700_SET_AMP_GAIN_MUTE_L | RT700_HP_OUT) 141 + #define RT700_SET_GAIN_HP_H\ 142 + (RT700_SET_AMP_GAIN_MUTE_H | RT700_HP_OUT) 143 + #define RT700_SET_GAIN_SPK_L\ 144 + (RT700_SET_AMP_GAIN_MUTE_L | RT700_SPK_OUT) 145 + #define RT700_SET_GAIN_SPK_H\ 146 + (RT700_SET_AMP_GAIN_MUTE_H | RT700_SPK_OUT) 147 + #define RT700_SET_EAPD_SPK\ 148 + (RT700_VERB_SET_EAPD_BTLENABLE | RT700_SPK_OUT) 149 + 150 + /* combo jack auto switch control 2 (0x46)(NID:20h) */ 151 + #define RT700_COMBOJACK_AUTO_DET_STATUS (0x1 << 11) 152 + #define RT700_COMBOJACK_AUTO_DET_TRS (0x1 << 10) 153 + #define RT700_COMBOJACK_AUTO_DET_CTIA (0x1 << 9) 154 + #define RT700_COMBOJACK_AUTO_DET_OMTP (0x1 << 8) 155 + 156 + #define RT700_EAPD_HIGH 0x2 157 + #define RT700_EAPD_LOW 0x0 158 + #define RT700_MUTE_SFT 7 159 + #define RT700_DIR_IN_SFT 6 160 + #define RT700_DIR_OUT_SFT 7 161 + 162 + enum { 163 + RT700_AIF1, 164 + RT700_AIF2, 165 + RT700_AIFS, 166 + }; 167 + 168 + int rt700_io_init(struct device *dev, struct sdw_slave *slave); 169 + int rt700_init(struct device *dev, struct regmap *sdw_regmap, 170 + struct regmap *regmap, struct sdw_slave *slave); 171 + 172 + int rt700_jack_detect(struct rt700_priv *rt700, bool *hp, bool *mic); 173 + int rt700_clock_config(struct device *dev); 174 + #endif /* __RT700_H__ */