ALSA: hda - Add probe_only option
authorTakashi Iwai <tiwai@suse.de>
Fri, 19 Dec 2008 14:19:11 +0000 (15:19 +0100)
committerTakashi Iwai <tiwai@suse.de>
Fri, 19 Dec 2008 14:19:11 +0000 (15:19 +0100)
Added probe_only module option to hd-audio driver.
This option specifies whether the driver creates and initializes the
codec-parser after probing.  When this option is set, the driver skips
the codec parsing and initialization but gives you proc and other
accesses.  It's useful to see the initial codec state for debugging.

The default of this value is off, so the default behavior is as same
as before.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Documentation/sound/alsa/ALSA-Configuration.txt
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.h
sound/pci/hda/hda_intel.c

index a4f3a22caba3541d99e652f91b547643cb9a5d3f..ee45454c50befd8045da82079fa90dd2be317949 100644 (file)
@@ -757,6 +757,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
     model      - force the model name
     position_fix - Fix DMA pointer (0 = auto, 1 = use LPIB, 2 = POSBUF)
     probe_mask  - Bitmask to probe codecs (default = -1, meaning all slots)
+    probe_only - Only probing and no codec initialization (default=off);
+                 Useful to check the initial codec status for debugging
     bdl_pos_adj        - Specifies the DMA IRQ timing delay in samples.
                Passing -1 will make the driver to choose the appropriate
                value based on the controller chip.
index 625fe5984dd6b9852b8a515890b2ee9219891263..e16cf63821aeab8e46edf1921d5ae094f7f55ff9 100644 (file)
@@ -709,7 +709,7 @@ static void snd_hda_codec_free(struct hda_codec *codec)
  * Returns 0 if successful, or a negative error code.
  */
 int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr,
-                               struct hda_codec **codecp)
+                                   int do_init, struct hda_codec **codecp)
 {
        struct hda_codec *codec;
        char component[31];
@@ -793,10 +793,12 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr
        if (bus->modelname)
                codec->modelname = kstrdup(bus->modelname, GFP_KERNEL);
 
-       err = snd_hda_codec_configure(codec);
-       if (err < 0) {
-               snd_hda_codec_free(codec);
-               return err;
+       if (do_init) {
+               err = snd_hda_codec_configure(codec);
+               if (err < 0) {
+                       snd_hda_codec_free(codec);
+                       return err;
+               }
        }
        snd_hda_codec_proc_new(codec);
 
index 5587d416229f9ff54230f7e10f5ac0f3b1d97e77..729fc7642d7f50f0d01f558ba584ca17b2c6137a 100644 (file)
@@ -811,7 +811,7 @@ enum {
 int snd_hda_bus_new(struct snd_card *card, const struct hda_bus_template *temp,
                    struct hda_bus **busp);
 int snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr,
-                     struct hda_codec **codecp);
+                     int do_init, struct hda_codec **codecp);
 
 /*
  * low level functions
index a26ae8c4cf70d5fa40c32c12b6501de44761800d..6613b6bef9eb847c4d9caa527ce3430040bb5169 100644 (file)
@@ -58,6 +58,7 @@ static char *model[SNDRV_CARDS];
 static int position_fix[SNDRV_CARDS];
 static int bdl_pos_adj[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
 static int probe_mask[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
+static int probe_only[SNDRV_CARDS];
 static int single_cmd;
 static int enable_msi;
 
@@ -76,6 +77,8 @@ module_param_array(bdl_pos_adj, int, NULL, 0644);
 MODULE_PARM_DESC(bdl_pos_adj, "BDL position adjustment offset.");
 module_param_array(probe_mask, int, NULL, 0444);
 MODULE_PARM_DESC(probe_mask, "Bitmask to probe codecs (default = -1).");
+module_param_array(probe_only, bool, NULL, 0444);
+MODULE_PARM_DESC(probe_only, "Only probing and no codec initialization.");
 module_param(single_cmd, bool, 0444);
 MODULE_PARM_DESC(single_cmd, "Use single command to communicate with codecs "
                 "(for debugging only).");
@@ -1224,7 +1227,8 @@ static unsigned int azx_max_codecs[AZX_NUM_DRIVERS] __devinitdata = {
 };
 
 static int __devinit azx_codec_create(struct azx *chip, const char *model,
-                                     unsigned int codec_probe_mask)
+                                     unsigned int codec_probe_mask,
+                                     int no_init)
 {
        struct hda_bus_template bus_temp;
        int c, codecs, err;
@@ -1282,7 +1286,7 @@ static int __devinit azx_codec_create(struct azx *chip, const char *model,
        for (c = 0; c < max_slots; c++) {
                if ((chip->codec_mask & (1 << c)) & codec_probe_mask) {
                        struct hda_codec *codec;
-                       err = snd_hda_codec_new(chip->bus, c, &codec);
+                       err = snd_hda_codec_new(chip->bus, c, !no_init, &codec);
                        if (err < 0)
                                continue;
                        codecs++;
@@ -2340,7 +2344,8 @@ static int __devinit azx_probe(struct pci_dev *pci,
        card->private_data = chip;
 
        /* create codec instances */
-       err = azx_codec_create(chip, model[dev], probe_mask[dev]);
+       err = azx_codec_create(chip, model[dev], probe_mask[dev],
+                              probe_only[dev]);
        if (err < 0)
                goto out_free;