195 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			195 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| //
 | |
| // ALSA SoC Texas Instruments TAS2781 Audio Smart Amplifier
 | |
| //
 | |
| // Copyright (C) 2022 - 2024 Texas Instruments Incorporated
 | |
| // https://www.ti.com
 | |
| //
 | |
| // The TAS2781 driver implements a flexible and configurable
 | |
| // algo coefficient setting for one, two, or even multiple
 | |
| // TAS2781 chips.
 | |
| //
 | |
| // Author: Shenghao Ding <shenghao-ding@ti.com>
 | |
| // Author: Kevin Lu <kevin-lu@ti.com>
 | |
| //
 | |
| 
 | |
| #ifndef __TAS2781_DSP_H__
 | |
| #define __TAS2781_DSP_H__
 | |
| 
 | |
| #define MAIN_ALL_DEVICES			0x0d
 | |
| #define MAIN_DEVICE_A				0x01
 | |
| #define MAIN_DEVICE_B				0x08
 | |
| #define MAIN_DEVICE_C				0x10
 | |
| #define MAIN_DEVICE_D				0x14
 | |
| #define COEFF_DEVICE_A				0x03
 | |
| #define COEFF_DEVICE_B				0x0a
 | |
| #define COEFF_DEVICE_C				0x11
 | |
| #define COEFF_DEVICE_D				0x15
 | |
| #define PRE_DEVICE_A				0x04
 | |
| #define PRE_DEVICE_B				0x0b
 | |
| #define PRE_DEVICE_C				0x12
 | |
| #define PRE_DEVICE_D				0x16
 | |
| 
 | |
| #define PPC3_VERSION				0x4100
 | |
| #define PPC3_VERSION_TAS2781			0x14600
 | |
| #define TASDEVICE_DEVICE_SUM			8
 | |
| #define TASDEVICE_CONFIG_SUM			64
 | |
| 
 | |
| #define TASDEVICE_MAX_CHANNELS			8
 | |
| 
 | |
| enum tasdevice_dsp_dev_idx {
 | |
| 	TASDEVICE_DSP_TAS_2555 = 0,
 | |
| 	TASDEVICE_DSP_TAS_2555_STEREO,
 | |
| 	TASDEVICE_DSP_TAS_2557_MONO,
 | |
| 	TASDEVICE_DSP_TAS_2557_DUAL_MONO,
 | |
| 	TASDEVICE_DSP_TAS_2559,
 | |
| 	TASDEVICE_DSP_TAS_2563,
 | |
| 	TASDEVICE_DSP_TAS_2563_DUAL_MONO = 7,
 | |
| 	TASDEVICE_DSP_TAS_2563_QUAD,
 | |
| 	TASDEVICE_DSP_TAS_2563_21,
 | |
| 	TASDEVICE_DSP_TAS_2781,
 | |
| 	TASDEVICE_DSP_TAS_2781_DUAL_MONO,
 | |
| 	TASDEVICE_DSP_TAS_2781_21,
 | |
| 	TASDEVICE_DSP_TAS_2781_QUAD,
 | |
| 	TASDEVICE_DSP_TAS_MAX_DEVICE
 | |
| };
 | |
| 
 | |
| struct tasdevice_fw_fixed_hdr {
 | |
| 	unsigned int fwsize;
 | |
| 	unsigned int ppcver;
 | |
| 	unsigned int drv_ver;
 | |
| };
 | |
| 
 | |
| struct tasdevice_dspfw_hdr {
 | |
| 	struct tasdevice_fw_fixed_hdr fixed_hdr;
 | |
| 	unsigned short device_family;
 | |
| 	unsigned short device;
 | |
| 	unsigned char ndev;
 | |
| };
 | |
| 
 | |
| struct tasdev_blk {
 | |
| 	int nr_retry;
 | |
| 	unsigned int type;
 | |
| 	unsigned char is_pchksum_present;
 | |
| 	unsigned char pchksum;
 | |
| 	unsigned char is_ychksum_present;
 | |
| 	unsigned char ychksum;
 | |
| 	unsigned int nr_cmds;
 | |
| 	unsigned int blk_size;
 | |
| 	unsigned int nr_subblocks;
 | |
| 	/* fixed m68k compiling issue, storing the dev_idx as a member of block
 | |
| 	 * can reduce unnecessary timeand system resource comsumption of
 | |
| 	 * dev_idx mapping every time the block data writing to the dsp.
 | |
| 	 */
 | |
| 	unsigned char dev_idx;
 | |
| 	unsigned char *data;
 | |
| };
 | |
| 
 | |
| struct tasdevice_data {
 | |
| 	char name[64];
 | |
| 	unsigned int nr_blk;
 | |
| 	struct tasdev_blk *dev_blks;
 | |
| };
 | |
| 
 | |
| struct tasdevice_prog {
 | |
| 	unsigned int prog_size;
 | |
| 	struct tasdevice_data dev_data;
 | |
| };
 | |
| 
 | |
| struct tasdevice_config {
 | |
| 	unsigned int cfg_size;
 | |
| 	char name[64];
 | |
| 	struct tasdevice_data dev_data;
 | |
| };
 | |
| 
 | |
| struct tasdevice_calibration {
 | |
| 	struct tasdevice_data dev_data;
 | |
| };
 | |
| 
 | |
| struct tasdevice_fw {
 | |
| 	struct tasdevice_dspfw_hdr fw_hdr;
 | |
| 	unsigned short nr_programs;
 | |
| 	struct tasdevice_prog *programs;
 | |
| 	unsigned short nr_configurations;
 | |
| 	struct tasdevice_config *configs;
 | |
| 	unsigned short nr_calibrations;
 | |
| 	struct tasdevice_calibration *calibrations;
 | |
| 	struct device *dev;
 | |
| };
 | |
| 
 | |
| enum tasdevice_fw_state {
 | |
| 	/* Driver in startup mode, not load any firmware. */
 | |
| 	TASDEVICE_DSP_FW_PENDING,
 | |
| 	/* DSP firmware in the system, but parsing error. */
 | |
| 	TASDEVICE_DSP_FW_FAIL,
 | |
| 	/*
 | |
| 	 * Only RCA (Reconfigurable Architecture) firmware load
 | |
| 	 * successfully.
 | |
| 	 */
 | |
| 	TASDEVICE_RCA_FW_OK,
 | |
| 	/* Both RCA and DSP firmware load successfully. */
 | |
| 	TASDEVICE_DSP_FW_ALL_OK,
 | |
| };
 | |
| 
 | |
| enum tasdevice_bin_blk_type {
 | |
| 	TASDEVICE_BIN_BLK_COEFF = 1,
 | |
| 	TASDEVICE_BIN_BLK_POST_POWER_UP,
 | |
| 	TASDEVICE_BIN_BLK_PRE_SHUTDOWN,
 | |
| 	TASDEVICE_BIN_BLK_PRE_POWER_UP,
 | |
| 	TASDEVICE_BIN_BLK_POST_SHUTDOWN
 | |
| };
 | |
| 
 | |
| struct tasdevice_rca_hdr {
 | |
| 	unsigned int img_sz;
 | |
| 	unsigned int checksum;
 | |
| 	unsigned int binary_version_num;
 | |
| 	unsigned int drv_fw_version;
 | |
| 	unsigned char plat_type;
 | |
| 	unsigned char dev_family;
 | |
| 	unsigned char reserve;
 | |
| 	unsigned char ndev;
 | |
| 	unsigned char devs[TASDEVICE_DEVICE_SUM];
 | |
| 	unsigned int nconfig;
 | |
| 	unsigned int config_size[TASDEVICE_CONFIG_SUM];
 | |
| };
 | |
| 
 | |
| struct tasdev_blk_data {
 | |
| 	unsigned char dev_idx;
 | |
| 	unsigned char block_type;
 | |
| 	unsigned short yram_checksum;
 | |
| 	unsigned int block_size;
 | |
| 	unsigned int n_subblks;
 | |
| 	unsigned char *regdata;
 | |
| };
 | |
| 
 | |
| struct tasdevice_config_info {
 | |
| 	unsigned int nblocks;
 | |
| 	unsigned int real_nblocks;
 | |
| 	unsigned char active_dev;
 | |
| 	struct tasdev_blk_data **blk_data;
 | |
| };
 | |
| 
 | |
| struct tasdevice_rca {
 | |
| 	struct tasdevice_rca_hdr fw_hdr;
 | |
| 	int ncfgs;
 | |
| 	struct tasdevice_config_info **cfg_info;
 | |
| 	int profile_cfg_id;
 | |
| };
 | |
| 
 | |
| void tasdevice_select_cfg_blk(void *context, int conf_no,
 | |
| 	unsigned char block_type);
 | |
| void tasdevice_config_info_remove(void *context);
 | |
| void tasdevice_dsp_remove(void *context);
 | |
| int tasdevice_dsp_parser(void *context);
 | |
| int tasdevice_rca_parser(void *context, const struct firmware *fmw);
 | |
| void tasdevice_dsp_remove(void *context);
 | |
| void tasdevice_calbin_remove(void *context);
 | |
| int tasdevice_select_tuningprm_cfg(void *context, int prm,
 | |
| 	int cfg_no, int rca_conf_no);
 | |
| int tasdevice_prmg_load(void *context, int prm_no);
 | |
| void tasdevice_tuning_switch(void *context, int state);
 | |
| int tas2781_load_calibration(void *context, char *file_name,
 | |
| 	unsigned short i);
 | |
| 
 | |
| #endif
 |