xref: /linux/sound/soc/codecs/tas2783.h (revision 68a052239fc4b351e961f698b824f7654a346091)
1 /* SPDX-License-Identifier: GPL-2.0
2  *
3  * ALSA SoC Texas Instruments TAS2783 Audio Smart Amplifier
4  *
5  * Copyright (C) 2025 Texas Instruments Incorporated
6  * https://www.ti.com
7  *
8  * The TAS2783 driver implements a flexible and configurable
9  * algo coefficient setting for single TAS2783 chips.
10  *
11  * Author: Niranjan H Y <niranjanhy@ti.com>
12  * Author: Baojun Xu <baojun.xu@ti.com>
13  */
14 #include <linux/workqueue.h>
15 
16 #ifndef __TAS2783_H__
17 #define __TAS2783_H__
18 
19 #define TAS2783_DEVICE_RATES	(SNDRV_PCM_RATE_44100 | \
20 				SNDRV_PCM_RATE_48000 | \
21 				SNDRV_PCM_RATE_96000 | \
22 				SNDRV_PCM_RATE_88200)
23 #define TAS2783_DEVICE_FORMATS	(SNDRV_PCM_FMTBIT_S16_LE | \
24 				SNDRV_PCM_FMTBIT_S24_LE | \
25 				SNDRV_PCM_FMTBIT_S32_LE)
26 
27 /* book, page, register */
28 #define TASDEV_REG_SDW(book, page, reg)	(((book) * 256 * 128) + \
29 		0x800000 + ((page) * 128) + (reg))
30 
31 /* Volume control */
32 #define TAS2783_DVC_LVL		TASDEV_REG_SDW(0x0, 0x00, 0x1A)
33 #define TAS2783_AMP_LEVEL	TASDEV_REG_SDW(0x0, 0x00, 0x03)
34 #define TAS2783_AMP_LEVEL_MASK	GENMASK(5, 1)
35 
36 #define PRAM_ADDR_START		TASDEV_REG_SDW(0x8c, 0x01, 0x8)
37 #define PRAM_ADDR_END		TASDEV_REG_SDW(0x8c, 0xff, 0x7f)
38 #define YRAM_ADDR_START		TASDEV_REG_SDW(0x00, 0x02, 0x8)
39 #define YRAM_ADDR_END		TASDEV_REG_SDW(0x00, 0x37, 0x7f)
40 
41 /* Calibration data */
42 #define TAS2783_CAL_R0		TASDEV_REG_SDW(0, 0x16, 0x4C)
43 #define TAS2783_CAL_INVR0	TASDEV_REG_SDW(0, 0x16, 0x5C)
44 #define TAS2783_CAL_R0LOW	TASDEV_REG_SDW(0, 0x16, 0x64)
45 #define TAS2783_CAL_POWER	TASDEV_REG_SDW(0, 0x15, 0x44)
46 #define TAS2783_CAL_TLIM	TASDEV_REG_SDW(0, 0x17, 0x58)
47 
48 /* TAS2783 SDCA Control - function number */
49 #define FUNC_NUM_SMART_AMP	0x01
50 
51 /* TAS2783 SDCA entity */
52 
53 #define TAS2783_SDCA_ENT_FU21		0x01
54 #define TAS2783_SDCA_ENT_FU23		0x02
55 #define TAS2783_SDCA_ENT_FU26		0x03
56 #define TAS2783_SDCA_ENT_XU22		0x04
57 #define TAS2783_SDCA_ENT_CS24		0x05
58 #define TAS2783_SDCA_ENT_CS21		0x06
59 #define TAS2783_SDCA_ENT_CS25		0x07
60 #define TAS2783_SDCA_ENT_CS26		0x08
61 #define TAS2783_SDCA_ENT_CS28		0x09
62 #define TAS2783_SDCA_ENT_PDE23		0x0C
63 #define TAS2783_SDCA_ENT_UDMPU23	0x0E
64 #define TAS2783_SDCA_ENT_SAPU29		0x0F
65 #define TAS2783_SDCA_ENT_PPU21		0x10
66 #define TAS2783_SDCA_ENT_PPU26		0x11
67 #define TAS2783_SDCA_ENT_TG23		0x12
68 #define TAS2783_SDCA_ENT_IT21		0x13
69 #define TAS2783_SDCA_ENT_IT29		0x14
70 #define TAS2783_SDCA_ENT_IT26		0x15
71 #define TAS2783_SDCA_ENT_IT28		0x16
72 #define TAS2783_SDCA_ENT_OT24		0x17
73 #define TAS2783_SDCA_ENT_OT23		0x18
74 #define TAS2783_SDCA_ENT_OT25		0x19
75 #define TAS2783_SDCA_ENT_OT28		0x1A
76 #define TAS2783_SDCA_ENT_MU26		0x1b
77 #define TAS2783_SDCA_ENT_OT127		0x1E
78 #define TAS2783_SDCA_ENT_FU127		0x1F
79 #define TAS2783_SDCA_ENT_CS127		0x20
80 #define TAS2783_SDCA_ENT_MFPU21		0x22
81 #define TAS2783_SDCA_ENT_MFPU26		0x23
82 
83 /* TAS2783 SDCA control */
84 #define TAS2783_SDCA_CTL_REQ_POW_STATE	0x01
85 #define TAS2783_SDCA_CTL_FU_MUTE	0x01
86 #define TAS2783_SDCA_CTL_UDMPU_CLUSTER	0x10
87 
88 #define TAS2783_DEVICE_CHANNEL_LEFT	1
89 #define TAS2783_DEVICE_CHANNEL_RIGHT	2
90 
91 #define TAS2783_SDCA_POW_STATE_ON 0
92 #define TAS2783_SDCA_POW_STATE_OFF 3
93 
94 /* calibration data */
95 #define TAS2783_CALIB_PARAMS	6 /* 5 + 1 unique id */
96 #define TAS2783_CALIB_MAX_SPK_COUNT	8
97 #define TAS2783_CALIB_HDR_SZ	12
98 #define TAS2783_CALIB_CRC_SZ	4
99 #define TAS2783_CALIB_DATA_SZ	((TAS2783_CALIB_HDR_SZ) + TAS2783_CALIB_CRC_SZ + \
100 				((TAS2783_CALIB_PARAMS) * 4 * (TAS2783_CALIB_MAX_SPK_COUNT)))
101 
102 #if IS_ENABLED(CONFIG_SND_SOC_TAS2783_UTIL)
103 int32_t tas25xx_register_misc(struct sdw_slave *peripheral);
104 int32_t tas25xx_deregister_misc(void);
105 #else
106 static void tas25xx_register_misc(struct sdw_slave *peripheral) {}
107 static void tas25xx_deregister_misc(void) {}
108 #endif
109 
110 #endif /*__TAS2783_H__ */
111