root/sound/soc/codecs/tas675x.h
/* 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__ */