summaryrefslogtreecommitdiff
path: root/snd-alpx-dkms/snd-alpx/alpx.h
diff options
context:
space:
mode:
Diffstat (limited to 'snd-alpx-dkms/snd-alpx/alpx.h')
-rw-r--r--snd-alpx-dkms/snd-alpx/alpx.h268
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