1 /* SPDX-License-Identifier: GPL-2.0 */ 2 // 3 // ALSA SoC Texas Instruments TAS2563/TAS2781 Audio Smart Amplifier 4 // 5 // Copyright (C) 2022 - 2026 Texas Instruments Incorporated 6 // https://www.ti.com 7 // 8 // The TAS2563/TAS2781 driver implements a flexible and configurable 9 // algo coefficient setting for one, two, or even multiple 10 // TAS2563/TAS2781 chips. 11 // 12 // Author: Shenghao Ding <shenghao-ding@ti.com> 13 // Author: Kevin Lu <kevin-lu@ti.com> 14 // Author: Baojun Xu <baojun.xu@ti.com> 15 // 16 17 #ifndef __TAS2781_H__ 18 #define __TAS2781_H__ 19 20 #ifdef CONFIG_SND_SOC_TAS2781_ACOUST_I2C 21 #include <linux/debugfs.h> 22 #endif 23 24 #include "tas2781-dsp.h" 25 26 /* version number */ 27 #define TAS2781_DRV_VER 1 28 #define SMARTAMP_MODULE_NAME "tas2781" 29 #define TAS2781_GLOBAL_ADDR 0x40 30 #define TAS2563_GLOBAL_ADDR 0x48 31 #define TASDEVICE_RATES (SNDRV_PCM_RATE_44100 |\ 32 SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 |\ 33 SNDRV_PCM_RATE_88200) 34 35 #define TASDEVICE_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \ 36 SNDRV_PCM_FMTBIT_S24_LE | \ 37 SNDRV_PCM_FMTBIT_S32_LE) 38 39 #define TASDEVICE_CRC8_POLYNOMIAL 0x4d 40 41 /* PAGE Control Register (available in page0 of each book) */ 42 #define TASDEVICE_PAGE_SELECT 0x00 43 #define TASDEVICE_BOOKCTL_PAGE 0x00 44 #define TASDEVICE_BOOKCTL_REG 127 45 #define TASDEVICE_BOOK_ID(reg) (reg / (256 * 128)) 46 #define TASDEVICE_PAGE_ID(reg) ((reg % (256 * 128)) / 128) 47 #define TASDEVICE_PAGE_REG(reg) ((reg % (256 * 128)) % 128) 48 #define TASDEVICE_PGRG(reg) (reg % (256 * 128)) 49 #define TASDEVICE_REG(book, page, reg) (((book * 256 * 128) + \ 50 (page * 128)) + reg) 51 52 /* Software Reset, compatble with new device (TAS5825). */ 53 #define TASDEVICE_REG_SWRESET TASDEVICE_REG(0x0, 0x0, 0x01) 54 #define TASDEVICE_REG_SWRESET_RESET BIT(0) 55 56 #define TAS5825_REG_SWRESET_RESET (BIT(0) | BIT(4)) 57 58 /* Checksum */ 59 #define TASDEVICE_CHECKSUM_REG TASDEVICE_REG(0x0, 0x0, 0x7e) 60 61 /* XM_340 */ 62 #define TASDEVICE_XM_A1_REG TASDEVICE_REG(0x64, 0x63, 0x3c) 63 /* XM_341 */ 64 #define TASDEVICE_XM_A2_REG TASDEVICE_REG(0x64, 0x63, 0x38) 65 66 /* Volume control */ 67 #define TAS2563_DVC_LVL TASDEVICE_REG(0x00, 0x02, 0x0c) 68 #define TAS2781_DVC_LVL TASDEVICE_REG(0x0, 0x0, 0x1a) 69 #define TAS2781_AMP_LEVEL TASDEVICE_REG(0x0, 0x0, 0x03) 70 #define TAS2781_AMP_LEVEL_MASK GENMASK(5, 1) 71 72 #define TAS2563_IDLE TASDEVICE_REG(0x00, 0x00, 0x3e) 73 #define TAS2563_PRM_R0_REG TASDEVICE_REG(0x00, 0x0f, 0x34) 74 75 #define TAS2563_RUNTIME_RE_REG_TF TASDEVICE_REG(0x64, 0x02, 0x70) 76 #define TAS2563_RUNTIME_RE_REG TASDEVICE_REG(0x64, 0x02, 0x48) 77 78 #define TAS2563_PRM_ENFF_REG TASDEVICE_REG(0x00, 0x0d, 0x54) 79 #define TAS2563_PRM_DISTCK_REG TASDEVICE_REG(0x00, 0x0d, 0x58) 80 #define TAS2563_PRM_TE_SCTHR_REG TASDEVICE_REG(0x00, 0x0f, 0x60) 81 #define TAS2563_PRM_PLT_FLAG_REG TASDEVICE_REG(0x00, 0x0d, 0x74) 82 #define TAS2563_PRM_SINEGAIN_REG TASDEVICE_REG(0x00, 0x0d, 0x7c) 83 /* prm_Int_B0 */ 84 #define TAS2563_TE_TA1_REG TASDEVICE_REG(0x00, 0x10, 0x0c) 85 /* prm_Int_A1 */ 86 #define TAS2563_TE_TA1_AT_REG TASDEVICE_REG(0x00, 0x10, 0x10) 87 /* prm_TE_Beta */ 88 #define TAS2563_TE_TA2_REG TASDEVICE_REG(0x00, 0x0f, 0x64) 89 /* prm_TE_Beta1 */ 90 #define TAS2563_TE_AT_REG TASDEVICE_REG(0x00, 0x0f, 0x68) 91 /* prm_TE_1_Beta1 */ 92 #define TAS2563_TE_DT_REG TASDEVICE_REG(0x00, 0x0f, 0x70) 93 94 #define TAS2781_PRM_INT_MASK_REG TASDEVICE_REG(0x00, 0x00, 0x3b) 95 #define TAS2781_PRM_CLK_CFG_REG TASDEVICE_REG(0x00, 0x00, 0x5c) 96 #define TAS2781_PRM_RSVD_REG TASDEVICE_REG(0x00, 0x01, 0x19) 97 #define TAS2781_PRM_TEST_57_REG TASDEVICE_REG(0x00, 0xfd, 0x39) 98 #define TAS2781_PRM_TEST_62_REG TASDEVICE_REG(0x00, 0xfd, 0x3e) 99 #define TAS2781_PRM_PVDD_UVLO_REG TASDEVICE_REG(0x00, 0x00, 0x71) 100 #define TAS2781_PRM_CHNL_0_REG TASDEVICE_REG(0x00, 0x00, 0x03) 101 #define TAS2781_PRM_NG_CFG0_REG TASDEVICE_REG(0x00, 0x00, 0x35) 102 #define TAS2781_PRM_IDLE_CH_DET_REG TASDEVICE_REG(0x00, 0x00, 0x66) 103 #define TAS2781_PRM_PLT_FLAG_REG TASDEVICE_REG(0x00, 0x14, 0x38) 104 #define TAS2781_PRM_SINEGAIN_REG TASDEVICE_REG(0x00, 0x14, 0x40) 105 #define TAS2781_PRM_SINEGAIN2_REG TASDEVICE_REG(0x00, 0x14, 0x44) 106 107 #define TAS2781_TEST_UNLOCK_REG TASDEVICE_REG(0x00, 0xfd, 0x0d) 108 #define TAS2781_TEST_PAGE_UNLOCK 0x0d 109 110 #define TAS2781_RUNTIME_LATCH_RE_REG TASDEVICE_REG(0x00, 0x00, 0x49) 111 #define TAS2781_RUNTIME_RE_REG_TF TASDEVICE_REG(0x64, 0x62, 0x48) 112 #define TAS2781_RUNTIME_RE_REG TASDEVICE_REG(0x64, 0x63, 0x44) 113 114 enum audio_device { 115 TAS2020, 116 TAS2118, 117 TAS2120, 118 TAS2320, 119 TAS2563, 120 TAS2568, 121 TAS2570, 122 TAS2572, 123 TAS2574, 124 TAS2781, 125 TAS5802, 126 TAS5806M, 127 TAS5806MD, 128 TAS5815, 129 TAS5822, 130 TAS5825, 131 TAS5827, 132 TAS5828, 133 TAS5830, 134 TAS_OTHERS, 135 }; 136 137 enum dspbin_type { 138 TASDEV_BASIC, 139 TASDEV_ALPHA, 140 TASDEV_BETA, 141 }; 142 143 struct bulk_reg_val { 144 int reg; 145 unsigned char val[4]; 146 unsigned char val_len; 147 bool is_locked; 148 }; 149 150 struct tasdevice { 151 struct bulk_reg_val *cali_data_backup; 152 struct bulk_reg_val alp_cali_bckp; 153 struct tasdevice_fw *cali_data_fmw; 154 void *cali_specific; 155 unsigned int dev_addr; 156 unsigned int err_code; 157 unsigned char cur_book; 158 short cur_prog; 159 short cur_conf; 160 bool is_loading; 161 bool is_loaderr; 162 }; 163 164 struct cali_reg { 165 unsigned int r0_reg; 166 unsigned int r0_low_reg; 167 unsigned int invr0_reg; 168 unsigned int pow_reg; 169 unsigned int tlimit_reg; 170 }; 171 172 struct calidata { 173 unsigned char *data; 174 unsigned long total_sz; 175 struct cali_reg cali_reg_array; 176 unsigned int cali_dat_sz_per_dev; 177 }; 178 179 /* 180 * To enable CONFIG_SND_SOC_TAS2781_ACOUST_I2C will create a bridge to the 181 * acoustic tuning tool which can tune the chips' acoustic effect. Due to the 182 * whole directly exposing the registers, there exist some potential risks. So 183 * this define is invisible in Kconfig, anyone who wants to use acoustic tool 184 * have to edit the source manually. 185 */ 186 #ifdef CONFIG_SND_SOC_TAS2781_ACOUST_I2C 187 #define TASDEV_DATA_PAYLOAD_SIZE 128 188 struct acoustic_data { 189 unsigned char len; 190 unsigned char id; 191 unsigned char addr; 192 unsigned char book; 193 unsigned char page; 194 unsigned char reg; 195 unsigned char data[TASDEV_DATA_PAYLOAD_SIZE]; 196 }; 197 #endif 198 199 struct tasdevice_priv { 200 struct tasdevice tasdevice[TASDEVICE_MAX_CHANNELS]; 201 struct tasdevice_rca rcabin; 202 struct calidata cali_data; 203 #ifdef CONFIG_SND_SOC_TAS2781_ACOUST_I2C 204 struct acoustic_data acou_data; 205 #endif 206 struct tasdevice_fw *fmw; 207 struct gpio_desc *reset; 208 struct mutex codec_lock; 209 struct regmap *regmap; 210 struct device *dev; 211 212 unsigned char cal_binaryname[TASDEVICE_MAX_CHANNELS][64]; 213 unsigned char crc8_lkp_tbl[CRC8_TABLE_SIZE]; 214 unsigned char coef_binaryname[64]; 215 unsigned char rca_binaryname[64]; 216 unsigned char dev_name[32]; 217 const unsigned char (*dvc_tlv_table)[4]; 218 const char *name_prefix; 219 unsigned char ndev; 220 unsigned int dspbin_typ; 221 unsigned int magic_num; 222 unsigned int chip_id; 223 unsigned int sysclk; 224 int speaker_id; 225 226 int irq; 227 int cur_prog; 228 int cur_conf; 229 int fw_state; 230 int index; 231 void *client; 232 void *codec; 233 bool force_fwload_status; 234 bool playback_started; 235 bool isacpi; 236 bool isspi; 237 unsigned int global_addr; 238 239 int (*fw_parse_variable_header)(struct tasdevice_priv *tas_priv, 240 const struct firmware *fmw, int offset); 241 int (*fw_parse_program_data)(struct tasdevice_priv *tas_priv, 242 struct tasdevice_fw *tas_fmw, 243 const struct firmware *fmw, int offset); 244 int (*fw_parse_configuration_data)(struct tasdevice_priv *tas_priv, 245 struct tasdevice_fw *tas_fmw, 246 const struct firmware *fmw, int offset); 247 int (*fw_parse_fct_param_address)(struct tasdevice_priv *tas_priv, 248 struct tasdevice_fw *tas_fmw, 249 const struct firmware *fmw, int offset); 250 int (*tasdevice_load_block)(struct tasdevice_priv *tas_priv, 251 struct tasdev_blk *block); 252 253 int (*change_chn_book)(struct tasdevice_priv *tas_priv, 254 unsigned short chn, int book); 255 int (*update_bits)(struct tasdevice_priv *tas_priv, 256 unsigned short chn, unsigned int reg, unsigned int mask, 257 unsigned int value); 258 int (*dev_read)(struct tasdevice_priv *tas_priv, 259 unsigned short chn, unsigned int reg, unsigned int *value); 260 int (*dev_bulk_read)(struct tasdevice_priv *tas_priv, 261 unsigned short chn, unsigned int reg, unsigned char *p_data, 262 unsigned int n_length); 263 }; 264 265 int tasdevice_dev_read(struct tasdevice_priv *tas_priv, 266 unsigned short chn, unsigned int reg, unsigned int *value); 267 int tasdevice_dev_bulk_read(struct tasdevice_priv *tas_priv, 268 unsigned short chn, unsigned int reg, unsigned char *p_data, 269 unsigned int n_length); 270 int tasdevice_dev_write(struct tasdevice_priv *tas_priv, 271 unsigned short chn, unsigned int reg, unsigned int value); 272 int tasdevice_dev_bulk_write( 273 struct tasdevice_priv *tas_priv, unsigned short chn, 274 unsigned int reg, unsigned char *p_data, unsigned int n_length); 275 void tasdevice_remove(struct tasdevice_priv *tas_priv); 276 #endif /* __TAS2781_H__ */ 277