195 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2//3// ALSA SoC Texas Instruments TAS2781 Audio Smart Amplifier4//5// Copyright (C) 2022 - 2024 Texas Instruments Incorporated6// https://www.ti.com7//8// The TAS2781 driver implements a flexible and configurable9// algo coefficient setting for one, two, or even multiple10// 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 0x0d20#define MAIN_DEVICE_A 0x0121#define MAIN_DEVICE_B 0x0822#define MAIN_DEVICE_C 0x1023#define MAIN_DEVICE_D 0x1424#define COEFF_DEVICE_A 0x0325#define COEFF_DEVICE_B 0x0a26#define COEFF_DEVICE_C 0x1127#define COEFF_DEVICE_D 0x1528#define PRE_DEVICE_A 0x0429#define PRE_DEVICE_B 0x0b30#define PRE_DEVICE_C 0x1231#define PRE_DEVICE_D 0x1632 33#define PPC3_VERSION 0x410034#define PPC3_VERSION_TAS2781 0x1460035#define TASDEVICE_DEVICE_SUM 836#define TASDEVICE_CONFIG_SUM 6437 38#define TASDEVICE_MAX_CHANNELS 839 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_DEVICE55};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 block81 * can reduce unnecessary timeand system resource comsumption of82 * 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_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,125 /*126 * Only RCA (Reconfigurable Architecture) firmware load127 * successfully.128 */129 TASDEVICE_RCA_FW_OK,130 /* Both RCA and DSP firmware load successfully. */131 TASDEVICE_DSP_FW_ALL_OK,132};133 134enum 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_SHUTDOWN140};141 142struct tasdevice_rca_hdr {143 unsigned int img_sz;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;150 unsigned char ndev;151 unsigned char devs[TASDEVICE_DEVICE_SUM];152 unsigned int nconfig;153 unsigned int config_size[TASDEVICE_CONFIG_SUM];154};155 156struct 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;163};164 165struct tasdevice_config_info {166 unsigned int nblocks;167 unsigned int real_nblocks;168 unsigned char active_dev;169 struct tasdev_blk_data **blk_data;170};171 172struct tasdevice_rca {173 struct tasdevice_rca_hdr fw_hdr;174 int ncfgs;175 struct tasdevice_config_info **cfg_info;176 int profile_cfg_id;177};178 179void tasdevice_select_cfg_blk(void *context, int conf_no,180 unsigned char block_type);181void tasdevice_config_info_remove(void *context);182void tasdevice_dsp_remove(void *context);183int tasdevice_dsp_parser(void *context);184int tasdevice_rca_parser(void *context, const struct firmware *fmw);185void tasdevice_dsp_remove(void *context);186void tasdevice_calbin_remove(void *context);187int tasdevice_select_tuningprm_cfg(void *context, int prm,188 int cfg_no, int rca_conf_no);189int tasdevice_prmg_load(void *context, int prm_no);190void tasdevice_tuning_switch(void *context, int state);191int tas2781_load_calibration(void *context, char *file_name,192 unsigned short i);193 194#endif195