Skip to content

Commit

Permalink
ALSA: hda-intel - add special 'hwio' model to bypass initialization
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
perexg committed Mar 26, 2010
1 parent 306ff3e commit cd508fe
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 10 deletions.
5 changes: 5 additions & 0 deletions Documentation/sound/alsa/HD-Audio.txt
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,11 @@ generic parser regardless of the codec. Usually the codec-specific
parser is much better than the generic parser (as now). Thus this
option is more about the debugging purpose.

Another special meaning has 'model=hwio'. For this model, 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.

Speaker and Headphone Output
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Expand Down
10 changes: 8 additions & 2 deletions sound/pci/hda/hda_codec.c
Original file line number Diff line number Diff line change
Expand Up @@ -609,11 +609,15 @@ int /*__devinit*/ snd_hda_bus_new(struct snd_card *card,
}
EXPORT_SYMBOL_HDA(snd_hda_bus_new);

#define is_hwio_config(codec) \
(codec->modelname && !strcmp(codec->modelname, "hwio"))
#ifdef CONFIG_SND_HDA_GENERIC
#define is_generic_config(codec) \
(codec->modelname && !strcmp(codec->modelname, "generic"))
((codec->modelname && !strcmp(codec->modelname, "generic")) || \
is_hwio_config(codec))
#else
#define is_generic_config(codec) 0
#define is_generic_config(codec) \
is_hwio_config(codec)
#endif

#ifdef MODULE
Expand Down Expand Up @@ -1113,6 +1117,8 @@ int snd_hda_codec_configure(struct hda_codec *codec)
}

if (is_generic_config(codec)) {
if (is_hwio_config(codec))
goto patched;
err = snd_hda_parse_generic_codec(codec);
goto patched;
}
Expand Down
20 changes: 12 additions & 8 deletions sound/pci/hda/hda_intel.c
Original file line number Diff line number Diff line change
Expand Up @@ -858,10 +858,13 @@ static void azx_power_notify(struct hda_bus *bus);
#endif

/* reset codec link */
static int azx_reset(struct azx *chip)
static int azx_reset(struct azx *chip, int full_reset)
{
int count;

if (!full_reset)
goto __skip;

/* clear STATESTS */
azx_writeb(chip, STATESTS, STATESTS_INT_MASK);

Expand All @@ -887,6 +890,7 @@ static int azx_reset(struct azx *chip)
/* Brent Chartrand said to wait >= 540us for codecs to initialize */
msleep(1);

__skip:
/* check to see if controller is ready */
if (!azx_readb(chip, GCTL)) {
snd_printd(SFX "azx_reset: controller not ready!\n");
Expand Down Expand Up @@ -998,13 +1002,13 @@ static void azx_stream_stop(struct azx *chip, struct azx_dev *azx_dev)
/*
* reset and start the controller registers
*/
static void azx_init_chip(struct azx *chip)
static void azx_init_chip(struct azx *chip, int full_reset)
{
if (chip->initialized)
return;

/* reset controller */
azx_reset(chip);
azx_reset(chip, full_reset);

/* initialize interrupts */
azx_int_clear(chip);
Expand Down Expand Up @@ -1348,7 +1352,7 @@ static void azx_bus_reset(struct hda_bus *bus)

bus->in_reset = 1;
azx_stop_chip(chip);
azx_init_chip(chip);
azx_init_chip(chip, 1);
#ifdef CONFIG_PM
if (chip->initialized) {
int i;
Expand Down Expand Up @@ -1422,7 +1426,7 @@ static int __devinit azx_codec_create(struct azx *chip, const char *model)
* get back to the sanity state.
*/
azx_stop_chip(chip);
azx_init_chip(chip);
azx_init_chip(chip, 1);
}
}
}
Expand Down Expand Up @@ -2112,7 +2116,7 @@ static void azx_power_notify(struct hda_bus *bus)
}
}
if (power_on)
azx_init_chip(chip);
azx_init_chip(chip, 1);
else if (chip->running && power_save_controller &&
!bus->power_keep_link_on)
azx_stop_chip(chip);
Expand Down Expand Up @@ -2182,7 +2186,7 @@ static int azx_resume(struct pci_dev *pci)
azx_init_pci(chip);

if (snd_hda_codecs_inuse(chip->bus))
azx_init_chip(chip);
azx_init_chip(chip, 1);

snd_hda_resume(chip->bus);
snd_power_change_state(card, SNDRV_CTL_POWER_D0);
Expand Down Expand Up @@ -2573,7 +2577,7 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,

/* initialize chip */
azx_init_pci(chip);
azx_init_chip(chip);
azx_init_chip(chip, model[dev] == NULL || strcmp(model[dev], "hwio"));

/* codec detection */
if (!chip->codec_mask) {
Expand Down

0 comments on commit cd508fe

Please sign in to comment.