162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci// dice-presonus.c - a part of driver for DICE based devices 362306a36Sopenharmony_ci// 462306a36Sopenharmony_ci// Copyright (c) 2019 Takashi Sakamoto 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include "dice.h" 762306a36Sopenharmony_ci 862306a36Sopenharmony_cistruct dice_presonus_spec { 962306a36Sopenharmony_ci unsigned int tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT]; 1062306a36Sopenharmony_ci unsigned int rx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT]; 1162306a36Sopenharmony_ci bool has_midi; 1262306a36Sopenharmony_ci}; 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cistatic const struct dice_presonus_spec dice_presonus_firesutio = { 1562306a36Sopenharmony_ci .tx_pcm_chs = {{16, 16, 0}, {10, 2, 0} }, 1662306a36Sopenharmony_ci .rx_pcm_chs = {{16, 16, 0}, {10, 2, 0} }, 1762306a36Sopenharmony_ci .has_midi = true, 1862306a36Sopenharmony_ci}; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ciint snd_dice_detect_presonus_formats(struct snd_dice *dice) 2162306a36Sopenharmony_ci{ 2262306a36Sopenharmony_ci static const struct { 2362306a36Sopenharmony_ci u32 model_id; 2462306a36Sopenharmony_ci const struct dice_presonus_spec *spec; 2562306a36Sopenharmony_ci } *entry, entries[] = { 2662306a36Sopenharmony_ci {0x000008, &dice_presonus_firesutio}, 2762306a36Sopenharmony_ci }; 2862306a36Sopenharmony_ci struct fw_csr_iterator it; 2962306a36Sopenharmony_ci int key, val, model_id; 3062306a36Sopenharmony_ci int i; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci model_id = 0; 3362306a36Sopenharmony_ci fw_csr_iterator_init(&it, dice->unit->directory); 3462306a36Sopenharmony_ci while (fw_csr_iterator_next(&it, &key, &val)) { 3562306a36Sopenharmony_ci if (key == CSR_MODEL) { 3662306a36Sopenharmony_ci model_id = val; 3762306a36Sopenharmony_ci break; 3862306a36Sopenharmony_ci } 3962306a36Sopenharmony_ci } 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(entries); ++i) { 4262306a36Sopenharmony_ci entry = entries + i; 4362306a36Sopenharmony_ci if (entry->model_id == model_id) 4462306a36Sopenharmony_ci break; 4562306a36Sopenharmony_ci } 4662306a36Sopenharmony_ci if (i == ARRAY_SIZE(entries)) 4762306a36Sopenharmony_ci return -ENODEV; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci memcpy(dice->tx_pcm_chs, entry->spec->tx_pcm_chs, 5062306a36Sopenharmony_ci MAX_STREAMS * SND_DICE_RATE_MODE_COUNT * sizeof(unsigned int)); 5162306a36Sopenharmony_ci memcpy(dice->rx_pcm_chs, entry->spec->rx_pcm_chs, 5262306a36Sopenharmony_ci MAX_STREAMS * SND_DICE_RATE_MODE_COUNT * sizeof(unsigned int)); 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci if (entry->spec->has_midi) { 5562306a36Sopenharmony_ci dice->tx_midi_ports[0] = 1; 5662306a36Sopenharmony_ci dice->rx_midi_ports[0] = 1; 5762306a36Sopenharmony_ci } 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci return 0; 6062306a36Sopenharmony_ci} 61