1 /* SPDX-License-Identifier: GPL-2.0 */
3 // ALSA SoC Texas Instruments TAS2781 Audio Smart Amplifier
5 // Copyright (C) 2022 - 2024 Texas Instruments Incorporated
8 // The TAS2781 driver implements a flexible and configurable
9 // algo coefficient setting for one, two, or even multiple
12 // Author: Shenghao Ding <shenghao-ding@ti.com>
13 // Author: Kevin Lu <kevin-lu@ti.com>
16 #ifndef __TAS2781_DSP_H__
17 #define __TAS2781_DSP_H__
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
33 #define PPC3_VERSION 0x4100
34 #define PPC3_VERSION_TAS2781 0x14600
35 #define TASDEVICE_DEVICE_SUM 8
36 #define TASDEVICE_CONFIG_SUM 64
38 #define TASDEVICE_MAX_CHANNELS 8
40 enum 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
57 struct tasdevice_fw_fixed_hdr
{
63 struct tasdevice_dspfw_hdr
{
64 struct tasdevice_fw_fixed_hdr fixed_hdr
;
65 unsigned short device_family
;
66 unsigned short device
;
73 unsigned char is_pchksum_present
;
74 unsigned char pchksum
;
75 unsigned char is_ychksum_present
;
76 unsigned char ychksum
;
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.
84 unsigned char dev_idx
;
88 struct tasdevice_data
{
91 struct tasdev_blk
*dev_blks
;
94 struct tasdevice_prog
{
95 unsigned int prog_size
;
96 struct tasdevice_data dev_data
;
99 struct tasdevice_config
{
100 unsigned int cfg_size
;
102 struct tasdevice_data dev_data
;
105 struct tasdevice_calibration
{
106 struct tasdevice_data dev_data
;
109 struct 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
;
120 enum tasdevice_fw_state
{
121 /* Driver in startup mode, not load any firmware. */
122 TASDEVICE_DSP_FW_PENDING
,
123 /* DSP firmware in the system, but parsing error. */
124 TASDEVICE_DSP_FW_FAIL
,
126 * Only RCA (Reconfigurable Architecture) firmware load
130 /* Both RCA and DSP firmware load successfully. */
131 TASDEVICE_DSP_FW_ALL_OK
,
134 enum tasdevice_bin_blk_type
{
135 TASDEVICE_BIN_BLK_COEFF
= 1,
136 TASDEVICE_BIN_BLK_POST_POWER_UP
,
137 TASDEVICE_BIN_BLK_PRE_SHUTDOWN
,
138 TASDEVICE_BIN_BLK_PRE_POWER_UP
,
139 TASDEVICE_BIN_BLK_POST_SHUTDOWN
142 struct tasdevice_rca_hdr
{
144 unsigned int checksum
;
145 unsigned int binary_version_num
;
146 unsigned int drv_fw_version
;
147 unsigned char plat_type
;
148 unsigned char dev_family
;
149 unsigned char reserve
;
151 unsigned char devs
[TASDEVICE_DEVICE_SUM
];
152 unsigned int nconfig
;
153 unsigned int config_size
[TASDEVICE_CONFIG_SUM
];
156 struct tasdev_blk_data
{
157 unsigned char dev_idx
;
158 unsigned char block_type
;
159 unsigned short yram_checksum
;
160 unsigned int block_size
;
161 unsigned int n_subblks
;
162 unsigned char *regdata
;
165 struct tasdevice_config_info
{
166 unsigned int nblocks
;
167 unsigned int real_nblocks
;
168 unsigned char active_dev
;
169 struct tasdev_blk_data
**blk_data
;
172 struct tasdevice_rca
{
173 struct tasdevice_rca_hdr fw_hdr
;
175 struct tasdevice_config_info
**cfg_info
;
179 void tasdevice_select_cfg_blk(void *context
, int conf_no
,
180 unsigned char block_type
);
181 void tasdevice_config_info_remove(void *context
);
182 void tasdevice_dsp_remove(void *context
);
183 int tasdevice_dsp_parser(void *context
);
184 int tasdevice_rca_parser(void *context
, const struct firmware
*fmw
);
185 void tasdevice_dsp_remove(void *context
);
186 void tasdevice_calbin_remove(void *context
);
187 int tasdevice_select_tuningprm_cfg(void *context
, int prm
,
188 int cfg_no
, int rca_conf_no
);
189 int tasdevice_prmg_load(void *context
, int prm_no
);
190 void tasdevice_tuning_switch(void *context
, int state
);
191 int tas2781_load_calibration(void *context
, char *file_name
,