diff mbox

OPL3 on cmipci doesn't survive suspend/resume

Message ID s5hoal69jw2.wl-tiwai@suse.de (mailing list archive)
State New, archived
Headers show

Commit Message

Takashi Iwai May 27, 2015, 2:26 p.m. UTC
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

---

Comments

Adam Goode June 10, 2015, 4:02 a.m. UTC | #1
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 mbox

Patch

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;
 }