18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci
38c2ecf20Sopenharmony_ci#ifndef __Q6AFE_H__
48c2ecf20Sopenharmony_ci#define __Q6AFE_H__
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#include <dt-bindings/sound/qcom,q6afe.h>
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#define AFE_PORT_MAX		127
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#define MSM_AFE_PORT_TYPE_RX 0
118c2ecf20Sopenharmony_ci#define MSM_AFE_PORT_TYPE_TX 1
128c2ecf20Sopenharmony_ci#define AFE_MAX_PORTS AFE_PORT_MAX
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#define Q6AFE_MAX_MI2S_LINES	4
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#define AFE_MAX_CHAN_COUNT	8
178c2ecf20Sopenharmony_ci#define AFE_PORT_MAX_AUDIO_CHAN_CNT	0x8
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_SRC_INTERNAL 1
208c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ROOT_DEFAULT 0
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci#define LPAIF_DIG_CLK	1
238c2ecf20Sopenharmony_ci#define LPAIF_BIT_CLK	2
248c2ecf20Sopenharmony_ci#define LPAIF_OSR_CLK	3
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci/* Clock ID for Primary I2S IBIT */
278c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT                          0x100
288c2ecf20Sopenharmony_ci/* Clock ID for Primary I2S EBIT */
298c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_PRI_MI2S_EBIT                          0x101
308c2ecf20Sopenharmony_ci/* Clock ID for Secondary I2S IBIT */
318c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT                          0x102
328c2ecf20Sopenharmony_ci/* Clock ID for Secondary I2S EBIT */
338c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_SEC_MI2S_EBIT                          0x103
348c2ecf20Sopenharmony_ci/* Clock ID for Tertiary I2S IBIT */
358c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT                          0x104
368c2ecf20Sopenharmony_ci/* Clock ID for Tertiary I2S EBIT */
378c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_TER_MI2S_EBIT                          0x105
388c2ecf20Sopenharmony_ci/* Clock ID for Quartnery I2S IBIT */
398c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT                         0x106
408c2ecf20Sopenharmony_ci/* Clock ID for Quartnery I2S EBIT */
418c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_QUAD_MI2S_EBIT                         0x107
428c2ecf20Sopenharmony_ci/* Clock ID for Speaker I2S IBIT */
438c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_SPEAKER_I2S_IBIT                       0x108
448c2ecf20Sopenharmony_ci/* Clock ID for Speaker I2S EBIT */
458c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_SPEAKER_I2S_EBIT                       0x109
468c2ecf20Sopenharmony_ci/* Clock ID for Speaker I2S OSR */
478c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_SPEAKER_I2S_OSR                        0x10A
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci/* Clock ID for QUINARY  I2S IBIT */
508c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT			0x10B
518c2ecf20Sopenharmony_ci/* Clock ID for QUINARY  I2S EBIT */
528c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_QUI_MI2S_EBIT			0x10C
538c2ecf20Sopenharmony_ci/* Clock ID for SENARY  I2S IBIT */
548c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_SEN_MI2S_IBIT			0x10D
558c2ecf20Sopenharmony_ci/* Clock ID for SENARY  I2S EBIT */
568c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_SEN_MI2S_EBIT			0x10E
578c2ecf20Sopenharmony_ci/* Clock ID for INT0 I2S IBIT  */
588c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_INT0_MI2S_IBIT                       0x10F
598c2ecf20Sopenharmony_ci/* Clock ID for INT1 I2S IBIT  */
608c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_INT1_MI2S_IBIT                       0x110
618c2ecf20Sopenharmony_ci/* Clock ID for INT2 I2S IBIT  */
628c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_INT2_MI2S_IBIT                       0x111
638c2ecf20Sopenharmony_ci/* Clock ID for INT3 I2S IBIT  */
648c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_INT3_MI2S_IBIT                       0x112
658c2ecf20Sopenharmony_ci/* Clock ID for INT4 I2S IBIT  */
668c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_INT4_MI2S_IBIT                       0x113
678c2ecf20Sopenharmony_ci/* Clock ID for INT5 I2S IBIT  */
688c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_INT5_MI2S_IBIT                       0x114
698c2ecf20Sopenharmony_ci/* Clock ID for INT6 I2S IBIT  */
708c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_INT6_MI2S_IBIT                       0x115
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ci/* Clock ID for QUINARY MI2S OSR CLK  */
738c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_QUI_MI2S_OSR                         0x116
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci/* Clock ID for Primary PCM IBIT */
768c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_PRI_PCM_IBIT                           0x200
778c2ecf20Sopenharmony_ci/* Clock ID for Primary PCM EBIT */
788c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_PRI_PCM_EBIT                           0x201
798c2ecf20Sopenharmony_ci/* Clock ID for Secondary PCM IBIT */
808c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_SEC_PCM_IBIT                           0x202
818c2ecf20Sopenharmony_ci/* Clock ID for Secondary PCM EBIT */
828c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_SEC_PCM_EBIT                           0x203
838c2ecf20Sopenharmony_ci/* Clock ID for Tertiary PCM IBIT */
848c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_TER_PCM_IBIT                           0x204
858c2ecf20Sopenharmony_ci/* Clock ID for Tertiary PCM EBIT */
868c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_TER_PCM_EBIT                           0x205
878c2ecf20Sopenharmony_ci/* Clock ID for Quartery PCM IBIT */
888c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_QUAD_PCM_IBIT                          0x206
898c2ecf20Sopenharmony_ci/* Clock ID for Quartery PCM EBIT */
908c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_QUAD_PCM_EBIT                          0x207
918c2ecf20Sopenharmony_ci/* Clock ID for Quinary PCM IBIT */
928c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_QUIN_PCM_IBIT                          0x208
938c2ecf20Sopenharmony_ci/* Clock ID for Quinary PCM EBIT */
948c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_QUIN_PCM_EBIT                          0x209
958c2ecf20Sopenharmony_ci/* Clock ID for QUINARY PCM OSR  */
968c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_QUI_PCM_OSR                            0x20A
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci/** Clock ID for Primary TDM IBIT */
998c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_PRI_TDM_IBIT                           0x200
1008c2ecf20Sopenharmony_ci/** Clock ID for Primary TDM EBIT */
1018c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_PRI_TDM_EBIT                           0x201
1028c2ecf20Sopenharmony_ci/** Clock ID for Secondary TDM IBIT */
1038c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_SEC_TDM_IBIT                           0x202
1048c2ecf20Sopenharmony_ci/** Clock ID for Secondary TDM EBIT */
1058c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_SEC_TDM_EBIT                           0x203
1068c2ecf20Sopenharmony_ci/** Clock ID for Tertiary TDM IBIT */
1078c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_TER_TDM_IBIT                           0x204
1088c2ecf20Sopenharmony_ci/** Clock ID for Tertiary TDM EBIT */
1098c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_TER_TDM_EBIT                           0x205
1108c2ecf20Sopenharmony_ci/** Clock ID for Quartery TDM IBIT */
1118c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_QUAD_TDM_IBIT                          0x206
1128c2ecf20Sopenharmony_ci/** Clock ID for Quartery TDM EBIT */
1138c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_QUAD_TDM_EBIT                          0x207
1148c2ecf20Sopenharmony_ci/** Clock ID for Quinary TDM IBIT */
1158c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_QUIN_TDM_IBIT                          0x208
1168c2ecf20Sopenharmony_ci/** Clock ID for Quinary TDM EBIT */
1178c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_QUIN_TDM_EBIT                          0x209
1188c2ecf20Sopenharmony_ci/** Clock ID for Quinary TDM OSR */
1198c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_QUIN_TDM_OSR                           0x20A
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci/* Clock ID for MCLK1 */
1228c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_MCLK_1                                 0x300
1238c2ecf20Sopenharmony_ci/* Clock ID for MCLK2 */
1248c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_MCLK_2                                 0x301
1258c2ecf20Sopenharmony_ci/* Clock ID for MCLK3 */
1268c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_MCLK_3                                 0x302
1278c2ecf20Sopenharmony_ci/* Clock ID for MCLK4 */
1288c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_MCLK_4                                 0x304
1298c2ecf20Sopenharmony_ci/* Clock ID for Internal Digital Codec Core */
1308c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_INTERNAL_DIGITAL_CODEC_CORE            0x303
1318c2ecf20Sopenharmony_ci/* Clock ID for INT MCLK0 */
1328c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_INT_MCLK_0                             0x305
1338c2ecf20Sopenharmony_ci/* Clock ID for INT MCLK1 */
1348c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_INT_MCLK_1                             0x306
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_WSA_CORE_MCLK			0x309
1378c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_WSA_CORE_NPL_MCLK			0x30a
1388c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_TX_CORE_MCLK				0x30c
1398c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_TX_CORE_NPL_MCLK			0x30d
1408c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_RX_CORE_MCLK				0x30e
1418c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_RX_CORE_NPL_MCLK			0x30f
1428c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_VA_CORE_MCLK				0x30b
1438c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ID_VA_CORE_2X_MCLK			0x310
1448c2ecf20Sopenharmony_ci
1458c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CORE_AVTIMER_BLOCK			0x2
1468c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CORE_HW_MACRO_BLOCK			0x3
1478c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CORE_HW_DCODEC_BLOCK		0x4
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_ci/* Clock attribute for invalid use (reserved for internal usage) */
1508c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ATTRIBUTE_INVALID		0x0
1518c2ecf20Sopenharmony_ci/* Clock attribute for no couple case */
1528c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO		0x1
1538c2ecf20Sopenharmony_ci/* Clock attribute for dividend couple case */
1548c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_DIVIDEND	0x2
1558c2ecf20Sopenharmony_ci/* Clock attribute for divisor couple case */
1568c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_DIVISOR	0x3
1578c2ecf20Sopenharmony_ci/* Clock attribute for invert and no couple case */
1588c2ecf20Sopenharmony_ci#define Q6AFE_LPASS_CLK_ATTRIBUTE_INVERT_COUPLE_NO	0x4
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_ci#define Q6AFE_CMAP_INVALID		0xFFFF
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_cistruct q6afe_hdmi_cfg {
1638c2ecf20Sopenharmony_ci	u16                  datatype;
1648c2ecf20Sopenharmony_ci	u16                  channel_allocation;
1658c2ecf20Sopenharmony_ci	u32                  sample_rate;
1668c2ecf20Sopenharmony_ci	u16                  bit_width;
1678c2ecf20Sopenharmony_ci};
1688c2ecf20Sopenharmony_ci
1698c2ecf20Sopenharmony_cistruct q6afe_slim_cfg {
1708c2ecf20Sopenharmony_ci	u32	sample_rate;
1718c2ecf20Sopenharmony_ci	u16	bit_width;
1728c2ecf20Sopenharmony_ci	u16	data_format;
1738c2ecf20Sopenharmony_ci	u16	num_channels;
1748c2ecf20Sopenharmony_ci	u8	ch_mapping[AFE_MAX_CHAN_COUNT];
1758c2ecf20Sopenharmony_ci};
1768c2ecf20Sopenharmony_ci
1778c2ecf20Sopenharmony_cistruct q6afe_i2s_cfg {
1788c2ecf20Sopenharmony_ci	u32	sample_rate;
1798c2ecf20Sopenharmony_ci	u16	bit_width;
1808c2ecf20Sopenharmony_ci	u16	data_format;
1818c2ecf20Sopenharmony_ci	u16	num_channels;
1828c2ecf20Sopenharmony_ci	u32	sd_line_mask;
1838c2ecf20Sopenharmony_ci	int fmt;
1848c2ecf20Sopenharmony_ci};
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_cistruct q6afe_tdm_cfg {
1878c2ecf20Sopenharmony_ci	u16	num_channels;
1888c2ecf20Sopenharmony_ci	u32	sample_rate;
1898c2ecf20Sopenharmony_ci	u16	bit_width;
1908c2ecf20Sopenharmony_ci	u16	data_format;
1918c2ecf20Sopenharmony_ci	u16	sync_mode;
1928c2ecf20Sopenharmony_ci	u16	sync_src;
1938c2ecf20Sopenharmony_ci	u16	nslots_per_frame;
1948c2ecf20Sopenharmony_ci	u16	slot_width;
1958c2ecf20Sopenharmony_ci	u16	slot_mask;
1968c2ecf20Sopenharmony_ci	u32	data_align_type;
1978c2ecf20Sopenharmony_ci	u16	ch_mapping[AFE_MAX_CHAN_COUNT];
1988c2ecf20Sopenharmony_ci};
1998c2ecf20Sopenharmony_ci
2008c2ecf20Sopenharmony_cistruct q6afe_cdc_dma_cfg {
2018c2ecf20Sopenharmony_ci	u16	sample_rate;
2028c2ecf20Sopenharmony_ci	u16	bit_width;
2038c2ecf20Sopenharmony_ci	u16	data_format;
2048c2ecf20Sopenharmony_ci	u16	num_channels;
2058c2ecf20Sopenharmony_ci	u16	active_channels_mask;
2068c2ecf20Sopenharmony_ci};
2078c2ecf20Sopenharmony_ci
2088c2ecf20Sopenharmony_ci
2098c2ecf20Sopenharmony_cistruct q6afe_port_config {
2108c2ecf20Sopenharmony_ci	struct q6afe_hdmi_cfg hdmi;
2118c2ecf20Sopenharmony_ci	struct q6afe_slim_cfg slim;
2128c2ecf20Sopenharmony_ci	struct q6afe_i2s_cfg i2s_cfg;
2138c2ecf20Sopenharmony_ci	struct q6afe_tdm_cfg tdm;
2148c2ecf20Sopenharmony_ci	struct q6afe_cdc_dma_cfg dma_cfg;
2158c2ecf20Sopenharmony_ci};
2168c2ecf20Sopenharmony_ci
2178c2ecf20Sopenharmony_cistruct q6afe_port;
2188c2ecf20Sopenharmony_ci
2198c2ecf20Sopenharmony_cistruct q6afe_port *q6afe_port_get_from_id(struct device *dev, int id);
2208c2ecf20Sopenharmony_ciint q6afe_port_start(struct q6afe_port *port);
2218c2ecf20Sopenharmony_ciint q6afe_port_stop(struct q6afe_port *port);
2228c2ecf20Sopenharmony_civoid q6afe_port_put(struct q6afe_port *port);
2238c2ecf20Sopenharmony_ciint q6afe_get_port_id(int index);
2248c2ecf20Sopenharmony_civoid q6afe_hdmi_port_prepare(struct q6afe_port *port,
2258c2ecf20Sopenharmony_ci			    struct q6afe_hdmi_cfg *cfg);
2268c2ecf20Sopenharmony_civoid q6afe_slim_port_prepare(struct q6afe_port *port,
2278c2ecf20Sopenharmony_ci			  struct q6afe_slim_cfg *cfg);
2288c2ecf20Sopenharmony_ciint q6afe_i2s_port_prepare(struct q6afe_port *port, struct q6afe_i2s_cfg *cfg);
2298c2ecf20Sopenharmony_civoid q6afe_tdm_port_prepare(struct q6afe_port *port, struct q6afe_tdm_cfg *cfg);
2308c2ecf20Sopenharmony_civoid q6afe_cdc_dma_port_prepare(struct q6afe_port *port,
2318c2ecf20Sopenharmony_ci				struct q6afe_cdc_dma_cfg *cfg);
2328c2ecf20Sopenharmony_ci
2338c2ecf20Sopenharmony_ciint q6afe_port_set_sysclk(struct q6afe_port *port, int clk_id,
2348c2ecf20Sopenharmony_ci			  int clk_src, int clk_root,
2358c2ecf20Sopenharmony_ci			  unsigned int freq, int dir);
2368c2ecf20Sopenharmony_ciint q6afe_set_lpass_clock(struct device *dev, int clk_id, int clk_src,
2378c2ecf20Sopenharmony_ci			  int clk_root, unsigned int freq);
2388c2ecf20Sopenharmony_ciint q6afe_vote_lpass_core_hw(struct device *dev, uint32_t hw_block_id,
2398c2ecf20Sopenharmony_ci			     char *client_name, uint32_t *client_handle);
2408c2ecf20Sopenharmony_ciint q6afe_unvote_lpass_core_hw(struct device *dev, uint32_t hw_block_id,
2418c2ecf20Sopenharmony_ci			       uint32_t client_handle);
2428c2ecf20Sopenharmony_ci#endif /* __Q6AFE_H__ */
243