1 /* SPDX-License-Identifier: GPL-2.0 */
3 // ALSA SoC Texas Instruments TAS2563/TAS2781 Audio Smart Amplifier
5 // Copyright (C) 2022 - 2024 Texas Instruments Incorporated
8 // The TAS2563/TAS2781 driver implements a flexible and configurable
9 // algo coefficient setting for one, two, or even multiple
10 // TAS2563/TAS2781 chips.
12 // Author: Shenghao Ding <shenghao-ding@ti.com>
13 // Author: Kevin Lu <kevin-lu@ti.com>
19 #include "tas2781-dsp.h"
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 |\
30 #define TASDEVICE_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
31 SNDRV_PCM_FMTBIT_S24_LE | \
32 SNDRV_PCM_FMTBIT_S32_LE)
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) + \
46 #define TASDEVICE_REG_SWRESET TASDEVICE_REG(0x0, 0X0, 0x01)
47 #define TASDEVICE_REG_SWRESET_RESET BIT(0)
50 #define TASDEVICE_I2CChecksum TASDEVICE_REG(0x0, 0x0, 0x7E)
53 #define TASDEVICE_XM_A1_REG TASDEVICE_REG(0x64, 0x63, 0x3c)
55 #define TASDEVICE_XM_A2_REG TASDEVICE_REG(0x64, 0x63, 0x38)
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)
63 #define TAS2563_IDLE TASDEVICE_REG(0x00, 0x00, 0x3e)
64 #define TAS2563_PRM_R0_REG TASDEVICE_REG(0x00, 0x0f, 0x34)
66 #define TAS2563_RUNTIME_RE_REG_TF TASDEVICE_REG(0x64, 0x02, 0x70)
67 #define TAS2563_RUNTIME_RE_REG TASDEVICE_REG(0x64, 0x02, 0x48)
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)
75 #define TAS2563_TE_TA1_REG TASDEVICE_REG(0x00, 0x10, 0x0c)
77 #define TAS2563_TE_TA1_AT_REG TASDEVICE_REG(0x00, 0x10, 0x10)
79 #define TAS2563_TE_TA2_REG TASDEVICE_REG(0x00, 0x0f, 0x64)
81 #define TAS2563_TE_AT_REG TASDEVICE_REG(0x00, 0x0f, 0x68)
83 #define TAS2563_TE_DT_REG TASDEVICE_REG(0x00, 0x0f, 0x70)
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)
98 #define TAS2781_TEST_UNLOCK_REG TASDEVICE_REG(0x00, 0xFD, 0x0D)
99 #define TAS2781_TEST_PAGE_UNLOCK 0x0D
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)
105 #define TASDEVICE_CMD_SING_W 0x1
106 #define TASDEVICE_CMD_BURST 0x2
107 #define TASDEVICE_CMD_DELAY 0x3
108 #define TASDEVICE_CMD_FIELD_W 0x4
115 enum device_catlog_id
{
120 struct bulk_reg_val
{
122 unsigned char val
[4];
123 unsigned char val_len
;
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
;
141 unsigned int r0_low_reg
;
142 unsigned int invr0_reg
;
143 unsigned int pow_reg
;
144 unsigned int tlimit_reg
;
149 unsigned long total_sz
;
150 struct cali_reg cali_reg_array
;
151 unsigned int cali_dat_sz_per_dev
;
154 struct 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
*speaker_id
;
160 struct gpio_desc
*reset
;
161 struct mutex codec_lock
;
162 struct regmap
*regmap
;
166 enum device_catlog_id catlog_id
;
167 unsigned char cal_binaryname
[TASDEVICE_MAX_CHANNELS
][64];
168 unsigned char crc8_lkp_tbl
[CRC8_TABLE_SIZE
];
169 unsigned char coef_binaryname
[64];
170 unsigned char rca_binaryname
[64];
171 unsigned char dev_name
[32];
172 const char *name_prefix
;
174 unsigned int magic_num
;
175 unsigned int chip_id
;
185 bool force_fwload_status
;
186 bool playback_started
;
188 bool is_user_space_calidata
;
189 unsigned int global_addr
;
191 int (*fw_parse_variable_header
)(struct tasdevice_priv
*tas_priv
,
192 const struct firmware
*fmw
, int offset
);
193 int (*fw_parse_program_data
)(struct tasdevice_priv
*tas_priv
,
194 struct tasdevice_fw
*tas_fmw
,
195 const struct firmware
*fmw
, int offset
);
196 int (*fw_parse_configuration_data
)(struct tasdevice_priv
*tas_priv
,
197 struct tasdevice_fw
*tas_fmw
,
198 const struct firmware
*fmw
, int offset
);
199 int (*tasdevice_load_block
)(struct tasdevice_priv
*tas_priv
,
200 struct tasdev_blk
*block
);
202 int (*save_calibration
)(struct tasdevice_priv
*tas_priv
);
203 void (*apply_calibration
)(struct tasdevice_priv
*tas_priv
);
206 void tasdevice_reset(struct tasdevice_priv
*tas_dev
);
207 int tascodec_init(struct tasdevice_priv
*tas_priv
, void *codec
,
208 struct module
*module
,
209 void (*cont
)(const struct firmware
*fw
, void *context
));
210 struct tasdevice_priv
*tasdevice_kzalloc(struct i2c_client
*i2c
);
211 int tasdevice_init(struct tasdevice_priv
*tas_priv
);
212 void tasdevice_remove(struct tasdevice_priv
*tas_priv
);
213 int tasdevice_save_calibration(struct tasdevice_priv
*tas_priv
);
214 void tasdevice_apply_calibration(struct tasdevice_priv
*tas_priv
);
215 int tasdev_chn_switch(struct tasdevice_priv
*tas_priv
,
217 int tasdevice_dev_read(struct tasdevice_priv
*tas_priv
,
218 unsigned short chn
, unsigned int reg
, unsigned int *value
);
219 int tasdevice_dev_write(struct tasdevice_priv
*tas_priv
,
220 unsigned short chn
, unsigned int reg
, unsigned int value
);
221 int tasdevice_dev_bulk_write(
222 struct tasdevice_priv
*tas_priv
, unsigned short chn
,
223 unsigned int reg
, unsigned char *p_data
, unsigned int n_length
);
224 int tasdevice_dev_bulk_read(struct tasdevice_priv
*tas_priv
,
225 unsigned short chn
, unsigned int reg
, unsigned char *p_data
,
226 unsigned int n_length
);
227 int tasdevice_dev_update_bits(
228 struct tasdevice_priv
*tasdevice
, unsigned short chn
,
229 unsigned int reg
, unsigned int mask
, unsigned int value
);
230 int tasdevice_amp_putvol(struct tasdevice_priv
*tas_priv
,
231 struct snd_ctl_elem_value
*ucontrol
, struct soc_mixer_control
*mc
);
232 int tasdevice_amp_getvol(struct tasdevice_priv
*tas_priv
,
233 struct snd_ctl_elem_value
*ucontrol
, struct soc_mixer_control
*mc
);
234 int tasdevice_digital_putvol(struct tasdevice_priv
*tas_priv
,
235 struct snd_ctl_elem_value
*ucontrol
, struct soc_mixer_control
*mc
);
236 int tasdevice_digital_getvol(struct tasdevice_priv
*tas_priv
,
237 struct snd_ctl_elem_value
*ucontrol
, struct soc_mixer_control
*mc
);
239 #endif /* __TAS2781_H__ */