Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * rt711-sdca.h -- RT711 SDCA ALSA SoC audio driver header
0004  *
0005  * Copyright(c) 2021 Realtek Semiconductor Corp.
0006  */
0007 
0008 #ifndef __RT711_SDCA_H__
0009 #define __RT711_SDCA_H__
0010 
0011 #include <linux/pm.h>
0012 #include <linux/regmap.h>
0013 #include <linux/soundwire/sdw.h>
0014 #include <linux/soundwire/sdw_type.h>
0015 #include <sound/soc.h>
0016 #include <linux/workqueue.h>
0017 
0018 struct  rt711_sdca_priv {
0019     struct regmap *regmap, *mbq_regmap;
0020     struct snd_soc_component *component;
0021     struct sdw_slave *slave;
0022     enum sdw_slave_status status;
0023     struct sdw_bus_params params;
0024     bool hw_init;
0025     bool first_hw_init;
0026     struct snd_soc_jack *hs_jack;
0027     struct delayed_work jack_detect_work;
0028     struct delayed_work jack_btn_check_work;
0029     struct mutex calibrate_mutex; /* for headset calibration */
0030     struct mutex disable_irq_lock; /* SDCA irq lock protection */
0031     bool disable_irq;
0032     int jack_type, jd_src;
0033     unsigned int scp_sdca_stat1, scp_sdca_stat2;
0034     int hw_ver;
0035     bool fu0f_dapm_mute, fu0f_mixer_l_mute, fu0f_mixer_r_mute;
0036     bool fu1e_dapm_mute, fu1e_mixer_l_mute, fu1e_mixer_r_mute;
0037 };
0038 
0039 struct sdw_stream_data {
0040     struct sdw_stream_runtime *sdw_stream;
0041 };
0042 
0043 /* NID */
0044 #define RT711_AUDIO_FUNCTION_GROUP          0x01
0045 #define RT711_DAC_OUT2                  0x03
0046 #define RT711_ADC_IN1                   0x09
0047 #define RT711_ADC_IN2                   0x08
0048 #define RT711_DMIC1                 0x12
0049 #define RT711_DMIC2                 0x13
0050 #define RT711_MIC2                  0x19
0051 #define RT711_LINE1                 0x1a
0052 #define RT711_LINE2                 0x1b
0053 #define RT711_BEEP                  0x1d
0054 #define RT711_VENDOR_REG                0x20
0055 #define RT711_HP_OUT                    0x21
0056 #define RT711_MIXER_IN1                 0x22
0057 #define RT711_MIXER_IN2                 0x23
0058 #define RT711_INLINE_CMD                0x55
0059 #define RT711_VENDOR_CALI               0x58
0060 #define RT711_VENDOR_IMS_DRE                0x5b
0061 #define RT711_VENDOR_VAD                0x5e
0062 #define RT711_VENDOR_ANALOG_CTL             0x5f
0063 #define RT711_VENDOR_HDA_CTL                0x61
0064 
0065 /* Index (NID:20h) */
0066 #define RT711_JD_PRODUCT_NUM            0x00
0067 #define RT711_DMIC_CTL1                 0x06
0068 #define RT711_JD_CTL1                   0x08
0069 #define RT711_JD_CTL2                   0x09
0070 #define RT711_CC_DET1                   0x11
0071 #define RT711_PARA_VERB_CTL             0x1a
0072 #define RT711_COMBO_JACK_AUTO_CTL1          0x45
0073 #define RT711_COMBO_JACK_AUTO_CTL2          0x46
0074 #define RT711_COMBO_JACK_AUTO_CTL3          0x47
0075 #define RT711_INLINE_CMD_CTL                0x48
0076 #define RT711_DIGITAL_MISC_CTRL4            0x4a
0077 #define RT711_JD_CTRL6          0x6a
0078 #define RT711_VREFOUT_CTL               0x6b
0079 #define RT711_GPIO_TEST_MODE_CTL2           0x6d
0080 #define RT711_FSM_CTL                   0x6f
0081 #define RT711_IRQ_FLAG_TABLE1               0x80
0082 #define RT711_IRQ_FLAG_TABLE2               0x81
0083 #define RT711_IRQ_FLAG_TABLE3               0x82
0084 #define RT711_HP_FSM_CTL                0x83
0085 #define RT711_TX_RX_MUX_CTL             0x91
0086 #define RT711_FILTER_SRC_SEL                0xb0
0087 #define RT711_ADC27_VOL_SET             0xb7
0088 
0089 /* Index (NID:58h) */
0090 #define RT711_DAC_DC_CALI_CTL1              0x00
0091 #define RT711_DAC_DC_CALI_CTL2              0x01
0092 
0093 /* Index (NID:5bh) */
0094 #define RT711_IMS_DIGITAL_CTL1              0x00
0095 #define RT711_HP_IMS_RESULT_L               0x20
0096 #define RT711_HP_IMS_RESULT_R               0x21
0097 
0098 /* Index (NID:5eh) */
0099 #define RT711_VAD_SRAM_CTL1             0x10
0100 
0101 /* Index (NID:5fh) */
0102 #define RT711_MISC_POWER_CTL0               0x01
0103 #define RT711_MISC_POWER_CTL4               0x05
0104 
0105 /* Index (NID:61h) */
0106 #define RT711_HDA_LEGACY_MUX_CTL1           0x00
0107 #define RT711_HDA_LEGACY_UNSOLICITED_CTL    0x03
0108 #define RT711_HDA_LEGACY_CONFIG_CTL         0x06
0109 #define RT711_HDA_LEGACY_RESET_CTL          0x08
0110 #define RT711_HDA_LEGACY_GPIO_CTL           0x0a
0111 #define RT711_ADC08_09_PDE_CTL              0x24
0112 #define RT711_GE_MODE_RELATED_CTL           0x35
0113 #define RT711_PUSH_BTN_INT_CTL0             0x36
0114 #define RT711_PUSH_BTN_INT_CTL1             0x37
0115 #define RT711_PUSH_BTN_INT_CTL2             0x38
0116 #define RT711_PUSH_BTN_INT_CTL6             0x3c
0117 #define RT711_PUSH_BTN_INT_CTL7             0x3d
0118 #define RT711_PUSH_BTN_INT_CTL9             0x3f
0119 
0120 /* DAC DC offset calibration control-1 (0x00)(NID:20h) */
0121 #define RT711_DAC_DC_CALI_TRIGGER (0x1 << 15)
0122 #define RT711_DAC_DC_CALI_CLK_EN (0x1 << 14)
0123 #define RT711_DAC_DC_FORCE_CALI_RST (0x1 << 3)
0124 
0125 /* jack detect control 1 (0x08)(NID:20h) */
0126 #define RT711_JD2_DIGITAL_MODE_SEL (0x1 << 1)
0127 
0128 /* jack detect control 2 (0x09)(NID:20h) */
0129 #define RT711_JD2_2PORT_200K_DECODE_HP (0x1 << 13)
0130 #define RT711_HP_JD_SEL_JD1 (0x0 << 1)
0131 #define RT711_HP_JD_SEL_JD2 (0x1 << 1)
0132 
0133 /* CC DET1 (0x11)(NID:20h) */
0134 #define RT711_HP_JD_FINAL_RESULT_CTL_JD12 (0x1 << 10)
0135 #define RT711_HP_JD_FINAL_RESULT_CTL_CCDET (0x0 << 10)
0136 
0137 /* Parameter & Verb control (0x1a)(NID:20h) */
0138 #define RT711_HIDDEN_REG_SW_RESET (0x1 << 14)
0139 
0140 /* combo jack auto switch control 2 (0x46)(NID:20h) */
0141 #define RT711_COMBOJACK_AUTO_DET_STATUS         (0x1 << 11)
0142 #define RT711_COMBOJACK_AUTO_DET_TRS            (0x1 << 10)
0143 #define RT711_COMBOJACK_AUTO_DET_CTIA           (0x1 << 9)
0144 #define RT711_COMBOJACK_AUTO_DET_OMTP           (0x1 << 8)
0145 
0146 /* FSM control (0x6f)(NID:20h) */
0147 #define RT711_CALI_CTL          (0x0 << 0)
0148 #define RT711_COMBOJACK_CTL     (0x1 << 0)
0149 #define RT711_IMS_CTL           (0x2 << 0)
0150 #define RT711_DEPOP_CTL         (0x3 << 0)
0151 #define RT711_FSM_IMP_EN        (0x1 << 6)
0152 
0153 /* Impedance Sense Digital Control 1 (0x00)(NID:5bh) */
0154 #define RT711_TRIGGER_IMS       (0x1 << 15)
0155 #define RT711_IMS_EN            (0x1 << 6)
0156 
0157 #define RT711_EAPD_HIGH             0x2
0158 #define RT711_EAPD_LOW              0x0
0159 #define RT711_MUTE_SFT              7
0160 /* set input/output mapping to payload[14][15] separately */
0161 #define RT711_DIR_IN_SFT            6
0162 #define RT711_DIR_OUT_SFT           7
0163 
0164 /* RC Calibration register */
0165 #define RT711_RC_CAL_STATUS         0x320c
0166 
0167 /* Buffer address for HID */
0168 #define RT711_BUF_ADDR_HID1         0x44030000
0169 #define RT711_BUF_ADDR_HID2         0x44030020
0170 
0171 /* RT711 SDCA Control - function number */
0172 #define FUNC_NUM_JACK_CODEC 0x01
0173 #define FUNC_NUM_MIC_ARRAY 0x02
0174 #define FUNC_NUM_HID 0x03
0175 
0176 /* RT711 SDCA entity */
0177 #define RT711_SDCA_ENT_HID01 0x01
0178 #define RT711_SDCA_ENT_GE49 0x49
0179 #define RT711_SDCA_ENT_USER_FU05 0x05
0180 #define RT711_SDCA_ENT_USER_FU0F 0x0f
0181 #define RT711_SDCA_ENT_USER_FU1E 0x1e
0182 #define RT711_SDCA_ENT_PLATFORM_FU15 0x15
0183 #define RT711_SDCA_ENT_PLATFORM_FU44 0x44
0184 #define RT711_SDCA_ENT_PDE28 0x28
0185 #define RT711_SDCA_ENT_PDE29 0x29
0186 #define RT711_SDCA_ENT_PDE2A 0x2a
0187 #define RT711_SDCA_ENT_CS01 0x01
0188 #define RT711_SDCA_ENT_CS11 0x11
0189 #define RT711_SDCA_ENT_CS1F 0x1f
0190 #define RT711_SDCA_ENT_OT1 0x06
0191 #define RT711_SDCA_ENT_LINE1 0x09
0192 #define RT711_SDCA_ENT_LINE2 0x31
0193 #define RT711_SDCA_ENT_PDELINE2 0x36
0194 #define RT711_SDCA_ENT_USER_FU9 0x41
0195 
0196 /* RT711 SDCA control */
0197 #define RT711_SDCA_CTL_SAMPLE_FREQ_INDEX 0x10
0198 #define RT711_SDCA_CTL_FU_CH_GAIN 0x0b
0199 #define RT711_SDCA_CTL_FU_MUTE 0x01
0200 #define RT711_SDCA_CTL_FU_VOLUME 0x02
0201 #define RT711_SDCA_CTL_HIDTX_CURRENT_OWNER 0x10
0202 #define RT711_SDCA_CTL_HIDTX_SET_OWNER_TO_DEVICE 0x11
0203 #define RT711_SDCA_CTL_HIDTX_MESSAGE_OFFSET 0x12
0204 #define RT711_SDCA_CTL_HIDTX_MESSAGE_LENGTH 0x13
0205 #define RT711_SDCA_CTL_SELECTED_MODE 0x01
0206 #define RT711_SDCA_CTL_DETECTED_MODE 0x02
0207 #define RT711_SDCA_CTL_REQ_POWER_STATE 0x01
0208 #define RT711_SDCA_CTL_VENDOR_DEF 0x30
0209 
0210 /* RT711 SDCA channel */
0211 #define CH_L 0x01
0212 #define CH_R 0x02
0213 
0214 /* sample frequency index */
0215 #define RT711_SDCA_RATE_44100HZ     0x08
0216 #define RT711_SDCA_RATE_48000HZ     0x09
0217 #define RT711_SDCA_RATE_96000HZ     0x0b
0218 #define RT711_SDCA_RATE_192000HZ    0x0d
0219 
0220 enum {
0221     RT711_AIF1,
0222     RT711_AIF2,
0223     RT711_AIFS,
0224 };
0225 
0226 enum rt711_sdca_jd_src {
0227     RT711_JD_NULL,
0228     RT711_JD1,
0229     RT711_JD2
0230 };
0231 
0232 enum rt711_sdca_ver {
0233     RT711_VER_VD0,
0234     RT711_VER_VD1
0235 };
0236 
0237 int rt711_sdca_io_init(struct device *dev, struct sdw_slave *slave);
0238 int rt711_sdca_init(struct device *dev, struct regmap *regmap,
0239            struct regmap *mbq_regmap, struct sdw_slave *slave);
0240 
0241 int rt711_sdca_jack_detect(struct rt711_sdca_priv *rt711, bool *hp, bool *mic);
0242 #endif /* __RT711_SDCA_H__ */