ALSA: dice: add stream format parameters for Mytek devices
authorMelvin Vermeeren <mail@mel.vin>
Thu, 17 May 2018 19:00:00 +0000 (21:00 +0200)
committerTakashi Iwai <tiwai@suse.de>
Fri, 18 May 2018 06:53:51 +0000 (08:53 +0200)
--nextPart3916812.EicPReet6m
Content-Transfer-Encoding: 7Bit
Content-Type: text/plain; charset="us-ascii"

Mytek manufactures some equipment with DICE-based firewire ports. These
devices contain old versions of DICE firmware which lacks detailed
stream format reporting for all sampling clock modes.

Building upon the recent work by Takashi Sakamoto, hard-coded parameters
are added for the Stereo 192 DSD-DAC. When the device vendor and model
match the coded parameters are copied into the stream format cache.

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

index 7b7997a..37062a2 100644 (file)
@@ -1,4 +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-alesis.o dice-extension.o
+                dice-alesis.o dice-extension.o dice-mytek.o
 obj-$(CONFIG_SND_DICE) += snd-dice.o
diff --git a/sound/firewire/dice/dice-mytek.c b/sound/firewire/dice/dice-mytek.c
new file mode 100644 (file)
index 0000000..eb7d549
--- /dev/null
@@ -0,0 +1,46 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * dice-mytek.c - a part of driver for DICE based devices
+ *
+ * Copyright (c) 2018 Melvin Vermeeren
+ */
+
+#include "dice.h"
+
+struct dice_mytek_spec {
+       unsigned int tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT];
+       unsigned int rx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT];
+};
+
+static const struct dice_mytek_spec stereo_192_dsd_dac = {
+       /* AES, TOSLINK, SPDIF, ADAT inputs on device */
+       .tx_pcm_chs = {{8, 8, 8}, {0, 0, 0} },
+       /* PCM 44.1-192, native DSD64/DSD128 to device */
+       .rx_pcm_chs = {{4, 4, 4}, {0, 0, 0} }
+};
+
+/*
+ * Mytek has a few other firewire-capable devices, though newer models appear
+ * to lack the port more often than not. As I don't have access to any of them
+ * they are missing here. An example is the Mytek 8x192 ADDA, which is DICE.
+ */
+
+int snd_dice_detect_mytek_formats(struct snd_dice *dice)
+{
+       int i;
+       const struct dice_mytek_spec *dev;
+
+       dev = &stereo_192_dsd_dac;
+
+       memcpy(dice->tx_pcm_chs, dev->tx_pcm_chs,
+              MAX_STREAMS * SND_DICE_RATE_MODE_COUNT * sizeof(unsigned int));
+       memcpy(dice->rx_pcm_chs, dev->rx_pcm_chs,
+              MAX_STREAMS * SND_DICE_RATE_MODE_COUNT * sizeof(unsigned int));
+
+       for (i = 0; i < MAX_STREAMS; ++i) {
+               dice->tx_midi_ports[i] = 0;
+               dice->rx_midi_ports[i] = 0;
+       }
+
+       return 0;
+}
index 40f7a32..beeef62 100644 (file)
@@ -17,6 +17,7 @@ MODULE_LICENSE("GPL v2");
 #define OUI_TCELECTRONIC       0x000166
 #define OUI_ALESIS             0x000595
 #define OUI_MAUDIO             0x000d6c
+#define OUI_MYTEK              0x001ee8
 
 #define DICE_CATEGORY_ID       0x04
 #define WEISS_CATEGORY_ID      0x00
@@ -365,6 +366,14 @@ static const struct ieee1394_device_id dice_id_table[] = {
                .model_id       = MODEL_ALESIS_IO_BOTH,
                .driver_data = (kernel_ulong_t)snd_dice_detect_alesis_formats,
        },
+       /* Mytek Stereo 192 DSD-DAC. */
+       {
+               .match_flags    = IEEE1394_MATCH_VENDOR_ID |
+                                 IEEE1394_MATCH_MODEL_ID,
+               .vendor_id      = OUI_MYTEK,
+               .model_id       = 0x000002,
+               .driver_data = (kernel_ulong_t)snd_dice_detect_mytek_formats,
+       },
        {
                .match_flags = IEEE1394_MATCH_VERSION,
                .version     = DICE_INTERFACE,
index 505b79f..83353a3 100644 (file)
@@ -226,5 +226,6 @@ 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);
 int snd_dice_detect_extension_formats(struct snd_dice *dice);
+int snd_dice_detect_mytek_formats(struct snd_dice *dice);
 
 #endif