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)
103int32_t tas25xx_register_misc(struct sdw_slave *peripheral);
104int32_t tas25xx_deregister_misc(void);
105#else
106static void tas25xx_register_misc(struct sdw_slave *peripheral) {}
107static void tas25xx_deregister_misc(void) {}
108#endif
109
110#endif /*__TAS2783_H__ */
111

source code of linux/sound/soc/codecs/tas2783.h