| From dde332b660cf0bc2baaba678b52768a0fb6e6da2 Mon Sep 17 00:00:00 2001 |
| From: Krzysztof Helt <krzysztof.h1@wp.pl> |
| Date: Mon, 16 Mar 2009 21:32:25 +0100 |
| Subject: ALSA: opl3sa2 - Fix NULL dereference when suspending snd_opl3sa2 |
| |
| From: Krzysztof Helt <krzysztof.h1@wp.pl> |
| |
| commit dde332b660cf0bc2baaba678b52768a0fb6e6da2 upstream. |
| |
| 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> |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| sound/isa/opl3sa2.c | 18 ++++++++++++------ |
| 1 file changed, 12 insertions(+), 6 deletions(-) |
| |
| --- a/sound/isa/opl3sa2.c |
| +++ b/sound/isa/opl3sa2.c |
| @@ -550,21 +550,27 @@ static int __devinit snd_opl3sa2_mixer(s |
| #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); |
| |