Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
  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__ */