ALSA: dice: add parameters of stream formats for models produced by Alesis
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Wed, 2 May 2018 10:16:44 +0000 (19:16 +0900)
committerTakashi Iwai <tiwai@suse.de>
Wed, 2 May 2018 14:01:57 +0000 (16:01 +0200)
Alesis shipped some models with DICE ASICs. All of them just support
DICE original protocol and drivers can't retrieve all of available stream
formats without changing status of sampling transmission frequency
actually.

This commit puts some hard-coded parameters for the models. When detecting
the models, the corresponding parameters are copied as cache of stream
formats.

I note that each of pair of iO14/iO26 and MultiMix 8/12/16 has the same
model ID on their configuration ROM. The MultiMix 8/12/16 just support
one mode for sampling transmission frequency and ALSA dice driver already
handles them correctly. The iO14/iO26 support three modes and need
hard-coded parameters. To distinguish these two models, this commit let
the driver to retrieve current stream formats and compare it to known
parameters, then decide it.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/firewire/dice/Makefile
sound/firewire/dice/dice-alesis.c [new file with mode: 0644]
sound/firewire/dice/dice.c
sound/firewire/dice/dice.h

index 5ffaa366a88c8f758e1b87c3d535913d175c59a4..5cfe618f45ef332f69e61f839ceb35fa01d33c40 100644 (file)
@@ -1,3 +1,4 @@
 snd-dice-objs := dice-transaction.o dice-stream.o dice-proc.o dice-midi.o \
-                dice-pcm.o dice-hwdep.o dice.o dice-tcelectronic.o
+                dice-pcm.o dice-hwdep.o dice.o dice-tcelectronic.o \
+                dice-alesis.o
 obj-$(CONFIG_SND_DICE) += snd-dice.o
diff --git a/sound/firewire/dice/dice-alesis.c b/sound/firewire/dice/dice-alesis.c
new file mode 100644 (file)
index 0000000..b2efb1c
--- /dev/null
@@ -0,0 +1,52 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * dice-alesis.c - a part of driver for DICE based devices
+ *
+ * Copyright (c) 2018 Takashi Sakamoto
+ */
+
+#include "dice.h"
+
+static const unsigned int
+alesis_io14_tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT] = {
+       {6, 6, 4},      /* Tx0 = Analog + S/PDIF. */
+       {8, 4, 0},      /* Tx1 = ADAT1. */
+};
+
+static const unsigned int
+alesis_io26_tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT] = {
+       {10, 10, 8},    /* Tx0 = Analog + S/PDIF. */
+       {16, 8, 0},     /* Tx1 = ADAT1 + ADAT2. */
+};
+
+int snd_dice_detect_alesis_formats(struct snd_dice *dice)
+{
+       __be32 reg;
+       u32 data;
+       int i;
+       int err;
+
+       err = snd_dice_transaction_read_tx(dice, TX_NUMBER_AUDIO, &reg,
+                                          sizeof(reg));
+       if (err < 0)
+               return err;
+       data = be32_to_cpu(reg);
+
+       if (data == 4 || data == 6) {
+               memcpy(dice->tx_pcm_chs, alesis_io14_tx_pcm_chs,
+                               MAX_STREAMS * SND_DICE_RATE_MODE_COUNT *
+                               sizeof(unsigned int));
+       } else {
+               memcpy(dice->rx_pcm_chs, alesis_io26_tx_pcm_chs,
+                               MAX_STREAMS * SND_DICE_RATE_MODE_COUNT *
+                               sizeof(unsigned int));
+       }
+
+       for (i = 0; i < SND_DICE_RATE_MODE_COUNT; ++i)
+               dice->rx_pcm_chs[0][i] = 8;
+
+       dice->tx_midi_ports[0] = 1;
+       dice->rx_midi_ports[0] = 1;
+
+       return 0;
+}
index ea112506cc66b8a19010cf4e6c902856c138e2b7..cbd1a07e70b9cd6f99c215f08f6e95d10a44b24e 100644 (file)
@@ -15,11 +15,14 @@ MODULE_LICENSE("GPL v2");
 #define OUI_LOUD               0x000ff2
 #define OUI_FOCUSRITE          0x00130e
 #define OUI_TCELECTRONIC       0x000166
+#define OUI_ALESIS             0x000595
 
 #define DICE_CATEGORY_ID       0x04
 #define WEISS_CATEGORY_ID      0x00
 #define LOUD_CATEGORY_ID       0x10
 
+#define MODEL_ALESIS_IO_BOTH   0x000001
+
 /*
  * Some models support several isochronous channels, while these streams are not
  * always available. In this case, add the model name to this list.
@@ -382,6 +385,14 @@ static const struct ieee1394_device_id dice_id_table[] = {
                .model_id       = 0x000027,
                .driver_data = (kernel_ulong_t)snd_dice_detect_tcelectronic_formats,
        },
+       /* Alesis iO14/iO26. */
+       {
+               .match_flags    = IEEE1394_MATCH_VENDOR_ID |
+                                 IEEE1394_MATCH_MODEL_ID,
+               .vendor_id      = OUI_ALESIS,
+               .model_id       = MODEL_ALESIS_IO_BOTH,
+               .driver_data = (kernel_ulong_t)snd_dice_detect_alesis_formats,
+       },
        {
                .match_flags = IEEE1394_MATCH_VERSION,
                .version     = DICE_INTERFACE,
index a4987dce9e0a5b2f87b17e8d4721dfcf5e6fdea2..6be1bcf00116477824c5ecf41652260d7a864342 100644 (file)
@@ -226,5 +226,6 @@ void snd_dice_create_proc(struct snd_dice *dice);
 int snd_dice_create_midi(struct snd_dice *dice);
 
 int snd_dice_detect_tcelectronic_formats(struct snd_dice *dice);
+int snd_dice_detect_alesis_formats(struct snd_dice *dice);
 
 #endif