Lines Matching +full:reg +full:- +full:data

1 // SPDX-License-Identifier: GPL-2.0
2 // ff-protocol-former.c - a part of driver for RME Fireface series
17 static int parse_clock_bits(u32 data, unsigned int *rate, in parse_clock_bits() argument
48 if ((data & 0x0000001e) == rate_entry->mask) { in parse_clock_bits()
49 *rate = rate_entry->rate; in parse_clock_bits()
54 return -EIO; in parse_clock_bits()
56 if (data & 0x00000001) { in parse_clock_bits()
61 if ((data & 0x00001c00) == clk_entry->mask) { in parse_clock_bits()
62 *src = clk_entry->src; in parse_clock_bits()
67 return -EIO; in parse_clock_bits()
76 __le32 reg; in former_get_clock() local
77 u32 data; in former_get_clock() local
80 err = snd_fw_transaction(ff->unit, TCODE_READ_QUADLET_REQUEST, in former_get_clock()
81 FORMER_REG_CLOCK_CONFIG, &reg, sizeof(reg), 0); in former_get_clock()
84 data = le32_to_cpu(reg); in former_get_clock()
86 return parse_clock_bits(data, rate, src); in former_get_clock()
92 __le32 *reg; in former_switch_fetching_mode() local
98 count = max(count, ff->spec->pcm_playback_channels[i]); in former_switch_fetching_mode()
100 reg = kcalloc(count, sizeof(__le32), GFP_KERNEL); in former_switch_fetching_mode()
101 if (!reg) in former_switch_fetching_mode()
102 return -ENOMEM; in former_switch_fetching_mode()
106 * Each quadlet is corresponding to data channels in a data in former_switch_fetching_mode()
108 * data channels should be enabled. Here, I take second best in former_switch_fetching_mode()
109 * to fetch PCM frames from all of data channels regardless of in former_switch_fetching_mode()
113 reg[i] = cpu_to_le32(0x00000001); in former_switch_fetching_mode()
116 err = snd_fw_transaction(ff->unit, TCODE_WRITE_BLOCK_REQUEST, in former_switch_fetching_mode()
117 FORMER_REG_FETCH_PCM_FRAMES, reg, in former_switch_fetching_mode()
119 kfree(reg); in former_switch_fetching_mode()
125 __le32 reg; in dump_clock_config() local
126 u32 data; in dump_clock_config() local
132 err = snd_fw_transaction(ff->unit, TCODE_READ_BLOCK_REQUEST, in dump_clock_config()
133 FORMER_REG_CLOCK_CONFIG, &reg, sizeof(reg), 0); in dump_clock_config()
136 data = le32_to_cpu(reg); in dump_clock_config()
139 (data & 0x00000020) ? "Professional" : "Consumer", in dump_clock_config()
140 (data & 0x00000040) ? "on" : "off"); in dump_clock_config()
143 (data & 0x00000100) ? "S/PDIF" : "ADAT"); in dump_clock_config()
146 (data & 0x00002000) ? "on" : "off"); in dump_clock_config()
149 (data & 0x00000200) ? "Optical" : "Coaxial"); in dump_clock_config()
151 err = parse_clock_bits(data, &rate, &src); in dump_clock_config()
197 __le32 reg[2]; in dump_sync_status() local
198 u32 data[2]; in dump_sync_status() local
202 err = snd_fw_transaction(ff->unit, TCODE_READ_BLOCK_REQUEST, in dump_sync_status()
203 FORMER_REG_SYNC_STATUS, reg, sizeof(reg), 0); in dump_sync_status()
206 data[0] = le32_to_cpu(reg[0]); in dump_sync_status()
207 data[1] = le32_to_cpu(reg[1]); in dump_sync_status()
215 if (data[0] & clk_entry->locked_mask) { in dump_sync_status()
216 if (data[0] & clk_entry->synced_mask) in dump_sync_status()
224 snd_iprintf(buffer, "%s: %s\n", clk_entry->label, state); in dump_sync_status()
229 if (data[1] & 0x00000001) { in dump_sync_status()
237 if ((data[0] & 0x1e0000) == referred_entry->mask) { in dump_sync_status()
238 label = referred_entry->label; in dump_sync_status()
247 if ((data[0] & 0x1e000000) == rate_entry->mask) { in dump_sync_status()
248 rate = rate_entry->rate; in dump_sync_status()
270 u8 *buf = (u8 *)ff->msg_buf[port]; in former_fill_midi_msg()
280 for (i = len - 1; i >= 0; --i) in former_fill_midi_msg()
281 ff->msg_buf[port][i] = cpu_to_le32(buf[i]); in former_fill_midi_msg()
282 ff->rx_bytes[port] = len; in former_fill_midi_msg()
298 __le32 reg; in allocate_tx_resources() local
303 reg = cpu_to_le32(ff->tx_stream.data_block_quadlets); in allocate_tx_resources()
304 err = snd_fw_transaction(ff->unit, TCODE_WRITE_QUADLET_REQUEST, in allocate_tx_resources()
305 FF800_ALLOC_TX_STREAM, &reg, sizeof(reg), 0); in allocate_tx_resources()
312 u32 data; in allocate_tx_resources() local
313 err = snd_fw_transaction(ff->unit, TCODE_READ_QUADLET_REQUEST, in allocate_tx_resources()
314 FF800_TX_PACKET_ISOC_CH, &reg, sizeof(reg), 0); in allocate_tx_resources()
318 data = le32_to_cpu(reg); in allocate_tx_resources()
319 if (data != 0xffffffff) { in allocate_tx_resources()
320 tx_isoc_channel = data; in allocate_tx_resources()
327 return -ETIMEDOUT; in allocate_tx_resources()
332 ff->tx_resources.channel = tx_isoc_channel; in allocate_tx_resources()
339 u32 data; in ff800_allocate_resources() local
340 __le32 reg; in ff800_allocate_resources() local
343 reg = cpu_to_le32(rate); in ff800_allocate_resources()
344 err = snd_fw_transaction(ff->unit, TCODE_WRITE_QUADLET_REQUEST, in ff800_allocate_resources()
345 FF800_STF, &reg, sizeof(reg), 0); in ff800_allocate_resources()
355 err = fw_iso_resources_allocate(&ff->rx_resources, in ff800_allocate_resources()
356 amdtp_stream_get_max_payload(&ff->rx_stream), in ff800_allocate_resources()
357 fw_parent_device(ff->unit)->max_speed); in ff800_allocate_resources()
364 data = ff->rx_stream.data_block_quadlets << 3; in ff800_allocate_resources()
365 data = (data << 8) | ff->rx_resources.channel; in ff800_allocate_resources()
366 reg = cpu_to_le32(data); in ff800_allocate_resources()
367 err = snd_fw_transaction(ff->unit, TCODE_WRITE_QUADLET_REQUEST, in ff800_allocate_resources()
368 FF800_RX_PACKET_FORMAT, &reg, sizeof(reg), 0); in ff800_allocate_resources()
377 unsigned int generation = ff->rx_resources.generation; in ff800_begin_session()
378 __le32 reg; in ff800_begin_session() local
380 if (generation != fw_parent_device(ff->unit)->card->generation) { in ff800_begin_session()
381 int err = fw_iso_resources_update(&ff->rx_resources); in ff800_begin_session()
386 reg = cpu_to_le32(0x80000000); in ff800_begin_session()
387 reg |= cpu_to_le32(ff->tx_stream.data_block_quadlets); in ff800_begin_session()
388 if (fw_parent_device(ff->unit)->max_speed == SCODE_800) in ff800_begin_session()
389 reg |= cpu_to_le32(FF800_TX_S800_FLAG); in ff800_begin_session()
390 return snd_fw_transaction(ff->unit, TCODE_WRITE_QUADLET_REQUEST, in ff800_begin_session()
391 FF800_ISOC_COMM_START, &reg, sizeof(reg), 0); in ff800_begin_session()
396 __le32 reg; in ff800_finish_session() local
398 reg = cpu_to_le32(0x80000000); in ff800_finish_session()
399 snd_fw_transaction(ff->unit, TCODE_WRITE_QUADLET_REQUEST, in ff800_finish_session()
400 FF800_ISOC_COMM_STOP, &reg, sizeof(reg), 0); in ff800_finish_session()
416 substream = READ_ONCE(ff->tx_midi_substreams[0]); in ff800_handle_midi_msg()
443 __le32 reg; in ff400_allocate_resources() local
454 return -EINVAL; in ff400_allocate_resources()
456 // Set the number of data blocks transferred in a second. in ff400_allocate_resources()
457 reg = cpu_to_le32(rate); in ff400_allocate_resources()
458 err = snd_fw_transaction(ff->unit, TCODE_WRITE_QUADLET_REQUEST, in ff400_allocate_resources()
459 FF400_STF, &reg, sizeof(reg), 0); in ff400_allocate_resources()
469 // Keep resources for in-stream. in ff400_allocate_resources()
470 ff->tx_resources.channels_mask = 0x00000000000000ffuLL; in ff400_allocate_resources()
471 err = fw_iso_resources_allocate(&ff->tx_resources, in ff400_allocate_resources()
472 amdtp_stream_get_max_payload(&ff->tx_stream), in ff400_allocate_resources()
473 fw_parent_device(ff->unit)->max_speed); in ff400_allocate_resources()
477 // Keep resources for out-stream. in ff400_allocate_resources()
478 ff->rx_resources.channels_mask = 0x00000000000000ffuLL; in ff400_allocate_resources()
479 err = fw_iso_resources_allocate(&ff->rx_resources, in ff400_allocate_resources()
480 amdtp_stream_get_max_payload(&ff->rx_stream), in ff400_allocate_resources()
481 fw_parent_device(ff->unit)->max_speed); in ff400_allocate_resources()
483 fw_iso_resources_free(&ff->tx_resources); in ff400_allocate_resources()
490 unsigned int generation = ff->rx_resources.generation; in ff400_begin_session()
491 __le32 reg; in ff400_begin_session() local
494 if (generation != fw_parent_device(ff->unit)->card->generation) { in ff400_begin_session()
495 err = fw_iso_resources_update(&ff->tx_resources); in ff400_begin_session()
499 err = fw_iso_resources_update(&ff->rx_resources); in ff400_begin_session()
506 reg = cpu_to_le32(((ff->rx_stream.data_block_quadlets << 3) << 8) | in ff400_begin_session()
507 ff->rx_resources.channel); in ff400_begin_session()
508 err = snd_fw_transaction(ff->unit, TCODE_WRITE_QUADLET_REQUEST, in ff400_begin_session()
509 FF400_RX_PACKET_FORMAT, &reg, sizeof(reg), 0); in ff400_begin_session()
516 reg = cpu_to_le32((0x80 << 24) | in ff400_begin_session()
517 (ff->tx_resources.channel << 5) | in ff400_begin_session()
518 (ff->tx_stream.data_block_quadlets)); in ff400_begin_session()
519 err = snd_fw_transaction(ff->unit, TCODE_WRITE_QUADLET_REQUEST, in ff400_begin_session()
520 FF400_TX_PACKET_FORMAT, &reg, sizeof(reg), 0); in ff400_begin_session()
525 reg = cpu_to_le32(0x00000001); in ff400_begin_session()
526 return snd_fw_transaction(ff->unit, TCODE_WRITE_QUADLET_REQUEST, in ff400_begin_session()
527 FF400_ISOC_COMM_START, &reg, sizeof(reg), 0); in ff400_begin_session()
532 __le32 reg; in ff400_finish_session() local
534 reg = cpu_to_le32(0x80000000); in ff400_finish_session()
535 snd_fw_transaction(ff->unit, TCODE_WRITE_QUADLET_REQUEST, in ff400_finish_session()
536 FF400_ISOC_COMM_STOP, &reg, sizeof(reg), 0); in ff400_finish_session()
544 // - 0x04000000: 0x'....'....'0000'0000
545 // - 0x08000000: 0x'....'....'0000'0080
546 // - 0x10000000: 0x'....'....'0000'0100
547 // - 0x20000000: 0x'....'....'0000'0180
551 // - 0x01000000: suppress transmission
552 // - 0x02000000: suppress transmission
554 // Actually, the register is write-only and includes the other options such as
577 substream = READ_ONCE(ff->tx_midi_substreams[0]); in ff400_handle_midi_msg()
587 substream = READ_ONCE(ff->tx_midi_substreams[1]); in ff400_handle_midi_msg()