xref: /kernel/linux/linux-6.6/include/sound/tas2781.h (revision 62306a36)
1/* SPDX-License-Identifier: GPL-2.0 */
2//
3// ALSA SoC Texas Instruments TAS2781 Audio Smart Amplifier
4//
5// Copyright (C) 2022 - 2023 Texas Instruments Incorporated
6// https://www.ti.com
7//
8// The TAS2781 driver implements a flexible and configurable
9// algo coefficient setting for one, two, or even multiple
10// 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 TASDEVICE_RATES			(SNDRV_PCM_RATE_44100 |\
26	SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 |\
27	SNDRV_PCM_RATE_88200)
28
29#define TASDEVICE_FORMATS		(SNDRV_PCM_FMTBIT_S16_LE | \
30	SNDRV_PCM_FMTBIT_S24_LE | \
31	SNDRV_PCM_FMTBIT_S32_LE)
32
33/*PAGE Control Register (available in page0 of each book) */
34#define TASDEVICE_PAGE_SELECT		0x00
35#define TASDEVICE_BOOKCTL_PAGE		0x00
36#define TASDEVICE_BOOKCTL_REG		127
37#define TASDEVICE_BOOK_ID(reg)		(reg / (256 * 128))
38#define TASDEVICE_PAGE_ID(reg)		((reg % (256 * 128)) / 128)
39#define TASDEVICE_PAGE_REG(reg)		((reg % (256 * 128)) % 128)
40#define TASDEVICE_PGRG(reg)		(reg % (256 * 128))
41#define TASDEVICE_REG(book, page, reg)	(((book * 256 * 128) + \
42					(page * 128)) + reg)
43
44/*Software Reset */
45#define TAS2781_REG_SWRESET		TASDEVICE_REG(0x0, 0X0, 0x01)
46#define TAS2781_REG_SWRESET_RESET	BIT(0)
47
48/*I2C Checksum */
49#define TASDEVICE_I2CChecksum		TASDEVICE_REG(0x0, 0x0, 0x7E)
50
51/* Volume control */
52#define TAS2781_DVC_LVL			TASDEVICE_REG(0x0, 0x0, 0x1A)
53#define TAS2781_AMP_LEVEL		TASDEVICE_REG(0x0, 0x0, 0x03)
54#define TAS2781_AMP_LEVEL_MASK		GENMASK(5, 1)
55
56#define TASDEVICE_CMD_SING_W		0x1
57#define TASDEVICE_CMD_BURST		0x2
58#define TASDEVICE_CMD_DELAY		0x3
59#define TASDEVICE_CMD_FIELD_W		0x4
60
61enum audio_device {
62	TAS2781	= 0,
63};
64
65enum device_catlog_id {
66	LENOVO = 0,
67	OTHERS
68};
69
70struct tasdevice {
71	struct tasdevice_fw *cali_data_fmw;
72	unsigned int dev_addr;
73	unsigned int err_code;
74	unsigned char cur_book;
75	short cur_prog;
76	short cur_conf;
77	bool is_loading;
78	bool is_loaderr;
79};
80
81struct tasdevice_irqinfo {
82	int irq_gpio;
83	int irq;
84};
85
86struct calidata {
87	unsigned char *data;
88	unsigned long total_sz;
89};
90
91struct tasdevice_priv {
92	struct tasdevice tasdevice[TASDEVICE_MAX_CHANNELS];
93	struct tasdevice_irqinfo irq_info;
94	struct tasdevice_rca rcabin;
95	struct calidata cali_data;
96	struct tasdevice_fw *fmw;
97	struct gpio_desc *reset;
98	struct mutex codec_lock;
99	struct regmap *regmap;
100	struct device *dev;
101	struct tm tm;
102
103	enum device_catlog_id catlog_id;
104	const char *acpi_subsystem_id;
105	unsigned char cal_binaryname[TASDEVICE_MAX_CHANNELS][64];
106	unsigned char crc8_lkp_tbl[CRC8_TABLE_SIZE];
107	unsigned char coef_binaryname[64];
108	unsigned char rca_binaryname[64];
109	unsigned char dev_name[32];
110	unsigned char ndev;
111	unsigned int magic_num;
112	unsigned int chip_id;
113	unsigned int sysclk;
114
115	int cur_prog;
116	int cur_conf;
117	int fw_state;
118	int index;
119	void *client;
120	void *codec;
121	bool force_fwload_status;
122	bool playback_started;
123	bool isacpi;
124	int (*fw_parse_variable_header)(struct tasdevice_priv *tas_priv,
125		const struct firmware *fmw, int offset);
126	int (*fw_parse_program_data)(struct tasdevice_priv *tas_priv,
127		struct tasdevice_fw *tas_fmw,
128		const struct firmware *fmw, int offset);
129	int (*fw_parse_configuration_data)(struct tasdevice_priv *tas_priv,
130		struct tasdevice_fw *tas_fmw,
131		const struct firmware *fmw, int offset);
132	int (*tasdevice_load_block)(struct tasdevice_priv *tas_priv,
133		struct tasdev_blk *block);
134
135	int (*save_calibration)(struct tasdevice_priv *tas_priv);
136	void (*apply_calibration)(struct tasdevice_priv *tas_priv);
137};
138
139void tas2781_reset(struct tasdevice_priv *tas_dev);
140int tascodec_init(struct tasdevice_priv *tas_priv, void *codec,
141	struct module *module,
142	void (*cont)(const struct firmware *fw, void *context));
143struct tasdevice_priv *tasdevice_kzalloc(struct i2c_client *i2c);
144int tasdevice_init(struct tasdevice_priv *tas_priv);
145void tasdevice_remove(struct tasdevice_priv *tas_priv);
146int tasdevice_save_calibration(struct tasdevice_priv *tas_priv);
147void tasdevice_apply_calibration(struct tasdevice_priv *tas_priv);
148int tasdevice_dev_read(struct tasdevice_priv *tas_priv,
149	unsigned short chn, unsigned int reg, unsigned int *value);
150int tasdevice_dev_write(struct tasdevice_priv *tas_priv,
151	unsigned short chn, unsigned int reg, unsigned int value);
152int tasdevice_dev_bulk_write(
153	struct tasdevice_priv *tas_priv, unsigned short chn,
154	unsigned int reg, unsigned char *p_data, unsigned int n_length);
155int tasdevice_dev_bulk_read(struct tasdevice_priv *tas_priv,
156	unsigned short chn, unsigned int reg, unsigned char *p_data,
157	unsigned int n_length);
158int tasdevice_dev_update_bits(
159	struct tasdevice_priv *tasdevice, unsigned short chn,
160	unsigned int reg, unsigned int mask, unsigned int value);
161int tasdevice_amp_putvol(struct tasdevice_priv *tas_priv,
162	struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);
163int tasdevice_amp_getvol(struct tasdevice_priv *tas_priv,
164	struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);
165int tasdevice_digital_putvol(struct tasdevice_priv *tas_priv,
166	struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);
167int tasdevice_digital_getvol(struct tasdevice_priv *tas_priv,
168	struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);
169
170#endif /* __TAS2781_H__ */
171