mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-29 17:25:38 +00:00
9f774c757e
In only loading RCA (Reconfigurable Architecture) binary case, no DSP
program will be working inside tas2563/tas2781, that is dsp-bypass mode,
do not support speaker protection, or audio acoustic algorithms in this
mode.
Fixes: ef3bcde75d
("ASoC: tas2781: Add tas2781 driver")
Signed-off-by: Shenghao Ding <shenghao-ding@ti.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://msgid.link/r/20240614133646.910-1-shenghao-ding@ti.com
Signed-off-by: Mark Brown <broonie@kernel.org>
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
|