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