brintos

brintos / linux-shallow public Read only

0
0
Text · 8.0 KiB · 8cd6da0 Raw
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