// 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_H_ #define _ALPX_H_ #include "alpx_reg.h" #include "alpx_streams.h" #include #if !defined (CONFIG_WITHOUT_GPIO) #define ALPX_WITH_GPIO #include #include #endif #include #include #include #include /* Values */ #define CARD_NAME "Digigram AlpX" #define ALPX_VARIANT_FEATURE_GPIOS BIT(0) /* Structures */ enum alpx_variant_model { ALPX_VARIANT_DEAD, ALPX_VARIANT_MODEL_MADI, ALPX_VARIANT_MODEL_MADI_LOOPBACK, ALPX_VARIANT_MODEL_ALP222, ALPX_VARIANT_MODEL_ALP222_MIC, ALPX_VARIANT_MODEL_ALP882, ALPX_VARIANT_MODEL_ALP882_MIC, ALPX_VARIANT_MODEL_ALP442, ALPX_VARIANT_MODEL_ALP442_MIC, ALPX_VARIANT_MODEL_ALPDANTE, }; /* Flash partitions IDs */ enum ALPX_FLASH_PARTITION_ID { ALPX_FLASH_PARTITION_GOLDEN_ID = 0, ALPX_FLASH_PARTITION_FW_ID, ALPX_FLASH_PARTITION_INIT_CFG_ID, ALPX_FLASH_PARTITION_USER_CFG_ID, ALPX_FLASH_PARTITION_PRODUCTION_ID, ALPX_FLASH_PARTITION_QTY }; /* Flash partitions IDs in DEAD mode ! only production */ enum ALPX_DEAD_FLASH_PARTITION_ID { ALPX_DEAD_FLASH_PARTITION_GOLDEN_PROD_ID = 0, ALPX_DEAD_FLASH_PARTITION_PRODUCTION_ID, ALPX_DEAD_FLASH_PARTITION_QTY }; /* Structures */ struct alpx_variant_gpios { unsigned int base; unsigned int inputs_reg_offset; unsigned int inputs_qty; unsigned int outputs_reg_offset; unsigned int outputs_qty; }; struct alpx_flash_partitions { struct mtd_partition* partitions; uint32_t qty; uint32_t qty_for_fw_update; }; struct alpx_variant { enum alpx_variant_model model; const char *shortname; const char *longname; const char *mixername; u64 features; struct alpx_control_descriptor *control_descriptors; unsigned int control_descriptors_count; struct snd_pcm_hardware* playback_hw; struct snd_pcm_hardware* capture_hw; struct alpx_variant_gpios gpios; uint32_t flash_golden_production_base; struct alpx_flash_partitions flash_partitions; }; struct alpx_config { spinlock_t lock; unsigned int users; unsigned int rate; }; struct alpx_identity { uint16_t sub_system_id; /* PCIe sub-system Id as read out of Production area*/ uint32_t ver_fpga; /* FPGA version */ uint32_t ver_mcu; /* MCU version.revision !! */ uint64_t serial_number; /* Card full identifier tag */ }; struct alpx_device { struct device *dev; struct pci_dev *pci_dev; #if defined(ALPX_WITH_GPIO) struct gpio_chip gpio_chip; #endif void *base; struct platform_device *xdma_pdev; struct alpx_config config; struct alpx_control *controls; unsigned int controls_index; unsigned int controls_count; struct alpx_pipe capture; struct alpx_pipe playback; const struct alpx_variant *variant; struct mutex proc_mutex; struct mtd_info mtd_info; #ifdef WITH_REG_DEBUG uint32_t dbg_reg_offset; #endif struct alpx_identity identity; }; /* Constants */ // The flash chip size (in bytes). #define ALPX_FLASH_CHIP_SIZE 0x800000 // Sector size conversions #define ALPX_FLASH_SECTOR_SHIFT 12 #define ALPX_FLASH_SECTOR_SIZE (1 << ALPX_FLASH_SECTOR_SHIFT) /* Amplifiers gains */ #define ALP_AMPLIFIER_GAIN_MIN_cdB -9010 #define ALP_AMPLIFIER_GAIN_MAX_cdB 1200 #define ALP_AMPLIFIER_GAIN_MIN_REG 0 #define ALP_AMPLIFIER_GAIN_MAX_REG 1021 /* MIC Gains tange in dB */ #define ALP222_MIC_GAINS_MIN_REG_VAL 10 #define ALP222_MIC_GAINS_MAX_REG_VAL 65 #define ALP222_MIC_REG_GAIN_SHIFT 9 #define ALP222_MIC_GAIN_MIN_cdB 1000 #define ALP222_MIC_GAIN_MAX_cdB 6500 /* ALP222 ANALOG Equalization amplifiers */ #define ALP222_ANALOG_EQ_GAIN_MIN_cdB -8800 #define ALP222_ANALOG_EQ_GAIN_MAX_cdB 3900 #define ALP222_ANALOG_EQ_GAIN_MIN_REG 0 #define ALP222_ANALOG_EQ_GAIN_MAX_REG 255 /* Registers offset range : from 0x60000 up to 0x7C200*/ #define ALP222_MIN_REG_OFFSET 0x60000 #define ALP222_MAX_REG_OFFSET 0x7C200 /* Special revisions */ /* -The design version is 1.5- */ #define ALP222_1_5_DESIGN_VERSION ((1<<16)|(5)) /* BUILD version register appears in version :... */ #define ALP222_DESIGN_WITH_BUILD_REGISTER_VERSION ALP222_1_5_DESIGN_VERSION /* Range of the LINE/MIC gains (in register domain)*/ #define ALPMC_LINE_ANALOG_GAIN_MIN_REG 0 #define ALPMC_LINE_ANALOG_GAIN_MIN_cdB -2400 #define ALPMC_MIC_ANALOG_GAIN_MIN_REG ALPMC_LINE_ANALOG_GAIN_MIN_REG #define ALPMC_MIC_ANALOG_GAIN_MIN_cdB ALPMC_LINE_ANALOG_GAIN_MIN_cdB /* Gain formula : G = (0.5*(N-1)-24), N : register value */ /* 161 => +56dB */ #define ALPMC_MIC_ANALOG_GAIN_MAX_REG 162 #define ALPMC_MIC_ANALOG_GAIN_MAX_cdB 5600 /* 82 => +16dB */ #define ALPMC_LINE_ANALOG_GAIN_MAX_REG 82 #define ALPMC_LINE_ANALOG_GAIN_MAX_cdB 1600 static bool inline alpx_is_madi(struct alpx_device *alpx_dev) { return alpx_dev->variant->model == ALPX_VARIANT_MODEL_MADI || alpx_dev->variant->model == ALPX_VARIANT_MODEL_MADI_LOOPBACK; } static bool inline alpx_is_222_line(struct alpx_device *alpx_dev) { return alpx_dev->variant->model == ALPX_VARIANT_MODEL_ALP222; } static bool inline alpx_is_222_mic(struct alpx_device *alpx_dev) { return alpx_dev->variant->model == ALPX_VARIANT_MODEL_ALP222_MIC; } static bool inline alpx_is_222(struct alpx_device *alpx_dev) { return alpx_is_222_line(alpx_dev) || alpx_is_222_mic(alpx_dev); } static bool inline alpx_is_882_line(struct alpx_device *alpx_dev) { return alpx_dev->variant->model == ALPX_VARIANT_MODEL_ALP882; } static bool inline alpx_is_882_mic(struct alpx_device *alpx_dev) { return alpx_dev->variant->model == ALPX_VARIANT_MODEL_ALP882_MIC; } static bool inline alpx_is_882(struct alpx_device *alpx_dev) { return alpx_is_882_line(alpx_dev) || alpx_is_882_line(alpx_dev); } static bool inline alpx_is_442_line(struct alpx_device *alpx_dev) { return alpx_dev->variant->model == ALPX_VARIANT_MODEL_ALP442; } static bool inline alpx_is_442_mic(struct alpx_device *alpx_dev) { return alpx_dev->variant->model == ALPX_VARIANT_MODEL_ALP442_MIC; } static bool inline alpx_is_442(struct alpx_device *alpx_dev) { return alpx_is_442_line(alpx_dev) || alpx_is_442_line(alpx_dev); } static bool inline alpx_is_multichannel(struct alpx_device *alpx_dev) { return alpx_is_882(alpx_dev) || alpx_is_442(alpx_dev); } static bool inline alpx_is_dante (struct alpx_device *alpx_dev) { return alpx_dev->variant->model == ALPX_VARIANT_MODEL_ALPDANTE; } unsigned int alpx_get_samples_counter(struct alpx_device *alpx_dev); #endif