linux/sound/firewire/dice/dice-alesis.c
<<
>>
Prefs
   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
  10static const unsigned int
  11alesis_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
  16static const unsigned int
  17alesis_io26_tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT] = {
  18        {10, 10, 8},    /* Tx0 = Analog + S/PDIF. */
  19        {16, 8, 0},     /* Tx1 = ADAT1 + ADAT2. */
  20};
  21
  22int 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