1 /* SPDX-License-Identifier: GPL-2.0 */
3 // ALSA SoC Texas Instruments PCM6240 Family Audio ADC/DAC/Router
5 // Copyright (C) 2022 - 2024 Texas Instruments Incorporated
8 // The PCM6240 driver implements a flexible and configurable
9 // algo coefficient setting for one, two, or even multiple
10 // PCM6240 Family Audio chips.
12 // Author: Shenghao Ding <shenghao-ding@ti.com>
43 #define PCMDEV_GENERIC_VOL_CTRL 0x0
44 #define PCMDEV_PCM1690_VOL_CTRL 0x1
45 #define PCMDEV_PCM1690_FINE_VOL_CTRL 0x2
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
54 #define PCMDEVICE_RATES (SNDRV_PCM_RATE_44100 | \
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)
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)
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)
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
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)
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)
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)
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
114 #define PCM9211_REG_CH1_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x46)
115 #define PCM9211_REG_CH2_DIGITAL_GAIN PCMDEVICE_REG(0X0, 0x47)
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)
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)
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)
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)
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)
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)
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
160 enum 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
168 enum pcmdevice_fw_state
{
169 PCMDEVICE_FW_LOAD_OK
= 0,
170 PCMDEVICE_FW_LOAD_FAILED
173 struct pcmdevice_regbin_hdr
{
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
;
183 unsigned char devs
[PCMDEVICE_MAX_REGBIN_DEVICES
];
184 unsigned int nconfig
;
185 unsigned int config_size
[PCMDEVICE_CONFIG_SUM
];
188 struct 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
;
197 struct pcmdevice_config_info
{
199 unsigned int nblocks
;
200 unsigned int real_nblocks
;
201 unsigned char active_dev
;
202 struct pcmdevice_block_data
**blk_data
;
205 struct pcmdevice_regbin
{
206 struct pcmdevice_regbin_hdr fw_hdr
;
208 struct pcmdevice_config_info
**cfg_info
;
211 struct pcmdevice_irqinfo
{
216 struct pcmdevice_priv
{
217 struct snd_soc_component
*component
;
218 struct i2c_client
*client
;
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
;
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
];
237 struct pcmdevice_mixer_control
{
244 struct 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
;
252 #endif /* __PCM6240_H__ */