Commit 51d2584a authored by Srinivas Kandagatla's avatar Srinivas Kandagatla Committed by Mark Brown

ASoC: qcom: q6asm: add support to flac config

Qualcomm DSPs expect flac config to be set for flac decoders, so add the
API to program the flac config to the DSP
Signed-off-by: default avatarSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
Link: https://lore.kernel.org/r/20191115102705.649976-3-vkoul@kernel.orgSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent d2522335
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#define ASM_SESSION_CMD_RUN_V2 0x00010DAA #define ASM_SESSION_CMD_RUN_V2 0x00010DAA
#define ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2 0x00010DA5 #define ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2 0x00010DA5
#define ASM_MEDIA_FMT_MP3 0x00010BE9 #define ASM_MEDIA_FMT_MP3 0x00010BE9
#define ASM_MEDIA_FMT_FLAC 0x00010C16
#define ASM_DATA_CMD_WRITE_V2 0x00010DAB #define ASM_DATA_CMD_WRITE_V2 0x00010DAB
#define ASM_DATA_CMD_READ_V2 0x00010DAC #define ASM_DATA_CMD_READ_V2 0x00010DAC
#define ASM_SESSION_CMD_SUSPEND 0x00010DEC #define ASM_SESSION_CMD_SUSPEND 0x00010DEC
...@@ -89,6 +90,20 @@ struct asm_multi_channel_pcm_fmt_blk_v2 { ...@@ -89,6 +90,20 @@ struct asm_multi_channel_pcm_fmt_blk_v2 {
u8 channel_mapping[PCM_MAX_NUM_CHANNEL]; u8 channel_mapping[PCM_MAX_NUM_CHANNEL];
} __packed; } __packed;
struct asm_flac_fmt_blk_v2 {
struct asm_data_cmd_media_fmt_update_v2 fmt_blk;
u16 is_stream_info_present;
u16 num_channels;
u16 min_blk_size;
u16 max_blk_size;
u16 md5_sum[8];
u32 sample_rate;
u32 min_frame_size;
u32 max_frame_size;
u16 sample_size;
u16 reserved;
} __packed;
struct asm_stream_cmd_set_encdec_param { struct asm_stream_cmd_set_encdec_param {
u32 param_id; u32 param_id;
u32 param_size; u32 param_size;
...@@ -876,6 +891,9 @@ int q6asm_open_write(struct audio_client *ac, uint32_t format, ...@@ -876,6 +891,9 @@ int q6asm_open_write(struct audio_client *ac, uint32_t format,
case FORMAT_LINEAR_PCM: case FORMAT_LINEAR_PCM:
open->dec_fmt_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2; open->dec_fmt_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2;
break; break;
case SND_AUDIOCODEC_FLAC:
open->dec_fmt_id = ASM_MEDIA_FMT_FLAC;
break;
default: default:
dev_err(ac->dev, "Invalid format 0x%x\n", format); dev_err(ac->dev, "Invalid format 0x%x\n", format);
rc = -EINVAL; rc = -EINVAL;
...@@ -1021,6 +1039,42 @@ int q6asm_media_format_block_multi_ch_pcm(struct audio_client *ac, ...@@ -1021,6 +1039,42 @@ int q6asm_media_format_block_multi_ch_pcm(struct audio_client *ac,
} }
EXPORT_SYMBOL_GPL(q6asm_media_format_block_multi_ch_pcm); EXPORT_SYMBOL_GPL(q6asm_media_format_block_multi_ch_pcm);
int q6asm_stream_media_format_block_flac(struct audio_client *ac,
struct q6asm_flac_cfg *cfg)
{
struct asm_flac_fmt_blk_v2 *fmt;
struct apr_pkt *pkt;
void *p;
int rc, pkt_size;
pkt_size = APR_HDR_SIZE + sizeof(*fmt);
p = kzalloc(pkt_size, GFP_KERNEL);
if (!p)
return -ENOMEM;
pkt = p;
fmt = p + APR_HDR_SIZE;
q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, ac->stream_id);
pkt->hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2;
fmt->fmt_blk.fmt_blk_size = sizeof(*fmt) - sizeof(fmt->fmt_blk);
fmt->is_stream_info_present = cfg->stream_info_present;
fmt->num_channels = cfg->ch_cfg;
fmt->min_blk_size = cfg->min_blk_size;
fmt->max_blk_size = cfg->max_blk_size;
fmt->sample_rate = cfg->sample_rate;
fmt->min_frame_size = cfg->min_frame_size;
fmt->max_frame_size = cfg->max_frame_size;
fmt->sample_size = cfg->sample_size;
rc = q6asm_ac_send_cmd_sync(ac, pkt);
kfree(pkt);
return rc;
}
EXPORT_SYMBOL_GPL(q6asm_stream_media_format_block_flac);
/** /**
* q6asm_enc_cfg_blk_pcm_format_support() - setup pcm configuration for capture * q6asm_enc_cfg_blk_pcm_format_support() - setup pcm configuration for capture
* *
...@@ -1075,6 +1129,7 @@ int q6asm_enc_cfg_blk_pcm_format_support(struct audio_client *ac, ...@@ -1075,6 +1129,7 @@ int q6asm_enc_cfg_blk_pcm_format_support(struct audio_client *ac,
} }
EXPORT_SYMBOL_GPL(q6asm_enc_cfg_blk_pcm_format_support); EXPORT_SYMBOL_GPL(q6asm_enc_cfg_blk_pcm_format_support);
/** /**
* q6asm_read() - read data of period size from audio client * q6asm_read() - read data of period size from audio client
* *
......
...@@ -32,6 +32,19 @@ enum { ...@@ -32,6 +32,19 @@ enum {
#define NO_TIMESTAMP 0xFF00 #define NO_TIMESTAMP 0xFF00
#define FORMAT_LINEAR_PCM 0x0000 #define FORMAT_LINEAR_PCM 0x0000
struct q6asm_flac_cfg {
u32 sample_rate;
u32 ext_sample_rate;
u32 min_frame_size;
u32 max_frame_size;
u16 stream_info_present;
u16 min_blk_size;
u16 max_blk_size;
u16 ch_cfg;
u16 sample_size;
u16 md5_sum;
};
typedef void (*q6asm_cb) (uint32_t opcode, uint32_t token, typedef void (*q6asm_cb) (uint32_t opcode, uint32_t token,
void *payload, void *priv); void *payload, void *priv);
struct audio_client; struct audio_client;
...@@ -54,6 +67,8 @@ int q6asm_media_format_block_multi_ch_pcm(struct audio_client *ac, ...@@ -54,6 +67,8 @@ int q6asm_media_format_block_multi_ch_pcm(struct audio_client *ac,
uint32_t rate, uint32_t channels, uint32_t rate, uint32_t channels,
u8 channel_map[PCM_MAX_NUM_CHANNEL], u8 channel_map[PCM_MAX_NUM_CHANNEL],
uint16_t bits_per_sample); uint16_t bits_per_sample);
int q6asm_stream_media_format_block_flac(struct audio_client *ac,
struct q6asm_flac_cfg *cfg);
int q6asm_run(struct audio_client *ac, uint32_t flags, uint32_t msw_ts, int q6asm_run(struct audio_client *ac, uint32_t flags, uint32_t msw_ts,
uint32_t lsw_ts); uint32_t lsw_ts);
int q6asm_run_nowait(struct audio_client *ac, uint32_t flags, uint32_t msw_ts, int q6asm_run_nowait(struct audio_client *ac, uint32_t flags, uint32_t msw_ts,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment