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