1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * dice-alesis.c - a part of driver for DICE based devices
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (c) 2018 Takashi Sakamoto
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #include "dice.h"
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun static const unsigned int
11*4882a593Smuzhiyun alesis_io14_tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT] = {
12*4882a593Smuzhiyun {6, 6, 4}, /* Tx0 = Analog + S/PDIF. */
13*4882a593Smuzhiyun {8, 4, 0}, /* Tx1 = ADAT1. */
14*4882a593Smuzhiyun };
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun static const unsigned int
17*4882a593Smuzhiyun alesis_io26_tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT] = {
18*4882a593Smuzhiyun {10, 10, 4}, /* Tx0 = Analog + S/PDIF. */
19*4882a593Smuzhiyun {16, 4, 0}, /* Tx1 = ADAT1 + ADAT2 (available at low rate). */
20*4882a593Smuzhiyun };
21*4882a593Smuzhiyun
snd_dice_detect_alesis_formats(struct snd_dice * dice)22*4882a593Smuzhiyun int snd_dice_detect_alesis_formats(struct snd_dice *dice)
23*4882a593Smuzhiyun {
24*4882a593Smuzhiyun __be32 reg;
25*4882a593Smuzhiyun u32 data;
26*4882a593Smuzhiyun int i;
27*4882a593Smuzhiyun int err;
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun err = snd_dice_transaction_read_tx(dice, TX_NUMBER_AUDIO, ®,
30*4882a593Smuzhiyun sizeof(reg));
31*4882a593Smuzhiyun if (err < 0)
32*4882a593Smuzhiyun return err;
33*4882a593Smuzhiyun data = be32_to_cpu(reg);
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun if (data == 4 || data == 6) {
36*4882a593Smuzhiyun memcpy(dice->tx_pcm_chs, alesis_io14_tx_pcm_chs,
37*4882a593Smuzhiyun MAX_STREAMS * SND_DICE_RATE_MODE_COUNT *
38*4882a593Smuzhiyun sizeof(unsigned int));
39*4882a593Smuzhiyun } else {
40*4882a593Smuzhiyun memcpy(dice->tx_pcm_chs, alesis_io26_tx_pcm_chs,
41*4882a593Smuzhiyun MAX_STREAMS * SND_DICE_RATE_MODE_COUNT *
42*4882a593Smuzhiyun sizeof(unsigned int));
43*4882a593Smuzhiyun }
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun for (i = 0; i < SND_DICE_RATE_MODE_COUNT; ++i)
46*4882a593Smuzhiyun dice->rx_pcm_chs[0][i] = 8;
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun dice->tx_midi_ports[0] = 1;
49*4882a593Smuzhiyun dice->rx_midi_ports[0] = 1;
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun return 0;
52*4882a593Smuzhiyun }
53*4882a593Smuzhiyun
snd_dice_detect_alesis_mastercontrol_formats(struct snd_dice * dice)54*4882a593Smuzhiyun int snd_dice_detect_alesis_mastercontrol_formats(struct snd_dice *dice)
55*4882a593Smuzhiyun {
56*4882a593Smuzhiyun int i;
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun dice->tx_pcm_chs[0][SND_DICE_RATE_MODE_LOW] = 16;
59*4882a593Smuzhiyun dice->tx_pcm_chs[1][SND_DICE_RATE_MODE_LOW] = 12;
60*4882a593Smuzhiyun dice->tx_pcm_chs[0][SND_DICE_RATE_MODE_MIDDLE] = 12;
61*4882a593Smuzhiyun dice->tx_pcm_chs[1][SND_DICE_RATE_MODE_MIDDLE] = 4;
62*4882a593Smuzhiyun dice->tx_pcm_chs[0][SND_DICE_RATE_MODE_HIGH] = 8;
63*4882a593Smuzhiyun dice->tx_pcm_chs[1][SND_DICE_RATE_MODE_HIGH] = 0;
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun for (i = 0; i < SND_DICE_RATE_MODE_COUNT; ++i) {
66*4882a593Smuzhiyun dice->rx_pcm_chs[0][i] = 6;
67*4882a593Smuzhiyun dice->rx_pcm_chs[1][i] = 0;
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun for (i = 0; i < MAX_STREAMS; ++i) {
71*4882a593Smuzhiyun dice->tx_midi_ports[i] = 2;
72*4882a593Smuzhiyun dice->rx_midi_ports[i] = 2;
73*4882a593Smuzhiyun }
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun return 0;
76*4882a593Smuzhiyun }
77