Warning: This file is not a C or C++ file. It does not have highlighting.

1/* SPDX-License-Identifier: GPL-2.0 */
2//
3// ALSA SoC Texas Instruments TAS2781 Audio Smart Amplifier
4//
5// Copyright (C) 2022 - 2025 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_BASE 0x4100
34#define PPC3_VERSION_TAS2781_BASIC_MIN 0x14600
35#define PPC3_VERSION_TAS2781_ALPHA_MIN 0x4a00
36#define PPC3_VERSION_TAS2781_BETA_MIN 0x19400
37#define PPC3_VERSION_TAS5825_BASE 0x114200
38#define TASDEVICE_DEVICE_SUM 8
39#define TASDEVICE_CONFIG_SUM 64
40
41#define TASDEVICE_MAX_CHANNELS 8
42
43enum tasdevice_dsp_dev_idx {
44 TASDEVICE_DSP_TAS_2555 = 0,
45 TASDEVICE_DSP_TAS_2555_STEREO,
46 TASDEVICE_DSP_TAS_2557_MONO,
47 TASDEVICE_DSP_TAS_2557_DUAL_MONO,
48 TASDEVICE_DSP_TAS_2559,
49 TASDEVICE_DSP_TAS_2563,
50 TASDEVICE_DSP_TAS_2563_DUAL_MONO = 7,
51 TASDEVICE_DSP_TAS_2563_QUAD,
52 TASDEVICE_DSP_TAS_2563_21,
53 TASDEVICE_DSP_TAS_2781,
54 TASDEVICE_DSP_TAS_2781_DUAL_MONO,
55 TASDEVICE_DSP_TAS_2781_21,
56 TASDEVICE_DSP_TAS_2781_QUAD,
57 TASDEVICE_DSP_TAS_5825_MONO,
58 TASDEVICE_DSP_TAS_5825_DUAL,
59 TASDEVICE_DSP_TAS_MAX_DEVICE
60};
61
62struct tasdevice_fw_fixed_hdr {
63 unsigned int fwsize;
64 unsigned int ppcver;
65 unsigned int drv_ver;
66};
67
68struct tasdevice_dspfw_hdr {
69 struct tasdevice_fw_fixed_hdr fixed_hdr;
70 unsigned short device_family;
71 unsigned short device;
72 unsigned char ndev;
73};
74
75struct tasdev_blk {
76 int nr_retry;
77 unsigned int type;
78 unsigned char is_pchksum_present;
79 unsigned char pchksum;
80 unsigned char is_ychksum_present;
81 unsigned char ychksum;
82 unsigned int nr_cmds;
83 unsigned int blk_size;
84 unsigned int nr_subblocks;
85 /* fixed m68k compiling issue, storing the dev_idx as a member of block
86 * can reduce unnecessary timeand system resource comsumption of
87 * dev_idx mapping every time the block data writing to the dsp.
88 */
89 unsigned char dev_idx;
90 unsigned char *data;
91};
92
93struct tasdevice_data {
94 char name[64];
95 unsigned int nr_blk;
96 struct tasdev_blk *dev_blks;
97};
98
99struct tasdevice_prog {
100 unsigned int prog_size;
101 struct tasdevice_data dev_data;
102};
103
104struct tasdevice_config {
105 unsigned int cfg_size;
106 char name[64];
107 struct tasdevice_data dev_data;
108};
109
110struct tasdevice_calibration {
111 struct tasdevice_data dev_data;
112};
113
114struct fct_param_address {
115 /* Thermal data for PG 1.0 device */
116 unsigned char thr[3];
117 /* Thermal data for PG 2.0 device */
118 unsigned char thr2[3];
119 /* Pilot tone enable flag, usually the sine wave */
120 unsigned char plt_flg[3];
121 /* Pilot tone gain for calibration */
122 unsigned char sin_gn[3];
123 /* Pilot tone gain for calibration */
124 unsigned char sin_gn2[3];
125 /* high 32-bit of real-time spk impedance */
126 unsigned char r0_reg[3];
127 /* check spk connection */
128 unsigned char tf_reg[3];
129 /* check spk resonant frequency */
130 unsigned char a1_reg[3];
131 /* check spk resonant frequency */
132 unsigned char a2_reg[3];
133};
134
135struct tasdevice_fw {
136 struct tasdevice_dspfw_hdr fw_hdr;
137 unsigned short nr_programs;
138 struct tasdevice_prog *programs;
139 unsigned short nr_configurations;
140 struct tasdevice_config *configs;
141 unsigned short nr_calibrations;
142 struct tasdevice_calibration *calibrations;
143 struct fct_param_address fct_par_addr;
144 struct device *dev;
145};
146
147enum tasdevice_fw_state {
148 /* Driver in startup mode, not load any firmware. */
149 TASDEVICE_DSP_FW_PENDING,
150 /* DSP firmware in the system, but parsing error. */
151 TASDEVICE_DSP_FW_FAIL,
152 /*
153 * Only RCA (Reconfigurable Architecture) firmware load
154 * successfully.
155 */
156 TASDEVICE_RCA_FW_OK,
157 /* Both RCA and DSP firmware load successfully. */
158 TASDEVICE_DSP_FW_ALL_OK,
159};
160
161enum tasdevice_bin_blk_type {
162 TASDEVICE_BIN_BLK_COEFF = 1,
163 TASDEVICE_BIN_BLK_POST_POWER_UP,
164 TASDEVICE_BIN_BLK_PRE_SHUTDOWN,
165 TASDEVICE_BIN_BLK_PRE_POWER_UP,
166 TASDEVICE_BIN_BLK_POST_SHUTDOWN
167};
168
169struct tasdevice_rca_hdr {
170 unsigned int img_sz;
171 unsigned int checksum;
172 unsigned int binary_version_num;
173 unsigned int drv_fw_version;
174 unsigned char plat_type;
175 unsigned char dev_family;
176 unsigned char reserve;
177 unsigned char ndev;
178 unsigned char devs[TASDEVICE_DEVICE_SUM];
179 unsigned int nconfig;
180 unsigned int config_size[TASDEVICE_CONFIG_SUM];
181};
182
183struct tasdev_blk_data {
184 unsigned char dev_idx;
185 unsigned char block_type;
186 unsigned short yram_checksum;
187 unsigned int block_size;
188 unsigned int n_subblks;
189 unsigned char *regdata;
190};
191
192struct tasdevice_config_info {
193 unsigned int nblocks;
194 unsigned int real_nblocks;
195 unsigned char active_dev;
196 struct tasdev_blk_data **blk_data;
197};
198
199struct tasdevice_rca {
200 struct tasdevice_rca_hdr fw_hdr;
201 int ncfgs;
202 struct tasdevice_config_info **cfg_info;
203 int profile_cfg_id;
204 /*
205 * Since version 0x105, the keyword 'init' was introduced into the
206 * profile, which is used for chip initialization, particularly to
207 * store common settings for other non-initialization profiles.
208 * if (init_profile_id < 0)
209 * No init profile inside the RCA firmware.
210 */
211 int init_profile_id;
212};
213
214void tasdevice_select_cfg_blk(void *context, int conf_no,
215 unsigned char block_type);
216void tasdevice_config_info_remove(void *context);
217void tasdevice_dsp_remove(void *context);
218int tasdevice_dsp_parser(void *context);
219int tasdevice_rca_parser(void *context, const struct firmware *fmw);
220void tasdevice_dsp_remove(void *context);
221void tasdevice_calbin_remove(void *context);
222int tasdevice_select_tuningprm_cfg(void *context, int prm,
223 int cfg_no, int rca_conf_no);
224int tasdevice_prmg_load(void *context, int prm_no);
225void tasdevice_tuning_switch(void *context, int state);
226int tas2781_load_calibration(void *context, char *file_name,
227 unsigned short i);
228
229#endif
230

Warning: This file is not a C or C++ file. It does not have highlighting.

source code of linux/include/sound/tas2781-dsp.h