Merge tag 'for-linus-5.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml
[linux-2.6-microblaze.git] / sound / firewire / dice / dice-alesis.c
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, 8, 0},     /* Tx1 = ADAT1 + ADAT2. */
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, &reg,
30                                            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 }