aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCharles Chin <Charles.Chin@idt.com>2011-11-11 02:05:28 -0500
committerTakashi Iwai <tiwai@suse.de>2011-11-11 02:05:28 -0500
commitafef2cfa0ecf45dec7e88db9fa312ee82d347111 (patch)
tree71333a5aec9b2559c13711289101b0a6a500e02c
parentd938e66003c9ccc6c0ab10fa31ee23cf27574d66 (diff)
ALSA: hda - pwr_nids cleanup for IDT codecs
Clean up and fix pwr_nids for 92HD71 / 73 / 83 family codecs; remove pwr_mapping which was incorrect. The original pwr_nids support of 92HD83xxx was incorrect and never actually worked before. Now we should have things working correctly without having to hack by DID anymore. It is also not necessary to explicitly turn on all the pins near the beginning of patch_stac92hd83xxx() now, the pins will go though initialization properly. Tested on 92HD66 / 71 / 73 / 75 / 83 / 89 / 91 demo boards. Signed-off-by: Charles Chin <Charles.Chin@idt.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--sound/pci/hda/patch_sigmatel.c33
1 files changed, 9 insertions, 24 deletions
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
index edc2b7bc177c..470f6f286e81 100644
--- a/sound/pci/hda/patch_sigmatel.c
+++ b/sound/pci/hda/patch_sigmatel.c
@@ -227,7 +227,6 @@ struct sigmatel_spec {
227 227
228 /* power management */ 228 /* power management */
229 unsigned int num_pwrs; 229 unsigned int num_pwrs;
230 const unsigned int *pwr_mapping;
231 const hda_nid_t *pwr_nids; 230 const hda_nid_t *pwr_nids;
232 const hda_nid_t *dac_list; 231 const hda_nid_t *dac_list;
233 232
@@ -374,18 +373,15 @@ static const unsigned long stac92hd73xx_capvols[] = {
374 373
375#define STAC92HD83_DAC_COUNT 3 374#define STAC92HD83_DAC_COUNT 3
376 375
377static const hda_nid_t stac92hd83xxx_pwr_nids[4] = { 376static const hda_nid_t stac92hd83xxx_pwr_nids[7] = {
378 0xa, 0xb, 0xd, 0xe, 377 0x0a, 0x0b, 0x0c, 0xd, 0x0e,
378 0x0f, 0x10
379}; 379};
380 380
381static const hda_nid_t stac92hd83xxx_slave_dig_outs[2] = { 381static const hda_nid_t stac92hd83xxx_slave_dig_outs[2] = {
382 0x1e, 0, 382 0x1e, 0,
383}; 383};
384 384
385static const unsigned int stac92hd83xxx_pwr_mapping[4] = {
386 0x03, 0x0c, 0x20, 0x40,
387};
388
389static const hda_nid_t stac92hd83xxx_dmic_nids[] = { 385static const hda_nid_t stac92hd83xxx_dmic_nids[] = {
390 0x11, 0x20, 386 0x11, 0x20,
391}; 387};
@@ -4470,8 +4466,12 @@ static int stac92xx_init(struct hda_codec *codec)
4470 stac_toggle_power_map(codec, nid, 1); 4466 stac_toggle_power_map(codec, nid, 1);
4471 continue; 4467 continue;
4472 } 4468 }
4473 if (enable_pin_detect(codec, nid, STAC_PWR_EVENT)) 4469 if (enable_pin_detect(codec, nid, STAC_PWR_EVENT)) {
4474 stac_issue_unsol_event(codec, nid); 4470 stac_issue_unsol_event(codec, nid);
4471 continue;
4472 }
4473 /* none of the above, turn the port OFF */
4474 stac_toggle_power_map(codec, nid, 0);
4475 } 4475 }
4476 4476
4477 /* sync mute LED */ 4477 /* sync mute LED */
@@ -4727,11 +4727,7 @@ static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid,
4727 if (idx >= spec->num_pwrs) 4727 if (idx >= spec->num_pwrs)
4728 return; 4728 return;
4729 4729
4730 /* several codecs have two power down bits */ 4730 idx = 1 << idx;
4731 if (spec->pwr_mapping)
4732 idx = spec->pwr_mapping[idx];
4733 else
4734 idx = 1 << idx;
4735 4731
4736 val = snd_hda_codec_read(codec, codec->afg, 0, 0x0fec, 0x0) & 0xff; 4732 val = snd_hda_codec_read(codec, codec->afg, 0, 0x0fec, 0x0) & 0xff;
4737 if (enable) 4733 if (enable)
@@ -5629,9 +5625,6 @@ static int patch_stac92hd83xxx(struct hda_codec *codec)
5629 snd_hda_codec_set_pincfg(codec, 0xf, 0x2181205e); 5625 snd_hda_codec_set_pincfg(codec, 0xf, 0x2181205e);
5630 } 5626 }
5631 5627
5632 /* reset pin power-down; Windows may leave these bits after reboot */
5633 snd_hda_codec_write_cache(codec, codec->afg, 0, 0x7EC, 0);
5634 snd_hda_codec_write_cache(codec, codec->afg, 0, 0x7ED, 0);
5635 codec->no_trigger_sense = 1; 5628 codec->no_trigger_sense = 1;
5636 codec->spec = spec; 5629 codec->spec = spec;
5637 5630
@@ -5641,7 +5634,6 @@ static int patch_stac92hd83xxx(struct hda_codec *codec)
5641 codec->slave_dig_outs = stac92hd83xxx_slave_dig_outs; 5634 codec->slave_dig_outs = stac92hd83xxx_slave_dig_outs;
5642 spec->digbeep_nid = 0x21; 5635 spec->digbeep_nid = 0x21;
5643 spec->pwr_nids = stac92hd83xxx_pwr_nids; 5636 spec->pwr_nids = stac92hd83xxx_pwr_nids;
5644 spec->pwr_mapping = stac92hd83xxx_pwr_mapping;
5645 spec->num_pwrs = ARRAY_SIZE(stac92hd83xxx_pwr_nids); 5637 spec->num_pwrs = ARRAY_SIZE(stac92hd83xxx_pwr_nids);
5646 spec->multiout.dac_nids = spec->dac_nids; 5638 spec->multiout.dac_nids = spec->dac_nids;
5647 spec->init = stac92hd83xxx_core_init; 5639 spec->init = stac92hd83xxx_core_init;
@@ -5658,9 +5650,6 @@ again:
5658 stac92xx_set_config_regs(codec, 5650 stac92xx_set_config_regs(codec,
5659 stac92hd83xxx_brd_tbl[spec->board_config]); 5651 stac92hd83xxx_brd_tbl[spec->board_config]);
5660 5652
5661 if (spec->board_config != STAC_92HD83XXX_PWR_REF)
5662 spec->num_pwrs = 0;
5663
5664 codec->patch_ops = stac92xx_patch_ops; 5653 codec->patch_ops = stac92xx_patch_ops;
5665 5654
5666 if (find_mute_led_gpio(codec, 0)) 5655 if (find_mute_led_gpio(codec, 0))
@@ -5869,8 +5858,6 @@ again:
5869 (codec->revision_id & 0xf) == 1) 5858 (codec->revision_id & 0xf) == 1)
5870 spec->stream_delay = 40; /* 40 milliseconds */ 5859 spec->stream_delay = 40; /* 40 milliseconds */
5871 5860
5872 /* no output amps */
5873 spec->num_pwrs = 0;
5874 /* disable VSW */ 5861 /* disable VSW */
5875 spec->init = stac92hd71bxx_core_init; 5862 spec->init = stac92hd71bxx_core_init;
5876 unmute_init++; 5863 unmute_init++;
@@ -5885,8 +5872,6 @@ again:
5885 if ((codec->revision_id & 0xf) == 1) 5872 if ((codec->revision_id & 0xf) == 1)
5886 spec->stream_delay = 40; /* 40 milliseconds */ 5873 spec->stream_delay = 40; /* 40 milliseconds */
5887 5874
5888 /* no output amps */
5889 spec->num_pwrs = 0;
5890 /* fallthru */ 5875 /* fallthru */
5891 default: 5876 default:
5892 spec->init = stac92hd71bxx_core_init; 5877 spec->init = stac92hd71bxx_core_init;