aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>2014-04-25 09:45:06 -0400
committerTakashi Iwai <tiwai@suse.de>2014-05-26 08:25:15 -0400
commitd9cd0065c8a48dd0ef61acaa9584e3e723249c57 (patch)
tree260330cf0ee4727e58a8a4d08059156254a5e7cf /sound
parent697022391e46614184101c59e46c9671598026db (diff)
ALSA: fireworks/firewire-lib: Add a quirk for fixed interval of reported dbc
Fireworks firmware version 5.5 reports fix interval for dbc in each packet. For example, AudioFire4: CIP0 CIP1 Payload 00070000 900484FF 72 00070008 9004A8FF 72 00070008 90FFFFFF 02 00070010 9004D0FF 72 00070018 9004C4FF 72 00070020 9004E8FF 72 00070020 90FFFFFF 02 00070028 900410FE 72 The interval of each dbc should be 16 except for empty packet but it's still 8. This commit adds a flag for this quirk and codes to refer to a fixed value. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r--sound/firewire/amdtp.c15
-rw-r--r--sound/firewire/amdtp.h3
-rw-r--r--sound/firewire/fireworks/fireworks.c1
-rw-r--r--sound/firewire/fireworks/fireworks.h1
-rw-r--r--sound/firewire/fireworks/fireworks_stream.c3
5 files changed, 19 insertions, 4 deletions
diff --git a/sound/firewire/amdtp.c b/sound/firewire/amdtp.c
index 39033876593e..4a7cc1f77d88 100644
--- a/sound/firewire/amdtp.c
+++ b/sound/firewire/amdtp.c
@@ -618,7 +618,8 @@ static void handle_in_packet(struct amdtp_stream *s,
618 __be32 *buffer) 618 __be32 *buffer)
619{ 619{
620 u32 cip_header[2]; 620 u32 cip_header[2];
621 unsigned int data_blocks, data_block_quadlets, data_block_counter; 621 unsigned int data_blocks, data_block_quadlets, data_block_counter,
622 dbc_interval;
622 struct snd_pcm_substream *pcm = NULL; 623 struct snd_pcm_substream *pcm = NULL;
623 bool lost; 624 bool lost;
624 625
@@ -661,11 +662,17 @@ static void handle_in_packet(struct amdtp_stream *s,
661 662
662 /* Check data block counter continuity */ 663 /* Check data block counter continuity */
663 data_block_counter = cip_header[0] & AMDTP_DBC_MASK; 664 data_block_counter = cip_header[0] & AMDTP_DBC_MASK;
664 if (!(s->flags & CIP_DBC_IS_END_EVENT)) 665 if (!(s->flags & CIP_DBC_IS_END_EVENT)) {
665 lost = data_block_counter != s->data_block_counter; 666 lost = data_block_counter != s->data_block_counter;
666 else 667 } else {
668 if ((data_blocks > 0) && (s->tx_dbc_interval > 0))
669 dbc_interval = s->tx_dbc_interval;
670 else
671 dbc_interval = data_blocks;
672
667 lost = data_block_counter != 673 lost = data_block_counter !=
668 ((s->data_block_counter + data_blocks) & 0xff); 674 ((s->data_block_counter + dbc_interval) & 0xff);
675 }
669 676
670 if (lost) { 677 if (lost) {
671 dev_info(&s->unit->device, 678 dev_info(&s->unit->device,
diff --git a/sound/firewire/amdtp.h b/sound/firewire/amdtp.h
index f334ae51e44f..05f1b8b30e2b 100644
--- a/sound/firewire/amdtp.h
+++ b/sound/firewire/amdtp.h
@@ -119,6 +119,9 @@ struct amdtp_stream {
119 119
120 struct snd_rawmidi_substream *midi[AMDTP_MAX_CHANNELS_FOR_MIDI * 8]; 120 struct snd_rawmidi_substream *midi[AMDTP_MAX_CHANNELS_FOR_MIDI * 8];
121 121
122 /* quirk: fixed interval of dbc between previos/current packets. */
123 unsigned int tx_dbc_interval;
124
122 bool callbacked; 125 bool callbacked;
123 wait_queue_head_t callback_wait; 126 wait_queue_head_t callback_wait;
124 struct amdtp_stream *sync_slave; 127 struct amdtp_stream *sync_slave;
diff --git a/sound/firewire/fireworks/fireworks.c b/sound/firewire/fireworks/fireworks.c
index 02b3259059f0..25997f1ee300 100644
--- a/sound/firewire/fireworks/fireworks.c
+++ b/sound/firewire/fireworks/fireworks.c
@@ -84,6 +84,7 @@ get_hardware_info(struct snd_efw *efw)
84 (hwinfo->arm_version >> 16) & 0xff); 84 (hwinfo->arm_version >> 16) & 0xff);
85 if (err < 0) 85 if (err < 0)
86 goto end; 86 goto end;
87 efw->firmware_version = hwinfo->arm_version;
87 88
88 strcpy(efw->card->driver, "Fireworks"); 89 strcpy(efw->card->driver, "Fireworks");
89 strcpy(efw->card->shortname, hwinfo->model_name); 90 strcpy(efw->card->shortname, hwinfo->model_name);
diff --git a/sound/firewire/fireworks/fireworks.h b/sound/firewire/fireworks/fireworks.h
index 9534e93e3a36..3f998510ddf3 100644
--- a/sound/firewire/fireworks/fireworks.h
+++ b/sound/firewire/fireworks/fireworks.h
@@ -63,6 +63,7 @@ struct snd_efw {
63 63
64 /* for quirks */ 64 /* for quirks */
65 bool is_af9; 65 bool is_af9;
66 u32 firmware_version;
66 67
67 unsigned int midi_in_ports; 68 unsigned int midi_in_ports;
68 unsigned int midi_out_ports; 69 unsigned int midi_out_ports;
diff --git a/sound/firewire/fireworks/fireworks_stream.c b/sound/firewire/fireworks/fireworks_stream.c
index 7447af72ae30..c75c2ef2ae31 100644
--- a/sound/firewire/fireworks/fireworks_stream.c
+++ b/sound/firewire/fireworks/fireworks_stream.c
@@ -201,6 +201,9 @@ int snd_efw_stream_init_duplex(struct snd_efw *efw)
201 /* AudioFire9 always reports wrong dbs. */ 201 /* AudioFire9 always reports wrong dbs. */
202 if (efw->is_af9) 202 if (efw->is_af9)
203 efw->tx_stream.flags |= CIP_WRONG_DBS; 203 efw->tx_stream.flags |= CIP_WRONG_DBS;
204 /* Firmware version 5.5 reports fixed interval for dbc. */
205 if (efw->firmware_version == 0x5050000)
206 efw->tx_stream.tx_dbc_interval = 8;
204 207
205 err = init_stream(efw, &efw->rx_stream); 208 err = init_stream(efw, &efw->rx_stream);
206 if (err < 0) { 209 if (err < 0) {