aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
Diffstat (limited to 'sound')
-rw-r--r--sound/pci/hda/patch_cirrus.c50
-rw-r--r--sound/pci/hda/patch_realtek.c1
2 files changed, 51 insertions, 0 deletions
diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c
index ee1aea7296eb..6adfc5625281 100644
--- a/sound/pci/hda/patch_cirrus.c
+++ b/sound/pci/hda/patch_cirrus.c
@@ -968,6 +968,53 @@ static struct hda_verb cs_coef_init_verbs[] = {
968 {} /* terminator */ 968 {} /* terminator */
969}; 969};
970 970
971/* Errata: CS4207 rev C0/C1/C2 Silicon
972 *
973 * http://www.cirrus.com/en/pubs/errata/ER880C3.pdf
974 *
975 * 6. At high temperature (TA > +85°C), the digital supply current (IVD)
976 * may be excessive (up to an additional 200 μA), which is most easily
977 * observed while the part is being held in reset (RESET# active low).
978 *
979 * Root Cause: At initial powerup of the device, the logic that drives
980 * the clock and write enable to the S/PDIF SRC RAMs is not properly
981 * initialized.
982 * Certain random patterns will cause a steady leakage current in those
983 * RAM cells. The issue will resolve once the SRCs are used (turned on).
984 *
985 * Workaround: The following verb sequence briefly turns on the S/PDIF SRC
986 * blocks, which will alleviate the issue.
987 */
988
989static struct hda_verb cs_errata_init_verbs[] = {
990 {0x01, AC_VERB_SET_POWER_STATE, 0x00}, /* AFG: D0 */
991 {0x11, AC_VERB_SET_PROC_STATE, 0x01}, /* VPW: processing on */
992
993 {0x11, AC_VERB_SET_COEF_INDEX, 0x0008},
994 {0x11, AC_VERB_SET_PROC_COEF, 0x9999},
995 {0x11, AC_VERB_SET_COEF_INDEX, 0x0017},
996 {0x11, AC_VERB_SET_PROC_COEF, 0xa412},
997 {0x11, AC_VERB_SET_COEF_INDEX, 0x0001},
998 {0x11, AC_VERB_SET_PROC_COEF, 0x0009},
999
1000 {0x07, AC_VERB_SET_POWER_STATE, 0x00}, /* S/PDIF Rx: D0 */
1001 {0x08, AC_VERB_SET_POWER_STATE, 0x00}, /* S/PDIF Tx: D0 */
1002
1003 {0x11, AC_VERB_SET_COEF_INDEX, 0x0017},
1004 {0x11, AC_VERB_SET_PROC_COEF, 0x2412},
1005 {0x11, AC_VERB_SET_COEF_INDEX, 0x0008},
1006 {0x11, AC_VERB_SET_PROC_COEF, 0x0000},
1007 {0x11, AC_VERB_SET_COEF_INDEX, 0x0001},
1008 {0x11, AC_VERB_SET_PROC_COEF, 0x0008},
1009 {0x11, AC_VERB_SET_PROC_STATE, 0x00},
1010
1011 {0x07, AC_VERB_SET_POWER_STATE, 0x03}, /* S/PDIF Rx: D3 */
1012 {0x08, AC_VERB_SET_POWER_STATE, 0x03}, /* S/PDIF Tx: D3 */
1013 /*{0x01, AC_VERB_SET_POWER_STATE, 0x03},*/ /* AFG: D3 This is already handled */
1014
1015 {} /* terminator */
1016};
1017
971/* SPDIF setup */ 1018/* SPDIF setup */
972static void init_digital(struct hda_codec *codec) 1019static void init_digital(struct hda_codec *codec)
973{ 1020{
@@ -987,6 +1034,9 @@ static int cs_init(struct hda_codec *codec)
987{ 1034{
988 struct cs_spec *spec = codec->spec; 1035 struct cs_spec *spec = codec->spec;
989 1036
1037 /* init_verb sequence for C0/C1/C2 errata*/
1038 snd_hda_sequence_write(codec, cs_errata_init_verbs);
1039
990 snd_hda_sequence_write(codec, cs_coef_init_verbs); 1040 snd_hda_sequence_write(codec, cs_coef_init_verbs);
991 1041
992 if (spec->gpio_mask) { 1042 if (spec->gpio_mask) {
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 3e0f4816aed7..81e4b1d957c5 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -5336,6 +5336,7 @@ static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids,
5336 5336
5337static struct snd_pci_quirk beep_white_list[] = { 5337static struct snd_pci_quirk beep_white_list[] = {
5338 SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1), 5338 SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
5339 SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
5339 SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1), 5340 SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
5340 {} 5341 {}
5341}; 5342};