xref: /linux/sound/soc/codecs/pcm6240.h (revision 33e02dc69afbd8f1b85a51d74d72f139ba4ca623)
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 
18 enum 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 
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
166 };
167 
168 enum pcmdevice_fw_state {
169 	PCMDEVICE_FW_LOAD_OK = 0,
170 	PCMDEVICE_FW_LOAD_FAILED
171 };
172 
173 struct 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 
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;
195 };
196 
197 struct 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 
205 struct pcmdevice_regbin {
206 	struct pcmdevice_regbin_hdr fw_hdr;
207 	int ncfgs;
208 	struct pcmdevice_config_info **cfg_info;
209 };
210 
211 struct pcmdevice_irqinfo {
212 	int gpio;
213 	int nmb;
214 };
215 
216 struct 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 */
237 struct pcmdevice_mixer_control {
238 	int max;
239 	int reg;
240 	unsigned int dev_no;
241 	unsigned int shift;
242 	unsigned int invert;
243 };
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;
251 };
252 #endif /* __PCM6240_H__ */
253