xref: /OK3568_Linux_fs/kernel/sound/soc/qcom/qdsp6/q6afe.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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