// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Universal MIDI Packet (UMP) support
*/
#include <linux/list.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/export.h>
#include <linux/mm.h>
#include <sound/core.h>
#include <sound/rawmidi.h>
#include <sound/ump.h>
#include <sound/ump_convert.h>
#define ump_err(ump, fmt, args...) dev_err((ump)->core.dev, fmt, ##args)
#define ump_warn(ump, fmt, args...) dev_warn((ump)->core.dev, fmt, ##args)
#define ump_info(ump, fmt, args...) dev_info((ump)->core.dev, fmt, ##args)
#define ump_dbg(ump, fmt, args...) dev_dbg((ump)->core.dev, fmt, ##args)
static int snd_ump_dev_register(struct snd_rawmidi *rmidi);
static int snd_ump_dev_unregister(struct snd_rawmidi *rmidi);
static long snd_ump_ioctl(struct snd_rawmidi *rmidi, unsigned int cmd,
void __user *argp);
static void snd_ump_proc_read(struct snd_info_entry *entry,
struct snd_info_buffer *buffer);
static int snd_ump_rawmidi_open(struct snd_rawmidi_substream *substream);
static int snd_ump_rawmidi_close(struct snd_rawmidi_substream *substream);
static void snd_ump_rawmidi_trigger(struct snd_rawmidi_substream *substream,
int up);
static void snd_ump_rawmidi_drain(struct snd_rawmidi_substream *substream);
static void ump_handle_stream_msg(struct snd_ump_endpoint *ump,
const u32 *buf, int size);
#if IS_ENABLED(CONFIG_SND_UMP_LEGACY_RAWMIDI)
static int process_legacy_output(struct snd_ump_endpoint *ump,
u32 *buffer, int count);
static void process_legacy_input(struct snd_ump_endpoint *ump, const u32 *src,
int words);
static void ump_legacy_set_rawmidi_name(struct snd_ump_endpoint *ump);
static void update_legacy_names(struct snd_ump_endpoint *ump);
#else
static inline int process_legacy_output(struct snd_ump_endpoint *ump,
u32 *buffer, int count)
{
return 0;
}
static inline void process_legacy_input(struct snd_ump_endpoint *ump,
const u32 *src, int words)
{
}
static inline void ump_legacy_set_rawmidi_name(struct snd_ump_endpoint *ump)
{
}
static inline void update_legacy_names(struct snd_ump_endpoint *ump)
{
}
#endif
/* copy a string safely with stripping non-printable letters */
static void safe_copy_string(void *