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