summaryrefslogtreecommitdiff
path: root/sound/soc/codecs/tas675x.h
blob: db29bb37733625b6211b6cd34d68eca920e3de1f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * ALSA SoC Texas Instruments TAS675x Quad-Channel Audio Amplifier
 *
 * Copyright (C) 2026 Texas Instruments Incorporated - https://www.ti.com/
 *	Author: Sen Wang <sen@ti.com>
 */

#ifndef __TAS675X_H__
#define __TAS675X_H__

/*
 * Book 0, Page 0 — Register Addresses
 */

#define TAS675X_PAGE_SIZE                    256
#define TAS675X_PAGE_REG(page, reg)  ((page) * TAS675X_PAGE_SIZE + (reg))

/* Page Control & Basic Config */
#define TAS675X_PAGE_CTRL_REG                0x00
#define TAS675X_RESET_REG                    0x01
#define TAS675X_OUTPUT_CTRL_REG              0x02
#define TAS675X_STATE_CTRL_CH1_CH2_REG       0x03
#define TAS675X_STATE_CTRL_CH3_CH4_REG       0x04
#define TAS675X_ISENSE_CTRL_REG              0x05
#define TAS675X_DC_DETECT_CTRL_REG           0x06

/* Serial Audio Port */
#define TAS675X_SCLK_INV_CTRL_REG            0x20
#define TAS675X_AUDIO_IF_CTRL_REG            0x21
#define TAS675X_SDIN_CTRL_REG                0x23
#define TAS675X_SDOUT_CTRL_REG               0x25
#define TAS675X_SDIN_OFFSET_MSB_REG          0x27
#define TAS675X_SDIN_AUDIO_OFFSET_REG        0x28
#define TAS675X_SDIN_LL_OFFSET_REG           0x29
#define TAS675X_SDIN_CH_SWAP_REG             0x2A
#define TAS675X_SDOUT_OFFSET_MSB_REG         0x2C
#define TAS675X_VPREDICT_OFFSET_REG          0x2D
#define TAS675X_ISENSE_OFFSET_REG            0x2E
#define TAS675X_SDOUT_EN_REG                 0x31
#define TAS675X_LL_EN_REG                    0x32

/* DSP & Core Audio Control */
#define TAS675X_RTLDG_EN_REG                 0x37
#define TAS675X_DC_BLOCK_BYP_REG             0x39
#define TAS675X_DSP_CTRL_REG                 0x3A
#define TAS675X_PAGE_AUTO_INC_REG            0x3B

/* Volume & Mute */
#define TAS675X_DIG_VOL_CH1_REG              0x40
#define TAS675X_DIG_VOL_CH2_REG              0x41
#define TAS675X_DIG_VOL_CH3_REG              0x42
#define TAS675X_DIG_VOL_CH4_REG              0x43
#define TAS675X_DIG_VOL_RAMP_CTRL_REG        0x44
#define TAS675X_DIG_VOL_COMBINE_CTRL_REG     0x46
#define TAS675X_AUTO_MUTE_EN_REG             0x47
#define TAS675X_AUTO_MUTE_TIMING_CH1_CH2_REG 0x48
#define TAS675X_AUTO_MUTE_TIMING_CH3_CH4_REG 0x49

/* Analog Gain & Power Stage */
#define TAS675X_ANALOG_GAIN_CH1_CH2_REG      0x4A
#define TAS675X_ANALOG_GAIN_CH3_CH4_REG      0x4B
#define TAS675X_ANALOG_GAIN_RAMP_CTRL_REG    0x4E
#define TAS675X_PULSE_INJECTION_EN_REG       0x52
#define TAS675X_CBC_CTRL_REG                 0x54
#define TAS675X_CURRENT_LIMIT_CTRL_REG       0x55
#define TAS675X_DAC_CLK_REG                  0x5A
#define TAS675X_ISENSE_CAL_REG               0x5B

/* Spread Spectrum & PWM Phase */
#define TAS675X_PWM_PHASE_CTRL_REG           0x60
#define TAS675X_SS_CTRL_REG                  0x61
#define TAS675X_SS_RANGE_CTRL_REG            0x62
#define TAS675X_SS_DWELL_CTRL_REG            0x66
#define TAS675X_RAMP_PHASE_CTRL_GPO_REG      0x68
#define TAS675X_PWM_PHASE_M_CTRL_CH1_REG     0x69
#define TAS675X_PWM_PHASE_M_CTRL_CH2_REG     0x6A
#define TAS675X_PWM_PHASE_M_CTRL_CH3_REG     0x6B
#define TAS675X_PWM_PHASE_M_CTRL_CH4_REG     0x6C

/* Status & Reporting */
#define TAS675X_AUTO_MUTE_STATUS_REG         0x71
#define TAS675X_STATE_REPORT_CH1_CH2_REG     0x72
#define TAS675X_STATE_REPORT_CH3_CH4_REG     0x73
#define TAS675X_PVDD_SENSE_REG               0x74
#define TAS675X_TEMP_GLOBAL_REG              0x75
#define TAS675X_FS_MON_REG                   0x76
#define TAS675X_SCLK_MON_REG                 0x77
#define TAS675X_REPORT_ROUTING_1_REG         0x7C

/* Memory Paging & Book Control */
#define TAS675X_SETUP_REG1                   0x7D
#define TAS675X_SETUP_REG2                   0x7E
#define TAS675X_BOOK_CTRL_REG                0x7F

/* Fault Status */
#define TAS675X_POWER_FAULT_STATUS_1_REG     0x7D
#define TAS675X_POWER_FAULT_STATUS_2_REG     0x80
#define TAS675X_OT_FAULT_REG                 0x81
#define TAS675X_OTW_STATUS_REG               0x82
#define TAS675X_CLIP_WARN_STATUS_REG         0x83
#define TAS675X_CBC_WARNING_STATUS_REG       0x85

/* Latched Fault Registers */
#define TAS675X_POWER_FAULT_LATCHED_REG      0x86
#define TAS675X_OTSD_LATCHED_REG             0x87
#define TAS675X_OTW_LATCHED_REG              0x88
#define TAS675X_CLIP_WARN_LATCHED_REG        0x89
#define TAS675X_CLK_FAULT_LATCHED_REG        0x8A
#define TAS675X_RTLDG_OL_SL_FAULT_LATCHED_REG 0x8B
#define TAS675X_CBC_FAULT_WARN_LATCHED_REG   0x8D
#define TAS675X_OC_DC_FAULT_LATCHED_REG      0x8E
#define TAS675X_OTSD_RECOVERY_EN_REG         0x8F

/* Protection & Routing Controls */
#define TAS675X_REPORT_ROUTING_2_REG         0x90
#define TAS675X_REPORT_ROUTING_3_REG         0x91
#define TAS675X_REPORT_ROUTING_4_REG         0x92
#define TAS675X_CLIP_DETECT_CTRL_REG         0x93
#define TAS675X_REPORT_ROUTING_5_REG         0x94

/* GPIO Pin Configuration */
#define TAS675X_GPIO1_OUTPUT_SEL_REG         0x95
#define TAS675X_GPIO2_OUTPUT_SEL_REG         0x96
#define TAS675X_GPIO_INPUT_SLEEP_HIZ_REG     0x9B
#define TAS675X_GPIO_INPUT_PLAY_SLEEP_REG    0x9C
#define TAS675X_GPIO_INPUT_MUTE_REG          0x9D
#define TAS675X_GPIO_INPUT_SYNC_REG          0x9E
#define TAS675X_GPIO_INPUT_SDIN2_REG         0x9F
#define TAS675X_GPIO_CTRL_REG                0xA0
#define TAS675X_GPIO_INVERT_REG              0xA1

/* Load Diagnostics Config */
#define TAS675X_DC_LDG_CTRL_REG              0xB0
#define TAS675X_DC_LDG_LO_CTRL_REG           0xB1
#define TAS675X_DC_LDG_TIME_CTRL_REG         0xB2
#define TAS675X_DC_LDG_SL_CH1_CH2_CTRL_REG   0xB3
#define TAS675X_DC_LDG_SL_CH3_CH4_CTRL_REG   0xB4
#define TAS675X_AC_LDG_CTRL_REG              0xB5
#define TAS675X_TWEETER_DETECT_CTRL_REG      0xB6
#define TAS675X_TWEETER_DETECT_THRESH_REG    0xB7
#define TAS675X_AC_LDG_FREQ_CTRL_REG         0xB8
#define TAS675X_TEMP_CH1_CH2_REG             0xBB
#define TAS675X_TEMP_CH3_CH4_REG             0xBC
#define TAS675X_WARN_OT_MAX_FLAG_REG         0xBD

/* DC Load Diagnostic Reports */
#define TAS675X_DC_LDG_REPORT_CH1_CH2_REG    0xC0
#define TAS675X_DC_LDG_REPORT_CH3_CH4_REG    0xC1
#define TAS675X_DC_LDG_RESULT_REG            0xC2
#define TAS675X_AC_LDG_REPORT_CH1_R_REG      0xC3
#define TAS675X_AC_LDG_REPORT_CH1_I_REG      0xC4
#define TAS675X_AC_LDG_REPORT_CH2_R_REG      0xC5
#define TAS675X_AC_LDG_REPORT_CH2_I_REG      0xC6
#define TAS675X_AC_LDG_REPORT_CH3_R_REG      0xC7
#define TAS675X_AC_LDG_REPORT_CH3_I_REG      0xC8
#define TAS675X_AC_LDG_REPORT_CH4_R_REG      0xC9
#define TAS675X_AC_LDG_REPORT_CH4_I_REG      0xCA
#define TAS675X_TWEETER_REPORT_REG           0xCB

/* RTLDG Impedance */
#define TAS675X_CH1_RTLDG_IMP_MSB_REG        0xD1
#define TAS675X_CH1_RTLDG_IMP_LSB_REG        0xD2
#define TAS675X_CH2_RTLDG_IMP_MSB_REG        0xD3
#define TAS675X_CH2_RTLDG_IMP_LSB_REG        0xD4
#define TAS675X_CH3_RTLDG_IMP_MSB_REG        0xD5
#define TAS675X_CH3_RTLDG_IMP_LSB_REG        0xD6
#define TAS675X_CH4_RTLDG_IMP_MSB_REG        0xD7
#define TAS675X_CH4_RTLDG_IMP_LSB_REG        0xD8

/* DC Load Diagnostic Resistance */
#define TAS675X_DC_LDG_DCR_MSB_REG           0xD9
#define TAS675X_CH1_DC_LDG_DCR_LSB_REG       0xDA
#define TAS675X_CH2_DC_LDG_DCR_LSB_REG       0xDB
#define TAS675X_CH3_DC_LDG_DCR_LSB_REG       0xDC
#define TAS675X_CH4_DC_LDG_DCR_LSB_REG       0xDD

/* Over-Temperature Warning */
#define TAS675X_OTW_CTRL_CH1_CH2_REG         0xE2
#define TAS675X_OTW_CTRL_CH3_CH4_REG         0xE3

/* RESET_REG (all bits auto-clear) */
#define TAS675X_DEVICE_RESET                 BIT(4)
#define TAS675X_FAULT_CLEAR                  BIT(3)
#define TAS675X_REGISTER_RESET               BIT(0)

/* STATE_CTRL and STATE_REPORT — Channel state values */
#define TAS675X_STATE_DEEPSLEEP              0x00
#define TAS675X_STATE_LOAD_DIAG              0x01
#define TAS675X_STATE_SLEEP                  0x02
#define TAS675X_STATE_HIZ                    0x03
#define TAS675X_STATE_PLAY                   0x04

/* Additional STATE_REPORT values */
#define TAS675X_STATE_FAULT                  0x05
#define TAS675X_STATE_AUTOREC                0x06

/* Combined values for both channel pairs in one register */
#define TAS675X_STATE_DEEPSLEEP_BOTH \
	(TAS675X_STATE_DEEPSLEEP | (TAS675X_STATE_DEEPSLEEP << 4))
#define TAS675X_STATE_LOAD_DIAG_BOTH \
	(TAS675X_STATE_LOAD_DIAG | (TAS675X_STATE_LOAD_DIAG << 4))
#define TAS675X_STATE_SLEEP_BOTH \
	(TAS675X_STATE_SLEEP | (TAS675X_STATE_SLEEP << 4))
#define TAS675X_STATE_HIZ_BOTH \
	(TAS675X_STATE_HIZ | (TAS675X_STATE_HIZ << 4))
#define TAS675X_STATE_PLAY_BOTH \
	(TAS675X_STATE_PLAY | (TAS675X_STATE_PLAY << 4))
#define TAS675X_STATE_FAULT_BOTH \
	(TAS675X_STATE_FAULT | (TAS675X_STATE_FAULT << 4))

/* STATE_CTRL_CH1_CH2 / STATE_CTRL_CH3_CH4 — mute bits */
#define TAS675X_CH1_MUTE_BIT                 BIT(7)
#define TAS675X_CH2_MUTE_BIT                 BIT(3)
#define TAS675X_CH_MUTE_BOTH                 (TAS675X_CH1_MUTE_BIT | TAS675X_CH2_MUTE_BIT)

/* SCLK_INV_CTRL_REG */
#define TAS675X_SCLK_INV_TX_BIT             BIT(5)
#define TAS675X_SCLK_INV_RX_BIT             BIT(4)
#define TAS675X_SCLK_INV_MASK               (TAS675X_SCLK_INV_TX_BIT | TAS675X_SCLK_INV_RX_BIT)

/* AUDIO_IF_CTRL_REG */
#define TAS675X_TDM_EN_BIT                   BIT(4)
#define TAS675X_SAP_FMT_MASK                 GENMASK(3, 2)
#define TAS675X_SAP_FMT_I2S                  (0x00 << 2)
#define TAS675X_SAP_FMT_TDM                  (0x01 << 2)
#define TAS675X_SAP_FMT_RIGHT_J              (0x02 << 2)
#define TAS675X_SAP_FMT_LEFT_J               (0x03 << 2)
#define TAS675X_FS_PULSE_MASK                GENMASK(1, 0)
#define TAS675X_FS_PULSE_SHORT               0x01

/* SDIN_CTRL_REG */
#define TAS675X_SDIN_AUDIO_WL_MASK           GENMASK(3, 2)
#define TAS675X_SDIN_LL_WL_MASK              GENMASK(1, 0)
#define TAS675X_SDIN_WL_MASK                 (TAS675X_SDIN_AUDIO_WL_MASK | TAS675X_SDIN_LL_WL_MASK)

/* SDOUT_CTRL_REG */
#define TAS675X_SDOUT_SELECT_MASK            GENMASK(7, 4)
#define TAS675X_SDOUT_SELECT_TDM_SDOUT1      0x00
#define TAS675X_SDOUT_SELECT_NON_TDM         0x10
#define TAS675X_SDOUT_VP_WL_MASK             GENMASK(3, 2)
#define TAS675X_SDOUT_IS_WL_MASK             GENMASK(1, 0)
#define TAS675X_SDOUT_WL_MASK                (TAS675X_SDOUT_VP_WL_MASK | TAS675X_SDOUT_IS_WL_MASK)

/* SDOUT_EN_REG */
#define TAS675X_SDOUT_NON_TDM_SEL_MASK      GENMASK(5, 4)
#define TAS675X_SDOUT_NON_TDM_SEL_VPREDICT  (0x0 << 4)
#define TAS675X_SDOUT_NON_TDM_SEL_ISENSE    (0x1 << 4)
#define TAS675X_SDOUT_EN_VPREDICT           BIT(0)
#define TAS675X_SDOUT_EN_ISENSE             BIT(1)
#define TAS675X_SDOUT_EN_NON_TDM_ALL        GENMASK(1, 0)

/* Word length values (shared by SDIN_CTRL and SDOUT_CTRL) */
#define TAS675X_WL_16BIT                     0x00
#define TAS675X_WL_20BIT                     0x01
#define TAS675X_WL_24BIT                     0x02
#define TAS675X_WL_32BIT                     0x03

/* SDIN_OFFSET_MSB_REG */
#define TAS675X_SDIN_AUDIO_OFF_MSB_MASK      GENMASK(7, 6)
#define TAS675X_SDIN_LL_OFF_MSB_MASK         GENMASK(5, 4)

/* SDOUT_OFFSET_MSB_REG */
#define TAS675X_SDOUT_VP_OFF_MSB_MASK        GENMASK(7, 6)
#define TAS675X_SDOUT_IS_OFF_MSB_MASK        GENMASK(5, 4)

/* RTLDG_EN_REG */
#define TAS675X_RTLDG_CLIP_MASK_BIT          BIT(4)
#define TAS675X_RTLDG_CH_EN_MASK             GENMASK(3, 0)

/* DC_LDG_CTRL_REG */
#define TAS675X_LDG_ABORT_BIT                BIT(7)
#define TAS675X_LDG_BUFFER_WAIT_MASK         GENMASK(6, 5)
#define TAS675X_LDG_WAIT_BYPASS_BIT          BIT(2)
#define TAS675X_SLOL_DISABLE_BIT             BIT(1)
#define TAS675X_LDG_BYPASS_BIT               BIT(0)

/* DC_LDG_TIME_CTRL_REG */
#define TAS675X_LDG_RAMP_SLOL_MASK           GENMASK(7, 6)
#define TAS675X_LDG_SETTLING_SLOL_MASK       GENMASK(5, 4)
#define TAS675X_LDG_RAMP_S2PG_MASK           GENMASK(3, 2)
#define TAS675X_LDG_SETTLING_S2PG_MASK       GENMASK(1, 0)

/* AC_LDG_CTRL_REG */
#define TAS675X_AC_DIAG_GAIN_BIT             BIT(4)
#define TAS675X_AC_DIAG_START_MASK           GENMASK(3, 0)

/* DC_LDG_RESULT_REG */
#define TAS675X_DC_LDG_LO_RESULT_MASK        GENMASK(7, 4)
#define TAS675X_DC_LDG_PASS_MASK             GENMASK(3, 0)

/* Load Diagnostics Timing Constants */
#define TAS675X_POLL_INTERVAL_US             10000
#define TAS675X_STATE_TRANSITION_TIMEOUT_US  50000
#define TAS675X_DC_LDG_TIMEOUT_US            300000
#define TAS675X_AC_LDG_TIMEOUT_US            400000

/* GPIO_CTRL_REG */
#define TAS675X_GPIO1_OUTPUT_EN              BIT(7)
#define TAS675X_GPIO2_OUTPUT_EN              BIT(6)
#define TAS675X_GPIO_CTRL_RSTVAL             0x22

/* GPIO output select values */
#define TAS675X_GPIO_SEL_LOW                 0x00
#define TAS675X_GPIO_SEL_AUTO_MUTE_ALL       0x02
#define TAS675X_GPIO_SEL_AUTO_MUTE_CH4       0x03
#define TAS675X_GPIO_SEL_AUTO_MUTE_CH3       0x04
#define TAS675X_GPIO_SEL_AUTO_MUTE_CH2       0x05
#define TAS675X_GPIO_SEL_AUTO_MUTE_CH1       0x06
#define TAS675X_GPIO_SEL_SDOUT2              0x08
#define TAS675X_GPIO_SEL_SDOUT1              0x09
#define TAS675X_GPIO_SEL_WARN                0x0A
#define TAS675X_GPIO_SEL_FAULT               0x0B
#define TAS675X_GPIO_SEL_CLOCK_SYNC          0x0E
#define TAS675X_GPIO_SEL_INVALID_CLK         0x0F
#define TAS675X_GPIO_SEL_HIGH                0x13

/* GPIO input function encoding (flag bit | function ID) */
#define TAS675X_GPIO_FUNC_INPUT              0x100

/* Input Function IDs */
#define TAS675X_GPIO_IN_ID_MUTE              0
#define TAS675X_GPIO_IN_ID_PHASE_SYNC        1
#define TAS675X_GPIO_IN_ID_SDIN2             2
#define TAS675X_GPIO_IN_ID_DEEP_SLEEP        3
#define TAS675X_GPIO_IN_ID_HIZ               4
#define TAS675X_GPIO_IN_ID_PLAY              5
#define TAS675X_GPIO_IN_ID_SLEEP             6
#define TAS675X_GPIO_IN_NUM                  7

#define TAS675X_GPIO_IN_MUTE                 (TAS675X_GPIO_FUNC_INPUT | TAS675X_GPIO_IN_ID_MUTE)
#define TAS675X_GPIO_IN_PHASE_SYNC \
	(TAS675X_GPIO_FUNC_INPUT | TAS675X_GPIO_IN_ID_PHASE_SYNC)
#define TAS675X_GPIO_IN_SDIN2                (TAS675X_GPIO_FUNC_INPUT | TAS675X_GPIO_IN_ID_SDIN2)
#define TAS675X_GPIO_IN_DEEP_SLEEP \
	(TAS675X_GPIO_FUNC_INPUT | TAS675X_GPIO_IN_ID_DEEP_SLEEP)
#define TAS675X_GPIO_IN_HIZ                  (TAS675X_GPIO_FUNC_INPUT | TAS675X_GPIO_IN_ID_HIZ)
#define TAS675X_GPIO_IN_PLAY                 (TAS675X_GPIO_FUNC_INPUT | TAS675X_GPIO_IN_ID_PLAY)
#define TAS675X_GPIO_IN_SLEEP                (TAS675X_GPIO_FUNC_INPUT | TAS675X_GPIO_IN_ID_SLEEP)

/* GPIO input 3-bit mux field masks */
#define TAS675X_GPIO_IN_MUTE_MASK            GENMASK(2, 0)
#define TAS675X_GPIO_IN_SYNC_MASK            GENMASK(2, 0)
#define TAS675X_GPIO_IN_SDIN2_MASK           GENMASK(6, 4)
#define TAS675X_GPIO_IN_DEEP_SLEEP_MASK      GENMASK(6, 4)
#define TAS675X_GPIO_IN_HIZ_MASK             GENMASK(2, 0)
#define TAS675X_GPIO_IN_PLAY_MASK            GENMASK(6, 4)
#define TAS675X_GPIO_IN_SLEEP_MASK           GENMASK(2, 0)

/* Book addresses for tas675x_select_book() */
#define TAS675X_BOOK_DEFAULT                 0x00
#define TAS675X_BOOK_DSP                     0x8C

/* DSP memory addresses (DSP Book) */
#define TAS675X_DSP_PAGE_RTLDG               0x22
#define TAS675X_DSP_RTLDG_OL_THRESH_REG      0x98
#define TAS675X_DSP_RTLDG_SL_THRESH_REG      0x9C

#define TAS675X_DSP_PARAM_ID_OL_THRESH       0
#define TAS675X_DSP_PARAM_ID_SL_THRESH       1

/* Setup Mode Entry/Exit*/
#define TAS675X_SETUP_ENTER_VAL1             0x11
#define TAS675X_SETUP_ENTER_VAL2             0xFF
#define TAS675X_SETUP_EXIT_VAL               0x00

#endif /* __TAS675X_H__ */