Message ID | s5hoal69jw2.wl-tiwai@suse.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, May 27, 2015 at 10:26 AM, Takashi Iwai <tiwai@suse.de> wrote: > At Wed, 27 May 2015 15:31:02 +0200, > Takashi Iwai wrote: >> >> At Wed, 27 May 2015 09:23:17 -0400, >> Adam Goode wrote: >> > >> > Hi, >> > >> > I have this card: >> > >> > 05:00.0 Multimedia audio controller: C-Media Electronics Inc >> > CMI8738/CMI8768 PCI Audio (rev 10) >> > Subsystem: C-Media Electronics Inc CMI8738/C3DX PCI Audio Device >> > Flags: bus master, stepping, medium devsel, latency 32, IRQ 19 >> > I/O ports at d000 [size=256] >> > Capabilities: [c0] Power Management version 2 >> > Kernel driver in use: snd_cmipci >> > Kernel modules: snd_cmipci >> > >> > >> > When I suspend/resume, the sound from the OPL3 is permanently >> > distorted. It sounds like not all of the operators are active. I can >> > fix this by doing a full PCI remove/rescan cycle: the driver correctly >> > initializes the card at this time. >> > >> > Any ideas before I peek into the code? >> >> OPL3 stuff lacks of PM code completely. Maybe calling snd_opl3_init() >> again should enable the minimal stuff. > > That said, a patch like below. The whole synth setup still needs to > be reset, I suppose. > > > Takashi > > --- > diff --git a/sound/pci/cmipci.c b/sound/pci/cmipci.c > index 6cf464d9043d..f03fd5f2e043 100644 > --- a/sound/pci/cmipci.c > +++ b/sound/pci/cmipci.c > @@ -498,6 +498,8 @@ struct cmipci { > /* external MIDI */ > struct snd_rawmidi *rmidi; > > + struct snd_opl3 *opl3; > + > #ifdef SUPPORT_JOYSTICK > struct gameport *gameport; > #endif > @@ -3005,6 +3007,7 @@ static int snd_cmipci_create_fm(struct cmipci *cm, long fm_port) > dev_err(cm->card->dev, "cannot create OPL3 hwdep\n"); > return err; > } > + cm->opl3 = opl3; > return 0; > > disable_fm: > @@ -3386,6 +3389,8 @@ static int snd_cmipci_resume(struct device *dev) > for (i = 0; i < ARRAY_SIZE(saved_mixers); i++) > snd_cmipci_mixer_write(cm, saved_mixers[i], cm->saved_mixers[i]); > > + if (cm->opl3) > + snd_opl3_init(cm->opl3); > snd_power_change_state(card, SNDRV_CTL_POWER_D0); > return 0; > } Yes, it is better with this patch. I still get the same distorted sounds after resume, but a subsequent sbiload will restore the instruments correctly. Before the patch, sbiload had no effect and I had to remove/rescan the card.. Ideally, suspend/resume would restore the patches so that sbiload would not be necessary. But this is exactly as urgent as it seems. :) Thanks, Adam
diff --git a/sound/pci/cmipci.c b/sound/pci/cmipci.c index 6cf464d9043d..f03fd5f2e043 100644 --- a/sound/pci/cmipci.c +++ b/sound/pci/cmipci.c @@ -498,6 +498,8 @@ struct cmipci { /* external MIDI */ struct snd_rawmidi *rmidi; + struct snd_opl3 *opl3; + #ifdef SUPPORT_JOYSTICK struct gameport *gameport; #endif @@ -3005,6 +3007,7 @@ static int snd_cmipci_create_fm(struct cmipci *cm, long fm_port) dev_err(cm->card->dev, "cannot create OPL3 hwdep\n"); return err; } + cm->opl3 = opl3; return 0; disable_fm: @@ -3386,6 +3389,8 @@ static int snd_cmipci_resume(struct device *dev) for (i = 0; i < ARRAY_SIZE(saved_mixers); i++) snd_cmipci_mixer_write(cm, saved_mixers[i], cm->saved_mixers[i]); + if (cm->opl3) + snd_opl3_init(cm->opl3); snd_power_change_state(card, SNDRV_CTL_POWER_D0); return 0; }