ASoc: PCM6240: Create header file for PCM6240 Family driver code
authorShenghao Ding <shenghao-ding@ti.com>
Sun, 7 Apr 2024 09:18:43 +0000 (17:18 +0800)
committerMark Brown <broonie@kernel.org>
Sun, 21 Apr 2024 14:30:50 +0000 (23:30 +0900)
PCM6240 driver implements a flexible and configurable setting for register
and filter coefficients, to one, two or even multiple PCM6240 Family Audio
chips.

Signed-off-by: Shenghao Ding <shenghao-ding@ti.com>
Link: https://lore.kernel.org/r/20240407091846.1299-3-shenghao-ding@ti.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/pcm6240.h [new file with mode: 0644]

diff --git a/sound/soc/codecs/pcm6240.h b/sound/soc/codecs/pcm6240.h
new file mode 100644 (file)
index 0000000..1e125bb
--- /dev/null
@@ -0,0 +1,252 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+//
+// ALSA SoC Texas Instruments PCM6240 Family Audio ADC/DAC/Router
+//
+// Copyright (C) 2022 - 2024 Texas Instruments Incorporated
+// https://www.ti.com
+//
+// The PCM6240 driver implements a flexible and configurable
+// algo coefficient setting for one, two, or even multiple
+// PCM6240 Family Audio chips.
+//
+// Author: Shenghao Ding <shenghao-ding@ti.com>
+//
+
+#ifndef __PCM6240_H__
+#define __PCM6240_H__
+
+enum pcm_device {
+       ADC3120,
+       ADC5120,
+       ADC6120,
+       DIX4192,
+       PCM1690,
+       PCM3120,
+       PCM3140,
+       PCM5120,
+       PCM5140,
+       PCM6120,
+       PCM6140,
+       PCM6240,
+       PCM6260,
+       PCM9211,
+       PCMD3140,
+       PCMD3180,
+       PCMD512X,
+       TAA5212,
+       TAA5412,
+       TAD5212,
+       TAD5412,
+       MAX_DEVICE,
+};
+
+#define PCMDEV_GENERIC_VOL_CTRL                        0x0
+#define PCMDEV_PCM1690_VOL_CTRL                        0x1
+#define PCMDEV_PCM1690_FINE_VOL_CTRL           0x2
+
+/* Maximum number of I2C addresses */
+#define PCMDEVICE_MAX_I2C_DEVICES              4
+/* Maximum number defined in REGBIN protocol */
+#define PCMDEVICE_MAX_REGBIN_DEVICES           8
+#define PCMDEVICE_CONFIG_SUM                   64
+#define PCMDEVICE_BIN_FILENAME_LEN             64
+
+#define PCMDEVICE_RATES        (SNDRV_PCM_RATE_44100 | \
+       SNDRV_PCM_RATE_48000)
+#define PCMDEVICE_MAX_CHANNELS                 8
+#define PCMDEVICE_FORMATS      (SNDRV_PCM_FMTBIT_S16_LE | \
+       SNDRV_PCM_FMTBIT_S20_3LE | \
+       SNDRV_PCM_FMTBIT_S24_3LE | \
+       SNDRV_PCM_FMTBIT_S24_LE | \
+       SNDRV_PCM_FMTBIT_S32_LE)
+
+/* PAGE Control Register (available in page0 of each book) */
+#define PCMDEVICE_PAGE_SELECT                  0x00
+#define PCMDEVICE_REG(page, reg)               ((page * 128) + reg)
+#define PCMDEVICE_REG_SWRESET                  PCMDEVICE_REG(0X0, 0x01)
+#define PCMDEVICE_REG_SWRESET_RESET            BIT(0)
+
+#define ADC5120_REG_CH1_ANALOG_GAIN            PCMDEVICE_REG(0X0, 0x3d)
+#define ADC5120_REG_CH1_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x3e)
+#define ADC5120_REG_CH2_ANALOG_GAIN            PCMDEVICE_REG(0X0, 0x42)
+#define ADC5120_REG_CH2_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x43)
+
+#define PCM1690_REG_MODE_CTRL                  PCMDEVICE_REG(0X0, 0x46)
+#define PCM1690_REG_MODE_CTRL_DAMS_MSK         BIT(7)
+#define PCM1690_REG_MODE_CTRL_DAMS_FINE_STEP   0x0
+#define PCM1690_REG_MODE_CTRL_DAMS_WIDE_RANGE  0x80
+
+#define PCM1690_REG_CH1_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x48)
+#define PCM1690_REG_CH2_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x49)
+#define PCM1690_REG_CH3_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x4a)
+#define PCM1690_REG_CH4_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x4b)
+#define PCM1690_REG_CH5_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x4c)
+#define PCM1690_REG_CH6_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x4d)
+#define PCM1690_REG_CH7_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x4e)
+#define PCM1690_REG_CH8_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x4f)
+
+#define PCM6240_REG_CH1_ANALOG_GAIN            PCMDEVICE_REG(0X0, 0x3d)
+#define PCM6240_REG_CH1_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x3e)
+#define PCM6240_REG_CH2_ANALOG_GAIN            PCMDEVICE_REG(0X0, 0x42)
+#define PCM6240_REG_CH2_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x43)
+#define PCM6240_REG_CH3_ANALOG_GAIN            PCMDEVICE_REG(0X0, 0x47)
+#define PCM6240_REG_CH3_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x48)
+#define PCM6240_REG_CH4_ANALOG_GAIN            PCMDEVICE_REG(0X0, 0x4c)
+#define PCM6240_REG_CH4_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x4d)
+
+#define PCM6260_REG_CH1_ANALOG_GAIN            PCMDEVICE_REG(0X0, 0x3d)
+#define PCM6260_REG_CH1_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x3e)
+#define PCM6260_REG_CH2_ANALOG_GAIN            PCMDEVICE_REG(0X0, 0x42)
+#define PCM6260_REG_CH2_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x43)
+#define PCM6260_REG_CH3_ANALOG_GAIN            PCMDEVICE_REG(0X0, 0x47)
+#define PCM6260_REG_CH3_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x48)
+#define PCM6260_REG_CH4_ANALOG_GAIN            PCMDEVICE_REG(0X0, 0x4c)
+#define PCM6260_REG_CH4_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x4d)
+#define PCM6260_REG_CH5_ANALOG_GAIN            PCMDEVICE_REG(0X0, 0x51)
+#define PCM6260_REG_CH5_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x52)
+#define PCM6260_REG_CH6_ANALOG_GAIN            PCMDEVICE_REG(0X0, 0x56)
+#define PCM6260_REG_CH6_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x57)
+
+#define PCM9211_REG_SW_CTRL                    PCMDEVICE_REG(0X0, 0x40)
+#define PCM9211_REG_SW_CTRL_MRST_MSK           BIT(7)
+#define PCM9211_REG_SW_CTRL_MRST               0x0
+
+#define PCM9211_REG_CH1_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x46)
+#define PCM9211_REG_CH2_DIGITAL_GAIN           PCMDEVICE_REG(0X0, 0x47)
+
+#define PCMD3140_REG_CH1_DIGITAL_GAIN          PCMDEVICE_REG(0X0, 0x3E)
+#define PCMD3140_REG_CH2_DIGITAL_GAIN          PCMDEVICE_REG(0X0, 0x43)
+#define PCMD3140_REG_CH3_DIGITAL_GAIN          PCMDEVICE_REG(0X0, 0x48)
+#define PCMD3140_REG_CH4_DIGITAL_GAIN          PCMDEVICE_REG(0X0, 0x4D)
+
+#define PCMD3140_REG_CH1_FINE_GAIN             PCMDEVICE_REG(0X0, 0x3F)
+#define PCMD3140_REG_CH2_FINE_GAIN             PCMDEVICE_REG(0X0, 0x44)
+#define PCMD3140_REG_CH3_FINE_GAIN             PCMDEVICE_REG(0X0, 0x49)
+#define PCMD3140_REG_CH4_FINE_GAIN             PCMDEVICE_REG(0X0, 0x4E)
+
+#define PCMD3180_REG_CH1_DIGITAL_GAIN          PCMDEVICE_REG(0X0, 0x3E)
+#define PCMD3180_REG_CH2_DIGITAL_GAIN          PCMDEVICE_REG(0X0, 0x43)
+#define PCMD3180_REG_CH3_DIGITAL_GAIN          PCMDEVICE_REG(0X0, 0x48)
+#define PCMD3180_REG_CH4_DIGITAL_GAIN          PCMDEVICE_REG(0X0, 0x4D)
+#define PCMD3180_REG_CH5_DIGITAL_GAIN          PCMDEVICE_REG(0X0, 0x52)
+#define PCMD3180_REG_CH6_DIGITAL_GAIN          PCMDEVICE_REG(0X0, 0x57)
+#define PCMD3180_REG_CH7_DIGITAL_GAIN          PCMDEVICE_REG(0X0, 0x5C)
+#define PCMD3180_REG_CH8_DIGITAL_GAIN          PCMDEVICE_REG(0X0, 0x61)
+
+#define PCMD3180_REG_CH1_FINE_GAIN             PCMDEVICE_REG(0X0, 0x3F)
+#define PCMD3180_REG_CH2_FINE_GAIN             PCMDEVICE_REG(0X0, 0x44)
+#define PCMD3180_REG_CH3_FINE_GAIN             PCMDEVICE_REG(0X0, 0x49)
+#define PCMD3180_REG_CH4_FINE_GAIN             PCMDEVICE_REG(0X0, 0x4E)
+#define PCMD3180_REG_CH5_FINE_GAIN             PCMDEVICE_REG(0X0, 0x53)
+#define PCMD3180_REG_CH6_FINE_GAIN             PCMDEVICE_REG(0X0, 0x58)
+#define PCMD3180_REG_CH7_FINE_GAIN             PCMDEVICE_REG(0X0, 0x5D)
+#define PCMD3180_REG_CH8_FINE_GAIN             PCMDEVICE_REG(0X0, 0x62)
+
+#define TAA5412_REG_CH1_DIGITAL_VOLUME         PCMDEVICE_REG(0X0, 0x52)
+#define TAA5412_REG_CH2_DIGITAL_VOLUME         PCMDEVICE_REG(0X0, 0x57)
+#define TAA5412_REG_CH3_DIGITAL_VOLUME         PCMDEVICE_REG(0X0, 0x5B)
+#define TAA5412_REG_CH4_DIGITAL_VOLUME         PCMDEVICE_REG(0X0, 0x5F)
+
+#define TAA5412_REG_CH1_FINE_GAIN              PCMDEVICE_REG(0X0, 0x53)
+#define TAA5412_REG_CH2_FINE_GAIN              PCMDEVICE_REG(0X0, 0x58)
+#define TAA5412_REG_CH3_FINE_GAIN              PCMDEVICE_REG(0X0, 0x5C)
+#define TAA5412_REG_CH4_FINE_GAIN              PCMDEVICE_REG(0X0, 0x60)
+
+#define PCMDEVICE_CMD_SING_W           0x1
+#define PCMDEVICE_CMD_BURST            0x2
+#define PCMDEVICE_CMD_DELAY            0x3
+#define PCMDEVICE_CMD_FIELD_W          0x4
+
+enum pcmdevice_bin_blk_type {
+       PCMDEVICE_BIN_BLK_COEFF = 1,
+       PCMDEVICE_BIN_BLK_POST_POWER_UP,
+       PCMDEVICE_BIN_BLK_PRE_SHUTDOWN,
+       PCMDEVICE_BIN_BLK_PRE_POWER_UP,
+       PCMDEVICE_BIN_BLK_POST_SHUTDOWN
+};
+
+enum pcmdevice_fw_state {
+       PCMDEVICE_FW_LOAD_OK = 0,
+       PCMDEVICE_FW_LOAD_FAILED
+};
+
+struct pcmdevice_regbin_hdr {
+       unsigned int img_sz;
+       unsigned int checksum;
+       unsigned int binary_version_num;
+       unsigned int drv_fw_version;
+       unsigned int timestamp;
+       unsigned char plat_type;
+       unsigned char dev_family;
+       unsigned char reserve;
+       unsigned char ndev;
+       unsigned char devs[PCMDEVICE_MAX_REGBIN_DEVICES];
+       unsigned int nconfig;
+       unsigned int config_size[PCMDEVICE_CONFIG_SUM];
+};
+
+struct pcmdevice_block_data {
+       unsigned char dev_idx;
+       unsigned char block_type;
+       unsigned short yram_checksum;
+       unsigned int block_size;
+       unsigned int n_subblks;
+       unsigned char *regdata;
+};
+
+struct pcmdevice_config_info {
+       char cfg_name[64];
+       unsigned int nblocks;
+       unsigned int real_nblocks;
+       unsigned char active_dev;
+       struct pcmdevice_block_data **blk_data;
+};
+
+struct pcmdevice_regbin {
+       struct pcmdevice_regbin_hdr fw_hdr;
+       int ncfgs;
+       struct pcmdevice_config_info **cfg_info;
+};
+
+struct pcmdevice_irqinfo {
+       int gpio;
+       int nmb;
+};
+
+struct pcmdevice_priv {
+       struct snd_soc_component *component;
+       struct i2c_client *client;
+       struct device *dev;
+       struct mutex codec_lock;
+       struct gpio_desc *hw_rst;
+       struct regmap *regmap;
+       struct pcmdevice_regbin regbin;
+       struct pcmdevice_irqinfo irq_info;
+       unsigned int addr[PCMDEVICE_MAX_I2C_DEVICES];
+       unsigned int chip_id;
+       int cur_conf;
+       int fw_state;
+       int ndev;
+       unsigned char bin_name[PCMDEVICE_BIN_FILENAME_LEN];
+       /* used for kcontrol name */
+       unsigned char upper_dev_name[I2C_NAME_SIZE];
+       unsigned char dev_name[I2C_NAME_SIZE];
+};
+
+/* mixer control */
+struct pcmdevice_mixer_control {
+       int max;
+       int reg;
+       unsigned int dev_no;
+       unsigned int shift;
+       unsigned int invert;
+};
+struct pcmdev_ctrl_info {
+       const unsigned int *gain;
+       const struct pcmdevice_mixer_control *pcmdev_ctrl;
+       unsigned int ctrl_array_size;
+       snd_kcontrol_get_t *get;
+       snd_kcontrol_put_t *put;
+       int pcmdev_ctrl_name_id;
+};
+#endif /* __PCM6240_H__ */