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, ®, 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 } 77