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