aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/firewire/amdtp.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/sound/firewire/amdtp.c b/sound/firewire/amdtp.c
index 16fe858925bd..38013f918869 100644
--- a/sound/firewire/amdtp.c
+++ b/sound/firewire/amdtp.c
@@ -20,12 +20,28 @@
20 20
21#define TRANSFER_DELAY_TICKS 0x2e00 /* 479.17 µs */ 21#define TRANSFER_DELAY_TICKS 0x2e00 /* 479.17 µs */
22 22
23/* isochronous header parameters */
24#define ISO_DATA_LENGTH_SHIFT 16
23#define TAG_CIP 1 25#define TAG_CIP 1
24 26
27/* common isochronous packet header parameters */
25#define CIP_EOH (1u << 31) 28#define CIP_EOH (1u << 31)
29#define CIP_EOH_MASK 0x80000000
26#define CIP_FMT_AM (0x10 << 24) 30#define CIP_FMT_AM (0x10 << 24)
27#define AMDTP_FDF_AM824 (0 << 19) 31#define CIP_FMT_MASK 0x3f000000
28#define AMDTP_FDF_SFC_SHIFT 16 32#define CIP_SYT_MASK 0x0000ffff
33#define CIP_SYT_NO_INFO 0xffff
34#define CIP_FDF_MASK 0x00ff0000
35#define CIP_FDF_SFC_SHIFT 16
36
37/*
38 * Audio and Music transfer protocol specific parameters
39 * only "Clock-based rate control mode" is supported
40 */
41#define AMDTP_FDF_AM824 (0 << (CIP_FDF_SFC_SHIFT + 3))
42#define AMDTP_DBS_MASK 0x00ff0000
43#define AMDTP_DBS_SHIFT 16
44#define AMDTP_DBC_MASK 0x000000ff
29 45
30/* TODO: make these configurable */ 46/* TODO: make these configurable */
31#define INTERRUPT_INTERVAL 16 47#define INTERRUPT_INTERVAL 16
@@ -280,9 +296,9 @@ static unsigned int calculate_syt(struct amdtp_stream *s,
280 syt = (cycle + syt_offset / TICKS_PER_CYCLE) << 12; 296 syt = (cycle + syt_offset / TICKS_PER_CYCLE) << 12;
281 syt += syt_offset % TICKS_PER_CYCLE; 297 syt += syt_offset % TICKS_PER_CYCLE;
282 298
283 return syt & 0xffff; 299 return syt & CIP_SYT_MASK;
284 } else { 300 } else {
285 return 0xffff; /* no info */ 301 return CIP_SYT_NO_INFO;
286 } 302 }
287} 303}
288 304
@@ -438,17 +454,17 @@ static void queue_out_packet(struct amdtp_stream *s, unsigned int cycle)
438 syt = calculate_syt(s, cycle); 454 syt = calculate_syt(s, cycle);
439 if (!(s->flags & CIP_BLOCKING)) 455 if (!(s->flags & CIP_BLOCKING))
440 data_blocks = calculate_data_blocks(s); 456 data_blocks = calculate_data_blocks(s);
441 else if (syt != 0xffff) 457 else if (syt != CIP_SYT_NO_INFO)
442 data_blocks = s->syt_interval; 458 data_blocks = s->syt_interval;
443 else 459 else
444 data_blocks = 0; 460 data_blocks = 0;
445 461
446 buffer = s->buffer.packets[index].buffer; 462 buffer = s->buffer.packets[index].buffer;
447 buffer[0] = cpu_to_be32(ACCESS_ONCE(s->source_node_id_field) | 463 buffer[0] = cpu_to_be32(ACCESS_ONCE(s->source_node_id_field) |
448 (s->data_block_quadlets << 16) | 464 (s->data_block_quadlets << AMDTP_DBS_SHIFT) |
449 s->data_block_counter); 465 s->data_block_counter);
450 buffer[1] = cpu_to_be32(CIP_EOH | CIP_FMT_AM | AMDTP_FDF_AM824 | 466 buffer[1] = cpu_to_be32(CIP_EOH | CIP_FMT_AM | AMDTP_FDF_AM824 |
451 (s->sfc << AMDTP_FDF_SFC_SHIFT) | syt); 467 (s->sfc << CIP_FDF_SFC_SHIFT) | syt);
452 buffer += 2; 468 buffer += 2;
453 469
454 pcm = ACCESS_ONCE(s->pcm); 470 pcm = ACCESS_ONCE(s->pcm);