mirror of
https://github.com/torvalds/linux
synced 2024-07-21 10:41:44 +00:00
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>
This commit is contained in:
parent
febdfa0e9c
commit
a798076837
|
@ -108,6 +108,8 @@ static inline int snd_ump_attach_legacy_rawmidi(struct snd_ump_endpoint *ump,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int snd_ump_switch_protocol(struct snd_ump_endpoint *ump, unsigned int protocol);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Some definitions for UMP
|
* Some definitions for UMP
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -671,18 +671,35 @@ static void seq_notify_protocol(struct snd_ump_endpoint *ump)
|
||||||
#endif /* CONFIG_SND_SEQUENCER */
|
#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 */
|
/* handle EP stream config message; update the UMP protocol */
|
||||||
static int ump_handle_stream_cfg_msg(struct snd_ump_endpoint *ump,
|
static int ump_handle_stream_cfg_msg(struct snd_ump_endpoint *ump,
|
||||||
const union snd_ump_stream_msg *buf)
|
const union snd_ump_stream_msg *buf)
|
||||||
{
|
{
|
||||||
unsigned int old_protocol = ump->info.protocol;
|
unsigned int protocol =
|
||||||
|
|
||||||
ump->info.protocol =
|
|
||||||
(buf->stream_cfg.protocol << 8) | buf->stream_cfg.jrts;
|
(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);
|
snd_ump_switch_protocol(ump, protocol);
|
||||||
if (ump->parsed && ump->info.protocol != old_protocol)
|
|
||||||
seq_notify_protocol(ump);
|
|
||||||
return 1; /* finished */
|
return 1; /* finished */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue