1 /* SPDX-License-Identifier: GPL-2.0 */ 2 // 3 // ALSA SoC Texas Instruments TAS2563/TAS2781 Audio Smart Amplifier 4 // 5 // Copyright (C) 2022 - 2024 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 // 15 16 #ifndef __TAS2781_H__ 17 #define __TAS2781_H__ 18 19 #include "tas2781-dsp.h" 20 21 /* version number */ 22 #define TAS2781_DRV_VER 1 23 #define SMARTAMP_MODULE_NAME "tas2781" 24 #define TAS2781_GLOBAL_ADDR 0x40 25 #define TAS2563_GLOBAL_ADDR 0x48 26 #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 0x00 36 #define TASDEVICE_BOOKCTL_PAGE 0x00 37 #define TASDEVICE_BOOKCTL_REG 127 38 #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 /* Volume control */ 53 #define TAS2563_DVC_LVL TASDEVICE_REG(0x00, 0x02, 0x0C) 54 #define TAS2781_DVC_LVL TASDEVICE_REG(0x0, 0x0, 0x1A) 55 #define TAS2781_AMP_LEVEL TASDEVICE_REG(0x0, 0x0, 0x03) 56 #define TAS2781_AMP_LEVEL_MASK GENMASK(5, 1) 57 58 #define TASDEVICE_CMD_SING_W 0x1 59 #define TASDEVICE_CMD_BURST 0x2 60 #define TASDEVICE_CMD_DELAY 0x3 61 #define TASDEVICE_CMD_FIELD_W 0x4 62 63 enum audio_device { 64 TAS2563, 65 TAS2781, 66 }; 67 68 enum device_catlog_id { 69 LENOVO = 0, 70 OTHERS 71 }; 72 73 struct tasdevice { 74 struct tasdevice_fw *cali_data_fmw; 75 unsigned int dev_addr; 76 unsigned int err_code; 77 unsigned char cur_book; 78 short cur_prog; 79 short cur_conf; 80 bool is_loading; 81 bool is_loaderr; 82 }; 83 84 struct tasdevice_irqinfo { 85 int irq_gpio; 86 int irq; 87 }; 88 89 struct calidata { 90 unsigned char *data; 91 unsigned long total_sz; 92 }; 93 94 struct tasdevice_priv { 95 struct tasdevice tasdevice[TASDEVICE_MAX_CHANNELS]; 96 struct tasdevice_irqinfo irq_info; 97 struct tasdevice_rca rcabin; 98 struct calidata cali_data; 99 struct tasdevice_fw *fmw; 100 struct gpio_desc *reset; 101 struct mutex codec_lock; 102 struct regmap *regmap; 103 struct device *dev; 104 struct tm tm; 105 106 enum device_catlog_id catlog_id; 107 unsigned char cal_binaryname[TASDEVICE_MAX_CHANNELS][64]; 108 unsigned char crc8_lkp_tbl[CRC8_TABLE_SIZE]; 109 unsigned char coef_binaryname[64]; 110 unsigned char rca_binaryname[64]; 111 unsigned char dev_name[32]; 112 const char *name_prefix; 113 unsigned char ndev; 114 unsigned int magic_num; 115 unsigned int chip_id; 116 unsigned int sysclk; 117 118 int cur_prog; 119 int cur_conf; 120 int fw_state; 121 int index; 122 void *client; 123 void *codec; 124 bool force_fwload_status; 125 bool playback_started; 126 bool isacpi; 127 unsigned int global_addr; 128 129 int (*fw_parse_variable_header)(struct tasdevice_priv *tas_priv, 130 const struct firmware *fmw, int offset); 131 int (*fw_parse_program_data)(struct tasdevice_priv *tas_priv, 132 struct tasdevice_fw *tas_fmw, 133 const struct firmware *fmw, int offset); 134 int (*fw_parse_configuration_data)(struct tasdevice_priv *tas_priv, 135 struct tasdevice_fw *tas_fmw, 136 const struct firmware *fmw, int offset); 137 int (*tasdevice_load_block)(struct tasdevice_priv *tas_priv, 138 struct tasdev_blk *block); 139 140 int (*save_calibration)(struct tasdevice_priv *tas_priv); 141 void (*apply_calibration)(struct tasdevice_priv *tas_priv); 142 }; 143 144 void tasdevice_reset(struct tasdevice_priv *tas_dev); 145 int tascodec_init(struct tasdevice_priv *tas_priv, void *codec, 146 struct module *module, 147 void (*cont)(const struct firmware *fw, void *context)); 148 struct tasdevice_priv *tasdevice_kzalloc(struct i2c_client *i2c); 149 int tasdevice_init(struct tasdevice_priv *tas_priv); 150 void tasdevice_remove(struct tasdevice_priv *tas_priv); 151 int tasdevice_save_calibration(struct tasdevice_priv *tas_priv); 152 void tasdevice_apply_calibration(struct tasdevice_priv *tas_priv); 153 int tasdevice_dev_read(struct tasdevice_priv *tas_priv, 154 unsigned short chn, unsigned int reg, unsigned int *value); 155 int tasdevice_dev_write(struct tasdevice_priv *tas_priv, 156 unsigned short chn, unsigned int reg, unsigned int value); 157 int tasdevice_dev_bulk_write( 158 struct tasdevice_priv *tas_priv, unsigned short chn, 159 unsigned int reg, unsigned char *p_data, unsigned int n_length); 160 int tasdevice_dev_bulk_read(struct tasdevice_priv *tas_priv, 161 unsigned short chn, unsigned int reg, unsigned char *p_data, 162 unsigned int n_length); 163 int tasdevice_dev_update_bits( 164 struct tasdevice_priv *tasdevice, unsigned short chn, 165 unsigned int reg, unsigned int mask, unsigned int value); 166 int tasdevice_amp_putvol(struct tasdevice_priv *tas_priv, 167 struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc); 168 int tasdevice_amp_getvol(struct tasdevice_priv *tas_priv, 169 struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc); 170 int tasdevice_digital_putvol(struct tasdevice_priv *tas_priv, 171 struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc); 172 int tasdevice_digital_getvol(struct tasdevice_priv *tas_priv, 173 struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc); 174 175 #endif /* __TAS2781_H__ */ 176