mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 12:21:22 -05:00
ALSA: emu10k1: Use guard() for spin locks
Clean up the code using guard() for spin locks. Merely code refactoring, and no behavior change. Signed-off-by: Takashi Iwai <tiwai@suse.de> Link: https://patch.msgid.link/20250829144342.4290-29-tiwai@suse.de
This commit is contained in:
@@ -745,12 +745,12 @@ static void emu1010_clock_event(struct snd_emu10k1 *emu)
|
||||
{
|
||||
struct snd_ctl_elem_id id;
|
||||
|
||||
spin_lock_irq(&emu->reg_lock);
|
||||
// This is the only thing that can actually happen.
|
||||
emu->emu1010.clock_source = emu->emu1010.clock_fallback;
|
||||
emu->emu1010.wclock = 1 - emu->emu1010.clock_source;
|
||||
snd_emu1010_update_clock(emu);
|
||||
spin_unlock_irq(&emu->reg_lock);
|
||||
scoped_guard(spinlock_irq, &emu->reg_lock) {
|
||||
// This is the only thing that can actually happen.
|
||||
emu->emu1010.clock_source = emu->emu1010.clock_fallback;
|
||||
emu->emu1010.wclock = 1 - emu->emu1010.clock_source;
|
||||
snd_emu1010_update_clock(emu);
|
||||
}
|
||||
snd_ctl_build_ioff(&id, emu->ctl_clock_source, 0);
|
||||
snd_ctl_notify(emu->card, SNDRV_CTL_EVENT_MASK_VALUE, &id);
|
||||
}
|
||||
|
||||
@@ -55,10 +55,9 @@ static int snd_emu10k1_synth_probe(struct device *_dev)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
spin_lock_irq(&hw->voice_lock);
|
||||
guard(spinlock_irq)(&hw->voice_lock);
|
||||
hw->synth = emux;
|
||||
hw->get_synth_voice = snd_emu10k1_synth_get_voice;
|
||||
spin_unlock_irq(&hw->voice_lock);
|
||||
|
||||
dev->driver_data = emux;
|
||||
|
||||
@@ -77,10 +76,10 @@ static int snd_emu10k1_synth_remove(struct device *_dev)
|
||||
emux = dev->driver_data;
|
||||
|
||||
hw = emux->hw;
|
||||
spin_lock_irq(&hw->voice_lock);
|
||||
hw->synth = NULL;
|
||||
hw->get_synth_voice = NULL;
|
||||
spin_unlock_irq(&hw->voice_lock);
|
||||
scoped_guard(spinlock_irq, &hw->voice_lock) {
|
||||
hw->synth = NULL;
|
||||
hw->get_synth_voice = NULL;
|
||||
}
|
||||
|
||||
snd_emux_free(emux);
|
||||
return 0;
|
||||
|
||||
@@ -440,13 +440,11 @@ int snd_emu10k1_fx8010_register_irq_handler(struct snd_emu10k1 *emu,
|
||||
void *private_data,
|
||||
struct snd_emu10k1_fx8010_irq *irq)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
irq->handler = handler;
|
||||
irq->gpr_running = gpr_running;
|
||||
irq->private_data = private_data;
|
||||
irq->next = NULL;
|
||||
spin_lock_irqsave(&emu->fx8010.irq_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->fx8010.irq_lock);
|
||||
if (emu->fx8010.irq_handlers == NULL) {
|
||||
emu->fx8010.irq_handlers = irq;
|
||||
emu->dsp_interrupt = snd_emu10k1_fx8010_interrupt;
|
||||
@@ -455,7 +453,6 @@ int snd_emu10k1_fx8010_register_irq_handler(struct snd_emu10k1 *emu,
|
||||
irq->next = emu->fx8010.irq_handlers;
|
||||
emu->fx8010.irq_handlers = irq;
|
||||
}
|
||||
spin_unlock_irqrestore(&emu->fx8010.irq_lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -463,9 +460,8 @@ int snd_emu10k1_fx8010_unregister_irq_handler(struct snd_emu10k1 *emu,
|
||||
struct snd_emu10k1_fx8010_irq *irq)
|
||||
{
|
||||
struct snd_emu10k1_fx8010_irq *tmp;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&emu->fx8010.irq_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->fx8010.irq_lock);
|
||||
tmp = emu->fx8010.irq_handlers;
|
||||
if (tmp == irq) {
|
||||
emu->fx8010.irq_handlers = tmp->next;
|
||||
@@ -479,7 +475,6 @@ int snd_emu10k1_fx8010_unregister_irq_handler(struct snd_emu10k1 *emu,
|
||||
if (tmp)
|
||||
tmp->next = tmp->next->next;
|
||||
}
|
||||
spin_unlock_irqrestore(&emu->fx8010.irq_lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1085,7 +1080,6 @@ static int snd_emu10k1_ipcm_poke(struct snd_emu10k1 *emu,
|
||||
struct snd_emu10k1_fx8010_pcm_rec *ipcm)
|
||||
{
|
||||
unsigned int i;
|
||||
int err = 0;
|
||||
struct snd_emu10k1_fx8010_pcm *pcm;
|
||||
|
||||
if (ipcm->substream >= EMU10K1_FX8010_PCM_COUNT)
|
||||
@@ -1096,19 +1090,15 @@ static int snd_emu10k1_ipcm_poke(struct snd_emu10k1 *emu,
|
||||
return -EINVAL;
|
||||
pcm = &emu->fx8010.pcm[ipcm->substream];
|
||||
guard(mutex)(&emu->fx8010.lock);
|
||||
spin_lock_irq(&emu->reg_lock);
|
||||
if (pcm->opened) {
|
||||
err = -EBUSY;
|
||||
goto __error;
|
||||
}
|
||||
guard(spinlock_irq)(&emu->reg_lock);
|
||||
if (pcm->opened)
|
||||
return -EBUSY;
|
||||
if (ipcm->channels == 0) { /* remove */
|
||||
pcm->valid = 0;
|
||||
} else {
|
||||
/* FIXME: we need to add universal code to the PCM transfer routine */
|
||||
if (ipcm->channels != 2) {
|
||||
err = -EINVAL;
|
||||
goto __error;
|
||||
}
|
||||
if (ipcm->channels != 2)
|
||||
return -EINVAL;
|
||||
pcm->valid = 1;
|
||||
pcm->opened = 0;
|
||||
pcm->channels = ipcm->channels;
|
||||
@@ -1123,16 +1113,13 @@ static int snd_emu10k1_ipcm_poke(struct snd_emu10k1 *emu,
|
||||
for (i = 0; i < pcm->channels; i++)
|
||||
pcm->etram[i] = ipcm->etram[i];
|
||||
}
|
||||
__error:
|
||||
spin_unlock_irq(&emu->reg_lock);
|
||||
return err;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int snd_emu10k1_ipcm_peek(struct snd_emu10k1 *emu,
|
||||
struct snd_emu10k1_fx8010_pcm_rec *ipcm)
|
||||
{
|
||||
unsigned int i;
|
||||
int err = 0;
|
||||
struct snd_emu10k1_fx8010_pcm *pcm;
|
||||
|
||||
if (ipcm->substream >= EMU10K1_FX8010_PCM_COUNT)
|
||||
@@ -1141,7 +1128,7 @@ static int snd_emu10k1_ipcm_peek(struct snd_emu10k1 *emu,
|
||||
EMU10K1_FX8010_PCM_COUNT);
|
||||
pcm = &emu->fx8010.pcm[ipcm->substream];
|
||||
guard(mutex)(&emu->fx8010.lock);
|
||||
spin_lock_irq(&emu->reg_lock);
|
||||
guard(spinlock_irq)(&emu->reg_lock);
|
||||
ipcm->channels = pcm->channels;
|
||||
ipcm->tram_start = pcm->tram_start;
|
||||
ipcm->buffer_size = pcm->buffer_size;
|
||||
@@ -1155,8 +1142,7 @@ static int snd_emu10k1_ipcm_peek(struct snd_emu10k1 *emu,
|
||||
ipcm->etram[i] = pcm->etram[i];
|
||||
ipcm->res1 = ipcm->res2 = 0;
|
||||
ipcm->pad = 0;
|
||||
spin_unlock_irq(&emu->reg_lock);
|
||||
return err;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define SND_EMU10K1_GPR_CONTROLS 44
|
||||
@@ -2410,9 +2396,9 @@ int snd_emu10k1_fx8010_tram_setup(struct snd_emu10k1 *emu, u32 size)
|
||||
}
|
||||
if ((emu->fx8010.etram_pages.bytes / 2) == size)
|
||||
return 0;
|
||||
spin_lock_irq(&emu->emu_lock);
|
||||
outl(HCFG_LOCKTANKCACHE_MASK | inl(emu->port + HCFG), emu->port + HCFG);
|
||||
spin_unlock_irq(&emu->emu_lock);
|
||||
scoped_guard(spinlock_irq, &emu->emu_lock) {
|
||||
outl(HCFG_LOCKTANKCACHE_MASK | inl(emu->port + HCFG), emu->port + HCFG);
|
||||
}
|
||||
snd_emu10k1_ptr_write(emu, TCB, 0, 0);
|
||||
snd_emu10k1_ptr_write(emu, TCBS, 0, TCBS_BUFFSIZE_16K);
|
||||
if (emu->fx8010.etram_pages.area != NULL) {
|
||||
@@ -2428,9 +2414,9 @@ int snd_emu10k1_fx8010_tram_setup(struct snd_emu10k1 *emu, u32 size)
|
||||
memset(emu->fx8010.etram_pages.area, 0, size * 2);
|
||||
snd_emu10k1_ptr_write(emu, TCB, 0, emu->fx8010.etram_pages.addr);
|
||||
snd_emu10k1_ptr_write(emu, TCBS, 0, size_reg);
|
||||
spin_lock_irq(&emu->emu_lock);
|
||||
outl(inl(emu->port + HCFG) & ~HCFG_LOCKTANKCACHE_MASK, emu->port + HCFG);
|
||||
spin_unlock_irq(&emu->emu_lock);
|
||||
scoped_guard(spinlock_irq, &emu->emu_lock) {
|
||||
outl(inl(emu->port + HCFG) & ~HCFG_LOCKTANKCACHE_MASK, emu->port + HCFG);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -978,29 +978,25 @@ static int snd_emu1010_clock_source_put(struct snd_kcontrol *kcontrol,
|
||||
const struct snd_emu1010_clock_info *emu_ci =
|
||||
&emu1010_clock_info[emu1010_idx(emu)];
|
||||
unsigned int val;
|
||||
int change = 0;
|
||||
|
||||
val = ucontrol->value.enumerated.item[0] ;
|
||||
if (val >= emu_ci->num)
|
||||
return -EINVAL;
|
||||
guard(snd_emu1010_fpga_lock)(emu);
|
||||
spin_lock_irq(&emu->reg_lock);
|
||||
change = (emu->emu1010.clock_source != val);
|
||||
if (change) {
|
||||
scoped_guard(spinlock_irq, &emu->reg_lock) {
|
||||
if (emu->emu1010.clock_source == val)
|
||||
return 0;
|
||||
emu->emu1010.clock_source = val;
|
||||
emu->emu1010.wclock = emu_ci->vals[val];
|
||||
snd_emu1010_update_clock(emu);
|
||||
|
||||
snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE);
|
||||
snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK, emu->emu1010.wclock);
|
||||
spin_unlock_irq(&emu->reg_lock);
|
||||
|
||||
msleep(10); // Allow DLL to settle
|
||||
snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE);
|
||||
} else {
|
||||
spin_unlock_irq(&emu->reg_lock);
|
||||
}
|
||||
return change;
|
||||
|
||||
msleep(10); // Allow DLL to settle
|
||||
snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const struct snd_kcontrol_new snd_emu1010_clock_source =
|
||||
@@ -1208,13 +1204,13 @@ static int snd_audigy_i2c_capture_source_put(struct snd_kcontrol *kcontrol,
|
||||
change = (emu->i2c_capture_source != source_id);
|
||||
if (change) {
|
||||
snd_emu10k1_i2c_write(emu, ADC_MUX, 0); /* Mute input */
|
||||
spin_lock_irq(&emu->emu_lock);
|
||||
gpio = inw(emu->port + A_IOCFG);
|
||||
if (source_id==0)
|
||||
outw(gpio | 0x4, emu->port + A_IOCFG);
|
||||
else
|
||||
outw(gpio & ~0x4, emu->port + A_IOCFG);
|
||||
spin_unlock_irq(&emu->emu_lock);
|
||||
scoped_guard(spinlock_irq, &emu->emu_lock) {
|
||||
gpio = inw(emu->port + A_IOCFG);
|
||||
if (source_id == 0)
|
||||
outw(gpio | 0x4, emu->port + A_IOCFG);
|
||||
else
|
||||
outw(gpio & ~0x4, emu->port + A_IOCFG);
|
||||
}
|
||||
|
||||
ngain = emu->i2c_capture_volume[source_id][0]; /* Left */
|
||||
ogain = emu->i2c_capture_volume[emu->i2c_capture_source][0]; /* Left */
|
||||
@@ -1375,14 +1371,13 @@ static int snd_audigy_spdif_output_rate_put(struct snd_kcontrol *kcontrol,
|
||||
}
|
||||
|
||||
|
||||
spin_lock_irq(&emu->reg_lock);
|
||||
guard(spinlock_irq)(&emu->reg_lock);
|
||||
reg = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, 0);
|
||||
tmp = reg & ~A_SPDIF_RATE_MASK;
|
||||
tmp |= val;
|
||||
change = (tmp != reg);
|
||||
if (change)
|
||||
snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, 0, tmp);
|
||||
spin_unlock_irq(&emu->reg_lock);
|
||||
return change;
|
||||
}
|
||||
|
||||
@@ -1506,7 +1501,7 @@ static int snd_emu10k1_send_routing_put(struct snd_kcontrol *kcontrol,
|
||||
int num_efx = emu->audigy ? 8 : 4;
|
||||
int mask = emu->audigy ? 0x3f : 0x0f;
|
||||
|
||||
spin_lock_irq(&emu->reg_lock);
|
||||
guard(spinlock_irq)(&emu->reg_lock);
|
||||
for (voice = 0; voice < 3; voice++)
|
||||
for (idx = 0; idx < num_efx; idx++) {
|
||||
val = ucontrol->value.integer.value[(voice * num_efx) + idx] & mask;
|
||||
@@ -1526,7 +1521,6 @@ static int snd_emu10k1_send_routing_put(struct snd_kcontrol *kcontrol,
|
||||
&mix->send_routing[0][0]);
|
||||
}
|
||||
}
|
||||
spin_unlock_irq(&emu->reg_lock);
|
||||
return change;
|
||||
}
|
||||
|
||||
@@ -1574,7 +1568,7 @@ static int snd_emu10k1_send_volume_put(struct snd_kcontrol *kcontrol,
|
||||
int change = 0, idx, val;
|
||||
int num_efx = emu->audigy ? 8 : 4;
|
||||
|
||||
spin_lock_irq(&emu->reg_lock);
|
||||
guard(spinlock_irq)(&emu->reg_lock);
|
||||
for (idx = 0; idx < 3*num_efx; idx++) {
|
||||
val = ucontrol->value.integer.value[idx] & 255;
|
||||
if (mix->send_volume[idx/num_efx][idx%num_efx] != val) {
|
||||
@@ -1593,7 +1587,6 @@ static int snd_emu10k1_send_volume_put(struct snd_kcontrol *kcontrol,
|
||||
&mix->send_volume[0][0]);
|
||||
}
|
||||
}
|
||||
spin_unlock_irq(&emu->reg_lock);
|
||||
return change;
|
||||
}
|
||||
|
||||
@@ -1638,7 +1631,7 @@ static int snd_emu10k1_attn_put(struct snd_kcontrol *kcontrol,
|
||||
&emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
|
||||
int change = 0, idx, val;
|
||||
|
||||
spin_lock_irq(&emu->reg_lock);
|
||||
guard(spinlock_irq)(&emu->reg_lock);
|
||||
for (idx = 0; idx < 3; idx++) {
|
||||
unsigned uval = ucontrol->value.integer.value[idx] & 0x1ffff;
|
||||
val = uval * 0x8000U / 0xffffU;
|
||||
@@ -1655,7 +1648,6 @@ static int snd_emu10k1_attn_put(struct snd_kcontrol *kcontrol,
|
||||
snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[0]->number, mix->attn[0]);
|
||||
}
|
||||
}
|
||||
spin_unlock_irq(&emu->reg_lock);
|
||||
return change;
|
||||
}
|
||||
|
||||
@@ -1708,7 +1700,7 @@ static int snd_emu10k1_efx_send_routing_put(struct snd_kcontrol *kcontrol,
|
||||
int num_efx = emu->audigy ? 8 : 4;
|
||||
int mask = emu->audigy ? 0x3f : 0x0f;
|
||||
|
||||
spin_lock_irq(&emu->reg_lock);
|
||||
guard(spinlock_irq)(&emu->reg_lock);
|
||||
for (idx = 0; idx < num_efx; idx++) {
|
||||
val = ucontrol->value.integer.value[idx] & mask;
|
||||
if (mix->send_routing[0][idx] != val) {
|
||||
@@ -1723,7 +1715,6 @@ static int snd_emu10k1_efx_send_routing_put(struct snd_kcontrol *kcontrol,
|
||||
&mix->send_routing[0][0]);
|
||||
}
|
||||
}
|
||||
spin_unlock_irq(&emu->reg_lock);
|
||||
return change;
|
||||
}
|
||||
|
||||
@@ -1771,7 +1762,7 @@ static int snd_emu10k1_efx_send_volume_put(struct snd_kcontrol *kcontrol,
|
||||
int change = 0, idx, val;
|
||||
int num_efx = emu->audigy ? 8 : 4;
|
||||
|
||||
spin_lock_irq(&emu->reg_lock);
|
||||
guard(spinlock_irq)(&emu->reg_lock);
|
||||
for (idx = 0; idx < num_efx; idx++) {
|
||||
val = ucontrol->value.integer.value[idx] & 255;
|
||||
if (mix->send_volume[0][idx] != val) {
|
||||
@@ -1785,7 +1776,6 @@ static int snd_emu10k1_efx_send_volume_put(struct snd_kcontrol *kcontrol,
|
||||
&mix->send_volume[0][0]);
|
||||
}
|
||||
}
|
||||
spin_unlock_irq(&emu->reg_lock);
|
||||
return change;
|
||||
}
|
||||
|
||||
@@ -1830,7 +1820,7 @@ static int snd_emu10k1_efx_attn_put(struct snd_kcontrol *kcontrol,
|
||||
int change = 0, val;
|
||||
unsigned uval;
|
||||
|
||||
spin_lock_irq(&emu->reg_lock);
|
||||
guard(spinlock_irq)(&emu->reg_lock);
|
||||
uval = ucontrol->value.integer.value[0] & 0x1ffff;
|
||||
val = uval * 0x8000U / 0xffffU;
|
||||
if (mix->attn[0] != val) {
|
||||
@@ -1842,7 +1832,6 @@ static int snd_emu10k1_efx_attn_put(struct snd_kcontrol *kcontrol,
|
||||
snd_emu10k1_ptr_write(emu, VTFT_VOLUMETARGET, mix->epcm->voices[ch]->number, mix->attn[0]);
|
||||
}
|
||||
}
|
||||
spin_unlock_irq(&emu->reg_lock);
|
||||
return change;
|
||||
}
|
||||
|
||||
@@ -1885,7 +1874,7 @@ static int snd_emu10k1_shared_spdif_put(struct snd_kcontrol *kcontrol,
|
||||
sw = ucontrol->value.integer.value[0];
|
||||
if (emu->card_capabilities->invert_shared_spdif)
|
||||
sw = !sw;
|
||||
spin_lock_irq(&emu->emu_lock);
|
||||
guard(spinlock_irq)(&emu->emu_lock);
|
||||
if ( emu->card_capabilities->i2c_adc) {
|
||||
/* Do nothing for Audigy 2 ZS Notebook */
|
||||
} else if (emu->audigy) {
|
||||
@@ -1906,7 +1895,6 @@ static int snd_emu10k1_shared_spdif_put(struct snd_kcontrol *kcontrol,
|
||||
reg |= val;
|
||||
outl(reg | val, emu->port + HCFG);
|
||||
}
|
||||
spin_unlock_irq(&emu->emu_lock);
|
||||
return change;
|
||||
}
|
||||
|
||||
|
||||
@@ -68,28 +68,28 @@ static void do_emu10k1_midi_interrupt(struct snd_emu10k1 *emu, struct snd_emu10k
|
||||
return;
|
||||
}
|
||||
|
||||
spin_lock(&midi->input_lock);
|
||||
if ((status & midi->ipr_rx) && mpu401_input_avail(emu, midi)) {
|
||||
if (!(midi->midi_mode & EMU10K1_MIDI_MODE_INPUT)) {
|
||||
mpu401_clear_rx(emu, midi);
|
||||
} else {
|
||||
byte = mpu401_read_data(emu, midi);
|
||||
if (midi->substream_input)
|
||||
snd_rawmidi_receive(midi->substream_input, &byte, 1);
|
||||
scoped_guard(spinlock, &midi->input_lock) {
|
||||
if ((status & midi->ipr_rx) && mpu401_input_avail(emu, midi)) {
|
||||
if (!(midi->midi_mode & EMU10K1_MIDI_MODE_INPUT)) {
|
||||
mpu401_clear_rx(emu, midi);
|
||||
} else {
|
||||
byte = mpu401_read_data(emu, midi);
|
||||
if (midi->substream_input)
|
||||
snd_rawmidi_receive(midi->substream_input, &byte, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
spin_unlock(&midi->input_lock);
|
||||
|
||||
spin_lock(&midi->output_lock);
|
||||
if ((status & midi->ipr_tx) && mpu401_output_ready(emu, midi)) {
|
||||
if (midi->substream_output &&
|
||||
snd_rawmidi_transmit(midi->substream_output, &byte, 1) == 1) {
|
||||
mpu401_write_data(emu, midi, byte);
|
||||
} else {
|
||||
snd_emu10k1_intr_disable(emu, midi->tx_enable);
|
||||
scoped_guard(spinlock, &midi->output_lock) {
|
||||
if ((status & midi->ipr_tx) && mpu401_output_ready(emu, midi)) {
|
||||
if (midi->substream_output &&
|
||||
snd_rawmidi_transmit(midi->substream_output, &byte, 1) == 1) {
|
||||
mpu401_write_data(emu, midi, byte);
|
||||
} else {
|
||||
snd_emu10k1_intr_disable(emu, midi->tx_enable);
|
||||
}
|
||||
}
|
||||
}
|
||||
spin_unlock(&midi->output_lock);
|
||||
}
|
||||
|
||||
static void snd_emu10k1_midi_interrupt(struct snd_emu10k1 *emu, unsigned int status)
|
||||
@@ -106,26 +106,26 @@ static int snd_emu10k1_midi_cmd(struct snd_emu10k1 * emu, struct snd_emu10k1_mid
|
||||
{
|
||||
int timeout, ok;
|
||||
|
||||
spin_lock_irq(&midi->input_lock);
|
||||
mpu401_write_data(emu, midi, 0x00);
|
||||
/* mpu401_clear_rx(emu, midi); */
|
||||
scoped_guard(spinlock_irq, &midi->input_lock) {
|
||||
mpu401_write_data(emu, midi, 0x00);
|
||||
/* mpu401_clear_rx(emu, midi); */
|
||||
|
||||
mpu401_write_cmd(emu, midi, cmd);
|
||||
if (ack) {
|
||||
ok = 0;
|
||||
timeout = 10000;
|
||||
while (!ok && timeout-- > 0) {
|
||||
if (mpu401_input_avail(emu, midi)) {
|
||||
if (mpu401_read_data(emu, midi) == MPU401_ACK)
|
||||
ok = 1;
|
||||
mpu401_write_cmd(emu, midi, cmd);
|
||||
if (ack) {
|
||||
ok = 0;
|
||||
timeout = 10000;
|
||||
while (!ok && timeout-- > 0) {
|
||||
if (mpu401_input_avail(emu, midi)) {
|
||||
if (mpu401_read_data(emu, midi) == MPU401_ACK)
|
||||
ok = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!ok && mpu401_read_data(emu, midi) == MPU401_ACK)
|
||||
if (!ok && mpu401_read_data(emu, midi) == MPU401_ACK)
|
||||
ok = 1;
|
||||
} else {
|
||||
ok = 1;
|
||||
} else {
|
||||
ok = 1;
|
||||
}
|
||||
}
|
||||
spin_unlock_irq(&midi->input_lock);
|
||||
if (!ok) {
|
||||
dev_err(emu->card->dev,
|
||||
"midi_cmd: 0x%x failed at 0x%lx (status = 0x%x, data = 0x%x)!!!\n",
|
||||
@@ -145,22 +145,17 @@ static int snd_emu10k1_midi_input_open(struct snd_rawmidi_substream *substream)
|
||||
emu = midi->emu;
|
||||
if (snd_BUG_ON(!emu))
|
||||
return -ENXIO;
|
||||
spin_lock_irq(&midi->open_lock);
|
||||
midi->midi_mode |= EMU10K1_MIDI_MODE_INPUT;
|
||||
midi->substream_input = substream;
|
||||
if (!(midi->midi_mode & EMU10K1_MIDI_MODE_OUTPUT)) {
|
||||
spin_unlock_irq(&midi->open_lock);
|
||||
if (snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 1))
|
||||
goto error_out;
|
||||
if (snd_emu10k1_midi_cmd(emu, midi, MPU401_ENTER_UART, 1))
|
||||
goto error_out;
|
||||
} else {
|
||||
spin_unlock_irq(&midi->open_lock);
|
||||
scoped_guard(spinlock_irq, &midi->open_lock) {
|
||||
midi->midi_mode |= EMU10K1_MIDI_MODE_INPUT;
|
||||
midi->substream_input = substream;
|
||||
if (midi->midi_mode & EMU10K1_MIDI_MODE_OUTPUT)
|
||||
return 0;
|
||||
}
|
||||
if (snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 1))
|
||||
return -EIO;
|
||||
if (snd_emu10k1_midi_cmd(emu, midi, MPU401_ENTER_UART, 1))
|
||||
return -EIO;
|
||||
return 0;
|
||||
|
||||
error_out:
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
static int snd_emu10k1_midi_output_open(struct snd_rawmidi_substream *substream)
|
||||
@@ -171,66 +166,53 @@ static int snd_emu10k1_midi_output_open(struct snd_rawmidi_substream *substream)
|
||||
emu = midi->emu;
|
||||
if (snd_BUG_ON(!emu))
|
||||
return -ENXIO;
|
||||
spin_lock_irq(&midi->open_lock);
|
||||
midi->midi_mode |= EMU10K1_MIDI_MODE_OUTPUT;
|
||||
midi->substream_output = substream;
|
||||
if (!(midi->midi_mode & EMU10K1_MIDI_MODE_INPUT)) {
|
||||
spin_unlock_irq(&midi->open_lock);
|
||||
if (snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 1))
|
||||
goto error_out;
|
||||
if (snd_emu10k1_midi_cmd(emu, midi, MPU401_ENTER_UART, 1))
|
||||
goto error_out;
|
||||
} else {
|
||||
spin_unlock_irq(&midi->open_lock);
|
||||
scoped_guard(spinlock_irq, &midi->open_lock) {
|
||||
midi->midi_mode |= EMU10K1_MIDI_MODE_OUTPUT;
|
||||
midi->substream_output = substream;
|
||||
if (midi->midi_mode & EMU10K1_MIDI_MODE_INPUT)
|
||||
return 0;
|
||||
}
|
||||
if (snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 1))
|
||||
return -EIO;
|
||||
if (snd_emu10k1_midi_cmd(emu, midi, MPU401_ENTER_UART, 1))
|
||||
return -EIO;
|
||||
return 0;
|
||||
|
||||
error_out:
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
static int snd_emu10k1_midi_input_close(struct snd_rawmidi_substream *substream)
|
||||
{
|
||||
struct snd_emu10k1 *emu;
|
||||
struct snd_emu10k1_midi *midi = (struct snd_emu10k1_midi *)substream->rmidi->private_data;
|
||||
int err = 0;
|
||||
|
||||
emu = midi->emu;
|
||||
if (snd_BUG_ON(!emu))
|
||||
return -ENXIO;
|
||||
spin_lock_irq(&midi->open_lock);
|
||||
snd_emu10k1_intr_disable(emu, midi->rx_enable);
|
||||
midi->midi_mode &= ~EMU10K1_MIDI_MODE_INPUT;
|
||||
midi->substream_input = NULL;
|
||||
if (!(midi->midi_mode & EMU10K1_MIDI_MODE_OUTPUT)) {
|
||||
spin_unlock_irq(&midi->open_lock);
|
||||
err = snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 0);
|
||||
} else {
|
||||
spin_unlock_irq(&midi->open_lock);
|
||||
scoped_guard(spinlock_irq, &midi->open_lock) {
|
||||
snd_emu10k1_intr_disable(emu, midi->rx_enable);
|
||||
midi->midi_mode &= ~EMU10K1_MIDI_MODE_INPUT;
|
||||
midi->substream_input = NULL;
|
||||
if (midi->midi_mode & EMU10K1_MIDI_MODE_OUTPUT)
|
||||
return 0;
|
||||
}
|
||||
return err;
|
||||
return snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 0);
|
||||
}
|
||||
|
||||
static int snd_emu10k1_midi_output_close(struct snd_rawmidi_substream *substream)
|
||||
{
|
||||
struct snd_emu10k1 *emu;
|
||||
struct snd_emu10k1_midi *midi = (struct snd_emu10k1_midi *)substream->rmidi->private_data;
|
||||
int err = 0;
|
||||
|
||||
emu = midi->emu;
|
||||
if (snd_BUG_ON(!emu))
|
||||
return -ENXIO;
|
||||
spin_lock_irq(&midi->open_lock);
|
||||
snd_emu10k1_intr_disable(emu, midi->tx_enable);
|
||||
midi->midi_mode &= ~EMU10K1_MIDI_MODE_OUTPUT;
|
||||
midi->substream_output = NULL;
|
||||
if (!(midi->midi_mode & EMU10K1_MIDI_MODE_INPUT)) {
|
||||
spin_unlock_irq(&midi->open_lock);
|
||||
err = snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 0);
|
||||
} else {
|
||||
spin_unlock_irq(&midi->open_lock);
|
||||
scoped_guard(spinlock_irq, &midi->open_lock) {
|
||||
snd_emu10k1_intr_disable(emu, midi->tx_enable);
|
||||
midi->midi_mode &= ~EMU10K1_MIDI_MODE_OUTPUT;
|
||||
midi->substream_output = NULL;
|
||||
if (midi->midi_mode & EMU10K1_MIDI_MODE_INPUT)
|
||||
return 0;
|
||||
}
|
||||
return err;
|
||||
return snd_emu10k1_midi_cmd(emu, midi, MPU401_RESET, 0);
|
||||
}
|
||||
|
||||
static void snd_emu10k1_midi_input_trigger(struct snd_rawmidi_substream *substream, int up)
|
||||
@@ -261,22 +243,21 @@ static void snd_emu10k1_midi_output_trigger(struct snd_rawmidi_substream *substr
|
||||
unsigned char byte;
|
||||
|
||||
/* try to send some amount of bytes here before interrupts */
|
||||
spin_lock_irq(&midi->output_lock);
|
||||
while (max > 0) {
|
||||
if (mpu401_output_ready(emu, midi)) {
|
||||
if (!(midi->midi_mode & EMU10K1_MIDI_MODE_OUTPUT) ||
|
||||
snd_rawmidi_transmit(substream, &byte, 1) != 1) {
|
||||
/* no more data */
|
||||
spin_unlock_irq(&midi->output_lock);
|
||||
return;
|
||||
scoped_guard(spinlock_irq, &midi->output_lock) {
|
||||
while (max > 0) {
|
||||
if (mpu401_output_ready(emu, midi)) {
|
||||
if (!(midi->midi_mode & EMU10K1_MIDI_MODE_OUTPUT) ||
|
||||
snd_rawmidi_transmit(substream, &byte, 1) != 1) {
|
||||
/* no more data */
|
||||
return;
|
||||
}
|
||||
mpu401_write_data(emu, midi, byte);
|
||||
max--;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
mpu401_write_data(emu, midi, byte);
|
||||
max--;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
spin_unlock_irq(&midi->output_lock);
|
||||
snd_emu10k1_intr_enable(emu, midi->tx_enable);
|
||||
} else {
|
||||
snd_emu10k1_intr_disable(emu, midi->tx_enable);
|
||||
|
||||
@@ -319,7 +319,7 @@ static void snd_emu10k1_pcm_init_voices(struct snd_emu10k1 *emu,
|
||||
unsigned int end_addr,
|
||||
struct snd_emu10k1_pcm_mixer *mix)
|
||||
{
|
||||
spin_lock_irq(&emu->reg_lock);
|
||||
guard(spinlock_irq)(&emu->reg_lock);
|
||||
snd_emu10k1_pcm_init_voice(emu, evoice, w_16, stereo,
|
||||
start_addr, end_addr,
|
||||
&mix->send_routing[stereo][0],
|
||||
@@ -329,7 +329,6 @@ static void snd_emu10k1_pcm_init_voices(struct snd_emu10k1 *emu,
|
||||
start_addr, end_addr,
|
||||
&mix->send_routing[2][0],
|
||||
&mix->send_volume[2][0]);
|
||||
spin_unlock_irq(&emu->reg_lock);
|
||||
}
|
||||
|
||||
static void snd_emu10k1_pcm_init_extra_voice(struct snd_emu10k1 *emu,
|
||||
@@ -726,14 +725,13 @@ static int snd_emu10k1_playback_trigger(struct snd_pcm_substream *substream,
|
||||
struct snd_emu10k1_pcm_mixer *mix;
|
||||
bool w_16 = snd_pcm_format_width(runtime->format) == 16;
|
||||
bool stereo = runtime->channels == 2;
|
||||
int result = 0;
|
||||
|
||||
/*
|
||||
dev_dbg(emu->card->dev,
|
||||
"trigger - emu10k1 = 0x%x, cmd = %i, pointer = %i\n",
|
||||
(int)emu, cmd, substream->ops->pointer(substream))
|
||||
*/
|
||||
spin_lock(&emu->reg_lock);
|
||||
guard(spinlock)(&emu->reg_lock);
|
||||
switch (cmd) {
|
||||
case SNDRV_PCM_TRIGGER_START:
|
||||
snd_emu10k1_playback_prepare_voices(emu, epcm, w_16, stereo, 1);
|
||||
@@ -755,11 +753,9 @@ static int snd_emu10k1_playback_trigger(struct snd_pcm_substream *substream,
|
||||
snd_emu10k1_playback_mute_voices(emu, epcm->voices[0], stereo);
|
||||
break;
|
||||
default:
|
||||
result = -EINVAL;
|
||||
break;
|
||||
return -EINVAL;
|
||||
}
|
||||
spin_unlock(&emu->reg_lock);
|
||||
return result;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int snd_emu10k1_capture_trigger(struct snd_pcm_substream *substream,
|
||||
@@ -768,9 +764,8 @@ static int snd_emu10k1_capture_trigger(struct snd_pcm_substream *substream,
|
||||
struct snd_emu10k1 *emu = snd_pcm_substream_chip(substream);
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct snd_emu10k1_pcm *epcm = runtime->private_data;
|
||||
int result = 0;
|
||||
|
||||
spin_lock(&emu->reg_lock);
|
||||
guard(spinlock)(&emu->reg_lock);
|
||||
switch (cmd) {
|
||||
case SNDRV_PCM_TRIGGER_START:
|
||||
case SNDRV_PCM_TRIGGER_RESUME:
|
||||
@@ -829,10 +824,9 @@ static int snd_emu10k1_capture_trigger(struct snd_pcm_substream *substream,
|
||||
}
|
||||
break;
|
||||
default:
|
||||
result = -EINVAL;
|
||||
return -EINVAL;
|
||||
}
|
||||
spin_unlock(&emu->reg_lock);
|
||||
return result;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static snd_pcm_uframes_t snd_emu10k1_playback_pointer(struct snd_pcm_substream *substream)
|
||||
@@ -923,7 +917,7 @@ static int snd_emu10k1_efx_playback_trigger(struct snd_pcm_substream *substream,
|
||||
u64 mask;
|
||||
int result = 0;
|
||||
|
||||
spin_lock(&emu->reg_lock);
|
||||
guard(spinlock)(&emu->reg_lock);
|
||||
switch (cmd) {
|
||||
case SNDRV_PCM_TRIGGER_START:
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
||||
@@ -950,7 +944,7 @@ static int snd_emu10k1_efx_playback_trigger(struct snd_pcm_substream *substream,
|
||||
if (result == 0) {
|
||||
// The extra voice is allowed to lag a bit
|
||||
snd_emu10k1_playback_trigger_voice(emu, epcm->extra);
|
||||
goto leave;
|
||||
return 0;
|
||||
}
|
||||
|
||||
snd_emu10k1_efx_playback_stop_voices(
|
||||
@@ -972,11 +966,8 @@ static int snd_emu10k1_efx_playback_trigger(struct snd_pcm_substream *substream,
|
||||
epcm->resume_pos = snd_emu10k1_playback_pointer(substream);
|
||||
break;
|
||||
default:
|
||||
result = -EINVAL;
|
||||
break;
|
||||
return -EINVAL;
|
||||
}
|
||||
leave:
|
||||
spin_unlock(&emu->reg_lock);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -1345,7 +1336,7 @@ static int snd_emu10k1_capture_efx_open(struct snd_pcm_substream *substream)
|
||||
#endif
|
||||
runtime->hw.formats = SNDRV_PCM_FMTBIT_S32_LE;
|
||||
} else {
|
||||
spin_lock_irq(&emu->reg_lock);
|
||||
guard(spinlock_irq)(&emu->reg_lock);
|
||||
runtime->hw.channels_min = runtime->hw.channels_max = 0;
|
||||
for (idx = 0; idx < nefx; idx++) {
|
||||
if (emu->efx_voices_mask[idx/32] & (1 << (idx%32))) {
|
||||
@@ -1355,7 +1346,6 @@ static int snd_emu10k1_capture_efx_open(struct snd_pcm_substream *substream)
|
||||
}
|
||||
epcm->capture_cr_val = emu->efx_voices_mask[0];
|
||||
epcm->capture_cr_val2 = emu->efx_voices_mask[1];
|
||||
spin_unlock_irq(&emu->reg_lock);
|
||||
}
|
||||
err = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
|
||||
&hw_constraints_efx_capture_channels);
|
||||
@@ -1539,12 +1529,11 @@ static int snd_emu10k1_pcm_efx_voices_mask_put(struct snd_kcontrol *kcontrol, st
|
||||
if (bits == 9 || bits == 11 || bits == 13 || bits == 15 || bits > 16)
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irq(&emu->reg_lock);
|
||||
guard(spinlock_irq)(&emu->reg_lock);
|
||||
change = (nval[0] != emu->efx_voices_mask[0]) ||
|
||||
(nval[1] != emu->efx_voices_mask[1]);
|
||||
emu->efx_voices_mask[0] = nval[0];
|
||||
emu->efx_voices_mask[1] = nval[1];
|
||||
spin_unlock_irq(&emu->reg_lock);
|
||||
return change;
|
||||
}
|
||||
|
||||
@@ -1685,9 +1674,9 @@ static int snd_emu10k1_fx8010_playback_trigger(struct snd_pcm_substream *substre
|
||||
{
|
||||
struct snd_emu10k1 *emu = snd_pcm_substream_chip(substream);
|
||||
struct snd_emu10k1_fx8010_pcm *pcm = &emu->fx8010.pcm[substream->number];
|
||||
int result = 0;
|
||||
int result;
|
||||
|
||||
spin_lock(&emu->reg_lock);
|
||||
guard(spinlock)(&emu->reg_lock);
|
||||
switch (cmd) {
|
||||
case SNDRV_PCM_TRIGGER_START:
|
||||
/* follow thru */
|
||||
@@ -1707,7 +1696,7 @@ static int snd_emu10k1_fx8010_playback_trigger(struct snd_pcm_substream *substre
|
||||
#endif
|
||||
result = snd_emu10k1_fx8010_register_irq_handler(emu, snd_emu10k1_fx8010_playback_irq, pcm->gpr_running, substream, &pcm->irq);
|
||||
if (result < 0)
|
||||
goto __err;
|
||||
return result;
|
||||
snd_emu10k1_fx8010_playback_transfer(substream); /* roll the ball */
|
||||
snd_emu10k1_ptr_write(emu, emu->gpr_base + pcm->gpr_trigger, 0, 1);
|
||||
break;
|
||||
@@ -1720,12 +1709,9 @@ static int snd_emu10k1_fx8010_playback_trigger(struct snd_pcm_substream *substre
|
||||
pcm->tram_shift = 0;
|
||||
break;
|
||||
default:
|
||||
result = -EINVAL;
|
||||
break;
|
||||
return -EINVAL;
|
||||
}
|
||||
__err:
|
||||
spin_unlock(&emu->reg_lock);
|
||||
return result;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static snd_pcm_uframes_t snd_emu10k1_fx8010_playback_pointer(struct snd_pcm_substream *substream)
|
||||
@@ -1769,13 +1755,10 @@ static int snd_emu10k1_fx8010_playback_open(struct snd_pcm_substream *substream)
|
||||
runtime->hw = snd_emu10k1_fx8010_playback;
|
||||
runtime->hw.channels_min = runtime->hw.channels_max = pcm->channels;
|
||||
runtime->hw.period_bytes_max = (pcm->buffer_size * 2) / 2;
|
||||
spin_lock_irq(&emu->reg_lock);
|
||||
if (pcm->valid == 0) {
|
||||
spin_unlock_irq(&emu->reg_lock);
|
||||
guard(spinlock_irq)(&emu->reg_lock);
|
||||
if (pcm->valid == 0)
|
||||
return -ENODEV;
|
||||
}
|
||||
pcm->opened = 1;
|
||||
spin_unlock_irq(&emu->reg_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1784,9 +1767,8 @@ static int snd_emu10k1_fx8010_playback_close(struct snd_pcm_substream *substream
|
||||
struct snd_emu10k1 *emu = snd_pcm_substream_chip(substream);
|
||||
struct snd_emu10k1_fx8010_pcm *pcm = &emu->fx8010.pcm[substream->number];
|
||||
|
||||
spin_lock_irq(&emu->reg_lock);
|
||||
guard(spinlock_irq)(&emu->reg_lock);
|
||||
pcm->opened = 0;
|
||||
spin_unlock_irq(&emu->reg_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -537,15 +537,13 @@ static unsigned int snd_ptr_read(struct snd_emu10k1 * emu,
|
||||
unsigned int reg,
|
||||
unsigned int chn)
|
||||
{
|
||||
unsigned int regptr, val;
|
||||
unsigned int regptr;
|
||||
|
||||
regptr = (reg << 16) | chn;
|
||||
|
||||
spin_lock_irq(&emu->emu_lock);
|
||||
guard(spinlock_irq)(&emu->emu_lock);
|
||||
outl(regptr, emu->port + iobase + PTR);
|
||||
val = inl(emu->port + iobase + DATA);
|
||||
spin_unlock_irq(&emu->emu_lock);
|
||||
return val;
|
||||
return inl(emu->port + iobase + DATA);
|
||||
}
|
||||
|
||||
static void snd_ptr_write(struct snd_emu10k1 *emu,
|
||||
@@ -558,10 +556,9 @@ static void snd_ptr_write(struct snd_emu10k1 *emu,
|
||||
|
||||
regptr = (reg << 16) | chn;
|
||||
|
||||
spin_lock_irq(&emu->emu_lock);
|
||||
guard(spinlock_irq)(&emu->emu_lock);
|
||||
outl(regptr, emu->port + iobase + PTR);
|
||||
outl(data, emu->port + iobase + DATA);
|
||||
spin_unlock_irq(&emu->emu_lock);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -30,7 +30,6 @@ static inline bool check_ptr_reg(struct snd_emu10k1 *emu, unsigned int reg)
|
||||
|
||||
unsigned int snd_emu10k1_ptr_read(struct snd_emu10k1 * emu, unsigned int reg, unsigned int chn)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int regptr, val;
|
||||
unsigned int mask;
|
||||
|
||||
@@ -38,10 +37,10 @@ unsigned int snd_emu10k1_ptr_read(struct snd_emu10k1 * emu, unsigned int reg, un
|
||||
if (!check_ptr_reg(emu, regptr))
|
||||
return 0;
|
||||
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
outl(regptr, emu->port + PTR);
|
||||
val = inl(emu->port + DATA);
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
scoped_guard(spinlock_irqsave, &emu->emu_lock) {
|
||||
outl(regptr, emu->port + PTR);
|
||||
val = inl(emu->port + DATA);
|
||||
}
|
||||
|
||||
if (reg & 0xff000000) {
|
||||
unsigned char size, offset;
|
||||
@@ -61,13 +60,13 @@ EXPORT_SYMBOL(snd_emu10k1_ptr_read);
|
||||
void snd_emu10k1_ptr_write(struct snd_emu10k1 *emu, unsigned int reg, unsigned int chn, unsigned int data)
|
||||
{
|
||||
unsigned int regptr;
|
||||
unsigned long flags;
|
||||
unsigned int mask;
|
||||
|
||||
regptr = (reg << 16) | chn;
|
||||
if (!check_ptr_reg(emu, regptr))
|
||||
return;
|
||||
|
||||
guard(spinlock_irqsave)(&emu->emu_lock);
|
||||
if (reg & 0xff000000) {
|
||||
unsigned char size, offset;
|
||||
|
||||
@@ -79,15 +78,12 @@ void snd_emu10k1_ptr_write(struct snd_emu10k1 *emu, unsigned int reg, unsigned i
|
||||
mask <<= offset;
|
||||
data <<= offset;
|
||||
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
outl(regptr, emu->port + PTR);
|
||||
data |= inl(emu->port + DATA) & ~mask;
|
||||
} else {
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
outl(regptr, emu->port + PTR);
|
||||
}
|
||||
outl(data, emu->port + DATA);
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(snd_emu10k1_ptr_write);
|
||||
@@ -96,7 +92,6 @@ void snd_emu10k1_ptr_write_multiple(struct snd_emu10k1 *emu, unsigned int chn, .
|
||||
{
|
||||
va_list va;
|
||||
u32 addr_mask;
|
||||
unsigned long flags;
|
||||
|
||||
if (snd_BUG_ON(!emu))
|
||||
return;
|
||||
@@ -105,7 +100,7 @@ void snd_emu10k1_ptr_write_multiple(struct snd_emu10k1 *emu, unsigned int chn, .
|
||||
addr_mask = ~((emu->audigy ? A_PTR_ADDRESS_MASK : PTR_ADDRESS_MASK) >> 16);
|
||||
|
||||
va_start(va, chn);
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->emu_lock);
|
||||
for (;;) {
|
||||
u32 data;
|
||||
u32 reg = va_arg(va, u32);
|
||||
@@ -117,7 +112,6 @@ void snd_emu10k1_ptr_write_multiple(struct snd_emu10k1 *emu, unsigned int chn, .
|
||||
outl((reg << 16) | chn, emu->port + PTR);
|
||||
outl(data, emu->port + DATA);
|
||||
}
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
va_end(va);
|
||||
}
|
||||
|
||||
@@ -127,16 +121,13 @@ unsigned int snd_emu10k1_ptr20_read(struct snd_emu10k1 * emu,
|
||||
unsigned int reg,
|
||||
unsigned int chn)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int regptr, val;
|
||||
unsigned int regptr;
|
||||
|
||||
regptr = (reg << 16) | chn;
|
||||
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->emu_lock);
|
||||
outl(regptr, emu->port + PTR2);
|
||||
val = inl(emu->port + DATA2);
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
return val;
|
||||
return inl(emu->port + DATA2);
|
||||
}
|
||||
|
||||
void snd_emu10k1_ptr20_write(struct snd_emu10k1 *emu,
|
||||
@@ -145,14 +136,12 @@ void snd_emu10k1_ptr20_write(struct snd_emu10k1 *emu,
|
||||
unsigned int data)
|
||||
{
|
||||
unsigned int regptr;
|
||||
unsigned long flags;
|
||||
|
||||
regptr = (reg << 16) | chn;
|
||||
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->emu_lock);
|
||||
outl(regptr, emu->port + PTR2);
|
||||
outl(data, emu->port + DATA2);
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
}
|
||||
|
||||
int snd_emu10k1_spi_write(struct snd_emu10k1 * emu,
|
||||
@@ -161,22 +150,19 @@ int snd_emu10k1_spi_write(struct snd_emu10k1 * emu,
|
||||
unsigned int reset, set;
|
||||
unsigned int reg, tmp;
|
||||
int n, result;
|
||||
int err = 0;
|
||||
|
||||
/* This function is not re-entrant, so protect against it. */
|
||||
spin_lock(&emu->spi_lock);
|
||||
guard(spinlock)(&emu->spi_lock);
|
||||
if (emu->card_capabilities->ca0108_chip)
|
||||
reg = P17V_SPI;
|
||||
else {
|
||||
/* For other chip types the SPI register
|
||||
* is currently unknown. */
|
||||
err = 1;
|
||||
goto spi_write_exit;
|
||||
return 1;
|
||||
}
|
||||
if (data > 0xffff) {
|
||||
/* Only 16bit values allowed */
|
||||
err = 1;
|
||||
goto spi_write_exit;
|
||||
return 1;
|
||||
}
|
||||
|
||||
tmp = snd_emu10k1_ptr20_read(emu, reg, 0);
|
||||
@@ -197,15 +183,11 @@ int snd_emu10k1_spi_write(struct snd_emu10k1 * emu,
|
||||
}
|
||||
if (result) {
|
||||
/* Timed out */
|
||||
err = 1;
|
||||
goto spi_write_exit;
|
||||
return 1;
|
||||
}
|
||||
snd_emu10k1_ptr20_write(emu, reg, 0, reset | data);
|
||||
tmp = snd_emu10k1_ptr20_read(emu, reg, 0); /* Write post */
|
||||
err = 0;
|
||||
spi_write_exit:
|
||||
spin_unlock(&emu->spi_lock);
|
||||
return err;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* The ADC does not support i2c read, so only write is implemented */
|
||||
@@ -217,7 +199,6 @@ int snd_emu10k1_i2c_write(struct snd_emu10k1 *emu,
|
||||
int timeout = 0;
|
||||
int status;
|
||||
int retry;
|
||||
int err = 0;
|
||||
|
||||
if ((reg > 0x7f) || (value > 0x1ff)) {
|
||||
dev_err(emu->card->dev, "i2c_write: invalid values.\n");
|
||||
@@ -225,7 +206,7 @@ int snd_emu10k1_i2c_write(struct snd_emu10k1 *emu,
|
||||
}
|
||||
|
||||
/* This function is not re-entrant, so protect against it. */
|
||||
spin_lock(&emu->i2c_lock);
|
||||
guard(spinlock)(&emu->i2c_lock);
|
||||
|
||||
tmp = reg << 25 | value << 16;
|
||||
|
||||
@@ -264,11 +245,10 @@ int snd_emu10k1_i2c_write(struct snd_emu10k1 *emu,
|
||||
dev_err(emu->card->dev, "status=0x%x, reg=%d, value=%d\n",
|
||||
status, reg, value);
|
||||
/* dump_stack(); */
|
||||
err = -EINVAL;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
spin_unlock(&emu->i2c_lock);
|
||||
return err;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void snd_emu1010_fpga_write_locked(struct snd_emu10k1 *emu, u32 reg, u32 value)
|
||||
@@ -476,32 +456,27 @@ void snd_emu1010_load_firmware_entry(struct snd_emu10k1 *emu, int dock,
|
||||
|
||||
void snd_emu10k1_intr_enable(struct snd_emu10k1 *emu, unsigned int intrenb)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int enable;
|
||||
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->emu_lock);
|
||||
enable = inl(emu->port + INTE) | intrenb;
|
||||
outl(enable, emu->port + INTE);
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
}
|
||||
|
||||
void snd_emu10k1_intr_disable(struct snd_emu10k1 *emu, unsigned int intrenb)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int enable;
|
||||
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->emu_lock);
|
||||
enable = inl(emu->port + INTE) & ~intrenb;
|
||||
outl(enable, emu->port + INTE);
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
}
|
||||
|
||||
void snd_emu10k1_voice_intr_enable(struct snd_emu10k1 *emu, unsigned int voicenum)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int val;
|
||||
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->emu_lock);
|
||||
if (voicenum >= 32) {
|
||||
outl(CLIEH << 16, emu->port + PTR);
|
||||
val = inl(emu->port + DATA);
|
||||
@@ -512,15 +487,13 @@ void snd_emu10k1_voice_intr_enable(struct snd_emu10k1 *emu, unsigned int voicenu
|
||||
val |= 1 << voicenum;
|
||||
}
|
||||
outl(val, emu->port + DATA);
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
}
|
||||
|
||||
void snd_emu10k1_voice_intr_disable(struct snd_emu10k1 *emu, unsigned int voicenum)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int val;
|
||||
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->emu_lock);
|
||||
if (voicenum >= 32) {
|
||||
outl(CLIEH << 16, emu->port + PTR);
|
||||
val = inl(emu->port + DATA);
|
||||
@@ -531,14 +504,11 @@ void snd_emu10k1_voice_intr_disable(struct snd_emu10k1 *emu, unsigned int voicen
|
||||
val &= ~(1 << voicenum);
|
||||
}
|
||||
outl(val, emu->port + DATA);
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
}
|
||||
|
||||
void snd_emu10k1_voice_intr_ack(struct snd_emu10k1 *emu, unsigned int voicenum)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->emu_lock);
|
||||
if (voicenum >= 32) {
|
||||
outl(CLIPH << 16, emu->port + PTR);
|
||||
voicenum = 1 << (voicenum - 32);
|
||||
@@ -547,15 +517,13 @@ void snd_emu10k1_voice_intr_ack(struct snd_emu10k1 *emu, unsigned int voicenum)
|
||||
voicenum = 1 << voicenum;
|
||||
}
|
||||
outl(voicenum, emu->port + DATA);
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
}
|
||||
|
||||
void snd_emu10k1_voice_half_loop_intr_enable(struct snd_emu10k1 *emu, unsigned int voicenum)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int val;
|
||||
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->emu_lock);
|
||||
if (voicenum >= 32) {
|
||||
outl(HLIEH << 16, emu->port + PTR);
|
||||
val = inl(emu->port + DATA);
|
||||
@@ -566,15 +534,13 @@ void snd_emu10k1_voice_half_loop_intr_enable(struct snd_emu10k1 *emu, unsigned i
|
||||
val |= 1 << voicenum;
|
||||
}
|
||||
outl(val, emu->port + DATA);
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
}
|
||||
|
||||
void snd_emu10k1_voice_half_loop_intr_disable(struct snd_emu10k1 *emu, unsigned int voicenum)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int val;
|
||||
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->emu_lock);
|
||||
if (voicenum >= 32) {
|
||||
outl(HLIEH << 16, emu->port + PTR);
|
||||
val = inl(emu->port + DATA);
|
||||
@@ -585,14 +551,11 @@ void snd_emu10k1_voice_half_loop_intr_disable(struct snd_emu10k1 *emu, unsigned
|
||||
val &= ~(1 << voicenum);
|
||||
}
|
||||
outl(val, emu->port + DATA);
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
}
|
||||
|
||||
void snd_emu10k1_voice_half_loop_intr_ack(struct snd_emu10k1 *emu, unsigned int voicenum)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->emu_lock);
|
||||
if (voicenum >= 32) {
|
||||
outl(HLIPH << 16, emu->port + PTR);
|
||||
voicenum = 1 << (voicenum - 32);
|
||||
@@ -601,16 +564,14 @@ void snd_emu10k1_voice_half_loop_intr_ack(struct snd_emu10k1 *emu, unsigned int
|
||||
voicenum = 1 << voicenum;
|
||||
}
|
||||
outl(voicenum, emu->port + DATA);
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
}
|
||||
|
||||
#if 0
|
||||
void snd_emu10k1_voice_set_loop_stop(struct snd_emu10k1 *emu, unsigned int voicenum)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int sol;
|
||||
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->emu_lock);
|
||||
if (voicenum >= 32) {
|
||||
outl(SOLEH << 16, emu->port + PTR);
|
||||
sol = inl(emu->port + DATA);
|
||||
@@ -621,15 +582,13 @@ void snd_emu10k1_voice_set_loop_stop(struct snd_emu10k1 *emu, unsigned int voice
|
||||
sol |= 1 << voicenum;
|
||||
}
|
||||
outl(sol, emu->port + DATA);
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
}
|
||||
|
||||
void snd_emu10k1_voice_clear_loop_stop(struct snd_emu10k1 *emu, unsigned int voicenum)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int sol;
|
||||
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->emu_lock);
|
||||
if (voicenum >= 32) {
|
||||
outl(SOLEH << 16, emu->port + PTR);
|
||||
sol = inl(emu->port + DATA);
|
||||
@@ -640,32 +599,25 @@ void snd_emu10k1_voice_clear_loop_stop(struct snd_emu10k1 *emu, unsigned int voi
|
||||
sol &= ~(1 << voicenum);
|
||||
}
|
||||
outl(sol, emu->port + DATA);
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
}
|
||||
#endif
|
||||
|
||||
void snd_emu10k1_voice_set_loop_stop_multiple(struct snd_emu10k1 *emu, u64 voices)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->emu_lock);
|
||||
outl(SOLEL << 16, emu->port + PTR);
|
||||
outl(inl(emu->port + DATA) | (u32)voices, emu->port + DATA);
|
||||
outl(SOLEH << 16, emu->port + PTR);
|
||||
outl(inl(emu->port + DATA) | (u32)(voices >> 32), emu->port + DATA);
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
}
|
||||
|
||||
void snd_emu10k1_voice_clear_loop_stop_multiple(struct snd_emu10k1 *emu, u64 voices)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->emu_lock);
|
||||
outl(SOLEL << 16, emu->port + PTR);
|
||||
outl(inl(emu->port + DATA) & (u32)~voices, emu->port + DATA);
|
||||
outl(SOLEH << 16, emu->port + PTR);
|
||||
outl(inl(emu->port + DATA) & (u32)(~voices >> 32), emu->port + DATA);
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
}
|
||||
|
||||
int snd_emu10k1_voice_clear_loop_stop_multiple_atomic(struct snd_emu10k1 *emu, u64 voices)
|
||||
@@ -748,23 +700,17 @@ void snd_emu10k1_wait(struct snd_emu10k1 *emu, unsigned int wait)
|
||||
unsigned short snd_emu10k1_ac97_read(struct snd_ac97 *ac97, unsigned short reg)
|
||||
{
|
||||
struct snd_emu10k1 *emu = ac97->private_data;
|
||||
unsigned long flags;
|
||||
unsigned short val;
|
||||
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->emu_lock);
|
||||
outb(reg, emu->port + AC97ADDRESS);
|
||||
val = inw(emu->port + AC97DATA);
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
return val;
|
||||
return inw(emu->port + AC97DATA);
|
||||
}
|
||||
|
||||
void snd_emu10k1_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned short data)
|
||||
{
|
||||
struct snd_emu10k1 *emu = ac97->private_data;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->emu_lock);
|
||||
outb(reg, emu->port + AC97ADDRESS);
|
||||
outw(data, emu->port + AC97DATA);
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
}
|
||||
|
||||
@@ -261,14 +261,12 @@ int snd_emu10k1_memblk_map(struct snd_emu10k1 *emu, struct snd_emu10k1_memblk *b
|
||||
int size;
|
||||
struct list_head *p, *nextp;
|
||||
struct snd_emu10k1_memblk *deleted;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&emu->memblk_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->memblk_lock);
|
||||
if (blk->mapped_page >= 0) {
|
||||
/* update order link */
|
||||
list_move_tail(&blk->mapped_order_link,
|
||||
&emu->mapped_order_link_head);
|
||||
spin_unlock_irqrestore(&emu->memblk_lock, flags);
|
||||
return 0;
|
||||
}
|
||||
err = map_memblk(emu, blk);
|
||||
@@ -289,7 +287,6 @@ int snd_emu10k1_memblk_map(struct snd_emu10k1 *emu, struct snd_emu10k1_memblk *b
|
||||
}
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&emu->memblk_lock, flags);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -424,13 +421,12 @@ snd_emu10k1_synth_free(struct snd_emu10k1 *emu, struct snd_util_memblk *memblk)
|
||||
{
|
||||
struct snd_util_memhdr *hdr = emu->memhdr;
|
||||
struct snd_emu10k1_memblk *blk = (struct snd_emu10k1_memblk *)memblk;
|
||||
unsigned long flags;
|
||||
|
||||
guard(mutex)(&hdr->block_mutex);
|
||||
spin_lock_irqsave(&emu->memblk_lock, flags);
|
||||
if (blk->mapped_page >= 0)
|
||||
unmap_memblk(emu, blk);
|
||||
spin_unlock_irqrestore(&emu->memblk_lock, flags);
|
||||
scoped_guard(spinlock_irqsave, &emu->memblk_lock) {
|
||||
if (blk->mapped_page >= 0)
|
||||
unmap_memblk(emu, blk);
|
||||
}
|
||||
synth_free_pages(emu, blk);
|
||||
__snd_util_mem_free(hdr, memblk);
|
||||
return 0;
|
||||
|
||||
@@ -342,24 +342,20 @@ static int snd_p16v_pcm_prepare_capture(struct snd_pcm_substream *substream)
|
||||
|
||||
static void snd_p16v_intr_enable(struct snd_emu10k1 *emu, unsigned int intrenb)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int enable;
|
||||
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->emu_lock);
|
||||
enable = inl(emu->port + INTE2) | intrenb;
|
||||
outl(enable, emu->port + INTE2);
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
}
|
||||
|
||||
static void snd_p16v_intr_disable(struct snd_emu10k1 *emu, unsigned int intrenb)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int disable;
|
||||
|
||||
spin_lock_irqsave(&emu->emu_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->emu_lock);
|
||||
disable = inl(emu->port + INTE2) & (~intrenb);
|
||||
outl(disable, emu->port + INTE2);
|
||||
spin_unlock_irqrestore(&emu->emu_lock, flags);
|
||||
}
|
||||
|
||||
static void snd_p16v_interrupt(struct snd_emu10k1 *emu)
|
||||
|
||||
@@ -77,7 +77,6 @@ static void voice_free(struct snd_emu10k1 *emu,
|
||||
int snd_emu10k1_voice_alloc(struct snd_emu10k1 *emu, int type, int count, int channels,
|
||||
struct snd_emu10k1_pcm *epcm, struct snd_emu10k1_voice **rvoice)
|
||||
{
|
||||
unsigned long flags;
|
||||
int result;
|
||||
|
||||
if (snd_BUG_ON(!rvoice))
|
||||
@@ -87,7 +86,7 @@ int snd_emu10k1_voice_alloc(struct snd_emu10k1 *emu, int type, int count, int ch
|
||||
if (snd_BUG_ON(!channels))
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(&emu->voice_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->voice_lock);
|
||||
for (int got = 0; got < channels; ) {
|
||||
result = voice_alloc(emu, type, count, epcm, &rvoice[got]);
|
||||
if (result == 0) {
|
||||
@@ -113,7 +112,6 @@ int snd_emu10k1_voice_alloc(struct snd_emu10k1 *emu, int type, int count, int ch
|
||||
}
|
||||
break;
|
||||
}
|
||||
spin_unlock_irqrestore(&emu->voice_lock, flags);
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -123,17 +121,15 @@ EXPORT_SYMBOL(snd_emu10k1_voice_alloc);
|
||||
int snd_emu10k1_voice_free(struct snd_emu10k1 *emu,
|
||||
struct snd_emu10k1_voice *pvoice)
|
||||
{
|
||||
unsigned long flags;
|
||||
int last;
|
||||
|
||||
if (snd_BUG_ON(!pvoice))
|
||||
return -EINVAL;
|
||||
spin_lock_irqsave(&emu->voice_lock, flags);
|
||||
guard(spinlock_irqsave)(&emu->voice_lock);
|
||||
do {
|
||||
last = pvoice->last;
|
||||
voice_free(emu, pvoice++);
|
||||
} while (!last);
|
||||
spin_unlock_irqrestore(&emu->voice_lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user