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