diff --git a/arch/arm/mach-msm/qdsp6v2/audio_multi_aac.c b/arch/arm/mach-msm/qdsp6v2/audio_multi_aac.c index 92530561e567..fbd94c5dd8a4 100644 --- a/arch/arm/mach-msm/qdsp6v2/audio_multi_aac.c +++ b/arch/arm/mach-msm/qdsp6v2/audio_multi_aac.c @@ -42,13 +42,16 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) struct asm_aac_cfg aac_cfg; struct msm_audio_aac_config *aac_config; uint32_t sbr_ps = 0x00; + aac_config = (struct msm_audio_aac_config *)audio->codec_cfg; + aac_cfg.ch_cfg = aac_config->channel_configuration; + aac_cfg.sample_rate = audio->pcm_cfg.sample_rate; pr_debug("%s: AUDIO_START session_id[%d]\n", __func__, audio->ac->session); if (audio->feedback == NON_TUNNEL_MODE) { /* Configure PCM output block */ - rc = q6asm_enc_cfg_blk_pcm(audio->ac, - 0, /*native sampling rate*/ - 0 /*native channel count*/); + rc = q6asm_enc_cfg_blk_pcm_native(audio->ac, + aac_cfg.sample_rate, + aac_cfg.ch_cfg); if (rc < 0) { pr_err("pcm output block config failed\n"); break; @@ -58,7 +61,6 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) rc = q6asm_enable_sbrps(audio->ac, sbr_ps); if (rc < 0) pr_err("sbr-ps enable failed\n"); - aac_config = (struct msm_audio_aac_config *)audio->codec_cfg; if (aac_config->sbr_ps_on_flag) aac_cfg.aot = AAC_ENC_MODE_EAAC_P; else if (aac_config->sbr_on_flag) @@ -87,8 +89,6 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) aac_config->aac_scalefactor_data_resilience_flag; aac_cfg.spectral_data_resilience = aac_config->aac_spectral_data_resilience_flag; - aac_cfg.ch_cfg = aac_config->channel_configuration; - aac_cfg.sample_rate = audio->pcm_cfg.sample_rate; pr_debug("%s:format=%x aot=%d ch=%d sr=%d\n", __func__, aac_cfg.format, @@ -146,16 +146,14 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) AUDIO_AAC_DUAL_MONO_PL_PR) || (aac_config->dual_mono_mode > AUDIO_AAC_DUAL_MONO_PL_SR)) { - pr_err("%s:AUDIO_SET_AAC_CONFIG: Invalid" - "dual_mono mode =%d\n", __func__, - aac_config->dual_mono_mode); + pr_err("%s:AUDIO_SET_AAC_CONFIG: Invalid dual_mono mode =%d\n", + __func__, aac_config->dual_mono_mode); } else { /* convert the data from user into sce_left * and sce_right based on the definitions */ - pr_debug("%s: AUDIO_SET_AAC_CONFIG: modify" - "dual_mono mode =%d\n", __func__, - aac_config->dual_mono_mode); + pr_debug("%s: AUDIO_SET_AAC_CONFIG: modify dual_mono mode =%d\n", + __func__, aac_config->dual_mono_mode); switch (aac_config->dual_mono_mode) { case AUDIO_AAC_DUAL_MONO_PL_PR: sce_left = 1; @@ -178,8 +176,8 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) rc = q6asm_cfg_dual_mono_aac(audio->ac, sce_left, sce_right); if (rc < 0) - pr_err("%s: asm cmd dualmono failed" - " rc=%d\n", __func__, rc); + pr_err("%s: asm cmd dualmono failed rc=%d\n", + __func__, rc); } break; } break; @@ -212,8 +210,8 @@ static int audio_open(struct inode *inode, struct file *file) audio->codec_cfg = kzalloc(sizeof(struct msm_audio_aac_config), GFP_KERNEL); if (audio->codec_cfg == NULL) { - pr_err("%s: Could not allocate memory for aac" - "config\n", __func__); + pr_err("%s: Could not allocate memory for aac config\n", + __func__); kfree(audio); return -ENOMEM; } diff --git a/arch/arm/mach-msm/qdsp6v2/audio_utils_aio.c b/arch/arm/mach-msm/qdsp6v2/audio_utils_aio.c index 6a99be2ea506..fdc596d0b9e0 100644 --- a/arch/arm/mach-msm/qdsp6v2/audio_utils_aio.c +++ b/arch/arm/mach-msm/qdsp6v2/audio_utils_aio.c @@ -33,7 +33,7 @@ ssize_t audio_aio_debug_open(struct inode *inode, struct file *file) return 0; } -ssize_t audio_aio_debug_read(struct file *file, char __user * buf, +ssize_t audio_aio_debug_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { const int debug_bufmax = 4096; @@ -67,7 +67,7 @@ ssize_t audio_aio_debug_read(struct file *file, char __user * buf, } #endif -static int insert_eos_buf(struct q6audio_aio *audio, +int insert_eos_buf(struct q6audio_aio *audio, struct audio_aio_buffer_node *buf_node) { struct dec_meta_out *eos_buf = buf_node->kvaddr; @@ -93,7 +93,7 @@ static int insert_meta_data_flush(struct q6audio_aio *audio, sizeof(meta_data->meta_out_dsp[0]); } -static void extract_meta_out_info(struct q6audio_aio *audio, +void extract_meta_out_info(struct q6audio_aio *audio, struct audio_aio_buffer_node *buf_node, int dir) { struct dec_meta_out *meta_data = buf_node->kvaddr; @@ -114,8 +114,7 @@ static void extract_meta_out_info(struct q6audio_aio *audio, &buf_node->meta_info.meta_out, sizeof(struct dec_meta_out)); meta_data->meta_out_dsp[0].nflags = 0x00000000; - pr_debug("%s[%p]:o/p: msw_ts 0x%8x lsw_ts 0x%8x nflags 0x%8x," - "num_frames = %d\n", + pr_debug("%s[%p]:o/p: msw_ts 0x%8x lsw_ts 0x%8x nflags 0x%8x, num_frames = %d\n", __func__, audio, ((struct dec_meta_out *)buf_node->kvaddr)->\ meta_out_dsp[0].msw_ts, @@ -293,8 +292,8 @@ void audio_aio_async_write_ack(struct q6audio_aio *audio, uint32_t token, kfree(used_buf); if (list_empty(&audio->out_queue) && (audio->drv_status & ADRV_STATUS_FSYNC)) { - pr_debug("%s[%p]: list is empty, reached EOS in" - "Tunnel\n", __func__, audio); + pr_debug("%s[%p]: list is empty, reached EOS in Tunnel\n", + __func__, audio); wake_up(&audio->write_wait); } } else { @@ -304,60 +303,6 @@ void audio_aio_async_write_ack(struct q6audio_aio *audio, uint32_t token, } } -/* Read buffer from DSP / Handle Ack from DSP */ -void audio_aio_async_read_ack(struct q6audio_aio *audio, uint32_t token, - uint32_t *payload) -{ - unsigned long flags; - union msm_audio_event_payload event_payload; - struct audio_aio_buffer_node *filled_buf; - - /* No active flush in progress */ - if (audio->rflush) - return; - - /* Statistics of read */ - atomic_add(payload[2], &audio->in_bytes); - atomic_add(payload[7], &audio->in_samples); - - spin_lock_irqsave(&audio->dsp_lock, flags); - BUG_ON(list_empty(&audio->in_queue)); - filled_buf = list_first_entry(&audio->in_queue, - struct audio_aio_buffer_node, list); - if (token == (filled_buf->token)) { - list_del(&filled_buf->list); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - event_payload.aio_buf = filled_buf->buf; - /* Read done Buffer due to flush/normal condition - after EOS event, so append EOS buffer */ - if (audio->eos_rsp == 0x1) { - event_payload.aio_buf.data_len = - insert_eos_buf(audio, filled_buf); - /* Reset flag back to indicate eos intimated */ - audio->eos_rsp = 0; - } else { - filled_buf->meta_info.meta_out.num_of_frames = - payload[7]; - event_payload.aio_buf.data_len = payload[2] + \ - payload[3] + \ - sizeof(struct dec_meta_out); - pr_debug("%s[%p]:nr of frames 0x%8x len=%d\n", - __func__, audio, - filled_buf->meta_info.meta_out.num_of_frames, - event_payload.aio_buf.data_len); - extract_meta_out_info(audio, filled_buf, 0); - audio->eos_rsp = 0; - } - audio_aio_post_event(audio, AUDIO_EVENT_READ_DONE, - event_payload); - kfree(filled_buf); - } else { - pr_err("%s[%p]:expected=%lx ret=%x\n", - __func__, audio, filled_buf->token, token); - spin_unlock_irqrestore(&audio->dsp_lock, flags); - } -} - /* ------------------- device --------------------- */ void audio_aio_async_out_flush(struct q6audio_aio *audio) { @@ -404,8 +349,8 @@ void audio_aio_async_in_flush(struct q6audio_aio *audio) /* Forcefull send o/p eos buffer after flush, if no eos response * received by dsp even after sending eos command */ if ((audio->eos_rsp != 1) && audio->eos_flag) { - pr_debug("%s[%p]: send eos on o/p buffer during" - "flush\n", __func__, audio); + pr_debug("%s[%p]: send eos on o/p buffer during flush\n", + __func__, audio); payload.aio_buf = buf_node->buf; payload.aio_buf.data_len = insert_eos_buf(audio, buf_node); @@ -716,9 +661,7 @@ static int audio_aio_ion_check(struct q6audio_aio *audio, list_for_each_entry(region_elt, &audio->ion_region_queue, list) { if (CONTAINS(region_elt, &t) || CONTAINS(&t, region_elt) || OVERLAPS(region_elt, &t)) { - pr_err("%s[%p]:region (vaddr %p len %ld)" - " clashes with registered region" - " (vaddr %p paddr %p len %ld)\n", + pr_err("%s[%p]:region (vaddr %p len %ld) clashes with registered region (vaddr %p paddr %p len %ld)\n", __func__, audio, vaddr, len, region_elt->vaddr, (void *)region_elt->paddr, region_elt->len); @@ -870,8 +813,7 @@ static void audio_aio_async_write(struct q6audio_aio *audio, struct audio_client *ac; struct audio_aio_write_param param; - pr_debug("%s[%p]: Send write buff %p phy %lx len %d" - "meta_enable = %d\n", + pr_debug("%s[%p]: Send write buff %p phy %lx len %d meta_enable = %d\n", __func__, audio, buf_node, buf_node->paddr, buf_node->buf.data_len, audio->buf_cfg.meta_info_enable); @@ -973,8 +915,8 @@ static int audio_aio_buf_add(struct q6audio_aio *audio, unsigned dir, return -EFAULT; } - pr_debug("%s[%p]:node %p dir %x buf_addr %p buf_len %d data_len" - "%d\n", __func__, audio, buf_node, dir, buf_node->buf.buf_addr, + pr_debug("%s[%p]:node %p dir %x buf_addr %p buf_len %d data_len %d\n", + __func__, audio, buf_node, dir, buf_node->buf.buf_addr, buf_node->buf.buf_len, buf_node->buf.data_len); buf_node->paddr = audio_aio_ion_fixup(audio, buf_node->buf.buf_addr, buf_node->buf.buf_len, 1, @@ -1335,8 +1277,8 @@ long audio_aio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; } if (audio->feedback != NON_TUNNEL_MODE) { - pr_err("%s[%p]:Not sufficient permission to" - "change the playback mode\n", __func__, audio); + pr_err("%s[%p]:Not sufficient permission to change the playback mode\n", + __func__, audio); rc = -EACCES; mutex_unlock(&audio->lock); break; @@ -1379,8 +1321,8 @@ long audio_aio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; } case AUDIO_GET_BUF_CFG: { - pr_debug("%s[%p]:session id %d: Get-buf-cfg: meta[%d]" - "framesperbuf[%d]\n", __func__, audio, + pr_debug("%s[%p]:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n", + __func__, audio, audio->ac->session, audio->buf_cfg.meta_info_enable, audio->buf_cfg.frames_per_buf); diff --git a/arch/arm/mach-msm/qdsp6v2/audio_utils_aio.h b/arch/arm/mach-msm/qdsp6v2/audio_utils_aio.h index 77288da2c750..4a653047b637 100644 --- a/arch/arm/mach-msm/qdsp6v2/audio_utils_aio.h +++ b/arch/arm/mach-msm/qdsp6v2/audio_utils_aio.h @@ -195,6 +195,12 @@ void audio_aio_async_write_ack(struct q6audio_aio *audio, uint32_t token, void audio_aio_async_read_ack(struct q6audio_aio *audio, uint32_t token, uint32_t *payload); +int insert_eos_buf(struct q6audio_aio *audio, + struct audio_aio_buffer_node *buf_node); + +void extract_meta_out_info(struct q6audio_aio *audio, + struct audio_aio_buffer_node *buf_node, int dir); + int audio_aio_open(struct q6audio_aio *audio, struct file *file); int audio_aio_enable(struct q6audio_aio *audio); void audio_aio_post_event(struct q6audio_aio *audio, int type, @@ -206,6 +212,6 @@ void audio_aio_async_out_flush(struct q6audio_aio *audio); void audio_aio_async_in_flush(struct q6audio_aio *audio); #ifdef CONFIG_DEBUG_FS ssize_t audio_aio_debug_open(struct inode *inode, struct file *file); -ssize_t audio_aio_debug_read(struct file *file, char __user * buf, +ssize_t audio_aio_debug_read(struct file *file, char __user *buf, size_t count, loff_t *ppos); #endif diff --git a/arch/arm/mach-msm/qdsp6v2/q6audio_v1_aio.c b/arch/arm/mach-msm/qdsp6v2/q6audio_v1_aio.c index 112de625cfa5..078eea8b672f 100644 --- a/arch/arm/mach-msm/qdsp6v2/q6audio_v1_aio.c +++ b/arch/arm/mach-msm/qdsp6v2/q6audio_v1_aio.c @@ -97,9 +97,8 @@ void audio_aio_cb(uint32_t opcode, uint32_t token, "payload[2] = %d, payload[3] = %d\n", __func__, audio, payload[0], payload[1], payload[2], payload[3]); - pr_debug("%s[%p]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, " - "sr(prev) = %d, chl(prev) = %d,", - __func__, audio, audio->pcm_cfg.sample_rate, + pr_debug("%s[%p]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, sr(prev) = %d, chl(prev) = %d,", + __func__, audio, audio->pcm_cfg.sample_rate, audio->pcm_cfg.channel_count); audio->pcm_cfg.sample_rate = payload[0]; audio->pcm_cfg.channel_count = payload[1] & 0xFFFF; @@ -111,3 +110,57 @@ void audio_aio_cb(uint32_t opcode, uint32_t token, break; } } + +/* Read buffer from DSP / Handle Ack from DSP */ +void audio_aio_async_read_ack(struct q6audio_aio *audio, uint32_t token, + uint32_t *payload) +{ + unsigned long flags; + union msm_audio_event_payload event_payload; + struct audio_aio_buffer_node *filled_buf; + + /* No active flush in progress */ + if (audio->rflush) + return; + + /* Statistics of read */ + atomic_add(payload[2], &audio->in_bytes); + atomic_add(payload[7], &audio->in_samples); + + spin_lock_irqsave(&audio->dsp_lock, flags); + BUG_ON(list_empty(&audio->in_queue)); + filled_buf = list_first_entry(&audio->in_queue, + struct audio_aio_buffer_node, list); + if (token == (filled_buf->token)) { + list_del(&filled_buf->list); + spin_unlock_irqrestore(&audio->dsp_lock, flags); + event_payload.aio_buf = filled_buf->buf; + /* Read done Buffer due to flush/normal condition + after EOS event, so append EOS buffer */ + if (audio->eos_rsp == 0x1) { + event_payload.aio_buf.data_len = + insert_eos_buf(audio, filled_buf); + /* Reset flag back to indicate eos intimated */ + audio->eos_rsp = 0; + } else { + filled_buf->meta_info.meta_out.num_of_frames = + payload[7]; + event_payload.aio_buf.data_len = payload[2] + \ + payload[3] + \ + sizeof(struct dec_meta_out); + pr_debug("%s[%p]:nr of frames 0x%8x len=%d\n", + __func__, audio, + filled_buf->meta_info.meta_out.num_of_frames, + event_payload.aio_buf.data_len); + extract_meta_out_info(audio, filled_buf, 0); + audio->eos_rsp = 0; + } + audio_aio_post_event(audio, AUDIO_EVENT_READ_DONE, + event_payload); + kfree(filled_buf); + } else { + pr_err("%s[%p]:expected=%lx ret=%x\n", + __func__, audio, filled_buf->token, token); + spin_unlock_irqrestore(&audio->dsp_lock, flags); + } +} diff --git a/arch/arm/mach-msm/qdsp6v2/q6audio_v2_aio.c b/arch/arm/mach-msm/qdsp6v2/q6audio_v2_aio.c index aab7b1987d3d..ad4fc6f61002 100644 --- a/arch/arm/mach-msm/qdsp6v2/q6audio_v2_aio.c +++ b/arch/arm/mach-msm/qdsp6v2/q6audio_v2_aio.c @@ -91,14 +91,13 @@ void audio_aio_cb(uint32_t opcode, uint32_t token, break; case ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY: case ASM_DATA_EVENT_ENC_SR_CM_CHANGE_NOTIFY: - pr_debug("%s[%p]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, payload[0]-sr = %d, payload[1]-chl = %d, payload[2] = %d, payload[3] = %d\n", __func__, audio, payload[0], payload[1], payload[2], payload[3]); pr_debug("%s[%p]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, sr(prev) = %d, chl(prev) = %d,", - __func__, audio, audio->pcm_cfg.sample_rate, - audio->pcm_cfg.channel_count); + __func__, audio, audio->pcm_cfg.sample_rate, + audio->pcm_cfg.channel_count); audio->pcm_cfg.sample_rate = payload[0]; audio->pcm_cfg.channel_count = payload[1] & 0xFFFF; @@ -110,3 +109,61 @@ void audio_aio_cb(uint32_t opcode, uint32_t token, break; } } + +/* Read buffer from DSP / Handle Ack from DSP */ +void audio_aio_async_read_ack(struct q6audio_aio *audio, uint32_t token, + uint32_t *payload) +{ + unsigned long flags; + union msm_audio_event_payload event_payload; + struct audio_aio_buffer_node *filled_buf; + pr_debug("%s\n", __func__); + + /* No active flush in progress */ + if (audio->rflush) + return; + + /* Statistics of read */ + atomic_add(payload[4], &audio->in_bytes); + atomic_add(payload[9], &audio->in_samples); + + spin_lock_irqsave(&audio->dsp_lock, flags); + BUG_ON(list_empty(&audio->in_queue)); + filled_buf = list_first_entry(&audio->in_queue, + struct audio_aio_buffer_node, list); + + pr_debug("%s token: 0x[%d], filled_buf->token: 0x[%lu]", + __func__, token, filled_buf->token); + if (token == (filled_buf->token)) { + list_del(&filled_buf->list); + spin_unlock_irqrestore(&audio->dsp_lock, flags); + event_payload.aio_buf = filled_buf->buf; + /* Read done Buffer due to flush/normal condition + after EOS event, so append EOS buffer */ + if (audio->eos_rsp == 0x1) { + event_payload.aio_buf.data_len = + insert_eos_buf(audio, filled_buf); + /* Reset flag back to indicate eos intimated */ + audio->eos_rsp = 0; + } else { + filled_buf->meta_info.meta_out.num_of_frames\ + = payload[9]; + event_payload.aio_buf.data_len = payload[4]\ + + payload[5] + sizeof(struct dec_meta_out); + pr_debug("%s[%p]:nr of frames 0x%8x len=%d\n", + __func__, audio, + filled_buf->meta_info.meta_out.num_of_frames, + event_payload.aio_buf.data_len); + extract_meta_out_info(audio, filled_buf, 0); + audio->eos_rsp = 0; + } + pr_debug("%s, posting read done to the app here\n", __func__); + audio_aio_post_event(audio, AUDIO_EVENT_READ_DONE, + event_payload); + kfree(filled_buf); + } else { + pr_err("%s[%p]:expected=%lx ret=%x\n", + __func__, audio, filled_buf->token, token); + spin_unlock_irqrestore(&audio->dsp_lock, flags); + } +} diff --git a/include/sound/apr_audio-v2.h b/include/sound/apr_audio-v2.h index 695fea9ad21d..8e8778a4c049 100644 --- a/include/sound/apr_audio-v2.h +++ b/include/sound/apr_audio-v2.h @@ -2322,6 +2322,9 @@ struct asm_softvolume_params { } __packed; #define ASM_END_POINT_DEVICE_MATRIX 0 + +#define PCM_CHANNEL_NULL 0 + /* Front left channel. */ #define PCM_CHANNEL_FL 1 @@ -2444,7 +2447,7 @@ struct asm_multi_channel_pcm_fmt_blk_v2 { } __packed; struct asm_stream_cmd_set_encdec_param { - u32 param_id; + u32 param_id; /* ID of the parameter. */ u32 param_size; @@ -2573,9 +2576,6 @@ struct asm_aac_fmt_blk_v2 { * - 6 -- 5.1 content */ - u16 reserved; - /* Reserved. Clients must set this field to zero. */ - u16 total_size_of_PCE_bits; /* greater or equal to zero. * -In case of RAW formats and * channel config = 0 (PCE), client can send * the bit stream @@ -2986,6 +2986,8 @@ struct asm_wmastdv9_fmt_blk_v2 { u16 enc_options; /* Options used during encoding. */ + u16 reserved; + } __packed; #define ASM_MEDIA_FMT_WMA_V8 0x00010D91 @@ -4495,7 +4497,6 @@ struct asm_ac3_generic_param { struct asm_dec_out_chan_map_param { struct apr_hdr hdr; struct asm_stream_cmd_set_encdec_param encdec; - struct asm_enc_cfg_blk_param_v2 encblk; u32 num_channels; /* Number of decoder output channels. * Supported values: 0 to #MAX_CHAN_MAP_CHANNELS diff --git a/include/sound/q6asm-v2.h b/include/sound/q6asm-v2.h index 7ef15ac029cc..2a555b2d7b2f 100644 --- a/include/sound/q6asm-v2.h +++ b/include/sound/q6asm-v2.h @@ -64,8 +64,11 @@ /* Enable Sample_Rate/Channel_Mode notification event from Decoder */ #define SR_CM_NOTIFY_ENABLE 0x0004 -#define ASYNC_IO_MODE 0x0002 #define SYNC_IO_MODE 0x0001 +#define ASYNC_IO_MODE 0x0002 +#define NT_MODE 0x0400 + + #define NO_TIMESTAMP 0xFF00 #define SET_TIMESTAMP 0x0000 @@ -230,6 +233,9 @@ int q6asm_enc_cfg_blk_pcm(struct audio_client *ac, int q6asm_set_encdec_chan_map(struct audio_client *ac, uint32_t num_channels); +int q6asm_enc_cfg_blk_pcm_native(struct audio_client *ac, + uint32_t rate, uint32_t channels); + int q6asm_enable_sbrps(struct audio_client *ac, uint32_t sbr_ps); diff --git a/include/sound/q6asm.h b/include/sound/q6asm.h index ee907972549c..1e647a2d18ae 100644 --- a/include/sound/q6asm.h +++ b/include/sound/q6asm.h @@ -239,6 +239,9 @@ int q6asm_enc_cfg_blk_aac(struct audio_client *ac, int q6asm_enc_cfg_blk_pcm(struct audio_client *ac, uint32_t rate, uint32_t channels); +int q6asm_enc_cfg_blk_pcm_native(struct audio_client *ac, + uint32_t rate, uint32_t channels); + int q6asm_enc_cfg_blk_multi_ch_pcm(struct audio_client *ac, uint32_t rate, uint32_t channels); diff --git a/sound/soc/msm/qdsp6/q6asm.c b/sound/soc/msm/qdsp6/q6asm.c index 09bfd941ef38..50011a14be90 100644 --- a/sound/soc/msm/qdsp6/q6asm.c +++ b/sound/soc/msm/qdsp6/q6asm.c @@ -246,21 +246,20 @@ int q6asm_audio_client_buf_free(unsigned int dir, port->buf[cnt].handle); ion_client_destroy(port->buf[cnt].client); #else - pr_debug("%s:data[%p]phys[%p][%p] cnt[%d]" - "mem_buffer[%p]\n", + pr_debug("%s:data[%p]phys[%p][%p] cnt[%d] mem_buffer[%p]\n", __func__, (void *)port->buf[cnt].data, - (void *)port->buf[cnt].phys, - (void *)&port->buf[cnt].phys, cnt, - (void *)port->buf[cnt].mem_buffer); + (void *)port->buf[cnt].phys, + (void *)&port->buf[cnt].phys, cnt, + (void *)port->buf[cnt].mem_buffer); if (IS_ERR((void *)port->buf[cnt].mem_buffer)) - pr_err("%s:mem buffer invalid, error =" - "%ld\n", __func__, + pr_err("%s:mem buffer invalid, error = %ld\n", + __func__, PTR_ERR((void *)port->buf[cnt].mem_buffer)); else { if (iounmap( port->buf[cnt].mem_buffer) < 0) - pr_err("%s: unmap buffer" - " failed\n", __func__); + pr_err("%s: unmap buffer failed\n", + __func__); } free_contiguous_memory_by_paddr( port->buf[cnt].phys); @@ -306,8 +305,7 @@ int q6asm_audio_client_buf_free_contiguous(unsigned int dir, ion_unmap_kernel(port->buf[0].client, port->buf[0].handle); ion_free(port->buf[0].client, port->buf[0].handle); ion_client_destroy(port->buf[0].client); - pr_debug("%s:data[%p]phys[%p][%p]" - ", client[%p] handle[%p]\n", + pr_debug("%s:data[%p]phys[%p][%p], client[%p] handle[%p]\n", __func__, (void *)port->buf[0].data, (void *)port->buf[0].phys, @@ -315,22 +313,20 @@ int q6asm_audio_client_buf_free_contiguous(unsigned int dir, (void *)port->buf[0].client, (void *)port->buf[0].handle); #else - pr_debug("%s:data[%p]phys[%p][%p]" - "mem_buffer[%p]\n", + pr_debug("%s:data[%p]phys[%p][%p] mem_buffer[%p]\n", __func__, (void *)port->buf[0].data, (void *)port->buf[0].phys, (void *)&port->buf[0].phys, (void *)port->buf[0].mem_buffer); if (IS_ERR((void *)port->buf[0].mem_buffer)) - pr_err("%s:mem buffer invalid, error =" - "%ld\n", __func__, + pr_err("%s:mem buffer invalid, error = %ld\n", + __func__, PTR_ERR((void *)port->buf[0].mem_buffer)); else { if (iounmap( port->buf[0].mem_buffer) < 0) - pr_err("%s: unmap buffer" - " failed\n", __func__); + pr_err("%s: unmap buffer failed\n", __func__); } free_contiguous_memory_by_paddr(port->buf[0].phys); #endif @@ -433,8 +429,8 @@ struct audio_client *q6asm_audio_client_alloc(app_cb cb, void *priv) (apr_fn)q6asm_mmapcallback,\ 0x0FFFFFFFF, &this_mmap); if (this_mmap.apr == NULL) { - pr_debug("%s Unable to register \ - APR ASM common port \n", __func__); + pr_debug("%s Unable to register APR ASM common port\n", + __func__); goto fail; } } @@ -523,8 +519,7 @@ int q6asm_audio_client_buf_alloc(unsigned int dir, (UINT_MAX, "audio_client"); if (IS_ERR_OR_NULL((void *) buf[cnt].client)) { - pr_err("%s: ION create client" - " for AUDIO failed\n", + pr_err("%s: ION create client for AUDIO failed\n", __func__); mutex_unlock(&ac->cmd_lock); goto fail; @@ -534,8 +529,7 @@ int q6asm_audio_client_buf_alloc(unsigned int dir, (0x1 << ION_AUDIO_HEAP_ID)); if (IS_ERR_OR_NULL((void *) buf[cnt].handle)) { - pr_err("%s: ION memory" - " allocation for AUDIO failed\n", + pr_err("%s: ION memory allocation for AUDIO failed\n", __func__); mutex_unlock(&ac->cmd_lock); goto fail; @@ -547,8 +541,7 @@ int q6asm_audio_client_buf_alloc(unsigned int dir, &buf[cnt].phys, (size_t *)&len); if (rc) { - pr_err("%s: ION Get Physical" - " for AUDIO failed, rc = %d\n", + pr_err("%s: ION Get Physical for AUDIO failed, rc = %d\n", __func__, rc); mutex_unlock(&ac->cmd_lock); goto fail; @@ -559,8 +552,8 @@ int q6asm_audio_client_buf_alloc(unsigned int dir, 0); if (IS_ERR_OR_NULL((void *) buf[cnt].data)) { - pr_err("%s: ION memory" - " mapping for AUDIO failed\n", __func__); + pr_err("%s: ION memory mapping for AUDIO failed\n", + __func__); mutex_unlock(&ac->cmd_lock); goto fail; } @@ -571,8 +564,8 @@ int q6asm_audio_client_buf_alloc(unsigned int dir, allocate_contiguous_ebi_nomap(bufsz, SZ_4K); if (!buf[cnt].phys) { - pr_err("%s:Buf alloc failed " - " size=%d\n", __func__, + pr_err("%s:Buf alloc failed size=%d\n", + __func__, bufsz); mutex_unlock(&ac->cmd_lock); goto fail; @@ -581,17 +574,17 @@ int q6asm_audio_client_buf_alloc(unsigned int dir, ioremap(buf[cnt].phys, bufsz); if (IS_ERR( (void *)buf[cnt].mem_buffer)) { - pr_err("%s:map_buffer failed," - "error = %ld\n", - __func__, PTR_ERR((void *)buf[cnt].mem_buffer)); + pr_err("%s:map_buffer failed, error = %ld\n", + __func__, + PTR_ERR((void *)buf[cnt].mem_buffer)); mutex_unlock(&ac->cmd_lock); goto fail; } buf[cnt].data = buf[cnt].mem_buffer; if (!buf[cnt].data) { - pr_err("%s:invalid vaddr," - " iomap failed\n", __func__); + pr_err("%s:invalid vaddr, iomap failed\n", + __func__); mutex_unlock(&ac->cmd_lock); goto fail; } @@ -697,17 +690,15 @@ int q6asm_audio_client_buf_alloc_contiguous(unsigned int dir, buf[0].phys = allocate_contiguous_ebi_nomap(bufsz * bufcnt, SZ_4K); if (!buf[0].phys) { - pr_err("%s:Buf alloc failed " - " size=%d, bufcnt=%d\n", __func__, - bufsz, bufcnt); + pr_err("%s:Buf alloc failed size=%d, bufcnt=%d\n", + __func__, bufsz, bufcnt); mutex_unlock(&ac->cmd_lock); goto fail; } buf[0].mem_buffer = ioremap(buf[0].phys, bufsz * bufcnt); if (IS_ERR((void *)buf[cnt].mem_buffer)) { - pr_err("%s:map_buffer failed," - "error = %ld\n", + pr_err("%s:map_buffer failed, error = %ld\n", __func__, PTR_ERR((void *)buf[0].mem_buffer)); mutex_unlock(&ac->cmd_lock); @@ -716,8 +707,7 @@ int q6asm_audio_client_buf_alloc_contiguous(unsigned int dir, buf[0].data = buf[0].mem_buffer; #endif if (!buf[0].data) { - pr_err("%s:invalid vaddr," - " iomap failed\n", __func__); + pr_err("%s:invalid vaddr, iomap failed\n", __func__); mutex_unlock(&ac->cmd_lock); goto fail; } @@ -776,9 +766,8 @@ static int32_t q6asm_mmapcallback(struct apr_client_data *data, void *priv) return 0; } - pr_debug("%s:ptr0[0x%x]ptr1[0x%x]opcode[0x%x]" - "token[0x%x]payload_s[%d] src[%d] dest[%d]\n", __func__, - payload[0], payload[1], data->opcode, data->token, + pr_debug("%s:ptr0[0x%x]ptr1[0x%x]opcode[0x%x] token[0x%x]payload_s[%d] src[%d] dest[%d]\n", + __func__, payload[0], payload[1], data->opcode, data->token, data->payload_size, data->src_port, data->dest_port); if (data->opcode == APR_BASIC_RSP_RESULT) { @@ -836,8 +825,8 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv) return 0; } - pr_debug("%s: session[%d]opcode[0x%x] \ - token[0x%x]payload_s[%d] src[%d] dest[%d]\n", __func__, + pr_debug("%s: session[%d]opcode[0x%x] token[0x%x]payload_s[%d] src[%d] dest[%d]\n", + __func__, ac->session, data->opcode, data->token, data->payload_size, data->src_port, data->dest_port); @@ -915,9 +904,8 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv) out_cold_index*/ if (out_cold_index != 1) { do_gettimeofday(&out_cold_tv); - pr_debug("COLD: apr_send_pkt at %ld \ - sec %ld microsec\n",\ - out_cold_tv.tv_sec,\ + pr_debug("COLD: apr_send_pkt at %ld sec %ld microsec\n", + out_cold_tv.tv_sec, out_cold_tv.tv_usec); out_cold_index = 1; } @@ -953,8 +941,7 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv) */ if (in_cont_index == 7) { do_gettimeofday(&in_cont_tv); - pr_err("In_CONT:previous read buffer done \ - at %ld sec %ld microsec\n",\ + pr_err("In_CONT:previous read buffer done at %ld sec %ld microsec\n", in_cont_tv.tv_sec, in_cont_tv.tv_usec); } } @@ -971,9 +958,8 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv) payload[READDONE_IDX_ID], payload[READDONE_IDX_NUMFRAMES]); #ifdef CONFIG_DEBUG_FS - if (in_enable_flag) { + if (in_enable_flag) in_cont_index++; - } #endif if (ac->io_mode == SYNC_IO_MODE) { if (port->buf == NULL) { @@ -1009,9 +995,8 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv) pr_err("ASM_SESSION_EVENT_TX_OVERFLOW\n"); break; case ASM_SESSION_CMDRSP_GET_SESSION_TIME: - pr_debug("%s: ASM_SESSION_CMDRSP_GET_SESSION_TIME, " - "payload[0] = %d, payload[1] = %d, " - "payload[2] = %d\n", __func__, + pr_debug("%s: ASM_SESSION_CMDRSP_GET_SESSION_TIME, payload[0] = %d, payload[1] = %d, payload[2] = %d\n", + __func__, payload[0], payload[1], payload[2]); ac->time_stamp = (uint64_t)(((uint64_t)payload[1] << 32) | payload[2]); @@ -1022,9 +1007,8 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv) break; case ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY: case ASM_DATA_EVENT_ENC_SR_CM_NOTIFY: - pr_debug("%s: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, " - "payload[0] = %d, payload[1] = %d, " - "payload[2] = %d, payload[3] = %d\n", __func__, + pr_debug("%s: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, payload[0] = %d, payload[1] = %d, payload[2] = %d, payload[3] = %d\n", + __func__, payload[0], payload[1], payload[2], payload[3]); break; @@ -1061,8 +1045,8 @@ void *q6asm_is_cpu_buf_avail(int dir, struct audio_client *ac, uint32_t *size, if (port->buf[idx].used == dir) { /* To make it more robust, we could loop and get the next avail buf, its risky though */ - pr_debug("%s:Next buf idx[0x%x] not available,\ - dir[%d]\n", __func__, idx, dir); + pr_debug("%s:Next buf idx[0x%x] not available,dir[%d]\n", + __func__, idx, dir); mutex_unlock(&port->lock); return NULL; } @@ -1111,8 +1095,8 @@ void *q6asm_is_cpu_buf_avail_nolock(int dir, struct audio_client *ac, * To make it more robust, we could loop and get the * next avail buf, its risky though */ - pr_debug("%s:Next buf idx[0x%x] not available,\ - dir[%d]\n", __func__, idx, dir); + pr_debug("%s:Next buf idx[0x%x] not available, dir[%d]\n", + __func__, idx, dir); return NULL; } *size = port->buf[idx].actual_size; @@ -1594,8 +1578,8 @@ int q6asm_enc_cfg_blk_aac(struct audio_client *ac, struct asm_stream_cmd_encdec_cfg_blk enc_cfg; int rc = 0; - pr_debug("%s:session[%d]frames[%d]SR[%d]ch[%d]bitrate[%d]mode[%d]" - "format[%d]", __func__, ac->session, frames_per_buf, + pr_debug("%s:session[%d]frames[%d]SR[%d]ch[%d]bitrate[%d]mode[%d] format[%d]", + __func__, ac->session, frames_per_buf, sample_rate, channels, bit_rate, mode, format); q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); @@ -1670,6 +1654,47 @@ fail_cmd: return -EINVAL; } +int q6asm_enc_cfg_blk_pcm_native(struct audio_client *ac, + uint32_t rate, uint32_t channels) +{ + struct asm_stream_cmd_encdec_cfg_blk enc_cfg; + + int rc = 0; + + pr_debug("%s: Session %d, rate = %d, channels = %d, setting the rate and channels to 0 for native\n", + __func__, ac->session, rate, channels); + + q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); + + enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; + enc_cfg.param_id = ASM_ENCDEC_CFG_BLK_ID; + enc_cfg.param_size = sizeof(struct asm_encode_cfg_blk); + enc_cfg.enc_blk.frames_per_buf = 1; + enc_cfg.enc_blk.format_id = LINEAR_PCM; + enc_cfg.enc_blk.cfg_size = sizeof(struct asm_pcm_cfg); + enc_cfg.enc_blk.cfg.pcm.ch_cfg = 0;/*channels;*/ + enc_cfg.enc_blk.cfg.pcm.bits_per_sample = 16; + enc_cfg.enc_blk.cfg.pcm.sample_rate = 0;/*rate;*/ + enc_cfg.enc_blk.cfg.pcm.is_signed = 1; + enc_cfg.enc_blk.cfg.pcm.interleaved = 1; + + rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); + if (rc < 0) { + pr_err("Comamnd open failed\n"); + rc = -EINVAL; + goto fail_cmd; + } + rc = wait_event_timeout(ac->cmd_wait, + (atomic_read(&ac->cmd_state) == 0), 5*HZ); + if (!rc) { + pr_err("timeout opcode[0x%x] ", enc_cfg.hdr.opcode); + goto fail_cmd; + } + return 0; +fail_cmd: + return -EINVAL; +} + int q6asm_enc_cfg_blk_multi_ch_pcm(struct audio_client *ac, uint32_t rate, uint32_t channels) { @@ -1861,8 +1886,8 @@ int q6asm_enc_cfg_blk_qcelp(struct audio_client *ac, uint32_t frames_per_buf, struct asm_stream_cmd_encdec_cfg_blk enc_cfg; int rc = 0; - pr_debug("%s:session[%d]frames[%d]min_rate[0x%4x]max_rate[0x%4x] \ - reduced_rate_level[0x%4x]rate_modulation_cmd[0x%4x]", __func__, + pr_debug("%s:session[%d]frames[%d]min_rate[0x%4x]max_rate[0x%4x] reduced_rate_level[0x%4x]rate_modulation_cmd[0x%4x]", + __func__, ac->session, frames_per_buf, min_rate, max_rate, reduced_rate_level, rate_modulation_cmd); @@ -1904,8 +1929,8 @@ int q6asm_enc_cfg_blk_evrc(struct audio_client *ac, uint32_t frames_per_buf, struct asm_stream_cmd_encdec_cfg_blk enc_cfg; int rc = 0; - pr_debug("%s:session[%d]frames[%d]min_rate[0x%4x]max_rate[0x%4x] \ - rate_modulation_cmd[0x%4x]", __func__, ac->session, + pr_debug("%s:session[%d]frames[%d]min_rate[0x%4x]max_rate[0x%4x] rate_modulation_cmd[0x%4x]", + __func__, ac->session, frames_per_buf, min_rate, max_rate, rate_modulation_cmd); q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); @@ -2267,8 +2292,7 @@ int q6asm_media_format_block_wma(struct audio_client *ac, struct asm_wma_cfg *wma_cfg = (struct asm_wma_cfg *)cfg; int rc = 0; - pr_debug("session[%d]format_tag[0x%4x] rate[%d] ch[0x%4x] bps[%d],\ - balign[0x%4x], bit_sample[0x%4x], ch_msk[%d], enc_opt[0x%4x]\n", + pr_debug("session[%d]format_tag[0x%4x] rate[%d] ch[0x%4x] bps[%d], balign[0x%4x], bit_sample[0x%4x], ch_msk[%d], enc_opt[0x%4x]\n", ac->session, wma_cfg->format_tag, wma_cfg->sample_rate, wma_cfg->ch_cfg, wma_cfg->avg_bytes_per_sec, wma_cfg->block_align, wma_cfg->valid_bits_per_sample, @@ -2319,9 +2343,7 @@ int q6asm_media_format_block_wmapro(struct audio_client *ac, struct asm_wmapro_cfg *wmapro_cfg = (struct asm_wmapro_cfg *)cfg; int rc = 0; - pr_debug("session[%d]format_tag[0x%4x] rate[%d] ch[0x%4x] bps[%d]," - "balign[0x%4x], bit_sample[0x%4x], ch_msk[%d], enc_opt[0x%4x],\ - adv_enc_opt[0x%4x], adv_enc_opt2[0x%8x]\n", + pr_debug("session[%d]format_tag[0x%4x] rate[%d] ch[0x%4x] bps[%d], balign[0x%4x], bit_sample[0x%4x], ch_msk[%d], enc_opt[0x%4x], adv_enc_opt[0x%4x], adv_enc_opt2[0x%8x]\n", ac->session, wmapro_cfg->format_tag, wmapro_cfg->sample_rate, wmapro_cfg->ch_cfg, wmapro_cfg->avg_bytes_per_sec, wmapro_cfg->block_align, wmapro_cfg->valid_bits_per_sample, @@ -2778,8 +2800,8 @@ int q6asm_set_softpause(struct audio_client *ac, params->period = pause_param->period; params->step = pause_param->step; params->rampingcurve = pause_param->rampingcurve; - pr_debug("%s: soft Pause Command: enable = %d, period = %d," - "step = %d, curve = %d\n", __func__, params->enable, + pr_debug("%s: soft Pause Command: enable = %d, period = %d, step = %d, curve = %d\n", + __func__, params->enable, params->period, params->step, params->rampingcurve); rc = apr_send_pkt(ac->apr, (uint32_t *) vol_cmd); if (rc < 0) { @@ -2791,8 +2813,8 @@ int q6asm_set_softpause(struct audio_client *ac, rc = wait_event_timeout(ac->cmd_wait, (atomic_read(&ac->cmd_state) == 0), 5*HZ); if (!rc) { - pr_err("%s: timeout in sending volume command(soft_pause)" - "to apr\n", __func__); + pr_err("%s: timeout in sending volume command(soft_pause) to apr\n", + __func__); rc = -EINVAL; goto fail_cmd; } @@ -2837,13 +2859,13 @@ int q6asm_set_softvolume(struct audio_client *ac, params->period = softvol_param->period; params->step = softvol_param->step; params->rampingcurve = softvol_param->rampingcurve; - pr_debug("%s: soft Volume:opcode = %d,payload_sz =%d,module_id =%d," - "param_id = %d, param_sz = %d\n", __func__, + pr_debug("%s: soft Volume:opcode = %d,payload_sz =%d,module_id =%d, param_id = %d, param_sz = %d\n", + __func__, cmd->hdr.opcode, cmd->payload_size, cmd->params.module_id, cmd->params.param_id, cmd->params.param_size); - pr_debug("%s: soft Volume Command: period = %d," - "step = %d, curve = %d\n", __func__, params->period, + pr_debug("%s: soft Volume Command: period = %d, step = %d, curve = %d\n", + __func__, params->period, params->step, params->rampingcurve); rc = apr_send_pkt(ac->apr, (uint32_t *) vol_cmd); if (rc < 0) { @@ -2855,8 +2877,8 @@ int q6asm_set_softvolume(struct audio_client *ac, rc = wait_event_timeout(ac->cmd_wait, (atomic_read(&ac->cmd_state) == 0), 5*HZ); if (!rc) { - pr_err("%s: timeout in sending volume command(soft_volume)" - "to apr\n", __func__); + pr_err("%s: timeout in sending volume command(soft_volume) to apr\n", + __func__); rc = -EINVAL; goto fail_cmd; } @@ -3197,8 +3219,8 @@ int q6asm_write(struct audio_client *ac, uint32_t len, uint32_t msw_ts, if ((strncmp(((char *)ab->data), zero_pattern, 2)) && (!strncmp(((char *)ab->data + 2), zero_pattern, 2))) { do_gettimeofday(&out_warm_tv); - pr_debug("WARM:apr_send_pkt at \ - %ld sec %ld microsec\n", out_warm_tv.tv_sec,\ + pr_debug("WARM:apr_send_pkt at %ld sec %ld microsec\n", + out_warm_tv.tv_sec,\ out_warm_tv.tv_usec); pr_debug("Warm Pattern Matched"); } @@ -3207,8 +3229,8 @@ int q6asm_write(struct audio_client *ac, uint32_t len, uint32_t msw_ts, else if ((!strncmp(((char *)ab->data), zero_pattern, 2)) && (strncmp(((char *)ab->data + 2), zero_pattern, 2))) { do_gettimeofday(&out_cont_tv); - pr_debug("CONT:apr_send_pkt at \ - %ld sec %ld microsec\n", out_cont_tv.tv_sec,\ + pr_debug("CONT:apr_send_pkt at %ld sec %ld microsec\n", + out_cont_tv.tv_sec,\ out_cont_tv.tv_usec); pr_debug("Cont Pattern Matched"); } diff --git a/sound/soc/msm/qdsp6v2/q6asm.c b/sound/soc/msm/qdsp6v2/q6asm.c index f982134c7430..0bb88e8a99ae 100644 --- a/sound/soc/msm/qdsp6v2/q6asm.c +++ b/sound/soc/msm/qdsp6v2/q6asm.c @@ -84,6 +84,8 @@ static int q6asm_memory_unmap_regions(struct audio_client *ac, int dir, uint32_t bufsz, uint32_t bufcnt); static void q6asm_reset_buf_state(struct audio_client *ac); +static int q6asm_map_channels(u8 *channel_mapping, uint32_t channels); + #ifdef CONFIG_DEBUG_FS #define OUT_BUFFER_SIZE 56 @@ -196,8 +198,7 @@ static void config_debug_fs_write_cb(void) out_cold_index*/ if (out_cold_index != 1) { do_gettimeofday(&out_cold_tv); - pr_debug("COLD: apr_send_pkt at %ld" - "sec %ld microsec\n",\ + pr_debug("COLD: apr_send_pkt at %ld sec %ld microsec\n", out_cold_tv.tv_sec,\ out_cold_tv.tv_usec); out_cold_index = 1; @@ -222,8 +223,7 @@ static void config_debug_fs_read_cb(void) */ if (in_cont_index == 7) { do_gettimeofday(&in_cont_tv); - pr_err("In_CONT:previous read buffer done" - "at %ld sec %ld microsec\n",\ + pr_err("In_CONT:previous read buffer done at %ld sec %ld microsec\n", in_cont_tv.tv_sec, in_cont_tv.tv_usec); } in_cont_index++; @@ -253,8 +253,8 @@ static void config_debug_fs_write(struct audio_buffer *ab) if ((strncmp(((char *)ab->data), zero_pattern, 2)) && (!strncmp(((char *)ab->data + 2), zero_pattern, 2))) { do_gettimeofday(&out_warm_tv); - pr_debug("WARM:apr_send_pkt at" - "%ld sec %ld microsec\n", out_warm_tv.tv_sec,\ + pr_debug("WARM:apr_send_pkt at %ld sec %ld microsec\n", + out_warm_tv.tv_sec,\ out_warm_tv.tv_usec); pr_debug("Warm Pattern Matched"); } @@ -263,8 +263,8 @@ static void config_debug_fs_write(struct audio_buffer *ab) else if ((!strncmp(((char *)ab->data), zero_pattern, 2)) && (strncmp(((char *)ab->data + 2), zero_pattern, 2))) { do_gettimeofday(&out_cont_tv); - pr_debug("CONT:apr_send_pkt at" - "%ld sec %ld microsec\n", out_cont_tv.tv_sec,\ + pr_debug("CONT:apr_send_pkt at %ld sec %ld microsec\n", + out_cont_tv.tv_sec,\ out_cont_tv.tv_usec); pr_debug("Cont Pattern Matched"); } @@ -410,8 +410,7 @@ int q6asm_audio_client_buf_free_contiguous(unsigned int dir, ion_unmap_kernel(port->buf[0].client, port->buf[0].handle); ion_free(port->buf[0].client, port->buf[0].handle); ion_client_destroy(port->buf[0].client); - pr_debug("%s:data[%p]phys[%p][%p]" - ", client[%p] handle[%p]\n", + pr_debug("%s:data[%p]phys[%p][%p] , client[%p] handle[%p]\n", __func__, (void *)port->buf[0].data, (void *)port->buf[0].phys, @@ -479,13 +478,16 @@ void q6asm_audio_client_free(struct audio_client *ac) int q6asm_set_io_mode(struct audio_client *ac, uint32_t mode) { + ac->io_mode &= 0xFF00; + pr_debug("%s ac->mode after anding with FF00:0x[%x],\n", + __func__, ac->io_mode); if (ac == NULL) { pr_err("%s APR handle NULL\n", __func__); return -EINVAL; } if ((mode == ASYNC_IO_MODE) || (mode == SYNC_IO_MODE)) { - ac->io_mode = mode; - pr_debug("%s:Set Mode to %d\n", __func__, ac->io_mode); + ac->io_mode |= mode; + pr_debug("%s:Set Mode to 0x[%x]\n", __func__, ac->io_mode); return 0; } else { pr_err("%s:Not an valid IO Mode:%d\n", __func__, ac->io_mode); @@ -500,8 +502,8 @@ void *q6asm_mmap_apr_reg(void) (apr_fn)q6asm_mmapcallback,\ 0x0FFFFFFFF, &this_mmap); if (this_mmap.apr == NULL) { - pr_debug("%s Unable to register" - "APR ASM common port\n", __func__); + pr_debug("%s Unable to register APR ASM common port\n", + __func__); goto fail; } } @@ -624,8 +626,7 @@ int q6asm_audio_client_buf_alloc(unsigned int dir, (UINT_MAX, "audio_client"); if (IS_ERR_OR_NULL((void *) buf[cnt].client)) { - pr_err("%s: ION create client" - " for AUDIO failed\n", + pr_err("%s: ION create client for AUDIO failed\n", __func__); goto fail; } @@ -634,8 +635,7 @@ int q6asm_audio_client_buf_alloc(unsigned int dir, (0x1 << ION_AUDIO_HEAP_ID)); if (IS_ERR_OR_NULL((void *) buf[cnt].handle)) { - pr_err("%s: ION memory" - " allocation for AUDIO failed\n", + pr_err("%s: ION memory allocation for AUDIO failed\n", __func__); goto fail; } @@ -646,8 +646,7 @@ int q6asm_audio_client_buf_alloc(unsigned int dir, &buf[cnt].phys, (size_t *)&len); if (rc) { - pr_err("%s: ION Get Physical" - " for AUDIO failed, rc = %d\n", + pr_err("%s: ION Get Physical for AUDIO failed, rc = %d\n", __func__, rc); goto fail; } @@ -657,8 +656,8 @@ int q6asm_audio_client_buf_alloc(unsigned int dir, 0); if (IS_ERR_OR_NULL((void *) buf[cnt].data)) { - pr_err("%s: ION memory" - " mapping for AUDIO failed\n", __func__); + pr_err("%s: ION memory mapping for AUDIO failed\n", + __func__); goto fail; } memset((void *)buf[cnt].data, 0, bufsz); @@ -752,8 +751,7 @@ int q6asm_audio_client_buf_alloc_contiguous(unsigned int dir, } memset((void *)buf[0].data, 0, (bufsz * bufcnt)); if (!buf[0].data) { - pr_err("%s:invalid vaddr," - " iomap failed\n", __func__); + pr_err("%s:invalid vaddr, iomap failed\n", __func__); mutex_unlock(&ac->cmd_lock); goto fail; } @@ -822,8 +820,7 @@ static int32_t q6asm_mmapcallback(struct apr_client_data *data, void *priv) } sid = (data->token >> 8) & 0x0F; ac = q6asm_get_audio_client(sid); - pr_debug("%s:ptr0[0x%x]ptr1[0x%x]opcode[0x%x]" - "token[0x%x]payload_s[%d] src[%d] dest[%d]sid[%d]dir[%d]\n", + pr_debug("%s:ptr0[0x%x]ptr1[0x%x]opcode[0x%x] token[0x%x]payload_s[%d] src[%d] dest[%d]sid[%d]dir[%d]\n", __func__, payload[0], payload[1], data->opcode, data->token, data->payload_size, data->src_port, data->dest_port, sid, dir); pr_debug("%s:Payload = [0x%x] status[0x%x]\n", @@ -918,8 +915,8 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv) return 0; } - pr_debug("%s: session[%d]opcode[0x%x]" - "token[0x%x]payload_s[%d] src[%d] dest[%d]\n", __func__, + pr_debug("%s: session[%d]opcode[0x%x] token[0x%x]payload_s[%d] src[%d] dest[%d]\n", + __func__, ac->session, data->opcode, data->token, data->payload_size, data->src_port, data->dest_port); @@ -1060,9 +1057,8 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv) pr_err("ASM_SESSION_EVENTX_OVERFLOW\n"); break; case ASM_SESSION_CMDRSP_GET_SESSIONTIME_V3: - pr_debug("%s: ASM_SESSION_CMDRSP_GET_SESSIONTIME_V3, " - "payload[0] = %d, payload[1] = %d, " - "payload[2] = %d\n", __func__, + pr_debug("%s: ASM_SESSION_CMDRSP_GET_SESSIONTIME_V3, payload[0] = %d, payload[1] = %d, payload[2] = %d\n", + __func__, payload[0], payload[1], payload[2]); ac->time_stamp = (uint64_t)(((uint64_t)payload[1] << 32) | payload[2]); @@ -1073,9 +1069,8 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv) break; case ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY: case ASM_DATA_EVENT_ENC_SR_CM_CHANGE_NOTIFY: - pr_debug("%s: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, " - "payload[0] = %d, payload[1] = %d, " - "payload[2] = %d, payload[3] = %d\n", __func__, + pr_debug("%s: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, payload[0] = %d, payload[1] = %d, payload[2] = %d, payload[3] = %d\n", + __func__, payload[0], payload[1], payload[2], payload[3]); break; @@ -1112,8 +1107,8 @@ void *q6asm_is_cpu_buf_avail(int dir, struct audio_client *ac, uint32_t *size, if (port->buf[idx].used == dir) { /* To make it more robust, we could loop and get the next avail buf, its risky though */ - pr_debug("%s:Next buf idx[0x%x] not available," - "dir[%d]\n", __func__, idx, dir); + pr_debug("%s:Next buf idx[0x%x] not available, dir[%d]\n", + __func__, idx, dir); mutex_unlock(&port->lock); return NULL; } @@ -1162,8 +1157,8 @@ void *q6asm_is_cpu_buf_avail_nolock(int dir, struct audio_client *ac, * To make it more robust, we could loop and get the * next avail buf, its risky though */ - pr_debug("%s:Next buf idx[0x%x] not available," - "dir[%d]\n", __func__, idx, dir); + pr_debug("%s:Next buf idx[0x%x] not available, dir[%d]\n", + __func__, idx, dir); return NULL; } *size = port->buf[idx].actual_size; @@ -1427,6 +1422,7 @@ int q6asm_open_read_write(struct audio_client *ac, pr_debug("wr_format[0x%x]rd_format[0x%x]", wr_format, rd_format); + ac->io_mode |= NT_MODE; q6asm_add_hdr(ac, &open.hdr, sizeof(open), TRUE); open.hdr.opcode = ASM_STREAM_CMD_OPEN_READWRITE_V2; @@ -1593,8 +1589,8 @@ int q6asm_enc_cfg_blk_aac(struct audio_client *ac, struct asm_aac_enc_cfg_v2 enc_cfg; int rc = 0; - pr_debug("%s:session[%d]frames[%d]SR[%d]ch[%d]bitrate[%d]mode[%d]" - "format[%d]", __func__, ac->session, frames_per_buf, + pr_debug("%s:session[%d]frames[%d]SR[%d]ch[%d]bitrate[%d]mode[%d] format[%d]", + __func__, ac->session, frames_per_buf, sample_rate, channels, bit_rate, mode, format); q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); @@ -1632,8 +1628,41 @@ fail_cmd: int q6asm_set_encdec_chan_map(struct audio_client *ac, uint32_t num_channels) { - /* Todo: */ + struct asm_dec_out_chan_map_param chan_map; + u8 *channel_mapping; + int rc = 0; + pr_debug("%s: Session %d, num_channels = %d\n", + __func__, ac->session, num_channels); + q6asm_add_hdr(ac, &chan_map.hdr, sizeof(chan_map), TRUE); + chan_map.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; + chan_map.encdec.param_id = ASM_PARAM_ID_DEC_OUTPUT_CHAN_MAP; + chan_map.encdec.param_size = sizeof(struct asm_dec_out_chan_map_param) - + (sizeof(struct apr_hdr) + + sizeof(struct asm_stream_cmd_set_encdec_param)); + chan_map.num_channels = num_channels; + channel_mapping = chan_map.channel_mapping; + memset(channel_mapping, PCM_CHANNEL_NULL, MAX_CHAN_MAP_CHANNELS); + if (q6asm_map_channels(channel_mapping, num_channels)) + return -EINVAL; + + rc = apr_send_pkt(ac->apr, (uint32_t *) &chan_map); + if (rc < 0) { + pr_err("%s:Command opcode[0x%x]paramid[0x%x] failed\n", + __func__, ASM_STREAM_CMD_SET_ENCDEC_PARAM, + ASM_PARAM_ID_DEC_OUTPUT_CHAN_MAP); + goto fail_cmd; + } + rc = wait_event_timeout(ac->cmd_wait, + (atomic_read(&ac->cmd_state) == 0), 5*HZ); + if (!rc) { + pr_err("%s:timeout opcode[0x%x]\n", __func__, + chan_map.hdr.opcode); + rc = -ETIMEDOUT; + goto fail_cmd; + } return 0; +fail_cmd: + return rc; } int q6asm_enc_cfg_blk_pcm(struct audio_client *ac, @@ -1665,23 +1694,8 @@ int q6asm_enc_cfg_blk_pcm(struct audio_client *ac, memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - if (channels == 1) { - channel_mapping[0] = PCM_CHANNEL_FL; - } else if (channels == 2) { - channel_mapping[0] = PCM_CHANNEL_FL; - channel_mapping[1] = PCM_CHANNEL_FR; - } else if (channels == 6) { - channel_mapping[0] = PCM_CHANNEL_FC; - channel_mapping[1] = PCM_CHANNEL_FL; - channel_mapping[2] = PCM_CHANNEL_FR; - channel_mapping[3] = PCM_CHANNEL_LB; - channel_mapping[4] = PCM_CHANNEL_RB; - channel_mapping[5] = PCM_CHANNEL_LFE; - } else { - pr_err("%s: ERROR.unsupported num_ch = %u\n", __func__, - channels); + if (q6asm_map_channels(channel_mapping, channels)) return -EINVAL; - } rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); if (rc < 0) { @@ -1700,6 +1714,96 @@ fail_cmd: return -EINVAL; } +int q6asm_enc_cfg_blk_pcm_native(struct audio_client *ac, + uint32_t rate, uint32_t channels) +{ + struct asm_multi_channel_pcm_enc_cfg_v2 enc_cfg; + u8 *channel_mapping; + u32 frames_per_buf = 0; + + int rc = 0; + + pr_debug("%s: Session %d, rate = %d, channels = %d\n", __func__, + ac->session, rate, channels); + + q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); + + enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; + enc_cfg.encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; + enc_cfg.encdec.param_size = sizeof(enc_cfg) - sizeof(enc_cfg.hdr) - + sizeof(enc_cfg.encdec); + enc_cfg.encblk.frames_per_buf = frames_per_buf; + enc_cfg.encblk.enc_cfg_blk_size = enc_cfg.encdec.param_size - + sizeof(struct asm_enc_cfg_blk_param_v2); + + enc_cfg.num_channels = 0;/*channels;*/ + enc_cfg.bits_per_sample = 16; + enc_cfg.sample_rate = 0;/*rate;*/ + enc_cfg.is_signed = 1; + channel_mapping = enc_cfg.channel_mapping; /* ??? PHANI */ + + memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); + + if (q6asm_map_channels(channel_mapping, channels)) + return -EINVAL; + + rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg); + if (rc < 0) { + pr_err("Comamnd open failed\n"); + rc = -EINVAL; + goto fail_cmd; + } + rc = wait_event_timeout(ac->cmd_wait, + (atomic_read(&ac->cmd_state) == 0), 5*HZ); + if (!rc) { + pr_err("timeout opcode[0x%x] ", enc_cfg.hdr.opcode); + goto fail_cmd; + } + return 0; +fail_cmd: + return -EINVAL; +} + +static int q6asm_map_channels(u8 *channel_mapping, uint32_t channels) +{ + u8 *lchannel_mapping; + lchannel_mapping = channel_mapping; + pr_debug("%s channels passed: %d\n", __func__, channels); + if (channels == 1) { + lchannel_mapping[0] = PCM_CHANNEL_FC; + } else if (channels == 2) { + lchannel_mapping[0] = PCM_CHANNEL_FL; + lchannel_mapping[1] = PCM_CHANNEL_FR; + } else if (channels == 3) { + lchannel_mapping[0] = PCM_CHANNEL_FC; + lchannel_mapping[1] = PCM_CHANNEL_FL; + lchannel_mapping[2] = PCM_CHANNEL_FR; + } else if (channels == 4) { + lchannel_mapping[0] = PCM_CHANNEL_FC; + lchannel_mapping[1] = PCM_CHANNEL_FL; + lchannel_mapping[2] = PCM_CHANNEL_FR; + lchannel_mapping[3] = PCM_CHANNEL_LB; + } else if (channels == 5) { + lchannel_mapping[0] = PCM_CHANNEL_FC; + lchannel_mapping[1] = PCM_CHANNEL_FL; + lchannel_mapping[2] = PCM_CHANNEL_FR; + lchannel_mapping[3] = PCM_CHANNEL_LB; + lchannel_mapping[4] = PCM_CHANNEL_RB; + } else if (channels == 6) { + lchannel_mapping[0] = PCM_CHANNEL_FC; + lchannel_mapping[1] = PCM_CHANNEL_FL; + lchannel_mapping[2] = PCM_CHANNEL_FR; + lchannel_mapping[3] = PCM_CHANNEL_LB; + lchannel_mapping[4] = PCM_CHANNEL_RB; + lchannel_mapping[5] = PCM_CHANNEL_LFE; + } else { + pr_err("%s: ERROR.unsupported num_ch = %u\n", + __func__, channels); + return -EINVAL; + } + return 0; +} + int q6asm_enable_sbrps(struct audio_client *ac, uint32_t sbr_ps_enable) { @@ -1791,8 +1895,8 @@ int q6asm_enc_cfg_blk_qcelp(struct audio_client *ac, uint32_t frames_per_buf, struct asm_v13k_enc_cfg enc_cfg; int rc = 0; - pr_debug("%s:session[%d]frames[%d]min_rate[0x%4x]max_rate[0x%4x]" - "reduced_rate_level[0x%4x]rate_modulation_cmd[0x%4x]", __func__, + pr_debug("%s:session[%d]frames[%d]min_rate[0x%4x]max_rate[0x%4x] reduced_rate_level[0x%4x]rate_modulation_cmd[0x%4x]", + __func__, ac->session, frames_per_buf, min_rate, max_rate, reduced_rate_level, rate_modulation_cmd); @@ -1833,8 +1937,8 @@ int q6asm_enc_cfg_blk_evrc(struct audio_client *ac, uint32_t frames_per_buf, struct asm_evrc_enc_cfg enc_cfg; int rc = 0; - pr_debug("%s:session[%d]frames[%d]min_rate[0x%4x]max_rate[0x%4x]" - "rate_modulation_cmd[0x%4x]", __func__, ac->session, + pr_debug("%s:session[%d]frames[%d]min_rate[0x%4x]max_rate[0x%4x] rate_modulation_cmd[0x%4x]", + __func__, ac->session, frames_per_buf, min_rate, max_rate, rate_modulation_cmd); q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE); @@ -1972,23 +2076,8 @@ int q6asm_media_format_block_pcm(struct audio_client *ac, memset(channel_mapping, 0, PCM_FORMAT_MAX_NUM_CHANNEL); - if (channels == 1) { - channel_mapping[0] = PCM_CHANNEL_FL; - } else if (channels == 2) { - channel_mapping[0] = PCM_CHANNEL_FL; - channel_mapping[1] = PCM_CHANNEL_FR; - } else if (channels == 6) { - channel_mapping[0] = PCM_CHANNEL_FC; - channel_mapping[1] = PCM_CHANNEL_FL; - channel_mapping[2] = PCM_CHANNEL_FR; - channel_mapping[3] = PCM_CHANNEL_LB; - channel_mapping[4] = PCM_CHANNEL_RB; - channel_mapping[5] = PCM_CHANNEL_LFE; - } else { - pr_err("%s: ERROR.unsupported num_ch = %u\n", __func__, - channels); + if (q6asm_map_channels(channel_mapping, channels)) return -EINVAL; - } rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt); if (rc < 0) { @@ -2056,8 +2145,7 @@ int q6asm_media_format_block_wma(struct audio_client *ac, struct asm_wma_cfg *wma_cfg = (struct asm_wma_cfg *)cfg; int rc = 0; - pr_debug("session[%d]format_tag[0x%4x] rate[%d] ch[0x%4x] bps[%d]," - "balign[0x%4x], bit_sample[0x%4x], ch_msk[%d], enc_opt[0x%4x]\n", + pr_debug("session[%d]format_tag[0x%4x] rate[%d] ch[0x%4x] bps[%d], balign[0x%4x], bit_sample[0x%4x], ch_msk[%d], enc_opt[0x%4x]\n", ac->session, wma_cfg->format_tag, wma_cfg->sample_rate, wma_cfg->ch_cfg, wma_cfg->avg_bytes_per_sec, wma_cfg->block_align, wma_cfg->valid_bits_per_sample, @@ -2065,8 +2153,9 @@ int q6asm_media_format_block_wma(struct audio_client *ac, q6asm_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE); - fmt.hdr.opcode = ASM_MEDIA_FMT_WMA_V9_V2; - + fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; + fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - + sizeof(fmt.fmtblk); fmt.fmtag = wma_cfg->format_tag; fmt.num_channels = wma_cfg->ch_cfg; fmt.sample_rate = wma_cfg->sample_rate; @@ -2100,9 +2189,7 @@ int q6asm_media_format_block_wmapro(struct audio_client *ac, struct asm_wmapro_cfg *wmapro_cfg = (struct asm_wmapro_cfg *)cfg; int rc = 0; - pr_debug("session[%d]format_tag[0x%4x] rate[%d] ch[0x%4x] bps[%d]," - "balign[0x%4x], bit_sample[0x%4x], ch_msk[%d], enc_opt[0x%4x]," - "adv_enc_opt[0x%4x], adv_enc_opt2[0x%8x]\n", + pr_debug("session[%d]format_tag[0x%4x] rate[%d] ch[0x%4x] bps[%d], balign[0x%4x], bit_sample[0x%4x], ch_msk[%d], enc_opt[0x%4x], adv_enc_opt[0x%4x], adv_enc_opt2[0x%8x]\n", ac->session, wmapro_cfg->format_tag, wmapro_cfg->sample_rate, wmapro_cfg->ch_cfg, wmapro_cfg->avg_bytes_per_sec, wmapro_cfg->block_align, wmapro_cfg->valid_bits_per_sample, @@ -2111,7 +2198,9 @@ int q6asm_media_format_block_wmapro(struct audio_client *ac, q6asm_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE); - fmt.hdr.opcode = ASM_MEDIA_FMT_WMA_V10PRO_V2; + fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; + fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) - + sizeof(fmt.fmtblk); fmt.fmtag = wmapro_cfg->format_tag; fmt.num_channels = wmapro_cfg->ch_cfg; @@ -2147,12 +2236,10 @@ int q6asm_memory_map(struct audio_client *ac, uint32_t buf_add, int dir, struct avs_cmd_shared_mem_map_regions *mmap_regions = NULL; struct avs_shared_map_region_payload *mregions = NULL; struct audio_port_data *port = NULL; - struct audio_buffer *ab = NULL; void *mmap_region_cmd = NULL; void *payload = NULL; struct asm_buffer_node *buffer_node = NULL; int rc = 0; - int i = 0; int cmd_size = 0; if (!ac || ac->apr == NULL || ac->mmap_apr == NULL) { @@ -2181,21 +2268,18 @@ int q6asm_memory_map(struct audio_client *ac, uint32_t buf_add, int dir, mmap_regions->mem_pool_id = ADSP_MEMORY_MAP_EBI_POOL; mmap_regions->num_regions = bufcnt & 0x00ff; mmap_regions->property_flag = 0x00; - pr_debug("map_regions->nregions = %d\n", mmap_regions->num_regions); payload = ((u8 *) mmap_region_cmd + sizeof(struct avs_cmd_shared_mem_map_regions)); mregions = (struct avs_shared_map_region_payload *)payload; ac->port[dir].tmp_hdl = 0; port = &ac->port[dir]; - for (i = 0; i < bufcnt; i++) { - ab = &port->buf[i]; - mregions->shm_addr_lsw = ab->phys; - /* Using only 32 bit address */ - mregions->shm_addr_msw = 0; - mregions->mem_size_bytes = ab->size; - ++mregions; - } + pr_debug("%s, buf_add 0x%x, bufsz: %d\n", __func__, buf_add, bufsz); + mregions->shm_addr_lsw = buf_add; + /* Using only 32 bit address */ + mregions->shm_addr_msw = 0; + mregions->mem_size_bytes = bufsz; + ++mregions; rc = apr_send_pkt(ac->mmap_apr, (uint32_t *) mmap_region_cmd); if (rc < 0) { @@ -2295,7 +2379,7 @@ static int q6asm_memory_map_regions(struct audio_client *ac, int dir, void *payload = NULL; struct asm_buffer_node *buffer_node = NULL; int rc = 0; - int i = 0; + int i = 0; int cmd_size = 0; if (!ac || ac->apr == NULL || ac->mmap_apr == NULL) { @@ -2351,7 +2435,6 @@ static int q6asm_memory_map_regions(struct audio_client *ac, int dir, rc = wait_event_timeout(ac->cmd_wait, (atomic_read(&ac->cmd_state) == 0) , 5*HZ); - /*ac->port[dir].tmp_hdl), 5*HZ);*/ if (!rc) { pr_err("timeout. waited for memory_map\n"); rc = -EINVAL; @@ -2843,8 +2926,6 @@ int q6asm_read_nolock(struct audio_client *ac) read.buf_addr_lsw, read.hdr.token, read.seq_id); - pr_debug("q6asm_read_nolock mem-map handle is %x", - read.mem_map_handle); rc = apr_send_pkt(ac->apr, (uint32_t *) &read); if (rc < 0) { pr_err("read op[0x%x]rc[%d]\n", read.hdr.opcode, rc); @@ -2865,6 +2946,8 @@ int q6asm_async_write(struct audio_client *ac, struct list_head *ptr, *next; struct audio_buffer *ab; struct audio_port_data *port; + u32 lbuf_addr_lsw; + u32 liomode; if (!ac || ac->apr == NULL) { pr_err("%s: APR handle NULL\n", __func__); @@ -2884,11 +2967,21 @@ int q6asm_async_write(struct audio_client *ac, write.buf_size = param->len; write.timestamp_msw = param->msw_ts; write.timestamp_lsw = param->lsw_ts; - pr_debug("%s: token[0x%x], buf_addr_lsw[0x%x], buf_size[0x%x]," - "ts_msw[0x%x], ts_lsw[0x%x]\n", - __func__, write.hdr.token, write.buf_addr_lsw, + liomode = (ASYNC_IO_MODE | NT_MODE); + + if (ac->io_mode == liomode) { + pr_info("%s: subtracting 32 for header\n", __func__); + lbuf_addr_lsw = (write.buf_addr_lsw - 32); + } else{ + lbuf_addr_lsw = write.buf_addr_lsw; + } + + pr_debug("%s: token[0x%x], buf_addr_lsw[0x%x], buf_size[0x%x], ts_msw[0x%x], ts_lsw[0x%x], lbuf_addr_lsw: 0x[%x]\n", + __func__, + write.hdr.token, write.buf_addr_lsw, write.buf_size, write.timestamp_msw, - write.timestamp_lsw); + write.timestamp_lsw, lbuf_addr_lsw); + /* Use 0xFF00 for disabling timestamps */ if (param->flags == 0xFF00) write.flags = (0x00000000 | (param->flags & 0x800000FF)); @@ -2899,21 +2992,12 @@ int q6asm_async_write(struct audio_client *ac, list_for_each_safe(ptr, next, &ac->port[IN].mem_map_handle) { buf_node = list_entry(ptr, struct asm_buffer_node, list); - if (buf_node->buf_addr_lsw == (uint32_t)write.buf_addr_lsw) { + if (buf_node->buf_addr_lsw == lbuf_addr_lsw) { write.mem_map_handle = buf_node->mmap_hdl; - pr_debug("%s:buf_node->mmap_hdl = 0x%x," - "write.mem_map_handle = 0x%x\n", - __func__, - buf_node->mmap_hdl, - (uint32_t)write.mem_map_handle); break; } } - pr_debug("%s: session[%d] bufadd[0x%x]len[0x%x]," - "mem_map_handle[0x%x]\n", __func__, ac->session, - write.buf_addr_lsw, write.buf_size, write.mem_map_handle); - rc = apr_send_pkt(ac->apr, (uint32_t *) &write); if (rc < 0) { pr_debug("[%s] write op[0x%x]rc[%d]\n", __func__, @@ -2932,6 +3016,8 @@ int q6asm_async_read(struct audio_client *ac, struct asm_data_cmd_read_v2 read; struct asm_buffer_node *buf_node = NULL; struct list_head *ptr, *next; + u32 lbuf_addr_lsw; + u32 liomode; if (!ac || ac->apr == NULL) { pr_err("%s: APR handle NULL\n", __func__); @@ -2947,16 +3033,21 @@ int q6asm_async_read(struct audio_client *ac, read.buf_addr_msw = 0; read.buf_size = param->len; read.seq_id = param->uid; - - list_for_each_safe(ptr, next, &ac->port[IN].mem_map_handle) { - buf_node = list_entry(ptr, struct asm_buffer_node, - list); - if (buf_node->buf_addr_lsw == param->paddr) - read.mem_map_handle = buf_node->mmap_hdl; + liomode = (NT_MODE | ASYNC_IO_MODE); + if (ac->io_mode == liomode) { + pr_info("%s: subtracting 32 for header\n", __func__); + lbuf_addr_lsw = (read.buf_addr_lsw - 32); + } else{ + lbuf_addr_lsw = read.buf_addr_lsw; } - pr_debug("%s: session[%d] bufadd[0x%x]len[0x%x]", __func__, ac->session, - read.buf_addr_lsw, read.buf_size); + list_for_each_safe(ptr, next, &ac->port[IN].mem_map_handle) { + buf_node = list_entry(ptr, struct asm_buffer_node, list); + if (buf_node->buf_addr_lsw == lbuf_addr_lsw) { + read.mem_map_handle = buf_node->mmap_hdl; + break; + } + } rc = apr_send_pkt(ac->apr, (uint32_t *) &read); if (rc < 0) { @@ -3013,8 +3104,7 @@ int q6asm_write(struct audio_client *ac, uint32_t len, uint32_t msw_ts, list); write.mem_map_handle = buf_node->mmap_hdl; - pr_debug("%s:ab->phys[0x%x]bufadd[0x%x]" - "token[0x%x]buf_id[0x%x]buf_size[0x%x]mmaphdl[0x%x]" + pr_debug("%s:ab->phys[0x%x]bufadd[0x%x] token[0x%x]buf_id[0x%x]buf_size[0x%x]mmaphdl[0x%x]" , __func__, ab->phys, write.buf_addr_lsw, @@ -3081,8 +3171,7 @@ int q6asm_write_nolock(struct audio_client *ac, uint32_t len, uint32_t msw_ts, write.flags = (0x80000000 | flags); port->dsp_buf = (port->dsp_buf + 1) & (port->max_buf_cnt - 1); - pr_err("%s:ab->phys[0x%x]bufadd[0x%x]token[0x%x]" - "buf_id[0x%x]buf_size[0x%x]mmaphdl[0x%x]" + pr_debug("%s:ab->phys[0x%x]bufadd[0x%x]token[0x%x] buf_id[0x%x]buf_size[0x%x]mmaphdl[0x%x]" , __func__, ab->phys, write.buf_addr_lsw,