1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * bebob_stream.c - a part of driver for BeBoB based devices 4 * 5 * Copyright (c) 2013-2014 Takashi Sakamoto 6 */ 7 8 #include "./bebob.h" 9 10 #define READY_TIMEOUT_MS 2500 11 12 /* 13 * NOTE; 14 * For BeBoB streams, Both of input and output CMP connection are important. 15 * 16 * For most devices, each CMP connection starts to transmit/receive a 17 * corresponding stream. But for a few devices, both of CMP connection needs 18 * to start transmitting stream. An example is 'M-Audio Firewire 410'. 19 */ 20 21 /* 128 is an arbitrary length but it seems to be enough */ 22 #define FORMAT_MAXIMUM_LENGTH 128 23 24 const unsigned int snd_bebob_rate_table[SND_BEBOB_STRM_FMT_ENTRIES] = { 25 [0] = 32000, 26 [1] = 44100, 27 [2] = 48000, 28 [3] = 88200, 29 [4] = 96000, 30 [5] = 176400, 31 [6] = 192000, 32 }; 33 34 /* 35 * See: Table 51: Extended Stream Format Info ‘Sampling Frequency’ 36 * in Additional AVC commands (Nov 2003, BridgeCo) 37 */ 38 static const unsigned int bridgeco_freq_table[] = { 39 [0] = 0x02, 40 [1] = 0x03, 41 [2] = 0x04, 42 [3] = 0x0a, 43 [4] = 0x05, 44 [5] = 0x06, 45 [6] = 0x07, 46 }; 47 48 static int 49 get_formation_index(unsigned int rate, unsigned int *index) 50 { 51 unsigned int i; 52 53 for (i = 0; i < ARRAY_SIZE(snd_bebob_rate_table); i++) { 54 if (snd_bebob_rate_table[i] == rate) { 55 *index = i; 56 return 0; 57 } 58 } 59 return -EINVAL; 60 } 61 62 int 63 snd_bebob_stream_get_rate(struct snd_bebob *bebob, unsigned int *curr_rate) 64 { 65 unsigned int tx_rate, rx_rate, trials; 66 int err; 67 68 trials = 0; 69 do { 70 err = avc_general_get_sig_fmt(bebob->unit, &tx_rate, 71 AVC_GENERAL_PLUG_DIR_OUT, 0); 72 } while (err == -EAGAIN && ++trials < 3); 73 if (err < 0) 74 goto end; 75 76 trials = 0; 77 do { 78 err = avc_general_get_sig_fmt(bebob->unit, &rx_rate, 79 AVC_GENERAL_PLUG_DIR_IN, 0); 80 } while (err == -EAGAIN && ++trials < 3); 81 if (err < 0) 82 goto end; 83 84 *curr_rate = rx_rate; 85 if (rx_rate == tx_rate) 86 goto end; 87 88 /* synchronize receive stream rate to transmit stream rate */ 89 err = avc_general_set_sig_fmt(bebob->unit, rx_rate, 90 AVC_GENERAL_PLUG_DIR_IN, 0); 91 end: 92 return err; 93 } 94 95 int 96 snd_bebob_stream_set_rate(struct snd_bebob *bebob, unsigned int rate) 97 { 98 int err; 99 100 err = avc_general_set_sig_fmt(bebob->unit, rate, 101 AVC_GENERAL_PLUG_DIR_OUT, 0); 102 if (err < 0) 103 goto end; 104 105 err = avc_general_set_sig_fmt(bebob->unit, rate, 106 AVC_GENERAL_PLUG_DIR_IN, 0); 107 if (err < 0) 108 goto end; 109 110 /* 111 * Some devices need a bit time for transition. 112 * 300msec is got by some experiments. 113 */ 114 msleep(300); 115 end: 116 return err; 117 } 118 119 int snd_bebob_stream_get_clock_src(struct snd_bebob *bebob, 120 enum snd_bebob_clock_type *src) 121 { 122 const struct snd_bebob_clock_spec *clk_spec = bebob->spec->clock; 123 u8 addr[AVC_BRIDGECO_ADDR_BYTES], input[7]; 124 unsigned int id; 125 enum avc_bridgeco_plug_type type; 126 int err = 0; 127 128 /* 1.The device has its own operation to switch source of clock */ 129 if (clk_spec) { 130 err = clk_spec->get(bebob, &id); 131 if (err < 0) { 132 dev_err(&bebob->unit->device, 133 "fail to get clock source: %d\n", err); 134 goto end; 135 } 136 137 if (id >= clk_spec->num) { 138 dev_err(&bebob->unit->device, 139 "clock source %d out of range 0..%d\n", 140 id, clk_spec->num - 1); 141 err = -EIO; 142 goto end; 143 } 144 145 *src = clk_spec->types[id]; 146 goto end; 147 } 148 149 /* 150 * 2.The device don't support to switch source of clock then assumed 151 * to use internal clock always 152 */ 153 if (bebob->sync_input_plug < 0) { 154 *src = SND_BEBOB_CLOCK_TYPE_INTERNAL; 155 goto end; 156 } 157 158 /* 159 * 3.The device supports to switch source of clock by an usual way. 160 * Let's check input for 'Music Sub Unit Sync Input' plug. 161 */ 162 avc_bridgeco_fill_msu_addr(addr, AVC_BRIDGECO_PLUG_DIR_IN, 163 bebob->sync_input_plug); 164 err = avc_bridgeco_get_plug_input(bebob->unit, addr, input); 165 if (err < 0) { 166 dev_err(&bebob->unit->device, 167 "fail to get an input for MSU in plug %d: %d\n", 168 bebob->sync_input_plug, err); 169 goto end; 170 } 171 172 /* 173 * If there are no input plugs, all of fields are 0xff. 174 * Here check the first field. This field is used for direction. 175 */ 176 if (input[0] == 0xff) { 177 *src = SND_BEBOB_CLOCK_TYPE_INTERNAL; 178 goto end; 179 } 180 181 /* The source from any output plugs is for one purpose only. */ 182 if (input[0] == AVC_BRIDGECO_PLUG_DIR_OUT) { 183 /* 184 * In BeBoB architecture, the source from music subunit may 185 * bypass from oPCR[0]. This means that this source gives 186 * synchronization to IEEE 1394 cycle start packet. 187 */ 188 if (input[1] == AVC_BRIDGECO_PLUG_MODE_SUBUNIT && 189 input[2] == 0x0c) { 190 *src = SND_BEBOB_CLOCK_TYPE_INTERNAL; 191 goto end; 192 } 193 /* The source from any input units is for several purposes. */ 194 } else if (input[1] == AVC_BRIDGECO_PLUG_MODE_UNIT) { 195 if (input[2] == AVC_BRIDGECO_PLUG_UNIT_ISOC) { 196 if (input[3] == 0x00) { 197 /* 198 * This source comes from iPCR[0]. This means 199 * that presentation timestamp calculated by 200 * SYT series of the received packets. In 201 * short, this driver is the master of 202 * synchronization. 203 */ 204 *src = SND_BEBOB_CLOCK_TYPE_SYT; 205 goto end; 206 } else { 207 /* 208 * This source comes from iPCR[1-29]. This 209 * means that the synchronization stream is not 210 * the Audio/MIDI compound stream. 211 */ 212 *src = SND_BEBOB_CLOCK_TYPE_EXTERNAL; 213 goto end; 214 } 215 } else if (input[2] == AVC_BRIDGECO_PLUG_UNIT_EXT) { 216 /* Check type of this plug. */ 217 avc_bridgeco_fill_unit_addr(addr, 218 AVC_BRIDGECO_PLUG_DIR_IN, 219 AVC_BRIDGECO_PLUG_UNIT_EXT, 220 input[3]); 221 err = avc_bridgeco_get_plug_type(bebob->unit, addr, 222 &type); 223 if (err < 0) 224 goto end; 225 226 if (type == AVC_BRIDGECO_PLUG_TYPE_DIG) { 227 /* 228 * SPDIF/ADAT or sometimes (not always) word 229 * clock. 230 */ 231 *src = SND_BEBOB_CLOCK_TYPE_EXTERNAL; 232 goto end; 233 } else if (type == AVC_BRIDGECO_PLUG_TYPE_SYNC) { 234 /* Often word clock. */ 235 *src = SND_BEBOB_CLOCK_TYPE_EXTERNAL; 236 goto end; 237 } else if (type == AVC_BRIDGECO_PLUG_TYPE_ADDITION) { 238 /* 239 * Not standard. 240 * Mostly, additional internal clock. 241 */ 242 *src = SND_BEBOB_CLOCK_TYPE_INTERNAL; 243 goto end; 244 } 245 } 246 } 247 248 /* Not supported. */ 249 err = -EIO; 250 end: 251 return err; 252 } 253 254 static int map_data_channels(struct snd_bebob *bebob, struct amdtp_stream *s) 255 { 256 unsigned int sec, sections, ch, channels; 257 unsigned int pcm, midi, location; 258 unsigned int stm_pos, sec_loc, pos; 259 u8 *buf, addr[AVC_BRIDGECO_ADDR_BYTES], type; 260 enum avc_bridgeco_plug_dir dir; 261 int err; 262 263 /* 264 * The length of return value of this command cannot be expected. Here 265 * use the maximum length of FCP. 266 */ 267 buf = kzalloc(256, GFP_KERNEL); 268 if (buf == NULL) 269 return -ENOMEM; 270 271 if (s == &bebob->tx_stream) 272 dir = AVC_BRIDGECO_PLUG_DIR_OUT; 273 else 274 dir = AVC_BRIDGECO_PLUG_DIR_IN; 275 276 avc_bridgeco_fill_unit_addr(addr, dir, AVC_BRIDGECO_PLUG_UNIT_ISOC, 0); 277 err = avc_bridgeco_get_plug_ch_pos(bebob->unit, addr, buf, 256); 278 if (err < 0) { 279 dev_err(&bebob->unit->device, 280 "fail to get channel position for isoc %s plug 0: %d\n", 281 (dir == AVC_BRIDGECO_PLUG_DIR_IN) ? "in" : "out", 282 err); 283 goto end; 284 } 285 pos = 0; 286 287 /* positions in I/O buffer */ 288 pcm = 0; 289 midi = 0; 290 291 /* the number of sections in AMDTP packet */ 292 sections = buf[pos++]; 293 294 for (sec = 0; sec < sections; sec++) { 295 /* type of this section */ 296 avc_bridgeco_fill_unit_addr(addr, dir, 297 AVC_BRIDGECO_PLUG_UNIT_ISOC, 0); 298 err = avc_bridgeco_get_plug_section_type(bebob->unit, addr, 299 sec, &type); 300 if (err < 0) { 301 dev_err(&bebob->unit->device, 302 "fail to get section type for isoc %s plug 0: %d\n", 303 (dir == AVC_BRIDGECO_PLUG_DIR_IN) ? "in" : 304 "out", 305 err); 306 goto end; 307 } 308 /* NoType */ 309 if (type == 0xff) { 310 err = -ENOSYS; 311 goto end; 312 } 313 314 /* the number of channels in this section */ 315 channels = buf[pos++]; 316 317 for (ch = 0; ch < channels; ch++) { 318 /* position of this channel in AMDTP packet */ 319 stm_pos = buf[pos++] - 1; 320 /* location of this channel in this section */ 321 sec_loc = buf[pos++] - 1; 322 323 /* 324 * Basically the number of location is within the 325 * number of channels in this section. But some models 326 * of M-Audio don't follow this. Its location for MIDI 327 * is the position of MIDI channels in AMDTP packet. 328 */ 329 if (sec_loc >= channels) 330 sec_loc = ch; 331 332 switch (type) { 333 /* for MIDI conformant data channel */ 334 case 0x0a: 335 /* AMDTP_MAX_CHANNELS_FOR_MIDI is 1. */ 336 if ((midi > 0) && (stm_pos != midi)) { 337 err = -ENOSYS; 338 goto end; 339 } 340 amdtp_am824_set_midi_position(s, stm_pos); 341 midi = stm_pos; 342 break; 343 /* for PCM data channel */ 344 case 0x01: /* Headphone */ 345 case 0x02: /* Microphone */ 346 case 0x03: /* Line */ 347 case 0x04: /* SPDIF */ 348 case 0x05: /* ADAT */ 349 case 0x06: /* TDIF */ 350 case 0x07: /* MADI */ 351 /* for undefined/changeable signal */ 352 case 0x08: /* Analog */ 353 case 0x09: /* Digital */ 354 default: 355 location = pcm + sec_loc; 356 if (location >= AM824_MAX_CHANNELS_FOR_PCM) { 357 err = -ENOSYS; 358 goto end; 359 } 360 amdtp_am824_set_pcm_position(s, location, 361 stm_pos); 362 break; 363 } 364 } 365 366 if (type != 0x0a) 367 pcm += channels; 368 else 369 midi += channels; 370 } 371 end: 372 kfree(buf); 373 return err; 374 } 375 376 static int 377 check_connection_used_by_others(struct snd_bebob *bebob, struct amdtp_stream *s) 378 { 379 struct cmp_connection *conn; 380 bool used; 381 int err; 382 383 if (s == &bebob->tx_stream) 384 conn = &bebob->out_conn; 385 else 386 conn = &bebob->in_conn; 387 388 err = cmp_connection_check_used(conn, &used); 389 if ((err >= 0) && used && !amdtp_stream_running(s)) { 390 dev_err(&bebob->unit->device, 391 "Connection established by others: %cPCR[%d]\n", 392 (conn->direction == CMP_OUTPUT) ? 'o' : 'i', 393 conn->pcr_index); 394 err = -EBUSY; 395 } 396 397 return err; 398 } 399 400 static void break_both_connections(struct snd_bebob *bebob) 401 { 402 cmp_connection_break(&bebob->in_conn); 403 cmp_connection_break(&bebob->out_conn); 404 405 // These models seem to be in transition state for a longer time. When 406 // accessing in the state, any transactions is corrupted. In the worst 407 // case, the device is going to reboot. 408 if (bebob->version < 2) 409 msleep(600); 410 } 411 412 static int start_stream(struct snd_bebob *bebob, struct amdtp_stream *stream) 413 { 414 struct cmp_connection *conn; 415 int err = 0; 416 417 if (stream == &bebob->rx_stream) 418 conn = &bebob->in_conn; 419 else 420 conn = &bebob->out_conn; 421 422 // channel mapping. 423 if (bebob->maudio_special_quirk == NULL) { 424 err = map_data_channels(bebob, stream); 425 if (err < 0) 426 return err; 427 } 428 429 err = cmp_connection_establish(conn); 430 if (err < 0) 431 return err; 432 433 return amdtp_domain_add_stream(&bebob->domain, stream, 434 conn->resources.channel, conn->speed); 435 } 436 437 static int init_stream(struct snd_bebob *bebob, struct amdtp_stream *stream) 438 { 439 enum amdtp_stream_direction dir_stream; 440 struct cmp_connection *conn; 441 enum cmp_direction dir_conn; 442 int err; 443 444 if (stream == &bebob->tx_stream) { 445 dir_stream = AMDTP_IN_STREAM; 446 conn = &bebob->out_conn; 447 dir_conn = CMP_OUTPUT; 448 } else { 449 dir_stream = AMDTP_OUT_STREAM; 450 conn = &bebob->in_conn; 451 dir_conn = CMP_INPUT; 452 } 453 454 err = cmp_connection_init(conn, bebob->unit, dir_conn, 0); 455 if (err < 0) 456 return err; 457 458 err = amdtp_am824_init(stream, bebob->unit, dir_stream, CIP_BLOCKING); 459 if (err < 0) { 460 cmp_connection_destroy(conn); 461 return err; 462 } 463 464 if (stream == &bebob->tx_stream) { 465 // BeBoB v3 transfers packets with these qurks: 466 // - In the beginning of streaming, the value of dbc is 467 // incremented even if no data blocks are transferred. 468 // - The value of dbc is reset suddenly. 469 if (bebob->version > 2) 470 bebob->tx_stream.flags |= CIP_EMPTY_HAS_WRONG_DBC | 471 CIP_SKIP_DBC_ZERO_CHECK; 472 473 // At high sampling rate, M-Audio special firmware transmits 474 // empty packet with the value of dbc incremented by 8 but the 475 // others are valid to IEC 61883-1. 476 if (bebob->maudio_special_quirk) 477 bebob->tx_stream.flags |= CIP_EMPTY_HAS_WRONG_DBC; 478 } 479 480 return 0; 481 } 482 483 static void destroy_stream(struct snd_bebob *bebob, struct amdtp_stream *stream) 484 { 485 amdtp_stream_destroy(stream); 486 487 if (stream == &bebob->tx_stream) 488 cmp_connection_destroy(&bebob->out_conn); 489 else 490 cmp_connection_destroy(&bebob->in_conn); 491 } 492 493 int snd_bebob_stream_init_duplex(struct snd_bebob *bebob) 494 { 495 int err; 496 497 err = init_stream(bebob, &bebob->tx_stream); 498 if (err < 0) 499 return err; 500 501 err = init_stream(bebob, &bebob->rx_stream); 502 if (err < 0) { 503 destroy_stream(bebob, &bebob->tx_stream); 504 return err; 505 } 506 507 err = amdtp_domain_init(&bebob->domain); 508 if (err < 0) { 509 destroy_stream(bebob, &bebob->tx_stream); 510 destroy_stream(bebob, &bebob->rx_stream); 511 } 512 513 return err; 514 } 515 516 static int keep_resources(struct snd_bebob *bebob, struct amdtp_stream *stream, 517 unsigned int rate, unsigned int index) 518 { 519 unsigned int pcm_channels; 520 unsigned int midi_ports; 521 struct cmp_connection *conn; 522 int err; 523 524 if (stream == &bebob->tx_stream) { 525 pcm_channels = bebob->tx_stream_formations[index].pcm; 526 midi_ports = bebob->midi_input_ports; 527 conn = &bebob->out_conn; 528 } else { 529 pcm_channels = bebob->rx_stream_formations[index].pcm; 530 midi_ports = bebob->midi_output_ports; 531 conn = &bebob->in_conn; 532 } 533 534 err = amdtp_am824_set_parameters(stream, rate, pcm_channels, midi_ports, false); 535 if (err < 0) 536 return err; 537 538 return cmp_connection_reserve(conn, amdtp_stream_get_max_payload(stream)); 539 } 540 541 int snd_bebob_stream_reserve_duplex(struct snd_bebob *bebob, unsigned int rate, 542 unsigned int frames_per_period, 543 unsigned int frames_per_buffer) 544 { 545 unsigned int curr_rate; 546 int err; 547 548 // Considering JACK/FFADO streaming: 549 // TODO: This can be removed hwdep functionality becomes popular. 550 err = check_connection_used_by_others(bebob, &bebob->rx_stream); 551 if (err < 0) 552 return err; 553 554 err = bebob->spec->rate->get(bebob, &curr_rate); 555 if (err < 0) 556 return err; 557 if (rate == 0) 558 rate = curr_rate; 559 if (curr_rate != rate) { 560 amdtp_domain_stop(&bebob->domain); 561 break_both_connections(bebob); 562 563 cmp_connection_release(&bebob->out_conn); 564 cmp_connection_release(&bebob->in_conn); 565 } 566 567 if (bebob->substreams_counter == 0 || curr_rate != rate) { 568 unsigned int index; 569 570 // NOTE: 571 // If establishing connections at first, Yamaha GO46 572 // (and maybe Terratec X24) don't generate sound. 573 // 574 // For firmware customized by M-Audio, refer to next NOTE. 575 err = bebob->spec->rate->set(bebob, rate); 576 if (err < 0) { 577 dev_err(&bebob->unit->device, 578 "fail to set sampling rate: %d\n", 579 err); 580 return err; 581 } 582 583 err = get_formation_index(rate, &index); 584 if (err < 0) 585 return err; 586 587 err = keep_resources(bebob, &bebob->tx_stream, rate, index); 588 if (err < 0) 589 return err; 590 591 err = keep_resources(bebob, &bebob->rx_stream, rate, index); 592 if (err < 0) { 593 cmp_connection_release(&bebob->out_conn); 594 return err; 595 } 596 597 err = amdtp_domain_set_events_per_period(&bebob->domain, 598 frames_per_period, frames_per_buffer); 599 if (err < 0) { 600 cmp_connection_release(&bebob->out_conn); 601 cmp_connection_release(&bebob->in_conn); 602 return err; 603 } 604 } 605 606 return 0; 607 } 608 609 int snd_bebob_stream_start_duplex(struct snd_bebob *bebob) 610 { 611 int err; 612 613 // Need no substreams. 614 if (bebob->substreams_counter == 0) 615 return -EIO; 616 617 // packet queueing error or detecting discontinuity 618 if (amdtp_streaming_error(&bebob->rx_stream) || 619 amdtp_streaming_error(&bebob->tx_stream)) { 620 amdtp_domain_stop(&bebob->domain); 621 break_both_connections(bebob); 622 } 623 624 if (!amdtp_stream_running(&bebob->rx_stream)) { 625 enum snd_bebob_clock_type src; 626 struct amdtp_stream *master, *slave; 627 unsigned int curr_rate; 628 unsigned int tx_init_skip_cycles; 629 630 if (bebob->maudio_special_quirk) { 631 err = bebob->spec->rate->get(bebob, &curr_rate); 632 if (err < 0) 633 return err; 634 } 635 636 err = snd_bebob_stream_get_clock_src(bebob, &src); 637 if (err < 0) 638 return err; 639 640 if (src != SND_BEBOB_CLOCK_TYPE_SYT) { 641 master = &bebob->tx_stream; 642 slave = &bebob->rx_stream; 643 } else { 644 master = &bebob->rx_stream; 645 slave = &bebob->tx_stream; 646 } 647 648 err = start_stream(bebob, master); 649 if (err < 0) 650 goto error; 651 652 err = start_stream(bebob, slave); 653 if (err < 0) 654 goto error; 655 656 // Some devices transfer isoc packets with discontinuous counter in the beginning 657 // of packet streaming. 658 if (bebob->version < 2) 659 tx_init_skip_cycles = 3200; 660 else 661 tx_init_skip_cycles = 16000; 662 err = amdtp_domain_start(&bebob->domain, tx_init_skip_cycles); 663 if (err < 0) 664 goto error; 665 666 // NOTE: 667 // The firmware customized by M-Audio uses these commands to 668 // start transmitting stream. This is not usual way. 669 if (bebob->maudio_special_quirk) { 670 err = bebob->spec->rate->set(bebob, curr_rate); 671 if (err < 0) { 672 dev_err(&bebob->unit->device, 673 "fail to ensure sampling rate: %d\n", 674 err); 675 goto error; 676 } 677 } 678 679 // Some devices postpone start of transmission mostly for 1 sec after receives 680 // packets firstly. 681 if (!amdtp_domain_wait_ready(&bebob->domain, READY_TIMEOUT_MS)) { 682 err = -ETIMEDOUT; 683 goto error; 684 } 685 } 686 687 return 0; 688 error: 689 amdtp_domain_stop(&bebob->domain); 690 break_both_connections(bebob); 691 return err; 692 } 693 694 void snd_bebob_stream_stop_duplex(struct snd_bebob *bebob) 695 { 696 if (bebob->substreams_counter == 0) { 697 amdtp_domain_stop(&bebob->domain); 698 break_both_connections(bebob); 699 700 cmp_connection_release(&bebob->out_conn); 701 cmp_connection_release(&bebob->in_conn); 702 } 703 } 704 705 /* 706 * This function should be called before starting streams or after stopping 707 * streams. 708 */ 709 void snd_bebob_stream_destroy_duplex(struct snd_bebob *bebob) 710 { 711 amdtp_domain_destroy(&bebob->domain); 712 713 destroy_stream(bebob, &bebob->tx_stream); 714 destroy_stream(bebob, &bebob->rx_stream); 715 } 716 717 /* 718 * See: Table 50: Extended Stream Format Info Format Hierarchy Level 2’ 719 * in Additional AVC commands (Nov 2003, BridgeCo) 720 * Also 'Clause 12 AM824 sequence adaption layers' in IEC 61883-6:2005 721 */ 722 static int 723 parse_stream_formation(u8 *buf, unsigned int len, 724 struct snd_bebob_stream_formation *formation) 725 { 726 unsigned int i, e, channels, format; 727 728 /* 729 * this module can support a hierarchy combination that: 730 * Root: Audio and Music (0x90) 731 * Level 1: AM824 Compound (0x40) 732 */ 733 if ((buf[0] != 0x90) || (buf[1] != 0x40)) 734 return -ENOSYS; 735 736 /* check sampling rate */ 737 for (i = 0; i < ARRAY_SIZE(bridgeco_freq_table); i++) { 738 if (buf[2] == bridgeco_freq_table[i]) 739 break; 740 } 741 if (i == ARRAY_SIZE(bridgeco_freq_table)) 742 return -ENOSYS; 743 744 /* Avoid double count by different entries for the same rate. */ 745 memset(&formation[i], 0, sizeof(struct snd_bebob_stream_formation)); 746 747 for (e = 0; e < buf[4]; e++) { 748 channels = buf[5 + e * 2]; 749 format = buf[6 + e * 2]; 750 751 switch (format) { 752 /* IEC 60958 Conformant, currently handled as MBLA */ 753 case 0x00: 754 /* Multi bit linear audio */ 755 case 0x06: /* Raw */ 756 formation[i].pcm += channels; 757 break; 758 /* MIDI Conformant */ 759 case 0x0d: 760 formation[i].midi += channels; 761 break; 762 /* IEC 61937-3 to 7 */ 763 case 0x01: 764 case 0x02: 765 case 0x03: 766 case 0x04: 767 case 0x05: 768 /* Multi bit linear audio */ 769 case 0x07: /* DVD-Audio */ 770 case 0x0c: /* High Precision */ 771 /* One Bit Audio */ 772 case 0x08: /* (Plain) Raw */ 773 case 0x09: /* (Plain) SACD */ 774 case 0x0a: /* (Encoded) Raw */ 775 case 0x0b: /* (Encoded) SACD */ 776 /* Synchronization Stream (Stereo Raw audio) */ 777 case 0x40: 778 /* Don't care */ 779 case 0xff: 780 default: 781 return -ENOSYS; /* not supported */ 782 } 783 } 784 785 if (formation[i].pcm > AM824_MAX_CHANNELS_FOR_PCM || 786 formation[i].midi > AM824_MAX_CHANNELS_FOR_MIDI) 787 return -ENOSYS; 788 789 return 0; 790 } 791 792 static int fill_stream_formations(struct snd_bebob *bebob, u8 addr[AVC_BRIDGECO_ADDR_BYTES], 793 enum avc_bridgeco_plug_dir plug_dir, unsigned int plug_id, 794 struct snd_bebob_stream_formation *formations) 795 { 796 enum avc_bridgeco_plug_type plug_type; 797 u8 *buf; 798 unsigned int len, eid; 799 int err; 800 801 avc_bridgeco_fill_unit_addr(addr, plug_dir, AVC_BRIDGECO_PLUG_UNIT_ISOC, plug_id); 802 803 err = avc_bridgeco_get_plug_type(bebob->unit, addr, &plug_type); 804 if (err < 0) { 805 dev_err(&bebob->unit->device, 806 "Fail to get type for isoc %d plug 0: %d\n", plug_dir, err); 807 return err; 808 } else if (plug_type != AVC_BRIDGECO_PLUG_TYPE_ISOC) 809 return -ENXIO; 810 811 buf = kmalloc(FORMAT_MAXIMUM_LENGTH, GFP_KERNEL); 812 if (buf == NULL) 813 return -ENOMEM; 814 815 for (eid = 0; eid < SND_BEBOB_STRM_FMT_ENTRIES; ++eid) { 816 avc_bridgeco_fill_unit_addr(addr, plug_dir, AVC_BRIDGECO_PLUG_UNIT_ISOC, plug_id); 817 818 len = FORMAT_MAXIMUM_LENGTH; 819 err = avc_bridgeco_get_plug_strm_fmt(bebob->unit, addr, buf, &len, eid); 820 // No entries remained. 821 if (err == -EINVAL && eid > 0) { 822 err = 0; 823 break; 824 } else if (err < 0) { 825 dev_err(&bebob->unit->device, 826 "fail to get stream format %d for isoc %d plug %d:%d\n", 827 eid, plug_dir, plug_id, err); 828 break; 829 } 830 831 err = parse_stream_formation(buf, len, formations); 832 if (err < 0) 833 break; 834 } 835 836 kfree(buf); 837 return err; 838 } 839 840 static int detect_midi_ports(struct snd_bebob *bebob, 841 const struct snd_bebob_stream_formation *formats, 842 u8 addr[AVC_BRIDGECO_ADDR_BYTES], enum avc_bridgeco_plug_dir plug_dir, 843 unsigned int plug_count, unsigned int *midi_ports) 844 { 845 int i; 846 int err = 0; 847 848 *midi_ports = 0; 849 850 /// Detect the number of available MIDI ports when packet has MIDI conformant data channel. 851 for (i = 0; i < SND_BEBOB_STRM_FMT_ENTRIES; ++i) { 852 if (formats[i].midi > 0) 853 break; 854 } 855 if (i >= SND_BEBOB_STRM_FMT_ENTRIES) 856 return 0; 857 858 for (i = 0; i < plug_count; ++i) { 859 enum avc_bridgeco_plug_type plug_type; 860 unsigned int ch_count; 861 862 avc_bridgeco_fill_unit_addr(addr, plug_dir, AVC_BRIDGECO_PLUG_UNIT_EXT, i); 863 864 err = avc_bridgeco_get_plug_type(bebob->unit, addr, &plug_type); 865 if (err < 0) { 866 dev_err(&bebob->unit->device, 867 "fail to get type for external %d plug %d: %d\n", 868 plug_dir, i, err); 869 break; 870 } else if (plug_type != AVC_BRIDGECO_PLUG_TYPE_MIDI) { 871 continue; 872 } 873 874 err = avc_bridgeco_get_plug_ch_count(bebob->unit, addr, &ch_count); 875 if (err < 0) 876 break; 877 *midi_ports += ch_count; 878 } 879 880 return err; 881 } 882 883 static int 884 seek_msu_sync_input_plug(struct snd_bebob *bebob) 885 { 886 u8 plugs[AVC_PLUG_INFO_BUF_BYTES], addr[AVC_BRIDGECO_ADDR_BYTES]; 887 unsigned int i; 888 enum avc_bridgeco_plug_type type; 889 int err; 890 891 /* Get the number of Music Sub Unit for both direction. */ 892 err = avc_general_get_plug_info(bebob->unit, 0x0c, 0x00, 0x00, plugs); 893 if (err < 0) { 894 dev_err(&bebob->unit->device, 895 "fail to get info for MSU in/out plugs: %d\n", 896 err); 897 goto end; 898 } 899 900 /* seek destination plugs for 'MSU sync input' */ 901 bebob->sync_input_plug = -1; 902 for (i = 0; i < plugs[0]; i++) { 903 avc_bridgeco_fill_msu_addr(addr, AVC_BRIDGECO_PLUG_DIR_IN, i); 904 err = avc_bridgeco_get_plug_type(bebob->unit, addr, &type); 905 if (err < 0) { 906 dev_err(&bebob->unit->device, 907 "fail to get type for MSU in plug %d: %d\n", 908 i, err); 909 goto end; 910 } 911 912 if (type == AVC_BRIDGECO_PLUG_TYPE_SYNC) { 913 bebob->sync_input_plug = i; 914 break; 915 } 916 } 917 end: 918 return err; 919 } 920 921 int snd_bebob_stream_discover(struct snd_bebob *bebob) 922 { 923 const struct snd_bebob_clock_spec *clk_spec = bebob->spec->clock; 924 u8 plugs[AVC_PLUG_INFO_BUF_BYTES], addr[AVC_BRIDGECO_ADDR_BYTES]; 925 int err; 926 927 /* the number of plugs for isoc in/out, ext in/out */ 928 err = avc_general_get_plug_info(bebob->unit, 0x1f, 0x07, 0x00, plugs); 929 if (err < 0) { 930 dev_err(&bebob->unit->device, 931 "fail to get info for isoc/external in/out plugs: %d\n", 932 err); 933 goto end; 934 } 935 936 /* 937 * This module supports at least one isoc input plug and one isoc 938 * output plug. 939 */ 940 if ((plugs[0] == 0) || (plugs[1] == 0)) { 941 err = -ENOSYS; 942 goto end; 943 } 944 945 err = fill_stream_formations(bebob, addr, AVC_BRIDGECO_PLUG_DIR_IN, 0, 946 bebob->rx_stream_formations); 947 if (err < 0) 948 goto end; 949 950 err = fill_stream_formations(bebob, addr, AVC_BRIDGECO_PLUG_DIR_OUT, 0, 951 bebob->tx_stream_formations); 952 if (err < 0) 953 goto end; 954 955 err = detect_midi_ports(bebob, bebob->rx_stream_formations, addr, AVC_BRIDGECO_PLUG_DIR_IN, 956 plugs[2], &bebob->midi_input_ports); 957 if (err < 0) 958 goto end; 959 960 err = detect_midi_ports(bebob, bebob->tx_stream_formations, addr, AVC_BRIDGECO_PLUG_DIR_OUT, 961 plugs[3], &bebob->midi_output_ports); 962 if (err < 0) 963 goto end; 964 965 /* for check source of clock later */ 966 if (!clk_spec) 967 err = seek_msu_sync_input_plug(bebob); 968 end: 969 return err; 970 } 971 972 void snd_bebob_stream_lock_changed(struct snd_bebob *bebob) 973 { 974 bebob->dev_lock_changed = true; 975 wake_up(&bebob->hwdep_wait); 976 } 977 978 int snd_bebob_stream_lock_try(struct snd_bebob *bebob) 979 { 980 int err; 981 982 spin_lock_irq(&bebob->lock); 983 984 /* user land lock this */ 985 if (bebob->dev_lock_count < 0) { 986 err = -EBUSY; 987 goto end; 988 } 989 990 /* this is the first time */ 991 if (bebob->dev_lock_count++ == 0) 992 snd_bebob_stream_lock_changed(bebob); 993 err = 0; 994 end: 995 spin_unlock_irq(&bebob->lock); 996 return err; 997 } 998 999 void snd_bebob_stream_lock_release(struct snd_bebob *bebob) 1000 { 1001 spin_lock_irq(&bebob->lock); 1002 1003 if (WARN_ON(bebob->dev_lock_count <= 0)) 1004 goto end; 1005 if (--bebob->dev_lock_count == 0) 1006 snd_bebob_stream_lock_changed(bebob); 1007 end: 1008 spin_unlock_irq(&bebob->lock); 1009 } 1010