1  /* SPDX-License-Identifier: GPL-2.0 */
2  //
3  // ALSA SoC Texas Instruments TAS2563/TAS2781 Audio Smart Amplifier
4  //
5  // Copyright (C) 2022 - 2024 Texas Instruments Incorporated
6  // https://www.ti.com
7  //
8  // The TAS2563/TAS2781 driver implements a flexible and configurable
9  // algo coefficient setting for one, two, or even multiple
10  // TAS2563/TAS2781 chips.
11  //
12  // Author: Shenghao Ding <shenghao-ding@ti.com>
13  // Author: Kevin Lu <kevin-lu@ti.com>
14  //
15  
16  #ifndef __TAS2781_H__
17  #define __TAS2781_H__
18  
19  #include "tas2781-dsp.h"
20  
21  /* version number */
22  #define TAS2781_DRV_VER			1
23  #define SMARTAMP_MODULE_NAME		"tas2781"
24  #define TAS2781_GLOBAL_ADDR	0x40
25  #define TAS2563_GLOBAL_ADDR	0x48
26  #define TASDEVICE_RATES			(SNDRV_PCM_RATE_44100 |\
27  	SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 |\
28  	SNDRV_PCM_RATE_88200)
29  
30  #define TASDEVICE_FORMATS		(SNDRV_PCM_FMTBIT_S16_LE | \
31  	SNDRV_PCM_FMTBIT_S24_LE | \
32  	SNDRV_PCM_FMTBIT_S32_LE)
33  
34  /*PAGE Control Register (available in page0 of each book) */
35  #define TASDEVICE_PAGE_SELECT		0x00
36  #define TASDEVICE_BOOKCTL_PAGE		0x00
37  #define TASDEVICE_BOOKCTL_REG		127
38  #define TASDEVICE_BOOK_ID(reg)		(reg / (256 * 128))
39  #define TASDEVICE_PAGE_ID(reg)		((reg % (256 * 128)) / 128)
40  #define TASDEVICE_PAGE_REG(reg)		((reg % (256 * 128)) % 128)
41  #define TASDEVICE_PGRG(reg)		(reg % (256 * 128))
42  #define TASDEVICE_REG(book, page, reg)	(((book * 256 * 128) + \
43  					(page * 128)) + reg)
44  
45  /*Software Reset */
46  #define TASDEVICE_REG_SWRESET		TASDEVICE_REG(0x0, 0X0, 0x01)
47  #define TASDEVICE_REG_SWRESET_RESET	BIT(0)
48  
49  /*I2C Checksum */
50  #define TASDEVICE_I2CChecksum		TASDEVICE_REG(0x0, 0x0, 0x7E)
51  
52  /* XM_340 */
53  #define	TASDEVICE_XM_A1_REG	TASDEVICE_REG(0x64, 0x63, 0x3c)
54  /* XM_341 */
55  #define	TASDEVICE_XM_A2_REG	TASDEVICE_REG(0x64, 0x63, 0x38)
56  
57  /* Volume control */
58  #define TAS2563_DVC_LVL			TASDEVICE_REG(0x00, 0x02, 0x0C)
59  #define TAS2781_DVC_LVL			TASDEVICE_REG(0x0, 0x0, 0x1A)
60  #define TAS2781_AMP_LEVEL		TASDEVICE_REG(0x0, 0x0, 0x03)
61  #define TAS2781_AMP_LEVEL_MASK		GENMASK(5, 1)
62  
63  #define TAS2563_IDLE		TASDEVICE_REG(0x00, 0x00, 0x3e)
64  #define TAS2563_PRM_R0_REG		TASDEVICE_REG(0x00, 0x0f, 0x34)
65  
66  #define TAS2563_RUNTIME_RE_REG_TF	TASDEVICE_REG(0x64, 0x02, 0x70)
67  #define TAS2563_RUNTIME_RE_REG		TASDEVICE_REG(0x64, 0x02, 0x48)
68  
69  #define TAS2563_PRM_ENFF_REG		TASDEVICE_REG(0x00, 0x0d, 0x54)
70  #define TAS2563_PRM_DISTCK_REG		TASDEVICE_REG(0x00, 0x0d, 0x58)
71  #define TAS2563_PRM_TE_SCTHR_REG	TASDEVICE_REG(0x00, 0x0f, 0x60)
72  #define TAS2563_PRM_PLT_FLAG_REG	TASDEVICE_REG(0x00, 0x0d, 0x74)
73  #define TAS2563_PRM_SINEGAIN_REG	TASDEVICE_REG(0x00, 0x0d, 0x7c)
74  /* prm_Int_B0 */
75  #define TAS2563_TE_TA1_REG		TASDEVICE_REG(0x00, 0x10, 0x0c)
76  /* prm_Int_A1 */
77  #define TAS2563_TE_TA1_AT_REG		TASDEVICE_REG(0x00, 0x10, 0x10)
78  /* prm_TE_Beta */
79  #define TAS2563_TE_TA2_REG		TASDEVICE_REG(0x00, 0x0f, 0x64)
80  /* prm_TE_Beta1 */
81  #define TAS2563_TE_AT_REG		TASDEVICE_REG(0x00, 0x0f, 0x68)
82  /* prm_TE_1_Beta1 */
83  #define TAS2563_TE_DT_REG		TASDEVICE_REG(0x00, 0x0f, 0x70)
84  
85  #define TAS2781_PRM_INT_MASK_REG	TASDEVICE_REG(0x00, 0x00, 0x3b)
86  #define TAS2781_PRM_CLK_CFG_REG		TASDEVICE_REG(0x00, 0x00, 0x5c)
87  #define TAS2781_PRM_RSVD_REG		TASDEVICE_REG(0x00, 0x01, 0x19)
88  #define TAS2781_PRM_TEST_57_REG		TASDEVICE_REG(0x00, 0xfd, 0x39)
89  #define TAS2781_PRM_TEST_62_REG		TASDEVICE_REG(0x00, 0xfd, 0x3e)
90  #define TAS2781_PRM_PVDD_UVLO_REG	TASDEVICE_REG(0x00, 0x00, 0x71)
91  #define TAS2781_PRM_CHNL_0_REG		TASDEVICE_REG(0x00, 0x00, 0x03)
92  #define TAS2781_PRM_NG_CFG0_REG		TASDEVICE_REG(0x00, 0x00, 0x35)
93  #define TAS2781_PRM_IDLE_CH_DET_REG	TASDEVICE_REG(0x00, 0x00, 0x66)
94  #define TAS2781_PRM_PLT_FLAG_REG	TASDEVICE_REG(0x00, 0x14, 0x38)
95  #define TAS2781_PRM_SINEGAIN_REG	TASDEVICE_REG(0x00, 0x14, 0x40)
96  #define TAS2781_PRM_SINEGAIN2_REG	TASDEVICE_REG(0x00, 0x14, 0x44)
97  
98  #define TAS2781_TEST_UNLOCK_REG		TASDEVICE_REG(0x00, 0xFD, 0x0D)
99  #define TAS2781_TEST_PAGE_UNLOCK	0x0D
100  
101  #define TAS2781_RUNTIME_LATCH_RE_REG	TASDEVICE_REG(0x00, 0x00, 0x49)
102  #define TAS2781_RUNTIME_RE_REG_TF	TASDEVICE_REG(0x64, 0x62, 0x48)
103  #define TAS2781_RUNTIME_RE_REG		TASDEVICE_REG(0x64, 0x63, 0x44)
104  
105  #define TASDEVICE_CMD_SING_W		0x1
106  #define TASDEVICE_CMD_BURST		0x2
107  #define TASDEVICE_CMD_DELAY		0x3
108  #define TASDEVICE_CMD_FIELD_W		0x4
109  
110  enum audio_device {
111  	TAS2563,
112  	TAS2781,
113  };
114  
115  enum device_catlog_id {
116  	LENOVO = 0,
117  	OTHERS
118  };
119  
120  struct bulk_reg_val {
121  	int reg;
122  	unsigned char val[4];
123  	unsigned char val_len;
124  	bool is_locked;
125  };
126  
127  struct tasdevice {
128  	struct bulk_reg_val *cali_data_backup;
129  	struct tasdevice_fw *cali_data_fmw;
130  	unsigned int dev_addr;
131  	unsigned int err_code;
132  	unsigned char cur_book;
133  	short cur_prog;
134  	short cur_conf;
135  	bool is_loading;
136  	bool is_loaderr;
137  };
138  
139  struct cali_reg {
140  	unsigned int r0_reg;
141  	unsigned int r0_low_reg;
142  	unsigned int invr0_reg;
143  	unsigned int pow_reg;
144  	unsigned int tlimit_reg;
145  };
146  
147  struct calidata {
148  	unsigned char *data;
149  	unsigned long total_sz;
150  	struct cali_reg cali_reg_array;
151  	unsigned int cali_dat_sz_per_dev;
152  };
153  
154  struct tasdevice_priv {
155  	struct tasdevice tasdevice[TASDEVICE_MAX_CHANNELS];
156  	struct tasdevice_rca rcabin;
157  	struct calidata cali_data;
158  	struct tasdevice_fw *fmw;
159  	struct gpio_desc *reset;
160  	struct mutex codec_lock;
161  	struct regmap *regmap;
162  	struct device *dev;
163  	struct tm tm;
164  
165  	enum device_catlog_id catlog_id;
166  	unsigned char cal_binaryname[TASDEVICE_MAX_CHANNELS][64];
167  	unsigned char crc8_lkp_tbl[CRC8_TABLE_SIZE];
168  	unsigned char coef_binaryname[64];
169  	unsigned char rca_binaryname[64];
170  	unsigned char dev_name[32];
171  	const char *name_prefix;
172  	unsigned char ndev;
173  	unsigned int magic_num;
174  	unsigned int chip_id;
175  	unsigned int sysclk;
176  
177  	int irq;
178  	int cur_prog;
179  	int cur_conf;
180  	int fw_state;
181  	int index;
182  	void *client;
183  	void *codec;
184  	bool force_fwload_status;
185  	bool playback_started;
186  	bool isacpi;
187  	bool is_user_space_calidata;
188  	unsigned int global_addr;
189  
190  	int (*fw_parse_variable_header)(struct tasdevice_priv *tas_priv,
191  		const struct firmware *fmw, int offset);
192  	int (*fw_parse_program_data)(struct tasdevice_priv *tas_priv,
193  		struct tasdevice_fw *tas_fmw,
194  		const struct firmware *fmw, int offset);
195  	int (*fw_parse_configuration_data)(struct tasdevice_priv *tas_priv,
196  		struct tasdevice_fw *tas_fmw,
197  		const struct firmware *fmw, int offset);
198  	int (*tasdevice_load_block)(struct tasdevice_priv *tas_priv,
199  		struct tasdev_blk *block);
200  
201  	int (*save_calibration)(struct tasdevice_priv *tas_priv);
202  	void (*apply_calibration)(struct tasdevice_priv *tas_priv);
203  };
204  
205  void tasdevice_reset(struct tasdevice_priv *tas_dev);
206  int tascodec_init(struct tasdevice_priv *tas_priv, void *codec,
207  	struct module *module,
208  	void (*cont)(const struct firmware *fw, void *context));
209  struct tasdevice_priv *tasdevice_kzalloc(struct i2c_client *i2c);
210  int tasdevice_init(struct tasdevice_priv *tas_priv);
211  void tasdevice_remove(struct tasdevice_priv *tas_priv);
212  int tasdevice_save_calibration(struct tasdevice_priv *tas_priv);
213  void tasdevice_apply_calibration(struct tasdevice_priv *tas_priv);
214  int tasdev_chn_switch(struct tasdevice_priv *tas_priv,
215  	unsigned short chn);
216  int tasdevice_dev_read(struct tasdevice_priv *tas_priv,
217  	unsigned short chn, unsigned int reg, unsigned int *value);
218  int tasdevice_dev_write(struct tasdevice_priv *tas_priv,
219  	unsigned short chn, unsigned int reg, unsigned int value);
220  int tasdevice_dev_bulk_write(
221  	struct tasdevice_priv *tas_priv, unsigned short chn,
222  	unsigned int reg, unsigned char *p_data, unsigned int n_length);
223  int tasdevice_dev_bulk_read(struct tasdevice_priv *tas_priv,
224  	unsigned short chn, unsigned int reg, unsigned char *p_data,
225  	unsigned int n_length);
226  int tasdevice_dev_update_bits(
227  	struct tasdevice_priv *tasdevice, unsigned short chn,
228  	unsigned int reg, unsigned int mask, unsigned int value);
229  int tasdevice_amp_putvol(struct tasdevice_priv *tas_priv,
230  	struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);
231  int tasdevice_amp_getvol(struct tasdevice_priv *tas_priv,
232  	struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);
233  int tasdevice_digital_putvol(struct tasdevice_priv *tas_priv,
234  	struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);
235  int tasdevice_digital_getvol(struct tasdevice_priv *tas_priv,
236  	struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);
237  
238  #endif /* __TAS2781_H__ */
239