Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 //
0003 // rt711.c -- rt711 ALSA SoC audio driver
0004 //
0005 // Copyright(c) 2019 Realtek Semiconductor Corp.
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     /* Calibration manual mode */
0098     rt711_index_update_bits(regmap, RT711_VENDOR_REG, RT711_FSM_CTL,
0099         0xf, 0x0);
0100 
0101     /* trigger */
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     /* wait for calibration process */
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     /* depop mode */
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     /* pin attached */
0261     if (jack_status & (1 << 31)) {
0262         /* jack in */
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             /* jack is already in, report button event */
0271             btn_type = rt711_button_detect(rt711);
0272         }
0273     } else {
0274         /* jack out */
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         /* button released */
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     /* pin attached */
0318     if (jack_status & (1 << 31)) {
0319         if (rt711->jack_type == SND_JACK_HEADSET) {
0320             /* jack is already in, report button event */
0321             btn_type = rt711_button_detect(rt711);
0322         }
0323     } else {
0324         rt711->jack_type = 0;
0325     }
0326 
0327     /* cbj comparator */
0328     ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
0329         RT711_COMBO_JACK_AUTO_CTL2, &reg);
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         /* button released */
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     /* power on */
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         /* unsolicited response & IRQ control */
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             /* default settings was already for JD1 */
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     /* power off */
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         /* pm_runtime not enabled yet */
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     /* R Channel */
0489     *r_val = (val_h << 8);
0490     regmap_read(rt711->regmap, addr_l, r_val);
0491 
0492     /* L Channel */
0493     val_h |= 0x20;
0494     *l_val = (val_h << 8);
0495     regmap_read(rt711->regmap, addr_h, l_val);
0496 }
0497 
0498 /* For Verb-Set Amplifier Gain (Verb ID = 3h) */
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     /* Can't use update bit function, so read the original value first */
0515     addr_h = mc->reg;
0516     addr_l = mc->rreg;
0517     if (mc->shift == RT711_DIR_OUT_SFT) /* output */
0518         val_h = 0x80;
0519     else /* input */
0520         val_h = 0x0;
0521 
0522     rt711_get_gain(rt711, addr_h, addr_l, val_h, &read_rl, &read_ll);
0523 
0524     /* L Channel */
0525     if (mc->invert) {
0526         /* for mute/unmute */
0527         val_ll = (mc->max - ucontrol->value.integer.value[0])
0528                     << RT711_MUTE_SFT;
0529         /* keep gain */
0530         read_ll = read_ll & 0x7f;
0531         val_ll |= read_ll;
0532     } else {
0533         /* for gain */
0534         val_ll = ((ucontrol->value.integer.value[0]) & 0x7f);
0535         if (val_ll > mc->max)
0536             val_ll = mc->max;
0537         /* keep mute status */
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     /* R Channel */
0547     if (mc->invert) {
0548         /* for mute/unmute */
0549         val_lr = (mc->max - ucontrol->value.integer.value[1])
0550                     << RT711_MUTE_SFT;
0551         /* keep gain */
0552         read_rl = read_rl & 0x7f;
0553         val_lr |= read_rl;
0554     } else {
0555         /* for gain */
0556         val_lr = ((ucontrol->value.integer.value[1]) & 0x7f);
0557         if (val_lr > mc->max)
0558             val_lr = mc->max;
0559         /* keep mute status */
0560         read_rl = read_rl & (1 << RT711_MUTE_SFT);
0561         val_lr |= read_rl;
0562     }
0563 
0564     for (i = 0; i < 3; i++) { /* retry 3 times at most */
0565 
0566         if (val_ll == val_lr) {
0567             /* Set both L/R channels at the same time */
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             /* Lch*/
0575             val_h = (1 << mc->shift) | (1 << 5);
0576             regmap_write(rt711->regmap,
0577                 addr_h, (val_h << 8 | val_ll));
0578 
0579             /* Rch */
0580             val_h = (1 << mc->shift) | (1 << 4);
0581             regmap_write(rt711->regmap,
0582                 addr_l, (val_h << 8 | val_lr));
0583         }
0584         /* check result */
0585         if (mc->shift == RT711_DIR_OUT_SFT) /* output */
0586             val_h = 0x80;
0587         else /* input */
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     /* switch to get command */
0615     addr_h = mc->reg;
0616     addr_l = mc->rreg;
0617     if (mc->shift == RT711_DIR_OUT_SFT) /* output */
0618         val_h = 0x80;
0619     else /* input */
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         /* mute/unmute for switch controls */
0626         read_ll = !((read_ll & 0x80) >> RT711_MUTE_SFT);
0627         read_rl = !((read_rl & 0x80) >> RT711_MUTE_SFT);
0628     } else {
0629         /* for gain volume controls */
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     /* vid = 0xf01 */
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     /* Verb ID = 0x701h */
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     /* Use tx_mask or rx_mask to configure stream tag and set dma_data */
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     /* SoundWire specific configuration */
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         /* bit 3:0 Number of Channel */
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     /* bit 6:4 Bits per Sample */
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     /* 48Khz */
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 /* Bus clock frequency */
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      * Mark hw_init to false
1223      * HW init will be performed when device reports present
1224      */
1225     rt711->hw_init = false;
1226     rt711->first_hw_init = false;
1227 
1228     /* JD source uses JD2 in default */
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      * PM runtime is only enabled when a Slave reports as Attached
1257      */
1258     if (!rt711->first_hw_init) {
1259         /* set autosuspend parameters */
1260         pm_runtime_set_autosuspend_delay(&slave->dev, 3000);
1261         pm_runtime_use_autosuspend(&slave->dev);
1262 
1263         /* update count of parent 'active' children */
1264         pm_runtime_set_active(&slave->dev);
1265 
1266         /* make sure the device does not suspend immediately */
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     /* power on */
1277     regmap_write(rt711->regmap, RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
1278 
1279     /* Set Pin Widget */
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     /* Mute HP/ADC1/ADC2 */
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     /* Set Configuration Default */
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     /* Data port arrangement */
1310     rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1311         RT711_TX_RX_MUX_CTL, 0x0154);
1312 
1313     /* Set index */
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     /* Finish Initial Settings, set power to D3 */
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      * if set_jack callback occurred early than io_init,
1333      * we set up the jack detection function now
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     /* Mark Slave initialization complete */
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");