diff options
-rw-r--r-- | sound/firewire/amdtp.c | 30 |
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); |