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