mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-17 01:07:42 +07:00
84eaaef2ae
At present, all of models produced by TC Electronic except for Konnekt Live are supported with hard-coded their stream formats. Studio Konnekt 48 is sore model to support dual streams for both directions. The second stream has no MIDI conformant data channel in its data block. But current implementation transfers the second stream with MIDI conformant data channel. This commit fixes this issue. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Takashi Iwai <tiwai@suse.de>
105 lines
2.5 KiB
C
105 lines
2.5 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* dice-tc_electronic.c - a part of driver for DICE based devices
|
|
*
|
|
* Copyright (c) 2018 Takashi Sakamoto
|
|
*/
|
|
|
|
#include "dice.h"
|
|
|
|
struct dice_tc_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];
|
|
bool has_midi;
|
|
};
|
|
|
|
static const struct dice_tc_spec desktop_konnekt6 = {
|
|
.tx_pcm_chs = {{6, 6, 2}, {0, 0, 0} },
|
|
.rx_pcm_chs = {{6, 6, 4}, {0, 0, 0} },
|
|
.has_midi = false,
|
|
};
|
|
|
|
static const struct dice_tc_spec impact_twin = {
|
|
.tx_pcm_chs = {{14, 10, 6}, {0, 0, 0} },
|
|
.rx_pcm_chs = {{14, 10, 6}, {0, 0, 0} },
|
|
.has_midi = true,
|
|
};
|
|
|
|
static const struct dice_tc_spec konnekt_8 = {
|
|
.tx_pcm_chs = {{4, 4, 3}, {0, 0, 0} },
|
|
.rx_pcm_chs = {{4, 4, 3}, {0, 0, 0} },
|
|
.has_midi = true,
|
|
};
|
|
|
|
static const struct dice_tc_spec konnekt_24d = {
|
|
.tx_pcm_chs = {{16, 16, 6}, {0, 0, 0} },
|
|
.rx_pcm_chs = {{16, 16, 6}, {0, 0, 0} },
|
|
.has_midi = true,
|
|
};
|
|
|
|
static const struct dice_tc_spec konnekt_live = {
|
|
.tx_pcm_chs = {{16, 16, 16}, {0, 0, 0} },
|
|
.rx_pcm_chs = {{16, 16, 16}, {0, 0, 0} },
|
|
.has_midi = true,
|
|
};
|
|
|
|
static const struct dice_tc_spec studio_konnekt_48 = {
|
|
.tx_pcm_chs = {{16, 16, 8}, {16, 16, 7} },
|
|
.rx_pcm_chs = {{16, 16, 8}, {14, 14, 7} },
|
|
.has_midi = true,
|
|
};
|
|
|
|
static const struct dice_tc_spec digital_konnekt_x32 = {
|
|
.tx_pcm_chs = {{16, 16, 4}, {0, 0, 0} },
|
|
.rx_pcm_chs = {{16, 16, 4}, {0, 0, 0} },
|
|
.has_midi = false,
|
|
};
|
|
|
|
int snd_dice_detect_tcelectronic_formats(struct snd_dice *dice)
|
|
{
|
|
static const struct {
|
|
u32 model_id;
|
|
const struct dice_tc_spec *spec;
|
|
} *entry, entries[] = {
|
|
{0x00000020, &konnekt_24d},
|
|
{0x00000021, &konnekt_8},
|
|
{0x00000022, &studio_konnekt_48},
|
|
{0x00000023, &konnekt_live},
|
|
{0x00000024, &desktop_konnekt6},
|
|
{0x00000027, &impact_twin},
|
|
{0x00000030, &digital_konnekt_x32},
|
|
};
|
|
struct fw_csr_iterator it;
|
|
int key, val, model_id;
|
|
int i;
|
|
|
|
model_id = 0;
|
|
fw_csr_iterator_init(&it, dice->unit->directory);
|
|
while (fw_csr_iterator_next(&it, &key, &val)) {
|
|
if (key == CSR_MODEL) {
|
|
model_id = val;
|
|
break;
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < ARRAY_SIZE(entries); ++i) {
|
|
entry = entries + i;
|
|
if (entry->model_id == model_id)
|
|
break;
|
|
}
|
|
if (i == ARRAY_SIZE(entries))
|
|
return -ENODEV;
|
|
|
|
memcpy(dice->tx_pcm_chs, entry->spec->tx_pcm_chs,
|
|
MAX_STREAMS * SND_DICE_RATE_MODE_COUNT * sizeof(unsigned int));
|
|
memcpy(dice->rx_pcm_chs, entry->spec->rx_pcm_chs,
|
|
MAX_STREAMS * SND_DICE_RATE_MODE_COUNT * sizeof(unsigned int));
|
|
|
|
if (entry->spec->has_midi) {
|
|
dice->tx_midi_ports[0] = 1;
|
|
dice->rx_midi_ports[0] = 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|