| /* SPDX-License-Identifier: GPL-2.0-only */ | |
| /* | |
| * rt1318.h -- Platform data for RT1318 | |
| * | |
| * Copyright 2024 Realtek Semiconductor Corp. | |
| */ | |
| #include <sound/rt1318.h> | |
| #ifndef __RT1318_H__ | |
| #define __RT1318_H__ | |
| struct rt1318_priv { | |
| struct snd_soc_component *component; | |
| struct rt1318_platform_data pdata; | |
| struct work_struct cali_work; | |
| struct regmap *regmap; | |
| unsigned int r0_l_integer; | |
| unsigned int r0_l_factor; | |
| unsigned int r0_r_integer; | |
| unsigned int r0_r_factor; | |
| int rt1318_init; | |
| int rt1318_dvol; | |
| int sysclk_src; | |
| int sysclk; | |
| int lrck; | |
| int bclk; | |
| int master; | |
| int pll_src; | |
| int pll_in; | |
| int pll_out; | |
| }; | |
| #define RT1318_PLL_INP_MAX 40000000 | |
| #define RT1318_PLL_INP_MIN 256000 | |
| #define RT1318_PLL_N_MAX 0x1ff | |
| #define RT1318_PLL_K_MAX 0x1f | |
| #define RT1318_PLL_M_MAX 0x1f | |
| #define RT1318_LRCLK_192000 192000 | |
| #define RT1318_LRCLK_96000 96000 | |
| #define RT1318_LRCLK_48000 48000 | |
| #define RT1318_LRCLK_44100 44100 | |
| #define RT1318_LRCLK_16000 16000 | |
| #define RT1318_DVOL_STEP 383 | |
| #define RT1318_CLK1 0xc001 | |
| #define RT1318_CLK2 0xc003 | |
| #define RT1318_CLK3 0xc004 | |
| #define RT1318_CLK4 0xc005 | |
| #define RT1318_CLK5 0xc006 | |
| #define RT1318_CLK6 0xc007 | |
| #define RT1318_CLK7 0xc008 | |
| #define RT1318_PWR_STA1 0xc121 | |
| #define RT1318_SPK_VOL_TH 0xc130 | |
| #define RT1318_TCON 0xc203 | |
| #define RT1318_SRC_TCON 0xc204 | |
| #define RT1318_TCON_RELATE 0xc206 | |
| #define RT1318_DA_VOL_L_8 0xc20b | |
| #define RT1318_DA_VOL_L_1_7 0xc20c | |
| #define RT1318_DA_VOL_R_8 0xc20d | |
| #define RT1318_DA_VOL_R_1_7 0xc20e | |
| #define RT1318_FEEDBACK_PATH 0xc321 | |
| #define RT1318_STP_TEMP_L 0xdb00 | |
| #define RT1318_STP_SEL_L 0xdb08 | |
| #define RT1318_STP_R0_EN_L 0xdb12 | |
| #define RT1318_R0_CMP_L_FLAG 0xdb35 | |
| #define RT1318_PRE_R0_L_24 0xdbb5 | |
| #define RT1318_PRE_R0_L_23_16 0xdbb6 | |
| #define RT1318_PRE_R0_L_15_8 0xdbb7 | |
| #define RT1318_PRE_R0_L_7_0 0xdbb8 | |
| #define RT1318_R0_L_24 0xdbc5 | |
| #define RT1318_R0_L_23_16 0xdbc6 | |
| #define RT1318_R0_L_15_8 0xdbc7 | |
| #define RT1318_R0_L_7_0 0xdbc8 | |
| #define RT1318_STP_SEL_R 0xdd08 | |
| #define RT1318_STP_R0_EN_R 0xdd12 | |
| #define RT1318_R0_CMP_R_FLAG 0xdd35 | |
| #define RT1318_PRE_R0_R_24 0xddb5 | |
| #define RT1318_PRE_R0_R_23_16 0xddb6 | |
| #define RT1318_PRE_R0_R_15_8 0xddb7 | |
| #define RT1318_PRE_R0_R_7_0 0xddb8 | |
| #define RT1318_R0_R_24 0xddc5 | |
| #define RT1318_R0_R_23_16 0xddc6 | |
| #define RT1318_R0_R_15_8 0xddc7 | |
| #define RT1318_R0_R_7_0 0xddc8 | |
| #define RT1318_DEV_ID1 0xf012 | |
| #define RT1318_DEV_ID2 0xf013 | |
| #define RT1318_PLL1_K 0xf20d | |
| #define RT1318_PLL1_M 0xf20f | |
| #define RT1318_PLL1_N_8 0xf211 | |
| #define RT1318_PLL1_N_7_0 0xf212 | |
| #define RT1318_SINE_GEN0 0xf800 | |
| #define RT1318_TDM_CTRL1 0xf900 | |
| #define RT1318_TDM_CTRL2 0xf901 | |
| #define RT1318_TDM_CTRL3 0xf902 | |
| #define RT1318_TDM_CTRL9 0xf908 | |
| /* Clock-1 (0xC001) */ | |
| #define RT1318_PLLIN_MASK (0x7 << 4) | |
| #define RT1318_PLLIN_BCLK0 (0x0 << 4) | |
| #define RT1318_PLLIN_BCLK1 (0x1 << 4) | |
| #define RT1318_PLLIN_RC (0x2 << 4) | |
| #define RT1318_PLLIN_MCLK (0x3 << 4) | |
| #define RT1318_PLLIN_SDW1 (0x4 << 4) | |
| #define RT1318_PLLIN_SDW2 (0x5 << 4) | |
| #define RT1318_PLLIN_SDW3 (0x6 << 4) | |
| #define RT1318_PLLIN_SDW4 (0x7 << 4) | |
| #define RT1318_SYSCLK_SEL_MASK (0x7 << 0) | |
| #define RT1318_SYSCLK_BCLK (0x0 << 0) | |
| #define RT1318_SYSCLK_SDW (0x1 << 0) | |
| #define RT1318_SYSCLK_PLL2F (0x2 << 0) | |
| #define RT1318_SYSCLK_PLL2B (0x3 << 0) | |
| #define RT1318_SYSCLK_MCLK (0x4 << 0) | |
| #define RT1318_SYSCLK_RC1 (0x5 << 0) | |
| #define RT1318_SYSCLK_RC2 (0x6 << 0) | |
| #define RT1318_SYSCLK_RC3 (0x7 << 0) | |
| /* Clock-2 (0xC003) */ | |
| #define RT1318_DIV_AP_MASK (0x3 << 4) | |
| #define RT1318_DIV_AP_SFT 4 | |
| #define RT1318_DIV_AP_DIV1 (0x0 << 4) | |
| #define RT1318_DIV_AP_DIV2 (0x1 << 4) | |
| #define RT1318_DIV_AP_DIV4 (0x2 << 4) | |
| #define RT1318_DIV_AP_DIV8 (0x3 << 4) | |
| #define RT1318_DIV_DAMOD_MASK (0x3 << 0) | |
| #define RT1318_DIV_DAMOD_SFT 0 | |
| #define RT1318_DIV_DAMOD_DIV1 (0x0 << 0) | |
| #define RT1318_DIV_DAMOD_DIV2 (0x1 << 0) | |
| #define RT1318_DIV_DAMOD_DIV4 (0x2 << 0) | |
| #define RT1318_DIV_DAMOD_DIV8 (0x3 << 0) | |
| /* Clock-3 (0xC004) */ | |
| #define RT1318_AD_STO1_MASK (0x7 << 4) | |
| #define RT1318_AD_STO1_SFT 4 | |
| #define RT1318_AD_STO1_DIV1 (0x0 << 4) | |
| #define RT1318_AD_STO1_DIV2 (0x1 << 4) | |
| #define RT1318_AD_STO1_DIV4 (0x2 << 4) | |
| #define RT1318_AD_STO1_DIV8 (0x3 << 4) | |
| #define RT1318_AD_STO1_DIV16 (0x4 << 4) | |
| #define RT1318_AD_STO2_MASK (0x7 << 0) | |
| #define RT1318_AD_STO2_SFT 0 | |
| #define RT1318_AD_STO2_DIV1 (0x0 << 0) | |
| #define RT1318_AD_STO2_DIV2 (0x1 << 0) | |
| #define RT1318_AD_STO2_DIV4 (0x2 << 0) | |
| #define RT1318_AD_STO2_DIV8 (0x3 << 0) | |
| #define RT1318_AD_STO2_DIV16 (0x4 << 0) | |
| #define RT1318_AD_STO2_SFT 0 | |
| /* Clock-4 (0xC005) */ | |
| #define RT1318_AD_ANA_STO1_MASK (0x7 << 4) | |
| #define RT1318_AD_ANA_STO1_SFT 4 | |
| #define RT1318_AD_ANA_STO1_DIV1 (0x0 << 4) | |
| #define RT1318_AD_ANA_STO1_DIV2 (0x1 << 4) | |
| #define RT1318_AD_ANA_STO1_DIV4 (0x2 << 4) | |
| #define RT1318_AD_ANA_STO1_DIV8 (0x3 << 4) | |
| #define RT1318_AD_ANA_STO1_DIV16 (0x4 << 4) | |
| #define RT1318_AD_ANA_STO2_MASK (0x7 << 0) | |
| #define RT1318_AD_ANA_STO2_DIV1 (0x0 << 0) | |
| #define RT1318_AD_ANA_STO2_DIV2 (0x1 << 0) | |
| #define RT1318_AD_ANA_STO2_DIV4 (0x2 << 0) | |
| #define RT1318_AD_ANA_STO2_DIV8 (0x3 << 0) | |
| #define RT1318_AD_ANA_STO2_DIV16 (0x4 << 0) | |
| #define RT1318_AD_ANA_STO2_SFT 0 | |
| /* Clock-5 (0xC006) */ | |
| #define RT1318_DIV_FIFO_IN_MASK (0x3 << 4) | |
| #define RT1318_DIV_FIFO_IN_SFT 4 | |
| #define RT1318_DIV_FIFO_IN_DIV1 (0x0 << 4) | |
| #define RT1318_DIV_FIFO_IN_DIV2 (0x1 << 4) | |
| #define RT1318_DIV_FIFO_IN_DIV4 (0x2 << 4) | |
| #define RT1318_DIV_FIFO_IN_DIV8 (0x3 << 4) | |
| #define RT1318_DIV_FIFO_OUT_MASK (0x3 << 0) | |
| #define RT1318_DIV_FIFO_OUT_DIV1 (0x0 << 0) | |
| #define RT1318_DIV_FIFO_OUT_DIV2 (0x1 << 0) | |
| #define RT1318_DIV_FIFO_OUT_DIV4 (0x2 << 0) | |
| #define RT1318_DIV_FIFO_OUT_DIV8 (0x3 << 0) | |
| #define RT1318_DIV_FIFO_OUT_SFT 0 | |
| /* Clock-6 (0xC007) */ | |
| #define RT1318_DIV_NLMS_MASK (0x3 << 6) | |
| #define RT1318_DIV_NLMS_SFT 6 | |
| #define RT1318_DIV_NLMS_DIV1 (0x0 << 6) | |
| #define RT1318_DIV_NLMS_DIV2 (0x1 << 6) | |
| #define RT1318_DIV_NLMS_DIV4 (0x2 << 6) | |
| #define RT1318_DIV_NLMS_DIV8 (0x3 << 6) | |
| #define RT1318_DIV_AD_MONO_MASK (0x7 << 3) | |
| #define RT1318_DIV_AD_MONO_SFT 3 | |
| #define RT1318_DIV_AD_MONO_DIV1 (0x0 << 3) | |
| #define RT1318_DIV_AD_MONO_DIV2 (0x1 << 3) | |
| #define RT1318_DIV_AD_MONO_DIV4 (0x2 << 3) | |
| #define RT1318_DIV_AD_MONO_DIV8 (0x3 << 3) | |
| #define RT1318_DIV_AD_MONO_DIV16 (0x4 << 3) | |
| #define RT1318_DIV_POST_G_MASK (0x7 << 0) | |
| #define RT1318_DIV_POST_G_SFT 0 | |
| #define RT1318_DIV_POST_G_DIV1 (0x0 << 0) | |
| #define RT1318_DIV_POST_G_DIV2 (0x1 << 0) | |
| #define RT1318_DIV_POST_G_DIV4 (0x2 << 0) | |
| #define RT1318_DIV_POST_G_DIV8 (0x3 << 0) | |
| #define RT1318_DIV_POST_G_DIV16 (0x4 << 0) | |
| /* Power Status 1 (0xC121) */ | |
| #define RT1318_PDB_CTRL_MASK (0x1) | |
| #define RT1318_PDB_CTRL_LOW (0x0) | |
| #define RT1318_PDB_CTRL_HIGH (0x1) | |
| #define RT1318_PDB_CTRL_SFT 0 | |
| /* SRC Tcon(0xc204) */ | |
| #define RT1318_SRCIN_IN_SEL_MASK (0x3 << 6) | |
| #define RT1318_SRCIN_IN_48K (0x0 << 6) | |
| #define RT1318_SRCIN_IN_44P1 (0x1 << 6) | |
| #define RT1318_SRCIN_IN_32K (0x2 << 6) | |
| #define RT1318_SRCIN_IN_16K (0x3 << 6) | |
| #define RT1318_SRCIN_F12288_MASK (0x3 << 4) | |
| #define RT1318_SRCIN_TCON1 (0x0 << 4) | |
| #define RT1318_SRCIN_TCON2 (0x1 << 4) | |
| #define RT1318_SRCIN_TCON4 (0x2 << 4) | |
| #define RT1318_SRCIN_TCON8 (0x3 << 4) | |
| #define RT1318_SRCIN_DACLK_MASK (0x3 << 2) | |
| #define RT1318_DACLK_TCON1 (0x0 << 2) | |
| #define RT1318_DACLK_TCON2 (0x1 << 2) | |
| #define RT1318_DACLK_TCON4 (0x2 << 2) | |
| #define RT1318_DACLK_TCON8 (0x3 << 2) | |
| /* R0 Compare Flag (0xDB35) */ | |
| #define RT1318_R0_RANGE_MASK (0x1) | |
| #define RT1318_R0_OUTOFRANGE (0x0) | |
| #define RT1318_R0_INRANGE (0x1) | |
| /* PLL internal setting (0xF20D), K value */ | |
| #define RT1318_K_PLL1_MASK (0x1f << 0) | |
| /* PLL internal setting (0xF20F), M value */ | |
| #define RT1318_M_PLL1_MASK (0x1f << 0) | |
| /* PLL internal setting (0xF211), N_8 value */ | |
| #define RT1318_N_8_PLL1_MASK (0x1 << 0) | |
| /* PLL internal setting (0xF212), N_7_0 value */ | |
| #define RT1318_N_7_0_PLL1_MASK (0xff << 0) | |
| /* TDM CTRL 1 (0xf900) */ | |
| #define RT1318_TDM_BCLK_MASK (0x1 << 7) | |
| #define RT1318_TDM_BCLK_NORM (0x0 << 7) | |
| #define RT1318_TDM_BCLK_INV (0x1 << 7) | |
| #define RT1318_I2S_FMT_MASK (0x7 << 0) | |
| #define RT1318_FMT_I2S (0x0 << 0) | |
| #define RT1318_FMT_LEFT_J (0x1 << 0) | |
| #define RT1318_FMT_PCM_A_R (0x2 << 0) | |
| #define RT1318_FMT_PCM_B_R (0x3 << 0) | |
| #define RT1318_FMT_PCM_A_F (0x6 << 0) | |
| #define RT1318_FMT_PCM_B_F (0x7 << 0) | |
| #define RT1318_I2S_FMT_SFT 0 | |
| /* TDM CTRL 2 (0xf901) */ | |
| #define RT1318_I2S_CH_TX_MASK (0x3 << 6) | |
| #define RT1318_I2S_CH_TX_2CH (0x0 << 6) | |
| #define RT1318_I2S_CH_TX_4CH (0x1 << 6) | |
| #define RT1318_I2S_CH_TX_6CH (0x2 << 6) | |
| #define RT1318_I2S_CH_TX_8CH (0x3 << 6) | |
| #define RT1318_I2S_CH_RX_MASK (0x3 << 4) | |
| #define RT1318_I2S_CH_RX_2CH (0x0 << 4) | |
| #define RT1318_I2S_CH_RX_4CH (0x1 << 4) | |
| #define RT1318_I2S_CH_RX_6CH (0x2 << 4) | |
| #define RT1318_I2S_CH_RX_8CH (0x3 << 4) | |
| #define RT1318_I2S_DL_MASK 0x7 | |
| #define RT1318_I2S_DL_SFT 0 | |
| #define RT1318_I2S_DL_16 0x0 | |
| #define RT1318_I2S_DL_20 0x1 | |
| #define RT1318_I2S_DL_24 0x2 | |
| #define RT1318_I2S_DL_32 0x3 | |
| #define RT1318_I2S_DL_8 0x4 | |
| /* TDM CTRL 3 (0xf902) */ | |
| #define RT1318_I2S_TX_CHL_MASK (0x7 << 4) | |
| #define RT1318_I2S_TX_CHL_SFT 4 | |
| #define RT1318_I2S_TX_CHL_16 (0x0 << 4) | |
| #define RT1318_I2S_TX_CHL_20 (0x1 << 4) | |
| #define RT1318_I2S_TX_CHL_24 (0x2 << 4) | |
| #define RT1318_I2S_TX_CHL_32 (0x3 << 4) | |
| #define RT1318_I2S_TX_CHL_8 (0x4 << 4) | |
| #define RT1318_I2S_RX_CHL_MASK (0x7 << 0) | |
| #define RT1318_I2S_RX_CHL_SFT 0 | |
| #define RT1318_I2S_RX_CHL_16 (0x0 << 0) | |
| #define RT1318_I2S_RX_CHL_20 (0x1 << 0) | |
| #define RT1318_I2S_RX_CHL_24 (0x2 << 0) | |
| #define RT1318_I2S_RX_CHL_32 (0x3 << 0) | |
| #define RT1318_I2S_RX_CHL_8 (0x4 << 0) | |
| /* TDM CTRL 9 (0xf908) */ | |
| #define RT1318_TDM_I2S_TX_L_DAC1_1_MASK (0x7 << 4) | |
| #define RT1318_TDM_I2S_TX_R_DAC1_1_MASK 0x7 | |
| #define RT1318_TDM_I2S_TX_L_DAC1_1_SFT 4 | |
| #define RT1318_TDM_I2S_TX_R_DAC1_1_SFT 0 | |
| #define RT1318_REG_DISP_LEN 23 | |
| /* System Clock Source */ | |
| enum { | |
| RT1318_SCLK_S_BCLK, | |
| RT1318_SCLK_S_SDW, | |
| RT1318_SCLK_S_PLL2F, | |
| RT1318_SCLK_S_PLL2B, | |
| RT1318_SCLK_S_MCLK, | |
| RT1318_SCLK_S_RC0, | |
| RT1318_SCLK_S_RC1, | |
| RT1318_SCLK_S_RC2, | |
| }; | |
| /* PLL Source */ | |
| enum { | |
| RT1318_PLL_S_BCLK0, | |
| RT1318_PLL_S_BCLK1, | |
| RT1318_PLL_S_RC, | |
| RT1318_PLL_S_MCLK, | |
| RT1318_PLL_S_SDW_IN_PLL, | |
| RT1318_PLL_S_SDW_0, | |
| RT1318_PLL_S_SDW_1, | |
| RT1318_PLL_S_SDW_2, | |
| }; | |
| /* TDM channel */ | |
| enum { | |
| RT1318_2CH, | |
| RT1318_4CH, | |
| RT1318_6CH, | |
| RT1318_8CH, | |
| }; | |
| /* R0 calibration result */ | |
| enum { | |
| RT1318_R0_OUT_OF_RANGE, | |
| RT1318_R0_IN_RANGE, | |
| RT1318_R0_CALIB_NOT_DONE, | |
| }; | |
| /* PLL pre-defined M/N/K */ | |
| struct pll_calc_map { | |
| unsigned int pll_in; | |
| unsigned int pll_out; | |
| int k; | |
| int n; | |
| int m; | |
| bool m_bp; | |
| bool k_bp; | |
| }; | |
| struct rt1318_pll_code { | |
| bool m_bp; /* Indicates bypass m code or not. */ | |
| bool k_bp; /* Indicates bypass k code or not. */ | |
| int m_code; | |
| int n_code; | |
| int k_code; | |
| }; | |
| #endif /* __RT1318_H__ */ |