1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun #ifndef __Q6AFE_H__ 4*4882a593Smuzhiyun #define __Q6AFE_H__ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #include <dt-bindings/sound/qcom,q6afe.h> 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #define AFE_PORT_MAX 127 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #define MSM_AFE_PORT_TYPE_RX 0 11*4882a593Smuzhiyun #define MSM_AFE_PORT_TYPE_TX 1 12*4882a593Smuzhiyun #define AFE_MAX_PORTS AFE_PORT_MAX 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #define Q6AFE_MAX_MI2S_LINES 4 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #define AFE_MAX_CHAN_COUNT 8 17*4882a593Smuzhiyun #define AFE_PORT_MAX_AUDIO_CHAN_CNT 0x8 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_SRC_INTERNAL 1 20*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ROOT_DEFAULT 0 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #define LPAIF_DIG_CLK 1 23*4882a593Smuzhiyun #define LPAIF_BIT_CLK 2 24*4882a593Smuzhiyun #define LPAIF_OSR_CLK 3 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /* Clock ID for Primary I2S IBIT */ 27*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT 0x100 28*4882a593Smuzhiyun /* Clock ID for Primary I2S EBIT */ 29*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_PRI_MI2S_EBIT 0x101 30*4882a593Smuzhiyun /* Clock ID for Secondary I2S IBIT */ 31*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT 0x102 32*4882a593Smuzhiyun /* Clock ID for Secondary I2S EBIT */ 33*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_SEC_MI2S_EBIT 0x103 34*4882a593Smuzhiyun /* Clock ID for Tertiary I2S IBIT */ 35*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT 0x104 36*4882a593Smuzhiyun /* Clock ID for Tertiary I2S EBIT */ 37*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_TER_MI2S_EBIT 0x105 38*4882a593Smuzhiyun /* Clock ID for Quartnery I2S IBIT */ 39*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT 0x106 40*4882a593Smuzhiyun /* Clock ID for Quartnery I2S EBIT */ 41*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_QUAD_MI2S_EBIT 0x107 42*4882a593Smuzhiyun /* Clock ID for Speaker I2S IBIT */ 43*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_SPEAKER_I2S_IBIT 0x108 44*4882a593Smuzhiyun /* Clock ID for Speaker I2S EBIT */ 45*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_SPEAKER_I2S_EBIT 0x109 46*4882a593Smuzhiyun /* Clock ID for Speaker I2S OSR */ 47*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_SPEAKER_I2S_OSR 0x10A 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /* Clock ID for QUINARY I2S IBIT */ 50*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT 0x10B 51*4882a593Smuzhiyun /* Clock ID for QUINARY I2S EBIT */ 52*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_QUI_MI2S_EBIT 0x10C 53*4882a593Smuzhiyun /* Clock ID for SENARY I2S IBIT */ 54*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_SEN_MI2S_IBIT 0x10D 55*4882a593Smuzhiyun /* Clock ID for SENARY I2S EBIT */ 56*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_SEN_MI2S_EBIT 0x10E 57*4882a593Smuzhiyun /* Clock ID for INT0 I2S IBIT */ 58*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_INT0_MI2S_IBIT 0x10F 59*4882a593Smuzhiyun /* Clock ID for INT1 I2S IBIT */ 60*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_INT1_MI2S_IBIT 0x110 61*4882a593Smuzhiyun /* Clock ID for INT2 I2S IBIT */ 62*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_INT2_MI2S_IBIT 0x111 63*4882a593Smuzhiyun /* Clock ID for INT3 I2S IBIT */ 64*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_INT3_MI2S_IBIT 0x112 65*4882a593Smuzhiyun /* Clock ID for INT4 I2S IBIT */ 66*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_INT4_MI2S_IBIT 0x113 67*4882a593Smuzhiyun /* Clock ID for INT5 I2S IBIT */ 68*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_INT5_MI2S_IBIT 0x114 69*4882a593Smuzhiyun /* Clock ID for INT6 I2S IBIT */ 70*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_INT6_MI2S_IBIT 0x115 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun /* Clock ID for QUINARY MI2S OSR CLK */ 73*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_QUI_MI2S_OSR 0x116 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /* Clock ID for Primary PCM IBIT */ 76*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_PRI_PCM_IBIT 0x200 77*4882a593Smuzhiyun /* Clock ID for Primary PCM EBIT */ 78*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_PRI_PCM_EBIT 0x201 79*4882a593Smuzhiyun /* Clock ID for Secondary PCM IBIT */ 80*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_SEC_PCM_IBIT 0x202 81*4882a593Smuzhiyun /* Clock ID for Secondary PCM EBIT */ 82*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_SEC_PCM_EBIT 0x203 83*4882a593Smuzhiyun /* Clock ID for Tertiary PCM IBIT */ 84*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_TER_PCM_IBIT 0x204 85*4882a593Smuzhiyun /* Clock ID for Tertiary PCM EBIT */ 86*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_TER_PCM_EBIT 0x205 87*4882a593Smuzhiyun /* Clock ID for Quartery PCM IBIT */ 88*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_QUAD_PCM_IBIT 0x206 89*4882a593Smuzhiyun /* Clock ID for Quartery PCM EBIT */ 90*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_QUAD_PCM_EBIT 0x207 91*4882a593Smuzhiyun /* Clock ID for Quinary PCM IBIT */ 92*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_QUIN_PCM_IBIT 0x208 93*4882a593Smuzhiyun /* Clock ID for Quinary PCM EBIT */ 94*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_QUIN_PCM_EBIT 0x209 95*4882a593Smuzhiyun /* Clock ID for QUINARY PCM OSR */ 96*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_QUI_PCM_OSR 0x20A 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun /** Clock ID for Primary TDM IBIT */ 99*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_PRI_TDM_IBIT 0x200 100*4882a593Smuzhiyun /** Clock ID for Primary TDM EBIT */ 101*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_PRI_TDM_EBIT 0x201 102*4882a593Smuzhiyun /** Clock ID for Secondary TDM IBIT */ 103*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_SEC_TDM_IBIT 0x202 104*4882a593Smuzhiyun /** Clock ID for Secondary TDM EBIT */ 105*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_SEC_TDM_EBIT 0x203 106*4882a593Smuzhiyun /** Clock ID for Tertiary TDM IBIT */ 107*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_TER_TDM_IBIT 0x204 108*4882a593Smuzhiyun /** Clock ID for Tertiary TDM EBIT */ 109*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_TER_TDM_EBIT 0x205 110*4882a593Smuzhiyun /** Clock ID for Quartery TDM IBIT */ 111*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_QUAD_TDM_IBIT 0x206 112*4882a593Smuzhiyun /** Clock ID for Quartery TDM EBIT */ 113*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_QUAD_TDM_EBIT 0x207 114*4882a593Smuzhiyun /** Clock ID for Quinary TDM IBIT */ 115*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_QUIN_TDM_IBIT 0x208 116*4882a593Smuzhiyun /** Clock ID for Quinary TDM EBIT */ 117*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_QUIN_TDM_EBIT 0x209 118*4882a593Smuzhiyun /** Clock ID for Quinary TDM OSR */ 119*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_QUIN_TDM_OSR 0x20A 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun /* Clock ID for MCLK1 */ 122*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_MCLK_1 0x300 123*4882a593Smuzhiyun /* Clock ID for MCLK2 */ 124*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_MCLK_2 0x301 125*4882a593Smuzhiyun /* Clock ID for MCLK3 */ 126*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_MCLK_3 0x302 127*4882a593Smuzhiyun /* Clock ID for MCLK4 */ 128*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_MCLK_4 0x304 129*4882a593Smuzhiyun /* Clock ID for Internal Digital Codec Core */ 130*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_INTERNAL_DIGITAL_CODEC_CORE 0x303 131*4882a593Smuzhiyun /* Clock ID for INT MCLK0 */ 132*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_INT_MCLK_0 0x305 133*4882a593Smuzhiyun /* Clock ID for INT MCLK1 */ 134*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_INT_MCLK_1 0x306 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_WSA_CORE_MCLK 0x309 137*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_WSA_CORE_NPL_MCLK 0x30a 138*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_TX_CORE_MCLK 0x30c 139*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_TX_CORE_NPL_MCLK 0x30d 140*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_RX_CORE_MCLK 0x30e 141*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_RX_CORE_NPL_MCLK 0x30f 142*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_VA_CORE_MCLK 0x30b 143*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ID_VA_CORE_2X_MCLK 0x310 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun #define Q6AFE_LPASS_CORE_AVTIMER_BLOCK 0x2 146*4882a593Smuzhiyun #define Q6AFE_LPASS_CORE_HW_MACRO_BLOCK 0x3 147*4882a593Smuzhiyun #define Q6AFE_LPASS_CORE_HW_DCODEC_BLOCK 0x4 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun /* Clock attribute for invalid use (reserved for internal usage) */ 150*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ATTRIBUTE_INVALID 0x0 151*4882a593Smuzhiyun /* Clock attribute for no couple case */ 152*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO 0x1 153*4882a593Smuzhiyun /* Clock attribute for dividend couple case */ 154*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_DIVIDEND 0x2 155*4882a593Smuzhiyun /* Clock attribute for divisor couple case */ 156*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_DIVISOR 0x3 157*4882a593Smuzhiyun /* Clock attribute for invert and no couple case */ 158*4882a593Smuzhiyun #define Q6AFE_LPASS_CLK_ATTRIBUTE_INVERT_COUPLE_NO 0x4 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun #define Q6AFE_CMAP_INVALID 0xFFFF 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun struct q6afe_hdmi_cfg { 163*4882a593Smuzhiyun u16 datatype; 164*4882a593Smuzhiyun u16 channel_allocation; 165*4882a593Smuzhiyun u32 sample_rate; 166*4882a593Smuzhiyun u16 bit_width; 167*4882a593Smuzhiyun }; 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun struct q6afe_slim_cfg { 170*4882a593Smuzhiyun u32 sample_rate; 171*4882a593Smuzhiyun u16 bit_width; 172*4882a593Smuzhiyun u16 data_format; 173*4882a593Smuzhiyun u16 num_channels; 174*4882a593Smuzhiyun u8 ch_mapping[AFE_MAX_CHAN_COUNT]; 175*4882a593Smuzhiyun }; 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun struct q6afe_i2s_cfg { 178*4882a593Smuzhiyun u32 sample_rate; 179*4882a593Smuzhiyun u16 bit_width; 180*4882a593Smuzhiyun u16 data_format; 181*4882a593Smuzhiyun u16 num_channels; 182*4882a593Smuzhiyun u32 sd_line_mask; 183*4882a593Smuzhiyun int fmt; 184*4882a593Smuzhiyun }; 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun struct q6afe_tdm_cfg { 187*4882a593Smuzhiyun u16 num_channels; 188*4882a593Smuzhiyun u32 sample_rate; 189*4882a593Smuzhiyun u16 bit_width; 190*4882a593Smuzhiyun u16 data_format; 191*4882a593Smuzhiyun u16 sync_mode; 192*4882a593Smuzhiyun u16 sync_src; 193*4882a593Smuzhiyun u16 nslots_per_frame; 194*4882a593Smuzhiyun u16 slot_width; 195*4882a593Smuzhiyun u16 slot_mask; 196*4882a593Smuzhiyun u32 data_align_type; 197*4882a593Smuzhiyun u16 ch_mapping[AFE_MAX_CHAN_COUNT]; 198*4882a593Smuzhiyun }; 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun struct q6afe_cdc_dma_cfg { 201*4882a593Smuzhiyun u16 sample_rate; 202*4882a593Smuzhiyun u16 bit_width; 203*4882a593Smuzhiyun u16 data_format; 204*4882a593Smuzhiyun u16 num_channels; 205*4882a593Smuzhiyun u16 active_channels_mask; 206*4882a593Smuzhiyun }; 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun struct q6afe_port_config { 210*4882a593Smuzhiyun struct q6afe_hdmi_cfg hdmi; 211*4882a593Smuzhiyun struct q6afe_slim_cfg slim; 212*4882a593Smuzhiyun struct q6afe_i2s_cfg i2s_cfg; 213*4882a593Smuzhiyun struct q6afe_tdm_cfg tdm; 214*4882a593Smuzhiyun struct q6afe_cdc_dma_cfg dma_cfg; 215*4882a593Smuzhiyun }; 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun struct q6afe_port; 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun struct q6afe_port *q6afe_port_get_from_id(struct device *dev, int id); 220*4882a593Smuzhiyun int q6afe_port_start(struct q6afe_port *port); 221*4882a593Smuzhiyun int q6afe_port_stop(struct q6afe_port *port); 222*4882a593Smuzhiyun void q6afe_port_put(struct q6afe_port *port); 223*4882a593Smuzhiyun int q6afe_get_port_id(int index); 224*4882a593Smuzhiyun void q6afe_hdmi_port_prepare(struct q6afe_port *port, 225*4882a593Smuzhiyun struct q6afe_hdmi_cfg *cfg); 226*4882a593Smuzhiyun void q6afe_slim_port_prepare(struct q6afe_port *port, 227*4882a593Smuzhiyun struct q6afe_slim_cfg *cfg); 228*4882a593Smuzhiyun int q6afe_i2s_port_prepare(struct q6afe_port *port, struct q6afe_i2s_cfg *cfg); 229*4882a593Smuzhiyun void q6afe_tdm_port_prepare(struct q6afe_port *port, struct q6afe_tdm_cfg *cfg); 230*4882a593Smuzhiyun void q6afe_cdc_dma_port_prepare(struct q6afe_port *port, 231*4882a593Smuzhiyun struct q6afe_cdc_dma_cfg *cfg); 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun int q6afe_port_set_sysclk(struct q6afe_port *port, int clk_id, 234*4882a593Smuzhiyun int clk_src, int clk_root, 235*4882a593Smuzhiyun unsigned int freq, int dir); 236*4882a593Smuzhiyun int q6afe_set_lpass_clock(struct device *dev, int clk_id, int clk_src, 237*4882a593Smuzhiyun int clk_root, unsigned int freq); 238*4882a593Smuzhiyun int q6afe_vote_lpass_core_hw(struct device *dev, uint32_t hw_block_id, 239*4882a593Smuzhiyun char *client_name, uint32_t *client_handle); 240*4882a593Smuzhiyun int q6afe_unvote_lpass_core_hw(struct device *dev, uint32_t hw_block_id, 241*4882a593Smuzhiyun uint32_t client_handle); 242*4882a593Smuzhiyun #endif /* __Q6AFE_H__ */ 243