Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 378e869f authored by Takashi Iwai's avatar Takashi Iwai
Browse files

Merge branch 'fix/misc' into for-linus

parents d2a764dd 1d4efa66
Loading
Loading
Loading
Loading
+20 −8
Original line number Original line Diff line number Diff line
@@ -29,6 +29,8 @@ extern char snd_opl3_regmap[MAX_OPL2_VOICES][4];


extern int use_internal_drums;
extern int use_internal_drums;


static void snd_opl3_note_off_unsafe(void *p, int note, int vel,
				     struct snd_midi_channel *chan);
/*
/*
 * The next table looks magical, but it certainly is not. Its values have
 * The next table looks magical, but it certainly is not. Its values have
 * been calculated as table[i]=8*log(i/64)/log(2) with an obvious exception
 * been calculated as table[i]=8*log(i/64)/log(2) with an obvious exception
@@ -242,16 +244,20 @@ void snd_opl3_timer_func(unsigned long data)
	int again = 0;
	int again = 0;
	int i;
	int i;


	spin_lock_irqsave(&opl3->sys_timer_lock, flags);
	spin_lock_irqsave(&opl3->voice_lock, flags);
	for (i = 0; i < opl3->max_voices; i++) {
	for (i = 0; i < opl3->max_voices; i++) {
		struct snd_opl3_voice *vp = &opl3->voices[i];
		struct snd_opl3_voice *vp = &opl3->voices[i];
		if (vp->state > 0 && vp->note_off_check) {
		if (vp->state > 0 && vp->note_off_check) {
			if (vp->note_off == jiffies)
			if (vp->note_off == jiffies)
				snd_opl3_note_off(opl3, vp->note, 0, vp->chan);
				snd_opl3_note_off_unsafe(opl3, vp->note, 0,
							 vp->chan);
			else
			else
				again++;
				again++;
		}
		}
	}
	}
	spin_unlock_irqrestore(&opl3->voice_lock, flags);

	spin_lock_irqsave(&opl3->sys_timer_lock, flags);
	if (again) {
	if (again) {
		opl3->tlist.expires = jiffies + 1;	/* invoke again */
		opl3->tlist.expires = jiffies + 1;	/* invoke again */
		add_timer(&opl3->tlist);
		add_timer(&opl3->tlist);
@@ -658,15 +664,14 @@ static void snd_opl3_kill_voice(struct snd_opl3 *opl3, int voice)
/*
/*
 * Release a note in response to a midi note off.
 * Release a note in response to a midi note off.
 */
 */
void snd_opl3_note_off(void *p, int note, int vel, struct snd_midi_channel *chan)
static void snd_opl3_note_off_unsafe(void *p, int note, int vel,
				     struct snd_midi_channel *chan)
{
{
  	struct snd_opl3 *opl3;
  	struct snd_opl3 *opl3;


	int voice;
	int voice;
	struct snd_opl3_voice *vp;
	struct snd_opl3_voice *vp;


	unsigned long flags;

	opl3 = p;
	opl3 = p;


#ifdef DEBUG_MIDI
#ifdef DEBUG_MIDI
@@ -674,12 +679,9 @@ void snd_opl3_note_off(void *p, int note, int vel, struct snd_midi_channel *chan
		   chan->number, chan->midi_program, note);
		   chan->number, chan->midi_program, note);
#endif
#endif


	spin_lock_irqsave(&opl3->voice_lock, flags);

	if (opl3->synth_mode == SNDRV_OPL3_MODE_SEQ) {
	if (opl3->synth_mode == SNDRV_OPL3_MODE_SEQ) {
		if (chan->drum_channel && use_internal_drums) {
		if (chan->drum_channel && use_internal_drums) {
			snd_opl3_drum_switch(opl3, note, vel, 0, chan);
			snd_opl3_drum_switch(opl3, note, vel, 0, chan);
			spin_unlock_irqrestore(&opl3->voice_lock, flags);
			return;
			return;
		}
		}
		/* this loop will hopefully kill all extra voices, because
		/* this loop will hopefully kill all extra voices, because
@@ -697,6 +699,16 @@ void snd_opl3_note_off(void *p, int note, int vel, struct snd_midi_channel *chan
			snd_opl3_kill_voice(opl3, voice);
			snd_opl3_kill_voice(opl3, voice);
		}
		}
	}
	}
}

void snd_opl3_note_off(void *p, int note, int vel,
		       struct snd_midi_channel *chan)
{
	struct snd_opl3 *opl3 = p;
	unsigned long flags;

	spin_lock_irqsave(&opl3->voice_lock, flags);
	snd_opl3_note_off_unsafe(p, note, vel, chan);
	spin_unlock_irqrestore(&opl3->voice_lock, flags);
	spin_unlock_irqrestore(&opl3->voice_lock, flags);
}
}


+1 −1
Original line number Original line Diff line number Diff line
@@ -2259,7 +2259,7 @@ static int snd_ice1712_pro_peak_get(struct snd_kcontrol *kcontrol,
}
}


static struct snd_kcontrol_new snd_ice1712_mixer_pro_peak __devinitdata = {
static struct snd_kcontrol_new snd_ice1712_mixer_pro_peak __devinitdata = {
	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
	.iface = SNDRV_CTL_ELEM_IFACE_PCM,
	.name = "Multi Track Peak",
	.name = "Multi Track Peak",
	.access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
	.access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
	.info = snd_ice1712_pro_peak_info,
	.info = snd_ice1712_pro_peak_info,
+3 −3
Original line number Original line Diff line number Diff line
@@ -1294,7 +1294,7 @@ static int __devinit snd_vt1724_pcm_spdif(struct snd_ice1712 *ice, int device)


	snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
	snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
					      snd_dma_pci_data(ice->pci),
					      snd_dma_pci_data(ice->pci),
					      64*1024, 64*1024);
					      256*1024, 256*1024);


	ice->pcm = pcm;
	ice->pcm = pcm;


@@ -1408,7 +1408,7 @@ static int __devinit snd_vt1724_pcm_indep(struct snd_ice1712 *ice, int device)


	snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
	snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
					      snd_dma_pci_data(ice->pci),
					      snd_dma_pci_data(ice->pci),
					      64*1024, 64*1024);
					      256*1024, 256*1024);


	ice->pcm_ds = pcm;
	ice->pcm_ds = pcm;


@@ -2110,7 +2110,7 @@ static int snd_vt1724_pro_peak_get(struct snd_kcontrol *kcontrol,
}
}


static struct snd_kcontrol_new snd_vt1724_mixer_pro_peak __devinitdata = {
static struct snd_kcontrol_new snd_vt1724_mixer_pro_peak __devinitdata = {
	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
	.iface = SNDRV_CTL_ELEM_IFACE_PCM,
	.name = "Multi Track Peak",
	.name = "Multi Track Peak",
	.access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
	.access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
	.info = snd_vt1724_pro_peak_info,
	.info = snd_vt1724_pro_peak_info,
+18 −9
Original line number Original line Diff line number Diff line
@@ -1626,7 +1626,7 @@ static int snd_via8233_dxs_volume_get(struct snd_kcontrol *kcontrol,
				      struct snd_ctl_elem_value *ucontrol)
				      struct snd_ctl_elem_value *ucontrol)
{
{
	struct via82xx *chip = snd_kcontrol_chip(kcontrol);
	struct via82xx *chip = snd_kcontrol_chip(kcontrol);
	unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id);
	unsigned int idx = kcontrol->id.subdevice;


	ucontrol->value.integer.value[0] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][0];
	ucontrol->value.integer.value[0] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][0];
	ucontrol->value.integer.value[1] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][1];
	ucontrol->value.integer.value[1] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][1];
@@ -1646,7 +1646,7 @@ static int snd_via8233_dxs_volume_put(struct snd_kcontrol *kcontrol,
				      struct snd_ctl_elem_value *ucontrol)
				      struct snd_ctl_elem_value *ucontrol)
{
{
	struct via82xx *chip = snd_kcontrol_chip(kcontrol);
	struct via82xx *chip = snd_kcontrol_chip(kcontrol);
	unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id);
	unsigned int idx = kcontrol->id.subdevice;
	unsigned long port = chip->port + 0x10 * idx;
	unsigned long port = chip->port + 0x10 * idx;
	unsigned char val;
	unsigned char val;
	int i, change = 0;
	int i, change = 0;
@@ -1705,11 +1705,12 @@ static struct snd_kcontrol_new snd_via8233_pcmdxs_volume_control __devinitdata =
};
};


static struct snd_kcontrol_new snd_via8233_dxs_volume_control __devinitdata = {
static struct snd_kcontrol_new snd_via8233_dxs_volume_control __devinitdata = {
	.name = "VIA DXS Playback Volume",
	.iface = SNDRV_CTL_ELEM_IFACE_PCM,
	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
	.device = 0,
	/* .subdevice set later */
	.name = "PCM Playback Volume",
	.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
	.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
		   SNDRV_CTL_ELEM_ACCESS_TLV_READ),
		   SNDRV_CTL_ELEM_ACCESS_TLV_READ),
	.count = 4,
	.info = snd_via8233_dxs_volume_info,
	.info = snd_via8233_dxs_volume_info,
	.get = snd_via8233_dxs_volume_get,
	.get = snd_via8233_dxs_volume_get,
	.put = snd_via8233_dxs_volume_put,
	.put = snd_via8233_dxs_volume_put,
@@ -1936,12 +1937,20 @@ static int __devinit snd_via8233_init_misc(struct via82xx *chip)
		}
		}
		else /* Using DXS when PCM emulation is enabled is really weird */
		else /* Using DXS when PCM emulation is enabled is really weird */
		{
		{
			/* Standalone DXS controls */
			for (i = 0; i < 4; ++i) {
			err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_dxs_volume_control, chip));
				struct snd_kcontrol *kctl;

				kctl = snd_ctl_new1(
					&snd_via8233_dxs_volume_control, chip);
				if (!kctl)
					return -ENOMEM;
				kctl->id.subdevice = i;
				err = snd_ctl_add(chip->card, kctl);
				if (err < 0)
				if (err < 0)
					return err;
					return err;
			}
			}
		}
		}
	}
	/* select spdif data slot 10/11 */
	/* select spdif data slot 10/11 */
	pci_read_config_byte(chip->pci, VIA8233_SPDIF_CTRL, &val);
	pci_read_config_byte(chip->pci, VIA8233_SPDIF_CTRL, &val);
	val = (val & ~VIA8233_SPDIF_SLOT_MASK) | VIA8233_SPDIF_SLOT_1011;
	val = (val & ~VIA8233_SPDIF_SLOT_MASK) | VIA8233_SPDIF_SLOT_1011;