summaryrefslogtreecommitdiffstats
path: root/sound/core/ump.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/core/ump.c')
-rw-r--r--sound/core/ump.c42
1 files changed, 19 insertions, 23 deletions
diff --git a/sound/core/ump.c b/sound/core/ump.c
index fe7911498c..117c7ecc48 100644
--- a/sound/core/ump.c
+++ b/sound/core/ump.c
@@ -685,10 +685,17 @@ static void seq_notify_protocol(struct snd_ump_endpoint *ump)
*/
int snd_ump_switch_protocol(struct snd_ump_endpoint *ump, unsigned int protocol)
{
+ unsigned int type;
+
protocol &= ump->info.protocol_caps;
if (protocol == ump->info.protocol)
return 0;
+ type = protocol & SNDRV_UMP_EP_INFO_PROTO_MIDI_MASK;
+ if (type != SNDRV_UMP_EP_INFO_PROTO_MIDI1 &&
+ type != SNDRV_UMP_EP_INFO_PROTO_MIDI2)
+ return 0;
+
ump->info.protocol = protocol;
ump_dbg(ump, "New protocol = %x (caps = %x)\n",
protocol, ump->info.protocol_caps);
@@ -985,13 +992,11 @@ static int snd_ump_legacy_open(struct snd_rawmidi_substream *substream)
struct snd_ump_endpoint *ump = substream->rmidi->private_data;
int dir = substream->stream;
int group = ump->legacy_mapping[substream->number];
- int err = 0;
+ int err;
- mutex_lock(&ump->open_mutex);
- if (ump->legacy_substreams[dir][group]) {
- err = -EBUSY;
- goto unlock;
- }
+ guard(mutex)(&ump->open_mutex);
+ if (ump->legacy_substreams[dir][group])
+ return -EBUSY;
if (dir == SNDRV_RAWMIDI_STREAM_OUTPUT) {
if (!ump->legacy_out_opens) {
err = snd_rawmidi_kernel_open(&ump->core, 0,
@@ -999,17 +1004,14 @@ static int snd_ump_legacy_open(struct snd_rawmidi_substream *substream)
SNDRV_RAWMIDI_LFLG_APPEND,
&ump->legacy_out_rfile);
if (err < 0)
- goto unlock;
+ return err;
}
ump->legacy_out_opens++;
snd_ump_convert_reset(&ump->out_cvts[group]);
}
- spin_lock_irq(&ump->legacy_locks[dir]);
+ guard(spinlock_irq)(&ump->legacy_locks[dir]);
ump->legacy_substreams[dir][group] = substream;
- spin_unlock_irq(&ump->legacy_locks[dir]);
- unlock:
- mutex_unlock(&ump->open_mutex);
- return err;
+ return 0;
}
static int snd_ump_legacy_close(struct snd_rawmidi_substream *substream)
@@ -1018,15 +1020,13 @@ static int snd_ump_legacy_close(struct snd_rawmidi_substream *substream)
int dir = substream->stream;
int group = ump->legacy_mapping[substream->number];
- mutex_lock(&ump->open_mutex);
- spin_lock_irq(&ump->legacy_locks[dir]);
- ump->legacy_substreams[dir][group] = NULL;
- spin_unlock_irq(&ump->legacy_locks[dir]);
+ guard(mutex)(&ump->open_mutex);
+ scoped_guard(spinlock_irq, &ump->legacy_locks[dir])
+ ump->legacy_substreams[dir][group] = NULL;
if (dir == SNDRV_RAWMIDI_STREAM_OUTPUT) {
if (!--ump->legacy_out_opens)
snd_rawmidi_kernel_release(&ump->legacy_out_rfile);
}
- mutex_unlock(&ump->open_mutex);
return 0;
}
@@ -1078,12 +1078,11 @@ static int process_legacy_output(struct snd_ump_endpoint *ump,
const int dir = SNDRV_RAWMIDI_STREAM_OUTPUT;
unsigned char c;
int group, size = 0;
- unsigned long flags;
if (!ump->out_cvts || !ump->legacy_out_opens)
return 0;
- spin_lock_irqsave(&ump->legacy_locks[dir], flags);
+ guard(spinlock_irqsave)(&ump->legacy_locks[dir]);
for (group = 0; group < SNDRV_UMP_MAX_GROUPS; group++) {
substream = ump->legacy_substreams[dir][group];
if (!substream)
@@ -1099,7 +1098,6 @@ static int process_legacy_output(struct snd_ump_endpoint *ump,
break;
}
}
- spin_unlock_irqrestore(&ump->legacy_locks[dir], flags);
return size;
}
@@ -1109,18 +1107,16 @@ static void process_legacy_input(struct snd_ump_endpoint *ump, const u32 *src,
struct snd_rawmidi_substream *substream;
unsigned char buf[16];
unsigned char group;
- unsigned long flags;
const int dir = SNDRV_RAWMIDI_STREAM_INPUT;
int size;
size = snd_ump_convert_from_ump(src, buf, &group);
if (size <= 0)
return;
- spin_lock_irqsave(&ump->legacy_locks[dir], flags);
+ guard(spinlock_irqsave)(&ump->legacy_locks[dir]);
substream = ump->legacy_substreams[dir][group];
if (substream)
snd_rawmidi_receive(substream, buf, size);
- spin_unlock_irqrestore(&ump->legacy_locks[dir], flags);
}
/* Fill ump->legacy_mapping[] for groups to be used for legacy rawmidi */