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 4000 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 406 static int start_stream(struct snd_bebob *bebob, struct amdtp_stream *stream) 407 { 408 struct cmp_connection *conn; 409 int err = 0; 410 411 if (stream == &bebob->rx_stream) 412 conn = &bebob->in_conn; 413 else 414 conn = &bebob->out_conn; 415 416 // channel mapping. 417 if (bebob->maudio_special_quirk == NULL) { 418 err = map_data_channels(bebob, stream); 419 if (err < 0) 420 return err; 421 } 422 423 err = cmp_connection_establish(conn); 424 if (err < 0) 425 return err; 426 427 return amdtp_domain_add_stream(&bebob->domain, stream, 428 conn->resources.channel, conn->speed); 429 } 430 431 static int init_stream(struct snd_bebob *bebob, struct amdtp_stream *stream) 432 { 433 enum amdtp_stream_direction dir_stream; 434 struct cmp_connection *conn; 435 enum cmp_direction dir_conn; 436 int err; 437 438 if (stream == &bebob->tx_stream) { 439 dir_stream = AMDTP_IN_STREAM; 440 conn = &bebob->out_conn; 441 dir_conn = CMP_OUTPUT; 442 } else { 443 dir_stream = AMDTP_OUT_STREAM; 444 conn = &bebob->in_conn; 445 dir_conn = CMP_INPUT; 446 } 447 448 err = cmp_connection_init(conn, bebob->unit, dir_conn, 0); 449 if (err < 0) 450 return err; 451 452 err = amdtp_am824_init(stream, bebob->unit, dir_stream, CIP_BLOCKING); 453 if (err < 0) { 454 cmp_connection_destroy(conn); 455 return err; 456 } 457 458 if (stream == &bebob->tx_stream) { 459 // BeBoB v3 transfers packets with these qurks: 460 // - In the beginning of streaming, the value of dbc is 461 // incremented even if no data blocks are transferred. 462 // - The value of dbc is reset suddenly. 463 if (bebob->version > 2) 464 bebob->tx_stream.flags |= CIP_EMPTY_HAS_WRONG_DBC | 465 CIP_SKIP_DBC_ZERO_CHECK; 466 467 // At high sampling rate, M-Audio special firmware transmits 468 // empty packet with the value of dbc incremented by 8 but the 469 // others are valid to IEC 61883-1. 470 if (bebob->maudio_special_quirk) 471 bebob->tx_stream.flags |= CIP_EMPTY_HAS_WRONG_DBC; 472 } 473 474 return 0; 475 } 476 477 static void destroy_stream(struct snd_bebob *bebob, struct amdtp_stream *stream) 478 { 479 amdtp_stream_destroy(stream); 480 481 if (stream == &bebob->tx_stream) 482 cmp_connection_destroy(&bebob->out_conn); 483 else 484 cmp_connection_destroy(&bebob->in_conn); 485 } 486 487 int snd_bebob_stream_init_duplex(struct snd_bebob *bebob) 488 { 489 int err; 490 491 err = init_stream(bebob, &bebob->tx_stream); 492 if (err < 0) 493 return err; 494 495 err = init_stream(bebob, &bebob->rx_stream); 496 if (err < 0) { 497 destroy_stream(bebob, &bebob->tx_stream); 498 return err; 499 } 500 501 err = amdtp_domain_init(&bebob->domain); 502 if (err < 0) { 503 destroy_stream(bebob, &bebob->tx_stream); 504 destroy_stream(bebob, &bebob->rx_stream); 505 } 506 507 return err; 508 } 509 510 static int keep_resources(struct snd_bebob *bebob, struct amdtp_stream *stream, 511 unsigned int rate, unsigned int index) 512 { 513 unsigned int pcm_channels; 514 unsigned int midi_ports; 515 struct cmp_connection *conn; 516 int err; 517 518 if (stream == &bebob->tx_stream) { 519 pcm_channels = bebob->tx_stream_formations[index].pcm; 520 midi_ports = bebob->midi_input_ports; 521 conn = &bebob->out_conn; 522 } else { 523 pcm_channels = bebob->rx_stream_formations[index].pcm; 524 midi_ports = bebob->midi_output_ports; 525 conn = &bebob->in_conn; 526 } 527 528 err = amdtp_am824_set_parameters(stream, rate, pcm_channels, midi_ports, false); 529 if (err < 0) 530 return err; 531 532 return cmp_connection_reserve(conn, amdtp_stream_get_max_payload(stream)); 533 } 534 535 int snd_bebob_stream_reserve_duplex(struct snd_bebob *bebob, unsigned int rate, 536 unsigned int frames_per_period, 537 unsigned int frames_per_buffer) 538 { 539 unsigned int curr_rate; 540 int err; 541 542 // Considering JACK/FFADO streaming: 543 // TODO: This can be removed hwdep functionality becomes popular. 544 err = check_connection_used_by_others(bebob, &bebob->rx_stream); 545 if (err < 0) 546 return err; 547 548 err = bebob->spec->rate->get(bebob, &curr_rate); 549 if (err < 0) 550 return err; 551 if (rate == 0) 552 rate = curr_rate; 553 if (curr_rate != rate) { 554 amdtp_domain_stop(&bebob->domain); 555 break_both_connections(bebob); 556 557 cmp_connection_release(&bebob->out_conn); 558 cmp_connection_release(&bebob->in_conn); 559 } 560 561 if (bebob->substreams_counter == 0 || curr_rate != rate) { 562 unsigned int index; 563 564 // NOTE: 565 // If establishing connections at first, Yamaha GO46 566 // (and maybe Terratec X24) don't generate sound. 567 // 568 // For firmware customized by M-Audio, refer to next NOTE. 569 err = bebob->spec->rate->set(bebob, rate); 570 if (err < 0) { 571 dev_err(&bebob->unit->device, 572 "fail to set sampling rate: %d\n", 573 err); 574 return err; 575 } 576 577 err = get_formation_index(rate, &index); 578 if (err < 0) 579 return err; 580 581 err = keep_resources(bebob, &bebob->tx_stream, rate, index); 582 if (err < 0) 583 return err; 584 585 err = keep_resources(bebob, &bebob->rx_stream, rate, index); 586 if (err < 0) { 587 cmp_connection_release(&bebob->out_conn); 588 return err; 589 } 590 591 err = amdtp_domain_set_events_per_period(&bebob->domain, 592 frames_per_period, frames_per_buffer); 593 if (err < 0) { 594 cmp_connection_release(&bebob->out_conn); 595 cmp_connection_release(&bebob->in_conn); 596 return err; 597 } 598 } 599 600 return 0; 601 } 602 603 int snd_bebob_stream_start_duplex(struct snd_bebob *bebob) 604 { 605 int err; 606 607 // Need no substreams. 608 if (bebob->substreams_counter == 0) 609 return -EIO; 610 611 // packet queueing error or detecting discontinuity 612 if (amdtp_streaming_error(&bebob->rx_stream) || 613 amdtp_streaming_error(&bebob->tx_stream)) { 614 amdtp_domain_stop(&bebob->domain); 615 break_both_connections(bebob); 616 } 617 618 if (!amdtp_stream_running(&bebob->rx_stream)) { 619 enum snd_bebob_clock_type src; 620 unsigned int curr_rate; 621 unsigned int tx_init_skip_cycles; 622 623 if (bebob->maudio_special_quirk) { 624 err = bebob->spec->rate->get(bebob, &curr_rate); 625 if (err < 0) 626 return err; 627 } 628 629 err = snd_bebob_stream_get_clock_src(bebob, &src); 630 if (err < 0) 631 return err; 632 633 err = start_stream(bebob, &bebob->rx_stream); 634 if (err < 0) 635 goto error; 636 637 err = start_stream(bebob, &bebob->tx_stream); 638 if (err < 0) 639 goto error; 640 641 if (!bebob->discontinuity_quirk) 642 tx_init_skip_cycles = 0; 643 else 644 tx_init_skip_cycles = 16000; 645 646 // MEMO: Some devices start packet transmission long enough after establishment of 647 // CMP connection. In the early stage of packet streaming, any device transfers 648 // NODATA packets. After several hundred cycles, it begins to multiplex event into 649 // the packet with adequate value of syt field in CIP header. Some devices are 650 // strictly to generate any discontinuity in the sequence of tx packet when they 651 // receives inadequate sequence of value in syt field of CIP header. In the case, 652 // the request to break CMP connection is often corrupted, then any transaction 653 // results in unrecoverable error, sometimes generate bus-reset. 654 err = amdtp_domain_start(&bebob->domain, tx_init_skip_cycles, true, false); 655 if (err < 0) 656 goto error; 657 658 // NOTE: 659 // The firmware customized by M-Audio uses these commands to 660 // start transmitting stream. This is not usual way. 661 if (bebob->maudio_special_quirk) { 662 err = bebob->spec->rate->set(bebob, curr_rate); 663 if (err < 0) { 664 dev_err(&bebob->unit->device, 665 "fail to ensure sampling rate: %d\n", 666 err); 667 goto error; 668 } 669 } 670 671 // Some devices postpone start of transmission mostly for 1 sec after receives 672 // packets firstly. 673 if (!amdtp_domain_wait_ready(&bebob->domain, READY_TIMEOUT_MS)) { 674 err = -ETIMEDOUT; 675 goto error; 676 } 677 } 678 679 return 0; 680 error: 681 amdtp_domain_stop(&bebob->domain); 682 break_both_connections(bebob); 683 return err; 684 } 685 686 void snd_bebob_stream_stop_duplex(struct snd_bebob *bebob) 687 { 688 if (bebob->substreams_counter == 0) { 689 amdtp_domain_stop(&bebob->domain); 690 break_both_connections(bebob); 691 692 cmp_connection_release(&bebob->out_conn); 693 cmp_connection_release(&bebob->in_conn); 694 } 695 } 696 697 /* 698 * This function should be called before starting streams or after stopping 699 * streams. 700 */ 701 void snd_bebob_stream_destroy_duplex(struct snd_bebob *bebob) 702 { 703 amdtp_domain_destroy(&bebob->domain); 704 705 destroy_stream(bebob, &bebob->tx_stream); 706 destroy_stream(bebob, &bebob->rx_stream); 707 } 708 709 /* 710 * See: Table 50: Extended Stream Format Info Format Hierarchy Level 2’ 711 * in Additional AVC commands (Nov 2003, BridgeCo) 712 * Also 'Clause 12 AM824 sequence adaption layers' in IEC 61883-6:2005 713 */ 714 static int 715 parse_stream_formation(u8 *buf, unsigned int len, 716 struct snd_bebob_stream_formation *formation) 717 { 718 unsigned int i, e, channels, format; 719 720 /* 721 * this module can support a hierarchy combination that: 722 * Root: Audio and Music (0x90) 723 * Level 1: AM824 Compound (0x40) 724 */ 725 if ((buf[0] != 0x90) || (buf[1] != 0x40)) 726 return -ENOSYS; 727 728 /* check sampling rate */ 729 for (i = 0; i < ARRAY_SIZE(bridgeco_freq_table); i++) { 730 if (buf[2] == bridgeco_freq_table[i]) 731 break; 732 } 733 if (i == ARRAY_SIZE(bridgeco_freq_table)) 734 return -ENOSYS; 735 736 /* Avoid double count by different entries for the same rate. */ 737 memset(&formation[i], 0, sizeof(struct snd_bebob_stream_formation)); 738 739 for (e = 0; e < buf[4]; e++) { 740 channels = buf[5 + e * 2]; 741 format = buf[6 + e * 2]; 742 743 switch (format) { 744 /* IEC 60958 Conformant, currently handled as MBLA */ 745 case 0x00: 746 /* Multi bit linear audio */ 747 case 0x06: /* Raw */ 748 formation[i].pcm += channels; 749 break; 750 /* MIDI Conformant */ 751 case 0x0d: 752 formation[i].midi += channels; 753 break; 754 /* IEC 61937-3 to 7 */ 755 case 0x01: 756 case 0x02: 757 case 0x03: 758 case 0x04: 759 case 0x05: 760 /* Multi bit linear audio */ 761 case 0x07: /* DVD-Audio */ 762 case 0x0c: /* High Precision */ 763 /* One Bit Audio */ 764 case 0x08: /* (Plain) Raw */ 765 case 0x09: /* (Plain) SACD */ 766 case 0x0a: /* (Encoded) Raw */ 767 case 0x0b: /* (Encoded) SACD */ 768 /* Synchronization Stream (Stereo Raw audio) */ 769 case 0x40: 770 /* Don't care */ 771 case 0xff: 772 default: 773 return -ENOSYS; /* not supported */ 774 } 775 } 776 777 if (formation[i].pcm > AM824_MAX_CHANNELS_FOR_PCM || 778 formation[i].midi > AM824_MAX_CHANNELS_FOR_MIDI) 779 return -ENOSYS; 780 781 return 0; 782 } 783 784 static int fill_stream_formations(struct snd_bebob *bebob, u8 addr[AVC_BRIDGECO_ADDR_BYTES], 785 enum avc_bridgeco_plug_dir plug_dir, unsigned int plug_id, 786 struct snd_bebob_stream_formation *formations) 787 { 788 enum avc_bridgeco_plug_type plug_type; 789 u8 *buf; 790 unsigned int len, eid; 791 int err; 792 793 avc_bridgeco_fill_unit_addr(addr, plug_dir, AVC_BRIDGECO_PLUG_UNIT_ISOC, plug_id); 794 795 err = avc_bridgeco_get_plug_type(bebob->unit, addr, &plug_type); 796 if (err < 0) { 797 dev_err(&bebob->unit->device, 798 "Fail to get type for isoc %d plug 0: %d\n", plug_dir, err); 799 return err; 800 } else if (plug_type != AVC_BRIDGECO_PLUG_TYPE_ISOC) 801 return -ENXIO; 802 803 buf = kmalloc(FORMAT_MAXIMUM_LENGTH, GFP_KERNEL); 804 if (buf == NULL) 805 return -ENOMEM; 806 807 for (eid = 0; eid < SND_BEBOB_STRM_FMT_ENTRIES; ++eid) { 808 avc_bridgeco_fill_unit_addr(addr, plug_dir, AVC_BRIDGECO_PLUG_UNIT_ISOC, plug_id); 809 810 len = FORMAT_MAXIMUM_LENGTH; 811 err = avc_bridgeco_get_plug_strm_fmt(bebob->unit, addr, buf, &len, eid); 812 // No entries remained. 813 if (err == -EINVAL && eid > 0) { 814 err = 0; 815 break; 816 } else if (err < 0) { 817 dev_err(&bebob->unit->device, 818 "fail to get stream format %d for isoc %d plug %d:%d\n", 819 eid, plug_dir, plug_id, err); 820 break; 821 } 822 823 err = parse_stream_formation(buf, len, formations); 824 if (err < 0) 825 break; 826 } 827 828 kfree(buf); 829 return err; 830 } 831 832 static int detect_midi_ports(struct snd_bebob *bebob, 833 const struct snd_bebob_stream_formation *formats, 834 u8 addr[AVC_BRIDGECO_ADDR_BYTES], enum avc_bridgeco_plug_dir plug_dir, 835 unsigned int plug_count, unsigned int *midi_ports) 836 { 837 int i; 838 int err = 0; 839 840 *midi_ports = 0; 841 842 /// Detect the number of available MIDI ports when packet has MIDI conformant data channel. 843 for (i = 0; i < SND_BEBOB_STRM_FMT_ENTRIES; ++i) { 844 if (formats[i].midi > 0) 845 break; 846 } 847 if (i >= SND_BEBOB_STRM_FMT_ENTRIES) 848 return 0; 849 850 for (i = 0; i < plug_count; ++i) { 851 enum avc_bridgeco_plug_type plug_type; 852 unsigned int ch_count; 853 854 avc_bridgeco_fill_unit_addr(addr, plug_dir, AVC_BRIDGECO_PLUG_UNIT_EXT, i); 855 856 err = avc_bridgeco_get_plug_type(bebob->unit, addr, &plug_type); 857 if (err < 0) { 858 dev_err(&bebob->unit->device, 859 "fail to get type for external %d plug %d: %d\n", 860 plug_dir, i, err); 861 break; 862 } else if (plug_type != AVC_BRIDGECO_PLUG_TYPE_MIDI) { 863 continue; 864 } 865 866 err = avc_bridgeco_get_plug_ch_count(bebob->unit, addr, &ch_count); 867 if (err < 0) 868 break; 869 *midi_ports += ch_count; 870 } 871 872 return err; 873 } 874 875 static int 876 seek_msu_sync_input_plug(struct snd_bebob *bebob) 877 { 878 u8 plugs[AVC_PLUG_INFO_BUF_BYTES], addr[AVC_BRIDGECO_ADDR_BYTES]; 879 unsigned int i; 880 enum avc_bridgeco_plug_type type; 881 int err; 882 883 /* Get the number of Music Sub Unit for both direction. */ 884 err = avc_general_get_plug_info(bebob->unit, 0x0c, 0x00, 0x00, plugs); 885 if (err < 0) { 886 dev_err(&bebob->unit->device, 887 "fail to get info for MSU in/out plugs: %d\n", 888 err); 889 goto end; 890 } 891 892 /* seek destination plugs for 'MSU sync input' */ 893 bebob->sync_input_plug = -1; 894 for (i = 0; i < plugs[0]; i++) { 895 avc_bridgeco_fill_msu_addr(addr, AVC_BRIDGECO_PLUG_DIR_IN, i); 896 err = avc_bridgeco_get_plug_type(bebob->unit, addr, &type); 897 if (err < 0) { 898 dev_err(&bebob->unit->device, 899 "fail to get type for MSU in plug %d: %d\n", 900 i, err); 901 goto end; 902 } 903 904 if (type == AVC_BRIDGECO_PLUG_TYPE_SYNC) { 905 bebob->sync_input_plug = i; 906 break; 907 } 908 } 909 end: 910 return err; 911 } 912 913 int snd_bebob_stream_discover(struct snd_bebob *bebob) 914 { 915 const struct snd_bebob_clock_spec *clk_spec = bebob->spec->clock; 916 u8 plugs[AVC_PLUG_INFO_BUF_BYTES], addr[AVC_BRIDGECO_ADDR_BYTES]; 917 int err; 918 919 /* the number of plugs for isoc in/out, ext in/out */ 920 err = avc_general_get_plug_info(bebob->unit, 0x1f, 0x07, 0x00, plugs); 921 if (err < 0) { 922 dev_err(&bebob->unit->device, 923 "fail to get info for isoc/external in/out plugs: %d\n", 924 err); 925 goto end; 926 } 927 928 /* 929 * This module supports at least one isoc input plug and one isoc 930 * output plug. 931 */ 932 if ((plugs[0] == 0) || (plugs[1] == 0)) { 933 err = -ENOSYS; 934 goto end; 935 } 936 937 err = fill_stream_formations(bebob, addr, AVC_BRIDGECO_PLUG_DIR_IN, 0, 938 bebob->rx_stream_formations); 939 if (err < 0) 940 goto end; 941 942 err = fill_stream_formations(bebob, addr, AVC_BRIDGECO_PLUG_DIR_OUT, 0, 943 bebob->tx_stream_formations); 944 if (err < 0) 945 goto end; 946 947 err = detect_midi_ports(bebob, bebob->rx_stream_formations, addr, AVC_BRIDGECO_PLUG_DIR_IN, 948 plugs[2], &bebob->midi_input_ports); 949 if (err < 0) 950 goto end; 951 952 err = detect_midi_ports(bebob, bebob->tx_stream_formations, addr, AVC_BRIDGECO_PLUG_DIR_OUT, 953 plugs[3], &bebob->midi_output_ports); 954 if (err < 0) 955 goto end; 956 957 /* for check source of clock later */ 958 if (!clk_spec) 959 err = seek_msu_sync_input_plug(bebob); 960 end: 961 return err; 962 } 963 964 void snd_bebob_stream_lock_changed(struct snd_bebob *bebob) 965 { 966 bebob->dev_lock_changed = true; 967 wake_up(&bebob->hwdep_wait); 968 } 969 970 int snd_bebob_stream_lock_try(struct snd_bebob *bebob) 971 { 972 int err; 973 974 spin_lock_irq(&bebob->lock); 975 976 /* user land lock this */ 977 if (bebob->dev_lock_count < 0) { 978 err = -EBUSY; 979 goto end; 980 } 981 982 /* this is the first time */ 983 if (bebob->dev_lock_count++ == 0) 984 snd_bebob_stream_lock_changed(bebob); 985 err = 0; 986 end: 987 spin_unlock_irq(&bebob->lock); 988 return err; 989 } 990 991 void snd_bebob_stream_lock_release(struct snd_bebob *bebob) 992 { 993 spin_lock_irq(&bebob->lock); 994 995 if (WARN_ON(bebob->dev_lock_count <= 0)) 996 goto end; 997 if (--bebob->dev_lock_count == 0) 998 snd_bebob_stream_lock_changed(bebob); 999 end: 1000 spin_unlock_irq(&bebob->lock); 1001 } 1002