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.

Merge tag 'sound-4.4-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull sound fixes from Takashi Iwai:
"This time we've got a larger number of updates, mainly from ASoC
world. The only significant LOCs found here are for Realtek codecs,
where most of changes are quite systematic replacements.

There are also a few fixes in ASoC core side: one is the PM call order
fix to ensure the DPAM resume working properly. Another is the proper
cleanup call after freeing DAPM widgets, and the correction of the
wrong callback set in topology API.

The rest are a wide range of driver-specific small fixes, including
HD-audio"

* tag 'sound-4.4-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (35 commits)
ALSA: hda - Add Conexant CX8200 (14f1:2008) codec entry
ALSA: hda - Correct codec names for 14f1:50f1 and 14f1:50f3
ALSA: hda - Skip ELD notification during system suspend
ASoC: core: Change power state before rechecking endpoint
ASoC: fix kernel-doc warnings in sound/soc/soc-ops.c
ASoC: rt5645: Add dmi_system_id "Google Terra"
ASoC: rockchip: Fix incorrect VDW value for 24 bit
ASoC: fsl: clarify ac97 dependency
ASoC: Intel: Skylake: fix memory leak
ASoC: davinci-mcasp: Fix master capture only mode
ASoC: es8328: Fix shifts for mixer switches
ASoC: rt5645: Add dmi_system_id "Google Wizpig"
ASoC: sti: set player private data
ASoC: sti: rename ST proprietary DT properties
ASoC: sti: remove wrong error message
ASoC: Intel: Skylake: Add I2C depends for SKL machine
ASoC: topology: fix info callback for TLV byte control
ASoC: rt5670: fix wrong bit def for pll src
ASoC: nau8825: add pm function
ASoC: rt5645: Add struct dmi_system_id "Google Edgar" for Chrome OS
...

+247 -107
+1
include/sound/soc-dapm.h
··· 398 398 int snd_soc_dapm_weak_routes(struct snd_soc_dapm_context *dapm, 399 399 const struct snd_soc_dapm_route *route, int num); 400 400 void snd_soc_dapm_free_widget(struct snd_soc_dapm_widget *w); 401 + void snd_soc_dapm_reset_cache(struct snd_soc_dapm_context *dapm); 401 402 402 403 /* dapm events */ 403 404 void snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream,
+3 -2
sound/pci/hda/patch_conexant.c
··· 955 955 */ 956 956 957 957 static const struct hda_device_id snd_hda_id_conexant[] = { 958 + HDA_CODEC_ENTRY(0x14f12008, "CX8200", patch_conexant_auto), 958 959 HDA_CODEC_ENTRY(0x14f15045, "CX20549 (Venice)", patch_conexant_auto), 959 960 HDA_CODEC_ENTRY(0x14f15047, "CX20551 (Waikiki)", patch_conexant_auto), 960 961 HDA_CODEC_ENTRY(0x14f15051, "CX20561 (Hermosa)", patch_conexant_auto), ··· 973 972 HDA_CODEC_ENTRY(0x14f150ac, "CX20652", patch_conexant_auto), 974 973 HDA_CODEC_ENTRY(0x14f150b8, "CX20664", patch_conexant_auto), 975 974 HDA_CODEC_ENTRY(0x14f150b9, "CX20665", patch_conexant_auto), 976 - HDA_CODEC_ENTRY(0x14f150f1, "CX20721", patch_conexant_auto), 975 + HDA_CODEC_ENTRY(0x14f150f1, "CX21722", patch_conexant_auto), 977 976 HDA_CODEC_ENTRY(0x14f150f2, "CX20722", patch_conexant_auto), 978 - HDA_CODEC_ENTRY(0x14f150f3, "CX20723", patch_conexant_auto), 977 + HDA_CODEC_ENTRY(0x14f150f3, "CX21724", patch_conexant_auto), 979 978 HDA_CODEC_ENTRY(0x14f150f4, "CX20724", patch_conexant_auto), 980 979 HDA_CODEC_ENTRY(0x14f1510f, "CX20751/2", patch_conexant_auto), 981 980 HDA_CODEC_ENTRY(0x14f15110, "CX20751/2", patch_conexant_auto),
+6
sound/pci/hda/patch_hdmi.c
··· 2352 2352 struct hda_codec *codec = audio_ptr; 2353 2353 int pin_nid = port + 0x04; 2354 2354 2355 + /* skip notification during system suspend (but not in runtime PM); 2356 + * the state will be updated at resume 2357 + */ 2358 + if (snd_power_get_state(codec->card) != SNDRV_CTL_POWER_D0) 2359 + return; 2360 + 2355 2361 check_presence_and_report(codec, pin_nid); 2356 2362 } 2357 2363
+5 -11
sound/soc/codecs/arizona.c
··· 1023 1023 } 1024 1024 EXPORT_SYMBOL_GPL(arizona_init_dvfs); 1025 1025 1026 - static unsigned int arizona_sysclk_48k_rates[] = { 1026 + static unsigned int arizona_opclk_ref_48k_rates[] = { 1027 1027 6144000, 1028 1028 12288000, 1029 1029 24576000, 1030 1030 49152000, 1031 - 73728000, 1032 - 98304000, 1033 - 147456000, 1034 1031 }; 1035 1032 1036 - static unsigned int arizona_sysclk_44k1_rates[] = { 1033 + static unsigned int arizona_opclk_ref_44k1_rates[] = { 1037 1034 5644800, 1038 1035 11289600, 1039 1036 22579200, 1040 1037 45158400, 1041 - 67737600, 1042 - 90316800, 1043 - 135475200, 1044 1038 }; 1045 1039 1046 1040 static int arizona_set_opclk(struct snd_soc_codec *codec, unsigned int clk, ··· 1059 1065 } 1060 1066 1061 1067 if (refclk % 8000) 1062 - rates = arizona_sysclk_44k1_rates; 1068 + rates = arizona_opclk_ref_44k1_rates; 1063 1069 else 1064 - rates = arizona_sysclk_48k_rates; 1070 + rates = arizona_opclk_ref_48k_rates; 1065 1071 1066 - for (ref = 0; ref < ARRAY_SIZE(arizona_sysclk_48k_rates) && 1072 + for (ref = 0; ref < ARRAY_SIZE(arizona_opclk_ref_48k_rates) && 1067 1073 rates[ref] <= refclk; ref++) { 1068 1074 div = 1; 1069 1075 while (rates[ref] / div >= freq && div < 32) {
+8 -8
sound/soc/codecs/es8328.c
··· 205 205 206 206 /* Left Mixer */ 207 207 static const struct snd_kcontrol_new es8328_left_mixer_controls[] = { 208 - SOC_DAPM_SINGLE("Playback Switch", ES8328_DACCONTROL17, 8, 1, 0), 209 - SOC_DAPM_SINGLE("Left Bypass Switch", ES8328_DACCONTROL17, 7, 1, 0), 210 - SOC_DAPM_SINGLE("Right Playback Switch", ES8328_DACCONTROL18, 8, 1, 0), 211 - SOC_DAPM_SINGLE("Right Bypass Switch", ES8328_DACCONTROL18, 7, 1, 0), 208 + SOC_DAPM_SINGLE("Playback Switch", ES8328_DACCONTROL17, 7, 1, 0), 209 + SOC_DAPM_SINGLE("Left Bypass Switch", ES8328_DACCONTROL17, 6, 1, 0), 210 + SOC_DAPM_SINGLE("Right Playback Switch", ES8328_DACCONTROL18, 7, 1, 0), 211 + SOC_DAPM_SINGLE("Right Bypass Switch", ES8328_DACCONTROL18, 6, 1, 0), 212 212 }; 213 213 214 214 /* Right Mixer */ 215 215 static const struct snd_kcontrol_new es8328_right_mixer_controls[] = { 216 - SOC_DAPM_SINGLE("Left Playback Switch", ES8328_DACCONTROL19, 8, 1, 0), 217 - SOC_DAPM_SINGLE("Left Bypass Switch", ES8328_DACCONTROL19, 7, 1, 0), 218 - SOC_DAPM_SINGLE("Playback Switch", ES8328_DACCONTROL20, 8, 1, 0), 219 - SOC_DAPM_SINGLE("Right Bypass Switch", ES8328_DACCONTROL20, 7, 1, 0), 216 + SOC_DAPM_SINGLE("Left Playback Switch", ES8328_DACCONTROL19, 7, 1, 0), 217 + SOC_DAPM_SINGLE("Left Bypass Switch", ES8328_DACCONTROL19, 6, 1, 0), 218 + SOC_DAPM_SINGLE("Playback Switch", ES8328_DACCONTROL20, 7, 1, 0), 219 + SOC_DAPM_SINGLE("Right Bypass Switch", ES8328_DACCONTROL20, 6, 1, 0), 220 220 }; 221 221 222 222 static const char * const es8328_pga_sel[] = {
+31
sound/soc/codecs/nau8825.c
··· 1271 1271 return 0; 1272 1272 } 1273 1273 1274 + #ifdef CONFIG_PM_SLEEP 1275 + static int nau8825_suspend(struct device *dev) 1276 + { 1277 + struct i2c_client *client = to_i2c_client(dev); 1278 + struct nau8825 *nau8825 = dev_get_drvdata(dev); 1279 + 1280 + disable_irq(client->irq); 1281 + regcache_cache_only(nau8825->regmap, true); 1282 + regcache_mark_dirty(nau8825->regmap); 1283 + 1284 + return 0; 1285 + } 1286 + 1287 + static int nau8825_resume(struct device *dev) 1288 + { 1289 + struct i2c_client *client = to_i2c_client(dev); 1290 + struct nau8825 *nau8825 = dev_get_drvdata(dev); 1291 + 1292 + regcache_cache_only(nau8825->regmap, false); 1293 + regcache_sync(nau8825->regmap); 1294 + enable_irq(client->irq); 1295 + 1296 + return 0; 1297 + } 1298 + #endif 1299 + 1300 + static const struct dev_pm_ops nau8825_pm = { 1301 + SET_SYSTEM_SLEEP_PM_OPS(nau8825_suspend, nau8825_resume) 1302 + }; 1303 + 1274 1304 static const struct i2c_device_id nau8825_i2c_ids[] = { 1275 1305 { "nau8825", 0 }, 1276 1306 { } ··· 1327 1297 .name = "nau8825", 1328 1298 .of_match_table = of_match_ptr(nau8825_of_ids), 1329 1299 .acpi_match_table = ACPI_PTR(nau8825_acpi_match), 1300 + .pm = &nau8825_pm, 1330 1301 }, 1331 1302 .probe = nau8825_i2c_probe, 1332 1303 .remove = nau8825_i2c_remove,
+4 -2
sound/soc/codecs/rl6231.c
··· 80 80 } 81 81 82 82 for (i = 0; i < ARRAY_SIZE(div); i++) { 83 - /* find divider that gives DMIC frequency below 3MHz */ 84 - if (3000000 * div[i] >= rate) 83 + if ((div[i] % 3) == 0) 84 + continue; 85 + /* find divider that gives DMIC frequency below 3.072MHz */ 86 + if (3072000 * div[i] >= rate) 85 87 return i; 86 88 } 87 89
+57 -4
sound/soc/codecs/rt5645.c
··· 245 245 struct snd_soc_jack *hp_jack; 246 246 struct snd_soc_jack *mic_jack; 247 247 struct snd_soc_jack *btn_jack; 248 - struct delayed_work jack_detect_work; 248 + struct delayed_work jack_detect_work, rcclock_work; 249 249 struct regulator_bulk_data supplies[ARRAY_SIZE(rt5645_supply_names)]; 250 250 struct rt5645_eq_param_s *eq_param; 251 251 ··· 565 565 .put = rt5645_hweq_put \ 566 566 } 567 567 568 + static int rt5645_spk_put_volsw(struct snd_kcontrol *kcontrol, 569 + struct snd_ctl_elem_value *ucontrol) 570 + { 571 + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 572 + struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); 573 + int ret; 574 + 575 + cancel_delayed_work_sync(&rt5645->rcclock_work); 576 + 577 + regmap_update_bits(rt5645->regmap, RT5645_MICBIAS, 578 + RT5645_PWR_CLK25M_MASK, RT5645_PWR_CLK25M_PU); 579 + 580 + ret = snd_soc_put_volsw(kcontrol, ucontrol); 581 + 582 + queue_delayed_work(system_power_efficient_wq, &rt5645->rcclock_work, 583 + msecs_to_jiffies(200)); 584 + 585 + return ret; 586 + } 587 + 568 588 static const struct snd_kcontrol_new rt5645_snd_controls[] = { 569 589 /* Speaker Output Volume */ 570 590 SOC_DOUBLE("Speaker Channel Switch", RT5645_SPK_VOL, 571 591 RT5645_VOL_L_SFT, RT5645_VOL_R_SFT, 1, 1), 572 - SOC_DOUBLE_TLV("Speaker Playback Volume", RT5645_SPK_VOL, 573 - RT5645_L_VOL_SFT, RT5645_R_VOL_SFT, 39, 1, out_vol_tlv), 592 + SOC_DOUBLE_EXT_TLV("Speaker Playback Volume", RT5645_SPK_VOL, 593 + RT5645_L_VOL_SFT, RT5645_R_VOL_SFT, 39, 1, snd_soc_get_volsw, 594 + rt5645_spk_put_volsw, out_vol_tlv), 574 595 575 596 /* ClassD modulator Speaker Gain Ratio */ 576 597 SOC_SINGLE_TLV("Speaker ClassD Playback Volume", RT5645_SPO_CLSD_RATIO, ··· 1519 1498 regmap_write(rt5645->regmap, RT5645_PR_BASE + 1520 1499 RT5645_MAMP_INT_REG2, 0xfc00); 1521 1500 snd_soc_write(codec, RT5645_DEPOP_M2, 0x1140); 1522 - msleep(40); 1501 + msleep(70); 1523 1502 rt5645->hp_on = true; 1524 1503 } else { 1525 1504 /* depop parameters */ ··· 3143 3122 SND_JACK_BTN_2 | SND_JACK_BTN_3); 3144 3123 } 3145 3124 3125 + static void rt5645_rcclock_work(struct work_struct *work) 3126 + { 3127 + struct rt5645_priv *rt5645 = 3128 + container_of(work, struct rt5645_priv, rcclock_work.work); 3129 + 3130 + regmap_update_bits(rt5645->regmap, RT5645_MICBIAS, 3131 + RT5645_PWR_CLK25M_MASK, RT5645_PWR_CLK25M_PD); 3132 + } 3133 + 3146 3134 static irqreturn_t rt5645_irq(int irq, void *data) 3147 3135 { 3148 3136 struct rt5645_priv *rt5645 = data; ··· 3376 3346 .callback = strago_quirk_cb, 3377 3347 .matches = { 3378 3348 DMI_MATCH(DMI_PRODUCT_NAME, "Reks"), 3349 + }, 3350 + }, 3351 + { 3352 + .ident = "Google Edgar", 3353 + .callback = strago_quirk_cb, 3354 + .matches = { 3355 + DMI_MATCH(DMI_PRODUCT_NAME, "Edgar"), 3356 + }, 3357 + }, 3358 + { 3359 + .ident = "Google Wizpig", 3360 + .callback = strago_quirk_cb, 3361 + .matches = { 3362 + DMI_MATCH(DMI_PRODUCT_NAME, "Wizpig"), 3363 + }, 3364 + }, 3365 + { 3366 + .ident = "Google Terra", 3367 + .callback = strago_quirk_cb, 3368 + .matches = { 3369 + DMI_MATCH(DMI_PRODUCT_NAME, "Terra"), 3379 3370 }, 3380 3371 }, 3381 3372 { } ··· 3638 3587 } 3639 3588 3640 3589 INIT_DELAYED_WORK(&rt5645->jack_detect_work, rt5645_jack_detect_work); 3590 + INIT_DELAYED_WORK(&rt5645->rcclock_work, rt5645_rcclock_work); 3641 3591 3642 3592 if (rt5645->i2c->irq) { 3643 3593 ret = request_threaded_irq(rt5645->i2c->irq, NULL, rt5645_irq, ··· 3673 3621 free_irq(i2c->irq, rt5645); 3674 3622 3675 3623 cancel_delayed_work_sync(&rt5645->jack_detect_work); 3624 + cancel_delayed_work_sync(&rt5645->rcclock_work); 3676 3625 3677 3626 snd_soc_unregister_codec(&i2c->dev); 3678 3627 regulator_bulk_disable(ARRAY_SIZE(rt5645->supplies), rt5645->supplies);
+6 -6
sound/soc/codecs/rt5670.h
··· 973 973 #define RT5670_SCLK_SRC_MCLK (0x0 << 14) 974 974 #define RT5670_SCLK_SRC_PLL1 (0x1 << 14) 975 975 #define RT5670_SCLK_SRC_RCCLK (0x2 << 14) /* 15MHz */ 976 - #define RT5670_PLL1_SRC_MASK (0x3 << 12) 977 - #define RT5670_PLL1_SRC_SFT 12 978 - #define RT5670_PLL1_SRC_MCLK (0x0 << 12) 979 - #define RT5670_PLL1_SRC_BCLK1 (0x1 << 12) 980 - #define RT5670_PLL1_SRC_BCLK2 (0x2 << 12) 981 - #define RT5670_PLL1_SRC_BCLK3 (0x3 << 12) 976 + #define RT5670_PLL1_SRC_MASK (0x7 << 11) 977 + #define RT5670_PLL1_SRC_SFT 11 978 + #define RT5670_PLL1_SRC_MCLK (0x0 << 11) 979 + #define RT5670_PLL1_SRC_BCLK1 (0x1 << 11) 980 + #define RT5670_PLL1_SRC_BCLK2 (0x2 << 11) 981 + #define RT5670_PLL1_SRC_BCLK3 (0x3 << 11) 982 982 #define RT5670_PLL1_PD_MASK (0x1 << 3) 983 983 #define RT5670_PLL1_PD_SFT 3 984 984 #define RT5670_PLL1_PD_1 (0x0 << 3)
+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)),
+1 -1
sound/soc/codecs/wm8960.c
··· 229 229 SOC_DOUBLE_R("Capture Volume ZC Switch", WM8960_LINVOL, WM8960_RINVOL, 230 230 6, 1, 0), 231 231 SOC_DOUBLE_R("Capture Switch", WM8960_LINVOL, WM8960_RINVOL, 232 - 7, 1, 0), 232 + 7, 1, 1), 233 233 234 234 SOC_SINGLE_TLV("Right Input Boost Mixer RINPUT3 Volume", 235 235 WM8960_INBMIX1, 4, 7, 0, lineinboost_tlv),
+2 -2
sound/soc/codecs/wm8962.c
··· 365 365 { 16924, 0x0059 }, /* R16924 - HDBASS_PG_1 */ 366 366 { 16925, 0x999A }, /* R16925 - HDBASS_PG_0 */ 367 367 368 - { 17048, 0x0083 }, /* R17408 - HPF_C_1 */ 369 - { 17049, 0x98AD }, /* R17409 - HPF_C_0 */ 368 + { 17408, 0x0083 }, /* R17408 - HPF_C_1 */ 369 + { 17409, 0x98AD }, /* R17409 - HPF_C_0 */ 370 370 371 371 { 17920, 0x007F }, /* R17920 - ADCL_RETUNE_C1_1 */ 372 372 { 17921, 0xFFFF }, /* R17921 - ADCL_RETUNE_C1_0 */
+10 -2
sound/soc/davinci/davinci-mcasp.c
··· 681 681 } 682 682 683 683 mcasp->tdm_slots = slots; 684 - mcasp->tdm_mask[SNDRV_PCM_STREAM_PLAYBACK] = rx_mask; 685 - mcasp->tdm_mask[SNDRV_PCM_STREAM_CAPTURE] = tx_mask; 684 + mcasp->tdm_mask[SNDRV_PCM_STREAM_PLAYBACK] = tx_mask; 685 + mcasp->tdm_mask[SNDRV_PCM_STREAM_CAPTURE] = rx_mask; 686 686 mcasp->slot_width = slot_width; 687 687 688 688 return davinci_mcasp_set_ch_constraints(mcasp); ··· 908 908 mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, busel | RXORD); 909 909 mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, 910 910 FSRMOD(total_slots), FSRMOD(0x1FF)); 911 + /* 912 + * If McASP is set to be TX/RX synchronous and the playback is 913 + * not running already we need to configure the TX slots in 914 + * order to have correct FSX on the bus 915 + */ 916 + if (mcasp_is_synchronous(mcasp) && !mcasp->channels) 917 + mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, 918 + FSXMOD(total_slots), FSXMOD(0x1FF)); 911 919 } 912 920 913 921 return 0;
+2
sound/soc/fsl/Kconfig
··· 283 283 config SND_SOC_FSL_ASOC_CARD 284 284 tristate "Generic ASoC Sound Card with ASRC support" 285 285 depends on OF && I2C 286 + # enforce SND_SOC_FSL_ASOC_CARD=m if SND_AC97_CODEC=m: 287 + depends on SND_AC97_CODEC || SND_AC97_CODEC=n 286 288 select SND_SOC_IMX_AUDMUX 287 289 select SND_SOC_IMX_PCM_DMA 288 290 select SND_SOC_FSL_ESAI
+2 -1
sound/soc/fsl/fsl_sai.c
··· 454 454 * Rx sync with Tx clocks: Clear SYNC for Tx, set it for Rx. 455 455 * Tx sync with Rx clocks: Clear SYNC for Rx, set it for Tx. 456 456 */ 457 - regmap_update_bits(sai->regmap, FSL_SAI_TCR2, FSL_SAI_CR2_SYNC, 0); 457 + regmap_update_bits(sai->regmap, FSL_SAI_TCR2, FSL_SAI_CR2_SYNC, 458 + sai->synchronous[TX] ? FSL_SAI_CR2_SYNC : 0); 458 459 regmap_update_bits(sai->regmap, FSL_SAI_RCR2, FSL_SAI_CR2_SYNC, 459 460 sai->synchronous[RX] ? FSL_SAI_CR2_SYNC : 0); 460 461
+1 -1
sound/soc/intel/Kconfig
··· 144 144 145 145 config SND_SOC_INTEL_SKL_RT286_MACH 146 146 tristate "ASoC Audio driver for SKL with RT286 I2S mode" 147 - depends on X86 && ACPI 147 + depends on X86 && ACPI && I2C 148 148 select SND_SOC_INTEL_SST 149 149 select SND_SOC_INTEL_SKYLAKE 150 150 select SND_SOC_RT286
+1
sound/soc/intel/skylake/skl-topology.c
··· 1240 1240 */ 1241 1241 ret = snd_soc_tplg_component_load(&platform->component, 1242 1242 &skl_tplg_ops, fw, 0); 1243 + release_firmware(fw); 1243 1244 if (ret < 0) { 1244 1245 dev_err(bus->dev, "tplg component load failed%d\n", ret); 1245 1246 return -EINVAL;
+1 -1
sound/soc/rockchip/rockchip_spdif.c
··· 280 280 int ret; 281 281 282 282 match = of_match_node(rk_spdif_match, np); 283 - if ((int) match->data == RK_SPDIF_RK3288) { 283 + if (match->data == (void *)RK_SPDIF_RK3288) { 284 284 struct regmap *grf; 285 285 286 286 grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
+3 -3
sound/soc/rockchip/rockchip_spdif.h
··· 28 28 #define SPDIF_CFGR_VDW(x) (x << SPDIF_CFGR_VDW_SHIFT) 29 29 #define SDPIF_CFGR_VDW_MASK (0xf << SPDIF_CFGR_VDW_SHIFT) 30 30 31 - #define SPDIF_CFGR_VDW_16 SPDIF_CFGR_VDW(0x00) 32 - #define SPDIF_CFGR_VDW_20 SPDIF_CFGR_VDW(0x01) 33 - #define SPDIF_CFGR_VDW_24 SPDIF_CFGR_VDW(0x10) 31 + #define SPDIF_CFGR_VDW_16 SPDIF_CFGR_VDW(0x0) 32 + #define SPDIF_CFGR_VDW_20 SPDIF_CFGR_VDW(0x1) 33 + #define SPDIF_CFGR_VDW_24 SPDIF_CFGR_VDW(0x2) 34 34 35 35 /* 36 36 * DMACR
+1 -1
sound/soc/sh/rcar/gen.c
··· 235 235 RSND_GEN_S_REG(SCU_SYS_STATUS0, 0x1c8), 236 236 RSND_GEN_S_REG(SCU_SYS_INT_EN0, 0x1cc), 237 237 RSND_GEN_S_REG(SCU_SYS_STATUS1, 0x1d0), 238 - RSND_GEN_S_REG(SCU_SYS_INT_EN1, 0x1c4), 238 + RSND_GEN_S_REG(SCU_SYS_INT_EN1, 0x1d4), 239 239 RSND_GEN_M_REG(SRC_SWRSR, 0x200, 0x40), 240 240 RSND_GEN_M_REG(SRC_SRCIR, 0x204, 0x40), 241 241 RSND_GEN_M_REG(SRC_ADINR, 0x214, 0x40),
+7
sound/soc/sh/rcar/src.c
··· 923 923 struct snd_soc_pcm_runtime *rtd) 924 924 { 925 925 struct rsnd_dai *rdai = rsnd_io_to_rdai(io); 926 + struct rsnd_mod *dvc = rsnd_io_to_mod_dvc(io); 926 927 struct rsnd_src *src = rsnd_mod_to_src(mod); 927 928 int ret; 928 929 ··· 935 934 * SRC sync convert needs clock master 936 935 */ 937 936 if (!rsnd_rdai_is_clk_master(rdai)) 937 + return 0; 938 + 939 + /* 940 + * SRC In doesn't work if DVC was enabled 941 + */ 942 + if (dvc && !rsnd_io_is_play(io)) 938 943 return 0; 939 944 940 945 /*
+3 -3
sound/soc/soc-core.c
··· 795 795 796 796 dev_dbg(card->dev, "ASoC: resume work completed\n"); 797 797 798 - /* userspace can access us now we are back as we were before */ 799 - snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D0); 800 - 801 798 /* Recheck all endpoints too, their state is affected by suspend */ 802 799 dapm_mark_endpoints_dirty(card); 803 800 snd_soc_dapm_sync(&card->dapm); 801 + 802 + /* userspace can access us now we are back as we were before */ 803 + snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D0); 804 804 } 805 805 806 806 /* powers up audio subsystem after a suspend */
+7
sound/soc/soc-dapm.c
··· 2293 2293 kfree(w); 2294 2294 } 2295 2295 2296 + void snd_soc_dapm_reset_cache(struct snd_soc_dapm_context *dapm) 2297 + { 2298 + dapm->path_sink_cache.widget = NULL; 2299 + dapm->path_source_cache.widget = NULL; 2300 + } 2301 + 2296 2302 /* free all dapm widgets and resources */ 2297 2303 static void dapm_free_widgets(struct snd_soc_dapm_context *dapm) 2298 2304 { ··· 2309 2303 continue; 2310 2304 snd_soc_dapm_free_widget(w); 2311 2305 } 2306 + snd_soc_dapm_reset_cache(dapm); 2312 2307 } 2313 2308 2314 2309 static struct snd_soc_dapm_widget *dapm_find_widget(
+1 -1
sound/soc/soc-ops.c
··· 404 404 /** 405 405 * snd_soc_put_volsw_sx - double mixer set callback 406 406 * @kcontrol: mixer control 407 - * @uinfo: control element information 407 + * @ucontrol: control element information 408 408 * 409 409 * Callback to set the value of a double mixer control that spans 2 registers. 410 410 *
+2 -1
sound/soc/soc-topology.c
··· 531 531 /* TLV bytes controls need standard kcontrol info handler, 532 532 * TLV callback and extended put/get handlers. 533 533 */ 534 - k->info = snd_soc_bytes_info; 534 + k->info = snd_soc_bytes_info_ext; 535 535 k->tlv.c = snd_soc_bytes_tlv_callback; 536 536 537 537 ext_ops = tplg->bytes_ext_ops; ··· 1805 1805 snd_soc_tplg_widget_remove(w); 1806 1806 snd_soc_dapm_free_widget(w); 1807 1807 } 1808 + snd_soc_dapm_reset_cache(dapm); 1808 1809 } 1809 1810 EXPORT_SYMBOL_GPL(snd_soc_tplg_widget_remove_all); 1810 1811
+6 -3
sound/soc/sti/uniperif_player.c
··· 669 669 { 670 670 struct sti_uniperiph_data *priv = snd_soc_dai_get_drvdata(dai); 671 671 struct uniperif *player = priv->dai_data.uni; 672 + player->substream = substream; 672 673 673 674 player->clk_adj = 0; 674 675 ··· 951 950 if (player->state != UNIPERIF_STATE_STOPPED) 952 951 /* Stop the player */ 953 952 uni_player_stop(player); 953 + 954 + player->substream = NULL; 954 955 } 955 956 956 957 static int uni_player_parse_dt_clk_glue(struct platform_device *pdev, ··· 992 989 if (!info) 993 990 return -ENOMEM; 994 991 995 - if (of_property_read_u32(pnode, "version", &player->ver) || 992 + if (of_property_read_u32(pnode, "st,version", &player->ver) || 996 993 player->ver == SND_ST_UNIPERIF_VERSION_UNKNOWN) { 997 994 dev_err(dev, "Unknown uniperipheral version "); 998 995 return -EINVAL; ··· 1001 998 if (player->ver >= SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0) 1002 999 info->underflow_enabled = 1; 1003 1000 1004 - if (of_property_read_u32(pnode, "uniperiph-id", &info->id)) { 1001 + if (of_property_read_u32(pnode, "st,uniperiph-id", &info->id)) { 1005 1002 dev_err(dev, "uniperipheral id not defined"); 1006 1003 return -EINVAL; 1007 1004 } 1008 1005 1009 1006 /* Read the device mode property */ 1010 - if (of_property_read_string(pnode, "mode", &mode)) { 1007 + if (of_property_read_string(pnode, "st,mode", &mode)) { 1011 1008 dev_err(dev, "uniperipheral mode not defined"); 1012 1009 return -EINVAL; 1013 1010 }
+1 -2
sound/soc/sti/uniperif_reader.c
··· 316 316 if (!info) 317 317 return -ENOMEM; 318 318 319 - if (of_property_read_u32(node, "version", &reader->ver) || 319 + if (of_property_read_u32(node, "st,version", &reader->ver) || 320 320 reader->ver == SND_ST_UNIPERIF_VERSION_UNKNOWN) { 321 321 dev_err(&pdev->dev, "Unknown uniperipheral version "); 322 322 return -EINVAL; ··· 346 346 reader->hw = &uni_reader_pcm_hw; 347 347 reader->dai_ops = &uni_reader_dai_ops; 348 348 349 - dev_err(reader->dev, "%s: enter\n", __func__); 350 349 ret = uni_reader_parse_dt(pdev, reader); 351 350 if (ret < 0) { 352 351 dev_err(reader->dev, "Failed to parse DeviceTree");
+14 -13
sound/soc/sunxi/sun4i-codec.c
··· 2 2 * Copyright 2014 Emilio López <emilio@elopez.com.ar> 3 3 * Copyright 2014 Jon Smirl <jonsmirl@gmail.com> 4 4 * Copyright 2015 Maxime Ripard <maxime.ripard@free-electrons.com> 5 + * Copyright 2015 Adam Sampson <ats@offog.org> 5 6 * 6 7 * Based on the Allwinner SDK driver, released under the GPL. 7 8 * ··· 405 404 static DECLARE_TLV_DB_SCALE(sun4i_codec_pa_volume_scale, -6300, 100, 1); 406 405 407 406 static const struct snd_kcontrol_new sun4i_codec_widgets[] = { 408 - SOC_SINGLE_TLV("PA Volume", SUN4I_CODEC_DAC_ACTL, 407 + SOC_SINGLE_TLV("Power Amplifier Volume", SUN4I_CODEC_DAC_ACTL, 409 408 SUN4I_CODEC_DAC_ACTL_PA_VOL, 0x3F, 0, 410 409 sun4i_codec_pa_volume_scale), 411 410 }; ··· 453 452 SND_SOC_DAPM_SUPPLY("Mixer Enable", SUN4I_CODEC_DAC_ACTL, 454 453 SUN4I_CODEC_DAC_ACTL_MIXEN, 0, NULL, 0), 455 454 456 - /* Pre-Amplifier */ 457 - SND_SOC_DAPM_MIXER("Pre-Amplifier", SUN4I_CODEC_ADC_ACTL, 455 + /* Power Amplifier */ 456 + SND_SOC_DAPM_MIXER("Power Amplifier", SUN4I_CODEC_ADC_ACTL, 458 457 SUN4I_CODEC_ADC_ACTL_PA_EN, 0, 459 458 sun4i_codec_pa_mixer_controls, 460 459 ARRAY_SIZE(sun4i_codec_pa_mixer_controls)), 461 - SND_SOC_DAPM_SWITCH("Pre-Amplifier Mute", SND_SOC_NOPM, 0, 0, 460 + SND_SOC_DAPM_SWITCH("Power Amplifier Mute", SND_SOC_NOPM, 0, 0, 462 461 &sun4i_codec_pa_mute), 463 462 464 463 SND_SOC_DAPM_OUTPUT("HP Right"), ··· 481 480 { "Left Mixer", NULL, "Mixer Enable" }, 482 481 { "Left Mixer", "Left DAC Playback Switch", "Left DAC" }, 483 482 484 - /* Pre-Amplifier Mixer Routes */ 485 - { "Pre-Amplifier", "Mixer Playback Switch", "Left Mixer" }, 486 - { "Pre-Amplifier", "Mixer Playback Switch", "Right Mixer" }, 487 - { "Pre-Amplifier", "DAC Playback Switch", "Left DAC" }, 488 - { "Pre-Amplifier", "DAC Playback Switch", "Right DAC" }, 483 + /* Power Amplifier Routes */ 484 + { "Power Amplifier", "Mixer Playback Switch", "Left Mixer" }, 485 + { "Power Amplifier", "Mixer Playback Switch", "Right Mixer" }, 486 + { "Power Amplifier", "DAC Playback Switch", "Left DAC" }, 487 + { "Power Amplifier", "DAC Playback Switch", "Right DAC" }, 489 488 490 - /* PA -> HP path */ 491 - { "Pre-Amplifier Mute", "Switch", "Pre-Amplifier" }, 492 - { "HP Right", NULL, "Pre-Amplifier Mute" }, 493 - { "HP Left", NULL, "Pre-Amplifier Mute" }, 489 + /* Headphone Output Routes */ 490 + { "Power Amplifier Mute", "Switch", "Power Amplifier" }, 491 + { "HP Right", NULL, "Power Amplifier Mute" }, 492 + { "HP Left", NULL, "Power Amplifier Mute" }, 494 493 }; 495 494 496 495 static struct snd_soc_codec_driver sun4i_codec_codec = {