ASoC: tas2781: Add Header file for tas2781 driver

Create Header file for  tas2781 driver.

Signed-off-by: Shenghao Ding <13916275206@139.com>
Link: https://lore.kernel.org/r/20230618122819.23143-1-13916275206@139.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Shenghao Ding 2023-06-18 20:28:16 +08:00 committed by Mark Brown
parent 8fba13f02c
commit 678f38eba1
No known key found for this signature in database
GPG key ID: 24D68B725D5487D0
3 changed files with 368 additions and 0 deletions

183
include/sound/tas2781-dsp.h Normal file
View file

@ -0,0 +1,183 @@
/* SPDX-License-Identifier: GPL-2.0 */
//
// ALSA SoC Texas Instruments TAS2781 Audio Smart Amplifier
//
// Copyright (C) 2022 - 2023 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 __TASDEVICE_DSP_H__
#define __TASDEVICE_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;
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_dsp_fw_state {
TASDEVICE_DSP_FW_NONE = 0,
TASDEVICE_DSP_FW_PENDING,
TASDEVICE_DSP_FW_FAIL,
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);
int tasdevice_prmg_calibdata_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

View file

@ -0,0 +1,21 @@
/* SPDX-License-Identifier: GPL-2.0 */
//
// ALSA SoC Texas Instruments TAS2781 Audio Smart Amplifier
//
// Copyright (C) 2022 - 2023 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>
//
#ifndef __TAS2781_TLV_H__
#define __TAS2781_TLV_H__
static const DECLARE_TLV_DB_SCALE(dvc_tlv, -10000, 100, 0);
static const DECLARE_TLV_DB_SCALE(amp_vol_tlv, 1100, 50, 0);
#endif

164
include/sound/tas2781.h Normal file
View file

@ -0,0 +1,164 @@
/* SPDX-License-Identifier: GPL-2.0 */
//
// ALSA SoC Texas Instruments TAS2781 Audio Smart Amplifier
//
// Copyright (C) 2022 - 2023 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_H__
#define __TAS2781_H__
#include "tas2781-dsp.h"
/* version number */
#define TAS2781_DRV_VER 1
#define SMARTAMP_MODULE_NAME "tas2781"
#define TAS2781_GLOBAL_ADDR 0x40
#define TASDEVICE_RATES (SNDRV_PCM_RATE_44100 |\
SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 |\
SNDRV_PCM_RATE_88200)
#define TASDEVICE_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
SNDRV_PCM_FMTBIT_S24_LE | \
SNDRV_PCM_FMTBIT_S32_LE)
/*PAGE Control Register (available in page0 of each book) */
#define TASDEVICE_PAGE_SELECT 0x00
#define TASDEVICE_BOOKCTL_PAGE 0x00
#define TASDEVICE_BOOKCTL_REG 127
#define TASDEVICE_BOOK_ID(reg) (reg / (256 * 128))
#define TASDEVICE_PAGE_ID(reg) ((reg % (256 * 128)) / 128)
#define TASDEVICE_PAGE_REG(reg) ((reg % (256 * 128)) % 128)
#define TASDEVICE_PGRG(reg) (reg % (256 * 128))
#define TASDEVICE_REG(book, page, reg) (((book * 256 * 128) + \
(page * 128)) + reg)
/*Software Reset */
#define TAS2781_REG_SWRESET TASDEVICE_REG(0x0, 0X0, 0x01)
#define TAS2781_REG_SWRESET_RESET BIT(0)
/*I2C Checksum */
#define TASDEVICE_I2CChecksum TASDEVICE_REG(0x0, 0x0, 0x7E)
/* Volume control */
#define TAS2781_DVC_LVL TASDEVICE_REG(0x0, 0x0, 0x1A)
#define TAS2781_AMP_LEVEL TASDEVICE_REG(0x0, 0x0, 0x03)
#define TAS2781_AMP_LEVEL_MASK GENMASK(5, 1)
#define TASDEVICE_CMD_SING_W 0x1
#define TASDEVICE_CMD_BURST 0x2
#define TASDEVICE_CMD_DELAY 0x3
#define TASDEVICE_CMD_FIELD_W 0x4
enum audio_device {
TAS2781 = 0,
};
enum device_catlog_id {
LENOVO = 0,
OTHERS
};
struct tasdevice {
struct tasdevice_fw *cali_data_fmw;
unsigned int dev_addr;
unsigned int err_code;
unsigned char cur_book;
short cur_prog;
short cur_conf;
bool is_loading;
bool is_loaderr;
};
struct tasdevice_irqinfo {
int irq_gpio;
int irq;
};
struct calidata {
unsigned char *data;
unsigned long total_sz;
};
struct tasdevice_priv {
struct tasdevice tasdevice[TASDEVICE_MAX_CHANNELS];
struct tasdevice_irqinfo irq_info;
struct tasdevice_rca rcabin;
struct calidata cali_data;
struct tasdevice_fw *fmw;
struct gpio_desc *reset;
struct mutex codec_lock;
struct regmap *regmap;
struct device *dev;
struct tm tm;
enum device_catlog_id catlog_id;
const char *acpi_subsystem_id;
unsigned char cal_binaryname[TASDEVICE_MAX_CHANNELS][64];
unsigned char crc8_lkp_tbl[CRC8_TABLE_SIZE];
unsigned char coef_binaryname[64];
unsigned char rca_binaryname[64];
unsigned char dev_name[32];
unsigned char ndev;
unsigned int magic_num;
unsigned int chip_id;
unsigned int sysclk;
int cur_prog;
int cur_conf;
int fw_state;
int index;
void *client;
void *codec;
bool force_fwload_status;
bool playback_started;
bool isacpi;
int (*fw_parse_variable_header)(struct tasdevice_priv *tas_priv,
const struct firmware *fmw, int offset);
int (*fw_parse_program_data)(struct tasdevice_priv *tas_priv,
struct tasdevice_fw *tas_fmw,
const struct firmware *fmw, int offset);
int (*fw_parse_configuration_data)(struct tasdevice_priv *tas_priv,
struct tasdevice_fw *tas_fmw,
const struct firmware *fmw, int offset);
int (*tasdevice_load_block)(struct tasdevice_priv *tas_priv,
struct tasdev_blk *block);
};
void tas2781_reset(struct tasdevice_priv *tas_dev);
int tascodec_init(struct tasdevice_priv *tas_priv, void *codec,
void (*cont)(const struct firmware *fw, void *context));
struct tasdevice_priv *tasdevice_kzalloc(struct i2c_client *i2c);
int tasdevice_init(struct tasdevice_priv *tas_priv);
void tasdevice_remove(struct tasdevice_priv *tas_priv);
int tasdevice_dev_read(struct tasdevice_priv *tas_priv,
unsigned short chn, unsigned int reg, unsigned int *value);
int tasdevice_dev_write(struct tasdevice_priv *tas_priv,
unsigned short chn, unsigned int reg, unsigned int value);
int tasdevice_dev_bulk_write(
struct tasdevice_priv *tas_priv, unsigned short chn,
unsigned int reg, unsigned char *p_data, unsigned int n_length);
int tasdevice_dev_bulk_read(struct tasdevice_priv *tas_priv,
unsigned short chn, unsigned int reg, unsigned char *p_data,
unsigned int n_length);
int tasdevice_dev_update_bits(
struct tasdevice_priv *tasdevice, unsigned short chn,
unsigned int reg, unsigned int mask, unsigned int value);
int tasdevice_amp_putvol(struct tasdevice_priv *tas_priv,
struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);
int tasdevice_amp_getvol(struct tasdevice_priv *tas_priv,
struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);
int tasdevice_digital_putvol(struct tasdevice_priv *tas_priv,
struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);
int tasdevice_digital_getvol(struct tasdevice_priv *tas_priv,
struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);
#endif /* __TAS2781_H__ */