Lines Matching defs:oxfw

8 #include "oxfw.h"
41 static int set_rate(struct snd_oxfw *oxfw, unsigned int rate)
45 err = avc_general_set_sig_fmt(oxfw->unit, rate,
50 if (oxfw->has_output)
51 err = avc_general_set_sig_fmt(oxfw->unit, rate,
57 static int set_stream_format(struct snd_oxfw *oxfw, struct amdtp_stream *s,
66 if (s == &oxfw->tx_stream) {
67 formats = oxfw->tx_stream_formats;
70 formats = oxfw->rx_stream_formats;
87 if (oxfw->assumed)
88 return set_rate(oxfw, rate);
93 err = avc_stream_set_format(oxfw->unit, dir, 0, formats[i], len);
103 static int start_stream(struct snd_oxfw *oxfw, struct amdtp_stream *stream)
108 if (stream == &oxfw->rx_stream)
109 conn = &oxfw->in_conn;
111 conn = &oxfw->out_conn;
117 err = amdtp_domain_add_stream(&oxfw->domain, stream,
127 static int check_connection_used_by_others(struct snd_oxfw *oxfw,
134 if (stream == &oxfw->tx_stream)
135 conn = &oxfw->out_conn;
137 conn = &oxfw->in_conn;
141 dev_err(&oxfw->unit->device,
151 static int init_stream(struct snd_oxfw *oxfw, struct amdtp_stream *stream)
159 if (!(oxfw->quirks & SND_OXFW_QUIRK_BLOCKING_TRANSMISSION))
168 if (!(oxfw->quirks & SND_OXFW_QUIRK_IGNORE_NO_INFO_PACKET))
171 if (stream == &oxfw->tx_stream) {
172 conn = &oxfw->out_conn;
176 if (oxfw->quirks & SND_OXFW_QUIRK_JUMBO_PAYLOAD)
178 if (oxfw->quirks & SND_OXFW_QUIRK_WRONG_DBS)
181 conn = &oxfw->in_conn;
186 err = cmp_connection_init(conn, oxfw->unit, c_dir, 0);
190 err = amdtp_am824_init(stream, oxfw->unit, s_dir, flags);
199 static int keep_resources(struct snd_oxfw *oxfw, struct amdtp_stream *stream)
208 if (stream == &oxfw->rx_stream) {
210 formats = oxfw->rx_stream_formats;
211 conn = &oxfw->in_conn;
214 formats = oxfw->tx_stream_formats;
215 conn = &oxfw->out_conn;
218 err = snd_oxfw_stream_get_current_formation(oxfw, dir, &formation);
251 int snd_oxfw_stream_reserve_duplex(struct snd_oxfw *oxfw,
263 err = check_connection_used_by_others(oxfw, &oxfw->rx_stream);
266 if (oxfw->has_output) {
267 err = check_connection_used_by_others(oxfw, &oxfw->tx_stream);
272 if (stream == &oxfw->tx_stream)
277 err = snd_oxfw_stream_get_current_formation(oxfw, dir, &formation);
285 amdtp_domain_stop(&oxfw->domain);
287 cmp_connection_break(&oxfw->in_conn);
288 cmp_connection_release(&oxfw->in_conn);
290 if (oxfw->has_output) {
291 cmp_connection_break(&oxfw->out_conn);
292 cmp_connection_release(&oxfw->out_conn);
296 if (oxfw->substreams_count == 0 ||
298 err = set_stream_format(oxfw, stream, rate, pcm_channels);
300 dev_err(&oxfw->unit->device,
305 err = keep_resources(oxfw, &oxfw->rx_stream);
309 if (oxfw->has_output) {
310 err = keep_resources(oxfw, &oxfw->tx_stream);
312 cmp_connection_release(&oxfw->in_conn);
317 err = amdtp_domain_set_events_per_period(&oxfw->domain,
320 cmp_connection_release(&oxfw->in_conn);
321 if (oxfw->has_output)
322 cmp_connection_release(&oxfw->out_conn);
330 int snd_oxfw_stream_start_duplex(struct snd_oxfw *oxfw)
334 if (oxfw->substreams_count == 0)
337 if (amdtp_streaming_error(&oxfw->rx_stream) ||
338 amdtp_streaming_error(&oxfw->tx_stream)) {
339 amdtp_domain_stop(&oxfw->domain);
341 cmp_connection_break(&oxfw->in_conn);
342 if (oxfw->has_output)
343 cmp_connection_break(&oxfw->out_conn);
346 if (!amdtp_stream_running(&oxfw->rx_stream)) {
350 err = start_stream(oxfw, &oxfw->rx_stream);
352 dev_err(&oxfw->unit->device,
357 if (oxfw->has_output &&
358 !amdtp_stream_running(&oxfw->tx_stream)) {
359 err = start_stream(oxfw, &oxfw->tx_stream);
361 dev_err(&oxfw->unit->device,
366 if (oxfw->quirks & SND_OXFW_QUIRK_JUMBO_PAYLOAD) {
370 } else if (oxfw->quirks & SND_OXFW_QUIRK_VOLUNTARY_RECOVERY) {
373 // ALSA oxfw driver.
383 err = amdtp_domain_start(&oxfw->domain, tx_init_skip_cycles, replay_seq, false);
387 if (!amdtp_domain_wait_ready(&oxfw->domain, READY_TIMEOUT_MS)) {
395 amdtp_domain_stop(&oxfw->domain);
397 cmp_connection_break(&oxfw->in_conn);
398 if (oxfw->has_output)
399 cmp_connection_break(&oxfw->out_conn);
404 void snd_oxfw_stream_stop_duplex(struct snd_oxfw *oxfw)
406 if (oxfw->substreams_count == 0) {
407 amdtp_domain_stop(&oxfw->domain);
409 cmp_connection_break(&oxfw->in_conn);
410 cmp_connection_release(&oxfw->in_conn);
412 if (oxfw->has_output) {
413 cmp_connection_break(&oxfw->out_conn);
414 cmp_connection_release(&oxfw->out_conn);
419 static void destroy_stream(struct snd_oxfw *oxfw, struct amdtp_stream *stream)
423 if (stream == &oxfw->tx_stream)
424 conn = &oxfw->out_conn;
426 conn = &oxfw->in_conn;
432 int snd_oxfw_stream_init_duplex(struct snd_oxfw *oxfw)
436 err = init_stream(oxfw, &oxfw->rx_stream);
440 if (oxfw->has_output) {
441 err = init_stream(oxfw, &oxfw->tx_stream);
443 destroy_stream(oxfw, &oxfw->rx_stream);
448 err = amdtp_domain_init(&oxfw->domain);
450 destroy_stream(oxfw, &oxfw->rx_stream);
451 if (oxfw->has_output)
452 destroy_stream(oxfw, &oxfw->tx_stream);
460 void snd_oxfw_stream_destroy_duplex(struct snd_oxfw *oxfw)
462 amdtp_domain_destroy(&oxfw->domain);
464 destroy_stream(oxfw, &oxfw->rx_stream);
466 if (oxfw->has_output)
467 destroy_stream(oxfw, &oxfw->tx_stream);
470 void snd_oxfw_stream_update_duplex(struct snd_oxfw *oxfw)
472 amdtp_domain_stop(&oxfw->domain);
474 cmp_connection_break(&oxfw->in_conn);
476 amdtp_stream_pcm_abort(&oxfw->rx_stream);
478 if (oxfw->has_output) {
479 cmp_connection_break(&oxfw->out_conn);
481 amdtp_stream_pcm_abort(&oxfw->tx_stream);
485 int snd_oxfw_stream_get_current_formation(struct snd_oxfw *oxfw,
498 err = avc_stream_get_format_single(oxfw->unit, dir, 0, format, &len);
595 assume_stream_formats(struct snd_oxfw *oxfw, enum avc_general_plug_dir dir,
604 err = avc_stream_get_format_single(oxfw->unit, dir, pid, buf, len);
606 dev_err(&oxfw->unit->device,
619 formats[eid] = devm_kmemdup(&oxfw->card->card_dev, buf, *len,
631 err = avc_general_inquiry_sig_fmt(oxfw->unit,
638 formats[eid] = devm_kmemdup(&oxfw->card->card_dev, buf, *len,
648 oxfw->assumed = true;
653 static int fill_stream_formats(struct snd_oxfw *oxfw,
667 formats = oxfw->tx_stream_formats;
669 formats = oxfw->rx_stream_formats;
673 err = avc_stream_get_format_list(oxfw->unit, dir, 0, buf, &len, 0);
677 err = assume_stream_formats(oxfw, dir, pid, buf, &len,
681 dev_err(&oxfw->unit->device,
701 formats[eid] = devm_kmemdup(&oxfw->card->card_dev, buf, len,
710 err = avc_stream_get_format_list(oxfw->unit, dir, 0,
717 dev_err(&oxfw->unit->device,
730 int snd_oxfw_stream_discover(struct snd_oxfw *oxfw)
739 err = avc_general_get_plug_info(oxfw->unit, 0x1f, 0x07, 0x00, plugs);
741 dev_err(&oxfw->unit->device,
752 err = fill_stream_formats(oxfw, AVC_GENERAL_PLUG_DIR_OUT, 0);
761 format = oxfw->tx_stream_formats[i];
771 oxfw->midi_input_ports = 1;
774 oxfw->has_output = true;
780 err = fill_stream_formats(oxfw, AVC_GENERAL_PLUG_DIR_IN, 0);
789 format = oxfw->rx_stream_formats[i];
799 oxfw->midi_output_ports = 1;
802 oxfw->has_input = true;
809 void snd_oxfw_stream_lock_changed(struct snd_oxfw *oxfw)
811 oxfw->dev_lock_changed = true;
812 wake_up(&oxfw->hwdep_wait);
815 int snd_oxfw_stream_lock_try(struct snd_oxfw *oxfw)
819 spin_lock_irq(&oxfw->lock);
822 if (oxfw->dev_lock_count < 0) {
828 if (oxfw->dev_lock_count++ == 0)
829 snd_oxfw_stream_lock_changed(oxfw);
832 spin_unlock_irq(&oxfw->lock);
836 void snd_oxfw_stream_lock_release(struct snd_oxfw *oxfw)
838 spin_lock_irq(&oxfw->lock);
840 if (WARN_ON(oxfw->dev_lock_count <= 0))
842 if (--oxfw->dev_lock_count == 0)
843 snd_oxfw_stream_lock_changed(oxfw);
845 spin_unlock_irq(&oxfw->lock);