aboutsummaryrefslogtreecommitdiffstats
path: root/sound
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 /sound
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>
Diffstat (limited to 'sound')
-rw-r--r--sound/pci/hda/hda_codec.c10
-rw-r--r--sound/pci/hda/hda_intel.c20
2 files changed, 20 insertions, 10 deletions
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
index 0e76ac2b2ace..cf6280bdaa19 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 8b2915631cc3..8d477613bccf 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) {