summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2023-06-21 13:02:39 +0200
committerTakashi Iwai <tiwai@suse.de>2023-06-21 13:06:18 +0200
commita79807683781d3f215e9d958494e52ed70f4ad27 (patch)
treee1f07631b8f1157b2b98ec6363856def7d32ef83 /sound
parentfebdfa0e9c8a5d3a3d895245d1c294c26787daef (diff)
ALSA: ump: Add helper to change MIDI protocol
This is a preliminary patch for MIDI 2.0 USB gadget driver. Export a new helper to allow changing the current MIDI protocol from the outside. Link: https://lore.kernel.org/r/20230621110241.4751-2-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r--sound/core/ump.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/sound/core/ump.c b/sound/core/ump.c
index a64dc2d8a129..4150b9c0b35b 100644
--- a/sound/core/ump.c
+++ b/sound/core/ump.c
@@ -671,18 +671,35 @@ static void seq_notify_protocol(struct snd_ump_endpoint *ump)
#endif /* CONFIG_SND_SEQUENCER */
}
+/**
+ * snd_ump_switch_protocol - switch MIDI protocol
+ * @ump: UMP endpoint
+ * @protocol: protocol to switch to
+ *
+ * Returns 1 if the protocol is actually switched, 0 if unchanged
+ */
+int snd_ump_switch_protocol(struct snd_ump_endpoint *ump, unsigned int protocol)
+{
+ protocol &= ump->info.protocol_caps;
+ if (protocol == ump->info.protocol)
+ return 0;
+
+ ump->info.protocol = protocol;
+ ump_dbg(ump, "New protocol = %x (caps = %x)\n",
+ protocol, ump->info.protocol_caps);
+ seq_notify_protocol(ump);
+ return 1;
+}
+EXPORT_SYMBOL_GPL(snd_ump_switch_protocol);
+
/* handle EP stream config message; update the UMP protocol */
static int ump_handle_stream_cfg_msg(struct snd_ump_endpoint *ump,
const union snd_ump_stream_msg *buf)
{
- unsigned int old_protocol = ump->info.protocol;
-
- ump->info.protocol =
+ unsigned int protocol =
(buf->stream_cfg.protocol << 8) | buf->stream_cfg.jrts;
- ump_dbg(ump, "Current protocol = %x (caps = %x)\n",
- ump->info.protocol, ump->info.protocol_caps);
- if (ump->parsed && ump->info.protocol != old_protocol)
- seq_notify_protocol(ump);
+
+ snd_ump_switch_protocol(ump, protocol);
return 1; /* finished */
}