diff options
Diffstat (limited to 'sound/core/ump.c')
| -rw-r--r-- | sound/core/ump.c | 15 | 
1 files changed, 15 insertions, 0 deletions
diff --git a/sound/core/ump.c b/sound/core/ump.c index fd6a68a54278..3f61220c23b4 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); @@ -960,6 +967,14 @@ int snd_ump_parse_endpoint(struct snd_ump_endpoint *ump)  	if (err < 0)  		ump_dbg(ump, "Unable to get UMP EP stream config\n"); +	/* If no protocol is set by some reason, assume the valid one */ +	if (!(ump->info.protocol & SNDRV_UMP_EP_INFO_PROTO_MIDI_MASK)) { +		if (ump->info.protocol_caps & SNDRV_UMP_EP_INFO_PROTO_MIDI2) +			ump->info.protocol |= SNDRV_UMP_EP_INFO_PROTO_MIDI2; +		else if (ump->info.protocol_caps & SNDRV_UMP_EP_INFO_PROTO_MIDI1) +			ump->info.protocol |= SNDRV_UMP_EP_INFO_PROTO_MIDI1; +	} +  	/* Query and create blocks from Function Blocks */  	for (blk = 0; blk < ump->info.num_blocks; blk++) {  		err = create_block_from_fb_info(ump, blk);  |