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