162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * dice-alesis.c - a part of driver for DICE based devices 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2018 Takashi Sakamoto 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include "dice.h" 962306a36Sopenharmony_ci 1062306a36Sopenharmony_cistatic const unsigned int 1162306a36Sopenharmony_cialesis_io14_tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT] = { 1262306a36Sopenharmony_ci {6, 6, 4}, /* Tx0 = Analog + S/PDIF. */ 1362306a36Sopenharmony_ci {8, 4, 0}, /* Tx1 = ADAT1. */ 1462306a36Sopenharmony_ci}; 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_cistatic const unsigned int 1762306a36Sopenharmony_cialesis_io26_tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT] = { 1862306a36Sopenharmony_ci {10, 10, 4}, /* Tx0 = Analog + S/PDIF. */ 1962306a36Sopenharmony_ci {16, 4, 0}, /* Tx1 = ADAT1 + ADAT2 (available at low rate). */ 2062306a36Sopenharmony_ci}; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ciint snd_dice_detect_alesis_formats(struct snd_dice *dice) 2362306a36Sopenharmony_ci{ 2462306a36Sopenharmony_ci __be32 reg; 2562306a36Sopenharmony_ci u32 data; 2662306a36Sopenharmony_ci int i; 2762306a36Sopenharmony_ci int err; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci err = snd_dice_transaction_read_tx(dice, TX_NUMBER_AUDIO, ®, 3062306a36Sopenharmony_ci sizeof(reg)); 3162306a36Sopenharmony_ci if (err < 0) 3262306a36Sopenharmony_ci return err; 3362306a36Sopenharmony_ci data = be32_to_cpu(reg); 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci if (data == 4 || data == 6) { 3662306a36Sopenharmony_ci memcpy(dice->tx_pcm_chs, alesis_io14_tx_pcm_chs, 3762306a36Sopenharmony_ci MAX_STREAMS * SND_DICE_RATE_MODE_COUNT * 3862306a36Sopenharmony_ci sizeof(unsigned int)); 3962306a36Sopenharmony_ci } else { 4062306a36Sopenharmony_ci memcpy(dice->tx_pcm_chs, alesis_io26_tx_pcm_chs, 4162306a36Sopenharmony_ci MAX_STREAMS * SND_DICE_RATE_MODE_COUNT * 4262306a36Sopenharmony_ci sizeof(unsigned int)); 4362306a36Sopenharmony_ci } 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci for (i = 0; i < SND_DICE_RATE_MODE_COUNT; ++i) 4662306a36Sopenharmony_ci dice->rx_pcm_chs[0][i] = 8; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci dice->tx_midi_ports[0] = 1; 4962306a36Sopenharmony_ci dice->rx_midi_ports[0] = 1; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci return 0; 5262306a36Sopenharmony_ci} 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ciint snd_dice_detect_alesis_mastercontrol_formats(struct snd_dice *dice) 5562306a36Sopenharmony_ci{ 5662306a36Sopenharmony_ci int i; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci dice->tx_pcm_chs[0][SND_DICE_RATE_MODE_LOW] = 16; 5962306a36Sopenharmony_ci dice->tx_pcm_chs[1][SND_DICE_RATE_MODE_LOW] = 12; 6062306a36Sopenharmony_ci dice->tx_pcm_chs[0][SND_DICE_RATE_MODE_MIDDLE] = 12; 6162306a36Sopenharmony_ci dice->tx_pcm_chs[1][SND_DICE_RATE_MODE_MIDDLE] = 4; 6262306a36Sopenharmony_ci dice->tx_pcm_chs[0][SND_DICE_RATE_MODE_HIGH] = 8; 6362306a36Sopenharmony_ci dice->tx_pcm_chs[1][SND_DICE_RATE_MODE_HIGH] = 0; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci for (i = 0; i < SND_DICE_RATE_MODE_COUNT; ++i) { 6662306a36Sopenharmony_ci dice->rx_pcm_chs[0][i] = 6; 6762306a36Sopenharmony_ci dice->rx_pcm_chs[1][i] = 0; 6862306a36Sopenharmony_ci } 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci for (i = 0; i < MAX_STREAMS; ++i) { 7162306a36Sopenharmony_ci dice->tx_midi_ports[i] = 2; 7262306a36Sopenharmony_ci dice->rx_midi_ports[i] = 2; 7362306a36Sopenharmony_ci } 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci return 0; 7662306a36Sopenharmony_ci} 77