ALSA: hda - Fix complete_all() timing in deferred probes
authorTakashi Iwai <tiwai@suse.de>
Mon, 2 Dec 2013 10:12:28 +0000 (11:12 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 2 Dec 2013 12:23:40 +0000 (13:23 +0100)
When the probe of snd-hda-intel driver is deferred due to f/w loading
or the nested module loading, complete_all() should be also delayed
until the initialization really finished.  Otherwise, vga-switcheroo
client would start switching before the actual init is done.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_intel.c

index c6d230193da6214700e23369df0d2355c301012a..27aa14007cbd400ebcb1f21e5e4036d58e778430 100644 (file)
@@ -3876,7 +3876,8 @@ static int azx_probe(struct pci_dev *pci,
        }
 
        dev++;
-       complete_all(&chip->probe_wait);
+       if (chip->disabled)
+               complete_all(&chip->probe_wait);
        return 0;
 
 out_free:
@@ -3953,10 +3954,10 @@ static int azx_probe_continue(struct azx *chip)
        if ((chip->driver_caps & AZX_DCAPS_PM_RUNTIME) || chip->use_vga_switcheroo)
                pm_runtime_put_noidle(&pci->dev);
 
-       return 0;
-
 out_free:
-       chip->init_failed = 1;
+       if (err < 0)
+               chip->init_failed = 1;
+       complete_all(&chip->probe_wait);
        return err;
 }