Lines Matching refs:scs
32 struct scs { struct
59 struct scs *scs = stream->rmidi->private_data; in scs_output_open() argument
61 scs->output_status = 0; in scs_output_open()
62 scs->output_bytes = 1; in scs_output_open()
63 scs->output_escaped = false; in scs_output_open()
75 struct scs *scs = stream->rmidi->private_data; in scs_output_trigger() local
77 ACCESS_ONCE(scs->output) = up ? stream : NULL; in scs_output_trigger()
79 scs->output_idle = false; in scs_output_trigger()
80 tasklet_schedule(&scs->tasklet); in scs_output_trigger()
87 struct scs *scs = callback_data; in scs_write_callback() local
93 scs->transaction_running = false; in scs_write_callback()
94 tasklet_schedule(&scs->tasklet); in scs_write_callback()
132 struct scs *scs = (void *)data; in scs_output_tasklet() local
139 if (scs->transaction_running) in scs_output_tasklet()
142 stream = ACCESS_ONCE(scs->output); in scs_output_tasklet()
144 scs->output_idle = true; in scs_output_tasklet()
145 wake_up(&scs->idle_wait); in scs_output_tasklet()
149 i = scs->output_bytes; in scs_output_tasklet()
152 scs->output_bytes = i; in scs_output_tasklet()
153 scs->output_idle = true; in scs_output_tasklet()
154 wake_up(&scs->idle_wait); in scs_output_tasklet()
161 if (scs->output_escaped && byte < 0x80) { in scs_output_tasklet()
162 if (scs->output_escape_high_nibble) { in scs_output_tasklet()
164 scs->buffer[i] = byte << 4; in scs_output_tasklet()
165 scs->output_escape_high_nibble = false; in scs_output_tasklet()
168 scs->buffer[i++] |= byte & 0x0f; in scs_output_tasklet()
169 scs->output_escape_high_nibble = true; in scs_output_tasklet()
173 if (!is_valid_running_status(scs->output_status)) in scs_output_tasklet()
175 scs->buffer[0] = HSS1394_TAG_USER_DATA; in scs_output_tasklet()
176 scs->buffer[i++] = scs->output_status; in scs_output_tasklet()
178 scs->buffer[i++] = byte; in scs_output_tasklet()
179 if ((i == 3 && is_two_bytes_cmd(scs->output_status)) || in scs_output_tasklet()
180 (i == 4 && is_three_bytes_cmd(scs->output_status))) in scs_output_tasklet()
183 !memcmp(scs->buffer + 1, sysex_escape_prefix, in scs_output_tasklet()
185 scs->output_escaped = true; in scs_output_tasklet()
186 scs->output_escape_high_nibble = true; in scs_output_tasklet()
192 if (scs->output_escaped) { in scs_output_tasklet()
193 if (i >= 1 && scs->output_escape_high_nibble && in scs_output_tasklet()
194 scs->buffer[0] != HSS1394_TAG_CHANGE_ADDRESS) in scs_output_tasklet()
197 if (i > 1 && scs->output_status == 0xf0) { in scs_output_tasklet()
198 scs->buffer[i++] = 0xf7; in scs_output_tasklet()
203 scs->output_escaped = false; in scs_output_tasklet()
207 scs->buffer[0] = HSS1394_TAG_USER_DATA; in scs_output_tasklet()
208 scs->buffer[i++] = byte; in scs_output_tasklet()
209 scs->output_status = byte; in scs_output_tasklet()
210 scs->output_escaped = false; in scs_output_tasklet()
215 scs->output_bytes = 1; in scs_output_tasklet()
216 scs->output_escaped = false; in scs_output_tasklet()
218 scs->transaction_running = true; in scs_output_tasklet()
219 dev = fw_parent_device(scs->unit); in scs_output_tasklet()
222 fw_send_request(dev->card, &scs->transaction, TCODE_WRITE_BLOCK_REQUEST, in scs_output_tasklet()
224 HSS1394_ADDRESS, scs->buffer, i, in scs_output_tasklet()
225 scs_write_callback, scs); in scs_output_tasklet()
230 struct scs *scs = stream->rmidi->private_data; in scs_output_drain() local
232 wait_event(scs->idle_wait, scs->output_idle); in scs_output_drain()
244 struct scs *scs = stream->rmidi->private_data; in scs_input_open() local
246 scs->input_escape_count = 0; in scs_input_open()
258 struct scs *scs = stream->rmidi->private_data; in scs_input_trigger() local
260 ACCESS_ONCE(scs->input) = up ? stream : NULL; in scs_input_trigger()
273 static void scs_input_midi_byte(struct scs *scs, in scs_input_midi_byte() argument
277 if (scs->input_escape_count > 0) { in scs_input_midi_byte()
279 scs->input_escape_count--; in scs_input_midi_byte()
280 if (scs->input_escape_count == 0) in scs_input_midi_byte()
287 scs->input_escape_count = 3; in scs_input_midi_byte()
293 static void scs_input_packet(struct scs *scs, in scs_input_packet() argument
301 scs_input_midi_byte(scs, stream, data[i]); in scs_input_packet()
317 static int scs_create_midi(struct scs *scs) in scs_create_midi() argument
322 err = snd_rawmidi_new(scs->card, "SCS.1x", 0, 1, 1, &rmidi); in scs_create_midi()
326 "%s MIDI", scs->card->shortname); in scs_create_midi()
330 rmidi->private_data = scs; in scs_create_midi()
342 struct scs *scs = callback_data; in handle_hss() local
345 if (offset != scs->hss_handler.offset) { in handle_hss()
356 stream = ACCESS_ONCE(scs->input); in handle_hss()
358 scs_input_packet(scs, stream, data, length); in handle_hss()
364 static int scs_init_hss_address(struct scs *scs) in scs_init_hss_address() argument
370 scs->hss_handler.offset); in scs_init_hss_address()
371 err = snd_fw_transaction(scs->unit, TCODE_WRITE_BLOCK_REQUEST, in scs_init_hss_address()
374 dev_err(&scs->unit->device, "HSS1394 communication failed\n"); in scs_init_hss_address()
381 struct scs *scs = card->private_data; in scs_card_free() local
383 fw_core_remove_address_handler(&scs->hss_handler); in scs_card_free()
384 kfree(scs->buffer); in scs_card_free()
391 struct scs *scs; in scs_probe() local
395 sizeof(*scs), &card); in scs_probe()
399 scs = card->private_data; in scs_probe()
400 scs->card = card; in scs_probe()
401 scs->unit = unit; in scs_probe()
402 tasklet_init(&scs->tasklet, scs_output_tasklet, (unsigned long)scs); in scs_probe()
403 init_waitqueue_head(&scs->idle_wait); in scs_probe()
404 scs->output_idle = true; in scs_probe()
406 scs->buffer = kmalloc(HSS1394_MAX_PACKET_SIZE, GFP_KERNEL); in scs_probe()
407 if (!scs->buffer) { in scs_probe()
412 scs->hss_handler.length = HSS1394_MAX_PACKET_SIZE; in scs_probe()
413 scs->hss_handler.address_callback = handle_hss; in scs_probe()
414 scs->hss_handler.callback_data = scs; in scs_probe()
415 err = fw_core_add_address_handler(&scs->hss_handler, in scs_probe()
432 err = scs_init_hss_address(scs); in scs_probe()
436 err = scs_create_midi(scs); in scs_probe()
444 dev_set_drvdata(&unit->device, scs); in scs_probe()
449 kfree(scs->buffer); in scs_probe()
457 struct scs *scs = dev_get_drvdata(&unit->device); in scs_update() local
462 scs->hss_handler.offset); in scs_update()
465 snd_fw_transaction(scs->unit, TCODE_WRITE_BLOCK_REQUEST, in scs_update()
472 struct scs *scs = dev_get_drvdata(&unit->device); in scs_remove() local
474 snd_card_disconnect(scs->card); in scs_remove()
476 ACCESS_ONCE(scs->output) = NULL; in scs_remove()
477 ACCESS_ONCE(scs->input) = NULL; in scs_remove()
479 wait_event(scs->idle_wait, scs->output_idle); in scs_remove()
481 tasklet_kill(&scs->tasklet); in scs_remove()
483 snd_card_free_when_closed(scs->card); in scs_remove()