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

ASoC: rt5677: Avoid the pop sound that comes from the filter power

The patch changes the type of DACs mixer to AUTODISABLE and add the delay
time after power up to avoid the pop sound that comes from the filter
power.

Signed-off-by: Oder Chiou <oder_chiou@realtek.com>
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Oder Chiou and committed by
Mark Brown
c22d7666 6ff33f39

+61 -39
+61 -39
sound/soc/codecs/rt5677.c
··· 1386 1386 }; 1387 1387 1388 1388 static const struct snd_kcontrol_new rt5677_sto1_dac_l_mix[] = { 1389 - SOC_DAPM_SINGLE("ST L Switch", RT5677_STO1_DAC_MIXER, 1389 + SOC_DAPM_SINGLE_AUTODISABLE("ST L Switch", RT5677_STO1_DAC_MIXER, 1390 1390 RT5677_M_ST_DAC1_L_SFT, 1, 1), 1391 - SOC_DAPM_SINGLE("DAC1 L Switch", RT5677_STO1_DAC_MIXER, 1391 + SOC_DAPM_SINGLE_AUTODISABLE("DAC1 L Switch", RT5677_STO1_DAC_MIXER, 1392 1392 RT5677_M_DAC1_L_STO_L_SFT, 1, 1), 1393 - SOC_DAPM_SINGLE("DAC2 L Switch", RT5677_STO1_DAC_MIXER, 1393 + SOC_DAPM_SINGLE_AUTODISABLE("DAC2 L Switch", RT5677_STO1_DAC_MIXER, 1394 1394 RT5677_M_DAC2_L_STO_L_SFT, 1, 1), 1395 - SOC_DAPM_SINGLE("DAC1 R Switch", RT5677_STO1_DAC_MIXER, 1395 + SOC_DAPM_SINGLE_AUTODISABLE("DAC1 R Switch", RT5677_STO1_DAC_MIXER, 1396 1396 RT5677_M_DAC1_R_STO_L_SFT, 1, 1), 1397 1397 }; 1398 1398 1399 1399 static const struct snd_kcontrol_new rt5677_sto1_dac_r_mix[] = { 1400 - SOC_DAPM_SINGLE("ST R Switch", RT5677_STO1_DAC_MIXER, 1400 + SOC_DAPM_SINGLE_AUTODISABLE("ST R Switch", RT5677_STO1_DAC_MIXER, 1401 1401 RT5677_M_ST_DAC1_R_SFT, 1, 1), 1402 - SOC_DAPM_SINGLE("DAC1 R Switch", RT5677_STO1_DAC_MIXER, 1402 + SOC_DAPM_SINGLE_AUTODISABLE("DAC1 R Switch", RT5677_STO1_DAC_MIXER, 1403 1403 RT5677_M_DAC1_R_STO_R_SFT, 1, 1), 1404 - SOC_DAPM_SINGLE("DAC2 R Switch", RT5677_STO1_DAC_MIXER, 1404 + SOC_DAPM_SINGLE_AUTODISABLE("DAC2 R Switch", RT5677_STO1_DAC_MIXER, 1405 1405 RT5677_M_DAC2_R_STO_R_SFT, 1, 1), 1406 - SOC_DAPM_SINGLE("DAC1 L Switch", RT5677_STO1_DAC_MIXER, 1406 + SOC_DAPM_SINGLE_AUTODISABLE("DAC1 L Switch", RT5677_STO1_DAC_MIXER, 1407 1407 RT5677_M_DAC1_L_STO_R_SFT, 1, 1), 1408 1408 }; 1409 1409 1410 1410 static const struct snd_kcontrol_new rt5677_mono_dac_l_mix[] = { 1411 - SOC_DAPM_SINGLE("ST L Switch", RT5677_MONO_DAC_MIXER, 1411 + SOC_DAPM_SINGLE_AUTODISABLE("ST L Switch", RT5677_MONO_DAC_MIXER, 1412 1412 RT5677_M_ST_DAC2_L_SFT, 1, 1), 1413 - SOC_DAPM_SINGLE("DAC1 L Switch", RT5677_MONO_DAC_MIXER, 1413 + SOC_DAPM_SINGLE_AUTODISABLE("DAC1 L Switch", RT5677_MONO_DAC_MIXER, 1414 1414 RT5677_M_DAC1_L_MONO_L_SFT, 1, 1), 1415 - SOC_DAPM_SINGLE("DAC2 L Switch", RT5677_MONO_DAC_MIXER, 1415 + SOC_DAPM_SINGLE_AUTODISABLE("DAC2 L Switch", RT5677_MONO_DAC_MIXER, 1416 1416 RT5677_M_DAC2_L_MONO_L_SFT, 1, 1), 1417 - SOC_DAPM_SINGLE("DAC2 R Switch", RT5677_MONO_DAC_MIXER, 1417 + SOC_DAPM_SINGLE_AUTODISABLE("DAC2 R Switch", RT5677_MONO_DAC_MIXER, 1418 1418 RT5677_M_DAC2_R_MONO_L_SFT, 1, 1), 1419 1419 }; 1420 1420 1421 1421 static const struct snd_kcontrol_new rt5677_mono_dac_r_mix[] = { 1422 - SOC_DAPM_SINGLE("ST R Switch", RT5677_MONO_DAC_MIXER, 1422 + SOC_DAPM_SINGLE_AUTODISABLE("ST R Switch", RT5677_MONO_DAC_MIXER, 1423 1423 RT5677_M_ST_DAC2_R_SFT, 1, 1), 1424 - SOC_DAPM_SINGLE("DAC1 R Switch", RT5677_MONO_DAC_MIXER, 1424 + SOC_DAPM_SINGLE_AUTODISABLE("DAC1 R Switch", RT5677_MONO_DAC_MIXER, 1425 1425 RT5677_M_DAC1_R_MONO_R_SFT, 1, 1), 1426 - SOC_DAPM_SINGLE("DAC2 R Switch", RT5677_MONO_DAC_MIXER, 1426 + SOC_DAPM_SINGLE_AUTODISABLE("DAC2 R Switch", RT5677_MONO_DAC_MIXER, 1427 1427 RT5677_M_DAC2_R_MONO_R_SFT, 1, 1), 1428 - SOC_DAPM_SINGLE("DAC2 L Switch", RT5677_MONO_DAC_MIXER, 1428 + SOC_DAPM_SINGLE_AUTODISABLE("DAC2 L Switch", RT5677_MONO_DAC_MIXER, 1429 1429 RT5677_M_DAC2_L_MONO_R_SFT, 1, 1), 1430 1430 }; 1431 1431 1432 1432 static const struct snd_kcontrol_new rt5677_dd1_l_mix[] = { 1433 - SOC_DAPM_SINGLE("Sto DAC Mix L Switch", RT5677_DD1_MIXER, 1433 + SOC_DAPM_SINGLE_AUTODISABLE("Sto DAC Mix L Switch", RT5677_DD1_MIXER, 1434 1434 RT5677_M_STO_L_DD1_L_SFT, 1, 1), 1435 - SOC_DAPM_SINGLE("Mono DAC Mix L Switch", RT5677_DD1_MIXER, 1435 + SOC_DAPM_SINGLE_AUTODISABLE("Mono DAC Mix L Switch", RT5677_DD1_MIXER, 1436 1436 RT5677_M_MONO_L_DD1_L_SFT, 1, 1), 1437 - SOC_DAPM_SINGLE("DAC3 L Switch", RT5677_DD1_MIXER, 1437 + SOC_DAPM_SINGLE_AUTODISABLE("DAC3 L Switch", RT5677_DD1_MIXER, 1438 1438 RT5677_M_DAC3_L_DD1_L_SFT, 1, 1), 1439 - SOC_DAPM_SINGLE("DAC3 R Switch", RT5677_DD1_MIXER, 1439 + SOC_DAPM_SINGLE_AUTODISABLE("DAC3 R Switch", RT5677_DD1_MIXER, 1440 1440 RT5677_M_DAC3_R_DD1_L_SFT, 1, 1), 1441 1441 }; 1442 1442 1443 1443 static const struct snd_kcontrol_new rt5677_dd1_r_mix[] = { 1444 - SOC_DAPM_SINGLE("Sto DAC Mix R Switch", RT5677_DD1_MIXER, 1444 + SOC_DAPM_SINGLE_AUTODISABLE("Sto DAC Mix R Switch", RT5677_DD1_MIXER, 1445 1445 RT5677_M_STO_R_DD1_R_SFT, 1, 1), 1446 - SOC_DAPM_SINGLE("Mono DAC Mix R Switch", RT5677_DD1_MIXER, 1446 + SOC_DAPM_SINGLE_AUTODISABLE("Mono DAC Mix R Switch", RT5677_DD1_MIXER, 1447 1447 RT5677_M_MONO_R_DD1_R_SFT, 1, 1), 1448 - SOC_DAPM_SINGLE("DAC3 R Switch", RT5677_DD1_MIXER, 1448 + SOC_DAPM_SINGLE_AUTODISABLE("DAC3 R Switch", RT5677_DD1_MIXER, 1449 1449 RT5677_M_DAC3_R_DD1_R_SFT, 1, 1), 1450 - SOC_DAPM_SINGLE("DAC3 L Switch", RT5677_DD1_MIXER, 1450 + SOC_DAPM_SINGLE_AUTODISABLE("DAC3 L Switch", RT5677_DD1_MIXER, 1451 1451 RT5677_M_DAC3_L_DD1_R_SFT, 1, 1), 1452 1452 }; 1453 1453 1454 1454 static const struct snd_kcontrol_new rt5677_dd2_l_mix[] = { 1455 - SOC_DAPM_SINGLE("Sto DAC Mix L Switch", RT5677_DD2_MIXER, 1455 + SOC_DAPM_SINGLE_AUTODISABLE("Sto DAC Mix L Switch", RT5677_DD2_MIXER, 1456 1456 RT5677_M_STO_L_DD2_L_SFT, 1, 1), 1457 - SOC_DAPM_SINGLE("Mono DAC Mix L Switch", RT5677_DD2_MIXER, 1457 + SOC_DAPM_SINGLE_AUTODISABLE("Mono DAC Mix L Switch", RT5677_DD2_MIXER, 1458 1458 RT5677_M_MONO_L_DD2_L_SFT, 1, 1), 1459 - SOC_DAPM_SINGLE("DAC4 L Switch", RT5677_DD2_MIXER, 1459 + SOC_DAPM_SINGLE_AUTODISABLE("DAC4 L Switch", RT5677_DD2_MIXER, 1460 1460 RT5677_M_DAC4_L_DD2_L_SFT, 1, 1), 1461 - SOC_DAPM_SINGLE("DAC4 R Switch", RT5677_DD2_MIXER, 1461 + SOC_DAPM_SINGLE_AUTODISABLE("DAC4 R Switch", RT5677_DD2_MIXER, 1462 1462 RT5677_M_DAC4_R_DD2_L_SFT, 1, 1), 1463 1463 }; 1464 1464 1465 1465 static const struct snd_kcontrol_new rt5677_dd2_r_mix[] = { 1466 - SOC_DAPM_SINGLE("Sto DAC Mix R Switch", RT5677_DD2_MIXER, 1466 + SOC_DAPM_SINGLE_AUTODISABLE("Sto DAC Mix R Switch", RT5677_DD2_MIXER, 1467 1467 RT5677_M_STO_R_DD2_R_SFT, 1, 1), 1468 - SOC_DAPM_SINGLE("Mono DAC Mix R Switch", RT5677_DD2_MIXER, 1468 + SOC_DAPM_SINGLE_AUTODISABLE("Mono DAC Mix R Switch", RT5677_DD2_MIXER, 1469 1469 RT5677_M_MONO_R_DD2_R_SFT, 1, 1), 1470 - SOC_DAPM_SINGLE("DAC4 R Switch", RT5677_DD2_MIXER, 1470 + SOC_DAPM_SINGLE_AUTODISABLE("DAC4 R Switch", RT5677_DD2_MIXER, 1471 1471 RT5677_M_DAC4_R_DD2_R_SFT, 1, 1), 1472 - SOC_DAPM_SINGLE("DAC4 L Switch", RT5677_DD2_MIXER, 1472 + SOC_DAPM_SINGLE_AUTODISABLE("DAC4 L Switch", RT5677_DD2_MIXER, 1473 1473 RT5677_M_DAC4_L_DD2_R_SFT, 1, 1), 1474 1474 }; 1475 1475 ··· 2596 2596 return 0; 2597 2597 } 2598 2598 2599 + static int rt5677_filter_power_event(struct snd_soc_dapm_widget *w, 2600 + struct snd_kcontrol *kcontrol, int event) 2601 + { 2602 + switch (event) { 2603 + case SND_SOC_DAPM_POST_PMU: 2604 + msleep(50); 2605 + break; 2606 + 2607 + default: 2608 + return 0; 2609 + } 2610 + 2611 + return 0; 2612 + } 2613 + 2599 2614 static const struct snd_soc_dapm_widget rt5677_dapm_widgets[] = { 2600 2615 SND_SOC_DAPM_SUPPLY("PLL1", RT5677_PWR_ANLG2, RT5677_PWR_PLL1_BIT, 2601 2616 0, rt5677_set_pll1_event, SND_SOC_DAPM_PRE_PMU | ··· 3087 3072 3088 3073 /* DAC Mixer */ 3089 3074 SND_SOC_DAPM_SUPPLY("dac stereo1 filter", RT5677_PWR_DIG2, 3090 - RT5677_PWR_DAC_S1F_BIT, 0, NULL, 0), 3075 + RT5677_PWR_DAC_S1F_BIT, 0, rt5677_filter_power_event, 3076 + SND_SOC_DAPM_POST_PMU), 3091 3077 SND_SOC_DAPM_SUPPLY("dac mono2 left filter", RT5677_PWR_DIG2, 3092 - RT5677_PWR_DAC_M2F_L_BIT, 0, NULL, 0), 3078 + RT5677_PWR_DAC_M2F_L_BIT, 0, rt5677_filter_power_event, 3079 + SND_SOC_DAPM_POST_PMU), 3093 3080 SND_SOC_DAPM_SUPPLY("dac mono2 right filter", RT5677_PWR_DIG2, 3094 - RT5677_PWR_DAC_M2F_R_BIT, 0, NULL, 0), 3081 + RT5677_PWR_DAC_M2F_R_BIT, 0, rt5677_filter_power_event, 3082 + SND_SOC_DAPM_POST_PMU), 3095 3083 SND_SOC_DAPM_SUPPLY("dac mono3 left filter", RT5677_PWR_DIG2, 3096 - RT5677_PWR_DAC_M3F_L_BIT, 0, NULL, 0), 3084 + RT5677_PWR_DAC_M3F_L_BIT, 0, rt5677_filter_power_event, 3085 + SND_SOC_DAPM_POST_PMU), 3097 3086 SND_SOC_DAPM_SUPPLY("dac mono3 right filter", RT5677_PWR_DIG2, 3098 - RT5677_PWR_DAC_M3F_R_BIT, 0, NULL, 0), 3087 + RT5677_PWR_DAC_M3F_R_BIT, 0, rt5677_filter_power_event, 3088 + SND_SOC_DAPM_POST_PMU), 3099 3089 SND_SOC_DAPM_SUPPLY("dac mono4 left filter", RT5677_PWR_DIG2, 3100 - RT5677_PWR_DAC_M4F_L_BIT, 0, NULL, 0), 3090 + RT5677_PWR_DAC_M4F_L_BIT, 0, rt5677_filter_power_event, 3091 + SND_SOC_DAPM_POST_PMU), 3101 3092 SND_SOC_DAPM_SUPPLY("dac mono4 right filter", RT5677_PWR_DIG2, 3102 - RT5677_PWR_DAC_M4F_R_BIT, 0, NULL, 0), 3093 + RT5677_PWR_DAC_M4F_R_BIT, 0, rt5677_filter_power_event, 3094 + SND_SOC_DAPM_POST_PMU), 3103 3095 3104 3096 SND_SOC_DAPM_MIXER("Stereo DAC MIXL", SND_SOC_NOPM, 0, 0, 3105 3097 rt5677_sto1_dac_l_mix, ARRAY_SIZE(rt5677_sto1_dac_l_mix)),