239 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2//3// ALSA SoC Texas Instruments TAS2563/TAS2781 Audio Smart Amplifier4//5// Copyright (C) 2022 - 2024 Texas Instruments Incorporated6// https://www.ti.com7//8// The TAS2563/TAS2781 driver implements a flexible and configurable9// algo coefficient setting for one, two, or even multiple10// TAS2563/TAS2781 chips.11//12// Author: Shenghao Ding <shenghao-ding@ti.com>13// Author: Kevin Lu <kevin-lu@ti.com>14//15 16#ifndef __TAS2781_H__17#define __TAS2781_H__18 19#include "tas2781-dsp.h"20 21/* version number */22#define TAS2781_DRV_VER 123#define SMARTAMP_MODULE_NAME "tas2781"24#define TAS2781_GLOBAL_ADDR 0x4025#define TAS2563_GLOBAL_ADDR 0x4826#define TASDEVICE_RATES (SNDRV_PCM_RATE_44100 |\27 SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 |\28 SNDRV_PCM_RATE_88200)29 30#define TASDEVICE_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \31 SNDRV_PCM_FMTBIT_S24_LE | \32 SNDRV_PCM_FMTBIT_S32_LE)33 34/*PAGE Control Register (available in page0 of each book) */35#define TASDEVICE_PAGE_SELECT 0x0036#define TASDEVICE_BOOKCTL_PAGE 0x0037#define TASDEVICE_BOOKCTL_REG 12738#define TASDEVICE_BOOK_ID(reg) (reg / (256 * 128))39#define TASDEVICE_PAGE_ID(reg) ((reg % (256 * 128)) / 128)40#define TASDEVICE_PAGE_REG(reg) ((reg % (256 * 128)) % 128)41#define TASDEVICE_PGRG(reg) (reg % (256 * 128))42#define TASDEVICE_REG(book, page, reg) (((book * 256 * 128) + \43 (page * 128)) + reg)44 45/*Software Reset */46#define TASDEVICE_REG_SWRESET TASDEVICE_REG(0x0, 0X0, 0x01)47#define TASDEVICE_REG_SWRESET_RESET BIT(0)48 49/*I2C Checksum */50#define TASDEVICE_I2CChecksum TASDEVICE_REG(0x0, 0x0, 0x7E)51 52/* XM_340 */53#define TASDEVICE_XM_A1_REG TASDEVICE_REG(0x64, 0x63, 0x3c)54/* XM_341 */55#define TASDEVICE_XM_A2_REG TASDEVICE_REG(0x64, 0x63, 0x38)56 57/* Volume control */58#define TAS2563_DVC_LVL TASDEVICE_REG(0x00, 0x02, 0x0C)59#define TAS2781_DVC_LVL TASDEVICE_REG(0x0, 0x0, 0x1A)60#define TAS2781_AMP_LEVEL TASDEVICE_REG(0x0, 0x0, 0x03)61#define TAS2781_AMP_LEVEL_MASK GENMASK(5, 1)62 63#define TAS2563_IDLE TASDEVICE_REG(0x00, 0x00, 0x3e)64#define TAS2563_PRM_R0_REG TASDEVICE_REG(0x00, 0x0f, 0x34)65 66#define TAS2563_RUNTIME_RE_REG_TF TASDEVICE_REG(0x64, 0x02, 0x70)67#define TAS2563_RUNTIME_RE_REG TASDEVICE_REG(0x64, 0x02, 0x48)68 69#define TAS2563_PRM_ENFF_REG TASDEVICE_REG(0x00, 0x0d, 0x54)70#define TAS2563_PRM_DISTCK_REG TASDEVICE_REG(0x00, 0x0d, 0x58)71#define TAS2563_PRM_TE_SCTHR_REG TASDEVICE_REG(0x00, 0x0f, 0x60)72#define TAS2563_PRM_PLT_FLAG_REG TASDEVICE_REG(0x00, 0x0d, 0x74)73#define TAS2563_PRM_SINEGAIN_REG TASDEVICE_REG(0x00, 0x0d, 0x7c)74/* prm_Int_B0 */75#define TAS2563_TE_TA1_REG TASDEVICE_REG(0x00, 0x10, 0x0c)76/* prm_Int_A1 */77#define TAS2563_TE_TA1_AT_REG TASDEVICE_REG(0x00, 0x10, 0x10)78/* prm_TE_Beta */79#define TAS2563_TE_TA2_REG TASDEVICE_REG(0x00, 0x0f, 0x64)80/* prm_TE_Beta1 */81#define TAS2563_TE_AT_REG TASDEVICE_REG(0x00, 0x0f, 0x68)82/* prm_TE_1_Beta1 */83#define TAS2563_TE_DT_REG TASDEVICE_REG(0x00, 0x0f, 0x70)84 85#define TAS2781_PRM_INT_MASK_REG TASDEVICE_REG(0x00, 0x00, 0x3b)86#define TAS2781_PRM_CLK_CFG_REG TASDEVICE_REG(0x00, 0x00, 0x5c)87#define TAS2781_PRM_RSVD_REG TASDEVICE_REG(0x00, 0x01, 0x19)88#define TAS2781_PRM_TEST_57_REG TASDEVICE_REG(0x00, 0xfd, 0x39)89#define TAS2781_PRM_TEST_62_REG TASDEVICE_REG(0x00, 0xfd, 0x3e)90#define TAS2781_PRM_PVDD_UVLO_REG TASDEVICE_REG(0x00, 0x00, 0x71)91#define TAS2781_PRM_CHNL_0_REG TASDEVICE_REG(0x00, 0x00, 0x03)92#define TAS2781_PRM_NG_CFG0_REG TASDEVICE_REG(0x00, 0x00, 0x35)93#define TAS2781_PRM_IDLE_CH_DET_REG TASDEVICE_REG(0x00, 0x00, 0x66)94#define TAS2781_PRM_PLT_FLAG_REG TASDEVICE_REG(0x00, 0x14, 0x38)95#define TAS2781_PRM_SINEGAIN_REG TASDEVICE_REG(0x00, 0x14, 0x40)96#define TAS2781_PRM_SINEGAIN2_REG TASDEVICE_REG(0x00, 0x14, 0x44)97 98#define TAS2781_TEST_UNLOCK_REG TASDEVICE_REG(0x00, 0xFD, 0x0D)99#define TAS2781_TEST_PAGE_UNLOCK 0x0D100 101#define TAS2781_RUNTIME_LATCH_RE_REG TASDEVICE_REG(0x00, 0x00, 0x49)102#define TAS2781_RUNTIME_RE_REG_TF TASDEVICE_REG(0x64, 0x62, 0x48)103#define TAS2781_RUNTIME_RE_REG TASDEVICE_REG(0x64, 0x63, 0x44)104 105#define TASDEVICE_CMD_SING_W 0x1106#define TASDEVICE_CMD_BURST 0x2107#define TASDEVICE_CMD_DELAY 0x3108#define TASDEVICE_CMD_FIELD_W 0x4109 110enum audio_device {111 TAS2563,112 TAS2781,113};114 115enum device_catlog_id {116 LENOVO = 0,117 OTHERS118};119 120struct bulk_reg_val {121 int reg;122 unsigned char val[4];123 unsigned char val_len;124 bool is_locked;125};126 127struct tasdevice {128 struct bulk_reg_val *cali_data_backup;129 struct tasdevice_fw *cali_data_fmw;130 unsigned int dev_addr;131 unsigned int err_code;132 unsigned char cur_book;133 short cur_prog;134 short cur_conf;135 bool is_loading;136 bool is_loaderr;137};138 139struct cali_reg {140 unsigned int r0_reg;141 unsigned int r0_low_reg;142 unsigned int invr0_reg;143 unsigned int pow_reg;144 unsigned int tlimit_reg;145};146 147struct calidata {148 unsigned char *data;149 unsigned long total_sz;150 struct cali_reg cali_reg_array;151 unsigned int cali_dat_sz_per_dev;152};153 154struct tasdevice_priv {155 struct tasdevice tasdevice[TASDEVICE_MAX_CHANNELS];156 struct tasdevice_rca rcabin;157 struct calidata cali_data;158 struct tasdevice_fw *fmw;159 struct gpio_desc *reset;160 struct mutex codec_lock;161 struct regmap *regmap;162 struct device *dev;163 struct tm tm;164 165 enum device_catlog_id catlog_id;166 unsigned char cal_binaryname[TASDEVICE_MAX_CHANNELS][64];167 unsigned char crc8_lkp_tbl[CRC8_TABLE_SIZE];168 unsigned char coef_binaryname[64];169 unsigned char rca_binaryname[64];170 unsigned char dev_name[32];171 const char *name_prefix;172 unsigned char ndev;173 unsigned int magic_num;174 unsigned int chip_id;175 unsigned int sysclk;176 177 int irq;178 int cur_prog;179 int cur_conf;180 int fw_state;181 int index;182 void *client;183 void *codec;184 bool force_fwload_status;185 bool playback_started;186 bool isacpi;187 bool is_user_space_calidata;188 unsigned int global_addr;189 190 int (*fw_parse_variable_header)(struct tasdevice_priv *tas_priv,191 const struct firmware *fmw, int offset);192 int (*fw_parse_program_data)(struct tasdevice_priv *tas_priv,193 struct tasdevice_fw *tas_fmw,194 const struct firmware *fmw, int offset);195 int (*fw_parse_configuration_data)(struct tasdevice_priv *tas_priv,196 struct tasdevice_fw *tas_fmw,197 const struct firmware *fmw, int offset);198 int (*tasdevice_load_block)(struct tasdevice_priv *tas_priv,199 struct tasdev_blk *block);200 201 int (*save_calibration)(struct tasdevice_priv *tas_priv);202 void (*apply_calibration)(struct tasdevice_priv *tas_priv);203};204 205void tasdevice_reset(struct tasdevice_priv *tas_dev);206int tascodec_init(struct tasdevice_priv *tas_priv, void *codec,207 struct module *module,208 void (*cont)(const struct firmware *fw, void *context));209struct tasdevice_priv *tasdevice_kzalloc(struct i2c_client *i2c);210int tasdevice_init(struct tasdevice_priv *tas_priv);211void tasdevice_remove(struct tasdevice_priv *tas_priv);212int tasdevice_save_calibration(struct tasdevice_priv *tas_priv);213void tasdevice_apply_calibration(struct tasdevice_priv *tas_priv);214int tasdev_chn_switch(struct tasdevice_priv *tas_priv,215 unsigned short chn);216int tasdevice_dev_read(struct tasdevice_priv *tas_priv,217 unsigned short chn, unsigned int reg, unsigned int *value);218int tasdevice_dev_write(struct tasdevice_priv *tas_priv,219 unsigned short chn, unsigned int reg, unsigned int value);220int tasdevice_dev_bulk_write(221 struct tasdevice_priv *tas_priv, unsigned short chn,222 unsigned int reg, unsigned char *p_data, unsigned int n_length);223int tasdevice_dev_bulk_read(struct tasdevice_priv *tas_priv,224 unsigned short chn, unsigned int reg, unsigned char *p_data,225 unsigned int n_length);226int tasdevice_dev_update_bits(227 struct tasdevice_priv *tasdevice, unsigned short chn,228 unsigned int reg, unsigned int mask, unsigned int value);229int tasdevice_amp_putvol(struct tasdevice_priv *tas_priv,230 struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);231int tasdevice_amp_getvol(struct tasdevice_priv *tas_priv,232 struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);233int tasdevice_digital_putvol(struct tasdevice_priv *tas_priv,234 struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);235int tasdevice_digital_getvol(struct tasdevice_priv *tas_priv,236 struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);237 238#endif /* __TAS2781_H__ */239