Linux Audio

Check our new training course

Loading...
v6.2
   1// SPDX-License-Identifier: GPL-2.0
   2//
   3// rt711.c -- rt711 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/kernel.h>
  12#include <linux/init.h>
  13#include <linux/delay.h>
  14#include <linux/pm_runtime.h>
  15#include <linux/pm.h>
  16#include <linux/soundwire/sdw.h>
  17#include <linux/regmap.h>
  18#include <linux/slab.h>
  19#include <sound/core.h>
  20#include <sound/pcm.h>
  21#include <sound/pcm_params.h>
  22#include <sound/sdw.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 "rt711.h"
  31
  32static int rt711_index_write(struct regmap *regmap,
  33		unsigned int nid, unsigned int reg, unsigned int value)
  34{
  35	int ret;
  36	unsigned int addr = ((RT711_PRIV_INDEX_W_H | nid) << 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
  46static int rt711_index_read(struct regmap *regmap,
  47		unsigned int nid, unsigned int reg, unsigned int *value)
  48{
  49	int ret;
  50	unsigned int addr = ((RT711_PRIV_INDEX_W_H | nid) << 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
  61static int rt711_index_update_bits(struct regmap *regmap, unsigned int nid,
  62			unsigned int reg, unsigned int mask, unsigned int val)
  63{
  64	unsigned int tmp, orig;
  65	int ret;
  66
  67	ret = rt711_index_read(regmap, nid, reg, &orig);
  68	if (ret < 0)
  69		return ret;
  70
  71	tmp = orig & ~mask;
  72	tmp |= val & mask;
  73
  74	return rt711_index_write(regmap, nid, reg, tmp);
  75}
  76
  77static void rt711_reset(struct regmap *regmap)
  78{
  79	regmap_write(regmap, RT711_FUNC_RESET, 0);
  80	rt711_index_update_bits(regmap, RT711_VENDOR_REG,
  81		RT711_PARA_VERB_CTL, RT711_HIDDEN_REG_SW_RESET,
  82		RT711_HIDDEN_REG_SW_RESET);
  83}
  84
  85static int rt711_calibration(struct rt711_priv *rt711)
  86{
  87	unsigned int val, loop = 0;
  88	struct device *dev;
  89	struct regmap *regmap = rt711->regmap;
  90	int ret = 0;
  91
  92	mutex_lock(&rt711->calibrate_mutex);
  93	regmap_write(rt711->regmap,
  94		RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
  95
  96	dev = regmap_get_device(regmap);
  97
  98	/* Calibration manual mode */
  99	rt711_index_update_bits(regmap, RT711_VENDOR_REG, RT711_FSM_CTL,
 100		0xf, 0x0);
 101
 102	/* trigger */
 103	rt711_index_update_bits(regmap, RT711_VENDOR_CALI,
 104		RT711_DAC_DC_CALI_CTL1, RT711_DAC_DC_CALI_TRIGGER,
 105		RT711_DAC_DC_CALI_TRIGGER);
 106
 107	/* wait for calibration process */
 108	rt711_index_read(regmap, RT711_VENDOR_CALI,
 109		RT711_DAC_DC_CALI_CTL1, &val);
 110
 111	while (val & RT711_DAC_DC_CALI_TRIGGER) {
 112		if (loop >= 500) {
 113			pr_err("%s, calibration time-out!\n",
 114							__func__);
 115			ret = -ETIMEDOUT;
 116			break;
 117		}
 118		loop++;
 119
 120		usleep_range(10000, 11000);
 121		rt711_index_read(regmap, RT711_VENDOR_CALI,
 122			RT711_DAC_DC_CALI_CTL1, &val);
 123	}
 124
 125	/* depop mode */
 126	rt711_index_update_bits(regmap, RT711_VENDOR_REG,
 127		RT711_FSM_CTL, 0xf, RT711_DEPOP_CTL);
 128
 129	regmap_write(rt711->regmap,
 130		RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
 131	mutex_unlock(&rt711->calibrate_mutex);
 132
 133	dev_dbg(dev, "%s calibration complete, ret=%d\n", __func__, ret);
 134	return ret;
 135}
 136
 137static unsigned int rt711_button_detect(struct rt711_priv *rt711)
 138{
 139	unsigned int btn_type = 0, val80, val81;
 140	int ret;
 141
 142	ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
 143				RT711_IRQ_FLAG_TABLE1, &val80);
 144	if (ret < 0)
 145		goto read_error;
 146	ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
 147					RT711_IRQ_FLAG_TABLE2, &val81);
 148	if (ret < 0)
 149		goto read_error;
 150
 151	val80 &= 0x0381;
 152	val81 &= 0xff00;
 153
 154	switch (val80) {
 155	case 0x0200:
 156	case 0x0100:
 157	case 0x0080:
 158		btn_type |= SND_JACK_BTN_0;
 159		break;
 160	case 0x0001:
 161		btn_type |= SND_JACK_BTN_3;
 162		break;
 163	}
 164	switch (val81) {
 165	case 0x8000:
 166	case 0x4000:
 167	case 0x2000:
 168		btn_type |= SND_JACK_BTN_1;
 169		break;
 170	case 0x1000:
 171	case 0x0800:
 172	case 0x0400:
 173		btn_type |= SND_JACK_BTN_2;
 174		break;
 175	case 0x0200:
 176	case 0x0100:
 177		btn_type |= SND_JACK_BTN_3;
 178		break;
 179	}
 180read_error:
 181	return btn_type;
 182}
 183
 184static int rt711_headset_detect(struct rt711_priv *rt711)
 185{
 186	unsigned int buf, loop = 0;
 187	int ret;
 188	unsigned int jack_status = 0, reg;
 189
 190	ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
 191				RT711_COMBO_JACK_AUTO_CTL2, &buf);
 192	if (ret < 0)
 193		goto io_error;
 194
 195	while (loop < 500 &&
 196		(buf & RT711_COMBOJACK_AUTO_DET_STATUS) == 0) {
 197		loop++;
 198
 199		usleep_range(9000, 10000);
 200		ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
 201					RT711_COMBO_JACK_AUTO_CTL2, &buf);
 202		if (ret < 0)
 203			goto io_error;
 204
 205		reg = RT711_VERB_GET_PIN_SENSE | RT711_HP_OUT;
 206		ret = regmap_read(rt711->regmap, reg, &jack_status);
 207		if (ret < 0)
 208			goto io_error;
 209		if ((jack_status & (1 << 31)) == 0)
 210			goto remove_error;
 211	}
 212
 213	if (loop >= 500)
 214		goto to_error;
 215
 216	if (buf & RT711_COMBOJACK_AUTO_DET_TRS)
 217		rt711->jack_type = SND_JACK_HEADPHONE;
 218	else if ((buf & RT711_COMBOJACK_AUTO_DET_CTIA) ||
 219		(buf & RT711_COMBOJACK_AUTO_DET_OMTP))
 220		rt711->jack_type = SND_JACK_HEADSET;
 221
 222	return 0;
 223
 224to_error:
 225	ret = -ETIMEDOUT;
 226	pr_err_ratelimited("Time-out error in %s\n", __func__);
 227	return ret;
 228io_error:
 229	pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret);
 230	return ret;
 231remove_error:
 232	pr_err_ratelimited("Jack removal in %s\n", __func__);
 233	return -ENODEV;
 234}
 235
 236static void rt711_jack_detect_handler(struct work_struct *work)
 237{
 238	struct rt711_priv *rt711 =
 239		container_of(work, struct rt711_priv, jack_detect_work.work);
 240	int btn_type = 0, ret;
 241	unsigned int jack_status = 0, reg;
 242
 243	if (!rt711->hs_jack)
 244		return;
 245
 246	if (!rt711->component->card || !rt711->component->card->instantiated)
 247		return;
 248
 249	if (pm_runtime_status_suspended(rt711->slave->dev.parent)) {
 250		dev_dbg(&rt711->slave->dev,
 251			"%s: parent device is pm_runtime_status_suspended, skipping jack detection\n",
 252			__func__);
 253		return;
 254	}
 255
 256	reg = RT711_VERB_GET_PIN_SENSE | RT711_HP_OUT;
 257	ret = regmap_read(rt711->regmap, reg, &jack_status);
 258	if (ret < 0)
 259		goto io_error;
 260
 261	/* pin attached */
 262	if (jack_status & (1 << 31)) {
 263		/* jack in */
 264		if (rt711->jack_type == 0) {
 265			ret = rt711_headset_detect(rt711);
 266			if (ret < 0)
 267				return;
 268			if (rt711->jack_type == SND_JACK_HEADSET)
 269				btn_type = rt711_button_detect(rt711);
 270		} else if (rt711->jack_type == SND_JACK_HEADSET) {
 271			/* jack is already in, report button event */
 272			btn_type = rt711_button_detect(rt711);
 273		}
 274	} else {
 275		/* jack out */
 276		rt711->jack_type = 0;
 277	}
 278
 279	dev_dbg(&rt711->slave->dev,
 280		"in %s, jack_type=0x%x\n", __func__, rt711->jack_type);
 281	dev_dbg(&rt711->slave->dev,
 282		"in %s, btn_type=0x%x\n", __func__, btn_type);
 283
 284	snd_soc_jack_report(rt711->hs_jack, rt711->jack_type | btn_type,
 285			SND_JACK_HEADSET |
 286			SND_JACK_BTN_0 | SND_JACK_BTN_1 |
 287			SND_JACK_BTN_2 | SND_JACK_BTN_3);
 288
 289	if (btn_type) {
 290		/* button released */
 291		snd_soc_jack_report(rt711->hs_jack, rt711->jack_type,
 292			SND_JACK_HEADSET |
 293			SND_JACK_BTN_0 | SND_JACK_BTN_1 |
 294			SND_JACK_BTN_2 | SND_JACK_BTN_3);
 295
 296		mod_delayed_work(system_power_efficient_wq,
 297			&rt711->jack_btn_check_work, msecs_to_jiffies(200));
 298	}
 299
 300	return;
 301
 302io_error:
 303	pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret);
 304}
 305
 306static void rt711_btn_check_handler(struct work_struct *work)
 307{
 308	struct rt711_priv *rt711 = container_of(work, struct rt711_priv,
 309		jack_btn_check_work.work);
 310	int btn_type = 0, ret;
 311	unsigned int jack_status = 0, reg;
 312
 313	reg = RT711_VERB_GET_PIN_SENSE | RT711_HP_OUT;
 314	ret = regmap_read(rt711->regmap, reg, &jack_status);
 315	if (ret < 0)
 316		goto io_error;
 317
 318	/* pin attached */
 319	if (jack_status & (1 << 31)) {
 320		if (rt711->jack_type == SND_JACK_HEADSET) {
 321			/* jack is already in, report button event */
 322			btn_type = rt711_button_detect(rt711);
 323		}
 324	} else {
 325		rt711->jack_type = 0;
 326	}
 327
 328	/* cbj comparator */
 329	ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
 330		RT711_COMBO_JACK_AUTO_CTL2, &reg);
 331	if (ret < 0)
 332		goto io_error;
 333
 334	if ((reg & 0xf0) == 0xf0)
 335		btn_type = 0;
 336
 337	dev_dbg(&rt711->slave->dev,
 338		"%s, btn_type=0x%x\n",	__func__, btn_type);
 339	snd_soc_jack_report(rt711->hs_jack, rt711->jack_type | btn_type,
 340			SND_JACK_HEADSET |
 341			SND_JACK_BTN_0 | SND_JACK_BTN_1 |
 342			SND_JACK_BTN_2 | SND_JACK_BTN_3);
 343
 344	if (btn_type) {
 345		/* button released */
 346		snd_soc_jack_report(rt711->hs_jack, rt711->jack_type,
 347			SND_JACK_HEADSET |
 348			SND_JACK_BTN_0 | SND_JACK_BTN_1 |
 349			SND_JACK_BTN_2 | SND_JACK_BTN_3);
 350
 351		mod_delayed_work(system_power_efficient_wq,
 352			&rt711->jack_btn_check_work, msecs_to_jiffies(200));
 353	}
 354
 355	return;
 356
 357io_error:
 358	pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret);
 359}
 360
 361static void rt711_jack_init(struct rt711_priv *rt711)
 362{
 363	struct snd_soc_dapm_context *dapm =
 364		snd_soc_component_get_dapm(rt711->component);
 365
 366	mutex_lock(&rt711->calibrate_mutex);
 367	/* power on */
 368	if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
 369		regmap_write(rt711->regmap,
 370			RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
 371
 372	if (rt711->hs_jack) {
 373		/* unsolicited response & IRQ control */
 374		regmap_write(rt711->regmap,
 375			RT711_SET_MIC2_UNSOLICITED_ENABLE, 0x82);
 376		regmap_write(rt711->regmap,
 377			RT711_SET_HP_UNSOLICITED_ENABLE, 0x81);
 378		regmap_write(rt711->regmap,
 379			RT711_SET_INLINE_UNSOLICITED_ENABLE, 0x83);
 380		rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
 381			0x10, 0x2420);
 382		rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
 383			0x19, 0x2e11);
 384
 385		switch (rt711->jd_src) {
 386		case RT711_JD1:
 387			/* default settings was already for JD1 */
 388			break;
 389		case RT711_JD2:
 390			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
 391				RT711_JD_CTL2, RT711_JD2_2PORT_200K_DECODE_HP |
 392				RT711_HP_JD_SEL_JD2,
 393				RT711_JD2_2PORT_200K_DECODE_HP |
 394				RT711_HP_JD_SEL_JD2);
 395			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
 396				RT711_CC_DET1,
 397				RT711_HP_JD_FINAL_RESULT_CTL_JD12,
 398				RT711_HP_JD_FINAL_RESULT_CTL_JD12);
 399			break;
 400		case RT711_JD2_100K:
 401			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
 402				RT711_JD_CTL2, RT711_JD2_2PORT_100K_DECODE | RT711_JD2_1PORT_TYPE_DECODE |
 403				RT711_HP_JD_SEL_JD2 | RT711_JD1_2PORT_TYPE_100K_DECODE,
 404				RT711_JD2_2PORT_100K_DECODE_HP | RT711_JD2_1PORT_JD_HP |
 405				RT711_HP_JD_SEL_JD2 | RT711_JD1_2PORT_JD_RESERVED);
 406			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
 407				RT711_CC_DET1,
 408				RT711_HP_JD_FINAL_RESULT_CTL_JD12,
 409				RT711_HP_JD_FINAL_RESULT_CTL_JD12);
 410			break;
 411		case RT711_JD2_1P8V_1PORT:
 412			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
 413				RT711_JD_CTL1, RT711_JD2_DIGITAL_JD_MODE_SEL,
 414				RT711_JD2_1_JD_MODE);
 415			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
 416				RT711_JD_CTL2, RT711_JD2_1PORT_TYPE_DECODE |
 417				RT711_HP_JD_SEL_JD2,
 418				RT711_JD2_1PORT_JD_HP |
 419				RT711_HP_JD_SEL_JD2);
 420			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
 421				RT711_JD_CTL4, RT711_JD2_PAD_PULL_UP_MASK |
 422				RT711_JD2_MODE_SEL_MASK,
 423				RT711_JD2_PAD_PULL_UP |
 424				RT711_JD2_MODE2_1P8V_1PORT);
 425			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
 426				RT711_CC_DET1,
 427				RT711_HP_JD_FINAL_RESULT_CTL_JD12,
 428				RT711_HP_JD_FINAL_RESULT_CTL_JD12);
 429			break;
 430		default:
 431			dev_warn(rt711->component->dev, "Wrong JD source\n");
 432			break;
 433		}
 434
 435		dev_dbg(&rt711->slave->dev, "in %s enable\n", __func__);
 436
 437		mod_delayed_work(system_power_efficient_wq,
 438			&rt711->jack_detect_work, msecs_to_jiffies(250));
 439	} else {
 440		regmap_write(rt711->regmap,
 441			RT711_SET_MIC2_UNSOLICITED_ENABLE, 0x00);
 442		regmap_write(rt711->regmap,
 443			RT711_SET_HP_UNSOLICITED_ENABLE, 0x00);
 444		regmap_write(rt711->regmap,
 445			RT711_SET_INLINE_UNSOLICITED_ENABLE, 0x00);
 446
 447		dev_dbg(&rt711->slave->dev, "in %s disable\n", __func__);
 448	}
 449
 450	/* power off */
 451	if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
 452		regmap_write(rt711->regmap,
 453			RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
 454	mutex_unlock(&rt711->calibrate_mutex);
 455}
 456
 457static int rt711_set_jack_detect(struct snd_soc_component *component,
 458	struct snd_soc_jack *hs_jack, void *data)
 459{
 460	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 461	int ret;
 462
 463	rt711->hs_jack = hs_jack;
 464
 465	ret = pm_runtime_resume_and_get(component->dev);
 466	if (ret < 0) {
 467		if (ret != -EACCES) {
 468			dev_err(component->dev, "%s: failed to resume %d\n", __func__, ret);
 469			return ret;
 470		}
 471
 472		/* pm_runtime not enabled yet */
 473		dev_dbg(component->dev,	"%s: skipping jack init for now\n", __func__);
 474		return 0;
 475	}
 476
 477	rt711_jack_init(rt711);
 478
 479	pm_runtime_mark_last_busy(component->dev);
 480	pm_runtime_put_autosuspend(component->dev);
 481
 482	return 0;
 483}
 484
 485static void rt711_get_gain(struct rt711_priv *rt711, unsigned int addr_h,
 486				unsigned int addr_l, unsigned int val_h,
 487				unsigned int *r_val, unsigned int *l_val)
 488{
 489	/* R Channel */
 490	*r_val = (val_h << 8);
 491	regmap_read(rt711->regmap, addr_l, r_val);
 492
 493	/* L Channel */
 494	val_h |= 0x20;
 495	*l_val = (val_h << 8);
 496	regmap_read(rt711->regmap, addr_h, l_val);
 497}
 498
 499/* For Verb-Set Amplifier Gain (Verb ID = 3h) */
 500static int rt711_set_amp_gain_put(struct snd_kcontrol *kcontrol,
 501		struct snd_ctl_elem_value *ucontrol)
 502{
 503	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
 504	struct snd_soc_dapm_context *dapm =
 505		snd_soc_component_get_dapm(component);
 506	struct soc_mixer_control *mc =
 507		(struct soc_mixer_control *)kcontrol->private_value;
 508	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 509	unsigned int addr_h, addr_l, val_h, val_ll, val_lr;
 510	unsigned int read_ll, read_rl;
 511	int i;
 512
 513	mutex_lock(&rt711->calibrate_mutex);
 514
 515	/* Can't use update bit function, so read the original value first */
 516	addr_h = mc->reg;
 517	addr_l = mc->rreg;
 518	if (mc->shift == RT711_DIR_OUT_SFT) /* output */
 519		val_h = 0x80;
 520	else /* input */
 521		val_h = 0x0;
 522
 523	rt711_get_gain(rt711, addr_h, addr_l, val_h, &read_rl, &read_ll);
 524
 525	/* L Channel */
 526	if (mc->invert) {
 527		/* for mute/unmute */
 528		val_ll = (mc->max - ucontrol->value.integer.value[0])
 529					<< RT711_MUTE_SFT;
 530		/* keep gain */
 531		read_ll = read_ll & 0x7f;
 532		val_ll |= read_ll;
 533	} else {
 534		/* for gain */
 535		val_ll = ((ucontrol->value.integer.value[0]) & 0x7f);
 536		if (val_ll > mc->max)
 537			val_ll = mc->max;
 538		/* keep mute status */
 539		read_ll = read_ll & (1 << RT711_MUTE_SFT);
 540		val_ll |= read_ll;
 541	}
 542
 543	if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
 544		regmap_write(rt711->regmap,
 545				RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
 546
 547	/* R Channel */
 548	if (mc->invert) {
 549		/* for mute/unmute */
 550		val_lr = (mc->max - ucontrol->value.integer.value[1])
 551					<< RT711_MUTE_SFT;
 552		/* keep gain */
 553		read_rl = read_rl & 0x7f;
 554		val_lr |= read_rl;
 555	} else {
 556		/* for gain */
 557		val_lr = ((ucontrol->value.integer.value[1]) & 0x7f);
 558		if (val_lr > mc->max)
 559			val_lr = mc->max;
 560		/* keep mute status */
 561		read_rl = read_rl & (1 << RT711_MUTE_SFT);
 562		val_lr |= read_rl;
 563	}
 564
 565	for (i = 0; i < 3; i++) { /* retry 3 times at most */
 566
 567		if (val_ll == val_lr) {
 568			/* Set both L/R channels at the same time */
 569			val_h = (1 << mc->shift) | (3 << 4);
 570			regmap_write(rt711->regmap,
 571				addr_h, (val_h << 8 | val_ll));
 572			regmap_write(rt711->regmap,
 573				addr_l, (val_h << 8 | val_ll));
 574		} else {
 575			/* Lch*/
 576			val_h = (1 << mc->shift) | (1 << 5);
 577			regmap_write(rt711->regmap,
 578				addr_h, (val_h << 8 | val_ll));
 579
 580			/* Rch */
 581			val_h = (1 << mc->shift) | (1 << 4);
 582			regmap_write(rt711->regmap,
 583				addr_l, (val_h << 8 | val_lr));
 584		}
 585		/* check result */
 586		if (mc->shift == RT711_DIR_OUT_SFT) /* output */
 587			val_h = 0x80;
 588		else /* input */
 589			val_h = 0x0;
 590
 591		rt711_get_gain(rt711, addr_h, addr_l, val_h,
 592					&read_rl, &read_ll);
 593		if (read_rl == val_lr && read_ll == val_ll)
 594			break;
 595	}
 596
 597	if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
 598		regmap_write(rt711->regmap,
 599				RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
 600
 601	mutex_unlock(&rt711->calibrate_mutex);
 602	return 0;
 603}
 604
 605static int rt711_set_amp_gain_get(struct snd_kcontrol *kcontrol,
 606		struct snd_ctl_elem_value *ucontrol)
 607{
 608	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
 609	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 610	struct soc_mixer_control *mc =
 611		(struct soc_mixer_control *)kcontrol->private_value;
 612	unsigned int addr_h, addr_l, val_h;
 613	unsigned int read_ll, read_rl;
 614
 615	/* switch to get command */
 616	addr_h = mc->reg;
 617	addr_l = mc->rreg;
 618	if (mc->shift == RT711_DIR_OUT_SFT) /* output */
 619		val_h = 0x80;
 620	else /* input */
 621		val_h = 0x0;
 622
 623	rt711_get_gain(rt711, addr_h, addr_l, val_h, &read_rl, &read_ll);
 624
 625	if (mc->invert) {
 626		/* mute/unmute for switch controls */
 627		read_ll = !((read_ll & 0x80) >> RT711_MUTE_SFT);
 628		read_rl = !((read_rl & 0x80) >> RT711_MUTE_SFT);
 629	} else {
 630		/* for gain volume controls */
 631		read_ll = read_ll & 0x7f;
 632		read_rl = read_rl & 0x7f;
 633	}
 634	ucontrol->value.integer.value[0] = read_ll;
 635	ucontrol->value.integer.value[1] = read_rl;
 636
 637	return 0;
 638}
 639
 640static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -6525, 75, 0);
 641static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -1725, 75, 0);
 642static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, 0, 1000, 0);
 643
 644static const struct snd_kcontrol_new rt711_snd_controls[] = {
 645	SOC_DOUBLE_R_EXT_TLV("DAC Surr Playback Volume",
 646		RT711_SET_GAIN_DAC2_H, RT711_SET_GAIN_DAC2_L,
 647		RT711_DIR_OUT_SFT, 0x57, 0,
 648		rt711_set_amp_gain_get, rt711_set_amp_gain_put, out_vol_tlv),
 649	SOC_DOUBLE_R_EXT("ADC 08 Capture Switch",
 650		RT711_SET_GAIN_ADC2_H, RT711_SET_GAIN_ADC2_L,
 651		RT711_DIR_IN_SFT, 1, 1,
 652		rt711_set_amp_gain_get, rt711_set_amp_gain_put),
 653	SOC_DOUBLE_R_EXT("ADC 09 Capture Switch",
 654		RT711_SET_GAIN_ADC1_H, RT711_SET_GAIN_ADC1_L,
 655		RT711_DIR_IN_SFT, 1, 1,
 656		rt711_set_amp_gain_get, rt711_set_amp_gain_put),
 657	SOC_DOUBLE_R_EXT_TLV("ADC 08 Capture Volume",
 658		RT711_SET_GAIN_ADC2_H, RT711_SET_GAIN_ADC2_L,
 659		RT711_DIR_IN_SFT, 0x3f, 0,
 660		rt711_set_amp_gain_get, rt711_set_amp_gain_put, in_vol_tlv),
 661	SOC_DOUBLE_R_EXT_TLV("ADC 09 Capture Volume",
 662		RT711_SET_GAIN_ADC1_H, RT711_SET_GAIN_ADC1_L,
 663		RT711_DIR_IN_SFT, 0x3f, 0,
 664		rt711_set_amp_gain_get, rt711_set_amp_gain_put, in_vol_tlv),
 665	SOC_DOUBLE_R_EXT_TLV("AMIC Volume",
 666		RT711_SET_GAIN_AMIC_H, RT711_SET_GAIN_AMIC_L,
 667		RT711_DIR_IN_SFT, 3, 0,
 668		rt711_set_amp_gain_get, rt711_set_amp_gain_put, mic_vol_tlv),
 669	SOC_DOUBLE_R_EXT_TLV("DMIC1 Volume",
 670		RT711_SET_GAIN_DMIC1_H, RT711_SET_GAIN_DMIC1_L,
 671		RT711_DIR_IN_SFT, 3, 0,
 672		rt711_set_amp_gain_get, rt711_set_amp_gain_put, mic_vol_tlv),
 673	SOC_DOUBLE_R_EXT_TLV("DMIC2 Volume",
 674		RT711_SET_GAIN_DMIC2_H, RT711_SET_GAIN_DMIC2_L,
 675		RT711_DIR_IN_SFT, 3, 0,
 676		rt711_set_amp_gain_get, rt711_set_amp_gain_put, mic_vol_tlv),
 677};
 678
 679static int rt711_mux_get(struct snd_kcontrol *kcontrol,
 680			struct snd_ctl_elem_value *ucontrol)
 681{
 682	struct snd_soc_component *component =
 683		snd_soc_dapm_kcontrol_component(kcontrol);
 684	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 685	unsigned int reg, val = 0, nid;
 686	int ret;
 687
 688	if (strstr(ucontrol->id.name, "ADC 22 Mux"))
 689		nid = RT711_MIXER_IN1;
 690	else if (strstr(ucontrol->id.name, "ADC 23 Mux"))
 691		nid = RT711_MIXER_IN2;
 692	else
 693		return -EINVAL;
 694
 695	/* vid = 0xf01 */
 696	reg = RT711_VERB_SET_CONNECT_SEL | nid;
 697	ret = regmap_read(rt711->regmap, reg, &val);
 698	if (ret < 0) {
 699		dev_err(component->dev, "%s: sdw read failed: %d\n",
 700			__func__, ret);
 701		return ret;
 702	}
 703
 704	ucontrol->value.enumerated.item[0] = val;
 705
 706	return 0;
 707}
 708
 709static int rt711_mux_put(struct snd_kcontrol *kcontrol,
 710			struct snd_ctl_elem_value *ucontrol)
 711{
 712	struct snd_soc_component *component =
 713		snd_soc_dapm_kcontrol_component(kcontrol);
 714	struct snd_soc_dapm_context *dapm =
 715		snd_soc_dapm_kcontrol_dapm(kcontrol);
 716	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 717	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
 718	unsigned int *item = ucontrol->value.enumerated.item;
 719	unsigned int val, val2 = 0, change, reg, nid;
 720	int ret;
 721
 722	if (item[0] >= e->items)
 723		return -EINVAL;
 724
 725	if (strstr(ucontrol->id.name, "ADC 22 Mux"))
 726		nid = RT711_MIXER_IN1;
 727	else if (strstr(ucontrol->id.name, "ADC 23 Mux"))
 728		nid = RT711_MIXER_IN2;
 729	else
 730		return -EINVAL;
 731
 732	/* Verb ID = 0x701h */
 733	val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
 734
 735	reg = RT711_VERB_SET_CONNECT_SEL | nid;
 736	ret = regmap_read(rt711->regmap, reg, &val2);
 737	if (ret < 0) {
 738		dev_err(component->dev, "%s: sdw read failed: %d\n",
 739			__func__, ret);
 740		return ret;
 741	}
 742
 743	if (val == val2)
 744		change = 0;
 745	else
 746		change = 1;
 747
 748	if (change) {
 749		reg = RT711_VERB_SET_CONNECT_SEL | nid;
 750		regmap_write(rt711->regmap, reg, val);
 751	}
 752
 753	snd_soc_dapm_mux_update_power(dapm, kcontrol,
 754						item[0], e, NULL);
 755
 756	return change;
 757}
 758
 759static const char * const adc_mux_text[] = {
 760	"MIC2",
 761	"LINE1",
 762	"LINE2",
 763	"DMIC",
 764};
 765
 766static SOC_ENUM_SINGLE_DECL(
 767	rt711_adc22_enum, SND_SOC_NOPM, 0, adc_mux_text);
 768
 769static SOC_ENUM_SINGLE_DECL(
 770	rt711_adc23_enum, SND_SOC_NOPM, 0, adc_mux_text);
 771
 772static const struct snd_kcontrol_new rt711_adc22_mux =
 773	SOC_DAPM_ENUM_EXT("ADC 22 Mux", rt711_adc22_enum,
 774			rt711_mux_get, rt711_mux_put);
 775
 776static const struct snd_kcontrol_new rt711_adc23_mux =
 777	SOC_DAPM_ENUM_EXT("ADC 23 Mux", rt711_adc23_enum,
 778			rt711_mux_get, rt711_mux_put);
 779
 780static int rt711_dac_surround_event(struct snd_soc_dapm_widget *w,
 781	struct snd_kcontrol *kcontrol, int event)
 782{
 783	struct snd_soc_component *component =
 784		snd_soc_dapm_to_component(w->dapm);
 785	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 786	unsigned int val_h = (1 << RT711_DIR_OUT_SFT) | (0x3 << 4);
 787	unsigned int val_l;
 788
 789	switch (event) {
 790	case SND_SOC_DAPM_POST_PMU:
 791		regmap_write(rt711->regmap,
 792			RT711_SET_STREAMID_DAC2, 0x10);
 793
 794		val_l = 0x00;
 795		regmap_write(rt711->regmap,
 796			RT711_SET_GAIN_HP_H, (val_h << 8 | val_l));
 797		break;
 798	case SND_SOC_DAPM_PRE_PMD:
 799		val_l = (1 << RT711_MUTE_SFT);
 800		regmap_write(rt711->regmap,
 801			RT711_SET_GAIN_HP_H, (val_h << 8 | val_l));
 802		usleep_range(50000, 55000);
 803
 804		regmap_write(rt711->regmap,
 805			RT711_SET_STREAMID_DAC2, 0x00);
 806		break;
 807	}
 808	return 0;
 809}
 810
 811static int rt711_adc_09_event(struct snd_soc_dapm_widget *w,
 812	struct snd_kcontrol *kcontrol, int event)
 813{
 814	struct snd_soc_component *component =
 815		snd_soc_dapm_to_component(w->dapm);
 816	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 817
 818	switch (event) {
 819	case SND_SOC_DAPM_POST_PMU:
 820		regmap_write(rt711->regmap,
 821			RT711_SET_STREAMID_ADC1, 0x10);
 822		break;
 823	case SND_SOC_DAPM_PRE_PMD:
 824		regmap_write(rt711->regmap,
 825			RT711_SET_STREAMID_ADC1, 0x00);
 826		break;
 827	}
 828	return 0;
 829}
 830
 831static int rt711_adc_08_event(struct snd_soc_dapm_widget *w,
 832	struct snd_kcontrol *kcontrol, int event)
 833{
 834	struct snd_soc_component *component =
 835		snd_soc_dapm_to_component(w->dapm);
 836	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 837
 838	switch (event) {
 839	case SND_SOC_DAPM_POST_PMU:
 840		regmap_write(rt711->regmap,
 841			RT711_SET_STREAMID_ADC2, 0x10);
 842		break;
 843	case SND_SOC_DAPM_PRE_PMD:
 844		regmap_write(rt711->regmap,
 845			RT711_SET_STREAMID_ADC2, 0x00);
 846		break;
 847	}
 848	return 0;
 849}
 850
 851static const struct snd_soc_dapm_widget rt711_dapm_widgets[] = {
 852	SND_SOC_DAPM_OUTPUT("HP"),
 853	SND_SOC_DAPM_INPUT("MIC2"),
 854	SND_SOC_DAPM_INPUT("DMIC1"),
 855	SND_SOC_DAPM_INPUT("DMIC2"),
 856	SND_SOC_DAPM_INPUT("LINE1"),
 857	SND_SOC_DAPM_INPUT("LINE2"),
 858
 859	SND_SOC_DAPM_DAC_E("DAC Surround", NULL, SND_SOC_NOPM, 0, 0,
 860		rt711_dac_surround_event,
 861		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
 862	SND_SOC_DAPM_ADC_E("ADC 09", NULL, SND_SOC_NOPM, 0, 0,
 863		rt711_adc_09_event,
 864		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
 865	SND_SOC_DAPM_ADC_E("ADC 08", NULL, SND_SOC_NOPM, 0, 0,
 866		rt711_adc_08_event,
 867		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
 868	SND_SOC_DAPM_MUX("ADC 22 Mux", SND_SOC_NOPM, 0, 0,
 869		&rt711_adc22_mux),
 870	SND_SOC_DAPM_MUX("ADC 23 Mux", SND_SOC_NOPM, 0, 0,
 871		&rt711_adc23_mux),
 872
 873	SND_SOC_DAPM_AIF_IN("DP3RX", "DP3 Playback", 0, SND_SOC_NOPM, 0, 0),
 874	SND_SOC_DAPM_AIF_OUT("DP2TX", "DP2 Capture", 0, SND_SOC_NOPM, 0, 0),
 875	SND_SOC_DAPM_AIF_OUT("DP4TX", "DP4 Capture", 0, SND_SOC_NOPM, 0, 0),
 876};
 877
 878static const struct snd_soc_dapm_route rt711_audio_map[] = {
 879	{"DAC Surround", NULL, "DP3RX"},
 880	{"DP2TX", NULL, "ADC 09"},
 881	{"DP4TX", NULL, "ADC 08"},
 882
 883	{"ADC 09", NULL, "ADC 22 Mux"},
 884	{"ADC 08", NULL, "ADC 23 Mux"},
 885	{"ADC 22 Mux", "DMIC", "DMIC1"},
 886	{"ADC 22 Mux", "LINE1", "LINE1"},
 887	{"ADC 22 Mux", "LINE2", "LINE2"},
 888	{"ADC 22 Mux", "MIC2", "MIC2"},
 889	{"ADC 23 Mux", "DMIC", "DMIC2"},
 890	{"ADC 23 Mux", "LINE1", "LINE1"},
 891	{"ADC 23 Mux", "LINE2", "LINE2"},
 892	{"ADC 23 Mux", "MIC2", "MIC2"},
 893
 894	{"HP", NULL, "DAC Surround"},
 895};
 896
 897static int rt711_set_bias_level(struct snd_soc_component *component,
 898				enum snd_soc_bias_level level)
 899{
 900	struct snd_soc_dapm_context *dapm =
 901		snd_soc_component_get_dapm(component);
 902	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 903
 904	switch (level) {
 905	case SND_SOC_BIAS_PREPARE:
 906		if (dapm->bias_level == SND_SOC_BIAS_STANDBY) {
 907			regmap_write(rt711->regmap,
 908				RT711_SET_AUDIO_POWER_STATE,
 909				AC_PWRST_D0);
 910		}
 911		break;
 912
 913	case SND_SOC_BIAS_STANDBY:
 914		mutex_lock(&rt711->calibrate_mutex);
 915		regmap_write(rt711->regmap,
 916			RT711_SET_AUDIO_POWER_STATE,
 917			AC_PWRST_D3);
 918		mutex_unlock(&rt711->calibrate_mutex);
 919		break;
 920
 921	default:
 922		break;
 923	}
 924
 925	return 0;
 926}
 927
 928static int rt711_parse_dt(struct rt711_priv *rt711, struct device *dev)
 929{
 930	device_property_read_u32(dev, "realtek,jd-src",
 931		&rt711->jd_src);
 932
 933	return 0;
 934}
 935
 936static int rt711_probe(struct snd_soc_component *component)
 937{
 938	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 939	int ret;
 940
 941	rt711_parse_dt(rt711, &rt711->slave->dev);
 942	rt711->component = component;
 943
 944	ret = pm_runtime_resume(component->dev);
 945	if (ret < 0 && ret != -EACCES)
 946		return ret;
 947
 948	return 0;
 949}
 950
 
 
 
 
 
 
 
 951static const struct snd_soc_component_driver soc_codec_dev_rt711 = {
 952	.probe = rt711_probe,
 953	.set_bias_level = rt711_set_bias_level,
 954	.controls = rt711_snd_controls,
 955	.num_controls = ARRAY_SIZE(rt711_snd_controls),
 956	.dapm_widgets = rt711_dapm_widgets,
 957	.num_dapm_widgets = ARRAY_SIZE(rt711_dapm_widgets),
 958	.dapm_routes = rt711_audio_map,
 959	.num_dapm_routes = ARRAY_SIZE(rt711_audio_map),
 960	.set_jack = rt711_set_jack_detect,
 961	.endianness = 1,
 962};
 963
 964static int rt711_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream,
 965				int direction)
 966{
 967	struct sdw_stream_data *stream;
 968
 969	if (!sdw_stream)
 970		return 0;
 971
 972	stream = kzalloc(sizeof(*stream), GFP_KERNEL);
 973	if (!stream)
 974		return -ENOMEM;
 975
 976	stream->sdw_stream = sdw_stream;
 977
 978	/* Use tx_mask or rx_mask to configure stream tag and set dma_data */
 979	if (direction == SNDRV_PCM_STREAM_PLAYBACK)
 980		dai->playback_dma_data = stream;
 981	else
 982		dai->capture_dma_data = stream;
 983
 984	return 0;
 985}
 986
 987static void rt711_shutdown(struct snd_pcm_substream *substream,
 988				struct snd_soc_dai *dai)
 989{
 990	struct sdw_stream_data *stream;
 991
 992	stream = snd_soc_dai_get_dma_data(dai, substream);
 993	snd_soc_dai_set_dma_data(dai, substream, NULL);
 994	kfree(stream);
 995}
 996
 997static int rt711_pcm_hw_params(struct snd_pcm_substream *substream,
 998				struct snd_pcm_hw_params *params,
 999				struct snd_soc_dai *dai)
1000{
1001	struct snd_soc_component *component = dai->component;
1002	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
1003	struct sdw_stream_config stream_config = {0};
1004	struct sdw_port_config port_config = {0};
 
1005	struct sdw_stream_data *stream;
1006	int retval;
1007	unsigned int val = 0;
1008
1009	dev_dbg(dai->dev, "%s %s", __func__, dai->name);
1010	stream = snd_soc_dai_get_dma_data(dai, substream);
1011
1012	if (!stream)
1013		return -EINVAL;
1014
1015	if (!rt711->slave)
1016		return -EINVAL;
1017
1018	/* SoundWire specific configuration */
1019	snd_sdw_params_to_config(substream, params, &stream_config, &port_config);
1020
1021	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1022		port_config.num = 3;
 
1023	} else {
 
1024		if (dai->id == RT711_AIF1)
1025			port_config.num = 4;
1026		else if (dai->id == RT711_AIF2)
1027			port_config.num = 2;
1028		else
1029			return -EINVAL;
1030	}
1031
 
 
 
 
 
 
 
 
 
1032	retval = sdw_stream_add_slave(rt711->slave, &stream_config,
1033					&port_config, 1, stream->sdw_stream);
1034	if (retval) {
1035		dev_err(dai->dev, "Unable to configure port\n");
1036		return retval;
1037	}
1038
1039	if (params_channels(params) <= 16) {
1040		/* bit 3:0 Number of Channel */
1041		val |= (params_channels(params) - 1);
1042	} else {
1043		dev_err(component->dev, "Unsupported channels %d\n",
1044			params_channels(params));
1045		return -EINVAL;
1046	}
1047
1048	switch (params_width(params)) {
1049	/* bit 6:4 Bits per Sample */
1050	case 8:
1051		break;
1052	case 16:
1053		val |= (0x1 << 4);
1054		break;
1055	case 20:
1056		val |= (0x2 << 4);
1057		break;
1058	case 24:
1059		val |= (0x3 << 4);
1060		break;
1061	case 32:
1062		val |= (0x4 << 4);
1063		break;
1064	default:
1065		return -EINVAL;
1066	}
1067
1068	/* 48Khz */
1069	regmap_write(rt711->regmap, RT711_DAC_FORMAT_H, val);
1070	regmap_write(rt711->regmap, RT711_ADC1_FORMAT_H, val);
1071	regmap_write(rt711->regmap, RT711_ADC2_FORMAT_H, val);
1072
1073	return retval;
1074}
1075
1076static int rt711_pcm_hw_free(struct snd_pcm_substream *substream,
1077				struct snd_soc_dai *dai)
1078{
1079	struct snd_soc_component *component = dai->component;
1080	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
1081	struct sdw_stream_data *stream =
1082		snd_soc_dai_get_dma_data(dai, substream);
1083
1084	if (!rt711->slave)
1085		return -EINVAL;
1086
1087	sdw_stream_remove_slave(rt711->slave, stream->sdw_stream);
1088	return 0;
1089}
1090
1091#define RT711_STEREO_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
1092#define RT711_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
1093			SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
1094
1095static const struct snd_soc_dai_ops rt711_ops = {
1096	.hw_params	= rt711_pcm_hw_params,
1097	.hw_free	= rt711_pcm_hw_free,
1098	.set_stream	= rt711_set_sdw_stream,
1099	.shutdown	= rt711_shutdown,
1100};
1101
1102static struct snd_soc_dai_driver rt711_dai[] = {
1103	{
1104		.name = "rt711-aif1",
1105		.id = RT711_AIF1,
1106		.playback = {
1107			.stream_name = "DP3 Playback",
1108			.channels_min = 1,
1109			.channels_max = 2,
1110			.rates = RT711_STEREO_RATES,
1111			.formats = RT711_FORMATS,
1112		},
1113		.capture = {
1114			.stream_name = "DP4 Capture",
1115			.channels_min = 1,
1116			.channels_max = 2,
1117			.rates = RT711_STEREO_RATES,
1118			.formats = RT711_FORMATS,
1119		},
1120		.ops = &rt711_ops,
1121	},
1122	{
1123		.name = "rt711-aif2",
1124		.id = RT711_AIF2,
1125		.capture = {
1126			.stream_name = "DP2 Capture",
1127			.channels_min = 1,
1128			.channels_max = 2,
1129			.rates = RT711_STEREO_RATES,
1130			.formats = RT711_FORMATS,
1131		},
1132		.ops = &rt711_ops,
1133	}
1134};
1135
1136/* Bus clock frequency */
1137#define RT711_CLK_FREQ_9600000HZ 9600000
1138#define RT711_CLK_FREQ_12000000HZ 12000000
1139#define RT711_CLK_FREQ_6000000HZ 6000000
1140#define RT711_CLK_FREQ_4800000HZ 4800000
1141#define RT711_CLK_FREQ_2400000HZ 2400000
1142#define RT711_CLK_FREQ_12288000HZ 12288000
1143
1144int rt711_clock_config(struct device *dev)
1145{
1146	struct rt711_priv *rt711 = dev_get_drvdata(dev);
1147	unsigned int clk_freq, value;
1148
1149	clk_freq = (rt711->params.curr_dr_freq >> 1);
1150
1151	switch (clk_freq) {
1152	case RT711_CLK_FREQ_12000000HZ:
1153		value = 0x0;
1154		break;
1155	case RT711_CLK_FREQ_6000000HZ:
1156		value = 0x1;
1157		break;
1158	case RT711_CLK_FREQ_9600000HZ:
1159		value = 0x2;
1160		break;
1161	case RT711_CLK_FREQ_4800000HZ:
1162		value = 0x3;
1163		break;
1164	case RT711_CLK_FREQ_2400000HZ:
1165		value = 0x4;
1166		break;
1167	case RT711_CLK_FREQ_12288000HZ:
1168		value = 0x5;
1169		break;
1170	default:
1171		return -EINVAL;
1172	}
1173
1174	regmap_write(rt711->regmap, 0xe0, value);
1175	regmap_write(rt711->regmap, 0xf0, value);
1176
1177	dev_dbg(dev, "%s complete, clk_freq=%d\n", __func__, clk_freq);
1178
1179	return 0;
1180}
1181
1182static void rt711_calibration_work(struct work_struct *work)
1183{
1184	struct rt711_priv *rt711 =
1185		container_of(work, struct rt711_priv, calibration_work);
1186
1187	rt711_calibration(rt711);
1188}
1189
1190int rt711_init(struct device *dev, struct regmap *sdw_regmap,
1191			struct regmap *regmap, struct sdw_slave *slave)
1192{
1193	struct rt711_priv *rt711;
1194	int ret;
1195
1196	rt711 = devm_kzalloc(dev, sizeof(*rt711), GFP_KERNEL);
1197	if (!rt711)
1198		return -ENOMEM;
1199
1200	dev_set_drvdata(dev, rt711);
1201	rt711->slave = slave;
1202	rt711->sdw_regmap = sdw_regmap;
1203	rt711->regmap = regmap;
1204
1205	mutex_init(&rt711->calibrate_mutex);
1206	mutex_init(&rt711->disable_irq_lock);
1207
1208	INIT_DELAYED_WORK(&rt711->jack_detect_work, rt711_jack_detect_handler);
1209	INIT_DELAYED_WORK(&rt711->jack_btn_check_work, rt711_btn_check_handler);
1210	INIT_WORK(&rt711->calibration_work, rt711_calibration_work);
1211
1212	/*
1213	 * Mark hw_init to false
1214	 * HW init will be performed when device reports present
1215	 */
1216	rt711->hw_init = false;
1217	rt711->first_hw_init = false;
1218
1219	/* JD source uses JD2 in default */
1220	rt711->jd_src = RT711_JD2;
1221
1222	ret =  devm_snd_soc_register_component(dev,
1223				&soc_codec_dev_rt711,
1224				rt711_dai,
1225				ARRAY_SIZE(rt711_dai));
1226
1227	dev_dbg(&slave->dev, "%s\n", __func__);
1228
1229	return ret;
1230}
1231
1232int rt711_io_init(struct device *dev, struct sdw_slave *slave)
1233{
1234	struct rt711_priv *rt711 = dev_get_drvdata(dev);
1235
1236	rt711->disable_irq = false;
1237
1238	if (rt711->hw_init)
1239		return 0;
1240
1241	if (rt711->first_hw_init) {
1242		regcache_cache_only(rt711->regmap, false);
1243		regcache_cache_bypass(rt711->regmap, true);
1244	}
1245
1246	/*
1247	 * PM runtime is only enabled when a Slave reports as Attached
1248	 */
1249	if (!rt711->first_hw_init) {
1250		/* set autosuspend parameters */
1251		pm_runtime_set_autosuspend_delay(&slave->dev, 3000);
1252		pm_runtime_use_autosuspend(&slave->dev);
1253
1254		/* update count of parent 'active' children */
1255		pm_runtime_set_active(&slave->dev);
1256
1257		/* make sure the device does not suspend immediately */
1258		pm_runtime_mark_last_busy(&slave->dev);
1259
1260		pm_runtime_enable(&slave->dev);
1261	}
1262
1263	pm_runtime_get_noresume(&slave->dev);
1264
1265	rt711_reset(rt711->regmap);
1266
1267	/* power on */
1268	regmap_write(rt711->regmap, RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
1269
1270	/* Set Pin Widget */
1271	regmap_write(rt711->regmap, RT711_SET_PIN_MIC2, 0x25);
1272	regmap_write(rt711->regmap, RT711_SET_PIN_HP, 0xc0);
1273	regmap_write(rt711->regmap, RT711_SET_PIN_DMIC1, 0x20);
1274	regmap_write(rt711->regmap, RT711_SET_PIN_DMIC2, 0x20);
1275	regmap_write(rt711->regmap, RT711_SET_PIN_LINE1, 0x20);
1276	regmap_write(rt711->regmap, RT711_SET_PIN_LINE2, 0x20);
1277
1278	/* Mute HP/ADC1/ADC2 */
1279	regmap_write(rt711->regmap, RT711_SET_GAIN_HP_H, 0xa080);
1280	regmap_write(rt711->regmap, RT711_SET_GAIN_HP_H, 0x9080);
1281	regmap_write(rt711->regmap, RT711_SET_GAIN_ADC2_H, 0x6080);
1282	regmap_write(rt711->regmap, RT711_SET_GAIN_ADC2_H, 0x5080);
1283	regmap_write(rt711->regmap, RT711_SET_GAIN_ADC1_H, 0x6080);
1284	regmap_write(rt711->regmap, RT711_SET_GAIN_ADC1_H, 0x5080);
1285
1286	/* Set Configuration Default */
1287	regmap_write(rt711->regmap, 0x4f12, 0x91);
1288	regmap_write(rt711->regmap, 0x4e12, 0xd6);
1289	regmap_write(rt711->regmap, 0x4d12, 0x11);
1290	regmap_write(rt711->regmap, 0x4c12, 0x20);
1291	regmap_write(rt711->regmap, 0x4f13, 0x91);
1292	regmap_write(rt711->regmap, 0x4e13, 0xd6);
1293	regmap_write(rt711->regmap, 0x4d13, 0x11);
1294	regmap_write(rt711->regmap, 0x4c13, 0x21);
1295	regmap_write(rt711->regmap, 0x4c21, 0xf0);
1296	regmap_write(rt711->regmap, 0x4d21, 0x11);
1297	regmap_write(rt711->regmap, 0x4e21, 0x11);
1298	regmap_write(rt711->regmap, 0x4f21, 0x01);
1299
1300	/* Data port arrangement */
1301	rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1302		RT711_TX_RX_MUX_CTL, 0x0154);
1303
1304	/* Set index */
1305	rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1306		RT711_DIGITAL_MISC_CTRL4, 0x201b);
1307	rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1308		RT711_COMBO_JACK_AUTO_CTL1, 0x5089);
1309	rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1310		RT711_VREFOUT_CTL, 0x5064);
1311	rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1312		RT711_INLINE_CMD_CTL, 0xd249);
1313
1314	/* Finish Initial Settings, set power to D3 */
1315	regmap_write(rt711->regmap, RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
1316
1317	if (rt711->first_hw_init)
1318		rt711_calibration(rt711);
1319	else
 
 
 
 
 
 
1320		schedule_work(&rt711->calibration_work);
 
1321
1322	/*
1323	 * if set_jack callback occurred early than io_init,
1324	 * we set up the jack detection function now
1325	 */
1326	if (rt711->hs_jack)
1327		rt711_jack_init(rt711);
1328
1329	if (rt711->first_hw_init) {
1330		regcache_cache_bypass(rt711->regmap, false);
1331		regcache_mark_dirty(rt711->regmap);
1332	} else
1333		rt711->first_hw_init = true;
1334
1335	/* Mark Slave initialization complete */
1336	rt711->hw_init = true;
1337
1338	pm_runtime_mark_last_busy(&slave->dev);
1339	pm_runtime_put_autosuspend(&slave->dev);
1340
1341	dev_dbg(&slave->dev, "%s hw_init complete\n", __func__);
1342	return 0;
1343}
1344
1345MODULE_DESCRIPTION("ASoC RT711 SDW driver");
1346MODULE_AUTHOR("Shuming Fan <shumingf@realtek.com>");
1347MODULE_LICENSE("GPL");
v5.14.15
   1// SPDX-License-Identifier: GPL-2.0
   2//
   3// rt711.c -- rt711 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/kernel.h>
  12#include <linux/init.h>
  13#include <linux/delay.h>
  14#include <linux/pm_runtime.h>
  15#include <linux/pm.h>
  16#include <linux/soundwire/sdw.h>
  17#include <linux/regmap.h>
  18#include <linux/slab.h>
  19#include <sound/core.h>
  20#include <sound/pcm.h>
  21#include <sound/pcm_params.h>
 
  22#include <sound/soc.h>
  23#include <sound/soc-dapm.h>
  24#include <sound/initval.h>
  25#include <sound/tlv.h>
  26#include <sound/hda_verbs.h>
  27#include <sound/jack.h>
  28
  29#include "rt711.h"
  30
  31static int rt711_index_write(struct regmap *regmap,
  32		unsigned int nid, unsigned int reg, unsigned int value)
  33{
  34	int ret;
  35	unsigned int addr = ((RT711_PRIV_INDEX_W_H | nid) << 8) | reg;
  36
  37	ret = regmap_write(regmap, addr, value);
  38	if (ret < 0)
  39		pr_err("Failed to set private value: %06x <= %04x ret=%d\n",
  40			addr, value, ret);
  41
  42	return ret;
  43}
  44
  45static int rt711_index_read(struct regmap *regmap,
  46		unsigned int nid, unsigned int reg, unsigned int *value)
  47{
  48	int ret;
  49	unsigned int addr = ((RT711_PRIV_INDEX_W_H | nid) << 8) | reg;
  50
  51	*value = 0;
  52	ret = regmap_read(regmap, addr, value);
  53	if (ret < 0)
  54		pr_err("Failed to get private value: %06x => %04x ret=%d\n",
  55			addr, *value, ret);
  56
  57	return ret;
  58}
  59
  60static int rt711_index_update_bits(struct regmap *regmap, unsigned int nid,
  61			unsigned int reg, unsigned int mask, unsigned int val)
  62{
  63	unsigned int tmp, orig;
  64	int ret;
  65
  66	ret = rt711_index_read(regmap, nid, reg, &orig);
  67	if (ret < 0)
  68		return ret;
  69
  70	tmp = orig & ~mask;
  71	tmp |= val & mask;
  72
  73	return rt711_index_write(regmap, nid, reg, tmp);
  74}
  75
  76static void rt711_reset(struct regmap *regmap)
  77{
  78	regmap_write(regmap, RT711_FUNC_RESET, 0);
  79	rt711_index_update_bits(regmap, RT711_VENDOR_REG,
  80		RT711_PARA_VERB_CTL, RT711_HIDDEN_REG_SW_RESET,
  81		RT711_HIDDEN_REG_SW_RESET);
  82}
  83
  84static int rt711_calibration(struct rt711_priv *rt711)
  85{
  86	unsigned int val, loop = 0;
  87	struct device *dev;
  88	struct regmap *regmap = rt711->regmap;
  89	int ret = 0;
  90
  91	mutex_lock(&rt711->calibrate_mutex);
  92	regmap_write(rt711->regmap,
  93		RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
  94
  95	dev = regmap_get_device(regmap);
  96
  97	/* Calibration manual mode */
  98	rt711_index_update_bits(regmap, RT711_VENDOR_REG, RT711_FSM_CTL,
  99		0xf, 0x0);
 100
 101	/* trigger */
 102	rt711_index_update_bits(regmap, RT711_VENDOR_CALI,
 103		RT711_DAC_DC_CALI_CTL1, RT711_DAC_DC_CALI_TRIGGER,
 104		RT711_DAC_DC_CALI_TRIGGER);
 105
 106	/* wait for calibration process */
 107	rt711_index_read(regmap, RT711_VENDOR_CALI,
 108		RT711_DAC_DC_CALI_CTL1, &val);
 109
 110	while (val & RT711_DAC_DC_CALI_TRIGGER) {
 111		if (loop >= 500) {
 112			pr_err("%s, calibration time-out!\n",
 113							__func__);
 114			ret = -ETIMEDOUT;
 115			break;
 116		}
 117		loop++;
 118
 119		usleep_range(10000, 11000);
 120		rt711_index_read(regmap, RT711_VENDOR_CALI,
 121			RT711_DAC_DC_CALI_CTL1, &val);
 122	}
 123
 124	/* depop mode */
 125	rt711_index_update_bits(regmap, RT711_VENDOR_REG,
 126		RT711_FSM_CTL, 0xf, RT711_DEPOP_CTL);
 127
 128	regmap_write(rt711->regmap,
 129		RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
 130	mutex_unlock(&rt711->calibrate_mutex);
 131
 132	dev_dbg(dev, "%s calibration complete, ret=%d\n", __func__, ret);
 133	return ret;
 134}
 135
 136static unsigned int rt711_button_detect(struct rt711_priv *rt711)
 137{
 138	unsigned int btn_type = 0, val80, val81;
 139	int ret;
 140
 141	ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
 142				RT711_IRQ_FLAG_TABLE1, &val80);
 143	if (ret < 0)
 144		goto read_error;
 145	ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
 146					RT711_IRQ_FLAG_TABLE2, &val81);
 147	if (ret < 0)
 148		goto read_error;
 149
 150	val80 &= 0x0381;
 151	val81 &= 0xff00;
 152
 153	switch (val80) {
 154	case 0x0200:
 155	case 0x0100:
 156	case 0x0080:
 157		btn_type |= SND_JACK_BTN_0;
 158		break;
 159	case 0x0001:
 160		btn_type |= SND_JACK_BTN_3;
 161		break;
 162	}
 163	switch (val81) {
 164	case 0x8000:
 165	case 0x4000:
 166	case 0x2000:
 167		btn_type |= SND_JACK_BTN_1;
 168		break;
 169	case 0x1000:
 170	case 0x0800:
 171	case 0x0400:
 172		btn_type |= SND_JACK_BTN_2;
 173		break;
 174	case 0x0200:
 175	case 0x0100:
 176		btn_type |= SND_JACK_BTN_3;
 177		break;
 178	}
 179read_error:
 180	return btn_type;
 181}
 182
 183static int rt711_headset_detect(struct rt711_priv *rt711)
 184{
 185	unsigned int buf, loop = 0;
 186	int ret;
 187	unsigned int jack_status = 0, reg;
 188
 189	ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
 190				RT711_COMBO_JACK_AUTO_CTL2, &buf);
 191	if (ret < 0)
 192		goto io_error;
 193
 194	while (loop < 500 &&
 195		(buf & RT711_COMBOJACK_AUTO_DET_STATUS) == 0) {
 196		loop++;
 197
 198		usleep_range(9000, 10000);
 199		ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
 200					RT711_COMBO_JACK_AUTO_CTL2, &buf);
 201		if (ret < 0)
 202			goto io_error;
 203
 204		reg = RT711_VERB_GET_PIN_SENSE | RT711_HP_OUT;
 205		ret = regmap_read(rt711->regmap, reg, &jack_status);
 206		if (ret < 0)
 207			goto io_error;
 208		if ((jack_status & (1 << 31)) == 0)
 209			goto remove_error;
 210	}
 211
 212	if (loop >= 500)
 213		goto to_error;
 214
 215	if (buf & RT711_COMBOJACK_AUTO_DET_TRS)
 216		rt711->jack_type = SND_JACK_HEADPHONE;
 217	else if ((buf & RT711_COMBOJACK_AUTO_DET_CTIA) ||
 218		(buf & RT711_COMBOJACK_AUTO_DET_OMTP))
 219		rt711->jack_type = SND_JACK_HEADSET;
 220
 221	return 0;
 222
 223to_error:
 224	ret = -ETIMEDOUT;
 225	pr_err_ratelimited("Time-out error in %s\n", __func__);
 226	return ret;
 227io_error:
 228	pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret);
 229	return ret;
 230remove_error:
 231	pr_err_ratelimited("Jack removal in %s\n", __func__);
 232	return -ENODEV;
 233}
 234
 235static void rt711_jack_detect_handler(struct work_struct *work)
 236{
 237	struct rt711_priv *rt711 =
 238		container_of(work, struct rt711_priv, jack_detect_work.work);
 239	int btn_type = 0, ret;
 240	unsigned int jack_status = 0, reg;
 241
 242	if (!rt711->hs_jack)
 243		return;
 244
 245	if (!rt711->component->card->instantiated)
 246		return;
 247
 
 
 
 
 
 
 
 248	reg = RT711_VERB_GET_PIN_SENSE | RT711_HP_OUT;
 249	ret = regmap_read(rt711->regmap, reg, &jack_status);
 250	if (ret < 0)
 251		goto io_error;
 252
 253	/* pin attached */
 254	if (jack_status & (1 << 31)) {
 255		/* jack in */
 256		if (rt711->jack_type == 0) {
 257			ret = rt711_headset_detect(rt711);
 258			if (ret < 0)
 259				return;
 260			if (rt711->jack_type == SND_JACK_HEADSET)
 261				btn_type = rt711_button_detect(rt711);
 262		} else if (rt711->jack_type == SND_JACK_HEADSET) {
 263			/* jack is already in, report button event */
 264			btn_type = rt711_button_detect(rt711);
 265		}
 266	} else {
 267		/* jack out */
 268		rt711->jack_type = 0;
 269	}
 270
 271	dev_dbg(&rt711->slave->dev,
 272		"in %s, jack_type=0x%x\n", __func__, rt711->jack_type);
 273	dev_dbg(&rt711->slave->dev,
 274		"in %s, btn_type=0x%x\n", __func__, btn_type);
 275
 276	snd_soc_jack_report(rt711->hs_jack, rt711->jack_type | btn_type,
 277			SND_JACK_HEADSET |
 278			SND_JACK_BTN_0 | SND_JACK_BTN_1 |
 279			SND_JACK_BTN_2 | SND_JACK_BTN_3);
 280
 281	if (btn_type) {
 282		/* button released */
 283		snd_soc_jack_report(rt711->hs_jack, rt711->jack_type,
 284			SND_JACK_HEADSET |
 285			SND_JACK_BTN_0 | SND_JACK_BTN_1 |
 286			SND_JACK_BTN_2 | SND_JACK_BTN_3);
 287
 288		mod_delayed_work(system_power_efficient_wq,
 289			&rt711->jack_btn_check_work, msecs_to_jiffies(200));
 290	}
 291
 292	return;
 293
 294io_error:
 295	pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret);
 296}
 297
 298static void rt711_btn_check_handler(struct work_struct *work)
 299{
 300	struct rt711_priv *rt711 = container_of(work, struct rt711_priv,
 301		jack_btn_check_work.work);
 302	int btn_type = 0, ret;
 303	unsigned int jack_status = 0, reg;
 304
 305	reg = RT711_VERB_GET_PIN_SENSE | RT711_HP_OUT;
 306	ret = regmap_read(rt711->regmap, reg, &jack_status);
 307	if (ret < 0)
 308		goto io_error;
 309
 310	/* pin attached */
 311	if (jack_status & (1 << 31)) {
 312		if (rt711->jack_type == SND_JACK_HEADSET) {
 313			/* jack is already in, report button event */
 314			btn_type = rt711_button_detect(rt711);
 315		}
 316	} else {
 317		rt711->jack_type = 0;
 318	}
 319
 320	/* cbj comparator */
 321	ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
 322		RT711_COMBO_JACK_AUTO_CTL2, &reg);
 323	if (ret < 0)
 324		goto io_error;
 325
 326	if ((reg & 0xf0) == 0xf0)
 327		btn_type = 0;
 328
 329	dev_dbg(&rt711->slave->dev,
 330		"%s, btn_type=0x%x\n",	__func__, btn_type);
 331	snd_soc_jack_report(rt711->hs_jack, rt711->jack_type | btn_type,
 332			SND_JACK_HEADSET |
 333			SND_JACK_BTN_0 | SND_JACK_BTN_1 |
 334			SND_JACK_BTN_2 | SND_JACK_BTN_3);
 335
 336	if (btn_type) {
 337		/* button released */
 338		snd_soc_jack_report(rt711->hs_jack, rt711->jack_type,
 339			SND_JACK_HEADSET |
 340			SND_JACK_BTN_0 | SND_JACK_BTN_1 |
 341			SND_JACK_BTN_2 | SND_JACK_BTN_3);
 342
 343		mod_delayed_work(system_power_efficient_wq,
 344			&rt711->jack_btn_check_work, msecs_to_jiffies(200));
 345	}
 346
 347	return;
 348
 349io_error:
 350	pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret);
 351}
 352
 353static void rt711_jack_init(struct rt711_priv *rt711)
 354{
 355	struct snd_soc_dapm_context *dapm =
 356		snd_soc_component_get_dapm(rt711->component);
 357
 358	mutex_lock(&rt711->calibrate_mutex);
 359	/* power on */
 360	if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
 361		regmap_write(rt711->regmap,
 362			RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
 363
 364	if (rt711->hs_jack) {
 365		/* unsolicited response & IRQ control */
 366		regmap_write(rt711->regmap,
 367			RT711_SET_MIC2_UNSOLICITED_ENABLE, 0x82);
 368		regmap_write(rt711->regmap,
 369			RT711_SET_HP_UNSOLICITED_ENABLE, 0x81);
 370		regmap_write(rt711->regmap,
 371			RT711_SET_INLINE_UNSOLICITED_ENABLE, 0x83);
 372		rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
 373			0x10, 0x2420);
 374		rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
 375			0x19, 0x2e11);
 376
 377		switch (rt711->jd_src) {
 378		case RT711_JD1:
 379			/* default settings was already for JD1 */
 380			break;
 381		case RT711_JD2:
 382			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
 383				RT711_JD_CTL2, RT711_JD2_2PORT_200K_DECODE_HP |
 384				RT711_HP_JD_SEL_JD2,
 385				RT711_JD2_2PORT_200K_DECODE_HP |
 386				RT711_HP_JD_SEL_JD2);
 387			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
 388				RT711_CC_DET1,
 389				RT711_HP_JD_FINAL_RESULT_CTL_JD12,
 390				RT711_HP_JD_FINAL_RESULT_CTL_JD12);
 391			break;
 392		case RT711_JD2_100K:
 393			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
 394				RT711_JD_CTL2, RT711_JD2_2PORT_100K_DECODE | RT711_JD2_1PORT_TYPE_DECODE |
 395				RT711_HP_JD_SEL_JD2 | RT711_JD1_2PORT_TYPE_100K_DECODE,
 396				RT711_JD2_2PORT_100K_DECODE_HP | RT711_JD2_1PORT_JD_HP |
 397				RT711_HP_JD_SEL_JD2 | RT711_JD1_2PORT_JD_RESERVED);
 398			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
 399				RT711_CC_DET1,
 400				RT711_HP_JD_FINAL_RESULT_CTL_JD12,
 401				RT711_HP_JD_FINAL_RESULT_CTL_JD12);
 402			break;
 403		case RT711_JD2_1P8V_1PORT:
 404			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
 405				RT711_JD_CTL1, RT711_JD2_DIGITAL_JD_MODE_SEL,
 406				RT711_JD2_1_JD_MODE);
 407			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
 408				RT711_JD_CTL2, RT711_JD2_1PORT_TYPE_DECODE |
 409				RT711_HP_JD_SEL_JD2,
 410				RT711_JD2_1PORT_JD_HP |
 411				RT711_HP_JD_SEL_JD2);
 412			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
 413				RT711_JD_CTL4, RT711_JD2_PAD_PULL_UP_MASK |
 414				RT711_JD2_MODE_SEL_MASK,
 415				RT711_JD2_PAD_PULL_UP |
 416				RT711_JD2_MODE2_1P8V_1PORT);
 417			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
 418				RT711_CC_DET1,
 419				RT711_HP_JD_FINAL_RESULT_CTL_JD12,
 420				RT711_HP_JD_FINAL_RESULT_CTL_JD12);
 421			break;
 422		default:
 423			dev_warn(rt711->component->dev, "Wrong JD source\n");
 424			break;
 425		}
 426
 427		dev_dbg(&rt711->slave->dev, "in %s enable\n", __func__);
 428
 429		mod_delayed_work(system_power_efficient_wq,
 430			&rt711->jack_detect_work, msecs_to_jiffies(250));
 431	} else {
 432		regmap_write(rt711->regmap,
 433			RT711_SET_MIC2_UNSOLICITED_ENABLE, 0x00);
 434		regmap_write(rt711->regmap,
 435			RT711_SET_HP_UNSOLICITED_ENABLE, 0x00);
 436		regmap_write(rt711->regmap,
 437			RT711_SET_INLINE_UNSOLICITED_ENABLE, 0x00);
 438
 439		dev_dbg(&rt711->slave->dev, "in %s disable\n", __func__);
 440	}
 441
 442	/* power off */
 443	if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
 444		regmap_write(rt711->regmap,
 445			RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
 446	mutex_unlock(&rt711->calibrate_mutex);
 447}
 448
 449static int rt711_set_jack_detect(struct snd_soc_component *component,
 450	struct snd_soc_jack *hs_jack, void *data)
 451{
 452	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 
 453
 454	rt711->hs_jack = hs_jack;
 455
 456	if (!rt711->hw_init) {
 457		dev_dbg(&rt711->slave->dev,
 458			"%s hw_init not ready yet\n", __func__);
 
 
 
 
 
 
 459		return 0;
 460	}
 461
 462	rt711_jack_init(rt711);
 463
 
 
 
 464	return 0;
 465}
 466
 467static void rt711_get_gain(struct rt711_priv *rt711, unsigned int addr_h,
 468				unsigned int addr_l, unsigned int val_h,
 469				unsigned int *r_val, unsigned int *l_val)
 470{
 471	/* R Channel */
 472	*r_val = (val_h << 8);
 473	regmap_read(rt711->regmap, addr_l, r_val);
 474
 475	/* L Channel */
 476	val_h |= 0x20;
 477	*l_val = (val_h << 8);
 478	regmap_read(rt711->regmap, addr_h, l_val);
 479}
 480
 481/* For Verb-Set Amplifier Gain (Verb ID = 3h) */
 482static int rt711_set_amp_gain_put(struct snd_kcontrol *kcontrol,
 483		struct snd_ctl_elem_value *ucontrol)
 484{
 485	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
 486	struct snd_soc_dapm_context *dapm =
 487		snd_soc_component_get_dapm(component);
 488	struct soc_mixer_control *mc =
 489		(struct soc_mixer_control *)kcontrol->private_value;
 490	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 491	unsigned int addr_h, addr_l, val_h, val_ll, val_lr;
 492	unsigned int read_ll, read_rl;
 493	int i;
 494
 495	mutex_lock(&rt711->calibrate_mutex);
 496
 497	/* Can't use update bit function, so read the original value first */
 498	addr_h = mc->reg;
 499	addr_l = mc->rreg;
 500	if (mc->shift == RT711_DIR_OUT_SFT) /* output */
 501		val_h = 0x80;
 502	else /* input */
 503		val_h = 0x0;
 504
 505	rt711_get_gain(rt711, addr_h, addr_l, val_h, &read_rl, &read_ll);
 506
 507	/* L Channel */
 508	if (mc->invert) {
 509		/* for mute/unmute */
 510		val_ll = (mc->max - ucontrol->value.integer.value[0])
 511					<< RT711_MUTE_SFT;
 512		/* keep gain */
 513		read_ll = read_ll & 0x7f;
 514		val_ll |= read_ll;
 515	} else {
 516		/* for gain */
 517		val_ll = ((ucontrol->value.integer.value[0]) & 0x7f);
 518		if (val_ll > mc->max)
 519			val_ll = mc->max;
 520		/* keep mute status */
 521		read_ll = read_ll & (1 << RT711_MUTE_SFT);
 522		val_ll |= read_ll;
 523	}
 524
 525	if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
 526		regmap_write(rt711->regmap,
 527				RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
 528
 529	/* R Channel */
 530	if (mc->invert) {
 531		/* for mute/unmute */
 532		val_lr = (mc->max - ucontrol->value.integer.value[1])
 533					<< RT711_MUTE_SFT;
 534		/* keep gain */
 535		read_rl = read_rl & 0x7f;
 536		val_lr |= read_rl;
 537	} else {
 538		/* for gain */
 539		val_lr = ((ucontrol->value.integer.value[1]) & 0x7f);
 540		if (val_lr > mc->max)
 541			val_lr = mc->max;
 542		/* keep mute status */
 543		read_rl = read_rl & (1 << RT711_MUTE_SFT);
 544		val_lr |= read_rl;
 545	}
 546
 547	for (i = 0; i < 3; i++) { /* retry 3 times at most */
 548
 549		if (val_ll == val_lr) {
 550			/* Set both L/R channels at the same time */
 551			val_h = (1 << mc->shift) | (3 << 4);
 552			regmap_write(rt711->regmap,
 553				addr_h, (val_h << 8 | val_ll));
 554			regmap_write(rt711->regmap,
 555				addr_l, (val_h << 8 | val_ll));
 556		} else {
 557			/* Lch*/
 558			val_h = (1 << mc->shift) | (1 << 5);
 559			regmap_write(rt711->regmap,
 560				addr_h, (val_h << 8 | val_ll));
 561
 562			/* Rch */
 563			val_h = (1 << mc->shift) | (1 << 4);
 564			regmap_write(rt711->regmap,
 565				addr_l, (val_h << 8 | val_lr));
 566		}
 567		/* check result */
 568		if (mc->shift == RT711_DIR_OUT_SFT) /* output */
 569			val_h = 0x80;
 570		else /* input */
 571			val_h = 0x0;
 572
 573		rt711_get_gain(rt711, addr_h, addr_l, val_h,
 574					&read_rl, &read_ll);
 575		if (read_rl == val_lr && read_ll == val_ll)
 576			break;
 577	}
 578
 579	if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
 580		regmap_write(rt711->regmap,
 581				RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
 582
 583	mutex_unlock(&rt711->calibrate_mutex);
 584	return 0;
 585}
 586
 587static int rt711_set_amp_gain_get(struct snd_kcontrol *kcontrol,
 588		struct snd_ctl_elem_value *ucontrol)
 589{
 590	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
 591	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 592	struct soc_mixer_control *mc =
 593		(struct soc_mixer_control *)kcontrol->private_value;
 594	unsigned int addr_h, addr_l, val_h;
 595	unsigned int read_ll, read_rl;
 596
 597	/* switch to get command */
 598	addr_h = mc->reg;
 599	addr_l = mc->rreg;
 600	if (mc->shift == RT711_DIR_OUT_SFT) /* output */
 601		val_h = 0x80;
 602	else /* input */
 603		val_h = 0x0;
 604
 605	rt711_get_gain(rt711, addr_h, addr_l, val_h, &read_rl, &read_ll);
 606
 607	if (mc->invert) {
 608		/* mute/unmute for switch controls */
 609		read_ll = !((read_ll & 0x80) >> RT711_MUTE_SFT);
 610		read_rl = !((read_rl & 0x80) >> RT711_MUTE_SFT);
 611	} else {
 612		/* for gain volume controls */
 613		read_ll = read_ll & 0x7f;
 614		read_rl = read_rl & 0x7f;
 615	}
 616	ucontrol->value.integer.value[0] = read_ll;
 617	ucontrol->value.integer.value[1] = read_rl;
 618
 619	return 0;
 620}
 621
 622static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -6525, 75, 0);
 623static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -1725, 75, 0);
 624static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, 0, 1000, 0);
 625
 626static const struct snd_kcontrol_new rt711_snd_controls[] = {
 627	SOC_DOUBLE_R_EXT_TLV("DAC Surr Playback Volume",
 628		RT711_SET_GAIN_DAC2_H, RT711_SET_GAIN_DAC2_L,
 629		RT711_DIR_OUT_SFT, 0x57, 0,
 630		rt711_set_amp_gain_get, rt711_set_amp_gain_put, out_vol_tlv),
 631	SOC_DOUBLE_R_EXT("ADC 08 Capture Switch",
 632		RT711_SET_GAIN_ADC2_H, RT711_SET_GAIN_ADC2_L,
 633		RT711_DIR_IN_SFT, 1, 1,
 634		rt711_set_amp_gain_get, rt711_set_amp_gain_put),
 635	SOC_DOUBLE_R_EXT("ADC 09 Capture Switch",
 636		RT711_SET_GAIN_ADC1_H, RT711_SET_GAIN_ADC1_L,
 637		RT711_DIR_IN_SFT, 1, 1,
 638		rt711_set_amp_gain_get, rt711_set_amp_gain_put),
 639	SOC_DOUBLE_R_EXT_TLV("ADC 08 Capture Volume",
 640		RT711_SET_GAIN_ADC2_H, RT711_SET_GAIN_ADC2_L,
 641		RT711_DIR_IN_SFT, 0x3f, 0,
 642		rt711_set_amp_gain_get, rt711_set_amp_gain_put, in_vol_tlv),
 643	SOC_DOUBLE_R_EXT_TLV("ADC 09 Capture Volume",
 644		RT711_SET_GAIN_ADC1_H, RT711_SET_GAIN_ADC1_L,
 645		RT711_DIR_IN_SFT, 0x3f, 0,
 646		rt711_set_amp_gain_get, rt711_set_amp_gain_put, in_vol_tlv),
 647	SOC_DOUBLE_R_EXT_TLV("AMIC Volume",
 648		RT711_SET_GAIN_AMIC_H, RT711_SET_GAIN_AMIC_L,
 649		RT711_DIR_IN_SFT, 3, 0,
 650		rt711_set_amp_gain_get, rt711_set_amp_gain_put, mic_vol_tlv),
 651	SOC_DOUBLE_R_EXT_TLV("DMIC1 Volume",
 652		RT711_SET_GAIN_DMIC1_H, RT711_SET_GAIN_DMIC1_L,
 653		RT711_DIR_IN_SFT, 3, 0,
 654		rt711_set_amp_gain_get, rt711_set_amp_gain_put, mic_vol_tlv),
 655	SOC_DOUBLE_R_EXT_TLV("DMIC2 Volume",
 656		RT711_SET_GAIN_DMIC2_H, RT711_SET_GAIN_DMIC2_L,
 657		RT711_DIR_IN_SFT, 3, 0,
 658		rt711_set_amp_gain_get, rt711_set_amp_gain_put, mic_vol_tlv),
 659};
 660
 661static int rt711_mux_get(struct snd_kcontrol *kcontrol,
 662			struct snd_ctl_elem_value *ucontrol)
 663{
 664	struct snd_soc_component *component =
 665		snd_soc_dapm_kcontrol_component(kcontrol);
 666	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 667	unsigned int reg, val = 0, nid;
 668	int ret;
 669
 670	if (strstr(ucontrol->id.name, "ADC 22 Mux"))
 671		nid = RT711_MIXER_IN1;
 672	else if (strstr(ucontrol->id.name, "ADC 23 Mux"))
 673		nid = RT711_MIXER_IN2;
 674	else
 675		return -EINVAL;
 676
 677	/* vid = 0xf01 */
 678	reg = RT711_VERB_SET_CONNECT_SEL | nid;
 679	ret = regmap_read(rt711->regmap, reg, &val);
 680	if (ret < 0) {
 681		dev_err(component->dev, "%s: sdw read failed: %d\n",
 682			__func__, ret);
 683		return ret;
 684	}
 685
 686	ucontrol->value.enumerated.item[0] = val;
 687
 688	return 0;
 689}
 690
 691static int rt711_mux_put(struct snd_kcontrol *kcontrol,
 692			struct snd_ctl_elem_value *ucontrol)
 693{
 694	struct snd_soc_component *component =
 695		snd_soc_dapm_kcontrol_component(kcontrol);
 696	struct snd_soc_dapm_context *dapm =
 697		snd_soc_dapm_kcontrol_dapm(kcontrol);
 698	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 699	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
 700	unsigned int *item = ucontrol->value.enumerated.item;
 701	unsigned int val, val2 = 0, change, reg, nid;
 702	int ret;
 703
 704	if (item[0] >= e->items)
 705		return -EINVAL;
 706
 707	if (strstr(ucontrol->id.name, "ADC 22 Mux"))
 708		nid = RT711_MIXER_IN1;
 709	else if (strstr(ucontrol->id.name, "ADC 23 Mux"))
 710		nid = RT711_MIXER_IN2;
 711	else
 712		return -EINVAL;
 713
 714	/* Verb ID = 0x701h */
 715	val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
 716
 717	reg = RT711_VERB_SET_CONNECT_SEL | nid;
 718	ret = regmap_read(rt711->regmap, reg, &val2);
 719	if (ret < 0) {
 720		dev_err(component->dev, "%s: sdw read failed: %d\n",
 721			__func__, ret);
 722		return ret;
 723	}
 724
 725	if (val == val2)
 726		change = 0;
 727	else
 728		change = 1;
 729
 730	if (change) {
 731		reg = RT711_VERB_SET_CONNECT_SEL | nid;
 732		regmap_write(rt711->regmap, reg, val);
 733	}
 734
 735	snd_soc_dapm_mux_update_power(dapm, kcontrol,
 736						item[0], e, NULL);
 737
 738	return change;
 739}
 740
 741static const char * const adc_mux_text[] = {
 742	"MIC2",
 743	"LINE1",
 744	"LINE2",
 745	"DMIC",
 746};
 747
 748static SOC_ENUM_SINGLE_DECL(
 749	rt711_adc22_enum, SND_SOC_NOPM, 0, adc_mux_text);
 750
 751static SOC_ENUM_SINGLE_DECL(
 752	rt711_adc23_enum, SND_SOC_NOPM, 0, adc_mux_text);
 753
 754static const struct snd_kcontrol_new rt711_adc22_mux =
 755	SOC_DAPM_ENUM_EXT("ADC 22 Mux", rt711_adc22_enum,
 756			rt711_mux_get, rt711_mux_put);
 757
 758static const struct snd_kcontrol_new rt711_adc23_mux =
 759	SOC_DAPM_ENUM_EXT("ADC 23 Mux", rt711_adc23_enum,
 760			rt711_mux_get, rt711_mux_put);
 761
 762static int rt711_dac_surround_event(struct snd_soc_dapm_widget *w,
 763	struct snd_kcontrol *kcontrol, int event)
 764{
 765	struct snd_soc_component *component =
 766		snd_soc_dapm_to_component(w->dapm);
 767	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 768	unsigned int val_h = (1 << RT711_DIR_OUT_SFT) | (0x3 << 4);
 769	unsigned int val_l;
 770
 771	switch (event) {
 772	case SND_SOC_DAPM_POST_PMU:
 773		regmap_write(rt711->regmap,
 774			RT711_SET_STREAMID_DAC2, 0x10);
 775
 776		val_l = 0x00;
 777		regmap_write(rt711->regmap,
 778			RT711_SET_GAIN_HP_H, (val_h << 8 | val_l));
 779		break;
 780	case SND_SOC_DAPM_PRE_PMD:
 781		val_l = (1 << RT711_MUTE_SFT);
 782		regmap_write(rt711->regmap,
 783			RT711_SET_GAIN_HP_H, (val_h << 8 | val_l));
 784		usleep_range(50000, 55000);
 785
 786		regmap_write(rt711->regmap,
 787			RT711_SET_STREAMID_DAC2, 0x00);
 788		break;
 789	}
 790	return 0;
 791}
 792
 793static int rt711_adc_09_event(struct snd_soc_dapm_widget *w,
 794	struct snd_kcontrol *kcontrol, int event)
 795{
 796	struct snd_soc_component *component =
 797		snd_soc_dapm_to_component(w->dapm);
 798	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 799
 800	switch (event) {
 801	case SND_SOC_DAPM_POST_PMU:
 802		regmap_write(rt711->regmap,
 803			RT711_SET_STREAMID_ADC1, 0x10);
 804		break;
 805	case SND_SOC_DAPM_PRE_PMD:
 806		regmap_write(rt711->regmap,
 807			RT711_SET_STREAMID_ADC1, 0x00);
 808		break;
 809	}
 810	return 0;
 811}
 812
 813static int rt711_adc_08_event(struct snd_soc_dapm_widget *w,
 814	struct snd_kcontrol *kcontrol, int event)
 815{
 816	struct snd_soc_component *component =
 817		snd_soc_dapm_to_component(w->dapm);
 818	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 819
 820	switch (event) {
 821	case SND_SOC_DAPM_POST_PMU:
 822		regmap_write(rt711->regmap,
 823			RT711_SET_STREAMID_ADC2, 0x10);
 824		break;
 825	case SND_SOC_DAPM_PRE_PMD:
 826		regmap_write(rt711->regmap,
 827			RT711_SET_STREAMID_ADC2, 0x00);
 828		break;
 829	}
 830	return 0;
 831}
 832
 833static const struct snd_soc_dapm_widget rt711_dapm_widgets[] = {
 834	SND_SOC_DAPM_OUTPUT("HP"),
 835	SND_SOC_DAPM_INPUT("MIC2"),
 836	SND_SOC_DAPM_INPUT("DMIC1"),
 837	SND_SOC_DAPM_INPUT("DMIC2"),
 838	SND_SOC_DAPM_INPUT("LINE1"),
 839	SND_SOC_DAPM_INPUT("LINE2"),
 840
 841	SND_SOC_DAPM_DAC_E("DAC Surround", NULL, SND_SOC_NOPM, 0, 0,
 842		rt711_dac_surround_event,
 843		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
 844	SND_SOC_DAPM_ADC_E("ADC 09", NULL, SND_SOC_NOPM, 0, 0,
 845		rt711_adc_09_event,
 846		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
 847	SND_SOC_DAPM_ADC_E("ADC 08", NULL, SND_SOC_NOPM, 0, 0,
 848		rt711_adc_08_event,
 849		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
 850	SND_SOC_DAPM_MUX("ADC 22 Mux", SND_SOC_NOPM, 0, 0,
 851		&rt711_adc22_mux),
 852	SND_SOC_DAPM_MUX("ADC 23 Mux", SND_SOC_NOPM, 0, 0,
 853		&rt711_adc23_mux),
 854
 855	SND_SOC_DAPM_AIF_IN("DP3RX", "DP3 Playback", 0, SND_SOC_NOPM, 0, 0),
 856	SND_SOC_DAPM_AIF_OUT("DP2TX", "DP2 Capture", 0, SND_SOC_NOPM, 0, 0),
 857	SND_SOC_DAPM_AIF_OUT("DP4TX", "DP4 Capture", 0, SND_SOC_NOPM, 0, 0),
 858};
 859
 860static const struct snd_soc_dapm_route rt711_audio_map[] = {
 861	{"DAC Surround", NULL, "DP3RX"},
 862	{"DP2TX", NULL, "ADC 09"},
 863	{"DP4TX", NULL, "ADC 08"},
 864
 865	{"ADC 09", NULL, "ADC 22 Mux"},
 866	{"ADC 08", NULL, "ADC 23 Mux"},
 867	{"ADC 22 Mux", "DMIC", "DMIC1"},
 868	{"ADC 22 Mux", "LINE1", "LINE1"},
 869	{"ADC 22 Mux", "LINE2", "LINE2"},
 870	{"ADC 22 Mux", "MIC2", "MIC2"},
 871	{"ADC 23 Mux", "DMIC", "DMIC2"},
 872	{"ADC 23 Mux", "LINE1", "LINE1"},
 873	{"ADC 23 Mux", "LINE2", "LINE2"},
 874	{"ADC 23 Mux", "MIC2", "MIC2"},
 875
 876	{"HP", NULL, "DAC Surround"},
 877};
 878
 879static int rt711_set_bias_level(struct snd_soc_component *component,
 880				enum snd_soc_bias_level level)
 881{
 882	struct snd_soc_dapm_context *dapm =
 883		snd_soc_component_get_dapm(component);
 884	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 885
 886	switch (level) {
 887	case SND_SOC_BIAS_PREPARE:
 888		if (dapm->bias_level == SND_SOC_BIAS_STANDBY) {
 889			regmap_write(rt711->regmap,
 890				RT711_SET_AUDIO_POWER_STATE,
 891				AC_PWRST_D0);
 892		}
 893		break;
 894
 895	case SND_SOC_BIAS_STANDBY:
 896		mutex_lock(&rt711->calibrate_mutex);
 897		regmap_write(rt711->regmap,
 898			RT711_SET_AUDIO_POWER_STATE,
 899			AC_PWRST_D3);
 900		mutex_unlock(&rt711->calibrate_mutex);
 901		break;
 902
 903	default:
 904		break;
 905	}
 906
 907	return 0;
 908}
 909
 910static int rt711_parse_dt(struct rt711_priv *rt711, struct device *dev)
 911{
 912	device_property_read_u32(dev, "realtek,jd-src",
 913		&rt711->jd_src);
 914
 915	return 0;
 916}
 917
 918static int rt711_probe(struct snd_soc_component *component)
 919{
 920	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 
 921
 922	rt711_parse_dt(rt711, &rt711->slave->dev);
 923	rt711->component = component;
 924
 
 
 
 
 925	return 0;
 926}
 927
 928static void rt711_remove(struct snd_soc_component *component)
 929{
 930	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 931
 932	regcache_cache_only(rt711->regmap, true);
 933}
 934
 935static const struct snd_soc_component_driver soc_codec_dev_rt711 = {
 936	.probe = rt711_probe,
 937	.set_bias_level = rt711_set_bias_level,
 938	.controls = rt711_snd_controls,
 939	.num_controls = ARRAY_SIZE(rt711_snd_controls),
 940	.dapm_widgets = rt711_dapm_widgets,
 941	.num_dapm_widgets = ARRAY_SIZE(rt711_dapm_widgets),
 942	.dapm_routes = rt711_audio_map,
 943	.num_dapm_routes = ARRAY_SIZE(rt711_audio_map),
 944	.set_jack = rt711_set_jack_detect,
 945	.remove = rt711_remove,
 946};
 947
 948static int rt711_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream,
 949				int direction)
 950{
 951	struct sdw_stream_data *stream;
 952
 953	if (!sdw_stream)
 954		return 0;
 955
 956	stream = kzalloc(sizeof(*stream), GFP_KERNEL);
 957	if (!stream)
 958		return -ENOMEM;
 959
 960	stream->sdw_stream = sdw_stream;
 961
 962	/* Use tx_mask or rx_mask to configure stream tag and set dma_data */
 963	if (direction == SNDRV_PCM_STREAM_PLAYBACK)
 964		dai->playback_dma_data = stream;
 965	else
 966		dai->capture_dma_data = stream;
 967
 968	return 0;
 969}
 970
 971static void rt711_shutdown(struct snd_pcm_substream *substream,
 972				struct snd_soc_dai *dai)
 973{
 974	struct sdw_stream_data *stream;
 975
 976	stream = snd_soc_dai_get_dma_data(dai, substream);
 977	snd_soc_dai_set_dma_data(dai, substream, NULL);
 978	kfree(stream);
 979}
 980
 981static int rt711_pcm_hw_params(struct snd_pcm_substream *substream,
 982				struct snd_pcm_hw_params *params,
 983				struct snd_soc_dai *dai)
 984{
 985	struct snd_soc_component *component = dai->component;
 986	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
 987	struct sdw_stream_config stream_config;
 988	struct sdw_port_config port_config;
 989	enum sdw_data_direction direction;
 990	struct sdw_stream_data *stream;
 991	int retval, port, num_channels;
 992	unsigned int val = 0;
 993
 994	dev_dbg(dai->dev, "%s %s", __func__, dai->name);
 995	stream = snd_soc_dai_get_dma_data(dai, substream);
 996
 997	if (!stream)
 998		return -EINVAL;
 999
1000	if (!rt711->slave)
1001		return -EINVAL;
1002
1003	/* SoundWire specific configuration */
 
 
1004	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1005		direction = SDW_DATA_DIR_RX;
1006		port = 3;
1007	} else {
1008		direction = SDW_DATA_DIR_TX;
1009		if (dai->id == RT711_AIF1)
1010			port = 4;
1011		else if (dai->id == RT711_AIF2)
1012			port = 2;
1013		else
1014			return -EINVAL;
1015	}
1016
1017	stream_config.frame_rate = params_rate(params);
1018	stream_config.ch_count = params_channels(params);
1019	stream_config.bps = snd_pcm_format_width(params_format(params));
1020	stream_config.direction = direction;
1021
1022	num_channels = params_channels(params);
1023	port_config.ch_mask = (1 << (num_channels)) - 1;
1024	port_config.num = port;
1025
1026	retval = sdw_stream_add_slave(rt711->slave, &stream_config,
1027					&port_config, 1, stream->sdw_stream);
1028	if (retval) {
1029		dev_err(dai->dev, "Unable to configure port\n");
1030		return retval;
1031	}
1032
1033	if (params_channels(params) <= 16) {
1034		/* bit 3:0 Number of Channel */
1035		val |= (params_channels(params) - 1);
1036	} else {
1037		dev_err(component->dev, "Unsupported channels %d\n",
1038			params_channels(params));
1039		return -EINVAL;
1040	}
1041
1042	switch (params_width(params)) {
1043	/* bit 6:4 Bits per Sample */
1044	case 8:
1045		break;
1046	case 16:
1047		val |= (0x1 << 4);
1048		break;
1049	case 20:
1050		val |= (0x2 << 4);
1051		break;
1052	case 24:
1053		val |= (0x3 << 4);
1054		break;
1055	case 32:
1056		val |= (0x4 << 4);
1057		break;
1058	default:
1059		return -EINVAL;
1060	}
1061
1062	/* 48Khz */
1063	regmap_write(rt711->regmap, RT711_DAC_FORMAT_H, val);
1064	regmap_write(rt711->regmap, RT711_ADC1_FORMAT_H, val);
1065	regmap_write(rt711->regmap, RT711_ADC2_FORMAT_H, val);
1066
1067	return retval;
1068}
1069
1070static int rt711_pcm_hw_free(struct snd_pcm_substream *substream,
1071				struct snd_soc_dai *dai)
1072{
1073	struct snd_soc_component *component = dai->component;
1074	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
1075	struct sdw_stream_data *stream =
1076		snd_soc_dai_get_dma_data(dai, substream);
1077
1078	if (!rt711->slave)
1079		return -EINVAL;
1080
1081	sdw_stream_remove_slave(rt711->slave, stream->sdw_stream);
1082	return 0;
1083}
1084
1085#define RT711_STEREO_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
1086#define RT711_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
1087			SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
1088
1089static const struct snd_soc_dai_ops rt711_ops = {
1090	.hw_params	= rt711_pcm_hw_params,
1091	.hw_free	= rt711_pcm_hw_free,
1092	.set_sdw_stream	= rt711_set_sdw_stream,
1093	.shutdown	= rt711_shutdown,
1094};
1095
1096static struct snd_soc_dai_driver rt711_dai[] = {
1097	{
1098		.name = "rt711-aif1",
1099		.id = RT711_AIF1,
1100		.playback = {
1101			.stream_name = "DP3 Playback",
1102			.channels_min = 1,
1103			.channels_max = 2,
1104			.rates = RT711_STEREO_RATES,
1105			.formats = RT711_FORMATS,
1106		},
1107		.capture = {
1108			.stream_name = "DP4 Capture",
1109			.channels_min = 1,
1110			.channels_max = 2,
1111			.rates = RT711_STEREO_RATES,
1112			.formats = RT711_FORMATS,
1113		},
1114		.ops = &rt711_ops,
1115	},
1116	{
1117		.name = "rt711-aif2",
1118		.id = RT711_AIF2,
1119		.capture = {
1120			.stream_name = "DP2 Capture",
1121			.channels_min = 1,
1122			.channels_max = 2,
1123			.rates = RT711_STEREO_RATES,
1124			.formats = RT711_FORMATS,
1125		},
1126		.ops = &rt711_ops,
1127	}
1128};
1129
1130/* Bus clock frequency */
1131#define RT711_CLK_FREQ_9600000HZ 9600000
1132#define RT711_CLK_FREQ_12000000HZ 12000000
1133#define RT711_CLK_FREQ_6000000HZ 6000000
1134#define RT711_CLK_FREQ_4800000HZ 4800000
1135#define RT711_CLK_FREQ_2400000HZ 2400000
1136#define RT711_CLK_FREQ_12288000HZ 12288000
1137
1138int rt711_clock_config(struct device *dev)
1139{
1140	struct rt711_priv *rt711 = dev_get_drvdata(dev);
1141	unsigned int clk_freq, value;
1142
1143	clk_freq = (rt711->params.curr_dr_freq >> 1);
1144
1145	switch (clk_freq) {
1146	case RT711_CLK_FREQ_12000000HZ:
1147		value = 0x0;
1148		break;
1149	case RT711_CLK_FREQ_6000000HZ:
1150		value = 0x1;
1151		break;
1152	case RT711_CLK_FREQ_9600000HZ:
1153		value = 0x2;
1154		break;
1155	case RT711_CLK_FREQ_4800000HZ:
1156		value = 0x3;
1157		break;
1158	case RT711_CLK_FREQ_2400000HZ:
1159		value = 0x4;
1160		break;
1161	case RT711_CLK_FREQ_12288000HZ:
1162		value = 0x5;
1163		break;
1164	default:
1165		return -EINVAL;
1166	}
1167
1168	regmap_write(rt711->regmap, 0xe0, value);
1169	regmap_write(rt711->regmap, 0xf0, value);
1170
1171	dev_dbg(dev, "%s complete, clk_freq=%d\n", __func__, clk_freq);
1172
1173	return 0;
1174}
1175
1176static void rt711_calibration_work(struct work_struct *work)
1177{
1178	struct rt711_priv *rt711 =
1179		container_of(work, struct rt711_priv, calibration_work);
1180
1181	rt711_calibration(rt711);
1182}
1183
1184int rt711_init(struct device *dev, struct regmap *sdw_regmap,
1185			struct regmap *regmap, struct sdw_slave *slave)
1186{
1187	struct rt711_priv *rt711;
1188	int ret;
1189
1190	rt711 = devm_kzalloc(dev, sizeof(*rt711), GFP_KERNEL);
1191	if (!rt711)
1192		return -ENOMEM;
1193
1194	dev_set_drvdata(dev, rt711);
1195	rt711->slave = slave;
1196	rt711->sdw_regmap = sdw_regmap;
1197	rt711->regmap = regmap;
1198
 
1199	mutex_init(&rt711->disable_irq_lock);
1200
 
 
 
 
1201	/*
1202	 * Mark hw_init to false
1203	 * HW init will be performed when device reports present
1204	 */
1205	rt711->hw_init = false;
1206	rt711->first_hw_init = false;
1207
1208	/* JD source uses JD2 in default */
1209	rt711->jd_src = RT711_JD2;
1210
1211	ret =  devm_snd_soc_register_component(dev,
1212				&soc_codec_dev_rt711,
1213				rt711_dai,
1214				ARRAY_SIZE(rt711_dai));
1215
1216	dev_dbg(&slave->dev, "%s\n", __func__);
1217
1218	return ret;
1219}
1220
1221int rt711_io_init(struct device *dev, struct sdw_slave *slave)
1222{
1223	struct rt711_priv *rt711 = dev_get_drvdata(dev);
1224
1225	rt711->disable_irq = false;
1226
1227	if (rt711->hw_init)
1228		return 0;
1229
1230	if (rt711->first_hw_init) {
1231		regcache_cache_only(rt711->regmap, false);
1232		regcache_cache_bypass(rt711->regmap, true);
1233	}
1234
1235	/*
1236	 * PM runtime is only enabled when a Slave reports as Attached
1237	 */
1238	if (!rt711->first_hw_init) {
1239		/* set autosuspend parameters */
1240		pm_runtime_set_autosuspend_delay(&slave->dev, 3000);
1241		pm_runtime_use_autosuspend(&slave->dev);
1242
1243		/* update count of parent 'active' children */
1244		pm_runtime_set_active(&slave->dev);
1245
1246		/* make sure the device does not suspend immediately */
1247		pm_runtime_mark_last_busy(&slave->dev);
1248
1249		pm_runtime_enable(&slave->dev);
1250	}
1251
1252	pm_runtime_get_noresume(&slave->dev);
1253
1254	rt711_reset(rt711->regmap);
1255
1256	/* power on */
1257	regmap_write(rt711->regmap, RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
1258
1259	/* Set Pin Widget */
1260	regmap_write(rt711->regmap, RT711_SET_PIN_MIC2, 0x25);
1261	regmap_write(rt711->regmap, RT711_SET_PIN_HP, 0xc0);
1262	regmap_write(rt711->regmap, RT711_SET_PIN_DMIC1, 0x20);
1263	regmap_write(rt711->regmap, RT711_SET_PIN_DMIC2, 0x20);
1264	regmap_write(rt711->regmap, RT711_SET_PIN_LINE1, 0x20);
1265	regmap_write(rt711->regmap, RT711_SET_PIN_LINE2, 0x20);
1266
1267	/* Mute HP/ADC1/ADC2 */
1268	regmap_write(rt711->regmap, RT711_SET_GAIN_HP_H, 0xa080);
1269	regmap_write(rt711->regmap, RT711_SET_GAIN_HP_H, 0x9080);
1270	regmap_write(rt711->regmap, RT711_SET_GAIN_ADC2_H, 0x6080);
1271	regmap_write(rt711->regmap, RT711_SET_GAIN_ADC2_H, 0x5080);
1272	regmap_write(rt711->regmap, RT711_SET_GAIN_ADC1_H, 0x6080);
1273	regmap_write(rt711->regmap, RT711_SET_GAIN_ADC1_H, 0x5080);
1274
1275	/* Set Configuration Default */
1276	regmap_write(rt711->regmap, 0x4f12, 0x91);
1277	regmap_write(rt711->regmap, 0x4e12, 0xd6);
1278	regmap_write(rt711->regmap, 0x4d12, 0x11);
1279	regmap_write(rt711->regmap, 0x4c12, 0x20);
1280	regmap_write(rt711->regmap, 0x4f13, 0x91);
1281	regmap_write(rt711->regmap, 0x4e13, 0xd6);
1282	regmap_write(rt711->regmap, 0x4d13, 0x11);
1283	regmap_write(rt711->regmap, 0x4c13, 0x21);
1284	regmap_write(rt711->regmap, 0x4c21, 0xf0);
1285	regmap_write(rt711->regmap, 0x4d21, 0x11);
1286	regmap_write(rt711->regmap, 0x4e21, 0x11);
1287	regmap_write(rt711->regmap, 0x4f21, 0x01);
1288
1289	/* Data port arrangement */
1290	rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1291		RT711_TX_RX_MUX_CTL, 0x0154);
1292
1293	/* Set index */
1294	rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1295		RT711_DIGITAL_MISC_CTRL4, 0x201b);
1296	rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1297		RT711_COMBO_JACK_AUTO_CTL1, 0x5089);
1298	rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1299		RT711_VREFOUT_CTL, 0x5064);
1300	rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1301		RT711_INLINE_CMD_CTL, 0xd249);
1302
1303	/* Finish Initial Settings, set power to D3 */
1304	regmap_write(rt711->regmap, RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
1305
1306	if (rt711->first_hw_init)
1307		rt711_calibration(rt711);
1308	else {
1309		INIT_DELAYED_WORK(&rt711->jack_detect_work,
1310			rt711_jack_detect_handler);
1311		INIT_DELAYED_WORK(&rt711->jack_btn_check_work,
1312			rt711_btn_check_handler);
1313		mutex_init(&rt711->calibrate_mutex);
1314		INIT_WORK(&rt711->calibration_work, rt711_calibration_work);
1315		schedule_work(&rt711->calibration_work);
1316	}
1317
1318	/*
1319	 * if set_jack callback occurred early than io_init,
1320	 * we set up the jack detection function now
1321	 */
1322	if (rt711->hs_jack)
1323		rt711_jack_init(rt711);
1324
1325	if (rt711->first_hw_init) {
1326		regcache_cache_bypass(rt711->regmap, false);
1327		regcache_mark_dirty(rt711->regmap);
1328	} else
1329		rt711->first_hw_init = true;
1330
1331	/* Mark Slave initialization complete */
1332	rt711->hw_init = true;
1333
1334	pm_runtime_mark_last_busy(&slave->dev);
1335	pm_runtime_put_autosuspend(&slave->dev);
1336
1337	dev_dbg(&slave->dev, "%s hw_init complete\n", __func__);
1338	return 0;
1339}
1340
1341MODULE_DESCRIPTION("ASoC RT711 SDW driver");
1342MODULE_AUTHOR("Shuming Fan <shumingf@realtek.com>");
1343MODULE_LICENSE("GPL");