diff options
author | Jaroslav Kysela <perex@perex.cz> | 2010-03-26 05:28:46 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2010-03-26 05:37:39 -0400 |
commit | cd508fe58b07499403e806b558c7f15c90442292 (patch) | |
tree | 5ec4c40b7c7b84595c65f5f9dda96e1a01eacc2b /sound | |
parent | 306ff3e473a970f88680e8355c0900fcab0357e2 (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.c | 10 | ||||
-rw-r--r-- | sound/pci/hda/hda_intel.c | 20 |
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 | } |
610 | EXPORT_SYMBOL_HDA(snd_hda_bus_new); | 610 | EXPORT_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 */ |
861 | static int azx_reset(struct azx *chip) | 861 | static 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 | */ |
1001 | static void azx_init_chip(struct azx *chip) | 1005 | static 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) { |