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 // 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 unsigned int curr_rate; 627 unsigned int tx_init_skip_cycles; 628 629 if (bebob->maudio_special_quirk) { 630 err = bebob->spec->rate->get(bebob, &curr_rate); 631 if (err < 0) 632 return err; 633 } 634 635 err = snd_bebob_stream_get_clock_src(bebob, &src); 636 if (err < 0) 637 return err; 638 639 err = start_stream(bebob, &bebob->rx_stream); 640 if (err < 0) 641 goto error; 642 643 err = start_stream(bebob, &bebob->tx_stream); 644 if (err < 0) 645 goto error; 646 647 if (!bebob->discontinuity_quirk) 648 tx_init_skip_cycles = 0; 649 else 650 tx_init_skip_cycles = 16000; 651 652 // MEMO: Some devices start packet transmission long enough after establishment of 653 // CMP connection. In the early stage of packet streaming, any device transfers 654 // NODATA packets. After several hundred cycles, it begins to multiplex event into 655 // the packet with adequate value of syt field in CIP header. Some devices are 656 // strictly to generate any discontinuity in the sequence of tx packet when they 657 // receives inadequate sequence of value in syt field of CIP header. In the case, 658 // the request to break CMP connection is often corrupted, then any transaction 659 // results in unrecoverable error, sometimes generate bus-reset. 660 err = amdtp_domain_start(&bebob->domain, tx_init_skip_cycles, true, false); 661 if (err < 0) 662 goto error; 663 664 // NOTE: 665 // The firmware customized by M-Audio uses these commands to 666 // start transmitting stream. This is not usual way. 667 if (bebob->maudio_special_quirk) { 668 err = bebob->spec->rate->set(bebob, curr_rate); 669 if (err < 0) { 670 dev_err(&bebob->unit->device, 671 "fail to ensure sampling rate: %d\n", 672 err); 673 goto error; 674 } 675 } 676 677 // Some devices postpone start of transmission mostly for 1 sec after receives 678 // packets firstly. 679 if (!amdtp_domain_wait_ready(&bebob->domain, READY_TIMEOUT_MS)) { 680 err = -ETIMEDOUT; 681 goto error; 682 } 683 } 684 685 return 0; 686 error: 687 amdtp_domain_stop(&bebob->domain); 688 break_both_connections(bebob); 689 return err; 690 } 691 692 void snd_bebob_stream_stop_duplex(struct snd_bebob *bebob) 693 { 694 if (bebob->substreams_counter == 0) { 695 amdtp_domain_stop(&bebob->domain); 696 break_both_connections(bebob); 697 698 cmp_connection_release(&bebob->out_conn); 699 cmp_connection_release(&bebob->in_conn); 700 } 701 } 702 703 /* 704 * This function should be called before starting streams or after stopping 705 * streams. 706 */ 707 void snd_bebob_stream_destroy_duplex(struct snd_bebob *bebob) 708 { 709 amdtp_domain_destroy(&bebob->domain); 710 711 destroy_stream(bebob, &bebob->tx_stream); 712 destroy_stream(bebob, &bebob->rx_stream); 713 } 714 715 /* 716 * See: Table 50: Extended Stream Format Info Format Hierarchy Level 2’ 717 * in Additional AVC commands (Nov 2003, BridgeCo) 718 * Also 'Clause 12 AM824 sequence adaption layers' in IEC 61883-6:2005 719 */ 720 static int 721 parse_stream_formation(u8 *buf, unsigned int len, 722 struct snd_bebob_stream_formation *formation) 723 { 724 unsigned int i, e, channels, format; 725 726 /* 727 * this module can support a hierarchy combination that: 728 * Root: Audio and Music (0x90) 729 * Level 1: AM824 Compound (0x40) 730 */ 731 if ((buf[0] != 0x90) || (buf[1] != 0x40)) 732 return -ENOSYS; 733 734 /* check sampling rate */ 735 for (i = 0; i < ARRAY_SIZE(bridgeco_freq_table); i++) { 736 if (buf[2] == bridgeco_freq_table[i]) 737 break; 738 } 739 if (i == ARRAY_SIZE(bridgeco_freq_table)) 740 return -ENOSYS; 741 742 /* Avoid double count by different entries for the same rate. */ 743 memset(&formation[i], 0, sizeof(struct snd_bebob_stream_formation)); 744 745 for (e = 0; e < buf[4]; e++) { 746 channels = buf[5 + e * 2]; 747 format = buf[6 + e * 2]; 748 749 switch (format) { 750 /* IEC 60958 Conformant, currently handled as MBLA */ 751 case 0x00: 752 /* Multi bit linear audio */ 753 case 0x06: /* Raw */ 754 formation[i].pcm += channels; 755 break; 756 /* MIDI Conformant */ 757 case 0x0d: 758 formation[i].midi += channels; 759 break; 760 /* IEC 61937-3 to 7 */ 761 case 0x01: 762 case 0x02: 763 case 0x03: 764 case 0x04: 765 case 0x05: 766 /* Multi bit linear audio */ 767 case 0x07: /* DVD-Audio */ 768 case 0x0c: /* High Precision */ 769 /* One Bit Audio */ 770 case 0x08: /* (Plain) Raw */ 771 case 0x09: /* (Plain) SACD */ 772 case 0x0a: /* (Encoded) Raw */ 773 case 0x0b: /* (Encoded) SACD */ 774 /* Synchronization Stream (Stereo Raw audio) */ 775 case 0x40: 776 /* Don't care */ 777 case 0xff: 778 default: 779 return -ENOSYS; /* not supported */ 780 } 781 } 782 783 if (formation[i].pcm > AM824_MAX_CHANNELS_FOR_PCM || 784 formation[i].midi > AM824_MAX_CHANNELS_FOR_MIDI) 785 return -ENOSYS; 786 787 return 0; 788 } 789 790 static int fill_stream_formations(struct snd_bebob *bebob, u8 addr[AVC_BRIDGECO_ADDR_BYTES], 791 enum avc_bridgeco_plug_dir plug_dir, unsigned int plug_id, 792 struct snd_bebob_stream_formation *formations) 793 { 794 enum avc_bridgeco_plug_type plug_type; 795 u8 *buf; 796 unsigned int len, eid; 797 int err; 798 799 avc_bridgeco_fill_unit_addr(addr, plug_dir, AVC_BRIDGECO_PLUG_UNIT_ISOC, plug_id); 800 801 err = avc_bridgeco_get_plug_type(bebob->unit, addr, &plug_type); 802 if (err < 0) { 803 dev_err(&bebob->unit->device, 804 "Fail to get type for isoc %d plug 0: %d\n", plug_dir, err); 805 return err; 806 } else if (plug_type != AVC_BRIDGECO_PLUG_TYPE_ISOC) 807 return -ENXIO; 808 809 buf = kmalloc(FORMAT_MAXIMUM_LENGTH, GFP_KERNEL); 810 if (buf == NULL) 811 return -ENOMEM; 812 813 for (eid = 0; eid < SND_BEBOB_STRM_FMT_ENTRIES; ++eid) { 814 avc_bridgeco_fill_unit_addr(addr, plug_dir, AVC_BRIDGECO_PLUG_UNIT_ISOC, plug_id); 815 816 len = FORMAT_MAXIMUM_LENGTH; 817 err = avc_bridgeco_get_plug_strm_fmt(bebob->unit, addr, buf, &len, eid); 818 // No entries remained. 819 if (err == -EINVAL && eid > 0) { 820 err = 0; 821 break; 822 } else if (err < 0) { 823 dev_err(&bebob->unit->device, 824 "fail to get stream format %d for isoc %d plug %d:%d\n", 825 eid, plug_dir, plug_id, err); 826 break; 827 } 828 829 err = parse_stream_formation(buf, len, formations); 830 if (err < 0) 831 break; 832 } 833 834 kfree(buf); 835 return err; 836 } 837 838 static int detect_midi_ports(struct snd_bebob *bebob, 839 const struct snd_bebob_stream_formation *formats, 840 u8 addr[AVC_BRIDGECO_ADDR_BYTES], enum avc_bridgeco_plug_dir plug_dir, 841 unsigned int plug_count, unsigned int *midi_ports) 842 { 843 int i; 844 int err = 0; 845 846 *midi_ports = 0; 847 848 /// Detect the number of available MIDI ports when packet has MIDI conformant data channel. 849 for (i = 0; i < SND_BEBOB_STRM_FMT_ENTRIES; ++i) { 850 if (formats[i].midi > 0) 851 break; 852 } 853 if (i >= SND_BEBOB_STRM_FMT_ENTRIES) 854 return 0; 855 856 for (i = 0; i < plug_count; ++i) { 857 enum avc_bridgeco_plug_type plug_type; 858 unsigned int ch_count; 859 860 avc_bridgeco_fill_unit_addr(addr, plug_dir, AVC_BRIDGECO_PLUG_UNIT_EXT, i); 861 862 err = avc_bridgeco_get_plug_type(bebob->unit, addr, &plug_type); 863 if (err < 0) { 864 dev_err(&bebob->unit->device, 865 "fail to get type for external %d plug %d: %d\n", 866 plug_dir, i, err); 867 break; 868 } else if (plug_type != AVC_BRIDGECO_PLUG_TYPE_MIDI) { 869 continue; 870 } 871 872 err = avc_bridgeco_get_plug_ch_count(bebob->unit, addr, &ch_count); 873 if (err < 0) 874 break; 875 *midi_ports += ch_count; 876 } 877 878 return err; 879 } 880 881 static int 882 seek_msu_sync_input_plug(struct snd_bebob *bebob) 883 { 884 u8 plugs[AVC_PLUG_INFO_BUF_BYTES], addr[AVC_BRIDGECO_ADDR_BYTES]; 885 unsigned int i; 886 enum avc_bridgeco_plug_type type; 887 int err; 888 889 /* Get the number of Music Sub Unit for both direction. */ 890 err = avc_general_get_plug_info(bebob->unit, 0x0c, 0x00, 0x00, plugs); 891 if (err < 0) { 892 dev_err(&bebob->unit->device, 893 "fail to get info for MSU in/out plugs: %d\n", 894 err); 895 goto end; 896 } 897 898 /* seek destination plugs for 'MSU sync input' */ 899 bebob->sync_input_plug = -1; 900 for (i = 0; i < plugs[0]; i++) { 901 avc_bridgeco_fill_msu_addr(addr, AVC_BRIDGECO_PLUG_DIR_IN, i); 902 err = avc_bridgeco_get_plug_type(bebob->unit, addr, &type); 903 if (err < 0) { 904 dev_err(&bebob->unit->device, 905 "fail to get type for MSU in plug %d: %d\n", 906 i, err); 907 goto end; 908 } 909 910 if (type == AVC_BRIDGECO_PLUG_TYPE_SYNC) { 911 bebob->sync_input_plug = i; 912 break; 913 } 914 } 915 end: 916 return err; 917 } 918 919 int snd_bebob_stream_discover(struct snd_bebob *bebob) 920 { 921 const struct snd_bebob_clock_spec *clk_spec = bebob->spec->clock; 922 u8 plugs[AVC_PLUG_INFO_BUF_BYTES], addr[AVC_BRIDGECO_ADDR_BYTES]; 923 int err; 924 925 /* the number of plugs for isoc in/out, ext in/out */ 926 err = avc_general_get_plug_info(bebob->unit, 0x1f, 0x07, 0x00, plugs); 927 if (err < 0) { 928 dev_err(&bebob->unit->device, 929 "fail to get info for isoc/external in/out plugs: %d\n", 930 err); 931 goto end; 932 } 933 934 /* 935 * This module supports at least one isoc input plug and one isoc 936 * output plug. 937 */ 938 if ((plugs[0] == 0) || (plugs[1] == 0)) { 939 err = -ENOSYS; 940 goto end; 941 } 942 943 err = fill_stream_formations(bebob, addr, AVC_BRIDGECO_PLUG_DIR_IN, 0, 944 bebob->rx_stream_formations); 945 if (err < 0) 946 goto end; 947 948 err = fill_stream_formations(bebob, addr, AVC_BRIDGECO_PLUG_DIR_OUT, 0, 949 bebob->tx_stream_formations); 950 if (err < 0) 951 goto end; 952 953 err = detect_midi_ports(bebob, bebob->rx_stream_formations, addr, AVC_BRIDGECO_PLUG_DIR_IN, 954 plugs[2], &bebob->midi_input_ports); 955 if (err < 0) 956 goto end; 957 958 err = detect_midi_ports(bebob, bebob->tx_stream_formations, addr, AVC_BRIDGECO_PLUG_DIR_OUT, 959 plugs[3], &bebob->midi_output_ports); 960 if (err < 0) 961 goto end; 962 963 /* for check source of clock later */ 964 if (!clk_spec) 965 err = seek_msu_sync_input_plug(bebob); 966 end: 967 return err; 968 } 969 970 void snd_bebob_stream_lock_changed(struct snd_bebob *bebob) 971 { 972 bebob->dev_lock_changed = true; 973 wake_up(&bebob->hwdep_wait); 974 } 975 976 int snd_bebob_stream_lock_try(struct snd_bebob *bebob) 977 { 978 int err; 979 980 spin_lock_irq(&bebob->lock); 981 982 /* user land lock this */ 983 if (bebob->dev_lock_count < 0) { 984 err = -EBUSY; 985 goto end; 986 } 987 988 /* this is the first time */ 989 if (bebob->dev_lock_count++ == 0) 990 snd_bebob_stream_lock_changed(bebob); 991 err = 0; 992 end: 993 spin_unlock_irq(&bebob->lock); 994 return err; 995 } 996 997 void snd_bebob_stream_lock_release(struct snd_bebob *bebob) 998 { 999 spin_lock_irq(&bebob->lock); 1000 1001 if (WARN_ON(bebob->dev_lock_count <= 0)) 1002 goto end; 1003 if (--bebob->dev_lock_count == 0) 1004 snd_bebob_stream_lock_changed(bebob); 1005 end: 1006 spin_unlock_irq(&bebob->lock); 1007 } 1008