0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/module.h>
0010 #include <linux/moduleparam.h>
0011 #include <linux/kernel.h>
0012 #include <linux/init.h>
0013 #include <linux/delay.h>
0014 #include <linux/pm_runtime.h>
0015 #include <linux/pm.h>
0016 #include <linux/soundwire/sdw.h>
0017 #include <linux/regmap.h>
0018 #include <linux/slab.h>
0019 #include <sound/core.h>
0020 #include <sound/pcm.h>
0021 #include <sound/pcm_params.h>
0022 #include <sound/soc.h>
0023 #include <sound/soc-dapm.h>
0024 #include <sound/initval.h>
0025 #include <sound/tlv.h>
0026 #include <sound/hda_verbs.h>
0027 #include <sound/jack.h>
0028
0029 #include "rt711.h"
0030
0031 static int rt711_index_write(struct regmap *regmap,
0032 unsigned int nid, unsigned int reg, unsigned int value)
0033 {
0034 int ret;
0035 unsigned int addr = ((RT711_PRIV_INDEX_W_H | nid) << 8) | reg;
0036
0037 ret = regmap_write(regmap, addr, value);
0038 if (ret < 0)
0039 pr_err("Failed to set private value: %06x <= %04x ret=%d\n",
0040 addr, value, ret);
0041
0042 return ret;
0043 }
0044
0045 static int rt711_index_read(struct regmap *regmap,
0046 unsigned int nid, unsigned int reg, unsigned int *value)
0047 {
0048 int ret;
0049 unsigned int addr = ((RT711_PRIV_INDEX_W_H | nid) << 8) | reg;
0050
0051 *value = 0;
0052 ret = regmap_read(regmap, addr, value);
0053 if (ret < 0)
0054 pr_err("Failed to get private value: %06x => %04x ret=%d\n",
0055 addr, *value, ret);
0056
0057 return ret;
0058 }
0059
0060 static int rt711_index_update_bits(struct regmap *regmap, unsigned int nid,
0061 unsigned int reg, unsigned int mask, unsigned int val)
0062 {
0063 unsigned int tmp, orig;
0064 int ret;
0065
0066 ret = rt711_index_read(regmap, nid, reg, &orig);
0067 if (ret < 0)
0068 return ret;
0069
0070 tmp = orig & ~mask;
0071 tmp |= val & mask;
0072
0073 return rt711_index_write(regmap, nid, reg, tmp);
0074 }
0075
0076 static void rt711_reset(struct regmap *regmap)
0077 {
0078 regmap_write(regmap, RT711_FUNC_RESET, 0);
0079 rt711_index_update_bits(regmap, RT711_VENDOR_REG,
0080 RT711_PARA_VERB_CTL, RT711_HIDDEN_REG_SW_RESET,
0081 RT711_HIDDEN_REG_SW_RESET);
0082 }
0083
0084 static int rt711_calibration(struct rt711_priv *rt711)
0085 {
0086 unsigned int val, loop = 0;
0087 struct device *dev;
0088 struct regmap *regmap = rt711->regmap;
0089 int ret = 0;
0090
0091 mutex_lock(&rt711->calibrate_mutex);
0092 regmap_write(rt711->regmap,
0093 RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
0094
0095 dev = regmap_get_device(regmap);
0096
0097
0098 rt711_index_update_bits(regmap, RT711_VENDOR_REG, RT711_FSM_CTL,
0099 0xf, 0x0);
0100
0101
0102 rt711_index_update_bits(regmap, RT711_VENDOR_CALI,
0103 RT711_DAC_DC_CALI_CTL1, RT711_DAC_DC_CALI_TRIGGER,
0104 RT711_DAC_DC_CALI_TRIGGER);
0105
0106
0107 rt711_index_read(regmap, RT711_VENDOR_CALI,
0108 RT711_DAC_DC_CALI_CTL1, &val);
0109
0110 while (val & RT711_DAC_DC_CALI_TRIGGER) {
0111 if (loop >= 500) {
0112 pr_err("%s, calibration time-out!\n",
0113 __func__);
0114 ret = -ETIMEDOUT;
0115 break;
0116 }
0117 loop++;
0118
0119 usleep_range(10000, 11000);
0120 rt711_index_read(regmap, RT711_VENDOR_CALI,
0121 RT711_DAC_DC_CALI_CTL1, &val);
0122 }
0123
0124
0125 rt711_index_update_bits(regmap, RT711_VENDOR_REG,
0126 RT711_FSM_CTL, 0xf, RT711_DEPOP_CTL);
0127
0128 regmap_write(rt711->regmap,
0129 RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
0130 mutex_unlock(&rt711->calibrate_mutex);
0131
0132 dev_dbg(dev, "%s calibration complete, ret=%d\n", __func__, ret);
0133 return ret;
0134 }
0135
0136 static unsigned int rt711_button_detect(struct rt711_priv *rt711)
0137 {
0138 unsigned int btn_type = 0, val80, val81;
0139 int ret;
0140
0141 ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
0142 RT711_IRQ_FLAG_TABLE1, &val80);
0143 if (ret < 0)
0144 goto read_error;
0145 ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
0146 RT711_IRQ_FLAG_TABLE2, &val81);
0147 if (ret < 0)
0148 goto read_error;
0149
0150 val80 &= 0x0381;
0151 val81 &= 0xff00;
0152
0153 switch (val80) {
0154 case 0x0200:
0155 case 0x0100:
0156 case 0x0080:
0157 btn_type |= SND_JACK_BTN_0;
0158 break;
0159 case 0x0001:
0160 btn_type |= SND_JACK_BTN_3;
0161 break;
0162 }
0163 switch (val81) {
0164 case 0x8000:
0165 case 0x4000:
0166 case 0x2000:
0167 btn_type |= SND_JACK_BTN_1;
0168 break;
0169 case 0x1000:
0170 case 0x0800:
0171 case 0x0400:
0172 btn_type |= SND_JACK_BTN_2;
0173 break;
0174 case 0x0200:
0175 case 0x0100:
0176 btn_type |= SND_JACK_BTN_3;
0177 break;
0178 }
0179 read_error:
0180 return btn_type;
0181 }
0182
0183 static int rt711_headset_detect(struct rt711_priv *rt711)
0184 {
0185 unsigned int buf, loop = 0;
0186 int ret;
0187 unsigned int jack_status = 0, reg;
0188
0189 ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
0190 RT711_COMBO_JACK_AUTO_CTL2, &buf);
0191 if (ret < 0)
0192 goto io_error;
0193
0194 while (loop < 500 &&
0195 (buf & RT711_COMBOJACK_AUTO_DET_STATUS) == 0) {
0196 loop++;
0197
0198 usleep_range(9000, 10000);
0199 ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
0200 RT711_COMBO_JACK_AUTO_CTL2, &buf);
0201 if (ret < 0)
0202 goto io_error;
0203
0204 reg = RT711_VERB_GET_PIN_SENSE | RT711_HP_OUT;
0205 ret = regmap_read(rt711->regmap, reg, &jack_status);
0206 if (ret < 0)
0207 goto io_error;
0208 if ((jack_status & (1 << 31)) == 0)
0209 goto remove_error;
0210 }
0211
0212 if (loop >= 500)
0213 goto to_error;
0214
0215 if (buf & RT711_COMBOJACK_AUTO_DET_TRS)
0216 rt711->jack_type = SND_JACK_HEADPHONE;
0217 else if ((buf & RT711_COMBOJACK_AUTO_DET_CTIA) ||
0218 (buf & RT711_COMBOJACK_AUTO_DET_OMTP))
0219 rt711->jack_type = SND_JACK_HEADSET;
0220
0221 return 0;
0222
0223 to_error:
0224 ret = -ETIMEDOUT;
0225 pr_err_ratelimited("Time-out error in %s\n", __func__);
0226 return ret;
0227 io_error:
0228 pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret);
0229 return ret;
0230 remove_error:
0231 pr_err_ratelimited("Jack removal in %s\n", __func__);
0232 return -ENODEV;
0233 }
0234
0235 static void rt711_jack_detect_handler(struct work_struct *work)
0236 {
0237 struct rt711_priv *rt711 =
0238 container_of(work, struct rt711_priv, jack_detect_work.work);
0239 int btn_type = 0, ret;
0240 unsigned int jack_status = 0, reg;
0241
0242 if (!rt711->hs_jack)
0243 return;
0244
0245 if (!rt711->component->card || !rt711->component->card->instantiated)
0246 return;
0247
0248 if (pm_runtime_status_suspended(rt711->slave->dev.parent)) {
0249 dev_dbg(&rt711->slave->dev,
0250 "%s: parent device is pm_runtime_status_suspended, skipping jack detection\n",
0251 __func__);
0252 return;
0253 }
0254
0255 reg = RT711_VERB_GET_PIN_SENSE | RT711_HP_OUT;
0256 ret = regmap_read(rt711->regmap, reg, &jack_status);
0257 if (ret < 0)
0258 goto io_error;
0259
0260
0261 if (jack_status & (1 << 31)) {
0262
0263 if (rt711->jack_type == 0) {
0264 ret = rt711_headset_detect(rt711);
0265 if (ret < 0)
0266 return;
0267 if (rt711->jack_type == SND_JACK_HEADSET)
0268 btn_type = rt711_button_detect(rt711);
0269 } else if (rt711->jack_type == SND_JACK_HEADSET) {
0270
0271 btn_type = rt711_button_detect(rt711);
0272 }
0273 } else {
0274
0275 rt711->jack_type = 0;
0276 }
0277
0278 dev_dbg(&rt711->slave->dev,
0279 "in %s, jack_type=0x%x\n", __func__, rt711->jack_type);
0280 dev_dbg(&rt711->slave->dev,
0281 "in %s, btn_type=0x%x\n", __func__, btn_type);
0282
0283 snd_soc_jack_report(rt711->hs_jack, rt711->jack_type | btn_type,
0284 SND_JACK_HEADSET |
0285 SND_JACK_BTN_0 | SND_JACK_BTN_1 |
0286 SND_JACK_BTN_2 | SND_JACK_BTN_3);
0287
0288 if (btn_type) {
0289
0290 snd_soc_jack_report(rt711->hs_jack, rt711->jack_type,
0291 SND_JACK_HEADSET |
0292 SND_JACK_BTN_0 | SND_JACK_BTN_1 |
0293 SND_JACK_BTN_2 | SND_JACK_BTN_3);
0294
0295 mod_delayed_work(system_power_efficient_wq,
0296 &rt711->jack_btn_check_work, msecs_to_jiffies(200));
0297 }
0298
0299 return;
0300
0301 io_error:
0302 pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret);
0303 }
0304
0305 static void rt711_btn_check_handler(struct work_struct *work)
0306 {
0307 struct rt711_priv *rt711 = container_of(work, struct rt711_priv,
0308 jack_btn_check_work.work);
0309 int btn_type = 0, ret;
0310 unsigned int jack_status = 0, reg;
0311
0312 reg = RT711_VERB_GET_PIN_SENSE | RT711_HP_OUT;
0313 ret = regmap_read(rt711->regmap, reg, &jack_status);
0314 if (ret < 0)
0315 goto io_error;
0316
0317
0318 if (jack_status & (1 << 31)) {
0319 if (rt711->jack_type == SND_JACK_HEADSET) {
0320
0321 btn_type = rt711_button_detect(rt711);
0322 }
0323 } else {
0324 rt711->jack_type = 0;
0325 }
0326
0327
0328 ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
0329 RT711_COMBO_JACK_AUTO_CTL2, ®);
0330 if (ret < 0)
0331 goto io_error;
0332
0333 if ((reg & 0xf0) == 0xf0)
0334 btn_type = 0;
0335
0336 dev_dbg(&rt711->slave->dev,
0337 "%s, btn_type=0x%x\n", __func__, btn_type);
0338 snd_soc_jack_report(rt711->hs_jack, rt711->jack_type | btn_type,
0339 SND_JACK_HEADSET |
0340 SND_JACK_BTN_0 | SND_JACK_BTN_1 |
0341 SND_JACK_BTN_2 | SND_JACK_BTN_3);
0342
0343 if (btn_type) {
0344
0345 snd_soc_jack_report(rt711->hs_jack, rt711->jack_type,
0346 SND_JACK_HEADSET |
0347 SND_JACK_BTN_0 | SND_JACK_BTN_1 |
0348 SND_JACK_BTN_2 | SND_JACK_BTN_3);
0349
0350 mod_delayed_work(system_power_efficient_wq,
0351 &rt711->jack_btn_check_work, msecs_to_jiffies(200));
0352 }
0353
0354 return;
0355
0356 io_error:
0357 pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret);
0358 }
0359
0360 static void rt711_jack_init(struct rt711_priv *rt711)
0361 {
0362 struct snd_soc_dapm_context *dapm =
0363 snd_soc_component_get_dapm(rt711->component);
0364
0365 mutex_lock(&rt711->calibrate_mutex);
0366
0367 if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
0368 regmap_write(rt711->regmap,
0369 RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
0370
0371 if (rt711->hs_jack) {
0372
0373 regmap_write(rt711->regmap,
0374 RT711_SET_MIC2_UNSOLICITED_ENABLE, 0x82);
0375 regmap_write(rt711->regmap,
0376 RT711_SET_HP_UNSOLICITED_ENABLE, 0x81);
0377 regmap_write(rt711->regmap,
0378 RT711_SET_INLINE_UNSOLICITED_ENABLE, 0x83);
0379 rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
0380 0x10, 0x2420);
0381 rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
0382 0x19, 0x2e11);
0383
0384 switch (rt711->jd_src) {
0385 case RT711_JD1:
0386
0387 break;
0388 case RT711_JD2:
0389 rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
0390 RT711_JD_CTL2, RT711_JD2_2PORT_200K_DECODE_HP |
0391 RT711_HP_JD_SEL_JD2,
0392 RT711_JD2_2PORT_200K_DECODE_HP |
0393 RT711_HP_JD_SEL_JD2);
0394 rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
0395 RT711_CC_DET1,
0396 RT711_HP_JD_FINAL_RESULT_CTL_JD12,
0397 RT711_HP_JD_FINAL_RESULT_CTL_JD12);
0398 break;
0399 case RT711_JD2_100K:
0400 rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
0401 RT711_JD_CTL2, RT711_JD2_2PORT_100K_DECODE | RT711_JD2_1PORT_TYPE_DECODE |
0402 RT711_HP_JD_SEL_JD2 | RT711_JD1_2PORT_TYPE_100K_DECODE,
0403 RT711_JD2_2PORT_100K_DECODE_HP | RT711_JD2_1PORT_JD_HP |
0404 RT711_HP_JD_SEL_JD2 | RT711_JD1_2PORT_JD_RESERVED);
0405 rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
0406 RT711_CC_DET1,
0407 RT711_HP_JD_FINAL_RESULT_CTL_JD12,
0408 RT711_HP_JD_FINAL_RESULT_CTL_JD12);
0409 break;
0410 case RT711_JD2_1P8V_1PORT:
0411 rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
0412 RT711_JD_CTL1, RT711_JD2_DIGITAL_JD_MODE_SEL,
0413 RT711_JD2_1_JD_MODE);
0414 rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
0415 RT711_JD_CTL2, RT711_JD2_1PORT_TYPE_DECODE |
0416 RT711_HP_JD_SEL_JD2,
0417 RT711_JD2_1PORT_JD_HP |
0418 RT711_HP_JD_SEL_JD2);
0419 rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
0420 RT711_JD_CTL4, RT711_JD2_PAD_PULL_UP_MASK |
0421 RT711_JD2_MODE_SEL_MASK,
0422 RT711_JD2_PAD_PULL_UP |
0423 RT711_JD2_MODE2_1P8V_1PORT);
0424 rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
0425 RT711_CC_DET1,
0426 RT711_HP_JD_FINAL_RESULT_CTL_JD12,
0427 RT711_HP_JD_FINAL_RESULT_CTL_JD12);
0428 break;
0429 default:
0430 dev_warn(rt711->component->dev, "Wrong JD source\n");
0431 break;
0432 }
0433
0434 dev_dbg(&rt711->slave->dev, "in %s enable\n", __func__);
0435
0436 mod_delayed_work(system_power_efficient_wq,
0437 &rt711->jack_detect_work, msecs_to_jiffies(250));
0438 } else {
0439 regmap_write(rt711->regmap,
0440 RT711_SET_MIC2_UNSOLICITED_ENABLE, 0x00);
0441 regmap_write(rt711->regmap,
0442 RT711_SET_HP_UNSOLICITED_ENABLE, 0x00);
0443 regmap_write(rt711->regmap,
0444 RT711_SET_INLINE_UNSOLICITED_ENABLE, 0x00);
0445
0446 dev_dbg(&rt711->slave->dev, "in %s disable\n", __func__);
0447 }
0448
0449
0450 if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
0451 regmap_write(rt711->regmap,
0452 RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
0453 mutex_unlock(&rt711->calibrate_mutex);
0454 }
0455
0456 static int rt711_set_jack_detect(struct snd_soc_component *component,
0457 struct snd_soc_jack *hs_jack, void *data)
0458 {
0459 struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
0460 int ret;
0461
0462 rt711->hs_jack = hs_jack;
0463
0464 ret = pm_runtime_resume_and_get(component->dev);
0465 if (ret < 0) {
0466 if (ret != -EACCES) {
0467 dev_err(component->dev, "%s: failed to resume %d\n", __func__, ret);
0468 return ret;
0469 }
0470
0471
0472 dev_dbg(component->dev, "%s: skipping jack init for now\n", __func__);
0473 return 0;
0474 }
0475
0476 rt711_jack_init(rt711);
0477
0478 pm_runtime_mark_last_busy(component->dev);
0479 pm_runtime_put_autosuspend(component->dev);
0480
0481 return 0;
0482 }
0483
0484 static void rt711_get_gain(struct rt711_priv *rt711, unsigned int addr_h,
0485 unsigned int addr_l, unsigned int val_h,
0486 unsigned int *r_val, unsigned int *l_val)
0487 {
0488
0489 *r_val = (val_h << 8);
0490 regmap_read(rt711->regmap, addr_l, r_val);
0491
0492
0493 val_h |= 0x20;
0494 *l_val = (val_h << 8);
0495 regmap_read(rt711->regmap, addr_h, l_val);
0496 }
0497
0498
0499 static int rt711_set_amp_gain_put(struct snd_kcontrol *kcontrol,
0500 struct snd_ctl_elem_value *ucontrol)
0501 {
0502 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
0503 struct snd_soc_dapm_context *dapm =
0504 snd_soc_component_get_dapm(component);
0505 struct soc_mixer_control *mc =
0506 (struct soc_mixer_control *)kcontrol->private_value;
0507 struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
0508 unsigned int addr_h, addr_l, val_h, val_ll, val_lr;
0509 unsigned int read_ll, read_rl;
0510 int i;
0511
0512 mutex_lock(&rt711->calibrate_mutex);
0513
0514
0515 addr_h = mc->reg;
0516 addr_l = mc->rreg;
0517 if (mc->shift == RT711_DIR_OUT_SFT)
0518 val_h = 0x80;
0519 else
0520 val_h = 0x0;
0521
0522 rt711_get_gain(rt711, addr_h, addr_l, val_h, &read_rl, &read_ll);
0523
0524
0525 if (mc->invert) {
0526
0527 val_ll = (mc->max - ucontrol->value.integer.value[0])
0528 << RT711_MUTE_SFT;
0529
0530 read_ll = read_ll & 0x7f;
0531 val_ll |= read_ll;
0532 } else {
0533
0534 val_ll = ((ucontrol->value.integer.value[0]) & 0x7f);
0535 if (val_ll > mc->max)
0536 val_ll = mc->max;
0537
0538 read_ll = read_ll & (1 << RT711_MUTE_SFT);
0539 val_ll |= read_ll;
0540 }
0541
0542 if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
0543 regmap_write(rt711->regmap,
0544 RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
0545
0546
0547 if (mc->invert) {
0548
0549 val_lr = (mc->max - ucontrol->value.integer.value[1])
0550 << RT711_MUTE_SFT;
0551
0552 read_rl = read_rl & 0x7f;
0553 val_lr |= read_rl;
0554 } else {
0555
0556 val_lr = ((ucontrol->value.integer.value[1]) & 0x7f);
0557 if (val_lr > mc->max)
0558 val_lr = mc->max;
0559
0560 read_rl = read_rl & (1 << RT711_MUTE_SFT);
0561 val_lr |= read_rl;
0562 }
0563
0564 for (i = 0; i < 3; i++) {
0565
0566 if (val_ll == val_lr) {
0567
0568 val_h = (1 << mc->shift) | (3 << 4);
0569 regmap_write(rt711->regmap,
0570 addr_h, (val_h << 8 | val_ll));
0571 regmap_write(rt711->regmap,
0572 addr_l, (val_h << 8 | val_ll));
0573 } else {
0574
0575 val_h = (1 << mc->shift) | (1 << 5);
0576 regmap_write(rt711->regmap,
0577 addr_h, (val_h << 8 | val_ll));
0578
0579
0580 val_h = (1 << mc->shift) | (1 << 4);
0581 regmap_write(rt711->regmap,
0582 addr_l, (val_h << 8 | val_lr));
0583 }
0584
0585 if (mc->shift == RT711_DIR_OUT_SFT)
0586 val_h = 0x80;
0587 else
0588 val_h = 0x0;
0589
0590 rt711_get_gain(rt711, addr_h, addr_l, val_h,
0591 &read_rl, &read_ll);
0592 if (read_rl == val_lr && read_ll == val_ll)
0593 break;
0594 }
0595
0596 if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
0597 regmap_write(rt711->regmap,
0598 RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
0599
0600 mutex_unlock(&rt711->calibrate_mutex);
0601 return 0;
0602 }
0603
0604 static int rt711_set_amp_gain_get(struct snd_kcontrol *kcontrol,
0605 struct snd_ctl_elem_value *ucontrol)
0606 {
0607 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
0608 struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
0609 struct soc_mixer_control *mc =
0610 (struct soc_mixer_control *)kcontrol->private_value;
0611 unsigned int addr_h, addr_l, val_h;
0612 unsigned int read_ll, read_rl;
0613
0614
0615 addr_h = mc->reg;
0616 addr_l = mc->rreg;
0617 if (mc->shift == RT711_DIR_OUT_SFT)
0618 val_h = 0x80;
0619 else
0620 val_h = 0x0;
0621
0622 rt711_get_gain(rt711, addr_h, addr_l, val_h, &read_rl, &read_ll);
0623
0624 if (mc->invert) {
0625
0626 read_ll = !((read_ll & 0x80) >> RT711_MUTE_SFT);
0627 read_rl = !((read_rl & 0x80) >> RT711_MUTE_SFT);
0628 } else {
0629
0630 read_ll = read_ll & 0x7f;
0631 read_rl = read_rl & 0x7f;
0632 }
0633 ucontrol->value.integer.value[0] = read_ll;
0634 ucontrol->value.integer.value[1] = read_rl;
0635
0636 return 0;
0637 }
0638
0639 static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -6525, 75, 0);
0640 static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -1725, 75, 0);
0641 static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, 0, 1000, 0);
0642
0643 static const struct snd_kcontrol_new rt711_snd_controls[] = {
0644 SOC_DOUBLE_R_EXT_TLV("DAC Surr Playback Volume",
0645 RT711_SET_GAIN_DAC2_H, RT711_SET_GAIN_DAC2_L,
0646 RT711_DIR_OUT_SFT, 0x57, 0,
0647 rt711_set_amp_gain_get, rt711_set_amp_gain_put, out_vol_tlv),
0648 SOC_DOUBLE_R_EXT("ADC 08 Capture Switch",
0649 RT711_SET_GAIN_ADC2_H, RT711_SET_GAIN_ADC2_L,
0650 RT711_DIR_IN_SFT, 1, 1,
0651 rt711_set_amp_gain_get, rt711_set_amp_gain_put),
0652 SOC_DOUBLE_R_EXT("ADC 09 Capture Switch",
0653 RT711_SET_GAIN_ADC1_H, RT711_SET_GAIN_ADC1_L,
0654 RT711_DIR_IN_SFT, 1, 1,
0655 rt711_set_amp_gain_get, rt711_set_amp_gain_put),
0656 SOC_DOUBLE_R_EXT_TLV("ADC 08 Capture Volume",
0657 RT711_SET_GAIN_ADC2_H, RT711_SET_GAIN_ADC2_L,
0658 RT711_DIR_IN_SFT, 0x3f, 0,
0659 rt711_set_amp_gain_get, rt711_set_amp_gain_put, in_vol_tlv),
0660 SOC_DOUBLE_R_EXT_TLV("ADC 09 Capture Volume",
0661 RT711_SET_GAIN_ADC1_H, RT711_SET_GAIN_ADC1_L,
0662 RT711_DIR_IN_SFT, 0x3f, 0,
0663 rt711_set_amp_gain_get, rt711_set_amp_gain_put, in_vol_tlv),
0664 SOC_DOUBLE_R_EXT_TLV("AMIC Volume",
0665 RT711_SET_GAIN_AMIC_H, RT711_SET_GAIN_AMIC_L,
0666 RT711_DIR_IN_SFT, 3, 0,
0667 rt711_set_amp_gain_get, rt711_set_amp_gain_put, mic_vol_tlv),
0668 SOC_DOUBLE_R_EXT_TLV("DMIC1 Volume",
0669 RT711_SET_GAIN_DMIC1_H, RT711_SET_GAIN_DMIC1_L,
0670 RT711_DIR_IN_SFT, 3, 0,
0671 rt711_set_amp_gain_get, rt711_set_amp_gain_put, mic_vol_tlv),
0672 SOC_DOUBLE_R_EXT_TLV("DMIC2 Volume",
0673 RT711_SET_GAIN_DMIC2_H, RT711_SET_GAIN_DMIC2_L,
0674 RT711_DIR_IN_SFT, 3, 0,
0675 rt711_set_amp_gain_get, rt711_set_amp_gain_put, mic_vol_tlv),
0676 };
0677
0678 static int rt711_mux_get(struct snd_kcontrol *kcontrol,
0679 struct snd_ctl_elem_value *ucontrol)
0680 {
0681 struct snd_soc_component *component =
0682 snd_soc_dapm_kcontrol_component(kcontrol);
0683 struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
0684 unsigned int reg, val = 0, nid;
0685 int ret;
0686
0687 if (strstr(ucontrol->id.name, "ADC 22 Mux"))
0688 nid = RT711_MIXER_IN1;
0689 else if (strstr(ucontrol->id.name, "ADC 23 Mux"))
0690 nid = RT711_MIXER_IN2;
0691 else
0692 return -EINVAL;
0693
0694
0695 reg = RT711_VERB_SET_CONNECT_SEL | nid;
0696 ret = regmap_read(rt711->regmap, reg, &val);
0697 if (ret < 0) {
0698 dev_err(component->dev, "%s: sdw read failed: %d\n",
0699 __func__, ret);
0700 return ret;
0701 }
0702
0703 ucontrol->value.enumerated.item[0] = val;
0704
0705 return 0;
0706 }
0707
0708 static int rt711_mux_put(struct snd_kcontrol *kcontrol,
0709 struct snd_ctl_elem_value *ucontrol)
0710 {
0711 struct snd_soc_component *component =
0712 snd_soc_dapm_kcontrol_component(kcontrol);
0713 struct snd_soc_dapm_context *dapm =
0714 snd_soc_dapm_kcontrol_dapm(kcontrol);
0715 struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
0716 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
0717 unsigned int *item = ucontrol->value.enumerated.item;
0718 unsigned int val, val2 = 0, change, reg, nid;
0719 int ret;
0720
0721 if (item[0] >= e->items)
0722 return -EINVAL;
0723
0724 if (strstr(ucontrol->id.name, "ADC 22 Mux"))
0725 nid = RT711_MIXER_IN1;
0726 else if (strstr(ucontrol->id.name, "ADC 23 Mux"))
0727 nid = RT711_MIXER_IN2;
0728 else
0729 return -EINVAL;
0730
0731
0732 val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
0733
0734 reg = RT711_VERB_SET_CONNECT_SEL | nid;
0735 ret = regmap_read(rt711->regmap, reg, &val2);
0736 if (ret < 0) {
0737 dev_err(component->dev, "%s: sdw read failed: %d\n",
0738 __func__, ret);
0739 return ret;
0740 }
0741
0742 if (val == val2)
0743 change = 0;
0744 else
0745 change = 1;
0746
0747 if (change) {
0748 reg = RT711_VERB_SET_CONNECT_SEL | nid;
0749 regmap_write(rt711->regmap, reg, val);
0750 }
0751
0752 snd_soc_dapm_mux_update_power(dapm, kcontrol,
0753 item[0], e, NULL);
0754
0755 return change;
0756 }
0757
0758 static const char * const adc_mux_text[] = {
0759 "MIC2",
0760 "LINE1",
0761 "LINE2",
0762 "DMIC",
0763 };
0764
0765 static SOC_ENUM_SINGLE_DECL(
0766 rt711_adc22_enum, SND_SOC_NOPM, 0, adc_mux_text);
0767
0768 static SOC_ENUM_SINGLE_DECL(
0769 rt711_adc23_enum, SND_SOC_NOPM, 0, adc_mux_text);
0770
0771 static const struct snd_kcontrol_new rt711_adc22_mux =
0772 SOC_DAPM_ENUM_EXT("ADC 22 Mux", rt711_adc22_enum,
0773 rt711_mux_get, rt711_mux_put);
0774
0775 static const struct snd_kcontrol_new rt711_adc23_mux =
0776 SOC_DAPM_ENUM_EXT("ADC 23 Mux", rt711_adc23_enum,
0777 rt711_mux_get, rt711_mux_put);
0778
0779 static int rt711_dac_surround_event(struct snd_soc_dapm_widget *w,
0780 struct snd_kcontrol *kcontrol, int event)
0781 {
0782 struct snd_soc_component *component =
0783 snd_soc_dapm_to_component(w->dapm);
0784 struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
0785 unsigned int val_h = (1 << RT711_DIR_OUT_SFT) | (0x3 << 4);
0786 unsigned int val_l;
0787
0788 switch (event) {
0789 case SND_SOC_DAPM_POST_PMU:
0790 regmap_write(rt711->regmap,
0791 RT711_SET_STREAMID_DAC2, 0x10);
0792
0793 val_l = 0x00;
0794 regmap_write(rt711->regmap,
0795 RT711_SET_GAIN_HP_H, (val_h << 8 | val_l));
0796 break;
0797 case SND_SOC_DAPM_PRE_PMD:
0798 val_l = (1 << RT711_MUTE_SFT);
0799 regmap_write(rt711->regmap,
0800 RT711_SET_GAIN_HP_H, (val_h << 8 | val_l));
0801 usleep_range(50000, 55000);
0802
0803 regmap_write(rt711->regmap,
0804 RT711_SET_STREAMID_DAC2, 0x00);
0805 break;
0806 }
0807 return 0;
0808 }
0809
0810 static int rt711_adc_09_event(struct snd_soc_dapm_widget *w,
0811 struct snd_kcontrol *kcontrol, int event)
0812 {
0813 struct snd_soc_component *component =
0814 snd_soc_dapm_to_component(w->dapm);
0815 struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
0816
0817 switch (event) {
0818 case SND_SOC_DAPM_POST_PMU:
0819 regmap_write(rt711->regmap,
0820 RT711_SET_STREAMID_ADC1, 0x10);
0821 break;
0822 case SND_SOC_DAPM_PRE_PMD:
0823 regmap_write(rt711->regmap,
0824 RT711_SET_STREAMID_ADC1, 0x00);
0825 break;
0826 }
0827 return 0;
0828 }
0829
0830 static int rt711_adc_08_event(struct snd_soc_dapm_widget *w,
0831 struct snd_kcontrol *kcontrol, int event)
0832 {
0833 struct snd_soc_component *component =
0834 snd_soc_dapm_to_component(w->dapm);
0835 struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
0836
0837 switch (event) {
0838 case SND_SOC_DAPM_POST_PMU:
0839 regmap_write(rt711->regmap,
0840 RT711_SET_STREAMID_ADC2, 0x10);
0841 break;
0842 case SND_SOC_DAPM_PRE_PMD:
0843 regmap_write(rt711->regmap,
0844 RT711_SET_STREAMID_ADC2, 0x00);
0845 break;
0846 }
0847 return 0;
0848 }
0849
0850 static const struct snd_soc_dapm_widget rt711_dapm_widgets[] = {
0851 SND_SOC_DAPM_OUTPUT("HP"),
0852 SND_SOC_DAPM_INPUT("MIC2"),
0853 SND_SOC_DAPM_INPUT("DMIC1"),
0854 SND_SOC_DAPM_INPUT("DMIC2"),
0855 SND_SOC_DAPM_INPUT("LINE1"),
0856 SND_SOC_DAPM_INPUT("LINE2"),
0857
0858 SND_SOC_DAPM_DAC_E("DAC Surround", NULL, SND_SOC_NOPM, 0, 0,
0859 rt711_dac_surround_event,
0860 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
0861 SND_SOC_DAPM_ADC_E("ADC 09", NULL, SND_SOC_NOPM, 0, 0,
0862 rt711_adc_09_event,
0863 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
0864 SND_SOC_DAPM_ADC_E("ADC 08", NULL, SND_SOC_NOPM, 0, 0,
0865 rt711_adc_08_event,
0866 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
0867 SND_SOC_DAPM_MUX("ADC 22 Mux", SND_SOC_NOPM, 0, 0,
0868 &rt711_adc22_mux),
0869 SND_SOC_DAPM_MUX("ADC 23 Mux", SND_SOC_NOPM, 0, 0,
0870 &rt711_adc23_mux),
0871
0872 SND_SOC_DAPM_AIF_IN("DP3RX", "DP3 Playback", 0, SND_SOC_NOPM, 0, 0),
0873 SND_SOC_DAPM_AIF_OUT("DP2TX", "DP2 Capture", 0, SND_SOC_NOPM, 0, 0),
0874 SND_SOC_DAPM_AIF_OUT("DP4TX", "DP4 Capture", 0, SND_SOC_NOPM, 0, 0),
0875 };
0876
0877 static const struct snd_soc_dapm_route rt711_audio_map[] = {
0878 {"DAC Surround", NULL, "DP3RX"},
0879 {"DP2TX", NULL, "ADC 09"},
0880 {"DP4TX", NULL, "ADC 08"},
0881
0882 {"ADC 09", NULL, "ADC 22 Mux"},
0883 {"ADC 08", NULL, "ADC 23 Mux"},
0884 {"ADC 22 Mux", "DMIC", "DMIC1"},
0885 {"ADC 22 Mux", "LINE1", "LINE1"},
0886 {"ADC 22 Mux", "LINE2", "LINE2"},
0887 {"ADC 22 Mux", "MIC2", "MIC2"},
0888 {"ADC 23 Mux", "DMIC", "DMIC2"},
0889 {"ADC 23 Mux", "LINE1", "LINE1"},
0890 {"ADC 23 Mux", "LINE2", "LINE2"},
0891 {"ADC 23 Mux", "MIC2", "MIC2"},
0892
0893 {"HP", NULL, "DAC Surround"},
0894 };
0895
0896 static int rt711_set_bias_level(struct snd_soc_component *component,
0897 enum snd_soc_bias_level level)
0898 {
0899 struct snd_soc_dapm_context *dapm =
0900 snd_soc_component_get_dapm(component);
0901 struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
0902
0903 switch (level) {
0904 case SND_SOC_BIAS_PREPARE:
0905 if (dapm->bias_level == SND_SOC_BIAS_STANDBY) {
0906 regmap_write(rt711->regmap,
0907 RT711_SET_AUDIO_POWER_STATE,
0908 AC_PWRST_D0);
0909 }
0910 break;
0911
0912 case SND_SOC_BIAS_STANDBY:
0913 mutex_lock(&rt711->calibrate_mutex);
0914 regmap_write(rt711->regmap,
0915 RT711_SET_AUDIO_POWER_STATE,
0916 AC_PWRST_D3);
0917 mutex_unlock(&rt711->calibrate_mutex);
0918 break;
0919
0920 default:
0921 break;
0922 }
0923
0924 return 0;
0925 }
0926
0927 static int rt711_parse_dt(struct rt711_priv *rt711, struct device *dev)
0928 {
0929 device_property_read_u32(dev, "realtek,jd-src",
0930 &rt711->jd_src);
0931
0932 return 0;
0933 }
0934
0935 static int rt711_probe(struct snd_soc_component *component)
0936 {
0937 struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
0938 int ret;
0939
0940 rt711_parse_dt(rt711, &rt711->slave->dev);
0941 rt711->component = component;
0942
0943 ret = pm_runtime_resume(component->dev);
0944 if (ret < 0 && ret != -EACCES)
0945 return ret;
0946
0947 return 0;
0948 }
0949
0950 static const struct snd_soc_component_driver soc_codec_dev_rt711 = {
0951 .probe = rt711_probe,
0952 .set_bias_level = rt711_set_bias_level,
0953 .controls = rt711_snd_controls,
0954 .num_controls = ARRAY_SIZE(rt711_snd_controls),
0955 .dapm_widgets = rt711_dapm_widgets,
0956 .num_dapm_widgets = ARRAY_SIZE(rt711_dapm_widgets),
0957 .dapm_routes = rt711_audio_map,
0958 .num_dapm_routes = ARRAY_SIZE(rt711_audio_map),
0959 .set_jack = rt711_set_jack_detect,
0960 .endianness = 1,
0961 };
0962
0963 static int rt711_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream,
0964 int direction)
0965 {
0966 struct sdw_stream_data *stream;
0967
0968 if (!sdw_stream)
0969 return 0;
0970
0971 stream = kzalloc(sizeof(*stream), GFP_KERNEL);
0972 if (!stream)
0973 return -ENOMEM;
0974
0975 stream->sdw_stream = sdw_stream;
0976
0977
0978 if (direction == SNDRV_PCM_STREAM_PLAYBACK)
0979 dai->playback_dma_data = stream;
0980 else
0981 dai->capture_dma_data = stream;
0982
0983 return 0;
0984 }
0985
0986 static void rt711_shutdown(struct snd_pcm_substream *substream,
0987 struct snd_soc_dai *dai)
0988 {
0989 struct sdw_stream_data *stream;
0990
0991 stream = snd_soc_dai_get_dma_data(dai, substream);
0992 snd_soc_dai_set_dma_data(dai, substream, NULL);
0993 kfree(stream);
0994 }
0995
0996 static int rt711_pcm_hw_params(struct snd_pcm_substream *substream,
0997 struct snd_pcm_hw_params *params,
0998 struct snd_soc_dai *dai)
0999 {
1000 struct snd_soc_component *component = dai->component;
1001 struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
1002 struct sdw_stream_config stream_config;
1003 struct sdw_port_config port_config;
1004 enum sdw_data_direction direction;
1005 struct sdw_stream_data *stream;
1006 int retval, port, num_channels;
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
1019 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1020 direction = SDW_DATA_DIR_RX;
1021 port = 3;
1022 } else {
1023 direction = SDW_DATA_DIR_TX;
1024 if (dai->id == RT711_AIF1)
1025 port = 4;
1026 else if (dai->id == RT711_AIF2)
1027 port = 2;
1028 else
1029 return -EINVAL;
1030 }
1031
1032 stream_config.frame_rate = params_rate(params);
1033 stream_config.ch_count = params_channels(params);
1034 stream_config.bps = snd_pcm_format_width(params_format(params));
1035 stream_config.direction = direction;
1036
1037 num_channels = params_channels(params);
1038 port_config.ch_mask = (1 << (num_channels)) - 1;
1039 port_config.num = port;
1040
1041 retval = sdw_stream_add_slave(rt711->slave, &stream_config,
1042 &port_config, 1, stream->sdw_stream);
1043 if (retval) {
1044 dev_err(dai->dev, "Unable to configure port\n");
1045 return retval;
1046 }
1047
1048 if (params_channels(params) <= 16) {
1049
1050 val |= (params_channels(params) - 1);
1051 } else {
1052 dev_err(component->dev, "Unsupported channels %d\n",
1053 params_channels(params));
1054 return -EINVAL;
1055 }
1056
1057 switch (params_width(params)) {
1058
1059 case 8:
1060 break;
1061 case 16:
1062 val |= (0x1 << 4);
1063 break;
1064 case 20:
1065 val |= (0x2 << 4);
1066 break;
1067 case 24:
1068 val |= (0x3 << 4);
1069 break;
1070 case 32:
1071 val |= (0x4 << 4);
1072 break;
1073 default:
1074 return -EINVAL;
1075 }
1076
1077
1078 regmap_write(rt711->regmap, RT711_DAC_FORMAT_H, val);
1079 regmap_write(rt711->regmap, RT711_ADC1_FORMAT_H, val);
1080 regmap_write(rt711->regmap, RT711_ADC2_FORMAT_H, val);
1081
1082 return retval;
1083 }
1084
1085 static int rt711_pcm_hw_free(struct snd_pcm_substream *substream,
1086 struct snd_soc_dai *dai)
1087 {
1088 struct snd_soc_component *component = dai->component;
1089 struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
1090 struct sdw_stream_data *stream =
1091 snd_soc_dai_get_dma_data(dai, substream);
1092
1093 if (!rt711->slave)
1094 return -EINVAL;
1095
1096 sdw_stream_remove_slave(rt711->slave, stream->sdw_stream);
1097 return 0;
1098 }
1099
1100 #define RT711_STEREO_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
1101 #define RT711_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
1102 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
1103
1104 static const struct snd_soc_dai_ops rt711_ops = {
1105 .hw_params = rt711_pcm_hw_params,
1106 .hw_free = rt711_pcm_hw_free,
1107 .set_stream = rt711_set_sdw_stream,
1108 .shutdown = rt711_shutdown,
1109 };
1110
1111 static struct snd_soc_dai_driver rt711_dai[] = {
1112 {
1113 .name = "rt711-aif1",
1114 .id = RT711_AIF1,
1115 .playback = {
1116 .stream_name = "DP3 Playback",
1117 .channels_min = 1,
1118 .channels_max = 2,
1119 .rates = RT711_STEREO_RATES,
1120 .formats = RT711_FORMATS,
1121 },
1122 .capture = {
1123 .stream_name = "DP4 Capture",
1124 .channels_min = 1,
1125 .channels_max = 2,
1126 .rates = RT711_STEREO_RATES,
1127 .formats = RT711_FORMATS,
1128 },
1129 .ops = &rt711_ops,
1130 },
1131 {
1132 .name = "rt711-aif2",
1133 .id = RT711_AIF2,
1134 .capture = {
1135 .stream_name = "DP2 Capture",
1136 .channels_min = 1,
1137 .channels_max = 2,
1138 .rates = RT711_STEREO_RATES,
1139 .formats = RT711_FORMATS,
1140 },
1141 .ops = &rt711_ops,
1142 }
1143 };
1144
1145
1146 #define RT711_CLK_FREQ_9600000HZ 9600000
1147 #define RT711_CLK_FREQ_12000000HZ 12000000
1148 #define RT711_CLK_FREQ_6000000HZ 6000000
1149 #define RT711_CLK_FREQ_4800000HZ 4800000
1150 #define RT711_CLK_FREQ_2400000HZ 2400000
1151 #define RT711_CLK_FREQ_12288000HZ 12288000
1152
1153 int rt711_clock_config(struct device *dev)
1154 {
1155 struct rt711_priv *rt711 = dev_get_drvdata(dev);
1156 unsigned int clk_freq, value;
1157
1158 clk_freq = (rt711->params.curr_dr_freq >> 1);
1159
1160 switch (clk_freq) {
1161 case RT711_CLK_FREQ_12000000HZ:
1162 value = 0x0;
1163 break;
1164 case RT711_CLK_FREQ_6000000HZ:
1165 value = 0x1;
1166 break;
1167 case RT711_CLK_FREQ_9600000HZ:
1168 value = 0x2;
1169 break;
1170 case RT711_CLK_FREQ_4800000HZ:
1171 value = 0x3;
1172 break;
1173 case RT711_CLK_FREQ_2400000HZ:
1174 value = 0x4;
1175 break;
1176 case RT711_CLK_FREQ_12288000HZ:
1177 value = 0x5;
1178 break;
1179 default:
1180 return -EINVAL;
1181 }
1182
1183 regmap_write(rt711->regmap, 0xe0, value);
1184 regmap_write(rt711->regmap, 0xf0, value);
1185
1186 dev_dbg(dev, "%s complete, clk_freq=%d\n", __func__, clk_freq);
1187
1188 return 0;
1189 }
1190
1191 static void rt711_calibration_work(struct work_struct *work)
1192 {
1193 struct rt711_priv *rt711 =
1194 container_of(work, struct rt711_priv, calibration_work);
1195
1196 rt711_calibration(rt711);
1197 }
1198
1199 int rt711_init(struct device *dev, struct regmap *sdw_regmap,
1200 struct regmap *regmap, struct sdw_slave *slave)
1201 {
1202 struct rt711_priv *rt711;
1203 int ret;
1204
1205 rt711 = devm_kzalloc(dev, sizeof(*rt711), GFP_KERNEL);
1206 if (!rt711)
1207 return -ENOMEM;
1208
1209 dev_set_drvdata(dev, rt711);
1210 rt711->slave = slave;
1211 rt711->sdw_regmap = sdw_regmap;
1212 rt711->regmap = regmap;
1213
1214 mutex_init(&rt711->calibrate_mutex);
1215 mutex_init(&rt711->disable_irq_lock);
1216
1217 INIT_DELAYED_WORK(&rt711->jack_detect_work, rt711_jack_detect_handler);
1218 INIT_DELAYED_WORK(&rt711->jack_btn_check_work, rt711_btn_check_handler);
1219 INIT_WORK(&rt711->calibration_work, rt711_calibration_work);
1220
1221
1222
1223
1224
1225 rt711->hw_init = false;
1226 rt711->first_hw_init = false;
1227
1228
1229 rt711->jd_src = RT711_JD2;
1230
1231 ret = devm_snd_soc_register_component(dev,
1232 &soc_codec_dev_rt711,
1233 rt711_dai,
1234 ARRAY_SIZE(rt711_dai));
1235
1236 dev_dbg(&slave->dev, "%s\n", __func__);
1237
1238 return ret;
1239 }
1240
1241 int rt711_io_init(struct device *dev, struct sdw_slave *slave)
1242 {
1243 struct rt711_priv *rt711 = dev_get_drvdata(dev);
1244
1245 rt711->disable_irq = false;
1246
1247 if (rt711->hw_init)
1248 return 0;
1249
1250 if (rt711->first_hw_init) {
1251 regcache_cache_only(rt711->regmap, false);
1252 regcache_cache_bypass(rt711->regmap, true);
1253 }
1254
1255
1256
1257
1258 if (!rt711->first_hw_init) {
1259
1260 pm_runtime_set_autosuspend_delay(&slave->dev, 3000);
1261 pm_runtime_use_autosuspend(&slave->dev);
1262
1263
1264 pm_runtime_set_active(&slave->dev);
1265
1266
1267 pm_runtime_mark_last_busy(&slave->dev);
1268
1269 pm_runtime_enable(&slave->dev);
1270 }
1271
1272 pm_runtime_get_noresume(&slave->dev);
1273
1274 rt711_reset(rt711->regmap);
1275
1276
1277 regmap_write(rt711->regmap, RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
1278
1279
1280 regmap_write(rt711->regmap, RT711_SET_PIN_MIC2, 0x25);
1281 regmap_write(rt711->regmap, RT711_SET_PIN_HP, 0xc0);
1282 regmap_write(rt711->regmap, RT711_SET_PIN_DMIC1, 0x20);
1283 regmap_write(rt711->regmap, RT711_SET_PIN_DMIC2, 0x20);
1284 regmap_write(rt711->regmap, RT711_SET_PIN_LINE1, 0x20);
1285 regmap_write(rt711->regmap, RT711_SET_PIN_LINE2, 0x20);
1286
1287
1288 regmap_write(rt711->regmap, RT711_SET_GAIN_HP_H, 0xa080);
1289 regmap_write(rt711->regmap, RT711_SET_GAIN_HP_H, 0x9080);
1290 regmap_write(rt711->regmap, RT711_SET_GAIN_ADC2_H, 0x6080);
1291 regmap_write(rt711->regmap, RT711_SET_GAIN_ADC2_H, 0x5080);
1292 regmap_write(rt711->regmap, RT711_SET_GAIN_ADC1_H, 0x6080);
1293 regmap_write(rt711->regmap, RT711_SET_GAIN_ADC1_H, 0x5080);
1294
1295
1296 regmap_write(rt711->regmap, 0x4f12, 0x91);
1297 regmap_write(rt711->regmap, 0x4e12, 0xd6);
1298 regmap_write(rt711->regmap, 0x4d12, 0x11);
1299 regmap_write(rt711->regmap, 0x4c12, 0x20);
1300 regmap_write(rt711->regmap, 0x4f13, 0x91);
1301 regmap_write(rt711->regmap, 0x4e13, 0xd6);
1302 regmap_write(rt711->regmap, 0x4d13, 0x11);
1303 regmap_write(rt711->regmap, 0x4c13, 0x21);
1304 regmap_write(rt711->regmap, 0x4c21, 0xf0);
1305 regmap_write(rt711->regmap, 0x4d21, 0x11);
1306 regmap_write(rt711->regmap, 0x4e21, 0x11);
1307 regmap_write(rt711->regmap, 0x4f21, 0x01);
1308
1309
1310 rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1311 RT711_TX_RX_MUX_CTL, 0x0154);
1312
1313
1314 rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1315 RT711_DIGITAL_MISC_CTRL4, 0x201b);
1316 rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1317 RT711_COMBO_JACK_AUTO_CTL1, 0x5089);
1318 rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1319 RT711_VREFOUT_CTL, 0x5064);
1320 rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1321 RT711_INLINE_CMD_CTL, 0xd249);
1322
1323
1324 regmap_write(rt711->regmap, RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
1325
1326 if (rt711->first_hw_init)
1327 rt711_calibration(rt711);
1328 else
1329 schedule_work(&rt711->calibration_work);
1330
1331
1332
1333
1334
1335 if (rt711->hs_jack)
1336 rt711_jack_init(rt711);
1337
1338 if (rt711->first_hw_init) {
1339 regcache_cache_bypass(rt711->regmap, false);
1340 regcache_mark_dirty(rt711->regmap);
1341 } else
1342 rt711->first_hw_init = true;
1343
1344
1345 rt711->hw_init = true;
1346
1347 pm_runtime_mark_last_busy(&slave->dev);
1348 pm_runtime_put_autosuspend(&slave->dev);
1349
1350 dev_dbg(&slave->dev, "%s hw_init complete\n", __func__);
1351 return 0;
1352 }
1353
1354 MODULE_DESCRIPTION("ASoC RT711 SDW driver");
1355 MODULE_AUTHOR("Shuming Fan <shumingf@realtek.com>");
1356 MODULE_LICENSE("GPL");