ALSA: opl3sa2 - Fix NULL dereference when suspending snd_opl3sa2
authorKrzysztof Helt <krzysztof.h1@wp.pl>
Mon, 16 Mar 2009 20:32:25 +0000 (21:32 +0100)
committerTakashi Iwai <tiwai@suse.de>
Tue, 17 Mar 2009 08:27:47 +0000 (09:27 +0100)
Fix the OOPS during a opl3sa2 card suspend
and resume if the driver is loaded but the card
is not found.

Signed-off-by: Krzysztof Helt <krzysztof.h1@wp.pl>
Cc: <stable@kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/isa/opl3sa2.c

index 58c972b2af03821dd1647dba0494cbd15f17a945..b848d10018641c3e280d024da3ed8521fde90be8 100644 (file)
@@ -550,21 +550,27 @@ static int __devinit snd_opl3sa2_mixer(struct snd_card *card)
 #ifdef CONFIG_PM
 static int snd_opl3sa2_suspend(struct snd_card *card, pm_message_t state)
 {
-       struct snd_opl3sa2 *chip = card->private_data;
+       if (card) {
+               struct snd_opl3sa2 *chip = card->private_data;
 
-       snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
-       chip->wss->suspend(chip->wss);
-       /* power down */
-       snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D3);
+               snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+               chip->wss->suspend(chip->wss);
+               /* power down */
+               snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D3);
+       }
 
        return 0;
 }
 
 static int snd_opl3sa2_resume(struct snd_card *card)
 {
-       struct snd_opl3sa2 *chip = card->private_data;
+       struct snd_opl3sa2 *chip;
        int i;
 
+       if (!card)
+               return 0;
+
+       chip = card->private_data;
        /* power up */
        snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D0);