Lines Matching +full:port +full:- +full:phys

1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2011-2017, The Linux Foundation. All rights reserved.
21 #include "q6dsp-errno.h"
22 #include "q6dsp-common.h"
241 phys_addr_t phys; member
270 /* idx:1 out port, 0: in port */
271 struct audio_port_data port[2]; member
283 hdr->hdr_field = APR_SEQ_CMD_HDR_FIELD; in q6asm_add_hdr()
284 hdr->src_port = ((ac->session << 8) & 0xFF00) | (stream_id); in q6asm_add_hdr()
285 hdr->dest_port = ((ac->session << 8) & 0xFF00) | (stream_id); in q6asm_add_hdr()
286 hdr->pkt_size = pkt_size; in q6asm_add_hdr()
288 hdr->token = ac->session; in q6asm_add_hdr()
294 struct apr_hdr *hdr = &pkt->hdr; in q6asm_apr_send_session_pkt()
297 mutex_lock(&ac->cmd_lock); in q6asm_apr_send_session_pkt()
298 ac->result.opcode = 0; in q6asm_apr_send_session_pkt()
299 ac->result.status = 0; in q6asm_apr_send_session_pkt()
300 rc = apr_send_pkt(a->adev, pkt); in q6asm_apr_send_session_pkt()
305 rc = wait_event_timeout(a->mem_wait, in q6asm_apr_send_session_pkt()
306 (ac->result.opcode == hdr->opcode) || in q6asm_apr_send_session_pkt()
307 (ac->result.opcode == rsp_opcode), in q6asm_apr_send_session_pkt()
310 rc = wait_event_timeout(a->mem_wait, in q6asm_apr_send_session_pkt()
311 (ac->result.opcode == hdr->opcode), in q6asm_apr_send_session_pkt()
315 dev_err(a->dev, "CMD %x timeout\n", hdr->opcode); in q6asm_apr_send_session_pkt()
316 rc = -ETIMEDOUT; in q6asm_apr_send_session_pkt()
317 } else if (ac->result.status > 0) { in q6asm_apr_send_session_pkt()
318 dev_err(a->dev, "DSP returned error[%x]\n", in q6asm_apr_send_session_pkt()
319 ac->result.status); in q6asm_apr_send_session_pkt()
320 rc = -EINVAL; in q6asm_apr_send_session_pkt()
324 mutex_unlock(&ac->cmd_lock); in q6asm_apr_send_session_pkt()
332 struct q6asm *a = dev_get_drvdata(ac->dev->parent); in __q6asm_memory_unmap()
337 if (ac->port[dir].mem_map_handle == 0) { in __q6asm_memory_unmap()
338 dev_err(ac->dev, "invalid mem handle\n"); in __q6asm_memory_unmap()
339 return -EINVAL; in __q6asm_memory_unmap()
345 return -ENOMEM; in __q6asm_memory_unmap()
350 pkt->hdr.hdr_field = APR_SEQ_CMD_HDR_FIELD; in __q6asm_memory_unmap()
351 pkt->hdr.src_port = 0; in __q6asm_memory_unmap()
352 pkt->hdr.dest_port = 0; in __q6asm_memory_unmap()
353 pkt->hdr.pkt_size = pkt_size; in __q6asm_memory_unmap()
354 pkt->hdr.token = ((ac->session << 8) | dir); in __q6asm_memory_unmap()
356 pkt->hdr.opcode = ASM_CMD_SHARED_MEM_UNMAP_REGIONS; in __q6asm_memory_unmap()
357 mem_unmap->mem_map_handle = ac->port[dir].mem_map_handle; in __q6asm_memory_unmap()
365 ac->port[dir].mem_map_handle = 0; in __q6asm_memory_unmap()
373 struct audio_port_data *port) in q6asm_audio_client_free_buf() argument
377 spin_lock_irqsave(&ac->lock, flags); in q6asm_audio_client_free_buf()
378 port->num_periods = 0; in q6asm_audio_client_free_buf()
379 kfree(port->buf); in q6asm_audio_client_free_buf()
380 port->buf = NULL; in q6asm_audio_client_free_buf()
381 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_audio_client_free_buf()
385 * q6asm_unmap_memory_regions() - unmap memory regions in the dsp.
394 struct audio_port_data *port; in q6asm_unmap_memory_regions() local
398 port = &ac->port[dir]; in q6asm_unmap_memory_regions()
399 if (!port->buf) { in q6asm_unmap_memory_regions()
400 rc = -EINVAL; in q6asm_unmap_memory_regions()
404 cnt = port->num_periods - 1; in q6asm_unmap_memory_regions()
406 rc = __q6asm_memory_unmap(ac, port->buf[dir].phys, dir); in q6asm_unmap_memory_regions()
408 dev_err(ac->dev, "%s: Memory_unmap_regions failed %d\n", in q6asm_unmap_memory_regions()
414 q6asm_audio_client_free_buf(ac, port); in q6asm_unmap_memory_regions()
427 struct q6asm *a = dev_get_drvdata(ac->dev->parent); in __q6asm_memory_map_regions()
428 struct audio_port_data *port = NULL; in __q6asm_memory_map_regions() local
452 return -ENOMEM; in __q6asm_memory_map_regions()
458 pkt->hdr.hdr_field = APR_SEQ_CMD_HDR_FIELD; in __q6asm_memory_map_regions()
459 pkt->hdr.src_port = 0; in __q6asm_memory_map_regions()
460 pkt->hdr.dest_port = 0; in __q6asm_memory_map_regions()
461 pkt->hdr.pkt_size = pkt_size; in __q6asm_memory_map_regions()
462 pkt->hdr.token = ((ac->session << 8) | dir); in __q6asm_memory_map_regions()
463 pkt->hdr.opcode = ASM_CMD_SHARED_MEM_MAP_REGIONS; in __q6asm_memory_map_regions()
465 cmd->mem_pool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL; in __q6asm_memory_map_regions()
466 cmd->num_regions = num_regions; in __q6asm_memory_map_regions()
467 cmd->property_flag = 0x00; in __q6asm_memory_map_regions()
469 spin_lock_irqsave(&ac->lock, flags); in __q6asm_memory_map_regions()
470 port = &ac->port[dir]; in __q6asm_memory_map_regions()
473 ab = &port->buf[i]; in __q6asm_memory_map_regions()
474 mregions->shm_addr_lsw = lower_32_bits(ab->phys); in __q6asm_memory_map_regions()
475 mregions->shm_addr_msw = upper_32_bits(ab->phys); in __q6asm_memory_map_regions()
476 mregions->mem_size_bytes = buf_sz; in __q6asm_memory_map_regions()
479 spin_unlock_irqrestore(&ac->lock, flags); in __q6asm_memory_map_regions()
490 * q6asm_map_memory_regions() - map memory regions in the dsp.
494 * @phys: physical address that needs mapping.
501 phys_addr_t phys, in q6asm_map_memory_regions() argument
509 spin_lock_irqsave(&ac->lock, flags); in q6asm_map_memory_regions()
510 if (ac->port[dir].buf) { in q6asm_map_memory_regions()
511 dev_err(ac->dev, "Buffer already allocated\n"); in q6asm_map_memory_regions()
512 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_map_memory_regions()
518 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_map_memory_regions()
519 return -ENOMEM; in q6asm_map_memory_regions()
523 ac->port[dir].buf = buf; in q6asm_map_memory_regions()
525 buf[0].phys = phys; in q6asm_map_memory_regions()
530 buf[cnt].phys = buf[0].phys + (cnt * period_sz); in q6asm_map_memory_regions()
534 ac->port[dir].num_periods = periods; in q6asm_map_memory_regions()
536 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_map_memory_regions()
540 dev_err(ac->dev, "Memory_map_regions failed\n"); in q6asm_map_memory_regions()
541 q6asm_audio_client_free_buf(ac, &ac->port[dir]); in q6asm_map_memory_regions()
555 a = ac->q6asm; in q6asm_audio_client_release()
557 spin_lock_irqsave(&a->slock, flags); in q6asm_audio_client_release()
558 a->session[ac->session] = NULL; in q6asm_audio_client_release()
559 spin_unlock_irqrestore(&a->slock, flags); in q6asm_audio_client_release()
565 * q6asm_audio_client_free() - Freee allocated audio client
571 kref_put(&ac->refcount, q6asm_audio_client_release); in q6asm_audio_client_free()
581 spin_lock_irqsave(&a->slock, flags); in q6asm_get_audio_client()
583 dev_err(a->dev, "invalid session: %d\n", session_id); in q6asm_get_audio_client()
588 if (!a->session[session_id]) in q6asm_get_audio_client()
590 else if (a->session[session_id]->session != session_id) in q6asm_get_audio_client()
593 ac = a->session[session_id]; in q6asm_get_audio_client()
594 kref_get(&ac->refcount); in q6asm_get_audio_client()
596 spin_unlock_irqrestore(&a->slock, flags); in q6asm_get_audio_client()
604 struct q6asm *q6asm = dev_get_drvdata(&adev->dev); in q6asm_stream_callback()
606 struct apr_hdr *hdr = &data->hdr; in q6asm_stream_callback()
607 struct audio_port_data *port; in q6asm_stream_callback() local
616 result = data->payload; in q6asm_stream_callback()
618 switch (hdr->opcode) { in q6asm_stream_callback()
620 switch (result->opcode) { in q6asm_stream_callback()
646 if (result->status != 0) { in q6asm_stream_callback()
647 dev_err(ac->dev, in q6asm_stream_callback()
649 result->opcode, result->status); in q6asm_stream_callback()
650 ac->result = *result; in q6asm_stream_callback()
651 wake_up(&ac->cmd_wait); in q6asm_stream_callback()
657 dev_err(ac->dev, "command[0x%x] not expecting rsp\n", in q6asm_stream_callback()
658 result->opcode); in q6asm_stream_callback()
662 ac->result = *result; in q6asm_stream_callback()
663 wake_up(&ac->cmd_wait); in q6asm_stream_callback()
665 if (ac->cb) in q6asm_stream_callback()
666 ac->cb(client_event, hdr->token, in q6asm_stream_callback()
667 data->payload, ac->priv); in q6asm_stream_callback()
674 if (ac->io_mode & ASM_SYNC_IO_MODE) { in q6asm_stream_callback()
675 phys_addr_t phys; in q6asm_stream_callback() local
677 int token = hdr->token & ASM_WRITE_TOKEN_MASK; in q6asm_stream_callback()
679 spin_lock_irqsave(&ac->lock, flags); in q6asm_stream_callback()
681 port = &ac->port[SNDRV_PCM_STREAM_PLAYBACK]; in q6asm_stream_callback()
683 if (!port->buf) { in q6asm_stream_callback()
684 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_stream_callback()
689 phys = port->buf[token].phys; in q6asm_stream_callback()
691 if (lower_32_bits(phys) != result->opcode || in q6asm_stream_callback()
692 upper_32_bits(phys) != result->status) { in q6asm_stream_callback()
693 dev_err(ac->dev, "Expected addr %pa\n", in q6asm_stream_callback()
694 &port->buf[token].phys); in q6asm_stream_callback()
695 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_stream_callback()
696 ret = -EINVAL; in q6asm_stream_callback()
699 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_stream_callback()
704 if (ac->io_mode & ASM_SYNC_IO_MODE) { in q6asm_stream_callback()
705 struct asm_data_cmd_read_v2_done *done = data->payload; in q6asm_stream_callback()
707 phys_addr_t phys; in q6asm_stream_callback() local
709 spin_lock_irqsave(&ac->lock, flags); in q6asm_stream_callback()
710 port = &ac->port[SNDRV_PCM_STREAM_CAPTURE]; in q6asm_stream_callback()
711 if (!port->buf) { in q6asm_stream_callback()
712 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_stream_callback()
717 phys = port->buf[hdr->token].phys; in q6asm_stream_callback()
719 if (upper_32_bits(phys) != done->buf_addr_msw || in q6asm_stream_callback()
720 lower_32_bits(phys) != done->buf_addr_lsw) { in q6asm_stream_callback()
721 dev_err(ac->dev, "Expected addr %pa %08x-%08x\n", in q6asm_stream_callback()
722 &port->buf[hdr->token].phys, in q6asm_stream_callback()
723 done->buf_addr_lsw, in q6asm_stream_callback()
724 done->buf_addr_msw); in q6asm_stream_callback()
725 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_stream_callback()
726 ret = -EINVAL; in q6asm_stream_callback()
729 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_stream_callback()
738 if (ac->cb) in q6asm_stream_callback()
739 ac->cb(client_event, hdr->token, data->payload, ac->priv); in q6asm_stream_callback()
742 kref_put(&ac->refcount, q6asm_audio_client_release); in q6asm_stream_callback()
749 struct q6asm *q6asm = dev_get_drvdata(&adev->dev); in q6asm_srvc_callback()
751 struct audio_port_data *port; in q6asm_srvc_callback() local
753 struct apr_hdr *hdr = &data->hdr; in q6asm_srvc_callback()
759 session_id = (hdr->dest_port >> 8) & 0xFF; in q6asm_srvc_callback()
763 sid = (hdr->token >> 8) & 0x0F; in q6asm_srvc_callback()
766 dev_err(&adev->dev, "Audio Client not active\n"); in q6asm_srvc_callback()
770 a = dev_get_drvdata(ac->dev->parent); in q6asm_srvc_callback()
771 dir = (hdr->token & 0x0F); in q6asm_srvc_callback()
772 port = &ac->port[dir]; in q6asm_srvc_callback()
773 result = data->payload; in q6asm_srvc_callback()
775 switch (hdr->opcode) { in q6asm_srvc_callback()
777 switch (result->opcode) { in q6asm_srvc_callback()
780 ac->result = *result; in q6asm_srvc_callback()
781 wake_up(&a->mem_wait); in q6asm_srvc_callback()
784 dev_err(&adev->dev, "command[0x%x] not expecting rsp\n", in q6asm_srvc_callback()
785 result->opcode); in q6asm_srvc_callback()
790 ac->result.status = 0; in q6asm_srvc_callback()
791 ac->result.opcode = hdr->opcode; in q6asm_srvc_callback()
792 port->mem_map_handle = result->opcode; in q6asm_srvc_callback()
793 wake_up(&a->mem_wait); in q6asm_srvc_callback()
796 ac->result.opcode = hdr->opcode; in q6asm_srvc_callback()
797 ac->result.status = 0; in q6asm_srvc_callback()
798 port->mem_map_handle = 0; in q6asm_srvc_callback()
799 wake_up(&a->mem_wait); in q6asm_srvc_callback()
802 dev_dbg(&adev->dev, "command[0x%x]success [0x%x]\n", in q6asm_srvc_callback()
803 result->opcode, result->status); in q6asm_srvc_callback()
807 if (ac->cb) in q6asm_srvc_callback()
808 ac->cb(hdr->opcode, hdr->token, data->payload, ac->priv); in q6asm_srvc_callback()
811 kref_put(&ac->refcount, q6asm_audio_client_release); in q6asm_srvc_callback()
817 * q6asm_get_session_id() - get session id for audio client
825 return c->session; in q6asm_get_session_id()
830 * q6asm_audio_client_alloc() - Allocate a new audio client
845 struct q6asm *a = dev_get_drvdata(dev->parent); in q6asm_audio_client_alloc()
857 return ERR_PTR(-ENOMEM); in q6asm_audio_client_alloc()
859 spin_lock_irqsave(&a->slock, flags); in q6asm_audio_client_alloc()
860 a->session[session_id + 1] = ac; in q6asm_audio_client_alloc()
861 spin_unlock_irqrestore(&a->slock, flags); in q6asm_audio_client_alloc()
862 ac->session = session_id + 1; in q6asm_audio_client_alloc()
863 ac->cb = cb; in q6asm_audio_client_alloc()
864 ac->dev = dev; in q6asm_audio_client_alloc()
865 ac->q6asm = a; in q6asm_audio_client_alloc()
866 ac->priv = priv; in q6asm_audio_client_alloc()
867 ac->io_mode = ASM_SYNC_IO_MODE; in q6asm_audio_client_alloc()
868 ac->perf_mode = perf_mode; in q6asm_audio_client_alloc()
869 ac->adev = a->adev; in q6asm_audio_client_alloc()
870 kref_init(&ac->refcount); in q6asm_audio_client_alloc()
872 init_waitqueue_head(&ac->cmd_wait); in q6asm_audio_client_alloc()
873 mutex_init(&ac->cmd_lock); in q6asm_audio_client_alloc()
874 spin_lock_init(&ac->lock); in q6asm_audio_client_alloc()
882 struct apr_hdr *hdr = &pkt->hdr; in q6asm_ac_send_cmd_sync()
885 mutex_lock(&ac->cmd_lock); in q6asm_ac_send_cmd_sync()
886 ac->result.opcode = 0; in q6asm_ac_send_cmd_sync()
887 ac->result.status = 0; in q6asm_ac_send_cmd_sync()
889 rc = apr_send_pkt(ac->adev, pkt); in q6asm_ac_send_cmd_sync()
893 rc = wait_event_timeout(ac->cmd_wait, in q6asm_ac_send_cmd_sync()
894 (ac->result.opcode == hdr->opcode), 5 * HZ); in q6asm_ac_send_cmd_sync()
896 dev_err(ac->dev, "CMD %x timeout\n", hdr->opcode); in q6asm_ac_send_cmd_sync()
897 rc = -ETIMEDOUT; in q6asm_ac_send_cmd_sync()
901 if (ac->result.status > 0) { in q6asm_ac_send_cmd_sync()
902 dev_err(ac->dev, "DSP returned error[%x]\n", in q6asm_ac_send_cmd_sync()
903 ac->result.status); in q6asm_ac_send_cmd_sync()
904 rc = -EINVAL; in q6asm_ac_send_cmd_sync()
911 mutex_unlock(&ac->cmd_lock); in q6asm_ac_send_cmd_sync()
916 * q6asm_open_write() - Open audio client for writing
939 return -ENOMEM; in q6asm_open_write()
943 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in q6asm_open_write()
945 pkt->hdr.opcode = ASM_STREAM_CMD_OPEN_WRITE_V3; in q6asm_open_write()
946 open->mode_flags = 0x00; in q6asm_open_write()
947 open->mode_flags |= ASM_LEGACY_STREAM_SESSION; in q6asm_open_write()
949 open->mode_flags |= BIT(ASM_SHIFT_GAPLESS_MODE_FLAG); in q6asm_open_write()
952 open->sink_endpointype = ASM_END_POINT_DEVICE_MATRIX; in q6asm_open_write()
953 open->bits_per_sample = bits_per_sample; in q6asm_open_write()
954 open->postprocopo_id = ASM_NULL_POPP_TOPOLOGY; in q6asm_open_write()
958 open->dec_fmt_id = ASM_MEDIA_FMT_MP3; in q6asm_open_write()
961 open->dec_fmt_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2; in q6asm_open_write()
964 open->dec_fmt_id = ASM_MEDIA_FMT_FLAC; in q6asm_open_write()
969 open->dec_fmt_id = ASM_MEDIA_FMT_WMA_V9; in q6asm_open_write()
975 open->dec_fmt_id = ASM_MEDIA_FMT_WMA_V10; in q6asm_open_write()
978 dev_err(ac->dev, "Invalid codec profile 0x%x\n", in q6asm_open_write()
980 rc = -EINVAL; in q6asm_open_write()
985 open->dec_fmt_id = ASM_MEDIA_FMT_ALAC; in q6asm_open_write()
988 open->dec_fmt_id = ASM_MEDIA_FMT_APE; in q6asm_open_write()
991 dev_err(ac->dev, "Invalid format 0x%x\n", format); in q6asm_open_write()
992 rc = -EINVAL; in q6asm_open_write()
1000 ac->io_mode |= ASM_TUN_WRITE_IO_MODE; in q6asm_open_write()
1020 return -ENOMEM; in __q6asm_run()
1025 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in __q6asm_run()
1027 pkt->hdr.opcode = ASM_SESSION_CMD_RUN_V2; in __q6asm_run()
1028 run->flags = flags; in __q6asm_run()
1029 run->time_lsw = lsw_ts; in __q6asm_run()
1030 run->time_msw = msw_ts; in __q6asm_run()
1034 rc = apr_send_pkt(ac->adev, pkt); in __q6asm_run()
1044 * q6asm_run() - start the audio client
1062 * q6asm_run_nowait() - start the audio client withou blocking
1080 * q6asm_media_format_block_multi_ch_pcm() - setup pcm configuration
1106 return -ENOMEM; in q6asm_media_format_block_multi_ch_pcm()
1111 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in q6asm_media_format_block_multi_ch_pcm()
1113 pkt->hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; in q6asm_media_format_block_multi_ch_pcm()
1114 fmt->fmt_blk.fmt_blk_size = sizeof(*fmt) - sizeof(fmt->fmt_blk); in q6asm_media_format_block_multi_ch_pcm()
1115 fmt->num_channels = channels; in q6asm_media_format_block_multi_ch_pcm()
1116 fmt->bits_per_sample = bits_per_sample; in q6asm_media_format_block_multi_ch_pcm()
1117 fmt->sample_rate = rate; in q6asm_media_format_block_multi_ch_pcm()
1118 fmt->is_signed = 1; in q6asm_media_format_block_multi_ch_pcm()
1120 channel_mapping = fmt->channel_mapping; in q6asm_media_format_block_multi_ch_pcm()
1126 dev_err(ac->dev, " map channels failed %d\n", channels); in q6asm_media_format_block_multi_ch_pcm()
1127 rc = -EINVAL; in q6asm_media_format_block_multi_ch_pcm()
1152 return -ENOMEM; in q6asm_stream_media_format_block_flac()
1157 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in q6asm_stream_media_format_block_flac()
1159 pkt->hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; in q6asm_stream_media_format_block_flac()
1160 fmt->fmt_blk.fmt_blk_size = sizeof(*fmt) - sizeof(fmt->fmt_blk); in q6asm_stream_media_format_block_flac()
1161 fmt->is_stream_info_present = cfg->stream_info_present; in q6asm_stream_media_format_block_flac()
1162 fmt->num_channels = cfg->ch_cfg; in q6asm_stream_media_format_block_flac()
1163 fmt->min_blk_size = cfg->min_blk_size; in q6asm_stream_media_format_block_flac()
1164 fmt->max_blk_size = cfg->max_blk_size; in q6asm_stream_media_format_block_flac()
1165 fmt->sample_rate = cfg->sample_rate; in q6asm_stream_media_format_block_flac()
1166 fmt->min_frame_size = cfg->min_frame_size; in q6asm_stream_media_format_block_flac()
1167 fmt->max_frame_size = cfg->max_frame_size; in q6asm_stream_media_format_block_flac()
1168 fmt->sample_size = cfg->sample_size; in q6asm_stream_media_format_block_flac()
1189 return -ENOMEM; in q6asm_stream_media_format_block_wma_v9()
1194 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in q6asm_stream_media_format_block_wma_v9()
1196 pkt->hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; in q6asm_stream_media_format_block_wma_v9()
1197 fmt->fmt_blk.fmt_blk_size = sizeof(*fmt) - sizeof(fmt->fmt_blk); in q6asm_stream_media_format_block_wma_v9()
1198 fmt->fmtag = cfg->fmtag; in q6asm_stream_media_format_block_wma_v9()
1199 fmt->num_channels = cfg->num_channels; in q6asm_stream_media_format_block_wma_v9()
1200 fmt->sample_rate = cfg->sample_rate; in q6asm_stream_media_format_block_wma_v9()
1201 fmt->bytes_per_sec = cfg->bytes_per_sec; in q6asm_stream_media_format_block_wma_v9()
1202 fmt->blk_align = cfg->block_align; in q6asm_stream_media_format_block_wma_v9()
1203 fmt->bits_per_sample = cfg->bits_per_sample; in q6asm_stream_media_format_block_wma_v9()
1204 fmt->channel_mask = cfg->channel_mask; in q6asm_stream_media_format_block_wma_v9()
1205 fmt->enc_options = cfg->enc_options; in q6asm_stream_media_format_block_wma_v9()
1206 fmt->reserved = 0; in q6asm_stream_media_format_block_wma_v9()
1227 return -ENOMEM; in q6asm_stream_media_format_block_wma_v10()
1232 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in q6asm_stream_media_format_block_wma_v10()
1234 pkt->hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; in q6asm_stream_media_format_block_wma_v10()
1235 fmt->fmt_blk.fmt_blk_size = sizeof(*fmt) - sizeof(fmt->fmt_blk); in q6asm_stream_media_format_block_wma_v10()
1236 fmt->fmtag = cfg->fmtag; in q6asm_stream_media_format_block_wma_v10()
1237 fmt->num_channels = cfg->num_channels; in q6asm_stream_media_format_block_wma_v10()
1238 fmt->sample_rate = cfg->sample_rate; in q6asm_stream_media_format_block_wma_v10()
1239 fmt->bytes_per_sec = cfg->bytes_per_sec; in q6asm_stream_media_format_block_wma_v10()
1240 fmt->blk_align = cfg->block_align; in q6asm_stream_media_format_block_wma_v10()
1241 fmt->bits_per_sample = cfg->bits_per_sample; in q6asm_stream_media_format_block_wma_v10()
1242 fmt->channel_mask = cfg->channel_mask; in q6asm_stream_media_format_block_wma_v10()
1243 fmt->enc_options = cfg->enc_options; in q6asm_stream_media_format_block_wma_v10()
1244 fmt->advanced_enc_options1 = cfg->adv_enc_options; in q6asm_stream_media_format_block_wma_v10()
1245 fmt->advanced_enc_options2 = cfg->adv_enc_options2; in q6asm_stream_media_format_block_wma_v10()
1266 return -ENOMEM; in q6asm_stream_media_format_block_alac()
1271 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in q6asm_stream_media_format_block_alac()
1273 pkt->hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; in q6asm_stream_media_format_block_alac()
1274 fmt->fmt_blk.fmt_blk_size = sizeof(*fmt) - sizeof(fmt->fmt_blk); in q6asm_stream_media_format_block_alac()
1276 fmt->frame_length = cfg->frame_length; in q6asm_stream_media_format_block_alac()
1277 fmt->compatible_version = cfg->compatible_version; in q6asm_stream_media_format_block_alac()
1278 fmt->bit_depth = cfg->bit_depth; in q6asm_stream_media_format_block_alac()
1279 fmt->num_channels = cfg->num_channels; in q6asm_stream_media_format_block_alac()
1280 fmt->max_run = cfg->max_run; in q6asm_stream_media_format_block_alac()
1281 fmt->max_frame_bytes = cfg->max_frame_bytes; in q6asm_stream_media_format_block_alac()
1282 fmt->avg_bit_rate = cfg->avg_bit_rate; in q6asm_stream_media_format_block_alac()
1283 fmt->sample_rate = cfg->sample_rate; in q6asm_stream_media_format_block_alac()
1284 fmt->channel_layout_tag = cfg->channel_layout_tag; in q6asm_stream_media_format_block_alac()
1285 fmt->pb = cfg->pb; in q6asm_stream_media_format_block_alac()
1286 fmt->mb = cfg->mb; in q6asm_stream_media_format_block_alac()
1287 fmt->kb = cfg->kb; in q6asm_stream_media_format_block_alac()
1308 return -ENOMEM; in q6asm_stream_media_format_block_ape()
1313 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in q6asm_stream_media_format_block_ape()
1315 pkt->hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; in q6asm_stream_media_format_block_ape()
1316 fmt->fmt_blk.fmt_blk_size = sizeof(*fmt) - sizeof(fmt->fmt_blk); in q6asm_stream_media_format_block_ape()
1318 fmt->compatible_version = cfg->compatible_version; in q6asm_stream_media_format_block_ape()
1319 fmt->compression_level = cfg->compression_level; in q6asm_stream_media_format_block_ape()
1320 fmt->format_flags = cfg->format_flags; in q6asm_stream_media_format_block_ape()
1321 fmt->blocks_per_frame = cfg->blocks_per_frame; in q6asm_stream_media_format_block_ape()
1322 fmt->final_frame_blocks = cfg->final_frame_blocks; in q6asm_stream_media_format_block_ape()
1323 fmt->total_frames = cfg->total_frames; in q6asm_stream_media_format_block_ape()
1324 fmt->bits_per_sample = cfg->bits_per_sample; in q6asm_stream_media_format_block_ape()
1325 fmt->num_channels = cfg->num_channels; in q6asm_stream_media_format_block_ape()
1326 fmt->sample_rate = cfg->sample_rate; in q6asm_stream_media_format_block_ape()
1327 fmt->seek_table_present = cfg->seek_table_present; in q6asm_stream_media_format_block_ape()
1348 return -ENOMEM; in q6asm_stream_remove_silence()
1353 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in q6asm_stream_remove_silence()
1355 pkt->hdr.opcode = cmd; in q6asm_stream_remove_silence()
1357 rc = apr_send_pkt(ac->adev, pkt); in q6asm_stream_remove_silence()
1386 * q6asm_enc_cfg_blk_pcm_format_support() - setup pcm configuration for capture
1411 return -ENOMEM; in q6asm_enc_cfg_blk_pcm_format_support()
1415 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in q6asm_enc_cfg_blk_pcm_format_support()
1417 pkt->hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; in q6asm_enc_cfg_blk_pcm_format_support()
1418 enc_cfg->encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; in q6asm_enc_cfg_blk_pcm_format_support()
1419 enc_cfg->encdec.param_size = sizeof(*enc_cfg) - sizeof(enc_cfg->encdec); in q6asm_enc_cfg_blk_pcm_format_support()
1420 enc_cfg->encblk.frames_per_buf = frames_per_buf; in q6asm_enc_cfg_blk_pcm_format_support()
1421 enc_cfg->encblk.enc_cfg_blk_size = enc_cfg->encdec.param_size - in q6asm_enc_cfg_blk_pcm_format_support()
1424 enc_cfg->num_channels = channels; in q6asm_enc_cfg_blk_pcm_format_support()
1425 enc_cfg->bits_per_sample = bits_per_sample; in q6asm_enc_cfg_blk_pcm_format_support()
1426 enc_cfg->sample_rate = rate; in q6asm_enc_cfg_blk_pcm_format_support()
1427 enc_cfg->is_signed = 1; in q6asm_enc_cfg_blk_pcm_format_support()
1428 channel_mapping = enc_cfg->channel_mapping; in q6asm_enc_cfg_blk_pcm_format_support()
1431 rc = -EINVAL; in q6asm_enc_cfg_blk_pcm_format_support()
1444 * q6asm_read() - read data of period size from audio client
1454 struct audio_port_data *port; in q6asm_read() local
1465 return -ENOMEM; in q6asm_read()
1470 spin_lock_irqsave(&ac->lock, flags); in q6asm_read()
1471 port = &ac->port[SNDRV_PCM_STREAM_CAPTURE]; in q6asm_read()
1472 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, false, stream_id); in q6asm_read()
1473 ab = &port->buf[port->dsp_buf]; in q6asm_read()
1474 pkt->hdr.opcode = ASM_DATA_CMD_READ_V2; in q6asm_read()
1475 read->buf_addr_lsw = lower_32_bits(ab->phys); in q6asm_read()
1476 read->buf_addr_msw = upper_32_bits(ab->phys); in q6asm_read()
1477 read->mem_map_handle = port->mem_map_handle; in q6asm_read()
1479 read->buf_size = ab->size; in q6asm_read()
1480 read->seq_id = port->dsp_buf; in q6asm_read()
1481 pkt->hdr.token = port->dsp_buf; in q6asm_read()
1483 port->dsp_buf++; in q6asm_read()
1485 if (port->dsp_buf >= port->num_periods) in q6asm_read()
1486 port->dsp_buf = 0; in q6asm_read()
1488 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_read()
1489 rc = apr_send_pkt(ac->adev, pkt); in q6asm_read()
1493 pr_err("read op[0x%x]rc[%d]\n", pkt->hdr.opcode, rc); in q6asm_read()
1511 return -ENOMEM; in __q6asm_open_read()
1516 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in __q6asm_open_read()
1517 pkt->hdr.opcode = ASM_STREAM_CMD_OPEN_READ_V3; in __q6asm_open_read()
1519 open->src_endpointype = ASM_END_POINT_DEVICE_MATRIX; in __q6asm_open_read()
1521 open->preprocopo_id = ASM_STREAM_POSTPROC_TOPO_ID_NONE; in __q6asm_open_read()
1522 open->bits_per_sample = bits_per_sample; in __q6asm_open_read()
1523 open->mode_flags = 0x0; in __q6asm_open_read()
1525 open->mode_flags |= ASM_LEGACY_STREAM_SESSION << in __q6asm_open_read()
1530 open->mode_flags |= 0x00; in __q6asm_open_read()
1531 open->enc_cfg_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2; in __q6asm_open_read()
1544 * q6asm_open_read() - Open audio client for reading
1561 * q6asm_write_async() - non blocking write
1576 struct audio_port_data *port; in q6asm_write_async() local
1587 return -ENOMEM; in q6asm_write_async()
1592 spin_lock_irqsave(&ac->lock, flags); in q6asm_write_async()
1593 port = &ac->port[SNDRV_PCM_STREAM_PLAYBACK]; in q6asm_write_async()
1594 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, false, stream_id); in q6asm_write_async()
1596 ab = &port->buf[port->dsp_buf]; in q6asm_write_async()
1597 pkt->hdr.token = port->dsp_buf | (len << ASM_WRITE_TOKEN_LEN_SHIFT); in q6asm_write_async()
1598 pkt->hdr.opcode = ASM_DATA_CMD_WRITE_V2; in q6asm_write_async()
1599 write->buf_addr_lsw = lower_32_bits(ab->phys); in q6asm_write_async()
1600 write->buf_addr_msw = upper_32_bits(ab->phys); in q6asm_write_async()
1601 write->buf_size = len; in q6asm_write_async()
1602 write->seq_id = port->dsp_buf; in q6asm_write_async()
1603 write->timestamp_lsw = lsw_ts; in q6asm_write_async()
1604 write->timestamp_msw = msw_ts; in q6asm_write_async()
1605 write->mem_map_handle = in q6asm_write_async()
1606 ac->port[SNDRV_PCM_STREAM_PLAYBACK].mem_map_handle; in q6asm_write_async()
1608 write->flags = wflags; in q6asm_write_async()
1610 port->dsp_buf++; in q6asm_write_async()
1612 if (port->dsp_buf >= port->num_periods) in q6asm_write_async()
1613 port->dsp_buf = 0; in q6asm_write_async()
1615 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_write_async()
1616 rc = apr_send_pkt(ac->adev, pkt); in q6asm_write_async()
1627 struct audio_port_data *port; in q6asm_reset_buf_state() local
1630 spin_lock_irqsave(&ac->lock, flags); in q6asm_reset_buf_state()
1631 port = &ac->port[SNDRV_PCM_STREAM_PLAYBACK]; in q6asm_reset_buf_state()
1632 port->dsp_buf = 0; in q6asm_reset_buf_state()
1633 port = &ac->port[SNDRV_PCM_STREAM_CAPTURE]; in q6asm_reset_buf_state()
1634 port->dsp_buf = 0; in q6asm_reset_buf_state()
1635 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_reset_buf_state()
1666 return -EINVAL; in __q6asm_cmd()
1672 return apr_send_pkt(ac->adev, &pkt); in __q6asm_cmd()
1684 * q6asm_cmd() - run cmd on audio client
1699 * q6asm_cmd_nowait() - non blocking, run cmd on audio client
1715 struct device *dev = &adev->dev; in q6asm_probe()
1720 return -ENOMEM; in q6asm_probe()
1722 q6core_get_svc_api_info(adev->svc_id, &q6asm->ainfo); in q6asm_probe()
1724 q6asm->dev = dev; in q6asm_probe()
1725 q6asm->adev = adev; in q6asm_probe()
1726 init_waitqueue_head(&q6asm->mem_wait); in q6asm_probe()
1727 spin_lock_init(&q6asm->slock); in q6asm_probe()
1745 .name = "qcom-q6asm",