xref: /OK3568_Linux_fs/kernel/sound/firewire/dice/dice-alesis.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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, &reg,
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