1/* SPDX-License-Identifier: GPL-2.0 */
2//
3// ALSA SoC Texas Instruments TAS2781 Audio Smart Amplifier
4//
5// Copyright (C) 2022 - 2024 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_DSP_H__
17#define __TAS2781_DSP_H__
18
19#define MAIN_ALL_DEVICES			0x0d
20#define MAIN_DEVICE_A				0x01
21#define MAIN_DEVICE_B				0x08
22#define MAIN_DEVICE_C				0x10
23#define MAIN_DEVICE_D				0x14
24#define COEFF_DEVICE_A				0x03
25#define COEFF_DEVICE_B				0x0a
26#define COEFF_DEVICE_C				0x11
27#define COEFF_DEVICE_D				0x15
28#define PRE_DEVICE_A				0x04
29#define PRE_DEVICE_B				0x0b
30#define PRE_DEVICE_C				0x12
31#define PRE_DEVICE_D				0x16
32
33#define PPC3_VERSION				0x4100
34#define PPC3_VERSION_TAS2781			0x14600
35#define TASDEVICE_DEVICE_SUM			8
36#define TASDEVICE_CONFIG_SUM			64
37
38#define TASDEVICE_MAX_CHANNELS			8
39
40enum tasdevice_dsp_dev_idx {
41	TASDEVICE_DSP_TAS_2555 = 0,
42	TASDEVICE_DSP_TAS_2555_STEREO,
43	TASDEVICE_DSP_TAS_2557_MONO,
44	TASDEVICE_DSP_TAS_2557_DUAL_MONO,
45	TASDEVICE_DSP_TAS_2559,
46	TASDEVICE_DSP_TAS_2563,
47	TASDEVICE_DSP_TAS_2563_DUAL_MONO = 7,
48	TASDEVICE_DSP_TAS_2563_QUAD,
49	TASDEVICE_DSP_TAS_2563_21,
50	TASDEVICE_DSP_TAS_2781,
51	TASDEVICE_DSP_TAS_2781_DUAL_MONO,
52	TASDEVICE_DSP_TAS_2781_21,
53	TASDEVICE_DSP_TAS_2781_QUAD,
54	TASDEVICE_DSP_TAS_MAX_DEVICE
55};
56
57struct tasdevice_fw_fixed_hdr {
58	unsigned int fwsize;
59	unsigned int ppcver;
60	unsigned int drv_ver;
61};
62
63struct tasdevice_dspfw_hdr {
64	struct tasdevice_fw_fixed_hdr fixed_hdr;
65	unsigned short device_family;
66	unsigned short device;
67	unsigned char ndev;
68};
69
70struct tasdev_blk {
71	int nr_retry;
72	unsigned int type;
73	unsigned char is_pchksum_present;
74	unsigned char pchksum;
75	unsigned char is_ychksum_present;
76	unsigned char ychksum;
77	unsigned int nr_cmds;
78	unsigned int blk_size;
79	unsigned int nr_subblocks;
80	/* fixed m68k compiling issue, storing the dev_idx as a member of block
81	 * can reduce unnecessary timeand system resource comsumption of
82	 * dev_idx mapping every time the block data writing to the dsp.
83	 */
84	unsigned char dev_idx;
85	unsigned char *data;
86};
87
88struct tasdevice_data {
89	char name[64];
90	unsigned int nr_blk;
91	struct tasdev_blk *dev_blks;
92};
93
94struct tasdevice_prog {
95	unsigned int prog_size;
96	struct tasdevice_data dev_data;
97};
98
99struct tasdevice_config {
100	unsigned int cfg_size;
101	char name[64];
102	struct tasdevice_data dev_data;
103};
104
105struct tasdevice_calibration {
106	struct tasdevice_data dev_data;
107};
108
109struct tasdevice_fw {
110	struct tasdevice_dspfw_hdr fw_hdr;
111	unsigned short nr_programs;
112	struct tasdevice_prog *programs;
113	unsigned short nr_configurations;
114	struct tasdevice_config *configs;
115	unsigned short nr_calibrations;
116	struct tasdevice_calibration *calibrations;
117	struct device *dev;
118};
119
120enum tasdevice_dsp_fw_state {
121	TASDEVICE_DSP_FW_NONE = 0,
122	TASDEVICE_DSP_FW_PENDING,
123	TASDEVICE_DSP_FW_FAIL,
124	TASDEVICE_DSP_FW_ALL_OK,
125};
126
127enum tasdevice_bin_blk_type {
128	TASDEVICE_BIN_BLK_COEFF = 1,
129	TASDEVICE_BIN_BLK_POST_POWER_UP,
130	TASDEVICE_BIN_BLK_PRE_SHUTDOWN,
131	TASDEVICE_BIN_BLK_PRE_POWER_UP,
132	TASDEVICE_BIN_BLK_POST_SHUTDOWN
133};
134
135struct tasdevice_rca_hdr {
136	unsigned int img_sz;
137	unsigned int checksum;
138	unsigned int binary_version_num;
139	unsigned int drv_fw_version;
140	unsigned char plat_type;
141	unsigned char dev_family;
142	unsigned char reserve;
143	unsigned char ndev;
144	unsigned char devs[TASDEVICE_DEVICE_SUM];
145	unsigned int nconfig;
146	unsigned int config_size[TASDEVICE_CONFIG_SUM];
147};
148
149struct tasdev_blk_data {
150	unsigned char dev_idx;
151	unsigned char block_type;
152	unsigned short yram_checksum;
153	unsigned int block_size;
154	unsigned int n_subblks;
155	unsigned char *regdata;
156};
157
158struct tasdevice_config_info {
159	unsigned int nblocks;
160	unsigned int real_nblocks;
161	unsigned char active_dev;
162	struct tasdev_blk_data **blk_data;
163};
164
165struct tasdevice_rca {
166	struct tasdevice_rca_hdr fw_hdr;
167	int ncfgs;
168	struct tasdevice_config_info **cfg_info;
169	int profile_cfg_id;
170};
171
172void tasdevice_select_cfg_blk(void *context, int conf_no,
173	unsigned char block_type);
174void tasdevice_config_info_remove(void *context);
175void tasdevice_dsp_remove(void *context);
176int tasdevice_dsp_parser(void *context);
177int tasdevice_rca_parser(void *context, const struct firmware *fmw);
178void tasdevice_dsp_remove(void *context);
179void tasdevice_calbin_remove(void *context);
180int tasdevice_select_tuningprm_cfg(void *context, int prm,
181	int cfg_no, int rca_conf_no);
182int tasdevice_prmg_load(void *context, int prm_no);
183void tasdevice_tuning_switch(void *context, int state);
184int tas2781_load_calibration(void *context, char *file_name,
185	unsigned short i);
186
187#endif
188