Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ASoC: mt6359: kselftest fix and driver extension

Merge series from Trevor Wu <trevor.wu@mediatek.com>:

The patch series includes a kselftest fix and changes for extending
driver capability to support more use cases.

+137 -15
+137 -15
sound/soc/codecs/mt6359.c
··· 18 18 19 19 #include "mt6359.h" 20 20 21 + static void mt6359_set_gpio_smt(struct mt6359_priv *priv) 22 + { 23 + /* set gpio SMT mode */ 24 + regmap_update_bits(priv->regmap, MT6359_SMT_CON1, 0x3ff0, 0x3ff0); 25 + } 26 + 27 + static void mt6359_set_gpio_driving(struct mt6359_priv *priv) 28 + { 29 + /* 8:4mA(default), a:8mA, c:12mA, e:16mA */ 30 + regmap_update_bits(priv->regmap, MT6359_DRV_CON2, 0xffff, 0x8888); 31 + regmap_update_bits(priv->regmap, MT6359_DRV_CON3, 0xffff, 0x8888); 32 + regmap_update_bits(priv->regmap, MT6359_DRV_CON4, 0x00ff, 0x88); 33 + } 34 + 21 35 static void mt6359_set_playback_gpio(struct mt6359_priv *priv) 22 36 { 23 37 /* set gpio mosi mode, clk / data mosi */ ··· 374 360 (struct soc_mixer_control *)kcontrol->private_value; 375 361 unsigned int reg = 0; 376 362 int index = ucontrol->value.integer.value[0]; 363 + int orig_gain[2], new_gain[2]; 377 364 int ret; 365 + 366 + switch (mc->reg) { 367 + case MT6359_ZCD_CON2: 368 + orig_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTL]; 369 + orig_gain[1] = priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTR]; 370 + break; 371 + case MT6359_ZCD_CON1: 372 + orig_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTL]; 373 + orig_gain[1] = priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTR]; 374 + break; 375 + case MT6359_ZCD_CON3: 376 + orig_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_HSOUTL]; 377 + break; 378 + case MT6359_AUDENC_ANA_CON0: 379 + orig_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP1]; 380 + break; 381 + case MT6359_AUDENC_ANA_CON1: 382 + orig_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP2]; 383 + break; 384 + case MT6359_AUDENC_ANA_CON2: 385 + orig_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP3]; 386 + break; 387 + default: 388 + return -EINVAL; 389 + } 378 390 379 391 ret = snd_soc_put_volsw(kcontrol, ucontrol); 380 392 if (ret < 0) ··· 413 373 (reg >> RG_AUDHPLGAIN_SFT) & RG_AUDHPLGAIN_MASK; 414 374 priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTR] = 415 375 (reg >> RG_AUDHPRGAIN_SFT) & RG_AUDHPRGAIN_MASK; 376 + new_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTL]; 377 + new_gain[1] = priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTR]; 416 378 break; 417 379 case MT6359_ZCD_CON1: 418 380 regmap_read(priv->regmap, MT6359_ZCD_CON1, &reg); ··· 422 380 (reg >> RG_AUDLOLGAIN_SFT) & RG_AUDLOLGAIN_MASK; 423 381 priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTR] = 424 382 (reg >> RG_AUDLORGAIN_SFT) & RG_AUDLORGAIN_MASK; 383 + new_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTL]; 384 + new_gain[1] = priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTR]; 425 385 break; 426 386 case MT6359_ZCD_CON3: 427 387 regmap_read(priv->regmap, MT6359_ZCD_CON3, &reg); 428 388 priv->ana_gain[AUDIO_ANALOG_VOLUME_HSOUTL] = 429 389 (reg >> RG_AUDHSGAIN_SFT) & RG_AUDHSGAIN_MASK; 390 + new_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_HSOUTL]; 430 391 break; 431 392 case MT6359_AUDENC_ANA_CON0: 432 393 regmap_read(priv->regmap, MT6359_AUDENC_ANA_CON0, &reg); 433 394 priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP1] = 434 395 (reg >> RG_AUDPREAMPLGAIN_SFT) & RG_AUDPREAMPLGAIN_MASK; 396 + new_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP1]; 435 397 break; 436 398 case MT6359_AUDENC_ANA_CON1: 437 399 regmap_read(priv->regmap, MT6359_AUDENC_ANA_CON1, &reg); 438 400 priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP2] = 439 401 (reg >> RG_AUDPREAMPRGAIN_SFT) & RG_AUDPREAMPRGAIN_MASK; 402 + new_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP2]; 440 403 break; 441 404 case MT6359_AUDENC_ANA_CON2: 442 405 regmap_read(priv->regmap, MT6359_AUDENC_ANA_CON2, &reg); 443 406 priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP3] = 444 407 (reg >> RG_AUDPREAMP3GAIN_SFT) & RG_AUDPREAMP3GAIN_MASK; 408 + new_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP3]; 445 409 break; 410 + } 411 + 412 + ret = 0; 413 + if (orig_gain[0] != new_gain[0]) { 414 + ret = 1; 415 + } else if (snd_soc_volsw_is_stereo(mc)) { 416 + if (orig_gain[1] != new_gain[1]) 417 + ret = 1; 446 418 } 447 419 448 420 dev_dbg(priv->dev, "%s(), name %s, reg(0x%x) = 0x%x, set index = %x\n", 449 421 __func__, kcontrol->id.name, mc->reg, reg, index); 450 422 451 423 return ret; 424 + } 425 + 426 + static int mt6359_get_playback_volsw(struct snd_kcontrol *kcontrol, 427 + struct snd_ctl_elem_value *ucontrol) 428 + { 429 + struct snd_soc_component *component = 430 + snd_soc_kcontrol_component(kcontrol); 431 + struct mt6359_priv *priv = snd_soc_component_get_drvdata(component); 432 + struct soc_mixer_control *mc = 433 + (struct soc_mixer_control *)kcontrol->private_value; 434 + 435 + switch (mc->reg) { 436 + case MT6359_ZCD_CON2: 437 + ucontrol->value.integer.value[0] = 438 + priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTL]; 439 + ucontrol->value.integer.value[1] = 440 + priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTR]; 441 + break; 442 + case MT6359_ZCD_CON1: 443 + ucontrol->value.integer.value[0] = 444 + priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTL]; 445 + ucontrol->value.integer.value[1] = 446 + priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTR]; 447 + break; 448 + case MT6359_ZCD_CON3: 449 + ucontrol->value.integer.value[0] = 450 + priv->ana_gain[AUDIO_ANALOG_VOLUME_HSOUTL]; 451 + break; 452 + default: 453 + return -EINVAL; 454 + } 455 + 456 + return 0; 452 457 } 453 458 454 459 /* MUX */ ··· 1159 1070 { 1160 1071 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); 1161 1072 struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt); 1073 + unsigned int mux = dapm_kcontrol_get_value(w->kcontrols[0]); 1162 1074 1163 1075 dev_dbg(priv->dev, "%s(), event 0x%x, mux %u\n", 1164 - __func__, event, dapm_kcontrol_get_value(w->kcontrols[0])); 1076 + __func__, event, mux); 1165 1077 1166 1078 switch (event) { 1167 1079 case SND_SOC_DAPM_PRE_PMU: ··· 1200 1110 /* Enable AUD_CLK */ 1201 1111 mt6359_set_decoder_clk(priv, true); 1202 1112 1203 - /* Enable Audio DAC (3rd DAC) */ 1204 - regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON7, 0x3113); 1205 - /* Enable low-noise mode of DAC */ 1206 - if (priv->dev_counter[DEVICE_HP] == 0) 1207 - regmap_write(priv->regmap, 1208 - MT6359_AUDDEC_ANA_CON9, 0x0001); 1209 - /* Switch LOL MUX to audio 3rd DAC */ 1210 - regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON7, 0x311b); 1113 + /* Switch LOL MUX to audio DAC */ 1114 + if (mux == LO_MUX_L_DAC) { 1115 + if (priv->dev_counter[DEVICE_HP] > 0) { 1116 + dev_info(priv->dev, "%s(), can not enable DAC, hp count %d\n", 1117 + __func__, priv->dev_counter[DEVICE_HP]); 1118 + break; 1119 + } 1120 + /* Enable DACL and switch HP MUX to open*/ 1121 + regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON0, 0x3009); 1122 + /* Disable low-noise mode of DAC */ 1123 + regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON9, 0xf200); 1124 + usleep_range(100, 120); 1125 + /* Switch LOL MUX to DACL */ 1126 + regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON7, 0x0117); 1127 + } else if (mux == LO_MUX_3RD_DAC) { 1128 + /* Enable Audio DAC (3rd DAC) */ 1129 + regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON7, 0x3113); 1130 + /* Enable low-noise mode of DAC */ 1131 + if (priv->dev_counter[DEVICE_HP] == 0) 1132 + regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON9, 0x0001); 1133 + /* Switch LOL MUX to audio 3rd DAC */ 1134 + regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON7, 0x311b); 1135 + } 1211 1136 break; 1212 1137 case SND_SOC_DAPM_PRE_PMD: 1213 1138 /* Switch LOL MUX to open */ ··· 1233 1128 /* Disable Audio DAC */ 1234 1129 regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON0, 1235 1130 0x000f, 0x0000); 1131 + 1132 + if (mux == LO_MUX_L_DAC) { 1133 + /* Disable HP driver core circuits */ 1134 + regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON0, 1135 + 0x3 << 4, 0x0); 1136 + /* Disable HP driver bias circuits */ 1137 + regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON0, 1138 + 0x3 << 6, 0x0); 1139 + } 1236 1140 1237 1141 /* Disable AUD_CLK */ 1238 1142 mt6359_set_decoder_clk(priv, false); ··· 2472 2358 {"MISO2_MUX", "UL2_CH1", "UL2_SRC_MUX"}, 2473 2359 {"MISO2_MUX", "UL2_CH2", "UL2_SRC_MUX"}, 2474 2360 2361 + {"MISO0_MUX", NULL, "UL_SRC"}, 2362 + {"MISO1_MUX", NULL, "UL_SRC"}, 2363 + {"MISO2_MUX", NULL, "UL_SRC_34"}, 2364 + 2475 2365 {"UL_SRC_MUX", "AMIC", "ADC_L"}, 2476 2366 {"UL_SRC_MUX", "AMIC", "ADC_R"}, 2477 2367 {"UL_SRC_MUX", "DMIC", "DMIC0_MUX"}, ··· 2615 2497 2616 2498 /* Lineout Path */ 2617 2499 {"LOL Mux", "Playback", "DAC_3RD"}, 2500 + {"LOL Mux", "Playback_L_DAC", "DACL"}, 2618 2501 {"LINEOUT L", NULL, "LOL Mux"}, 2619 2502 2620 2503 /* Headphone Path */ ··· 2785 2666 0x1 << RG_AUDLOLSCDISABLE_VAUDP32_SFT); 2786 2667 2787 2668 /* set gpio */ 2669 + mt6359_set_gpio_smt(priv); 2670 + mt6359_set_gpio_driving(priv); 2788 2671 mt6359_reset_playback_gpio(priv); 2789 2672 mt6359_reset_capture_gpio(priv); 2790 2673 ··· 2818 2697 cmpnt->regmap = NULL; 2819 2698 } 2820 2699 2821 - static const DECLARE_TLV_DB_SCALE(hp_playback_tlv, -2200, 100, 0); 2822 2700 static const DECLARE_TLV_DB_SCALE(playback_tlv, -1000, 100, 0); 2823 2701 static const DECLARE_TLV_DB_SCALE(capture_tlv, 0, 600, 0); 2824 2702 2825 2703 static const struct snd_kcontrol_new mt6359_snd_controls[] = { 2826 2704 /* dl pga gain */ 2827 2705 SOC_DOUBLE_EXT_TLV("Headset Volume", 2828 - MT6359_ZCD_CON2, 0, 7, 0x1E, 0, 2829 - snd_soc_get_volsw, mt6359_put_volsw, 2830 - hp_playback_tlv), 2706 + MT6359_ZCD_CON2, 0, 7, 0x12, 0, 2707 + mt6359_get_playback_volsw, mt6359_put_volsw, 2708 + playback_tlv), 2831 2709 SOC_DOUBLE_EXT_TLV("Lineout Volume", 2832 2710 MT6359_ZCD_CON1, 0, 7, 0x12, 0, 2833 - snd_soc_get_volsw, mt6359_put_volsw, playback_tlv), 2711 + mt6359_get_playback_volsw, mt6359_put_volsw, 2712 + playback_tlv), 2834 2713 SOC_SINGLE_EXT_TLV("Handset Volume", 2835 2714 MT6359_ZCD_CON3, 0, 0x12, 0, 2836 - snd_soc_get_volsw, mt6359_put_volsw, playback_tlv), 2715 + mt6359_get_playback_volsw, mt6359_put_volsw, 2716 + playback_tlv), 2837 2717 2838 2718 /* ul pga gain */ 2839 2719 SOC_SINGLE_EXT_TLV("PGA1 Volume",