aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda/patch_analog.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/pci/hda/patch_analog.c')
-rw-r--r--sound/pci/hda/patch_analog.c68
1 files changed, 25 insertions, 43 deletions
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
index cc2e944cc59f..f20ddd85db22 100644
--- a/sound/pci/hda/patch_analog.c
+++ b/sound/pci/hda/patch_analog.c
@@ -318,31 +318,11 @@ static void ad198x_free(struct hda_codec *codec)
318 kfree(codec->spec); 318 kfree(codec->spec);
319} 319}
320 320
321#ifdef CONFIG_PM
322static int ad198x_resume(struct hda_codec *codec)
323{
324 struct ad198x_spec *spec = codec->spec;
325 int i;
326
327 codec->patch_ops.init(codec);
328 for (i = 0; i < spec->num_mixers; i++)
329 snd_hda_resume_ctls(codec, spec->mixers[i]);
330 if (spec->multiout.dig_out_nid)
331 snd_hda_resume_spdif_out(codec);
332 if (spec->dig_in_nid)
333 snd_hda_resume_spdif_in(codec);
334 return 0;
335}
336#endif
337
338static struct hda_codec_ops ad198x_patch_ops = { 321static struct hda_codec_ops ad198x_patch_ops = {
339 .build_controls = ad198x_build_controls, 322 .build_controls = ad198x_build_controls,
340 .build_pcms = ad198x_build_pcms, 323 .build_pcms = ad198x_build_pcms,
341 .init = ad198x_init, 324 .init = ad198x_init,
342 .free = ad198x_free, 325 .free = ad198x_free,
343#ifdef CONFIG_PM
344 .resume = ad198x_resume,
345#endif
346}; 326};
347 327
348 328
@@ -376,12 +356,12 @@ static int ad198x_eapd_put(struct snd_kcontrol *kcontrol,
376 eapd = ucontrol->value.integer.value[0]; 356 eapd = ucontrol->value.integer.value[0];
377 if (invert) 357 if (invert)
378 eapd = !eapd; 358 eapd = !eapd;
379 if (eapd == spec->cur_eapd && ! codec->in_resume) 359 if (eapd == spec->cur_eapd)
380 return 0; 360 return 0;
381 spec->cur_eapd = eapd; 361 spec->cur_eapd = eapd;
382 snd_hda_codec_write(codec, nid, 362 snd_hda_codec_write_cache(codec, nid,
383 0, AC_VERB_SET_EAPD_BTLENABLE, 363 0, AC_VERB_SET_EAPD_BTLENABLE,
384 eapd ? 0x02 : 0x00); 364 eapd ? 0x02 : 0x00);
385 return 1; 365 return 1;
386} 366}
387 367
@@ -882,8 +862,9 @@ static int ad1983_spdif_route_put(struct snd_kcontrol *kcontrol, struct snd_ctl_
882 862
883 if (spec->spdif_route != ucontrol->value.enumerated.item[0]) { 863 if (spec->spdif_route != ucontrol->value.enumerated.item[0]) {
884 spec->spdif_route = ucontrol->value.enumerated.item[0]; 864 spec->spdif_route = ucontrol->value.enumerated.item[0];
885 snd_hda_codec_write(codec, spec->multiout.dig_out_nid, 0, 865 snd_hda_codec_write_cache(codec, spec->multiout.dig_out_nid, 0,
886 AC_VERB_SET_CONNECT_SEL, spec->spdif_route); 866 AC_VERB_SET_CONNECT_SEL,
867 spec->spdif_route);
887 return 1; 868 return 1;
888 } 869 }
889 return 0; 870 return 0;
@@ -1824,33 +1805,34 @@ static int ad1988_spdif_playback_source_put(struct snd_kcontrol *kcontrol,
1824 AC_VERB_GET_AMP_GAIN_MUTE, 1805 AC_VERB_GET_AMP_GAIN_MUTE,
1825 AC_AMP_GET_INPUT); 1806 AC_AMP_GET_INPUT);
1826 change = sel & 0x80; 1807 change = sel & 0x80;
1827 if (change || codec->in_resume) { 1808 if (change) {
1828 snd_hda_codec_write(codec, 0x1d, 0, 1809 snd_hda_codec_write_cache(codec, 0x1d, 0,
1829 AC_VERB_SET_AMP_GAIN_MUTE, 1810 AC_VERB_SET_AMP_GAIN_MUTE,
1830 AMP_IN_UNMUTE(0)); 1811 AMP_IN_UNMUTE(0));
1831 snd_hda_codec_write(codec, 0x1d, 0, 1812 snd_hda_codec_write_cache(codec, 0x1d, 0,
1832 AC_VERB_SET_AMP_GAIN_MUTE, 1813 AC_VERB_SET_AMP_GAIN_MUTE,
1833 AMP_IN_MUTE(1)); 1814 AMP_IN_MUTE(1));
1834 } 1815 }
1835 } else { 1816 } else {
1836 sel = snd_hda_codec_read(codec, 0x1d, 0, 1817 sel = snd_hda_codec_read(codec, 0x1d, 0,
1837 AC_VERB_GET_AMP_GAIN_MUTE, 1818 AC_VERB_GET_AMP_GAIN_MUTE,
1838 AC_AMP_GET_INPUT | 0x01); 1819 AC_AMP_GET_INPUT | 0x01);
1839 change = sel & 0x80; 1820 change = sel & 0x80;
1840 if (change || codec->in_resume) { 1821 if (change) {
1841 snd_hda_codec_write(codec, 0x1d, 0, 1822 snd_hda_codec_write_cache(codec, 0x1d, 0,
1842 AC_VERB_SET_AMP_GAIN_MUTE, 1823 AC_VERB_SET_AMP_GAIN_MUTE,
1843 AMP_IN_MUTE(0)); 1824 AMP_IN_MUTE(0));
1844 snd_hda_codec_write(codec, 0x1d, 0, 1825 snd_hda_codec_write_cache(codec, 0x1d, 0,
1845 AC_VERB_SET_AMP_GAIN_MUTE, 1826 AC_VERB_SET_AMP_GAIN_MUTE,
1846 AMP_IN_UNMUTE(1)); 1827 AMP_IN_UNMUTE(1));
1847 } 1828 }
1848 sel = snd_hda_codec_read(codec, 0x0b, 0, 1829 sel = snd_hda_codec_read(codec, 0x0b, 0,
1849 AC_VERB_GET_CONNECT_SEL, 0) + 1; 1830 AC_VERB_GET_CONNECT_SEL, 0) + 1;
1850 change |= sel != val; 1831 change |= sel != val;
1851 if (change || codec->in_resume) 1832 if (change)
1852 snd_hda_codec_write(codec, 0x0b, 0, 1833 snd_hda_codec_write_cache(codec, 0x0b, 0,
1853 AC_VERB_SET_CONNECT_SEL, val - 1); 1834 AC_VERB_SET_CONNECT_SEL,
1835 val - 1);
1854 } 1836 }
1855 return change; 1837 return change;
1856} 1838}