diff options
author | Christian Pointner <equinox@helsinki.at> | 2024-05-10 18:26:46 (GMT) |
---|---|---|
committer | Christian Pointner <equinox@helsinki.at> | 2024-05-10 18:26:46 (GMT) |
commit | 627f7d488817e308d6f3a92fd9a877723ac7ae1d (patch) | |
tree | 554a3c53c90b20da5bd0da0c8da67a9b169bd10f /snd-alpx/alpx_variants_mc.h |
import snd-alpx V3.4.3
Diffstat (limited to 'snd-alpx/alpx_variants_mc.h')
-rw-r--r-- | snd-alpx/alpx_variants_mc.h | 1475 |
1 files changed, 1475 insertions, 0 deletions
diff --git a/snd-alpx/alpx_variants_mc.h b/snd-alpx/alpx_variants_mc.h new file mode 100644 index 0000000..aa32035 --- /dev/null +++ b/snd-alpx/alpx_variants_mc.h @@ -0,0 +1,1475 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* +* Support for Digigram AlpX PCI-e boards +* +* Copyright (c) 2024 Digigram Digital (info@digigram.com) +*/ + +#ifndef _ALPX_VARIANTS_MC_H_ +#define _ALPX_VARIANTS_MC_H_ + +#include "alpx.h" +#include "alpx_reg.h" + +#include <sound/tlv.h> +#include "alpx_variants_common.h" + + +/* 882 */ +/* Alp882 Commons */ +static const char *alp882_control_choice_clk_src_entries[ALP882_CLK_MANAGER_CONFIG_CLK_SRC_QTY] = { + "Internal", + "SIC", + "Word Clk", + "AES Syn", + "AES Aud 1/2", + "AES Aud 3/4", + "AES Aud 5/6", + "AES Aud 7/8", +}; + +/* Same order than the constants values */ +static u32 alp882_control_choice_clk_src_entries_values[ALP882_CLK_MANAGER_CONFIG_CLK_SRC_QTY] = { + ALPMC_CLK_MANAGER_SOURCE_INTERNAL, + ALPMC_CLK_MANAGER_SOURCE_SIC, + ALPMC_CLK_MANAGER_SOURCE_WCLK_IN, + ALPMC_CLK_MANAGER_SOURCE_AES_SYNC, + ALPMC_CLK_MANAGER_SOURCE_AES_AUDIO_12, + ALPMC_CLK_MANAGER_SOURCE_AES_AUDIO_34, + ALPMC_CLK_MANAGER_SOURCE_AES_AUDIO_56, + ALPMC_CLK_MANAGER_SOURCE_AES_AUDIO_78, +}; + +static struct snd_pcm_hardware alp882_hardware_specs = { + .info = SNDRV_PCM_INFO_MMAP | + SNDRV_PCM_INFO_MMAP_VALID | + SNDRV_PCM_INFO_INTERLEAVED | + SNDRV_PCM_INFO_BLOCK_TRANSFER | + SNDRV_PCM_INFO_RESUME, + .formats = SNDRV_PCM_FMTBIT_S32_LE, + .rates = SNDRV_PCM_RATE_CONTINUOUS | + SNDRV_PCM_RATE_8000_192000, + .rate_min = 8000, + .rate_max = 192000, + .channels_min = 16, + .channels_max = 16, + .buffer_bytes_max = 256 * SZ_1K * 4, /* period_bytes_max * periods_max */ + .period_bytes_min = 48, /* min latency 1ms */ + .period_bytes_max = 256 * SZ_1K, /* 20ms at 192kHz * nchans * 4B, rounded at 2^n */ + .periods_min = 1, + .periods_max = 4, +}; + + +/* Alp 882 LINE Variant definition */ + +static const DECLARE_TLV_DB_MINMAX_MUTE(alpmc_line_control_codec_gains_scale, ALPMC_LINE_ANALOG_GAIN_MIN_cdB, ALPMC_LINE_ANALOG_GAIN_MAX_cdB); + +static struct alpx_control_descriptor alp882_line_control_descriptors[] = { + /* Gain */ + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_IN_BASE + + ALPMC_GAIN_TABLE_BASE(ALP882_CHANNELS_IN_DAW_OFFSET), + .prefix = "DAW Capture", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP882_CHANNELS_DAW_COUNT, + }, + }, + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_IN_BASE + + ALPMC_GAIN_TABLE_BASE(ALP882_CHANNELS_IN_ANALOG_OFFSET), + .prefix = "Ana Capture", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP882_CHANNELS_ANALOG_COUNT, + }, + }, + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_IN_BASE + + ALPMC_GAIN_TABLE_BASE(ALP882_CHANNELS_IN_AES_OFFSET), + .prefix = "AES Capture", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP882_CHANNELS_AES_COUNT, + }, + }, + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_OUT_BASE + + ALPMC_GAIN_TABLE_BASE(ALP882_CHANNELS_OUT_ANALOG_OFFSET), + .prefix = "Ana Playback", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP882_CHANNELS_ANALOG_COUNT, + }, + }, + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_OUT_BASE + + ALPMC_GAIN_TABLE_BASE(ALP882_CHANNELS_OUT_AES_OFFSET), + .prefix = "AES Playback", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP882_CHANNELS_AES_COUNT, + }, + }, + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_OUT_BASE + + ALPMC_GAIN_TABLE_BASE(ALP882_CHANNELS_OUT_DAW_OFFSET), + .prefix = "DAW Playback", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP882_CHANNELS_DAW_COUNT, + }, + }, + /* Mixer */ + { + .type = ALPX_CONTROL_TYPE_MIXER, + .base = ALPMC_MIXER_BASE, + .prefix = "Mxr", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.mixer = { + .lines_count = ALP882_MIXER_SIZE, + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + }, + }, + /* Clock sources Read Only */ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALPMC_CLK_MANAGER_BASE, + .prefix = "Clk Eff Src", + .access = SNDRV_CTL_ELEM_ACCESS_READ, + .data.choice = { + .offset = ALPMC_CLK_MANAGER_CONFIG_REG, + .mask = ALPMC_CLK_MANAGER_CONFIG_CLK_SRC_MASK, + .pos = ALPMC_CLK_MANAGER_CONFIG_CLK_SRC_POS, + .entries = alp882_control_choice_clk_src_entries, + .entries_values = alp882_control_choice_clk_src_entries_values, + .entries_count = ARRAY_SIZE(alp882_control_choice_clk_src_entries), + }, + }, + /* Current Clock BASE Value Read Only */ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALPMC_CLK_MANAGER_BASE, + .prefix = "Clk Eff", + .access = SNDRV_CTL_ELEM_ACCESS_READ | + SNDRV_CTL_ELEM_ACCESS_VOLATILE, + .data.choice = { + .offset = ALPMC_CLK_MANAGER_CONFIG_REG, + .mask = ALPMC_CLK_MANAGER_CONFIG_CLK_CURRENT_VALUE_MASK, + .pos = ALPMC_CLK_MANAGER_CONFIG_CLK_CURRENT_VALUE_POS, + .entries = alpxxx_control_choice_current_clk_values_entries, + .entries_values = alpxxx_control_choice_current_clk_values_entries_values, + .entries_count = ARRAY_SIZE(alpxxx_control_choice_current_clk_values_entries), + }, + }, + + /* Current Clock factor values Read Only, RESERVED to keep Ids order */ + { + .type = ALPX_CONTROL_RESERVED, + .base = ALPMC_CLK_MANAGER_BASE, + .prefix = "RESERVED", + .access = SNDRV_CTL_ELEM_ACCESS_READ, + }, + /* Clock UP on fail over enabled flag */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALP_PROC_BASE, + .prefix = "Clk Src Up", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.flag = { + .offset = ALP_PROC_FWCONFIG_REG, + .mask = ALP_PROC_FWCONFIG_CLKSRC_UP_MASK, + .pos = ALP_PROC_FWCONFIG_CLKSRC_UP_POS, + }, + }, + /* Clock DOWN on fail over enabled flag */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALP_PROC_BASE, + .prefix = "Clk Src Down", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.flag = { + .offset = ALP_PROC_FWCONFIG_REG, + .mask = ALP_PROC_FWCONFIG_CLKSRC_DOWN_MASK, + .pos = ALP_PROC_FWCONFIG_CLKSRC_DOWN_POS, + }, + }, + /* Clock Failover priority 0 TOP*/ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALP_PROC_BASE, + .prefix = "Clk P0", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.choice = { + .offset = ALP_PROC_CLK_SOURCE_PRIO_REG, + .mask = ALP_PROC_CLK_SOURCE_PRIO0_MASK, + .pos = ALP_PROC_CLK_SOURCE_PRIO0_POS, + .entries = alp882_control_choice_clk_src_entries, + .entries_values = alp882_control_choice_clk_src_entries_values, + .entries_count = ARRAY_SIZE(alp882_control_choice_clk_src_entries), + }, + }, + /* Clock Failover priority 1 */ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALP_PROC_BASE, + .prefix = "Clk P1", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.choice = { + .offset = ALP_PROC_CLK_SOURCE_PRIO_REG, + .mask = ALP_PROC_CLK_SOURCE_PRIO1_MASK, + .pos = ALP_PROC_CLK_SOURCE_PRIO1_POS, + .entries = alp882_control_choice_clk_src_entries, + .entries_values = alp882_control_choice_clk_src_entries_values, + .entries_count = ARRAY_SIZE(alp882_control_choice_clk_src_entries), + }, + }, + /* Clock Failover priority 2*/ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALP_PROC_BASE, + .prefix = "Clk P2", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.choice = { + .offset = ALP_PROC_CLK_SOURCE_PRIO_REG, + .mask = ALP_PROC_CLK_SOURCE_PRIO2_MASK, + .pos = ALP_PROC_CLK_SOURCE_PRIO2_POS, + .entries = alp882_control_choice_clk_src_entries, + .entries_values = alp882_control_choice_clk_src_entries_values, + .entries_count = ARRAY_SIZE(alp882_control_choice_clk_src_entries), + }, + }, + /* Clock Failover priority 3*/ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALP_PROC_BASE, + .prefix = "Clk P3", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.choice = { + .offset = ALP_PROC_CLK_SOURCE_PRIO_REG, + .mask = ALP_PROC_CLK_SOURCE_PRIO3_MASK, + .pos = ALP_PROC_CLK_SOURCE_PRIO3_POS, + .entries = alp882_control_choice_clk_src_entries, + .entries_values = alp882_control_choice_clk_src_entries_values, + .entries_count = ARRAY_SIZE(alp882_control_choice_clk_src_entries), + }, + }, + /* Auto AES SRC disable */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "AES SRC 1/2 Disable", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.flag = { + .offset = ALPMC_CODEC_AES_SRC_CONTROL_REG, + .mask = ALPMC_CODEC_AES_SRC_1_2_MASK, + .pos = ALPMC_CODEC_AES_SRC_1_2_POS, + }, + }, + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "AES SRC 3/4 Disable", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.flag = { + .offset = ALPMC_CODEC_AES_SRC_CONTROL_REG, + .mask = ALPMC_CODEC_AES_SRC_3_4_MASK, + .pos = ALPMC_CODEC_AES_SRC_3_4_POS, + }, + }, + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "AES SRC 5/6 Disable", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.flag = { + .offset = ALPMC_CODEC_AES_SRC_CONTROL_REG, + .mask = ALPMC_CODEC_AES_SRC_5_6_MASK, + .pos = ALPMC_CODEC_AES_SRC_5_6_POS, + }, + }, + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "AES SRC 7/8 Disable", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.flag = { + .offset = ALPMC_CODEC_AES_SRC_CONTROL_REG, + .mask = ALPMC_CODEC_AES_SRC_7_8_MASK, + .pos = ALPMC_CODEC_AES_SRC_7_8_POS, + }, + }, + /* Codec Input Gain for LINE Option*/ + { + .type = ALPX_CONTROL_TYPE_ANALOG_EQ, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "Codec Analog Capture", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.codec = { + .offset = ALPMC_CODEC_PGA_REGS, + .gains_scale = alpmc_line_control_codec_gains_scale, + .reg_gain_min = ALPMC_LINE_ANALOG_GAIN_MIN_REG, + .reg_gain_max = ALPMC_LINE_ANALOG_GAIN_MAX_REG, + .lines_count = 8, + }, + }, +}; + +static struct alpx_variant alp882_line_variant __attribute__((unused)) = { + .shortname = "Alp882e", + .longname = "Alp 882e", + .model = ALPX_VARIANT_MODEL_ALP882, + .mixername = "Alp882e_Mix", + .features = ALPX_VARIANT_FEATURE_GPIOS, + .control_descriptors = alp882_line_control_descriptors, + .control_descriptors_count = ARRAY_SIZE(alp882_line_control_descriptors), + + .capture_hw = &alp882_hardware_specs, + .playback_hw = &alp882_hardware_specs, + + .flash_golden_production_base = ALPxxx_FLASH_GOLDEN_PRODUCTION_BASE, + + .gpios = { + .base = ALPMC_GPIO_BASE, + .inputs_reg_offset = ALPMC_GPIO_INPUT_REG, + .inputs_qty = ALPMC_GPIO_INPUT_QTY, + .outputs_reg_offset = ALPMC_GPIO_OUTPUT_REG, + .outputs_qty = ALPMC_GPIO_OUTPUT_QTY, + }, + + .flash_partitions.partitions = alpx_mtd_partitions, + .flash_partitions.qty = ARRAY_SIZE(alpx_mtd_partitions), + .flash_partitions.qty_for_fw_update = 1, +}; + + +/* Alp 882 - MIC Variant definition */ + +static const DECLARE_TLV_DB_MINMAX_MUTE(alpmc_mic_control_codec_gains_scale, ALPMC_MIC_ANALOG_GAIN_MIN_cdB, ALPMC_MIC_ANALOG_GAIN_MAX_cdB); + +static struct alpx_control_descriptor alp882_mic_control_descriptors[] = { + /* Gain */ + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_IN_BASE + + ALPMC_GAIN_TABLE_BASE(ALP882_CHANNELS_IN_DAW_OFFSET), + .prefix = "DAW Capture", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP882_CHANNELS_DAW_COUNT, + }, + }, + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_IN_BASE + + ALPMC_GAIN_TABLE_BASE(ALP882_CHANNELS_IN_ANALOG_OFFSET), + .prefix = "Ana Capture", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP882_CHANNELS_ANALOG_COUNT, + }, + }, + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_IN_BASE + + ALPMC_GAIN_TABLE_BASE(ALP882_CHANNELS_IN_AES_OFFSET), + .prefix = "AES Capture", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP882_CHANNELS_AES_COUNT, + }, + }, + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_OUT_BASE + + ALPMC_GAIN_TABLE_BASE(ALP882_CHANNELS_OUT_ANALOG_OFFSET), + .prefix = "Ana Playback", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP882_CHANNELS_ANALOG_COUNT, + }, + }, + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_OUT_BASE + + ALPMC_GAIN_TABLE_BASE(ALP882_CHANNELS_OUT_AES_OFFSET), + .prefix = "AES Playback", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP882_CHANNELS_AES_COUNT, + }, + }, + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_OUT_BASE + + ALPMC_GAIN_TABLE_BASE(ALP882_CHANNELS_OUT_DAW_OFFSET), + .prefix = "DAW Playback", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP882_CHANNELS_DAW_COUNT, + }, + }, + /* Mixer */ + { + .type = ALPX_CONTROL_TYPE_MIXER, + .base = ALPMC_MIXER_BASE, + .prefix = "Mxr", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.mixer = { + .lines_count = ALP882_MIXER_SIZE, + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + }, + }, + /* Clock sources Read Only */ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALPMC_CLK_MANAGER_BASE, + .prefix = "Clk Eff Src", + .access = SNDRV_CTL_ELEM_ACCESS_READ, + .data.choice = { + .offset = ALPMC_CLK_MANAGER_CONFIG_REG, + .mask = ALPMC_CLK_MANAGER_CONFIG_CLK_SRC_MASK, + .pos = ALPMC_CLK_MANAGER_CONFIG_CLK_SRC_POS, + .entries = alp882_control_choice_clk_src_entries, + .entries_values = alp882_control_choice_clk_src_entries_values, + .entries_count = ARRAY_SIZE(alp882_control_choice_clk_src_entries), + }, + }, + /* Current Clock BASE Value Read Only */ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALPMC_CLK_MANAGER_BASE, + .prefix = "Clk Eff", + .access = SNDRV_CTL_ELEM_ACCESS_READ | + SNDRV_CTL_ELEM_ACCESS_VOLATILE, + .data.choice = { + .offset = ALPMC_CLK_MANAGER_CONFIG_REG, + .mask = ALPMC_CLK_MANAGER_CONFIG_CLK_CURRENT_VALUE_MASK, + .pos = ALPMC_CLK_MANAGER_CONFIG_CLK_CURRENT_VALUE_POS, + .entries = alpxxx_control_choice_current_clk_values_entries, + .entries_values = alpxxx_control_choice_current_clk_values_entries_values, + .entries_count = ARRAY_SIZE(alpxxx_control_choice_current_clk_values_entries), + }, + }, + + /* Current Clock factor values Read Only, RESERVED now to keep ids order */ + { + .type = ALPX_CONTROL_RESERVED, + .base = ALPMC_CLK_MANAGER_BASE, + .prefix = "RESERVED", + .access = SNDRV_CTL_ELEM_ACCESS_READ, + }, + /* Clock UP on fail over enabled flag */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALP_PROC_BASE, + .prefix = "Clk Src Up", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.flag = { + .offset = ALP_PROC_FWCONFIG_REG, + .mask = ALP_PROC_FWCONFIG_CLKSRC_UP_MASK, + .pos = ALP_PROC_FWCONFIG_CLKSRC_UP_POS, + }, + }, + /* Clock DOWN on fail over enabled flag */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALP_PROC_BASE, + .prefix = "Clk Src Down", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.flag = { + .offset = ALP_PROC_FWCONFIG_REG, + .mask = ALP_PROC_FWCONFIG_CLKSRC_DOWN_MASK, + .pos = ALP_PROC_FWCONFIG_CLKSRC_DOWN_POS, + }, + }, + /* Clock Failover priority 0 TOP*/ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALP_PROC_BASE, + .prefix = "Clk P0", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.choice = { + .offset = ALP_PROC_CLK_SOURCE_PRIO_REG, + .mask = ALP_PROC_CLK_SOURCE_PRIO0_MASK, + .pos = ALP_PROC_CLK_SOURCE_PRIO0_POS, + .entries = alp882_control_choice_clk_src_entries, + .entries_values = alp882_control_choice_clk_src_entries_values, + .entries_count = ARRAY_SIZE(alp882_control_choice_clk_src_entries), + }, + }, + /* Clock Failover priority 1 */ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALP_PROC_BASE, + .prefix = "Clk P1", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.choice = { + .offset = ALP_PROC_CLK_SOURCE_PRIO_REG, + .mask = ALP_PROC_CLK_SOURCE_PRIO1_MASK, + .pos = ALP_PROC_CLK_SOURCE_PRIO1_POS, + .entries = alp882_control_choice_clk_src_entries, + .entries_values = alp882_control_choice_clk_src_entries_values, + .entries_count = ARRAY_SIZE(alp882_control_choice_clk_src_entries), + }, + }, + /* Clock Failover priority 2*/ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALP_PROC_BASE, + .prefix = "Clk P2", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.choice = { + .offset = ALP_PROC_CLK_SOURCE_PRIO_REG, + .mask = ALP_PROC_CLK_SOURCE_PRIO2_MASK, + .pos = ALP_PROC_CLK_SOURCE_PRIO2_POS, + .entries = alp882_control_choice_clk_src_entries, + .entries_values = alp882_control_choice_clk_src_entries_values, + .entries_count = ARRAY_SIZE(alp882_control_choice_clk_src_entries), + }, + }, + /* Clock Failover priority 3*/ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALP_PROC_BASE, + .prefix = "Clk P3", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.choice = { + .offset = ALP_PROC_CLK_SOURCE_PRIO_REG, + .mask = ALP_PROC_CLK_SOURCE_PRIO3_MASK, + .pos = ALP_PROC_CLK_SOURCE_PRIO3_POS, + .entries = alp882_control_choice_clk_src_entries, + .entries_values = alp882_control_choice_clk_src_entries_values, + .entries_count = ARRAY_SIZE(alp882_control_choice_clk_src_entries), + }, + }, + /* Auto AES SRC disable */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "AES SRC 1/2 Disable", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.flag = { + .offset = ALPMC_CODEC_AES_SRC_CONTROL_REG, + .mask = ALPMC_CODEC_AES_SRC_1_2_MASK, + .pos = ALPMC_CODEC_AES_SRC_1_2_POS, + }, + }, + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "AES SRC 3/4 Disable", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.flag = { + .offset = ALPMC_CODEC_AES_SRC_CONTROL_REG, + .mask = ALPMC_CODEC_AES_SRC_3_4_MASK, + .pos = ALPMC_CODEC_AES_SRC_3_4_POS, + }, + }, + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "AES SRC 5/6 Disable", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.flag = { + .offset = ALPMC_CODEC_AES_SRC_CONTROL_REG, + .mask = ALPMC_CODEC_AES_SRC_5_6_MASK, + .pos = ALPMC_CODEC_AES_SRC_5_6_POS, + }, + }, + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "AES SRC 7/8 Disable", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.flag = { + .offset = ALPMC_CODEC_AES_SRC_CONTROL_REG, + .mask = ALPMC_CODEC_AES_SRC_7_8_MASK, + .pos = ALPMC_CODEC_AES_SRC_7_8_POS, + }, + }, + /* Codec Input Gain for MIC Option*/ + { + .type = ALPX_CONTROL_TYPE_ANALOG_EQ, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "Codec MIC Analog Capture", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.codec = { + .offset = ALPMC_CODEC_PGA_REGS, + .gains_scale = alpmc_mic_control_codec_gains_scale, + .reg_gain_min = ALPMC_MIC_ANALOG_GAIN_MIN_REG, + .reg_gain_max = ALPMC_MIC_ANALOG_GAIN_MAX_REG, + .lines_count = 8, + }, + }, + /** MIC Phantoms **/ + /* MIC Phantom 1 */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "McPh1", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.mic_flags = { + .offset = ALPMC_INPUT_PARAMS_REG, + .mask = ALPMC_MIC_INPUT_PH_1_MASK, + .pos = ALPMC_MIC_INPUT_PH_1_POS, + }, + }, + /* MIC Phantom 2 */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "McPh2", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.mic_flags = { + .offset = ALPMC_INPUT_PARAMS_REG, + .mask = ALPMC_MIC_INPUT_PH_2_MASK, + .pos = ALPMC_MIC_INPUT_PH_2_POS, + }, + }, + /* MIC Phantom 3 */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "McPh3", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.mic_flags = { + .offset = ALPMC_INPUT_PARAMS_REG, + .mask = ALPMC_MIC_INPUT_PH_3_MASK, + .pos = ALPMC_MIC_INPUT_PH_3_POS, + }, + }, + /* MIC Phantom 4 */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "McPh4", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.mic_flags = { + .offset = ALPMC_INPUT_PARAMS_REG, + .mask = ALPMC_MIC_INPUT_PH_4_MASK, + .pos = ALPMC_MIC_INPUT_PH_4_POS, + }, + }, + /* MIC Phantom 5 */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "McPh5", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.mic_flags = { + .offset = ALPMC_INPUT_PARAMS_REG, + .mask = ALPMC_MIC_INPUT_PH_5_MASK, + .pos = ALPMC_MIC_INPUT_PH_5_POS, + }, + }, + /* MIC Phantom 6 */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "McPh6", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.mic_flags = { + .offset = ALPMC_INPUT_PARAMS_REG, + .mask = ALPMC_MIC_INPUT_PH_6_MASK, + .pos = ALPMC_MIC_INPUT_PH_6_POS, + }, + }, + /* MIC Phantom 7 */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "McPh7", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.mic_flags = { + .offset = ALPMC_INPUT_PARAMS_REG, + .mask = ALPMC_MIC_INPUT_PH_7_MASK, + .pos = ALPMC_MIC_INPUT_PH_7_POS, + }, + }, + /* MIC Phantom 8 */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "McPh8", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.mic_flags = { + .offset = ALPMC_INPUT_PARAMS_REG, + .mask = ALPMC_MIC_INPUT_PH_8_MASK, + .pos = ALPMC_MIC_INPUT_PH_8_POS, + }, + }, +}; + + +static struct alpx_variant alp882_mic_variant __attribute__((unused)) = { + .shortname = "Alp882e-MIC", + .longname = "Alp 882e MIC", + .model = ALPX_VARIANT_MODEL_ALP882_MIC, + .mixername = "Alp882e_MIC_Mix", + .features = ALPX_VARIANT_FEATURE_GPIOS, + .control_descriptors = alp882_mic_control_descriptors, + .control_descriptors_count = ARRAY_SIZE(alp882_mic_control_descriptors), + + .capture_hw = &alp882_hardware_specs, + .playback_hw = &alp882_hardware_specs, + + .flash_golden_production_base = ALPxxx_FLASH_GOLDEN_PRODUCTION_BASE, + + .gpios = { + .base = ALPMC_GPIO_BASE, + .inputs_reg_offset = ALPMC_GPIO_INPUT_REG, + .inputs_qty = ALPMC_GPIO_INPUT_QTY, + .outputs_reg_offset = ALPMC_GPIO_OUTPUT_REG, + .outputs_qty = ALPMC_GPIO_OUTPUT_QTY, + }, + + .flash_partitions.partitions = alpx_mtd_partitions, + .flash_partitions.qty = ARRAY_SIZE(alpx_mtd_partitions), + .flash_partitions.qty_for_fw_update = 1, +}; + +/* 442 */ +/* Commons clock sources : WARNING : Sme as 882 for the moment */ +static const char *alp442_control_choice_clk_src_entries[ALP442_CLK_MANAGER_CONFIG_CLK_SRC_QTY] = { + "Internal", + "SIC", + "Word Clk", + "AES Syn", + "AES Aud 1/2", + "AES Aud 3/4", +}; + +/* Same order than the constants values */ +static u32 alp442_control_choice_clk_src_entries_values[ALP442_CLK_MANAGER_CONFIG_CLK_SRC_QTY] = { + ALPMC_CLK_MANAGER_SOURCE_INTERNAL, + ALPMC_CLK_MANAGER_SOURCE_SIC, + ALPMC_CLK_MANAGER_SOURCE_WCLK_IN, + ALPMC_CLK_MANAGER_SOURCE_AES_SYNC, + ALPMC_CLK_MANAGER_SOURCE_AES_AUDIO_12, + ALPMC_CLK_MANAGER_SOURCE_AES_AUDIO_34 +}; + +static struct snd_pcm_hardware alp442_hardware_specs = { + .info = SNDRV_PCM_INFO_MMAP | + SNDRV_PCM_INFO_MMAP_VALID | + SNDRV_PCM_INFO_INTERLEAVED | + SNDRV_PCM_INFO_BLOCK_TRANSFER | + SNDRV_PCM_INFO_RESUME, + .formats = SNDRV_PCM_FMTBIT_S32_LE, + .rates = SNDRV_PCM_RATE_CONTINUOUS | + SNDRV_PCM_RATE_8000_192000, + .rate_min = 8000, + .rate_max = 192000, + .channels_min = ALP442_CHANNELS_DAW_COUNT, + .channels_max = ALP442_CHANNELS_DAW_COUNT, + .buffer_bytes_max = 128 * SZ_1K * 4, /* period_bytes_max * periods_max */ + .period_bytes_min = 48, /* min latency 1ms */ + .period_bytes_max = 128 * SZ_1K, /* 20ms at 192kHz * nchans * 4B, rounded at 2^n */ + .periods_min = 1, + .periods_max = 4, +}; + + +/* Alp 442 LINE Variant definition */ + + +static struct alpx_control_descriptor alp442_line_control_descriptors[] = { + /* Gain */ + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_IN_BASE + + ALPMC_GAIN_TABLE_BASE(ALP442_CHANNELS_IN_DAW_OFFSET), + .prefix = "DAW Capture", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP442_CHANNELS_DAW_COUNT, + }, + }, + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_IN_BASE + + ALPMC_GAIN_TABLE_BASE(ALP442_CHANNELS_IN_ANALOG_OFFSET), + .prefix = "Ana Capture", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP442_CHANNELS_ANALOG_COUNT, + }, + }, + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_IN_BASE + + ALPMC_GAIN_TABLE_BASE(ALP442_CHANNELS_IN_AES_OFFSET), + .prefix = "AES Capture", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP442_CHANNELS_AES_COUNT, + }, + }, + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_OUT_BASE + + ALPMC_GAIN_TABLE_BASE(ALP442_CHANNELS_OUT_ANALOG_OFFSET), + .prefix = "Ana Playback", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP442_CHANNELS_ANALOG_COUNT, + }, + }, + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_OUT_BASE + + ALPMC_GAIN_TABLE_BASE(ALP442_CHANNELS_OUT_AES_OFFSET), + .prefix = "AES Playback", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP442_CHANNELS_AES_COUNT, + }, + }, + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_OUT_BASE + + ALPMC_GAIN_TABLE_BASE(ALP442_CHANNELS_OUT_DAW_OFFSET), + .prefix = "DAW Playback", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP442_CHANNELS_DAW_COUNT, + }, + }, + /* Mixer */ + { + .type = ALPX_CONTROL_TYPE_MIXER, + .base = ALPMC_MIXER_BASE, + .prefix = "Mxr", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.mixer = { + .lines_count = ALP442_MIXER_SIZE, + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + }, + }, + /* Clock sources Read Only */ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALPMC_CLK_MANAGER_BASE, + .prefix = "Clk Eff Src", + .access = SNDRV_CTL_ELEM_ACCESS_READ, + .data.choice = { + .offset = ALPMC_CLK_MANAGER_CONFIG_REG, + .mask = ALPMC_CLK_MANAGER_CONFIG_CLK_SRC_MASK, + .pos = ALPMC_CLK_MANAGER_CONFIG_CLK_SRC_POS, + .entries = alp442_control_choice_clk_src_entries, + .entries_values = alp442_control_choice_clk_src_entries_values, + .entries_count = ARRAY_SIZE(alp442_control_choice_clk_src_entries), + }, + }, + + /* Current Clock BASE Value Read Only */ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALPMC_CLK_MANAGER_BASE, + .prefix = "Clk Eff", + .access = SNDRV_CTL_ELEM_ACCESS_READ | + SNDRV_CTL_ELEM_ACCESS_VOLATILE, + .data.choice = { + .offset = ALPMC_CLK_MANAGER_CONFIG_REG, + .mask = ALPMC_CLK_MANAGER_CONFIG_CLK_CURRENT_VALUE_MASK, + .pos = ALPMC_CLK_MANAGER_CONFIG_CLK_CURRENT_VALUE_POS, + .entries = alpxxx_control_choice_current_clk_values_entries, + .entries_values = alpxxx_control_choice_current_clk_values_entries_values, + .entries_count = ARRAY_SIZE(alpxxx_control_choice_current_clk_values_entries), + }, + }, + + /* Current Clock factor values Read Only, RESERVED to keep Ids order */ + { + .type = ALPX_CONTROL_RESERVED, + .base = ALPMC_CLK_MANAGER_BASE, + .prefix = "RESERVED", + .access = SNDRV_CTL_ELEM_ACCESS_READ, + }, + /* Clock UP on fail over enabled flag */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALP_PROC_BASE, + .prefix = "Clk Src Up", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.flag = { + .offset = ALP_PROC_FWCONFIG_REG, + .mask = ALP_PROC_FWCONFIG_CLKSRC_UP_MASK, + .pos = ALP_PROC_FWCONFIG_CLKSRC_UP_POS, + }, + }, + /* Clock DOWN on fail over enabled flag */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALP_PROC_BASE, + .prefix = "Clk Src Down", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.flag = { + .offset = ALP_PROC_FWCONFIG_REG, + .mask = ALP_PROC_FWCONFIG_CLKSRC_DOWN_MASK, + .pos = ALP_PROC_FWCONFIG_CLKSRC_DOWN_POS, + }, + }, + /* Clock Failover priority 0 TOP*/ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALP_PROC_BASE, + .prefix = "Clk P0", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.choice = { + .offset = ALP_PROC_CLK_SOURCE_PRIO_REG, + .mask = ALP_PROC_CLK_SOURCE_PRIO0_MASK, + .pos = ALP_PROC_CLK_SOURCE_PRIO0_POS, + .entries = alp442_control_choice_clk_src_entries, + .entries_values = alp442_control_choice_clk_src_entries_values, + .entries_count = ARRAY_SIZE(alp442_control_choice_clk_src_entries), + }, + }, + /* Clock Failover priority 1 */ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALP_PROC_BASE, + .prefix = "Clk P1", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.choice = { + .offset = ALP_PROC_CLK_SOURCE_PRIO_REG, + .mask = ALP_PROC_CLK_SOURCE_PRIO1_MASK, + .pos = ALP_PROC_CLK_SOURCE_PRIO1_POS, + .entries = alp442_control_choice_clk_src_entries, + .entries_values = alp442_control_choice_clk_src_entries_values, + .entries_count = ARRAY_SIZE(alp442_control_choice_clk_src_entries), + }, + }, + /* Clock Failover priority 2*/ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALP_PROC_BASE, + .prefix = "Clk P2", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.choice = { + .offset = ALP_PROC_CLK_SOURCE_PRIO_REG, + .mask = ALP_PROC_CLK_SOURCE_PRIO2_MASK, + .pos = ALP_PROC_CLK_SOURCE_PRIO2_POS, + .entries = alp442_control_choice_clk_src_entries, + .entries_values = alp442_control_choice_clk_src_entries_values, + .entries_count = ARRAY_SIZE(alp442_control_choice_clk_src_entries), + }, + }, + /* Clock Failover priority 3*/ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALP_PROC_BASE, + .prefix = "Clk P3", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.choice = { + .offset = ALP_PROC_CLK_SOURCE_PRIO_REG, + .mask = ALP_PROC_CLK_SOURCE_PRIO3_MASK, + .pos = ALP_PROC_CLK_SOURCE_PRIO3_POS, + .entries = alp442_control_choice_clk_src_entries, + .entries_values = alp442_control_choice_clk_src_entries_values, + .entries_count = ARRAY_SIZE(alp442_control_choice_clk_src_entries), + }, + }, + /* Auto AES SRC disable */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "AES SRC 1/2 Disable", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.flag = { + .offset = ALPMC_CODEC_AES_SRC_CONTROL_REG, + .mask = ALPMC_CODEC_AES_SRC_1_2_MASK, + .pos = ALPMC_CODEC_AES_SRC_1_2_POS, + }, + }, + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "AES SRC 3/4 Disable", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.flag = { + .offset = ALPMC_CODEC_AES_SRC_CONTROL_REG, + .mask = ALPMC_CODEC_AES_SRC_3_4_MASK, + .pos = ALPMC_CODEC_AES_SRC_3_4_POS, + }, + }, + /* Codec Input Gain for LINE Option*/ + { + .type = ALPX_CONTROL_TYPE_ANALOG_EQ, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "Codec Analog Capture", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.codec = { + .offset = ALPMC_CODEC_PGA_REGS, + .gains_scale = alpmc_line_control_codec_gains_scale, + .reg_gain_min = ALPMC_LINE_ANALOG_GAIN_MIN_REG, + .reg_gain_max = ALPMC_LINE_ANALOG_GAIN_MAX_REG, + .lines_count = ALP442_CHANNELS_ANALOG_COUNT, + }, + }, +}; + +static struct alpx_variant alp442_line_variant __attribute__((unused)) = { + .shortname = "Alp442e", + .longname = "Alp 442e", + .model = ALPX_VARIANT_MODEL_ALP442, + .mixername = "Alp442e_Mix", + .features = ALPX_VARIANT_FEATURE_GPIOS, + .control_descriptors = alp442_line_control_descriptors, + .control_descriptors_count = ARRAY_SIZE(alp442_line_control_descriptors), + + .capture_hw = &alp442_hardware_specs, + .playback_hw = &alp442_hardware_specs, + + .flash_golden_production_base = ALPxxx_FLASH_GOLDEN_PRODUCTION_BASE, + + .gpios = {/*Same as Alp882*/ + .base = ALPMC_GPIO_BASE, + .inputs_reg_offset = ALPMC_GPIO_INPUT_REG, + .inputs_qty = ALPMC_GPIO_INPUT_QTY, + .outputs_reg_offset = ALPMC_GPIO_OUTPUT_REG, + .outputs_qty = ALPMC_GPIO_OUTPUT_QTY, + }, + + .flash_partitions.partitions = alpx_mtd_partitions, + .flash_partitions.qty = ARRAY_SIZE(alpx_mtd_partitions), + .flash_partitions.qty_for_fw_update = 1, +}; + + +/* Alp 442 - MIC Variant definition */ + +static struct alpx_control_descriptor alp442_mic_control_descriptors[] = { + /* Gain */ + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_IN_BASE + + ALPMC_GAIN_TABLE_BASE(ALP442_CHANNELS_IN_DAW_OFFSET), + .prefix = "DAW Capture", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP442_CHANNELS_DAW_COUNT, + }, + }, + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_IN_BASE + + ALPMC_GAIN_TABLE_BASE(ALP442_CHANNELS_IN_ANALOG_OFFSET), + .prefix = "Ana Capture", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP442_CHANNELS_ANALOG_COUNT, + }, + }, + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_IN_BASE + + ALPMC_GAIN_TABLE_BASE(ALP442_CHANNELS_IN_AES_OFFSET), + .prefix = "AES Capture", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP442_CHANNELS_AES_COUNT, + }, + }, + { + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_OUT_BASE + + ALPMC_GAIN_TABLE_BASE(ALP442_CHANNELS_OUT_ANALOG_OFFSET), + .prefix = "Ana Playback", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP442_CHANNELS_ANALOG_COUNT, + }, + }, + {/*a 882 with halved QTY*/ + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_OUT_BASE + + ALPMC_GAIN_TABLE_BASE(ALP442_CHANNELS_OUT_AES_OFFSET), + .prefix = "AES Playback", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP442_CHANNELS_AES_COUNT, + }, + }, + {/*a 882 with halved QTY*/ + .type = ALPX_CONTROL_TYPE_AMPLIFIER, + .base = ALPMC_AMPLI_OUT_BASE + + ALPMC_GAIN_TABLE_BASE(ALP442_CHANNELS_OUT_DAW_OFFSET), + .prefix = "DAW Playback", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.ampli = { + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + .lines_count = ALP442_CHANNELS_DAW_COUNT, + }, + }, + /* Mixer a 882 with halved QTY Mixer : square*/ + { + .type = ALPX_CONTROL_TYPE_MIXER, + .base = ALPMC_MIXER_BASE, + .prefix = "Mxr", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.mixer = { + .lines_count = ALP442_MIXER_SIZE, + .gains_scale = alpxxx_line_digital_gains_scale, + .reg_gain_min = ALP_AMPLIFIER_GAIN_MIN_REG, + .reg_gain_max = ALP_AMPLIFIER_GAIN_MAX_REG, + }, + }, + /* Clock sources Read Only As 882 except for AES due to 4 entries only */ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALPMC_CLK_MANAGER_BASE, + .prefix = "Clk Eff Src", + .access = SNDRV_CTL_ELEM_ACCESS_READ, + .data.choice = { + .offset = ALPMC_CLK_MANAGER_CONFIG_REG, + .mask = ALPMC_CLK_MANAGER_CONFIG_CLK_SRC_MASK, + .pos = ALPMC_CLK_MANAGER_CONFIG_CLK_SRC_POS, + .entries = alp442_control_choice_clk_src_entries, + .entries_values = alp442_control_choice_clk_src_entries_values, + .entries_count = ARRAY_SIZE(alp442_control_choice_clk_src_entries), + }, + }, + /* Current Clock Value Read Only */ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALPMC_CLK_MANAGER_BASE, + .prefix = "Clk Eff", + .access = SNDRV_CTL_ELEM_ACCESS_READ | + SNDRV_CTL_ELEM_ACCESS_VOLATILE, + .data.choice = { + .offset = ALPMC_CLK_MANAGER_CONFIG_REG, + .mask = ALPMC_CLK_MANAGER_CONFIG_CLK_CURRENT_VALUE_MASK, + .pos = ALPMC_CLK_MANAGER_CONFIG_CLK_CURRENT_VALUE_POS, + .entries = alpxxx_control_choice_current_clk_values_entries, + .entries_values = alpxxx_control_choice_current_clk_values_entries_values, + .entries_count = ARRAY_SIZE(alpxxx_control_choice_current_clk_values_entries), + }, + }, + + /* Current Clock factor values Read Only, RESERVED now to keep ids order */ + { + .type = ALPX_CONTROL_RESERVED, + .base = ALPMC_CLK_MANAGER_BASE, + .prefix = "RESERVED", + .access = SNDRV_CTL_ELEM_ACCESS_READ, + }, + /* Clock UP on fail over enabled flag */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALP_PROC_BASE, + .prefix = "Clk Src Up", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.flag = { + .offset = ALP_PROC_FWCONFIG_REG, + .mask = ALP_PROC_FWCONFIG_CLKSRC_UP_MASK, + .pos = ALP_PROC_FWCONFIG_CLKSRC_UP_POS, + }, + }, + /* Clock DOWN on fail over enabled flag */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALP_PROC_BASE, + .prefix = "Clk Src Down", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.flag = { + .offset = ALP_PROC_FWCONFIG_REG, + .mask = ALP_PROC_FWCONFIG_CLKSRC_DOWN_MASK, + .pos = ALP_PROC_FWCONFIG_CLKSRC_DOWN_POS, + }, + }, + /* Clock Failover priority 0 TOP*/ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALP_PROC_BASE, + .prefix = "Clk P0", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.choice = { + .offset = ALP_PROC_CLK_SOURCE_PRIO_REG, + .mask = ALP_PROC_CLK_SOURCE_PRIO0_MASK, + .pos = ALP_PROC_CLK_SOURCE_PRIO0_POS, + .entries = alp442_control_choice_clk_src_entries, + .entries_values = alp442_control_choice_clk_src_entries_values, + .entries_count = ARRAY_SIZE(alp442_control_choice_clk_src_entries), + }, + }, + /* Clock Failover priority 1 */ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALP_PROC_BASE, + .prefix = "Clk P1", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.choice = { + .offset = ALP_PROC_CLK_SOURCE_PRIO_REG, + .mask = ALP_PROC_CLK_SOURCE_PRIO1_MASK, + .pos = ALP_PROC_CLK_SOURCE_PRIO1_POS, + .entries = alp442_control_choice_clk_src_entries, + .entries_values = alp442_control_choice_clk_src_entries_values, + .entries_count = ARRAY_SIZE(alp442_control_choice_clk_src_entries), + }, + }, + /* Clock Failover priority 2*/ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALP_PROC_BASE, + .prefix = "Clk P2", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.choice = { + .offset = ALP_PROC_CLK_SOURCE_PRIO_REG, + .mask = ALP_PROC_CLK_SOURCE_PRIO2_MASK, + .pos = ALP_PROC_CLK_SOURCE_PRIO2_POS, + .entries = alp442_control_choice_clk_src_entries, + .entries_values = alp442_control_choice_clk_src_entries_values, + .entries_count = ARRAY_SIZE(alp442_control_choice_clk_src_entries), + }, + }, + /* Clock Failover priority 3*/ + { + .type = ALPX_CONTROL_TYPE_CHOICE, + .base = ALP_PROC_BASE, + .prefix = "Clk P3", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.choice = { + .offset = ALP_PROC_CLK_SOURCE_PRIO_REG, + .mask = ALP_PROC_CLK_SOURCE_PRIO3_MASK, + .pos = ALP_PROC_CLK_SOURCE_PRIO3_POS, + .entries = alp442_control_choice_clk_src_entries, + .entries_values = alp442_control_choice_clk_src_entries_values, + .entries_count = ARRAY_SIZE(alp442_control_choice_clk_src_entries), + }, + }, + /* Auto AES SRC disable SAME as Alp882 except for qty*/ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "AES SRC 1/2 Disable", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.flag = { + .offset = ALPMC_CODEC_AES_SRC_CONTROL_REG, + .mask = ALPMC_CODEC_AES_SRC_1_2_MASK, + .pos = ALPMC_CODEC_AES_SRC_1_2_POS, + }, + }, + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "AES SRC 3/4 Disable", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.flag = { + .offset = ALPMC_CODEC_AES_SRC_CONTROL_REG, + .mask = ALPMC_CODEC_AES_SRC_3_4_MASK, + .pos = ALPMC_CODEC_AES_SRC_3_4_POS, + }, + }, + /* Codec Input Gain for MIC Option SAME as 882 execpt for qty*/ + { + .type = ALPX_CONTROL_TYPE_ANALOG_EQ, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "Codec MIC Analog Capture", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | + SNDRV_CTL_ELEM_ACCESS_TLV_READ, + .data.codec = { + .offset = ALPMC_CODEC_PGA_REGS, + .gains_scale = alpmc_mic_control_codec_gains_scale, + .reg_gain_min = ALPMC_MIC_ANALOG_GAIN_MIN_REG, + .reg_gain_max = ALPMC_MIC_ANALOG_GAIN_MAX_REG, + .lines_count = ALP442_CHANNELS_ANALOG_COUNT, + }, + }, + /** MIC Phantoms SAME as 882 except for qty **/ + /* MIC Phantom 1 */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "McPh1", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.mic_flags = { + .offset = ALPMC_INPUT_PARAMS_REG, + .mask = ALPMC_MIC_INPUT_PH_1_MASK, + .pos = ALPMC_MIC_INPUT_PH_1_POS, + }, + }, + /* MIC Phantom 2 */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "McPh2", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.mic_flags = { + .offset = ALPMC_INPUT_PARAMS_REG, + .mask = ALPMC_MIC_INPUT_PH_2_MASK, + .pos = ALPMC_MIC_INPUT_PH_2_POS, + }, + }, + /* MIC Phantom 3 */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "McPh3", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.mic_flags = { + .offset = ALPMC_INPUT_PARAMS_REG, + .mask = ALPMC_MIC_INPUT_PH_3_MASK, + .pos = ALPMC_MIC_INPUT_PH_3_POS, + }, + }, + /* MIC Phantom 4 */ + { + .type = ALPX_CONTROL_TYPE_FLAG, + .base = ALPMC_CODEC_CTRL_BASE, + .prefix = "McPh4", + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, + .data.mic_flags = { + .offset = ALPMC_INPUT_PARAMS_REG, + .mask = ALPMC_MIC_INPUT_PH_4_MASK, + .pos = ALPMC_MIC_INPUT_PH_4_POS, + }, + }, +}; + + +static struct alpx_variant alp442_mic_variant __attribute__((unused)) = { + .shortname = "Alp442e-MIC", + .longname = "Alp 442e MIC", + .model = ALPX_VARIANT_MODEL_ALP442_MIC, + .mixername = "Alp442e_MIC_Mix", + .features = ALPX_VARIANT_FEATURE_GPIOS, + .control_descriptors = alp442_mic_control_descriptors, + .control_descriptors_count = ARRAY_SIZE(alp442_mic_control_descriptors), + + .capture_hw = &alp442_hardware_specs, + .playback_hw = &alp442_hardware_specs, + + .flash_golden_production_base = ALPxxx_FLASH_GOLDEN_PRODUCTION_BASE, + + .gpios = {/* Same as 882 */ + .base = ALPMC_GPIO_BASE, + .inputs_reg_offset = ALPMC_GPIO_INPUT_REG, + .inputs_qty = ALPMC_GPIO_INPUT_QTY, + .outputs_reg_offset = ALPMC_GPIO_OUTPUT_REG, + .outputs_qty = ALPMC_GPIO_OUTPUT_QTY, + }, + + .flash_partitions.partitions = alpx_mtd_partitions, + .flash_partitions.qty = ARRAY_SIZE(alpx_mtd_partitions), + .flash_partitions.qty_for_fw_update = 1, +}; + + +#endif /* _ALPX_VARIANTS_MC_H_ */ |