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

Merge branch 'for-linus' into for-next

Signed-off-by: Takashi Iwai <tiwai@suse.de>

+165 -50
+8 -4
sound/pci/hda/hda_generic.c
··· 1364 1364 struct nid_path *path; 1365 1365 hda_nid_t pin = pins[i]; 1366 1366 1367 - path = snd_hda_get_path_from_idx(codec, path_idx[i]); 1368 - if (path) { 1369 - badness += assign_out_path_ctls(codec, path); 1370 - continue; 1367 + if (!spec->obey_preferred_dacs) { 1368 + path = snd_hda_get_path_from_idx(codec, path_idx[i]); 1369 + if (path) { 1370 + badness += assign_out_path_ctls(codec, path); 1371 + continue; 1372 + } 1371 1373 } 1372 1374 1373 1375 dacs[i] = get_preferred_dac(codec, pin); 1374 1376 if (dacs[i]) { 1375 1377 if (is_dac_already_used(codec, dacs[i])) 1376 1378 badness += bad->shared_primary; 1379 + } else if (spec->obey_preferred_dacs) { 1380 + badness += BAD_NO_PRIMARY_DAC; 1377 1381 } 1378 1382 1379 1383 if (!dacs[i])
+1
sound/pci/hda/hda_generic.h
··· 237 237 unsigned int power_down_unused:1; /* power down unused widgets */ 238 238 unsigned int dac_min_mute:1; /* minimal = mute for DACs */ 239 239 unsigned int suppress_vmaster:1; /* don't create vmaster kctls */ 240 + unsigned int obey_preferred_dacs:1; /* obey preferred_dacs assignment */ 240 241 241 242 /* other internal flags */ 242 243 unsigned int no_analog:1; /* digital I/O only */
+79 -6
sound/pci/hda/patch_realtek.c
··· 119 119 unsigned int no_shutup_pins:1; 120 120 unsigned int ultra_low_power:1; 121 121 unsigned int has_hs_key:1; 122 + unsigned int no_internal_mic_pin:1; 122 123 123 124 /* for PLL fix */ 124 125 hda_nid_t pll_nid; ··· 446 445 alc_update_coef_idx(codec, 0x7, 1<<5, 0); 447 446 break; 448 447 case 0x10ec0892: 448 + case 0x10ec0897: 449 449 alc_update_coef_idx(codec, 0x7, 1<<5, 0); 450 450 break; 451 451 case 0x10ec0899: ··· 3104 3102 case 0x10ec0215: 3105 3103 case 0x10ec0225: 3106 3104 case 0x10ec0285: 3105 + case 0x10ec0287: 3107 3106 case 0x10ec0295: 3108 3107 case 0x10ec0289: 3109 3108 case 0x10ec0299: ··· 3131 3128 case 0x10ec0215: 3132 3129 case 0x10ec0225: 3133 3130 case 0x10ec0285: 3131 + case 0x10ec0287: 3134 3132 case 0x10ec0295: 3135 3133 case 0x10ec0289: 3136 3134 case 0x10ec0299: ··· 4527 4523 4528 4524 static void alc_headset_mode_unplugged(struct hda_codec *codec) 4529 4525 { 4526 + struct alc_spec *spec = codec->spec; 4530 4527 static const struct coef_fw coef0255[] = { 4531 4528 WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */ 4532 4529 WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */ ··· 4601 4596 UPDATE_COEF(0x4a, 0x0c00, 0), 4602 4597 {} 4603 4598 }; 4599 + 4600 + if (spec->no_internal_mic_pin) { 4601 + alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12); 4602 + return; 4603 + } 4604 4604 4605 4605 switch (codec->core.vendor_id) { 4606 4606 case 0x10ec0255: ··· 5172 5162 UPDATE_COEF(0x49, 0x0300, 0x0300), 5173 5163 {} 5174 5164 }; 5165 + 5166 + if (spec->no_internal_mic_pin) { 5167 + alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12); 5168 + return; 5169 + } 5175 5170 5176 5171 switch (codec->core.vendor_id) { 5177 5172 case 0x10ec0255: ··· 6029 6014 codec->power_save_node = 0; 6030 6015 } 6031 6016 6017 + /* avoid DAC 0x06 for bass speaker 0x17; it has no volume control */ 6018 + static void alc289_fixup_asus_ga401(struct hda_codec *codec, 6019 + const struct hda_fixup *fix, int action) 6020 + { 6021 + static const hda_nid_t preferred_pairs[] = { 6022 + 0x14, 0x02, 0x17, 0x02, 0x21, 0x03, 0 6023 + }; 6024 + struct alc_spec *spec = codec->spec; 6025 + 6026 + if (action == HDA_FIXUP_ACT_PRE_PROBE) { 6027 + spec->gen.preferred_dacs = preferred_pairs; 6028 + spec->gen.obey_preferred_dacs = 1; 6029 + } 6030 + } 6031 + 6032 6032 /* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */ 6033 6033 static void alc285_fixup_invalidate_dacs(struct hda_codec *codec, 6034 6034 const struct hda_fixup *fix, int action) ··· 6145 6115 const struct hda_fixup *fix, int action) 6146 6116 { 6147 6117 switch (action) { 6118 + case HDA_FIXUP_ACT_INIT: 6119 + alc_combo_jack_hp_jd_restart(codec); 6120 + break; 6121 + } 6122 + } 6123 + 6124 + static void alc_fixup_no_int_mic(struct hda_codec *codec, 6125 + const struct hda_fixup *fix, int action) 6126 + { 6127 + struct alc_spec *spec = codec->spec; 6128 + 6129 + switch (action) { 6130 + case HDA_FIXUP_ACT_PRE_PROBE: 6131 + /* Mic RING SLEEVE swap for combo jack */ 6132 + alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12); 6133 + spec->no_internal_mic_pin = true; 6134 + break; 6148 6135 case HDA_FIXUP_ACT_INIT: 6149 6136 alc_combo_jack_hp_jd_restart(codec); 6150 6137 break; ··· 6367 6320 ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK, 6368 6321 ALC287_FIXUP_HP_GPIO_LED, 6369 6322 ALC256_FIXUP_HP_HEADSET_MIC, 6323 + ALC236_FIXUP_DELL_AIO_HEADSET_MIC, 6370 6324 }; 6371 6325 6372 6326 static const struct hda_fixup alc269_fixups[] = { ··· 7617 7569 .chain_id = ALC269_FIXUP_HEADSET_MIC 7618 7570 }, 7619 7571 [ALC289_FIXUP_ASUS_GA401] = { 7620 - .type = HDA_FIXUP_PINS, 7621 - .v.pins = (const struct hda_pintbl[]) { 7622 - { 0x19, 0x03a11020 }, /* headset mic with jack detect */ 7623 - { } 7624 - }, 7572 + .type = HDA_FIXUP_FUNC, 7573 + .v.func = alc289_fixup_asus_ga401, 7574 + .chained = true, 7575 + .chain_id = ALC289_FIXUP_ASUS_GA502, 7625 7576 }, 7626 7577 [ALC289_FIXUP_ASUS_GA502] = { 7627 7578 .type = HDA_FIXUP_PINS, ··· 7744 7697 { } 7745 7698 }, 7746 7699 .chained = true, 7747 - .chain_id = ALC289_FIXUP_ASUS_GA401 7700 + .chain_id = ALC289_FIXUP_ASUS_GA502 7748 7701 }, 7749 7702 [ALC274_FIXUP_HP_MIC] = { 7750 7703 .type = HDA_FIXUP_VERBS, ··· 7784 7737 [ALC256_FIXUP_HP_HEADSET_MIC] = { 7785 7738 .type = HDA_FIXUP_FUNC, 7786 7739 .v.func = alc274_fixup_hp_headset_mic, 7740 + }, 7741 + [ALC236_FIXUP_DELL_AIO_HEADSET_MIC] = { 7742 + .type = HDA_FIXUP_FUNC, 7743 + .v.func = alc_fixup_no_int_mic, 7744 + .chained = true, 7745 + .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE 7787 7746 }, 7788 7747 }; 7789 7748 ··· 7868 7815 SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK), 7869 7816 SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE), 7870 7817 SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE), 7818 + SND_PCI_QUIRK(0x1028, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC), 7819 + SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC), 7871 7820 SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), 7872 7821 SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), 7873 7822 SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), ··· 7936 7881 SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3), 7937 7882 SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC), 7938 7883 SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360), 7884 + SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3), 7939 7885 SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE), 7940 7886 SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE), 7941 7887 SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3), ··· 7958 7902 SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE), 7959 7903 SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), 7960 7904 SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE), 7905 + SND_PCI_QUIRK(0x1043, 0x1271, "ASUS X430UN", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE), 7961 7906 SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE), 7962 7907 SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE), 7963 7908 SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC), ··· 7979 7922 SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC), 7980 7923 SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE), 7981 7924 SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), 7925 + SND_PCI_QUIRK(0x1043, 0x125e, "ASUS Q524UQK", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE), 7982 7926 SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC), 7983 7927 SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE), 7984 7928 SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502), ··· 8411 8353 {0x19, 0x02a11020}, 8412 8354 {0x1a, 0x02a11030}, 8413 8355 {0x21, 0x0221101f}), 8356 + SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC, 8357 + {0x21, 0x02211010}), 8414 8358 SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC, 8415 8359 {0x14, 0x90170110}, 8416 8360 {0x19, 0x02a11020}, ··· 8577 8517 {0x12, 0x90a60130}, 8578 8518 {0x19, 0x03a11020}, 8579 8519 {0x21, 0x0321101f}), 8520 + SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK, 8521 + {0x14, 0x90170110}, 8522 + {0x19, 0x04a11040}, 8523 + {0x21, 0x04211020}), 8580 8524 SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE, 8581 8525 {0x12, 0x90a60130}, 8582 8526 {0x14, 0x90170110}, 8583 8527 {0x19, 0x04a11040}, 8584 8528 {0x21, 0x04211020}), 8529 + SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_HEADSET_JACK, 8530 + {0x14, 0x90170110}, 8531 + {0x17, 0x90170111}, 8532 + {0x19, 0x03a11030}, 8533 + {0x21, 0x03211020}), 8585 8534 SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE, 8586 8535 {0x12, 0x90a60130}, 8587 8536 {0x17, 0x90170110}, ··· 8654 8585 SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, 8655 8586 ALC292_STANDARD_PINS, 8656 8587 {0x13, 0x90a60140}), 8588 + SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_HPE, 8589 + {0x17, 0x90170110}, 8590 + {0x21, 0x04211020}), 8657 8591 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC, 8658 8592 {0x14, 0x90170110}, 8659 8593 {0x1b, 0x90a70130}, ··· 10243 10171 HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882), 10244 10172 HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882), 10245 10173 HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662), 10174 + HDA_CODEC_ENTRY(0x10ec0897, "ALC897", patch_alc662), 10246 10175 HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882), 10247 10176 HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882), 10248 10177 HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882),
+1
sound/soc/codecs/rt5682.c
··· 43 43 {RT5682_DAC_ADC_DIG_VOL1, 0xa020}, 44 44 {RT5682_I2C_CTRL, 0x000f}, 45 45 {RT5682_PLL2_INTERNAL, 0x8266}, 46 + {RT5682_SAR_IL_CMD_3, 0x8365}, 46 47 }; 47 48 48 49 void rt5682_apply_patch_list(struct rt5682_priv *rt5682, struct device *dev)
+1
sound/soc/codecs/wm_adsp.c
··· 1937 1937 mem = wm_adsp_find_region(dsp, type); 1938 1938 if (!mem) { 1939 1939 adsp_err(dsp, "No region of type: %x\n", type); 1940 + ret = -EINVAL; 1940 1941 goto out_fw; 1941 1942 } 1942 1943
+14 -3
sound/soc/intel/boards/bytcr_rt5640.c
··· 520 520 .driver_data = (void *)(BYT_RT5640_IN1_MAP | 521 521 BYT_RT5640_MCLK_EN), 522 522 }, 523 - { /* HP Pavilion x2 10-n000nd */ 523 + { /* HP Pavilion x2 10-k0XX, 10-n0XX */ 524 524 .matches = { 525 - DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 526 - DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "HP Pavilion x2 Detachable"), 525 + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 526 + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion x2 Detachable"), 527 527 }, 528 528 .driver_data = (void *)(BYT_RT5640_DMIC1_MAP | 529 529 BYT_RT5640_JD_SRC_JD2_IN4N | 530 530 BYT_RT5640_OVCD_TH_1500UA | 531 531 BYT_RT5640_OVCD_SF_0P75 | 532 532 BYT_RT5640_SSP0_AIF1 | 533 + BYT_RT5640_MCLK_EN), 534 + }, 535 + { /* HP Pavilion x2 10-p0XX */ 536 + .matches = { 537 + DMI_MATCH(DMI_SYS_VENDOR, "HP"), 538 + DMI_MATCH(DMI_PRODUCT_NAME, "HP x2 Detachable 10-p0XX"), 539 + }, 540 + .driver_data = (void *)(BYT_RT5640_DMIC1_MAP | 541 + BYT_RT5640_JD_SRC_JD1_IN4P | 542 + BYT_RT5640_OVCD_TH_1500UA | 543 + BYT_RT5640_OVCD_SF_0P75 | 533 544 BYT_RT5640_MCLK_EN), 534 545 }, 535 546 { /* HP Stream 7 */
+31 -31
sound/soc/qcom/lpass-cpu.c
··· 263 263 return 0; 264 264 } 265 265 266 - static int lpass_cpu_daiops_prepare(struct snd_pcm_substream *substream, 267 - struct snd_soc_dai *dai) 268 - { 269 - struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai); 270 - struct lpaif_i2sctl *i2sctl = drvdata->i2sctl; 271 - unsigned int id = dai->driver->id; 272 - int ret; 273 - 274 - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { 275 - ret = regmap_fields_write(i2sctl->spken, id, 276 - LPAIF_I2SCTL_SPKEN_ENABLE); 277 - } else { 278 - ret = regmap_fields_write(i2sctl->micen, id, 279 - LPAIF_I2SCTL_MICEN_ENABLE); 280 - } 281 - 282 - if (ret) 283 - dev_err(dai->dev, "error writing to i2sctl enable: %d\n", ret); 284 - 285 - return ret; 286 - } 287 - 288 266 static int lpass_cpu_daiops_trigger(struct snd_pcm_substream *substream, 289 267 int cmd, struct snd_soc_dai *dai) 290 268 { ··· 270 292 struct lpaif_i2sctl *i2sctl = drvdata->i2sctl; 271 293 unsigned int id = dai->driver->id; 272 294 int ret = -EINVAL; 295 + unsigned int val = 0; 296 + 297 + ret = regmap_read(drvdata->lpaif_map, 298 + LPAIF_I2SCTL_REG(drvdata->variant, dai->driver->id), &val); 299 + if (ret) { 300 + dev_err(dai->dev, "error reading from i2sctl reg: %d\n", ret); 301 + return ret; 302 + } 303 + if (val == LPAIF_I2SCTL_RESET_STATE) { 304 + dev_err(dai->dev, "error in i2sctl register state\n"); 305 + return -ENOTRECOVERABLE; 306 + } 273 307 274 308 switch (cmd) { 275 309 case SNDRV_PCM_TRIGGER_START: ··· 298 308 dev_err(dai->dev, "error writing to i2sctl reg: %d\n", 299 309 ret); 300 310 301 - ret = clk_enable(drvdata->mi2s_bit_clk[id]); 302 - if (ret) { 303 - dev_err(dai->dev, "error in enabling mi2s bit clk: %d\n", ret); 304 - clk_disable(drvdata->mi2s_osr_clk[id]); 305 - return ret; 311 + if (drvdata->bit_clk_state[id] == LPAIF_BIT_CLK_DISABLE) { 312 + ret = clk_enable(drvdata->mi2s_bit_clk[id]); 313 + if (ret) { 314 + dev_err(dai->dev, "error in enabling mi2s bit clk: %d\n", ret); 315 + clk_disable(drvdata->mi2s_osr_clk[id]); 316 + return ret; 317 + } 318 + drvdata->bit_clk_state[id] = LPAIF_BIT_CLK_ENABLE; 306 319 } 307 320 308 321 break; ··· 322 329 if (ret) 323 330 dev_err(dai->dev, "error writing to i2sctl reg: %d\n", 324 331 ret); 325 - clk_disable(drvdata->mi2s_bit_clk[dai->driver->id]); 332 + if (drvdata->bit_clk_state[id] == LPAIF_BIT_CLK_ENABLE) { 333 + clk_disable(drvdata->mi2s_bit_clk[dai->driver->id]); 334 + drvdata->bit_clk_state[id] = LPAIF_BIT_CLK_DISABLE; 335 + } 326 336 break; 327 337 } 328 338 ··· 337 341 .startup = lpass_cpu_daiops_startup, 338 342 .shutdown = lpass_cpu_daiops_shutdown, 339 343 .hw_params = lpass_cpu_daiops_hw_params, 340 - .prepare = lpass_cpu_daiops_prepare, 341 344 .trigger = lpass_cpu_daiops_trigger, 342 345 }; 343 346 EXPORT_SYMBOL_GPL(asoc_qcom_lpass_cpu_dai_ops); ··· 454 459 struct lpass_variant *v = drvdata->variant; 455 460 int i; 456 461 462 + for (i = 0; i < v->i2s_ports; ++i) 463 + if (reg == LPAIF_I2SCTL_REG(v, i)) 464 + return true; 457 465 for (i = 0; i < v->irq_ports; ++i) 458 466 if (reg == LPAIF_IRQSTAT_REG(v, i)) 459 467 return true; 460 468 461 469 for (i = 0; i < v->rdma_channels; ++i) 462 - if (reg == LPAIF_RDMACURR_REG(v, i)) 470 + if (reg == LPAIF_RDMACURR_REG(v, i) || reg == LPAIF_RDMACTL_REG(v, i)) 463 471 return true; 464 472 465 473 for (i = 0; i < v->wrdma_channels; ++i) 466 - if (reg == LPAIF_WRDMACURR_REG(v, i + v->wrdma_channel_start)) 474 + if (reg == LPAIF_WRDMACURR_REG(v, i + v->wrdma_channel_start) || 475 + reg == LPAIF_WRDMACTL_REG(v, i + v->wrdma_channel_start)) 467 476 return true; 468 477 469 478 return false; ··· 860 861 PTR_ERR(drvdata->mi2s_bit_clk[dai_id])); 861 862 return PTR_ERR(drvdata->mi2s_bit_clk[dai_id]); 862 863 } 864 + drvdata->bit_clk_state[dai_id] = LPAIF_BIT_CLK_DISABLE; 863 865 } 864 866 865 867 /* Allocation for i2sctl regmap fields */
+7
sound/soc/qcom/lpass-lpaif-reg.h
··· 60 60 #define LPAIF_I2SCTL_BITWIDTH_24 1 61 61 #define LPAIF_I2SCTL_BITWIDTH_32 2 62 62 63 + #define LPAIF_BIT_CLK_DISABLE 0 64 + #define LPAIF_BIT_CLK_ENABLE 1 65 + 66 + #define LPAIF_I2SCTL_RESET_STATE 0x003C0004 67 + #define LPAIF_DMACTL_RESET_STATE 0x00200000 68 + 69 + 63 70 /* LPAIF IRQ */ 64 71 #define LPAIF_IRQ_REG_ADDR(v, addr, port) \ 65 72 (v->irq_reg_base + (addr) + v->irq_reg_stride * (port))
+18 -2
sound/soc/qcom/lpass-platform.c
··· 110 110 struct regmap *map; 111 111 unsigned int dai_id = cpu_dai->driver->id; 112 112 113 + component->id = dai_id; 113 114 data = kzalloc(sizeof(*data), GFP_KERNEL); 114 115 if (!data) 115 116 return -ENOMEM; ··· 452 451 unsigned int reg_irqclr = 0, val_irqclr = 0; 453 452 unsigned int reg_irqen = 0, val_irqen = 0, val_mask = 0; 454 453 unsigned int dai_id = cpu_dai->driver->id; 454 + unsigned int dma_ctrl_reg = 0; 455 455 456 456 ch = pcm_data->dma_ch; 457 457 if (dir == SNDRV_PCM_STREAM_PLAYBACK) { 458 458 id = pcm_data->dma_ch; 459 - if (dai_id == LPASS_DP_RX) 459 + if (dai_id == LPASS_DP_RX) { 460 460 dmactl = drvdata->hdmi_rd_dmactl; 461 - else 461 + map = drvdata->hdmiif_map; 462 + } else { 462 463 dmactl = drvdata->rd_dmactl; 464 + map = drvdata->lpaif_map; 465 + } 463 466 } else { 464 467 dmactl = drvdata->wr_dmactl; 465 468 id = pcm_data->dma_ch - v->wrdma_channel_start; 469 + map = drvdata->lpaif_map; 470 + } 471 + ret = regmap_read(map, LPAIF_DMACTL_REG(v, ch, dir, dai_id), &dma_ctrl_reg); 472 + if (ret) { 473 + dev_err(soc_runtime->dev, "error reading from rdmactl reg: %d\n", ret); 474 + return ret; 466 475 } 467 476 477 + if (dma_ctrl_reg == LPAIF_DMACTL_RESET_STATE || 478 + dma_ctrl_reg == LPAIF_DMACTL_RESET_STATE + 1) { 479 + dev_err(soc_runtime->dev, "error in rdmactl register state\n"); 480 + return -ENOTRECOVERABLE; 481 + } 468 482 switch (cmd) { 469 483 case SNDRV_PCM_TRIGGER_START: 470 484 case SNDRV_PCM_TRIGGER_RESUME:
+1
sound/soc/qcom/lpass.h
··· 68 68 unsigned int mi2s_playback_sd_mode[LPASS_MAX_MI2S_PORTS]; 69 69 unsigned int mi2s_capture_sd_mode[LPASS_MAX_MI2S_PORTS]; 70 70 int hdmi_port_enable; 71 + int bit_clk_state[LPASS_MAX_MI2S_PORTS]; 71 72 72 73 /* low-power audio interface (LPAIF) registers */ 73 74 void __iomem *lpaif;
+1 -1
sound/usb/mixer_us16x08.c
··· 607 607 static int snd_us16x08_meter_info(struct snd_kcontrol *kcontrol, 608 608 struct snd_ctl_elem_info *uinfo) 609 609 { 610 - uinfo->count = 1; 610 + uinfo->count = 34; 611 611 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 612 612 uinfo->value.integer.max = 0x7FFF; 613 613 uinfo->value.integer.min = 0;
+3 -3
sound/usb/stream.c
··· 192 192 struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol); 193 193 struct snd_usb_substream *subs = info->private_data; 194 194 struct snd_pcm_chmap_elem *chmap = NULL; 195 - int i; 195 + int i = 0; 196 196 197 - memset(ucontrol->value.integer.value, 0, 198 - sizeof(ucontrol->value.integer.value)); 199 197 if (subs->cur_audiofmt) 200 198 chmap = subs->cur_audiofmt->chmap; 201 199 if (chmap) { 202 200 for (i = 0; i < chmap->channels; i++) 203 201 ucontrol->value.integer.value[i] = chmap->map[i]; 204 202 } 203 + for (; i < subs->channels_max; i++) 204 + ucontrol->value.integer.value[i] = 0; 205 205 return 0; 206 206 } 207 207