Lines Matching +full:sound +full:- +full:name +full:- +full:prefix

1 // SPDX-License-Identifier: GPL-2.0-or-later
16 #include <sound/core.h>
17 #include <sound/initval.h>
18 #include <sound/rawmidi.h>
20 #define PREFIX "snd-bcd2000: " macro
68 static void bcd2000_dump_buffer(const char *prefix, const char *buf, int len) in bcd2000_dump_buffer() argument
70 print_hex_dump(KERN_DEBUG, prefix, in bcd2000_dump_buffer()
75 static void bcd2000_dump_buffer(const char *prefix, const char *buf, int len) {} in bcd2000_dump_buffer() argument
92 struct bcd2000 *bcd2k = substream->rmidi->private_data; in bcd2000_midi_input_trigger()
93 bcd2k->midi_receive_substream = up ? substream : NULL; in bcd2000_midi_input_trigger()
102 midi_receive_substream = READ_ONCE(bcd2k->midi_receive_substream); in bcd2000_midi_handle_input()
106 bcd2000_dump_buffer(PREFIX "received from device: ", buf, buf_len); in bcd2000_midi_handle_input()
117 tocopy = min(payload_length, buf_len-1); in bcd2000_midi_handle_input()
119 bcd2000_dump_buffer(PREFIX "sending to userspace: ", in bcd2000_midi_handle_input()
133 midi_out_substream = READ_ONCE(bcd2k->midi_out_substream); in bcd2000_midi_send()
137 /* copy command prefix bytes */ in bcd2000_midi_send()
138 memcpy(bcd2k->midi_out_buf, device_cmd_prefix, in bcd2000_midi_send()
142 * get MIDI packet and leave space for command prefix in bcd2000_midi_send()
146 bcd2k->midi_out_buf + 3, BUFSIZE - 3); in bcd2000_midi_send()
149 dev_err(&bcd2k->dev->dev, "%s: snd_rawmidi_transmit error %d\n", in bcd2000_midi_send()
156 bcd2k->midi_out_buf[2] = len; in bcd2000_midi_send()
157 bcd2k->midi_out_urb->transfer_buffer_length = BUFSIZE; in bcd2000_midi_send()
159 bcd2000_dump_buffer(PREFIX "sending to device: ", in bcd2000_midi_send()
160 bcd2k->midi_out_buf, len+3); in bcd2000_midi_send()
163 ret = usb_submit_urb(bcd2k->midi_out_urb, GFP_ATOMIC); in bcd2000_midi_send()
165 dev_err(&bcd2k->dev->dev, PREFIX in bcd2000_midi_send()
169 bcd2k->midi_out_active = 1; in bcd2000_midi_send()
179 struct bcd2000 *bcd2k = substream->rmidi->private_data; in bcd2000_midi_output_close()
181 if (bcd2k->midi_out_active) { in bcd2000_midi_output_close()
182 usb_kill_urb(bcd2k->midi_out_urb); in bcd2000_midi_output_close()
183 bcd2k->midi_out_active = 0; in bcd2000_midi_output_close()
193 struct bcd2000 *bcd2k = substream->rmidi->private_data; in bcd2000_midi_output_trigger()
196 bcd2k->midi_out_substream = substream; in bcd2000_midi_output_trigger()
198 if (!bcd2k->midi_out_active) in bcd2000_midi_output_trigger()
201 bcd2k->midi_out_substream = NULL; in bcd2000_midi_output_trigger()
207 struct bcd2000 *bcd2k = urb->context; in bcd2000_output_complete()
209 bcd2k->midi_out_active = 0; in bcd2000_output_complete()
211 if (urb->status) in bcd2000_output_complete()
212 dev_warn(&urb->dev->dev, in bcd2000_output_complete()
213 PREFIX "output urb->status: %d\n", urb->status); in bcd2000_output_complete()
215 if (urb->status == -ESHUTDOWN) in bcd2000_output_complete()
225 struct bcd2000 *bcd2k = urb->context; in bcd2000_input_complete()
227 if (urb->status) in bcd2000_input_complete()
228 dev_warn(&urb->dev->dev, in bcd2000_input_complete()
229 PREFIX "input urb->status: %i\n", urb->status); in bcd2000_input_complete()
231 if (!bcd2k || urb->status == -ESHUTDOWN) in bcd2000_input_complete()
234 if (urb->actual_length > 0) in bcd2000_input_complete()
235 bcd2000_midi_handle_input(bcd2k, urb->transfer_buffer, in bcd2000_input_complete()
236 urb->actual_length); in bcd2000_input_complete()
239 ret = usb_submit_urb(bcd2k->midi_in_urb, GFP_ATOMIC); in bcd2000_input_complete()
241 dev_err(&bcd2k->dev->dev, PREFIX in bcd2000_input_complete()
262 init_usb_anchor(&bcd2k->anchor); in bcd2000_init_device()
263 usb_anchor_urb(bcd2k->midi_out_urb, &bcd2k->anchor); in bcd2000_init_device()
264 usb_anchor_urb(bcd2k->midi_in_urb, &bcd2k->anchor); in bcd2000_init_device()
267 memcpy(bcd2k->midi_out_buf, bcd2000_init_sequence, 52); in bcd2000_init_device()
268 bcd2k->midi_out_urb->transfer_buffer_length = 52; in bcd2000_init_device()
271 ret = usb_submit_urb(bcd2k->midi_out_urb, GFP_KERNEL); in bcd2000_init_device()
273 dev_err(&bcd2k->dev->dev, PREFIX in bcd2000_init_device()
277 bcd2k->midi_out_active = 1; in bcd2000_init_device()
280 ret = usb_submit_urb(bcd2k->midi_in_urb, GFP_KERNEL); in bcd2000_init_device()
282 dev_err(&bcd2k->dev->dev, PREFIX in bcd2000_init_device()
287 usb_wait_anchor_empty_timeout(&bcd2k->anchor, 1000); in bcd2000_init_device()
295 ret = snd_rawmidi_new(bcd2k->card, bcd2k->card->shortname, 0, in bcd2000_init_midi()
303 strlcpy(rmidi->name, bcd2k->card->shortname, sizeof(rmidi->name)); in bcd2000_init_midi()
305 rmidi->info_flags = SNDRV_RAWMIDI_INFO_DUPLEX; in bcd2000_init_midi()
306 rmidi->private_data = bcd2k; in bcd2000_init_midi()
308 rmidi->info_flags |= SNDRV_RAWMIDI_INFO_OUTPUT; in bcd2000_init_midi()
312 rmidi->info_flags |= SNDRV_RAWMIDI_INFO_INPUT; in bcd2000_init_midi()
316 bcd2k->rmidi = rmidi; in bcd2000_init_midi()
318 bcd2k->midi_in_urb = usb_alloc_urb(0, GFP_KERNEL); in bcd2000_init_midi()
319 bcd2k->midi_out_urb = usb_alloc_urb(0, GFP_KERNEL); in bcd2000_init_midi()
321 if (!bcd2k->midi_in_urb || !bcd2k->midi_out_urb) { in bcd2000_init_midi()
322 dev_err(&bcd2k->dev->dev, PREFIX "usb_alloc_urb failed\n"); in bcd2000_init_midi()
323 return -ENOMEM; in bcd2000_init_midi()
326 usb_fill_int_urb(bcd2k->midi_in_urb, bcd2k->dev, in bcd2000_init_midi()
327 usb_rcvintpipe(bcd2k->dev, 0x81), in bcd2000_init_midi()
328 bcd2k->midi_in_buf, BUFSIZE, in bcd2000_init_midi()
331 usb_fill_int_urb(bcd2k->midi_out_urb, bcd2k->dev, in bcd2000_init_midi()
332 usb_sndintpipe(bcd2k->dev, 0x1), in bcd2000_init_midi()
333 bcd2k->midi_out_buf, BUFSIZE, in bcd2000_init_midi()
337 if (usb_urb_ep_type_check(bcd2k->midi_in_urb) || in bcd2000_init_midi()
338 usb_urb_ep_type_check(bcd2k->midi_out_urb)) { in bcd2000_init_midi()
339 dev_err(&bcd2k->dev->dev, "invalid MIDI EP\n"); in bcd2000_init_midi()
340 return -EINVAL; in bcd2000_init_midi()
353 usb_free_urb(bcd2k->midi_out_urb); in bcd2000_free_usb_related_resources()
354 usb_free_urb(bcd2k->midi_in_urb); in bcd2000_free_usb_related_resources()
356 if (bcd2k->intf) { in bcd2000_free_usb_related_resources()
357 usb_set_intfdata(bcd2k->intf, NULL); in bcd2000_free_usb_related_resources()
358 bcd2k->intf = NULL; in bcd2000_free_usb_related_resources()
379 return -ENOENT; in bcd2000_probe()
382 err = snd_card_new(&interface->dev, index[card_index], id[card_index], in bcd2000_probe()
389 bcd2k = card->private_data; in bcd2000_probe()
390 bcd2k->dev = interface_to_usbdev(interface); in bcd2000_probe()
391 bcd2k->card = card; in bcd2000_probe()
392 bcd2k->card_index = card_index; in bcd2000_probe()
393 bcd2k->intf = interface; in bcd2000_probe()
395 snd_card_set_dev(card, &interface->dev); in bcd2000_probe()
397 strncpy(card->driver, "snd-bcd2000", sizeof(card->driver)); in bcd2000_probe()
398 strncpy(card->shortname, "BCD2000", sizeof(card->shortname)); in bcd2000_probe()
399 usb_make_path(bcd2k->dev, usb_path, sizeof(usb_path)); in bcd2000_probe()
400 snprintf(bcd2k->card->longname, sizeof(bcd2k->card->longname), in bcd2000_probe()
419 dev_info(&bcd2k->dev->dev, PREFIX "error during probing"); in bcd2000_probe()
436 snd_card_disconnect(bcd2k->card); in bcd2000_disconnect()
440 clear_bit(bcd2k->card_index, devices_used); in bcd2000_disconnect()
442 snd_card_free_when_closed(bcd2k->card); in bcd2000_disconnect()
448 .name = "snd-bcd2000",