Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at for-next 252 lines 8.3 kB view raw
1/* SPDX-License-Identifier: GPL-2.0 */ 2// 3// ALSA SoC Texas Instruments PCM6240 Family Audio ADC/DAC/Router 4// 5// Copyright (C) 2022 - 2024 Texas Instruments Incorporated 6// https://www.ti.com 7// 8// The PCM6240 driver implements a flexible and configurable 9// algo coefficient setting for one, two, or even multiple 10// PCM6240 Family Audio chips. 11// 12// Author: Shenghao Ding <shenghao-ding@ti.com> 13// 14 15#ifndef __PCM6240_H__ 16#define __PCM6240_H__ 17 18enum pcm_device { 19 ADC3120, 20 ADC5120, 21 ADC6120, 22 DIX4192, 23 PCM1690, 24 PCM3120, 25 PCM3140, 26 PCM5120, 27 PCM5140, 28 PCM6120, 29 PCM6140, 30 PCM6240, 31 PCM6260, 32 PCM9211, 33 PCMD3140, 34 PCMD3180, 35 PCMD512X, 36 TAA5212, 37 TAA5412, 38 TAD5212, 39 TAD5412, 40 MAX_DEVICE, 41}; 42 43#define PCMDEV_GENERIC_VOL_CTRL 0x0 44#define PCMDEV_PCM1690_VOL_CTRL 0x1 45#define PCMDEV_PCM1690_FINE_VOL_CTRL 0x2 46 47/* Maximum number of I2C addresses */ 48#define PCMDEVICE_MAX_I2C_DEVICES 4 49/* Maximum number defined in REGBIN protocol */ 50#define PCMDEVICE_MAX_REGBIN_DEVICES 8 51#define PCMDEVICE_CONFIG_SUM 64 52#define PCMDEVICE_BIN_FILENAME_LEN 64 53 54#define PCMDEVICE_RATES (SNDRV_PCM_RATE_44100 | \ 55 SNDRV_PCM_RATE_48000) 56#define PCMDEVICE_MAX_CHANNELS 8 57#define PCMDEVICE_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \ 58 SNDRV_PCM_FMTBIT_S20_3LE | \ 59 SNDRV_PCM_FMTBIT_S24_3LE | \ 60 SNDRV_PCM_FMTBIT_S24_LE | \ 61 SNDRV_PCM_FMTBIT_S32_LE) 62 63/* PAGE Control Register (available in page0 of each book) */ 64#define PCMDEVICE_PAGE_SELECT 0x00 65#define PCMDEVICE_REG(page, reg) ((page * 128) + reg) 66#define PCMDEVICE_REG_SWRESET PCMDEVICE_REG(0X0, 0x01) 67#define PCMDEVICE_REG_SWRESET_RESET BIT(0) 68 69#define ADC5120_REG_CH1_ANALOG_GAIN PCMDEVICE_REG(0X0, 0x3d) 70#define ADC5120_REG_CH1_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x3e) 71#define ADC5120_REG_CH2_ANALOG_GAIN PCMDEVICE_REG(0X0, 0x42) 72#define ADC5120_REG_CH2_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x43) 73 74#define PCM1690_REG_MODE_CTRL PCMDEVICE_REG(0X0, 0x46) 75#define PCM1690_REG_MODE_CTRL_DAMS_MSK BIT(7) 76#define PCM1690_REG_MODE_CTRL_DAMS_FINE_STEP 0x0 77#define PCM1690_REG_MODE_CTRL_DAMS_WIDE_RANGE 0x80 78 79#define PCM1690_REG_CH1_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x48) 80#define PCM1690_REG_CH2_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x49) 81#define PCM1690_REG_CH3_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x4a) 82#define PCM1690_REG_CH4_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x4b) 83#define PCM1690_REG_CH5_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x4c) 84#define PCM1690_REG_CH6_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x4d) 85#define PCM1690_REG_CH7_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x4e) 86#define PCM1690_REG_CH8_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x4f) 87 88#define PCM6240_REG_CH1_ANALOG_GAIN PCMDEVICE_REG(0X0, 0x3d) 89#define PCM6240_REG_CH1_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x3e) 90#define PCM6240_REG_CH2_ANALOG_GAIN PCMDEVICE_REG(0X0, 0x42) 91#define PCM6240_REG_CH2_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x43) 92#define PCM6240_REG_CH3_ANALOG_GAIN PCMDEVICE_REG(0X0, 0x47) 93#define PCM6240_REG_CH3_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x48) 94#define PCM6240_REG_CH4_ANALOG_GAIN PCMDEVICE_REG(0X0, 0x4c) 95#define PCM6240_REG_CH4_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x4d) 96 97#define PCM6260_REG_CH1_ANALOG_GAIN PCMDEVICE_REG(0X0, 0x3d) 98#define PCM6260_REG_CH1_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x3e) 99#define PCM6260_REG_CH2_ANALOG_GAIN PCMDEVICE_REG(0X0, 0x42) 100#define PCM6260_REG_CH2_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x43) 101#define PCM6260_REG_CH3_ANALOG_GAIN PCMDEVICE_REG(0X0, 0x47) 102#define PCM6260_REG_CH3_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x48) 103#define PCM6260_REG_CH4_ANALOG_GAIN PCMDEVICE_REG(0X0, 0x4c) 104#define PCM6260_REG_CH4_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x4d) 105#define PCM6260_REG_CH5_ANALOG_GAIN PCMDEVICE_REG(0X0, 0x51) 106#define PCM6260_REG_CH5_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x52) 107#define PCM6260_REG_CH6_ANALOG_GAIN PCMDEVICE_REG(0X0, 0x56) 108#define PCM6260_REG_CH6_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x57) 109 110#define PCM9211_REG_SW_CTRL PCMDEVICE_REG(0X0, 0x40) 111#define PCM9211_REG_SW_CTRL_MRST_MSK BIT(7) 112#define PCM9211_REG_SW_CTRL_MRST 0x0 113 114#define PCM9211_REG_CH1_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x46) 115#define PCM9211_REG_CH2_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x47) 116 117#define PCMD3140_REG_CH1_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x3E) 118#define PCMD3140_REG_CH2_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x43) 119#define PCMD3140_REG_CH3_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x48) 120#define PCMD3140_REG_CH4_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x4D) 121 122#define PCMD3140_REG_CH1_FINE_GAIN PCMDEVICE_REG(0X0, 0x3F) 123#define PCMD3140_REG_CH2_FINE_GAIN PCMDEVICE_REG(0X0, 0x44) 124#define PCMD3140_REG_CH3_FINE_GAIN PCMDEVICE_REG(0X0, 0x49) 125#define PCMD3140_REG_CH4_FINE_GAIN PCMDEVICE_REG(0X0, 0x4E) 126 127#define PCMD3180_REG_CH1_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x3E) 128#define PCMD3180_REG_CH2_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x43) 129#define PCMD3180_REG_CH3_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x48) 130#define PCMD3180_REG_CH4_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x4D) 131#define PCMD3180_REG_CH5_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x52) 132#define PCMD3180_REG_CH6_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x57) 133#define PCMD3180_REG_CH7_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x5C) 134#define PCMD3180_REG_CH8_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x61) 135 136#define PCMD3180_REG_CH1_FINE_GAIN PCMDEVICE_REG(0X0, 0x3F) 137#define PCMD3180_REG_CH2_FINE_GAIN PCMDEVICE_REG(0X0, 0x44) 138#define PCMD3180_REG_CH3_FINE_GAIN PCMDEVICE_REG(0X0, 0x49) 139#define PCMD3180_REG_CH4_FINE_GAIN PCMDEVICE_REG(0X0, 0x4E) 140#define PCMD3180_REG_CH5_FINE_GAIN PCMDEVICE_REG(0X0, 0x53) 141#define PCMD3180_REG_CH6_FINE_GAIN PCMDEVICE_REG(0X0, 0x58) 142#define PCMD3180_REG_CH7_FINE_GAIN PCMDEVICE_REG(0X0, 0x5D) 143#define PCMD3180_REG_CH8_FINE_GAIN PCMDEVICE_REG(0X0, 0x62) 144 145#define TAA5412_REG_CH1_DIGITAL_VOLUME PCMDEVICE_REG(0X0, 0x52) 146#define TAA5412_REG_CH2_DIGITAL_VOLUME PCMDEVICE_REG(0X0, 0x57) 147#define TAA5412_REG_CH3_DIGITAL_VOLUME PCMDEVICE_REG(0X0, 0x5B) 148#define TAA5412_REG_CH4_DIGITAL_VOLUME PCMDEVICE_REG(0X0, 0x5F) 149 150#define TAA5412_REG_CH1_FINE_GAIN PCMDEVICE_REG(0X0, 0x53) 151#define TAA5412_REG_CH2_FINE_GAIN PCMDEVICE_REG(0X0, 0x58) 152#define TAA5412_REG_CH3_FINE_GAIN PCMDEVICE_REG(0X0, 0x5C) 153#define TAA5412_REG_CH4_FINE_GAIN PCMDEVICE_REG(0X0, 0x60) 154 155#define PCMDEVICE_CMD_SING_W 0x1 156#define PCMDEVICE_CMD_BURST 0x2 157#define PCMDEVICE_CMD_DELAY 0x3 158#define PCMDEVICE_CMD_FIELD_W 0x4 159 160enum pcmdevice_bin_blk_type { 161 PCMDEVICE_BIN_BLK_COEFF = 1, 162 PCMDEVICE_BIN_BLK_POST_POWER_UP, 163 PCMDEVICE_BIN_BLK_PRE_SHUTDOWN, 164 PCMDEVICE_BIN_BLK_PRE_POWER_UP, 165 PCMDEVICE_BIN_BLK_POST_SHUTDOWN 166}; 167 168enum pcmdevice_fw_state { 169 PCMDEVICE_FW_LOAD_OK = 0, 170 PCMDEVICE_FW_LOAD_FAILED 171}; 172 173struct pcmdevice_regbin_hdr { 174 unsigned int img_sz; 175 unsigned int checksum; 176 unsigned int binary_version_num; 177 unsigned int drv_fw_version; 178 unsigned int timestamp; 179 unsigned char plat_type; 180 unsigned char dev_family; 181 unsigned char reserve; 182 unsigned char ndev; 183 unsigned char devs[PCMDEVICE_MAX_REGBIN_DEVICES]; 184 unsigned int nconfig; 185 unsigned int config_size[PCMDEVICE_CONFIG_SUM]; 186}; 187 188struct pcmdevice_block_data { 189 unsigned char dev_idx; 190 unsigned char block_type; 191 unsigned short yram_checksum; 192 unsigned int block_size; 193 unsigned int n_subblks; 194 unsigned char *regdata; 195}; 196 197struct pcmdevice_config_info { 198 char cfg_name[64]; 199 unsigned int nblocks; 200 unsigned int real_nblocks; 201 unsigned char active_dev; 202 struct pcmdevice_block_data **blk_data; 203}; 204 205struct pcmdevice_regbin { 206 struct pcmdevice_regbin_hdr fw_hdr; 207 int ncfgs; 208 struct pcmdevice_config_info **cfg_info; 209}; 210 211struct pcmdevice_irqinfo { 212 int gpio; 213 int nmb; 214}; 215 216struct pcmdevice_priv { 217 struct snd_soc_component *component; 218 struct i2c_client *client; 219 struct device *dev; 220 struct mutex codec_lock; 221 struct gpio_desc *hw_rst; 222 struct regmap *regmap; 223 struct pcmdevice_regbin regbin; 224 struct pcmdevice_irqinfo irq_info; 225 unsigned int addr[PCMDEVICE_MAX_I2C_DEVICES]; 226 unsigned int chip_id; 227 int cur_conf; 228 int fw_state; 229 int ndev; 230 unsigned char bin_name[PCMDEVICE_BIN_FILENAME_LEN]; 231 /* used for kcontrol name */ 232 unsigned char upper_dev_name[I2C_NAME_SIZE]; 233 unsigned char dev_name[I2C_NAME_SIZE]; 234}; 235 236/* mixer control */ 237struct pcmdevice_mixer_control { 238 int max; 239 int reg; 240 unsigned int dev_no; 241 unsigned int shift; 242 unsigned int invert; 243}; 244struct pcmdev_ctrl_info { 245 const unsigned int *gain; 246 const struct pcmdevice_mixer_control *pcmdev_ctrl; 247 unsigned int ctrl_array_size; 248 snd_kcontrol_get_t *get; 249 snd_kcontrol_put_t *put; 250 int pcmdev_ctrl_name_id; 251}; 252#endif /* __PCM6240_H__ */