Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * dice-alesis.c - a part of driver for DICE based devices
0004  *
0005  * Copyright (c) 2018 Takashi Sakamoto
0006  */
0007 
0008 #include "dice.h"
0009 
0010 static const unsigned int
0011 alesis_io14_tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT] = {
0012     {6, 6, 4},  /* Tx0 = Analog + S/PDIF. */
0013     {8, 4, 0},  /* Tx1 = ADAT1. */
0014 };
0015 
0016 static const unsigned int
0017 alesis_io26_tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT] = {
0018     {10, 10, 4},    /* Tx0 = Analog + S/PDIF. */
0019     {16, 4, 0}, /* Tx1 = ADAT1 + ADAT2 (available at low rate). */
0020 };
0021 
0022 int snd_dice_detect_alesis_formats(struct snd_dice *dice)
0023 {
0024     __be32 reg;
0025     u32 data;
0026     int i;
0027     int err;
0028 
0029     err = snd_dice_transaction_read_tx(dice, TX_NUMBER_AUDIO, &reg,
0030                        sizeof(reg));
0031     if (err < 0)
0032         return err;
0033     data = be32_to_cpu(reg);
0034 
0035     if (data == 4 || data == 6) {
0036         memcpy(dice->tx_pcm_chs, alesis_io14_tx_pcm_chs,
0037                 MAX_STREAMS * SND_DICE_RATE_MODE_COUNT *
0038                 sizeof(unsigned int));
0039     } else {
0040         memcpy(dice->tx_pcm_chs, alesis_io26_tx_pcm_chs,
0041                 MAX_STREAMS * SND_DICE_RATE_MODE_COUNT *
0042                 sizeof(unsigned int));
0043     }
0044 
0045     for (i = 0; i < SND_DICE_RATE_MODE_COUNT; ++i)
0046         dice->rx_pcm_chs[0][i] = 8;
0047 
0048     dice->tx_midi_ports[0] = 1;
0049     dice->rx_midi_ports[0] = 1;
0050 
0051     return 0;
0052 }
0053 
0054 int snd_dice_detect_alesis_mastercontrol_formats(struct snd_dice *dice)
0055 {
0056     int i;
0057 
0058     dice->tx_pcm_chs[0][SND_DICE_RATE_MODE_LOW] = 16;
0059     dice->tx_pcm_chs[1][SND_DICE_RATE_MODE_LOW] = 12;
0060     dice->tx_pcm_chs[0][SND_DICE_RATE_MODE_MIDDLE]  = 12;
0061     dice->tx_pcm_chs[1][SND_DICE_RATE_MODE_MIDDLE]  = 4;
0062     dice->tx_pcm_chs[0][SND_DICE_RATE_MODE_HIGH]    = 8;
0063     dice->tx_pcm_chs[1][SND_DICE_RATE_MODE_HIGH]    = 0;
0064 
0065     for (i = 0; i < SND_DICE_RATE_MODE_COUNT; ++i) {
0066         dice->rx_pcm_chs[0][i] = 6;
0067         dice->rx_pcm_chs[1][i] = 0;
0068     }
0069 
0070     for (i = 0; i < MAX_STREAMS; ++i) {
0071         dice->tx_midi_ports[i] = 2;
0072         dice->rx_midi_ports[i] = 2;
0073     }
0074 
0075     return 0;
0076 }