aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaroslav Kysela <perex@perex.cz>2010-03-26 05:28:46 -0400
committerJaroslav Kysela <perex@perex.cz>2010-03-26 05:37:39 -0400
commitcd508fe58b07499403e806b558c7f15c90442292 (patch)
tree5ec4c40b7c7b84595c65f5f9dda96e1a01eacc2b
parent306ff3e473a970f88680e8355c0900fcab0357e2 (diff)
ALSA: hda-intel - add special 'hwio' model to bypass initialization
Using the 'model=hwio' option, the driver bypasses any codec initialization and the reset procedure for codecs is also bypassed. This mode is usefull to enable direct access using hwdep interface (using hdaverb or hda-analyzer tools) and retain codec setup from BIOS. Signed-off-by: Jaroslav Kysela <perex@perex.cz>
-rw-r--r--Documentation/sound/alsa/HD-Audio.txt5
-rw-r--r--sound/pci/hda/hda_codec.c10
-rw-r--r--sound/pci/hda/hda_intel.c20
3 files changed, 25 insertions, 10 deletions
diff --git a/Documentation/sound/alsa/HD-Audio.txt b/Documentation/sound/alsa/HD-Audio.txt
index f4dd3bf99d1..ecacf53a865 100644
--- a/Documentation/sound/alsa/HD-Audio.txt
+++ b/Documentation/sound/alsa/HD-Audio.txt
@@ -196,6 +196,11 @@ generic parser regardless of the codec. Usually the codec-specific
196parser is much better than the generic parser (as now). Thus this 196parser is much better than the generic parser (as now). Thus this
197option is more about the debugging purpose. 197option is more about the debugging purpose.
198 198
199Another special meaning has 'model=hwio'. For this model, the driver
200bypasses any codec initialization and the reset procedure for codecs
201is also bypassed. This mode is usefull to enable direct access using
202hwdep interface (using hdaverb or hda-analyzer tools) and retain
203codec setup from BIOS.
199 204
200Speaker and Headphone Output 205Speaker and Headphone Output
201~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 206~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
index 0e76ac2b2ac..cf6280bdaa1 100644
--- a/sound/pci/hda/hda_codec.c
+++ b/sound/pci/hda/hda_codec.c
@@ -609,11 +609,15 @@ int /*__devinit*/ snd_hda_bus_new(struct snd_card *card,
609} 609}
610EXPORT_SYMBOL_HDA(snd_hda_bus_new); 610EXPORT_SYMBOL_HDA(snd_hda_bus_new);
611 611
612#define is_hwio_config(codec) \
613 (codec->modelname && !strcmp(codec->modelname, "hwio"))
612#ifdef CONFIG_SND_HDA_GENERIC 614#ifdef CONFIG_SND_HDA_GENERIC
613#define is_generic_config(codec) \ 615#define is_generic_config(codec) \
614 (codec->modelname && !strcmp(codec->modelname, "generic")) 616 ((codec->modelname && !strcmp(codec->modelname, "generic")) || \
617 is_hwio_config(codec))
615#else 618#else
616#define is_generic_config(codec) 0 619#define is_generic_config(codec) \
620 is_hwio_config(codec)
617#endif 621#endif
618 622
619#ifdef MODULE 623#ifdef MODULE
@@ -1113,6 +1117,8 @@ int snd_hda_codec_configure(struct hda_codec *codec)
1113 } 1117 }
1114 1118
1115 if (is_generic_config(codec)) { 1119 if (is_generic_config(codec)) {
1120 if (is_hwio_config(codec))
1121 goto patched;
1116 err = snd_hda_parse_generic_codec(codec); 1122 err = snd_hda_parse_generic_codec(codec);
1117 goto patched; 1123 goto patched;
1118 } 1124 }
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index 8b2915631cc..8d477613bcc 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -858,10 +858,13 @@ static void azx_power_notify(struct hda_bus *bus);
858#endif 858#endif
859 859
860/* reset codec link */ 860/* reset codec link */
861static int azx_reset(struct azx *chip) 861static int azx_reset(struct azx *chip, int full_reset)
862{ 862{
863 int count; 863 int count;
864 864
865 if (!full_reset)
866 goto __skip;
867
865 /* clear STATESTS */ 868 /* clear STATESTS */
866 azx_writeb(chip, STATESTS, STATESTS_INT_MASK); 869 azx_writeb(chip, STATESTS, STATESTS_INT_MASK);
867 870
@@ -887,6 +890,7 @@ static int azx_reset(struct azx *chip)
887 /* Brent Chartrand said to wait >= 540us for codecs to initialize */ 890 /* Brent Chartrand said to wait >= 540us for codecs to initialize */
888 msleep(1); 891 msleep(1);
889 892
893 __skip:
890 /* check to see if controller is ready */ 894 /* check to see if controller is ready */
891 if (!azx_readb(chip, GCTL)) { 895 if (!azx_readb(chip, GCTL)) {
892 snd_printd(SFX "azx_reset: controller not ready!\n"); 896 snd_printd(SFX "azx_reset: controller not ready!\n");
@@ -998,13 +1002,13 @@ static void azx_stream_stop(struct azx *chip, struct azx_dev *azx_dev)
998/* 1002/*
999 * reset and start the controller registers 1003 * reset and start the controller registers
1000 */ 1004 */
1001static void azx_init_chip(struct azx *chip) 1005static void azx_init_chip(struct azx *chip, int full_reset)
1002{ 1006{
1003 if (chip->initialized) 1007 if (chip->initialized)
1004 return; 1008 return;
1005 1009
1006 /* reset controller */ 1010 /* reset controller */
1007 azx_reset(chip); 1011 azx_reset(chip, full_reset);
1008 1012
1009 /* initialize interrupts */ 1013 /* initialize interrupts */
1010 azx_int_clear(chip); 1014 azx_int_clear(chip);
@@ -1348,7 +1352,7 @@ static void azx_bus_reset(struct hda_bus *bus)
1348 1352
1349 bus->in_reset = 1; 1353 bus->in_reset = 1;
1350 azx_stop_chip(chip); 1354 azx_stop_chip(chip);
1351 azx_init_chip(chip); 1355 azx_init_chip(chip, 1);
1352#ifdef CONFIG_PM 1356#ifdef CONFIG_PM
1353 if (chip->initialized) { 1357 if (chip->initialized) {
1354 int i; 1358 int i;
@@ -1422,7 +1426,7 @@ static int __devinit azx_codec_create(struct azx *chip, const char *model)
1422 * get back to the sanity state. 1426 * get back to the sanity state.
1423 */ 1427 */
1424 azx_stop_chip(chip); 1428 azx_stop_chip(chip);
1425 azx_init_chip(chip); 1429 azx_init_chip(chip, 1);
1426 } 1430 }
1427 } 1431 }
1428 } 1432 }
@@ -2112,7 +2116,7 @@ static void azx_power_notify(struct hda_bus *bus)
2112 } 2116 }
2113 } 2117 }
2114 if (power_on) 2118 if (power_on)
2115 azx_init_chip(chip); 2119 azx_init_chip(chip, 1);
2116 else if (chip->running && power_save_controller && 2120 else if (chip->running && power_save_controller &&
2117 !bus->power_keep_link_on) 2121 !bus->power_keep_link_on)
2118 azx_stop_chip(chip); 2122 azx_stop_chip(chip);
@@ -2182,7 +2186,7 @@ static int azx_resume(struct pci_dev *pci)
2182 azx_init_pci(chip); 2186 azx_init_pci(chip);
2183 2187
2184 if (snd_hda_codecs_inuse(chip->bus)) 2188 if (snd_hda_codecs_inuse(chip->bus))
2185 azx_init_chip(chip); 2189 azx_init_chip(chip, 1);
2186 2190
2187 snd_hda_resume(chip->bus); 2191 snd_hda_resume(chip->bus);
2188 snd_power_change_state(card, SNDRV_CTL_POWER_D0); 2192 snd_power_change_state(card, SNDRV_CTL_POWER_D0);
@@ -2573,7 +2577,7 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
2573 2577
2574 /* initialize chip */ 2578 /* initialize chip */
2575 azx_init_pci(chip); 2579 azx_init_pci(chip);
2576 azx_init_chip(chip); 2580 azx_init_chip(chip, model[dev] == NULL || strcmp(model[dev], "hwio"));
2577 2581
2578 /* codec detection */ 2582 /* codec detection */
2579 if (!chip->codec_mask) { 2583 if (!chip->codec_mask) {