Linux Audio

Check our new training course

Loading...
   1// SPDX-License-Identifier: GPL-2.0-only
   2//
   3// rt722-sdca.c -- rt722 SDCA ALSA SoC audio driver
   4//
   5// Copyright(c) 2023 Realtek Semiconductor Corp.
   6//
   7//
   8
   9#include <linux/bitops.h>
  10#include <sound/core.h>
  11#include <linux/delay.h>
  12#include <linux/init.h>
  13#include <sound/initval.h>
  14#include <sound/jack.h>
  15#include <linux/kernel.h>
  16#include <linux/module.h>
  17#include <linux/moduleparam.h>
  18#include <sound/pcm.h>
  19#include <linux/pm_runtime.h>
  20#include <sound/pcm_params.h>
  21#include <linux/soundwire/sdw_registers.h>
  22#include <linux/slab.h>
  23#include <sound/soc-dapm.h>
  24#include <sound/tlv.h>
  25
  26#include "rt722-sdca.h"
  27
  28int rt722_sdca_index_write(struct rt722_sdca_priv *rt722,
  29		unsigned int nid, unsigned int reg, unsigned int value)
  30{
  31	struct regmap *regmap = rt722->mbq_regmap;
  32	unsigned int addr = (nid << 20) | reg;
  33	int ret;
  34
  35	ret = regmap_write(regmap, addr, value);
  36	if (ret < 0)
  37		dev_err(&rt722->slave->dev,
  38			"%s: Failed to set private value: %06x <= %04x ret=%d\n",
  39			__func__, addr, value, ret);
  40
  41	return ret;
  42}
  43
  44int rt722_sdca_index_read(struct rt722_sdca_priv *rt722,
  45		unsigned int nid, unsigned int reg, unsigned int *value)
  46{
  47	int ret;
  48	struct regmap *regmap = rt722->mbq_regmap;
  49	unsigned int addr = (nid << 20) | reg;
  50
  51	ret = regmap_read(regmap, addr, value);
  52	if (ret < 0)
  53		dev_err(&rt722->slave->dev,
  54			"%s: Failed to get private value: %06x => %04x ret=%d\n",
  55			__func__, addr, *value, ret);
  56
  57	return ret;
  58}
  59
  60static int rt722_sdca_index_update_bits(struct rt722_sdca_priv *rt722,
  61	unsigned int nid, unsigned int reg, unsigned int mask, unsigned int val)
  62{
  63	unsigned int tmp;
  64	int ret;
  65
  66	ret = rt722_sdca_index_read(rt722, nid, reg, &tmp);
  67	if (ret < 0)
  68		return ret;
  69
  70	set_mask_bits(&tmp, mask, val);
  71	return rt722_sdca_index_write(rt722, nid, reg, tmp);
  72}
  73
  74static int rt722_sdca_btn_type(unsigned char *buffer)
  75{
  76	if ((*buffer & 0xf0) == 0x10 || (*buffer & 0x0f) == 0x01 || (*(buffer + 1) == 0x01) ||
  77		(*(buffer + 1) == 0x10))
  78		return SND_JACK_BTN_2;
  79	else if ((*buffer & 0xf0) == 0x20 || (*buffer & 0x0f) == 0x02 || (*(buffer + 1) == 0x02) ||
  80		(*(buffer + 1) == 0x20))
  81		return SND_JACK_BTN_3;
  82	else if ((*buffer & 0xf0) == 0x40 || (*buffer & 0x0f) == 0x04 || (*(buffer + 1) == 0x04) ||
  83		(*(buffer + 1) == 0x40))
  84		return SND_JACK_BTN_0;
  85	else if ((*buffer & 0xf0) == 0x80 || (*buffer & 0x0f) == 0x08 || (*(buffer + 1) == 0x08) ||
  86		(*(buffer + 1) == 0x80))
  87		return SND_JACK_BTN_1;
  88
  89	return 0;
  90}
  91
  92static unsigned int rt722_sdca_button_detect(struct rt722_sdca_priv *rt722)
  93{
  94	unsigned int btn_type = 0, offset, idx, val, owner;
  95	int ret;
  96	unsigned char buf[3];
  97
  98	/* get current UMP message owner */
  99	ret = regmap_read(rt722->regmap,
 100		SDW_SDCA_CTL(FUNC_NUM_HID, RT722_SDCA_ENT_HID01,
 101			RT722_SDCA_CTL_HIDTX_CURRENT_OWNER, 0), &owner);
 102	if (ret < 0)
 103		return 0;
 104
 105	/* if owner is device then there is no button event from device */
 106	if (owner == 1)
 107		return 0;
 108
 109	/* read UMP message offset */
 110	ret = regmap_read(rt722->regmap,
 111		SDW_SDCA_CTL(FUNC_NUM_HID, RT722_SDCA_ENT_HID01,
 112			RT722_SDCA_CTL_HIDTX_MESSAGE_OFFSET, 0), &offset);
 113	if (ret < 0)
 114		goto _end_btn_det_;
 115
 116	for (idx = 0; idx < sizeof(buf); idx++) {
 117		ret = regmap_read(rt722->regmap,
 118			RT722_BUF_ADDR_HID1 + offset + idx, &val);
 119		if (ret < 0)
 120			goto _end_btn_det_;
 121		buf[idx] = val & 0xff;
 122	}
 123
 124	if (buf[0] == 0x11)
 125		btn_type = rt722_sdca_btn_type(&buf[1]);
 126
 127_end_btn_det_:
 128	/* Host is owner, so set back to device */
 129	if (owner == 0)
 130		/* set owner to device */
 131		regmap_write(rt722->regmap,
 132			SDW_SDCA_CTL(FUNC_NUM_HID, RT722_SDCA_ENT_HID01,
 133				RT722_SDCA_CTL_HIDTX_CURRENT_OWNER, 0), 0x01);
 134
 135	return btn_type;
 136}
 137
 138static int rt722_sdca_headset_detect(struct rt722_sdca_priv *rt722)
 139{
 140	unsigned int det_mode;
 141	int ret;
 142
 143	/* get detected_mode */
 144	ret = regmap_read(rt722->regmap,
 145		SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_GE49,
 146			RT722_SDCA_CTL_DETECTED_MODE, 0), &det_mode);
 147	if (ret < 0)
 148		goto io_error;
 149
 150	switch (det_mode) {
 151	case 0x00:
 152		rt722->jack_type = 0;
 153		break;
 154	case 0x03:
 155		rt722->jack_type = SND_JACK_HEADPHONE;
 156		break;
 157	case 0x05:
 158		rt722->jack_type = SND_JACK_HEADSET;
 159		break;
 160	}
 161
 162	/* write selected_mode */
 163	if (det_mode) {
 164		ret = regmap_write(rt722->regmap,
 165			SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_GE49,
 166				RT722_SDCA_CTL_SELECTED_MODE, 0), det_mode);
 167		if (ret < 0)
 168			goto io_error;
 169	}
 170
 171	dev_dbg(&rt722->slave->dev,
 172		"%s, detected_mode=0x%x\n", __func__, det_mode);
 173
 174	return 0;
 175
 176io_error:
 177	pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret);
 178	return ret;
 179}
 180
 181static void rt722_sdca_jack_detect_handler(struct work_struct *work)
 182{
 183	struct rt722_sdca_priv *rt722 =
 184		container_of(work, struct rt722_sdca_priv, jack_detect_work.work);
 185	int btn_type = 0, ret;
 186
 187	if (!rt722->hs_jack)
 188		return;
 189
 190	if (!rt722->component->card || !rt722->component->card->instantiated)
 191		return;
 192
 193	/* SDW_SCP_SDCA_INT_SDCA_6 is used for jack detection */
 194	if (rt722->scp_sdca_stat1 & SDW_SCP_SDCA_INT_SDCA_6) {
 195		ret = rt722_sdca_headset_detect(rt722);
 196		if (ret < 0)
 197			return;
 198	}
 199
 200	/* SDW_SCP_SDCA_INT_SDCA_8 is used for button detection */
 201	if (rt722->scp_sdca_stat2 & SDW_SCP_SDCA_INT_SDCA_8)
 202		btn_type = rt722_sdca_button_detect(rt722);
 203
 204	if (rt722->jack_type == 0)
 205		btn_type = 0;
 206
 207	dev_dbg(&rt722->slave->dev,
 208		"in %s, jack_type=%d\n", __func__, rt722->jack_type);
 209	dev_dbg(&rt722->slave->dev,
 210		"in %s, btn_type=0x%x\n", __func__, btn_type);
 211	dev_dbg(&rt722->slave->dev,
 212		"in %s, scp_sdca_stat1=0x%x, scp_sdca_stat2=0x%x\n", __func__,
 213		rt722->scp_sdca_stat1, rt722->scp_sdca_stat2);
 214
 215	snd_soc_jack_report(rt722->hs_jack, rt722->jack_type | btn_type,
 216			SND_JACK_HEADSET |
 217			SND_JACK_BTN_0 | SND_JACK_BTN_1 |
 218			SND_JACK_BTN_2 | SND_JACK_BTN_3);
 219
 220	if (btn_type) {
 221		/* button released */
 222		snd_soc_jack_report(rt722->hs_jack, rt722->jack_type,
 223			SND_JACK_HEADSET |
 224			SND_JACK_BTN_0 | SND_JACK_BTN_1 |
 225			SND_JACK_BTN_2 | SND_JACK_BTN_3);
 226
 227		mod_delayed_work(system_power_efficient_wq,
 228			&rt722->jack_btn_check_work, msecs_to_jiffies(200));
 229	}
 230}
 231
 232static void rt722_sdca_btn_check_handler(struct work_struct *work)
 233{
 234	struct rt722_sdca_priv *rt722 =
 235		container_of(work, struct rt722_sdca_priv, jack_btn_check_work.work);
 236	int btn_type = 0, ret, idx;
 237	unsigned int det_mode, offset, val;
 238	unsigned char buf[3];
 239
 240	ret = regmap_read(rt722->regmap,
 241		SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_GE49,
 242			RT722_SDCA_CTL_DETECTED_MODE, 0), &det_mode);
 243	if (ret < 0)
 244		goto io_error;
 245
 246	/* pin attached */
 247	if (det_mode) {
 248		/* read UMP message offset */
 249		ret = regmap_read(rt722->regmap,
 250			SDW_SDCA_CTL(FUNC_NUM_HID, RT722_SDCA_ENT_HID01,
 251				RT722_SDCA_CTL_HIDTX_MESSAGE_OFFSET, 0), &offset);
 252		if (ret < 0)
 253			goto io_error;
 254
 255		for (idx = 0; idx < sizeof(buf); idx++) {
 256			ret = regmap_read(rt722->regmap,
 257				RT722_BUF_ADDR_HID1 + offset + idx, &val);
 258			if (ret < 0)
 259				goto io_error;
 260			buf[idx] = val & 0xff;
 261		}
 262
 263		if (buf[0] == 0x11)
 264			btn_type = rt722_sdca_btn_type(&buf[1]);
 265	} else
 266		rt722->jack_type = 0;
 267
 268	dev_dbg(&rt722->slave->dev, "%s, btn_type=0x%x\n",	__func__, btn_type);
 269	snd_soc_jack_report(rt722->hs_jack, rt722->jack_type | btn_type,
 270			SND_JACK_HEADSET |
 271			SND_JACK_BTN_0 | SND_JACK_BTN_1 |
 272			SND_JACK_BTN_2 | SND_JACK_BTN_3);
 273
 274	if (btn_type) {
 275		/* button released */
 276		snd_soc_jack_report(rt722->hs_jack, rt722->jack_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		mod_delayed_work(system_power_efficient_wq,
 282			&rt722->jack_btn_check_work, msecs_to_jiffies(200));
 283	}
 284
 285	return;
 286
 287io_error:
 288	pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret);
 289}
 290
 291static void rt722_sdca_jack_init(struct rt722_sdca_priv *rt722)
 292{
 293	mutex_lock(&rt722->calibrate_mutex);
 294	if (rt722->hs_jack) {
 295		/* set SCP_SDCA_IntMask1[0]=1 */
 296		sdw_write_no_pm(rt722->slave, SDW_SCP_SDCA_INTMASK1,
 297			SDW_SCP_SDCA_INTMASK_SDCA_0 | SDW_SCP_SDCA_INTMASK_SDCA_6);
 298		/* set SCP_SDCA_IntMask2[0]=1 */
 299		sdw_write_no_pm(rt722->slave, SDW_SCP_SDCA_INTMASK2,
 300			SDW_SCP_SDCA_INTMASK_SDCA_8);
 301		dev_dbg(&rt722->slave->dev, "in %s enable\n", __func__);
 302		rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL,
 303			RT722_HDA_LEGACY_UNSOL_CTL, 0x016E);
 304		/* set XU(et03h) & XU(et0Dh) to Not bypassed */
 305		regmap_write(rt722->regmap,
 306			SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_XU03,
 307				RT722_SDCA_CTL_SELECTED_MODE, 0), 0);
 308		regmap_write(rt722->regmap,
 309			SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_XU0D,
 310				RT722_SDCA_CTL_SELECTED_MODE, 0), 0);
 311		/* trigger GE interrupt */
 312		rt722_sdca_index_update_bits(rt722, RT722_VENDOR_HDA_CTL,
 313			RT722_GE_RELATED_CTL2, 0x4000, 0x4000);
 314	}
 315	mutex_unlock(&rt722->calibrate_mutex);
 316}
 317
 318static int rt722_sdca_set_jack_detect(struct snd_soc_component *component,
 319	struct snd_soc_jack *hs_jack, void *data)
 320{
 321	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
 322	int ret;
 323
 324	rt722->hs_jack = hs_jack;
 325
 326	ret = pm_runtime_resume_and_get(component->dev);
 327	if (ret < 0) {
 328		if (ret != -EACCES) {
 329			dev_err(component->dev, "%s: failed to resume %d\n", __func__, ret);
 330			return ret;
 331		}
 332		/* pm_runtime not enabled yet */
 333		dev_dbg(component->dev,	"%s: skipping jack init for now\n", __func__);
 334		return 0;
 335	}
 336
 337	rt722_sdca_jack_init(rt722);
 338
 339	pm_runtime_mark_last_busy(component->dev);
 340	pm_runtime_put_autosuspend(component->dev);
 341
 342	return 0;
 343}
 344
 345/* For SDCA control DAC/ADC Gain */
 346static int rt722_sdca_set_gain_put(struct snd_kcontrol *kcontrol,
 347		struct snd_ctl_elem_value *ucontrol)
 348{
 349	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
 350	struct soc_mixer_control *mc =
 351		(struct soc_mixer_control *)kcontrol->private_value;
 352	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
 353	unsigned int read_l, read_r, gain_l_val, gain_r_val;
 354	unsigned int adc_vol_flag = 0, changed = 0;
 355	unsigned int lvalue, rvalue;
 356	const unsigned int interval_offset = 0xc0;
 357	const unsigned int tendB = 0xa00;
 358
 359	if (strstr(ucontrol->id.name, "FU1E Capture Volume") ||
 360		strstr(ucontrol->id.name, "FU0F Capture Volume"))
 361		adc_vol_flag = 1;
 362
 363	regmap_read(rt722->mbq_regmap, mc->reg, &lvalue);
 364	regmap_read(rt722->mbq_regmap, mc->rreg, &rvalue);
 365
 366	/* L Channel */
 367	gain_l_val = ucontrol->value.integer.value[0];
 368	if (gain_l_val > mc->max)
 369		gain_l_val = mc->max;
 370
 371	if (mc->shift == 8) /* boost gain */
 372		gain_l_val = gain_l_val * tendB;
 373	else {
 374		/* ADC/DAC gain */
 375		if (adc_vol_flag)
 376			gain_l_val = 0x1e00 - ((mc->max - gain_l_val) * interval_offset);
 377		else
 378			gain_l_val = 0 - ((mc->max - gain_l_val) * interval_offset);
 379		gain_l_val &= 0xffff;
 380	}
 381
 382	/* R Channel */
 383	gain_r_val = ucontrol->value.integer.value[1];
 384	if (gain_r_val > mc->max)
 385		gain_r_val = mc->max;
 386
 387	if (mc->shift == 8) /* boost gain */
 388		gain_r_val = gain_r_val * tendB;
 389	else {
 390		/* ADC/DAC gain */
 391		if (adc_vol_flag)
 392			gain_r_val = 0x1e00 - ((mc->max - gain_r_val) * interval_offset);
 393		else
 394			gain_r_val = 0 - ((mc->max - gain_r_val) * interval_offset);
 395		gain_r_val &= 0xffff;
 396	}
 397
 398	if (lvalue != gain_l_val || rvalue != gain_r_val)
 399		changed = 1;
 400	else
 401		return 0;
 402
 403	/* Lch*/
 404	regmap_write(rt722->mbq_regmap, mc->reg, gain_l_val);
 405
 406	/* Rch */
 407	regmap_write(rt722->mbq_regmap, mc->rreg, gain_r_val);
 408
 409	regmap_read(rt722->mbq_regmap, mc->reg, &read_l);
 410	regmap_read(rt722->mbq_regmap, mc->rreg, &read_r);
 411	if (read_r == gain_r_val && read_l == gain_l_val)
 412		return changed;
 413
 414	return -EIO;
 415}
 416
 417static int rt722_sdca_set_gain_get(struct snd_kcontrol *kcontrol,
 418		struct snd_ctl_elem_value *ucontrol)
 419{
 420	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
 421	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
 422	struct soc_mixer_control *mc =
 423		(struct soc_mixer_control *)kcontrol->private_value;
 424	unsigned int read_l, read_r, ctl_l = 0, ctl_r = 0;
 425	unsigned int adc_vol_flag = 0;
 426	const unsigned int interval_offset = 0xc0;
 427	const unsigned int tendB = 0xa00;
 428
 429	if (strstr(ucontrol->id.name, "FU1E Capture Volume") ||
 430		strstr(ucontrol->id.name, "FU0F Capture Volume"))
 431		adc_vol_flag = 1;
 432
 433	regmap_read(rt722->mbq_regmap, mc->reg, &read_l);
 434	regmap_read(rt722->mbq_regmap, mc->rreg, &read_r);
 435
 436	if (mc->shift == 8) /* boost gain */
 437		ctl_l = read_l / tendB;
 438	else {
 439		if (adc_vol_flag)
 440			ctl_l = mc->max - (((0x1e00 - read_l) & 0xffff) / interval_offset);
 441		else
 442			ctl_l = mc->max - (((0 - read_l) & 0xffff) / interval_offset);
 443	}
 444
 445	if (read_l != read_r) {
 446		if (mc->shift == 8) /* boost gain */
 447			ctl_r = read_r / tendB;
 448		else { /* ADC/DAC gain */
 449			if (adc_vol_flag)
 450				ctl_r = mc->max - (((0x1e00 - read_r) & 0xffff) / interval_offset);
 451			else
 452				ctl_r = mc->max - (((0 - read_r) & 0xffff) / interval_offset);
 453		}
 454	} else {
 455		ctl_r = ctl_l;
 456	}
 457
 458	ucontrol->value.integer.value[0] = ctl_l;
 459	ucontrol->value.integer.value[1] = ctl_r;
 460
 461	return 0;
 462}
 463
 464static int rt722_sdca_set_fu1e_capture_ctl(struct rt722_sdca_priv *rt722)
 465{
 466	int err, i;
 467	unsigned int ch_mute;
 468
 469	for (i = 0; i < ARRAY_SIZE(rt722->fu1e_mixer_mute); i++) {
 470		ch_mute = rt722->fu1e_dapm_mute || rt722->fu1e_mixer_mute[i];
 471		err = regmap_write(rt722->regmap,
 472				SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT722_SDCA_ENT_USER_FU1E,
 473				RT722_SDCA_CTL_FU_MUTE, CH_01) + i, ch_mute);
 474		if (err < 0)
 475			return err;
 476	}
 477
 478	return 0;
 479}
 480
 481static int rt722_sdca_fu1e_capture_get(struct snd_kcontrol *kcontrol,
 482			struct snd_ctl_elem_value *ucontrol)
 483{
 484	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
 485	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
 486	struct rt722_sdca_dmic_kctrl_priv *p =
 487		(struct rt722_sdca_dmic_kctrl_priv *)kcontrol->private_value;
 488	unsigned int i;
 489
 490	for (i = 0; i < p->count; i++)
 491		ucontrol->value.integer.value[i] = !rt722->fu1e_mixer_mute[i];
 492
 493	return 0;
 494}
 495
 496static int rt722_sdca_fu1e_capture_put(struct snd_kcontrol *kcontrol,
 497			struct snd_ctl_elem_value *ucontrol)
 498{
 499	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
 500	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
 501	struct rt722_sdca_dmic_kctrl_priv *p =
 502		(struct rt722_sdca_dmic_kctrl_priv *)kcontrol->private_value;
 503	int err, changed = 0, i;
 504
 505	for (i = 0; i < p->count; i++) {
 506		if (rt722->fu1e_mixer_mute[i] != !ucontrol->value.integer.value[i])
 507			changed = 1;
 508		rt722->fu1e_mixer_mute[i] = !ucontrol->value.integer.value[i];
 509	}
 510
 511	err = rt722_sdca_set_fu1e_capture_ctl(rt722);
 512	if (err < 0)
 513		return err;
 514
 515	return changed;
 516}
 517
 518static int rt722_sdca_set_fu0f_capture_ctl(struct rt722_sdca_priv *rt722)
 519{
 520	int err;
 521	unsigned int ch_l, ch_r;
 522
 523	ch_l = (rt722->fu0f_dapm_mute || rt722->fu0f_mixer_l_mute) ? 0x01 : 0x00;
 524	ch_r = (rt722->fu0f_dapm_mute || rt722->fu0f_mixer_r_mute) ? 0x01 : 0x00;
 525
 526	err = regmap_write(rt722->regmap,
 527			SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_USER_FU0F,
 528			RT722_SDCA_CTL_FU_MUTE, CH_L), ch_l);
 529	if (err < 0)
 530		return err;
 531
 532	err = regmap_write(rt722->regmap,
 533			SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_USER_FU0F,
 534			RT722_SDCA_CTL_FU_MUTE, CH_R), ch_r);
 535	if (err < 0)
 536		return err;
 537
 538	return 0;
 539}
 540
 541static int rt722_sdca_fu0f_capture_get(struct snd_kcontrol *kcontrol,
 542			struct snd_ctl_elem_value *ucontrol)
 543{
 544	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
 545	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
 546
 547	ucontrol->value.integer.value[0] = !rt722->fu0f_mixer_l_mute;
 548	ucontrol->value.integer.value[1] = !rt722->fu0f_mixer_r_mute;
 549	return 0;
 550}
 551
 552static int rt722_sdca_fu0f_capture_put(struct snd_kcontrol *kcontrol,
 553			struct snd_ctl_elem_value *ucontrol)
 554{
 555	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
 556	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
 557	int err, changed = 0;
 558
 559	if (rt722->fu0f_mixer_l_mute != !ucontrol->value.integer.value[0] ||
 560		rt722->fu0f_mixer_r_mute != !ucontrol->value.integer.value[1])
 561		changed = 1;
 562
 563	rt722->fu0f_mixer_l_mute = !ucontrol->value.integer.value[0];
 564	rt722->fu0f_mixer_r_mute = !ucontrol->value.integer.value[1];
 565	err = rt722_sdca_set_fu0f_capture_ctl(rt722);
 566	if (err < 0)
 567		return err;
 568
 569	return changed;
 570}
 571
 572static int rt722_sdca_fu_info(struct snd_kcontrol *kcontrol,
 573	struct snd_ctl_elem_info *uinfo)
 574{
 575	struct rt722_sdca_dmic_kctrl_priv *p =
 576		(struct rt722_sdca_dmic_kctrl_priv *)kcontrol->private_value;
 577
 578	if (p->max == 1)
 579		uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
 580	else
 581		uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 582	uinfo->count = p->count;
 583	uinfo->value.integer.min = 0;
 584	uinfo->value.integer.max = p->max;
 585	return 0;
 586}
 587
 588static int rt722_sdca_dmic_set_gain_get(struct snd_kcontrol *kcontrol,
 589		struct snd_ctl_elem_value *ucontrol)
 590{
 591	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
 592	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
 593	struct rt722_sdca_dmic_kctrl_priv *p =
 594		(struct rt722_sdca_dmic_kctrl_priv *)kcontrol->private_value;
 595	unsigned int boost_step = 0x0a00;
 596	unsigned int vol_max = 0x1e00;
 597	unsigned int regvalue, ctl, i;
 598	unsigned int adc_vol_flag = 0;
 599	const unsigned int interval_offset = 0xc0;
 600
 601	if (strstr(ucontrol->id.name, "FU1E Capture Volume"))
 602		adc_vol_flag = 1;
 603
 604	/* check all channels */
 605	for (i = 0; i < p->count; i++) {
 606		regmap_read(rt722->mbq_regmap, p->reg_base + i, &regvalue);
 607
 608		if (!adc_vol_flag) /* boost gain */
 609			ctl = regvalue / boost_step;
 610		else { /* ADC gain */
 611			if (adc_vol_flag)
 612				ctl = p->max - (((vol_max - regvalue) & 0xffff) / interval_offset);
 613			else
 614				ctl = p->max - (((0 - regvalue) & 0xffff) / interval_offset);
 615		}
 616
 617		ucontrol->value.integer.value[i] = ctl;
 618	}
 619
 620	return 0;
 621}
 622
 623static int rt722_sdca_dmic_set_gain_put(struct snd_kcontrol *kcontrol,
 624		struct snd_ctl_elem_value *ucontrol)
 625{
 626	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
 627	struct rt722_sdca_dmic_kctrl_priv *p =
 628		(struct rt722_sdca_dmic_kctrl_priv *)kcontrol->private_value;
 629	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
 630	unsigned int boost_step = 0x0a00;
 631	unsigned int vol_max = 0x1e00;
 632	unsigned int gain_val[4];
 633	unsigned int i, adc_vol_flag = 0, changed = 0;
 634	unsigned int regvalue[4];
 635	const unsigned int interval_offset = 0xc0;
 636	int err;
 637
 638	if (strstr(ucontrol->id.name, "FU1E Capture Volume"))
 639		adc_vol_flag = 1;
 640
 641	/* check all channels */
 642	for (i = 0; i < p->count; i++) {
 643		regmap_read(rt722->mbq_regmap, p->reg_base + i, &regvalue[i]);
 644
 645		gain_val[i] = ucontrol->value.integer.value[i];
 646		if (gain_val[i] > p->max)
 647			gain_val[i] = p->max;
 648
 649		if (!adc_vol_flag) /* boost gain */
 650			gain_val[i] = gain_val[i] * boost_step;
 651		else { /* ADC gain */
 652			gain_val[i] = vol_max - ((p->max - gain_val[i]) * interval_offset);
 653			gain_val[i] &= 0xffff;
 654		}
 655
 656		if (regvalue[i] != gain_val[i])
 657			changed = 1;
 658	}
 659
 660	if (!changed)
 661		return 0;
 662
 663	for (i = 0; i < p->count; i++) {
 664		err = regmap_write(rt722->mbq_regmap, p->reg_base + i, gain_val[i]);
 665		if (err < 0)
 666			dev_err(&rt722->slave->dev, "%s: %#08x can't be set\n",
 667				__func__, p->reg_base + i);
 668	}
 669
 670	return changed;
 671}
 672
 673#define RT722_SDCA_PR_VALUE(xreg_base, xcount, xmax, xinvert) \
 674	((unsigned long)&(struct rt722_sdca_dmic_kctrl_priv) \
 675		{.reg_base = xreg_base, .count = xcount, .max = xmax, \
 676		.invert = xinvert})
 677
 678#define RT722_SDCA_FU_CTRL(xname, reg_base, xmax, xinvert, xcount) \
 679{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
 680	.info = rt722_sdca_fu_info, \
 681	.get = rt722_sdca_fu1e_capture_get, \
 682	.put = rt722_sdca_fu1e_capture_put, \
 683	.private_value = RT722_SDCA_PR_VALUE(reg_base, xcount, xmax, xinvert)}
 684
 685#define RT722_SDCA_EXT_TLV(xname, reg_base, xhandler_get,\
 686	 xhandler_put, xcount, xmax, tlv_array) \
 687{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
 688	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
 689		 SNDRV_CTL_ELEM_ACCESS_READWRITE, \
 690	.tlv.p = (tlv_array), \
 691	.info = rt722_sdca_fu_info, \
 692	.get = xhandler_get, .put = xhandler_put, \
 693	.private_value = RT722_SDCA_PR_VALUE(reg_base, xcount, xmax, 0) }
 694
 695static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -6525, 75, 0);
 696static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, -1725, 75, 0);
 697static const DECLARE_TLV_DB_SCALE(boost_vol_tlv, 0, 1000, 0);
 698
 699static const struct snd_kcontrol_new rt722_sdca_controls[] = {
 700	/* Headphone playback settings */
 701	SOC_DOUBLE_R_EXT_TLV("FU05 Playback Volume",
 702		SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_USER_FU05,
 703			RT722_SDCA_CTL_FU_VOLUME, CH_L),
 704		SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_USER_FU05,
 705			RT722_SDCA_CTL_FU_VOLUME, CH_R), 0, 0x57, 0,
 706		rt722_sdca_set_gain_get, rt722_sdca_set_gain_put, out_vol_tlv),
 707	/* Headset mic capture settings */
 708	SOC_DOUBLE_EXT("FU0F Capture Switch", SND_SOC_NOPM, 0, 1, 1, 0,
 709		rt722_sdca_fu0f_capture_get, rt722_sdca_fu0f_capture_put),
 710	SOC_DOUBLE_R_EXT_TLV("FU0F Capture Volume",
 711		SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_USER_FU0F,
 712			RT722_SDCA_CTL_FU_VOLUME, CH_L),
 713		SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_USER_FU0F,
 714			RT722_SDCA_CTL_FU_VOLUME, CH_R), 0, 0x3f, 0,
 715		rt722_sdca_set_gain_get, rt722_sdca_set_gain_put, mic_vol_tlv),
 716	SOC_DOUBLE_R_EXT_TLV("FU33 Boost Volume",
 717		SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_PLATFORM_FU44,
 718			RT722_SDCA_CTL_FU_CH_GAIN, CH_L),
 719		SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_PLATFORM_FU44,
 720			RT722_SDCA_CTL_FU_CH_GAIN, CH_R), 8, 3, 0,
 721		rt722_sdca_set_gain_get, rt722_sdca_set_gain_put, boost_vol_tlv),
 722	/* AMP playback settings */
 723	SOC_DOUBLE_R_EXT_TLV("FU06 Playback Volume",
 724		SDW_SDCA_CTL(FUNC_NUM_AMP, RT722_SDCA_ENT_USER_FU06,
 725			RT722_SDCA_CTL_FU_VOLUME, CH_L),
 726		SDW_SDCA_CTL(FUNC_NUM_AMP, RT722_SDCA_ENT_USER_FU06,
 727			RT722_SDCA_CTL_FU_VOLUME, CH_R), 0, 0x57, 0,
 728		rt722_sdca_set_gain_get, rt722_sdca_set_gain_put, out_vol_tlv),
 729	/* DMIC capture settings */
 730	RT722_SDCA_FU_CTRL("FU1E Capture Switch",
 731		SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT722_SDCA_ENT_USER_FU1E,
 732			RT722_SDCA_CTL_FU_MUTE, CH_01), 1, 1, 4),
 733	RT722_SDCA_EXT_TLV("FU1E Capture Volume",
 734		SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT722_SDCA_ENT_USER_FU1E,
 735			RT722_SDCA_CTL_FU_VOLUME, CH_01),
 736		rt722_sdca_dmic_set_gain_get, rt722_sdca_dmic_set_gain_put,
 737			4, 0x3f, mic_vol_tlv),
 738	RT722_SDCA_EXT_TLV("FU15 Boost Volume",
 739		SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT722_SDCA_ENT_FU15,
 740			RT722_SDCA_CTL_FU_CH_GAIN, CH_01),
 741		rt722_sdca_dmic_set_gain_get, rt722_sdca_dmic_set_gain_put,
 742			4, 3, boost_vol_tlv),
 743};
 744
 745static int rt722_sdca_adc_mux_get(struct snd_kcontrol *kcontrol,
 746			struct snd_ctl_elem_value *ucontrol)
 747{
 748	struct snd_soc_component *component =
 749		snd_soc_dapm_kcontrol_component(kcontrol);
 750	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
 751	unsigned int val = 0, mask_sft;
 752
 753	if (strstr(ucontrol->id.name, "ADC 22 Mux"))
 754		mask_sft = 12;
 755	else if (strstr(ucontrol->id.name, "ADC 24 Mux"))
 756		mask_sft = 4;
 757	else if (strstr(ucontrol->id.name, "ADC 25 Mux"))
 758		mask_sft = 0;
 759	else
 760		return -EINVAL;
 761
 762	rt722_sdca_index_read(rt722, RT722_VENDOR_HDA_CTL,
 763		RT722_HDA_LEGACY_MUX_CTL0, &val);
 764
 765	ucontrol->value.enumerated.item[0] = (val >> mask_sft) & 0x7;
 766
 767	return 0;
 768}
 769
 770static int rt722_sdca_adc_mux_put(struct snd_kcontrol *kcontrol,
 771			struct snd_ctl_elem_value *ucontrol)
 772{
 773	struct snd_soc_component *component =
 774		snd_soc_dapm_kcontrol_component(kcontrol);
 775	struct snd_soc_dapm_context *dapm =
 776		snd_soc_dapm_kcontrol_dapm(kcontrol);
 777	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
 778	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
 779	unsigned int *item = ucontrol->value.enumerated.item;
 780	unsigned int val, val2 = 0, change, mask_sft;
 781
 782	if (item[0] >= e->items)
 783		return -EINVAL;
 784
 785	if (strstr(ucontrol->id.name, "ADC 22 Mux"))
 786		mask_sft = 12;
 787	else if (strstr(ucontrol->id.name, "ADC 24 Mux"))
 788		mask_sft = 4;
 789	else if (strstr(ucontrol->id.name, "ADC 25 Mux"))
 790		mask_sft = 0;
 791	else
 792		return -EINVAL;
 793
 794	val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
 795
 796	rt722_sdca_index_read(rt722, RT722_VENDOR_HDA_CTL,
 797		RT722_HDA_LEGACY_MUX_CTL0, &val2);
 798	val2 = (0x7 << mask_sft) & val2;
 799
 800	if (val == val2)
 801		change = 0;
 802	else
 803		change = 1;
 804
 805	if (change)
 806		rt722_sdca_index_update_bits(rt722, RT722_VENDOR_HDA_CTL,
 807			RT722_HDA_LEGACY_MUX_CTL0, 0x7 << mask_sft,
 808			val << mask_sft);
 809
 810	snd_soc_dapm_mux_update_power(dapm, kcontrol,
 811		item[0], e, NULL);
 812
 813	return change;
 814}
 815
 816static const char * const adc22_mux_text[] = {
 817	"MIC2",
 818	"LINE1",
 819	"LINE2",
 820};
 821
 822static const char * const adc07_10_mux_text[] = {
 823	"DMIC1",
 824	"DMIC2",
 825};
 826
 827static SOC_ENUM_SINGLE_DECL(
 828	rt722_adc22_enum, SND_SOC_NOPM, 0, adc22_mux_text);
 829
 830static SOC_ENUM_SINGLE_DECL(
 831	rt722_adc24_enum, SND_SOC_NOPM, 0, adc07_10_mux_text);
 832
 833static SOC_ENUM_SINGLE_DECL(
 834	rt722_adc25_enum, SND_SOC_NOPM, 0, adc07_10_mux_text);
 835
 836static const struct snd_kcontrol_new rt722_sdca_adc22_mux =
 837	SOC_DAPM_ENUM_EXT("ADC 22 Mux", rt722_adc22_enum,
 838			rt722_sdca_adc_mux_get, rt722_sdca_adc_mux_put);
 839
 840static const struct snd_kcontrol_new rt722_sdca_adc24_mux =
 841	SOC_DAPM_ENUM_EXT("ADC 24 Mux", rt722_adc24_enum,
 842			rt722_sdca_adc_mux_get, rt722_sdca_adc_mux_put);
 843
 844static const struct snd_kcontrol_new rt722_sdca_adc25_mux =
 845	SOC_DAPM_ENUM_EXT("ADC 25 Mux", rt722_adc25_enum,
 846			rt722_sdca_adc_mux_get, rt722_sdca_adc_mux_put);
 847
 848static int rt722_sdca_fu42_event(struct snd_soc_dapm_widget *w,
 849	struct snd_kcontrol *kcontrol, int event)
 850{
 851	struct snd_soc_component *component =
 852		snd_soc_dapm_to_component(w->dapm);
 853	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
 854	unsigned char unmute = 0x0, mute = 0x1;
 855
 856	switch (event) {
 857	case SND_SOC_DAPM_POST_PMU:
 858		regmap_write(rt722->regmap,
 859			SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_USER_FU05,
 860				RT722_SDCA_CTL_FU_MUTE, CH_L), unmute);
 861		regmap_write(rt722->regmap,
 862			SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_USER_FU05,
 863				RT722_SDCA_CTL_FU_MUTE, CH_R), unmute);
 864		break;
 865	case SND_SOC_DAPM_PRE_PMD:
 866		regmap_write(rt722->regmap,
 867			SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_USER_FU05,
 868				RT722_SDCA_CTL_FU_MUTE, CH_L), mute);
 869		regmap_write(rt722->regmap,
 870			SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_USER_FU05,
 871				RT722_SDCA_CTL_FU_MUTE, CH_R), mute);
 872		break;
 873	}
 874	return 0;
 875}
 876
 877static int rt722_sdca_fu21_event(struct snd_soc_dapm_widget *w,
 878	struct snd_kcontrol *kcontrol, int event)
 879{
 880	struct snd_soc_component *component =
 881		snd_soc_dapm_to_component(w->dapm);
 882	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
 883	unsigned char unmute = 0x0, mute = 0x1;
 884
 885	switch (event) {
 886	case SND_SOC_DAPM_POST_PMU:
 887		regmap_write(rt722->regmap,
 888			SDW_SDCA_CTL(FUNC_NUM_AMP, RT722_SDCA_ENT_USER_FU06,
 889				RT722_SDCA_CTL_FU_MUTE, CH_L), unmute);
 890		regmap_write(rt722->regmap,
 891			SDW_SDCA_CTL(FUNC_NUM_AMP, RT722_SDCA_ENT_USER_FU06,
 892				RT722_SDCA_CTL_FU_MUTE, CH_R), unmute);
 893		break;
 894	case SND_SOC_DAPM_PRE_PMD:
 895		regmap_write(rt722->regmap,
 896			SDW_SDCA_CTL(FUNC_NUM_AMP, RT722_SDCA_ENT_USER_FU06,
 897				RT722_SDCA_CTL_FU_MUTE, CH_L), mute);
 898		regmap_write(rt722->regmap,
 899			SDW_SDCA_CTL(FUNC_NUM_AMP, RT722_SDCA_ENT_USER_FU06,
 900				RT722_SDCA_CTL_FU_MUTE, CH_R), mute);
 901		break;
 902	}
 903	return 0;
 904}
 905
 906static int rt722_sdca_fu113_event(struct snd_soc_dapm_widget *w,
 907	struct snd_kcontrol *kcontrol, int event)
 908{
 909	struct snd_soc_component *component =
 910		snd_soc_dapm_to_component(w->dapm);
 911	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
 912
 913	switch (event) {
 914	case SND_SOC_DAPM_POST_PMU:
 915		rt722->fu1e_dapm_mute = false;
 916		rt722_sdca_set_fu1e_capture_ctl(rt722);
 917		break;
 918	case SND_SOC_DAPM_PRE_PMD:
 919		rt722->fu1e_dapm_mute = true;
 920		rt722_sdca_set_fu1e_capture_ctl(rt722);
 921		break;
 922	}
 923	return 0;
 924}
 925
 926static int rt722_sdca_fu36_event(struct snd_soc_dapm_widget *w,
 927	struct snd_kcontrol *kcontrol, int event)
 928{
 929	struct snd_soc_component *component =
 930		snd_soc_dapm_to_component(w->dapm);
 931	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
 932
 933	switch (event) {
 934	case SND_SOC_DAPM_POST_PMU:
 935		rt722->fu0f_dapm_mute = false;
 936		rt722_sdca_set_fu0f_capture_ctl(rt722);
 937		break;
 938	case SND_SOC_DAPM_PRE_PMD:
 939		rt722->fu0f_dapm_mute = true;
 940		rt722_sdca_set_fu0f_capture_ctl(rt722);
 941		break;
 942	}
 943	return 0;
 944}
 945
 946static int rt722_sdca_pde47_event(struct snd_soc_dapm_widget *w,
 947	struct snd_kcontrol *kcontrol, int event)
 948{
 949	struct snd_soc_component *component =
 950		snd_soc_dapm_to_component(w->dapm);
 951	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
 952	unsigned char ps0 = 0x0, ps3 = 0x3;
 953
 954	switch (event) {
 955	case SND_SOC_DAPM_POST_PMU:
 956		regmap_write(rt722->regmap,
 957			SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_PDE40,
 958				RT722_SDCA_CTL_REQ_POWER_STATE, 0), ps0);
 959		break;
 960	case SND_SOC_DAPM_PRE_PMD:
 961		regmap_write(rt722->regmap,
 962			SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_PDE40,
 963				RT722_SDCA_CTL_REQ_POWER_STATE, 0), ps3);
 964		break;
 965	}
 966	return 0;
 967}
 968
 969static int rt722_sdca_pde23_event(struct snd_soc_dapm_widget *w,
 970	struct snd_kcontrol *kcontrol, int event)
 971{
 972	struct snd_soc_component *component =
 973		snd_soc_dapm_to_component(w->dapm);
 974	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
 975	unsigned char ps0 = 0x0, ps3 = 0x3;
 976
 977	switch (event) {
 978	case SND_SOC_DAPM_POST_PMU:
 979		regmap_write(rt722->regmap,
 980			SDW_SDCA_CTL(FUNC_NUM_AMP, RT722_SDCA_ENT_PDE23,
 981				RT722_SDCA_CTL_REQ_POWER_STATE, 0), ps0);
 982		break;
 983	case SND_SOC_DAPM_PRE_PMD:
 984		regmap_write(rt722->regmap,
 985			SDW_SDCA_CTL(FUNC_NUM_AMP, RT722_SDCA_ENT_PDE23,
 986				RT722_SDCA_CTL_REQ_POWER_STATE, 0), ps3);
 987		break;
 988	}
 989	return 0;
 990}
 991
 992static int rt722_sdca_pde11_event(struct snd_soc_dapm_widget *w,
 993	struct snd_kcontrol *kcontrol, int event)
 994{
 995	struct snd_soc_component *component =
 996		snd_soc_dapm_to_component(w->dapm);
 997	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
 998	unsigned char ps0 = 0x0, ps3 = 0x3;
 999
1000	switch (event) {
1001	case SND_SOC_DAPM_POST_PMU:
1002		regmap_write(rt722->regmap,
1003			SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT722_SDCA_ENT_PDE2A,
1004				RT722_SDCA_CTL_REQ_POWER_STATE, 0), ps0);
1005		break;
1006	case SND_SOC_DAPM_PRE_PMD:
1007		regmap_write(rt722->regmap,
1008			SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT722_SDCA_ENT_PDE2A,
1009				RT722_SDCA_CTL_REQ_POWER_STATE, 0), ps3);
1010		break;
1011	}
1012	return 0;
1013}
1014
1015static int rt722_sdca_pde12_event(struct snd_soc_dapm_widget *w,
1016	struct snd_kcontrol *kcontrol, int event)
1017{
1018	struct snd_soc_component *component =
1019		snd_soc_dapm_to_component(w->dapm);
1020	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
1021	unsigned char ps0 = 0x0, ps3 = 0x3;
1022
1023	switch (event) {
1024	case SND_SOC_DAPM_POST_PMU:
1025		regmap_write(rt722->regmap,
1026			SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_PDE12,
1027				RT722_SDCA_CTL_REQ_POWER_STATE, 0), ps0);
1028		break;
1029	case SND_SOC_DAPM_PRE_PMD:
1030		regmap_write(rt722->regmap,
1031			SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_PDE12,
1032				RT722_SDCA_CTL_REQ_POWER_STATE, 0), ps3);
1033		break;
1034	}
1035	return 0;
1036}
1037
1038static const struct snd_soc_dapm_widget rt722_sdca_dapm_widgets[] = {
1039	SND_SOC_DAPM_OUTPUT("HP"),
1040	SND_SOC_DAPM_OUTPUT("SPK"),
1041	SND_SOC_DAPM_INPUT("MIC2"),
1042	SND_SOC_DAPM_INPUT("LINE1"),
1043	SND_SOC_DAPM_INPUT("LINE2"),
1044	SND_SOC_DAPM_INPUT("DMIC1_2"),
1045	SND_SOC_DAPM_INPUT("DMIC3_4"),
1046
1047	SND_SOC_DAPM_SUPPLY("PDE 23", SND_SOC_NOPM, 0, 0,
1048		rt722_sdca_pde23_event,
1049		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1050	SND_SOC_DAPM_SUPPLY("PDE 47", SND_SOC_NOPM, 0, 0,
1051		rt722_sdca_pde47_event,
1052		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1053	SND_SOC_DAPM_SUPPLY("PDE 11", SND_SOC_NOPM, 0, 0,
1054		rt722_sdca_pde11_event,
1055		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1056	SND_SOC_DAPM_SUPPLY("PDE 12", SND_SOC_NOPM, 0, 0,
1057		rt722_sdca_pde12_event,
1058		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1059
1060	SND_SOC_DAPM_DAC_E("FU 21", NULL, SND_SOC_NOPM, 0, 0,
1061		rt722_sdca_fu21_event,
1062		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1063	SND_SOC_DAPM_DAC_E("FU 42", NULL, SND_SOC_NOPM, 0, 0,
1064		rt722_sdca_fu42_event,
1065		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1066	SND_SOC_DAPM_ADC_E("FU 36", NULL, SND_SOC_NOPM, 0, 0,
1067		rt722_sdca_fu36_event,
1068		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1069	SND_SOC_DAPM_ADC_E("FU 113", NULL, SND_SOC_NOPM, 0, 0,
1070		rt722_sdca_fu113_event,
1071		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1072	SND_SOC_DAPM_MUX("ADC 22 Mux", SND_SOC_NOPM, 0, 0,
1073		&rt722_sdca_adc22_mux),
1074	SND_SOC_DAPM_MUX("ADC 24 Mux", SND_SOC_NOPM, 0, 0,
1075		&rt722_sdca_adc24_mux),
1076	SND_SOC_DAPM_MUX("ADC 25 Mux", SND_SOC_NOPM, 0, 0,
1077		&rt722_sdca_adc25_mux),
1078
1079	SND_SOC_DAPM_AIF_IN("DP1RX", "DP1 Headphone Playback", 0, SND_SOC_NOPM, 0, 0),
1080	SND_SOC_DAPM_AIF_OUT("DP2TX", "DP2 Headset Capture", 0, SND_SOC_NOPM, 0, 0),
1081	SND_SOC_DAPM_AIF_IN("DP3RX", "DP3 Speaker Playback", 0, SND_SOC_NOPM, 0, 0),
1082	SND_SOC_DAPM_AIF_OUT("DP6TX", "DP6 DMic Capture", 0, SND_SOC_NOPM, 0, 0),
1083};
1084
1085static const struct snd_soc_dapm_route rt722_sdca_audio_map[] = {
1086	{"FU 42", NULL, "DP1RX"},
1087	{"FU 21", NULL, "DP3RX"},
1088
1089	{"ADC 22 Mux", "MIC2", "MIC2"},
1090	{"ADC 22 Mux", "LINE1", "LINE1"},
1091	{"ADC 22 Mux", "LINE2", "LINE2"},
1092	{"ADC 24 Mux", "DMIC1", "DMIC1_2"},
1093	{"ADC 24 Mux", "DMIC2", "DMIC3_4"},
1094	{"ADC 25 Mux", "DMIC1", "DMIC1_2"},
1095	{"ADC 25 Mux", "DMIC2", "DMIC3_4"},
1096	{"FU 36", NULL, "PDE 12"},
1097	{"FU 36", NULL, "ADC 22 Mux"},
1098	{"FU 113", NULL, "PDE 11"},
1099	{"FU 113", NULL, "ADC 24 Mux"},
1100	{"FU 113", NULL, "ADC 25 Mux"},
1101	{"DP2TX", NULL, "FU 36"},
1102	{"DP6TX", NULL, "FU 113"},
1103
1104	{"HP", NULL, "PDE 47"},
1105	{"HP", NULL, "FU 42"},
1106	{"SPK", NULL, "PDE 23"},
1107	{"SPK", NULL, "FU 21"},
1108};
1109
1110static int rt722_sdca_parse_dt(struct rt722_sdca_priv *rt722, struct device *dev)
1111{
1112	device_property_read_u32(dev, "realtek,jd-src", &rt722->jd_src);
1113
1114	return 0;
1115}
1116
1117static int rt722_sdca_probe(struct snd_soc_component *component)
1118{
1119	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
1120	int ret;
1121
1122	rt722_sdca_parse_dt(rt722, &rt722->slave->dev);
1123	rt722->component = component;
1124
1125	ret = pm_runtime_resume(component->dev);
1126	if (ret < 0 && ret != -EACCES)
1127		return ret;
1128
1129	return 0;
1130}
1131
1132static const struct snd_soc_component_driver soc_sdca_dev_rt722 = {
1133	.probe = rt722_sdca_probe,
1134	.controls = rt722_sdca_controls,
1135	.num_controls = ARRAY_SIZE(rt722_sdca_controls),
1136	.dapm_widgets = rt722_sdca_dapm_widgets,
1137	.num_dapm_widgets = ARRAY_SIZE(rt722_sdca_dapm_widgets),
1138	.dapm_routes = rt722_sdca_audio_map,
1139	.num_dapm_routes = ARRAY_SIZE(rt722_sdca_audio_map),
1140	.set_jack = rt722_sdca_set_jack_detect,
1141	.endianness = 1,
1142};
1143
1144static int rt722_sdca_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream,
1145				int direction)
1146{
1147	snd_soc_dai_dma_data_set(dai, direction, sdw_stream);
1148
1149	return 0;
1150}
1151
1152static void rt722_sdca_shutdown(struct snd_pcm_substream *substream,
1153				struct snd_soc_dai *dai)
1154{
1155	snd_soc_dai_set_dma_data(dai, substream, NULL);
1156}
1157
1158static int rt722_sdca_pcm_hw_params(struct snd_pcm_substream *substream,
1159				struct snd_pcm_hw_params *params,
1160				struct snd_soc_dai *dai)
1161{
1162	struct snd_soc_component *component = dai->component;
1163	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
1164	struct sdw_stream_config stream_config;
1165	struct sdw_port_config port_config;
1166	enum sdw_data_direction direction;
1167	struct sdw_stream_runtime *sdw_stream;
1168	int retval, port, num_channels;
1169	unsigned int sampling_rate;
1170
1171	dev_dbg(dai->dev, "%s %s", __func__, dai->name);
1172	sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
1173
1174	if (!sdw_stream)
1175		return -EINVAL;
1176
1177	if (!rt722->slave)
1178		return -EINVAL;
1179
1180	/*
1181	 * RT722_AIF1 with port = 1 for headphone playback
1182	 * RT722_AIF1 with port = 2 for headset-mic capture
1183	 * RT722_AIF2 with port = 3 for speaker playback
1184	 * RT722_AIF3 with port = 6 for digital-mic capture
1185	 */
1186	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1187		direction = SDW_DATA_DIR_RX;
1188		if (dai->id == RT722_AIF1)
1189			port = 1;
1190		else if (dai->id == RT722_AIF2)
1191			port = 3;
1192		else
1193			return -EINVAL;
1194	} else {
1195		direction = SDW_DATA_DIR_TX;
1196		if (dai->id == RT722_AIF1)
1197			port = 2;
1198		else if (dai->id == RT722_AIF3)
1199			port = 6;
1200		else
1201			return -EINVAL;
1202	}
1203	stream_config.frame_rate = params_rate(params);
1204	stream_config.ch_count = params_channels(params);
1205	stream_config.bps = snd_pcm_format_width(params_format(params));
1206	stream_config.direction = direction;
1207
1208	num_channels = params_channels(params);
1209	port_config.ch_mask = GENMASK(num_channels - 1, 0);
1210	port_config.num = port;
1211
1212	retval = sdw_stream_add_slave(rt722->slave, &stream_config,
1213					&port_config, 1, sdw_stream);
1214	if (retval) {
1215		dev_err(dai->dev, "%s: Unable to configure port\n", __func__);
1216		return retval;
1217	}
1218
1219	if (params_channels(params) > 16) {
1220		dev_err(component->dev, "%s: Unsupported channels %d\n",
1221			__func__, params_channels(params));
1222		return -EINVAL;
1223	}
1224
1225	/* sampling rate configuration */
1226	switch (params_rate(params)) {
1227	case 44100:
1228		sampling_rate = RT722_SDCA_RATE_44100HZ;
1229		break;
1230	case 48000:
1231		sampling_rate = RT722_SDCA_RATE_48000HZ;
1232		break;
1233	case 96000:
1234		sampling_rate = RT722_SDCA_RATE_96000HZ;
1235		break;
1236	case 192000:
1237		sampling_rate = RT722_SDCA_RATE_192000HZ;
1238		break;
1239	default:
1240		dev_err(component->dev, "%s: Rate %d is not supported\n",
1241			__func__, params_rate(params));
1242		return -EINVAL;
1243	}
1244
1245	/* set sampling frequency */
1246	if (dai->id == RT722_AIF1) {
1247		regmap_write(rt722->regmap,
1248			SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_CS01,
1249				RT722_SDCA_CTL_SAMPLE_FREQ_INDEX, 0), sampling_rate);
1250		regmap_write(rt722->regmap,
1251			SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT722_SDCA_ENT_CS11,
1252				RT722_SDCA_CTL_SAMPLE_FREQ_INDEX, 0), sampling_rate);
1253	}
1254
1255	if (dai->id == RT722_AIF2)
1256		regmap_write(rt722->regmap,
1257			SDW_SDCA_CTL(FUNC_NUM_AMP, RT722_SDCA_ENT_CS31,
1258				RT722_SDCA_CTL_SAMPLE_FREQ_INDEX, 0), sampling_rate);
1259
1260	if (dai->id == RT722_AIF3)
1261		regmap_write(rt722->regmap,
1262			SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT722_SDCA_ENT_CS1F,
1263				RT722_SDCA_CTL_SAMPLE_FREQ_INDEX, 0), sampling_rate);
1264
1265	return 0;
1266}
1267
1268static int rt722_sdca_pcm_hw_free(struct snd_pcm_substream *substream,
1269				struct snd_soc_dai *dai)
1270{
1271	struct snd_soc_component *component = dai->component;
1272	struct rt722_sdca_priv *rt722 = snd_soc_component_get_drvdata(component);
1273	struct sdw_stream_runtime *sdw_stream =
1274		snd_soc_dai_get_dma_data(dai, substream);
1275
1276	if (!rt722->slave)
1277		return -EINVAL;
1278
1279	sdw_stream_remove_slave(rt722->slave, sdw_stream);
1280	return 0;
1281}
1282
1283#define RT722_STEREO_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | \
1284			SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000)
1285#define RT722_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
1286			SNDRV_PCM_FMTBIT_S24_LE)
1287
1288static const struct snd_soc_dai_ops rt722_sdca_ops = {
1289	.hw_params	= rt722_sdca_pcm_hw_params,
1290	.hw_free	= rt722_sdca_pcm_hw_free,
1291	.set_stream	= rt722_sdca_set_sdw_stream,
1292	.shutdown	= rt722_sdca_shutdown,
1293};
1294
1295static struct snd_soc_dai_driver rt722_sdca_dai[] = {
1296	{
1297		.name = "rt722-sdca-aif1",
1298		.id = RT722_AIF1,
1299		.playback = {
1300			.stream_name = "DP1 Headphone Playback",
1301			.channels_min = 1,
1302			.channels_max = 2,
1303			.rates = RT722_STEREO_RATES,
1304			.formats = RT722_FORMATS,
1305		},
1306		.capture = {
1307			.stream_name = "DP2 Headset Capture",
1308			.channels_min = 1,
1309			.channels_max = 2,
1310			.rates = RT722_STEREO_RATES,
1311			.formats = RT722_FORMATS,
1312		},
1313		.ops = &rt722_sdca_ops,
1314	},
1315	{
1316		.name = "rt722-sdca-aif2",
1317		.id = RT722_AIF2,
1318		.playback = {
1319			.stream_name = "DP3 Speaker Playback",
1320			.channels_min = 1,
1321			.channels_max = 2,
1322			.rates = RT722_STEREO_RATES,
1323			.formats = RT722_FORMATS,
1324		},
1325		.ops = &rt722_sdca_ops,
1326	},
1327	{
1328		.name = "rt722-sdca-aif3",
1329		.id = RT722_AIF3,
1330		.capture = {
1331			.stream_name = "DP6 DMic Capture",
1332			.channels_min = 1,
1333			.channels_max = 4,
1334			.rates = RT722_STEREO_RATES,
1335			.formats = RT722_FORMATS,
1336		},
1337		.ops = &rt722_sdca_ops,
1338	}
1339};
1340
1341int rt722_sdca_init(struct device *dev, struct regmap *regmap,
1342			struct regmap *mbq_regmap, struct sdw_slave *slave)
1343{
1344	struct rt722_sdca_priv *rt722;
1345
1346	rt722 = devm_kzalloc(dev, sizeof(*rt722), GFP_KERNEL);
1347	if (!rt722)
1348		return -ENOMEM;
1349
1350	dev_set_drvdata(dev, rt722);
1351	rt722->slave = slave;
1352	rt722->regmap = regmap;
1353	rt722->mbq_regmap = mbq_regmap;
1354
1355	mutex_init(&rt722->calibrate_mutex);
1356	mutex_init(&rt722->disable_irq_lock);
1357
1358	INIT_DELAYED_WORK(&rt722->jack_detect_work, rt722_sdca_jack_detect_handler);
1359	INIT_DELAYED_WORK(&rt722->jack_btn_check_work, rt722_sdca_btn_check_handler);
1360
1361	/*
1362	 * Mark hw_init to false
1363	 * HW init will be performed when device reports present
1364	 */
1365	rt722->hw_init = false;
1366	rt722->first_hw_init = false;
1367	rt722->fu1e_dapm_mute = true;
1368	rt722->fu0f_dapm_mute = true;
1369	rt722->fu0f_mixer_l_mute = rt722->fu0f_mixer_r_mute = true;
1370	rt722->fu1e_mixer_mute[0] = rt722->fu1e_mixer_mute[1] =
1371		rt722->fu1e_mixer_mute[2] = rt722->fu1e_mixer_mute[3] = true;
1372
1373	return devm_snd_soc_register_component(dev,
1374			&soc_sdca_dev_rt722, rt722_sdca_dai, ARRAY_SIZE(rt722_sdca_dai));
1375}
1376
1377static void rt722_sdca_dmic_preset(struct rt722_sdca_priv *rt722)
1378{
1379	/* Set AD07 power entity floating control */
1380	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL,
1381		RT722_ADC0A_08_PDE_FLOAT_CTL, 0x2a29);
1382	/* Set AD10 power entity floating control */
1383	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL,
1384		RT722_ADC10_PDE_FLOAT_CTL, 0x2a00);
1385	/* Set DMIC1/DMIC2 power entity floating control */
1386	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL,
1387		RT722_DMIC1_2_PDE_FLOAT_CTL, 0x2a2a);
1388	/* Set DMIC2 IT entity floating control */
1389	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL,
1390		RT722_DMIC_ENT_FLOAT_CTL, 0x2626);
1391	/* Set AD10 FU entity floating control */
1392	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL,
1393		RT722_ADC_ENT_FLOAT_CTL, 0x1e00);
1394	/* Set DMIC2 FU entity floating control */
1395	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL,
1396		RT722_DMIC_GAIN_ENT_FLOAT_CTL0, 0x1515);
1397	/* Set AD10 FU channel floating control */
1398	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL,
1399		RT722_ADC_VOL_CH_FLOAT_CTL, 0x0304);
1400	/* Set DMIC2 FU channel floating control */
1401	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL,
1402		RT722_DMIC_GAIN_ENT_FLOAT_CTL2, 0x0304);
1403	/* vf71f_r12_07_06 and vf71f_r13_07_06 = 2’b00 */
1404	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL,
1405		RT722_HDA_LEGACY_CONFIG_CTL0, 0x0000);
1406	/* Enable vf707_r12_05/vf707_r13_05 */
1407	regmap_write(rt722->regmap,
1408		SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT722_SDCA_ENT_IT26,
1409			RT722_SDCA_CTL_VENDOR_DEF, 0), 0x01);
1410	/* Fine tune PDE2A latency */
1411	regmap_write(rt722->regmap, 0x2f5c, 0x25);
1412}
1413
1414static void rt722_sdca_amp_preset(struct rt722_sdca_priv *rt722)
1415{
1416	/* Set DVQ=01 */
1417	rt722_sdca_index_write(rt722, RT722_VENDOR_REG, RT722_CLSD_CTRL6,
1418		0xc215);
1419	/* Reset dc_cal_top */
1420	rt722_sdca_index_write(rt722, RT722_VENDOR_CALI, RT722_DC_CALIB_CTRL,
1421		0x702c);
1422	/* W1C Trigger Calibration */
1423	rt722_sdca_index_write(rt722, RT722_VENDOR_CALI, RT722_DC_CALIB_CTRL,
1424		0xf02d);
1425	/* Set DAC02/ClassD power entity floating control */
1426	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL, RT722_AMP_PDE_FLOAT_CTL,
1427		0x2323);
1428	/* Set EAPD high */
1429	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL, RT722_EAPD_CTL,
1430		0x0002);
1431	/* Enable vf707_r14 */
1432	regmap_write(rt722->regmap,
1433		SDW_SDCA_CTL(FUNC_NUM_AMP, RT722_SDCA_ENT_OT23,
1434			RT722_SDCA_CTL_VENDOR_DEF, CH_08), 0x04);
1435}
1436
1437static void rt722_sdca_jack_preset(struct rt722_sdca_priv *rt722)
1438{
1439	int loop_check, chk_cnt = 100, ret;
1440	unsigned int calib_status = 0;
1441
1442	/* Config analog bias */
1443	rt722_sdca_index_write(rt722, RT722_VENDOR_REG, RT722_ANALOG_BIAS_CTL3,
1444		0xa081);
1445	/* GE related settings */
1446	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL, RT722_GE_RELATED_CTL2,
1447		0xa009);
1448	/* Button A, B, C, D bypass mode */
1449	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL, RT722_UMP_HID_CTL4,
1450		0xcf00);
1451	/* HID1 slot enable */
1452	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL, RT722_UMP_HID_CTL5,
1453		0x000f);
1454	/* Report ID for HID1 */
1455	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL, RT722_UMP_HID_CTL0,
1456		0x1100);
1457	/* OSC/OOC for slot 2, 3 */
1458	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL, RT722_UMP_HID_CTL7,
1459		0x0c12);
1460	/* Set JD de-bounce clock control */
1461	rt722_sdca_index_write(rt722, RT722_VENDOR_REG, RT722_JD_CTRL1,
1462		0x7002);
1463	/* Set DVQ=01 */
1464	rt722_sdca_index_write(rt722, RT722_VENDOR_REG, RT722_CLSD_CTRL6,
1465		0xc215);
1466	/* FSM switch to calibration manual mode */
1467	rt722_sdca_index_write(rt722, RT722_VENDOR_REG, RT722_FSM_CTL,
1468		0x4100);
1469	/* W1C Trigger DC calibration (HP) */
1470	rt722_sdca_index_write(rt722, RT722_VENDOR_CALI, RT722_DAC_DC_CALI_CTL3,
1471		0x008d);
1472	/* check HP calibration FSM status */
1473	for (loop_check = 0; loop_check < chk_cnt; loop_check++) {
1474		ret = rt722_sdca_index_read(rt722, RT722_VENDOR_CALI,
1475			RT722_DAC_DC_CALI_CTL3, &calib_status);
1476		if (ret < 0 || loop_check == chk_cnt)
1477			dev_dbg(&rt722->slave->dev, "calibration failed!, ret=%d\n", ret);
1478		if ((calib_status & 0x0040) == 0x0)
1479			break;
1480	}
1481	/* Set ADC09 power entity floating control */
1482	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL, RT722_ADC0A_08_PDE_FLOAT_CTL,
1483		0x2a12);
1484	/* Set MIC2 and LINE1 power entity floating control */
1485	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL, RT722_MIC2_LINE2_PDE_FLOAT_CTL,
1486		0x3429);
1487	/* Set ET41h and LINE2 power entity floating control */
1488	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL, RT722_ET41_LINE2_PDE_FLOAT_CTL,
1489		0x4112);
1490	/* Set DAC03 and HP power entity floating control */
1491	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL, RT722_DAC03_HP_PDE_FLOAT_CTL,
1492		0x4040);
1493	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL, RT722_ENT_FLOAT_CTRL_1,
1494		0x4141);
1495	rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL, RT722_FLOAT_CTRL_1,
1496		0x0101);
1497	/* Fine tune PDE40 latency */
1498	regmap_write(rt722->regmap, 0x2f58, 0x07);
1499	regmap_write(rt722->regmap, 0x2f03, 0x06);
1500	/* MIC VRefo */
1501	rt722_sdca_index_update_bits(rt722, RT722_VENDOR_REG,
1502		RT722_COMBO_JACK_AUTO_CTL1, 0x0200, 0x0200);
1503	rt722_sdca_index_update_bits(rt722, RT722_VENDOR_REG,
1504		RT722_VREFO_GAT, 0x4000, 0x4000);
1505	/* Release HP-JD, EN_CBJ_TIE_GL/R open, en_osw gating auto done bit */
1506	rt722_sdca_index_write(rt722, RT722_VENDOR_REG, RT722_DIGITAL_MISC_CTRL4,
1507		0x0010);
1508}
1509
1510int rt722_sdca_io_init(struct device *dev, struct sdw_slave *slave)
1511{
1512	struct rt722_sdca_priv *rt722 = dev_get_drvdata(dev);
1513
1514	rt722->disable_irq = false;
1515
1516	if (rt722->hw_init)
1517		return 0;
1518
1519	if (rt722->first_hw_init) {
1520		regcache_cache_only(rt722->regmap, false);
1521		regcache_cache_bypass(rt722->regmap, true);
1522		regcache_cache_only(rt722->mbq_regmap, false);
1523		regcache_cache_bypass(rt722->mbq_regmap, true);
1524	} else {
1525		/*
1526		 * PM runtime is only enabled when a Slave reports as Attached
1527		 */
1528
1529		/* set autosuspend parameters */
1530		pm_runtime_set_autosuspend_delay(&slave->dev, 3000);
1531		pm_runtime_use_autosuspend(&slave->dev);
1532
1533		/* update count of parent 'active' children */
1534		pm_runtime_set_active(&slave->dev);
1535
1536		/* make sure the device does not suspend immediately */
1537		pm_runtime_mark_last_busy(&slave->dev);
1538
1539		pm_runtime_enable(&slave->dev);
1540	}
1541
1542	pm_runtime_get_noresume(&slave->dev);
1543
1544	rt722_sdca_dmic_preset(rt722);
1545	rt722_sdca_amp_preset(rt722);
1546	rt722_sdca_jack_preset(rt722);
1547
1548	if (rt722->first_hw_init) {
1549		regcache_cache_bypass(rt722->regmap, false);
1550		regcache_mark_dirty(rt722->regmap);
1551		regcache_cache_bypass(rt722->mbq_regmap, false);
1552		regcache_mark_dirty(rt722->mbq_regmap);
1553	} else
1554		rt722->first_hw_init = true;
1555
1556	/* Mark Slave initialization complete */
1557	rt722->hw_init = true;
1558
1559	pm_runtime_mark_last_busy(&slave->dev);
1560	pm_runtime_put_autosuspend(&slave->dev);
1561
1562	dev_dbg(&slave->dev, "%s hw_init complete\n", __func__);
1563	return 0;
1564}
1565
1566MODULE_DESCRIPTION("ASoC RT722 SDCA SDW driver");
1567MODULE_AUTHOR("Jack Yu <jack.yu@realtek.com>");
1568MODULE_LICENSE("GPL");
1