162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef __Q6_ASM_H__
362306a36Sopenharmony_ci#define __Q6_ASM_H__
462306a36Sopenharmony_ci#include "q6dsp-common.h"
562306a36Sopenharmony_ci#include <dt-bindings/sound/qcom,q6asm.h>
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci/* ASM client callback events */
862306a36Sopenharmony_ci#define CMD_PAUSE			0x0001
962306a36Sopenharmony_ci#define ASM_CLIENT_EVENT_CMD_PAUSE_DONE		0x1001
1062306a36Sopenharmony_ci#define CMD_FLUSH				0x0002
1162306a36Sopenharmony_ci#define ASM_CLIENT_EVENT_CMD_FLUSH_DONE		0x1002
1262306a36Sopenharmony_ci#define CMD_EOS				0x0003
1362306a36Sopenharmony_ci#define ASM_CLIENT_EVENT_CMD_EOS_DONE		0x1003
1462306a36Sopenharmony_ci#define CMD_CLOSE				0x0004
1562306a36Sopenharmony_ci#define ASM_CLIENT_EVENT_CMD_CLOSE_DONE		0x1004
1662306a36Sopenharmony_ci#define CMD_OUT_FLUSH				0x0005
1762306a36Sopenharmony_ci#define ASM_CLIENT_EVENT_CMD_OUT_FLUSH_DONE	0x1005
1862306a36Sopenharmony_ci#define CMD_SUSPEND				0x0006
1962306a36Sopenharmony_ci#define ASM_CLIENT_EVENT_CMD_SUSPEND_DONE	0x1006
2062306a36Sopenharmony_ci#define ASM_CLIENT_EVENT_CMD_RUN_DONE		0x1008
2162306a36Sopenharmony_ci#define ASM_CLIENT_EVENT_DATA_WRITE_DONE	0x1009
2262306a36Sopenharmony_ci#define ASM_CLIENT_EVENT_DATA_READ_DONE		0x100a
2362306a36Sopenharmony_ci#define ASM_WRITE_TOKEN_MASK			GENMASK(15, 0)
2462306a36Sopenharmony_ci#define ASM_WRITE_TOKEN_LEN_MASK		GENMASK(31, 16)
2562306a36Sopenharmony_ci#define ASM_WRITE_TOKEN_LEN_SHIFT		16
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cienum {
2862306a36Sopenharmony_ci	LEGACY_PCM_MODE = 0,
2962306a36Sopenharmony_ci	LOW_LATENCY_PCM_MODE,
3062306a36Sopenharmony_ci	ULTRA_LOW_LATENCY_PCM_MODE,
3162306a36Sopenharmony_ci	ULL_POST_PROCESSING_PCM_MODE,
3262306a36Sopenharmony_ci};
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#define MAX_SESSIONS	8
3562306a36Sopenharmony_ci#define FORMAT_LINEAR_PCM   0x0000
3662306a36Sopenharmony_ci#define ASM_LAST_BUFFER_FLAG           BIT(30)
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistruct q6asm_flac_cfg {
3962306a36Sopenharmony_ci        u32 sample_rate;
4062306a36Sopenharmony_ci        u32 ext_sample_rate;
4162306a36Sopenharmony_ci        u32 min_frame_size;
4262306a36Sopenharmony_ci        u32 max_frame_size;
4362306a36Sopenharmony_ci        u16 stream_info_present;
4462306a36Sopenharmony_ci        u16 min_blk_size;
4562306a36Sopenharmony_ci        u16 max_blk_size;
4662306a36Sopenharmony_ci        u16 ch_cfg;
4762306a36Sopenharmony_ci        u16 sample_size;
4862306a36Sopenharmony_ci        u16 md5_sum;
4962306a36Sopenharmony_ci};
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistruct q6asm_wma_cfg {
5262306a36Sopenharmony_ci	u32 fmtag;
5362306a36Sopenharmony_ci	u32 num_channels;
5462306a36Sopenharmony_ci	u32 sample_rate;
5562306a36Sopenharmony_ci	u32 bytes_per_sec;
5662306a36Sopenharmony_ci	u32 block_align;
5762306a36Sopenharmony_ci	u32 bits_per_sample;
5862306a36Sopenharmony_ci	u32 channel_mask;
5962306a36Sopenharmony_ci	u32 enc_options;
6062306a36Sopenharmony_ci	u32 adv_enc_options;
6162306a36Sopenharmony_ci	u32 adv_enc_options2;
6262306a36Sopenharmony_ci};
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistruct q6asm_alac_cfg {
6562306a36Sopenharmony_ci	u32 frame_length;
6662306a36Sopenharmony_ci	u8 compatible_version;
6762306a36Sopenharmony_ci	u8 bit_depth;
6862306a36Sopenharmony_ci	u8 pb;
6962306a36Sopenharmony_ci	u8 mb;
7062306a36Sopenharmony_ci	u8 kb;
7162306a36Sopenharmony_ci	u8 num_channels;
7262306a36Sopenharmony_ci	u16 max_run;
7362306a36Sopenharmony_ci	u32 max_frame_bytes;
7462306a36Sopenharmony_ci	u32 avg_bit_rate;
7562306a36Sopenharmony_ci	u32 sample_rate;
7662306a36Sopenharmony_ci	u32 channel_layout_tag;
7762306a36Sopenharmony_ci};
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cistruct q6asm_ape_cfg {
8062306a36Sopenharmony_ci	u16 compatible_version;
8162306a36Sopenharmony_ci	u16 compression_level;
8262306a36Sopenharmony_ci	u32 format_flags;
8362306a36Sopenharmony_ci	u32 blocks_per_frame;
8462306a36Sopenharmony_ci	u32 final_frame_blocks;
8562306a36Sopenharmony_ci	u32 total_frames;
8662306a36Sopenharmony_ci	u16 bits_per_sample;
8762306a36Sopenharmony_ci	u16 num_channels;
8862306a36Sopenharmony_ci	u32 sample_rate;
8962306a36Sopenharmony_ci	u32 seek_table_present;
9062306a36Sopenharmony_ci};
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_citypedef void (*q6asm_cb) (uint32_t opcode, uint32_t token,
9362306a36Sopenharmony_ci			  void *payload, void *priv);
9462306a36Sopenharmony_cistruct audio_client;
9562306a36Sopenharmony_cistruct audio_client *q6asm_audio_client_alloc(struct device *dev,
9662306a36Sopenharmony_ci					      q6asm_cb cb, void *priv,
9762306a36Sopenharmony_ci					      int session_id, int perf_mode);
9862306a36Sopenharmony_civoid q6asm_audio_client_free(struct audio_client *ac);
9962306a36Sopenharmony_ciint q6asm_write_async(struct audio_client *ac, uint32_t stream_id, uint32_t len,
10062306a36Sopenharmony_ci		      uint32_t msw_ts, uint32_t lsw_ts, uint32_t wflags);
10162306a36Sopenharmony_ciint q6asm_open_write(struct audio_client *ac, uint32_t stream_id,
10262306a36Sopenharmony_ci		     uint32_t format, u32 codec_profile,
10362306a36Sopenharmony_ci		     uint16_t bits_per_sample, bool is_gapless);
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ciint q6asm_open_read(struct audio_client *ac, uint32_t stream_id,
10662306a36Sopenharmony_ci		    uint32_t format, uint16_t bits_per_sample);
10762306a36Sopenharmony_ciint q6asm_enc_cfg_blk_pcm_format_support(struct audio_client *ac,
10862306a36Sopenharmony_ci					 uint32_t stream_id, uint32_t rate,
10962306a36Sopenharmony_ci					 uint32_t channels,
11062306a36Sopenharmony_ci					 uint16_t bits_per_sample);
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ciint q6asm_read(struct audio_client *ac, uint32_t stream_id);
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ciint q6asm_media_format_block_multi_ch_pcm(struct audio_client *ac,
11562306a36Sopenharmony_ci					  uint32_t stream_id,
11662306a36Sopenharmony_ci					  uint32_t rate, uint32_t channels,
11762306a36Sopenharmony_ci					  u8 channel_map[PCM_MAX_NUM_CHANNEL],
11862306a36Sopenharmony_ci					  uint16_t bits_per_sample);
11962306a36Sopenharmony_ciint q6asm_stream_media_format_block_flac(struct audio_client *ac,
12062306a36Sopenharmony_ci					 uint32_t stream_id,
12162306a36Sopenharmony_ci					 struct q6asm_flac_cfg *cfg);
12262306a36Sopenharmony_ciint q6asm_stream_media_format_block_wma_v9(struct audio_client *ac,
12362306a36Sopenharmony_ci					   uint32_t stream_id,
12462306a36Sopenharmony_ci					   struct q6asm_wma_cfg *cfg);
12562306a36Sopenharmony_ciint q6asm_stream_media_format_block_wma_v10(struct audio_client *ac,
12662306a36Sopenharmony_ci					    uint32_t stream_id,
12762306a36Sopenharmony_ci					    struct q6asm_wma_cfg *cfg);
12862306a36Sopenharmony_ciint q6asm_stream_media_format_block_alac(struct audio_client *ac,
12962306a36Sopenharmony_ci					 uint32_t stream_id,
13062306a36Sopenharmony_ci					 struct q6asm_alac_cfg *cfg);
13162306a36Sopenharmony_ciint q6asm_stream_media_format_block_ape(struct audio_client *ac,
13262306a36Sopenharmony_ci					uint32_t stream_id,
13362306a36Sopenharmony_ci					struct q6asm_ape_cfg *cfg);
13462306a36Sopenharmony_ciint q6asm_run(struct audio_client *ac, uint32_t stream_id, uint32_t flags,
13562306a36Sopenharmony_ci	      uint32_t msw_ts, uint32_t lsw_ts);
13662306a36Sopenharmony_ciint q6asm_run_nowait(struct audio_client *ac, uint32_t stream_id,
13762306a36Sopenharmony_ci		     uint32_t flags, uint32_t msw_ts, uint32_t lsw_ts);
13862306a36Sopenharmony_ciint q6asm_stream_remove_initial_silence(struct audio_client *ac,
13962306a36Sopenharmony_ci					uint32_t stream_id,
14062306a36Sopenharmony_ci					uint32_t initial_samples);
14162306a36Sopenharmony_ciint q6asm_stream_remove_trailing_silence(struct audio_client *ac,
14262306a36Sopenharmony_ci					 uint32_t stream_id,
14362306a36Sopenharmony_ci					 uint32_t trailing_samples);
14462306a36Sopenharmony_ciint q6asm_cmd(struct audio_client *ac, uint32_t stream_id,  int cmd);
14562306a36Sopenharmony_ciint q6asm_cmd_nowait(struct audio_client *ac, uint32_t stream_id,  int cmd);
14662306a36Sopenharmony_ciint q6asm_get_session_id(struct audio_client *c);
14762306a36Sopenharmony_ciint q6asm_map_memory_regions(unsigned int dir,
14862306a36Sopenharmony_ci			     struct audio_client *ac,
14962306a36Sopenharmony_ci			     phys_addr_t phys,
15062306a36Sopenharmony_ci			     size_t period_sz, unsigned int periods);
15162306a36Sopenharmony_ciint q6asm_unmap_memory_regions(unsigned int dir, struct audio_client *ac);
15262306a36Sopenharmony_ci#endif /* __Q6_ASM_H__ */
153