sound/usb/usx2y/us144mkii_midi.c

Source file repositories/reference/linux-study-clean/sound/usb/usx2y/us144mkii_midi.c

File Facts

System
Linux kernel
Corpus path
sound/usb/usx2y/us144mkii_midi.c
Extension
.c
Size
10782 bytes
Lines
404
Domain
Driver Families
Bucket
sound/usb
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (atomic_xchg(&tascam->midi_in_active, 1) == 0) {
			scoped_guard(spinlock_irqsave, &tascam->midi_in_lock)
			{
				kfifo_reset(&tascam->midi_in_fifo);
			}

			for (i = 0; i < NUM_MIDI_IN_URBS; i++) {
				usb_get_urb(tascam->midi_in_urbs[i]);
				usb_anchor_urb(tascam->midi_in_urbs[i],
						       &tascam->midi_in_anchor);
				err = usb_submit_urb(tascam->midi_in_urbs[i],
							     GFP_KERNEL);
				if (err < 0) {
					dev_err(tascam->card->dev,
						"Failed to submit MIDI IN URB %d: %d\n",
						i, err);
					usb_unanchor_urb(
							tascam->midi_in_urbs[i]);
					usb_put_urb(tascam->midi_in_urbs[i]);
				}
			}
		}
	} else {
		if (atomic_xchg(&tascam->midi_in_active, 0) == 1) {
			usb_kill_anchored_urbs(&tascam->midi_in_anchor);
			cancel_work_sync(&tascam->midi_in_work);
		}
	}
}

/*
 * tascam_midi_in_ops - ALSA rawmidi operations for MIDI input.
 *
 * This structure defines the callback functions for MIDI input stream
 * operations, including open, close, and trigger.
 */
static const struct snd_rawmidi_ops tascam_midi_in_ops = {
	.open = tascam_midi_in_open,
	.close = tascam_midi_in_close,
	.trigger = tascam_midi_in_trigger,
};

void tascam_midi_out_urb_complete(struct urb *urb)
{
	struct tascam_card *tascam = urb->context;
	int i, urb_index = -1;

	if (urb->status) {
		if (urb->status != -ENOENT && urb->status != -ECONNRESET &&
		    urb->status != -ESHUTDOWN) {
			dev_err_ratelimited(tascam->card->dev,
					    "MIDI OUT URB failed: %d\n",
					    urb->status);
		}
		goto out;
	}

	if (!tascam)
		goto out;

	for (i = 0; i < NUM_MIDI_OUT_URBS; i++) {
		if (tascam->midi_out_urbs[i] == urb) {
			urb_index = i;
			break;
		}
	}

	if (urb_index < 0) {
		dev_err_ratelimited(tascam->card->dev,
				    "Unknown MIDI OUT URB completed!\n");
		goto out;
	}

	scoped_guard(spinlock_irqsave, &tascam->midi_out_lock)
	{
		clear_bit(urb_index, &tascam->midi_out_urbs_in_flight);
	}

	if (atomic_read(&tascam->midi_out_active))
		schedule_work(&tascam->midi_out_work);

out:
	usb_put_urb(urb);
}

/*
 * tascam_midi_out_work_handler() - Deferred work for sending MIDI data
 * @work: The work_struct instance.
 *
 * This function handles the proprietary output protocol: take the raw MIDI

Annotation

Implementation Notes