diff options
Diffstat (limited to 'snd-alpx-dkms/snd-alpx/alpx.h')
-rw-r--r-- | snd-alpx-dkms/snd-alpx/alpx.h | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/snd-alpx-dkms/snd-alpx/alpx.h b/snd-alpx-dkms/snd-alpx/alpx.h new file mode 100644 index 0000000..2cad9b9 --- /dev/null +++ b/snd-alpx-dkms/snd-alpx/alpx.h @@ -0,0 +1,268 @@ +// 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 <linux/version.h> + +#if !defined (CONFIG_WITHOUT_GPIO) +#define ALPX_WITH_GPIO +#include <linux/gpio.h> +#include <linux/gpio/driver.h> +#endif + +#include <linux/mtd/mtd.h> +#include <linux/mtd/partitions.h> +#include <linux/mutex.h> +#include <sound/pcm.h> + +/* 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 |