xref: /linux/include/sound/tas2781.h (revision f879306834818ebd1722a4372079610cdd466fec)
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 /* Volume control */
53 #define TAS2563_DVC_LVL			TASDEVICE_REG(0x00, 0x02, 0x0C)
54 #define TAS2781_DVC_LVL			TASDEVICE_REG(0x0, 0x0, 0x1A)
55 #define TAS2781_AMP_LEVEL		TASDEVICE_REG(0x0, 0x0, 0x03)
56 #define TAS2781_AMP_LEVEL_MASK		GENMASK(5, 1)
57 
58 #define TASDEVICE_CMD_SING_W		0x1
59 #define TASDEVICE_CMD_BURST		0x2
60 #define TASDEVICE_CMD_DELAY		0x3
61 #define TASDEVICE_CMD_FIELD_W		0x4
62 
63 enum audio_device {
64 	TAS2563,
65 	TAS2781,
66 };
67 
68 enum device_catlog_id {
69 	LENOVO = 0,
70 	OTHERS
71 };
72 
73 struct tasdevice {
74 	struct tasdevice_fw *cali_data_fmw;
75 	unsigned int dev_addr;
76 	unsigned int err_code;
77 	unsigned char cur_book;
78 	short cur_prog;
79 	short cur_conf;
80 	bool is_loading;
81 	bool is_loaderr;
82 };
83 
84 struct tasdevice_irqinfo {
85 	int irq_gpio;
86 	int irq;
87 };
88 
89 struct calidata {
90 	unsigned char *data;
91 	unsigned long total_sz;
92 };
93 
94 struct tasdevice_priv {
95 	struct tasdevice tasdevice[TASDEVICE_MAX_CHANNELS];
96 	struct tasdevice_irqinfo irq_info;
97 	struct tasdevice_rca rcabin;
98 	struct calidata cali_data;
99 	struct tasdevice_fw *fmw;
100 	struct gpio_desc *reset;
101 	struct mutex codec_lock;
102 	struct regmap *regmap;
103 	struct device *dev;
104 	struct tm tm;
105 
106 	enum device_catlog_id catlog_id;
107 	unsigned char cal_binaryname[TASDEVICE_MAX_CHANNELS][64];
108 	unsigned char crc8_lkp_tbl[CRC8_TABLE_SIZE];
109 	unsigned char coef_binaryname[64];
110 	unsigned char rca_binaryname[64];
111 	unsigned char dev_name[32];
112 	const char *name_prefix;
113 	unsigned char ndev;
114 	unsigned int magic_num;
115 	unsigned int chip_id;
116 	unsigned int sysclk;
117 
118 	int cur_prog;
119 	int cur_conf;
120 	int fw_state;
121 	int index;
122 	void *client;
123 	void *codec;
124 	bool force_fwload_status;
125 	bool playback_started;
126 	bool isacpi;
127 	unsigned int global_addr;
128 
129 	int (*fw_parse_variable_header)(struct tasdevice_priv *tas_priv,
130 		const struct firmware *fmw, int offset);
131 	int (*fw_parse_program_data)(struct tasdevice_priv *tas_priv,
132 		struct tasdevice_fw *tas_fmw,
133 		const struct firmware *fmw, int offset);
134 	int (*fw_parse_configuration_data)(struct tasdevice_priv *tas_priv,
135 		struct tasdevice_fw *tas_fmw,
136 		const struct firmware *fmw, int offset);
137 	int (*tasdevice_load_block)(struct tasdevice_priv *tas_priv,
138 		struct tasdev_blk *block);
139 
140 	int (*save_calibration)(struct tasdevice_priv *tas_priv);
141 	void (*apply_calibration)(struct tasdevice_priv *tas_priv);
142 };
143 
144 void tasdevice_reset(struct tasdevice_priv *tas_dev);
145 int tascodec_init(struct tasdevice_priv *tas_priv, void *codec,
146 	struct module *module,
147 	void (*cont)(const struct firmware *fw, void *context));
148 struct tasdevice_priv *tasdevice_kzalloc(struct i2c_client *i2c);
149 int tasdevice_init(struct tasdevice_priv *tas_priv);
150 void tasdevice_remove(struct tasdevice_priv *tas_priv);
151 int tasdevice_save_calibration(struct tasdevice_priv *tas_priv);
152 void tasdevice_apply_calibration(struct tasdevice_priv *tas_priv);
153 int tasdevice_dev_read(struct tasdevice_priv *tas_priv,
154 	unsigned short chn, unsigned int reg, unsigned int *value);
155 int tasdevice_dev_write(struct tasdevice_priv *tas_priv,
156 	unsigned short chn, unsigned int reg, unsigned int value);
157 int tasdevice_dev_bulk_write(
158 	struct tasdevice_priv *tas_priv, unsigned short chn,
159 	unsigned int reg, unsigned char *p_data, unsigned int n_length);
160 int tasdevice_dev_bulk_read(struct tasdevice_priv *tas_priv,
161 	unsigned short chn, unsigned int reg, unsigned char *p_data,
162 	unsigned int n_length);
163 int tasdevice_dev_update_bits(
164 	struct tasdevice_priv *tasdevice, unsigned short chn,
165 	unsigned int reg, unsigned int mask, unsigned int value);
166 int tasdevice_amp_putvol(struct tasdevice_priv *tas_priv,
167 	struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);
168 int tasdevice_amp_getvol(struct tasdevice_priv *tas_priv,
169 	struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);
170 int tasdevice_digital_putvol(struct tasdevice_priv *tas_priv,
171 	struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);
172 int tasdevice_digital_getvol(struct tasdevice_priv *tas_priv,
173 	struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);
174 
175 #endif /* __TAS2781_H__ */
176