xref: /openbmc/linux/include/sound/tas2781-dsp.h (revision 2f4e3926)
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 
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
55 };
56 
57 struct tasdevice_fw_fixed_hdr {
58 	unsigned int fwsize;
59 	unsigned int ppcver;
60 	unsigned int drv_ver;
61 };
62 
63 struct 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 
70 struct 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 	unsigned char *data;
81 };
82 
83 struct tasdevice_data {
84 	char name[64];
85 	unsigned int nr_blk;
86 	struct tasdev_blk *dev_blks;
87 };
88 
89 struct tasdevice_prog {
90 	unsigned int prog_size;
91 	struct tasdevice_data dev_data;
92 };
93 
94 struct tasdevice_config {
95 	unsigned int cfg_size;
96 	char name[64];
97 	struct tasdevice_data dev_data;
98 };
99 
100 struct tasdevice_calibration {
101 	struct tasdevice_data dev_data;
102 };
103 
104 struct tasdevice_fw {
105 	struct tasdevice_dspfw_hdr fw_hdr;
106 	unsigned short nr_programs;
107 	struct tasdevice_prog *programs;
108 	unsigned short nr_configurations;
109 	struct tasdevice_config *configs;
110 	unsigned short nr_calibrations;
111 	struct tasdevice_calibration *calibrations;
112 	struct device *dev;
113 };
114 
115 enum tasdevice_fw_state {
116 	/* Driver in startup mode, not load any firmware. */
117 	TASDEVICE_DSP_FW_PENDING,
118 	/* DSP firmware in the system, but parsing error. */
119 	TASDEVICE_DSP_FW_FAIL,
120 	/*
121 	 * Only RCA (Reconfigurable Architecture) firmware load
122 	 * successfully.
123 	 */
124 	TASDEVICE_RCA_FW_OK,
125 	/* Both RCA and DSP firmware load successfully. */
126 	TASDEVICE_DSP_FW_ALL_OK,
127 };
128 
129 enum tasdevice_bin_blk_type {
130 	TASDEVICE_BIN_BLK_COEFF = 1,
131 	TASDEVICE_BIN_BLK_POST_POWER_UP,
132 	TASDEVICE_BIN_BLK_PRE_SHUTDOWN,
133 	TASDEVICE_BIN_BLK_PRE_POWER_UP,
134 	TASDEVICE_BIN_BLK_POST_SHUTDOWN
135 };
136 
137 struct tasdevice_rca_hdr {
138 	unsigned int img_sz;
139 	unsigned int checksum;
140 	unsigned int binary_version_num;
141 	unsigned int drv_fw_version;
142 	unsigned char plat_type;
143 	unsigned char dev_family;
144 	unsigned char reserve;
145 	unsigned char ndev;
146 	unsigned char devs[TASDEVICE_DEVICE_SUM];
147 	unsigned int nconfig;
148 	unsigned int config_size[TASDEVICE_CONFIG_SUM];
149 };
150 
151 struct tasdev_blk_data {
152 	unsigned char dev_idx;
153 	unsigned char block_type;
154 	unsigned short yram_checksum;
155 	unsigned int block_size;
156 	unsigned int n_subblks;
157 	unsigned char *regdata;
158 };
159 
160 struct tasdevice_config_info {
161 	unsigned int nblocks;
162 	unsigned int real_nblocks;
163 	unsigned char active_dev;
164 	struct tasdev_blk_data **blk_data;
165 };
166 
167 struct tasdevice_rca {
168 	struct tasdevice_rca_hdr fw_hdr;
169 	int ncfgs;
170 	struct tasdevice_config_info **cfg_info;
171 	int profile_cfg_id;
172 };
173 
174 void tasdevice_select_cfg_blk(void *context, int conf_no,
175 	unsigned char block_type);
176 void tasdevice_config_info_remove(void *context);
177 void tasdevice_dsp_remove(void *context);
178 int tasdevice_dsp_parser(void *context);
179 int tasdevice_rca_parser(void *context, const struct firmware *fmw);
180 void tasdevice_dsp_remove(void *context);
181 void tasdevice_calbin_remove(void *context);
182 int tasdevice_select_tuningprm_cfg(void *context, int prm,
183 	int cfg_no, int rca_conf_no);
184 int tasdevice_prmg_load(void *context, int prm_no);
185 void tasdevice_tuning_switch(void *context, int state);
186 int tas2781_load_calibration(void *context, char *file_name,
187 	unsigned short i);
188 
189 #endif
190