GNU Linux-libre 6.9.2-gnu
[releases.git] / include / sound / tas2781-dsp.h
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 __TASDEVICE_DSP_H__
17 #define __TASDEVICE_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         /* 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
88 struct tasdevice_data {
89         char name[64];
90         unsigned int nr_blk;
91         struct tasdev_blk *dev_blks;
92 };
93
94 struct tasdevice_prog {
95         unsigned int prog_size;
96         struct tasdevice_data dev_data;
97 };
98
99 struct tasdevice_config {
100         unsigned int cfg_size;
101         char name[64];
102         struct tasdevice_data dev_data;
103 };
104
105 struct tasdevice_calibration {
106         struct tasdevice_data dev_data;
107 };
108
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;
117         struct device *dev;
118 };
119
120 enum 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
127 enum 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
135 struct 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
149 struct 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
158 struct 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
165 struct 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
172 void tasdevice_select_cfg_blk(void *context, int conf_no,
173         unsigned char block_type);
174 void tasdevice_config_info_remove(void *context);
175 void tasdevice_dsp_remove(void *context);
176 int tasdevice_dsp_parser(void *context);
177 int tasdevice_rca_parser(void *context, const struct firmware *fmw);
178 void tasdevice_dsp_remove(void *context);
179 void tasdevice_calbin_remove(void *context);
180 int tasdevice_select_tuningprm_cfg(void *context, int prm,
181         int cfg_no, int rca_conf_no);
182 int tasdevice_prmg_load(void *context, int prm_no);
183 int tasdevice_prmg_calibdata_load(void *context, int prm_no);
184 void tasdevice_tuning_switch(void *context, int state);
185 int tas2781_load_calibration(void *context, char *file_name,
186         unsigned short i);
187
188 #endif