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"
162 phys_addr_t phys; member
191 /* idx:1 out port, 0: in port */
192 struct audio_port_data port[2]; member
205 hdr->hdr_field = APR_SEQ_CMD_HDR_FIELD; in q6asm_add_hdr()
206 hdr->src_port = ((ac->session << 8) & 0xFF00) | (stream_id); in q6asm_add_hdr()
207 hdr->dest_port = ((ac->session << 8) & 0xFF00) | (stream_id); in q6asm_add_hdr()
208 hdr->pkt_size = pkt_size; in q6asm_add_hdr()
210 hdr->token = ac->session; in q6asm_add_hdr()
216 struct apr_hdr *hdr = &pkt->hdr; in q6asm_apr_send_session_pkt()
219 mutex_lock(&ac->cmd_lock); in q6asm_apr_send_session_pkt()
220 ac->result.opcode = 0; in q6asm_apr_send_session_pkt()
221 ac->result.status = 0; in q6asm_apr_send_session_pkt()
222 rc = apr_send_pkt(a->adev, pkt); in q6asm_apr_send_session_pkt()
227 rc = wait_event_timeout(a->mem_wait, in q6asm_apr_send_session_pkt()
228 (ac->result.opcode == hdr->opcode) || in q6asm_apr_send_session_pkt()
229 (ac->result.opcode == rsp_opcode), in q6asm_apr_send_session_pkt()
232 rc = wait_event_timeout(a->mem_wait, in q6asm_apr_send_session_pkt()
233 (ac->result.opcode == hdr->opcode), in q6asm_apr_send_session_pkt()
237 dev_err(a->dev, "CMD timeout\n"); in q6asm_apr_send_session_pkt()
238 rc = -ETIMEDOUT; in q6asm_apr_send_session_pkt()
239 } else if (ac->result.status > 0) { in q6asm_apr_send_session_pkt()
240 dev_err(a->dev, "DSP returned error[%x]\n", in q6asm_apr_send_session_pkt()
241 ac->result.status); in q6asm_apr_send_session_pkt()
242 rc = -EINVAL; in q6asm_apr_send_session_pkt()
246 mutex_unlock(&ac->cmd_lock); in q6asm_apr_send_session_pkt()
254 struct q6asm *a = dev_get_drvdata(ac->dev->parent); in __q6asm_memory_unmap()
259 if (ac->port[dir].mem_map_handle == 0) { in __q6asm_memory_unmap()
260 dev_err(ac->dev, "invalid mem handle\n"); in __q6asm_memory_unmap()
261 return -EINVAL; in __q6asm_memory_unmap()
267 return -ENOMEM; in __q6asm_memory_unmap()
272 pkt->hdr.hdr_field = APR_SEQ_CMD_HDR_FIELD; in __q6asm_memory_unmap()
273 pkt->hdr.src_port = 0; in __q6asm_memory_unmap()
274 pkt->hdr.dest_port = 0; in __q6asm_memory_unmap()
275 pkt->hdr.pkt_size = pkt_size; in __q6asm_memory_unmap()
276 pkt->hdr.token = ((ac->session << 8) | dir); in __q6asm_memory_unmap()
278 pkt->hdr.opcode = ASM_CMD_SHARED_MEM_UNMAP_REGIONS; in __q6asm_memory_unmap()
279 mem_unmap->mem_map_handle = ac->port[dir].mem_map_handle; in __q6asm_memory_unmap()
287 ac->port[dir].mem_map_handle = 0; in __q6asm_memory_unmap()
295 struct audio_port_data *port) in q6asm_audio_client_free_buf() argument
299 spin_lock_irqsave(&ac->lock, flags); in q6asm_audio_client_free_buf()
300 port->num_periods = 0; in q6asm_audio_client_free_buf()
301 kfree(port->buf); in q6asm_audio_client_free_buf()
302 port->buf = NULL; in q6asm_audio_client_free_buf()
303 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_audio_client_free_buf()
307 * q6asm_unmap_memory_regions() - unmap memory regions in the dsp.
316 struct audio_port_data *port; in q6asm_unmap_memory_regions() local
320 port = &ac->port[dir]; in q6asm_unmap_memory_regions()
321 if (!port->buf) { in q6asm_unmap_memory_regions()
322 rc = -EINVAL; in q6asm_unmap_memory_regions()
326 cnt = port->num_periods - 1; in q6asm_unmap_memory_regions()
328 rc = __q6asm_memory_unmap(ac, port->buf[dir].phys, dir); in q6asm_unmap_memory_regions()
330 dev_err(ac->dev, "%s: Memory_unmap_regions failed %d\n", in q6asm_unmap_memory_regions()
336 q6asm_audio_client_free_buf(ac, port); in q6asm_unmap_memory_regions()
349 struct q6asm *a = dev_get_drvdata(ac->dev->parent); in __q6asm_memory_map_regions()
350 struct audio_port_data *port = NULL; in __q6asm_memory_map_regions() local
374 return -ENOMEM; in __q6asm_memory_map_regions()
380 pkt->hdr.hdr_field = APR_SEQ_CMD_HDR_FIELD; in __q6asm_memory_map_regions()
381 pkt->hdr.src_port = 0; in __q6asm_memory_map_regions()
382 pkt->hdr.dest_port = 0; in __q6asm_memory_map_regions()
383 pkt->hdr.pkt_size = pkt_size; in __q6asm_memory_map_regions()
384 pkt->hdr.token = ((ac->session << 8) | dir); in __q6asm_memory_map_regions()
385 pkt->hdr.opcode = ASM_CMD_SHARED_MEM_MAP_REGIONS; in __q6asm_memory_map_regions()
387 cmd->mem_pool_id = ADSP_MEMORY_MAP_SHMEM8_4K_POOL; in __q6asm_memory_map_regions()
388 cmd->num_regions = num_regions; in __q6asm_memory_map_regions()
389 cmd->property_flag = 0x00; in __q6asm_memory_map_regions()
391 spin_lock_irqsave(&ac->lock, flags); in __q6asm_memory_map_regions()
392 port = &ac->port[dir]; in __q6asm_memory_map_regions()
395 ab = &port->buf[i]; in __q6asm_memory_map_regions()
396 mregions->shm_addr_lsw = lower_32_bits(ab->phys); in __q6asm_memory_map_regions()
397 mregions->shm_addr_msw = upper_32_bits(ab->phys); in __q6asm_memory_map_regions()
398 mregions->mem_size_bytes = buf_sz; in __q6asm_memory_map_regions()
401 spin_unlock_irqrestore(&ac->lock, flags); in __q6asm_memory_map_regions()
412 * q6asm_map_memory_regions() - map memory regions in the dsp.
416 * @phys: physcial address that needs mapping.
423 phys_addr_t phys, in q6asm_map_memory_regions() argument
431 spin_lock_irqsave(&ac->lock, flags); in q6asm_map_memory_regions()
432 if (ac->port[dir].buf) { in q6asm_map_memory_regions()
433 dev_err(ac->dev, "Buffer already allocated\n"); in q6asm_map_memory_regions()
434 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_map_memory_regions()
440 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_map_memory_regions()
441 return -ENOMEM; in q6asm_map_memory_regions()
445 ac->port[dir].buf = buf; in q6asm_map_memory_regions()
447 buf[0].phys = phys; in q6asm_map_memory_regions()
452 buf[cnt].phys = buf[0].phys + (cnt * period_sz); in q6asm_map_memory_regions()
456 ac->port[dir].num_periods = periods; in q6asm_map_memory_regions()
458 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_map_memory_regions()
462 dev_err(ac->dev, "Memory_map_regions failed\n"); in q6asm_map_memory_regions()
463 q6asm_audio_client_free_buf(ac, &ac->port[dir]); in q6asm_map_memory_regions()
477 a = ac->q6asm; in q6asm_audio_client_release()
479 spin_lock_irqsave(&a->slock, flags); in q6asm_audio_client_release()
480 a->session[ac->session] = NULL; in q6asm_audio_client_release()
481 spin_unlock_irqrestore(&a->slock, flags); in q6asm_audio_client_release()
487 * q6asm_audio_client_free() - Freee allocated audio client
493 kref_put(&ac->refcount, q6asm_audio_client_release); in q6asm_audio_client_free()
503 spin_lock_irqsave(&a->slock, flags); in q6asm_get_audio_client()
505 dev_err(a->dev, "invalid session: %d\n", session_id); in q6asm_get_audio_client()
510 if (!a->session[session_id]) in q6asm_get_audio_client()
512 else if (a->session[session_id]->session != session_id) in q6asm_get_audio_client()
515 ac = a->session[session_id]; in q6asm_get_audio_client()
516 kref_get(&ac->refcount); in q6asm_get_audio_client()
518 spin_unlock_irqrestore(&a->slock, flags); in q6asm_get_audio_client()
526 struct q6asm *q6asm = dev_get_drvdata(&adev->dev); in q6asm_stream_callback()
528 struct apr_hdr *hdr = &data->hdr; in q6asm_stream_callback()
529 struct audio_port_data *port; in q6asm_stream_callback() local
538 result = data->payload; in q6asm_stream_callback()
540 switch (hdr->opcode) { in q6asm_stream_callback()
542 switch (result->opcode) { in q6asm_stream_callback()
566 if (result->status != 0) { in q6asm_stream_callback()
567 dev_err(ac->dev, in q6asm_stream_callback()
569 result->opcode, result->status); in q6asm_stream_callback()
570 ac->result = *result; in q6asm_stream_callback()
571 wake_up(&ac->cmd_wait); in q6asm_stream_callback()
577 dev_err(ac->dev, "command[0x%x] not expecting rsp\n", in q6asm_stream_callback()
578 result->opcode); in q6asm_stream_callback()
582 ac->result = *result; in q6asm_stream_callback()
583 wake_up(&ac->cmd_wait); in q6asm_stream_callback()
585 if (ac->cb) in q6asm_stream_callback()
586 ac->cb(client_event, hdr->token, in q6asm_stream_callback()
587 data->payload, ac->priv); in q6asm_stream_callback()
594 if (ac->io_mode & ASM_SYNC_IO_MODE) { in q6asm_stream_callback()
595 phys_addr_t phys; in q6asm_stream_callback() local
598 spin_lock_irqsave(&ac->lock, flags); in q6asm_stream_callback()
600 port = &ac->port[SNDRV_PCM_STREAM_PLAYBACK]; in q6asm_stream_callback()
602 if (!port->buf) { in q6asm_stream_callback()
603 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_stream_callback()
608 phys = port->buf[hdr->token].phys; in q6asm_stream_callback()
610 if (lower_32_bits(phys) != result->opcode || in q6asm_stream_callback()
611 upper_32_bits(phys) != result->status) { in q6asm_stream_callback()
612 dev_err(ac->dev, "Expected addr %pa\n", in q6asm_stream_callback()
613 &port->buf[hdr->token].phys); in q6asm_stream_callback()
614 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_stream_callback()
615 ret = -EINVAL; in q6asm_stream_callback()
618 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_stream_callback()
623 if (ac->io_mode & ASM_SYNC_IO_MODE) { in q6asm_stream_callback()
624 struct asm_data_cmd_read_v2_done *done = data->payload; in q6asm_stream_callback()
626 phys_addr_t phys; in q6asm_stream_callback() local
628 spin_lock_irqsave(&ac->lock, flags); in q6asm_stream_callback()
629 port = &ac->port[SNDRV_PCM_STREAM_CAPTURE]; in q6asm_stream_callback()
630 if (!port->buf) { in q6asm_stream_callback()
631 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_stream_callback()
636 phys = port->buf[hdr->token].phys; in q6asm_stream_callback()
638 if (upper_32_bits(phys) != done->buf_addr_msw || in q6asm_stream_callback()
639 lower_32_bits(phys) != done->buf_addr_lsw) { in q6asm_stream_callback()
640 dev_err(ac->dev, "Expected addr %pa %08x-%08x\n", in q6asm_stream_callback()
641 &port->buf[hdr->token].phys, in q6asm_stream_callback()
642 done->buf_addr_lsw, in q6asm_stream_callback()
643 done->buf_addr_msw); in q6asm_stream_callback()
644 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_stream_callback()
645 ret = -EINVAL; in q6asm_stream_callback()
648 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_stream_callback()
657 if (ac->cb) in q6asm_stream_callback()
658 ac->cb(client_event, hdr->token, data->payload, ac->priv); in q6asm_stream_callback()
661 kref_put(&ac->refcount, q6asm_audio_client_release); in q6asm_stream_callback()
668 struct q6asm *q6asm = dev_get_drvdata(&adev->dev); in q6asm_srvc_callback()
670 struct audio_port_data *port; in q6asm_srvc_callback() local
672 struct apr_hdr *hdr = &data->hdr; in q6asm_srvc_callback()
678 session_id = (hdr->dest_port >> 8) & 0xFF; in q6asm_srvc_callback()
682 sid = (hdr->token >> 8) & 0x0F; in q6asm_srvc_callback()
685 dev_err(&adev->dev, "Audio Client not active\n"); in q6asm_srvc_callback()
689 a = dev_get_drvdata(ac->dev->parent); in q6asm_srvc_callback()
690 dir = (hdr->token & 0x0F); in q6asm_srvc_callback()
691 port = &ac->port[dir]; in q6asm_srvc_callback()
692 result = data->payload; in q6asm_srvc_callback()
694 switch (hdr->opcode) { in q6asm_srvc_callback()
696 switch (result->opcode) { in q6asm_srvc_callback()
699 ac->result = *result; in q6asm_srvc_callback()
700 wake_up(&a->mem_wait); in q6asm_srvc_callback()
703 dev_err(&adev->dev, "command[0x%x] not expecting rsp\n", in q6asm_srvc_callback()
704 result->opcode); in q6asm_srvc_callback()
709 ac->result.status = 0; in q6asm_srvc_callback()
710 ac->result.opcode = hdr->opcode; in q6asm_srvc_callback()
711 port->mem_map_handle = result->opcode; in q6asm_srvc_callback()
712 wake_up(&a->mem_wait); in q6asm_srvc_callback()
715 ac->result.opcode = hdr->opcode; in q6asm_srvc_callback()
716 ac->result.status = 0; in q6asm_srvc_callback()
717 port->mem_map_handle = 0; in q6asm_srvc_callback()
718 wake_up(&a->mem_wait); in q6asm_srvc_callback()
721 dev_dbg(&adev->dev, "command[0x%x]success [0x%x]\n", in q6asm_srvc_callback()
722 result->opcode, result->status); in q6asm_srvc_callback()
726 if (ac->cb) in q6asm_srvc_callback()
727 ac->cb(hdr->opcode, hdr->token, data->payload, ac->priv); in q6asm_srvc_callback()
730 kref_put(&ac->refcount, q6asm_audio_client_release); in q6asm_srvc_callback()
736 * q6asm_get_session_id() - get session id for audio client
744 return c->session; in q6asm_get_session_id()
749 * q6asm_audio_client_alloc() - Allocate a new audio client
764 struct q6asm *a = dev_get_drvdata(dev->parent); in q6asm_audio_client_alloc()
776 return ERR_PTR(-ENOMEM); in q6asm_audio_client_alloc()
778 spin_lock_irqsave(&a->slock, flags); in q6asm_audio_client_alloc()
779 a->session[stream_id + 1] = ac; in q6asm_audio_client_alloc()
780 spin_unlock_irqrestore(&a->slock, flags); in q6asm_audio_client_alloc()
781 ac->session = stream_id + 1; in q6asm_audio_client_alloc()
782 ac->cb = cb; in q6asm_audio_client_alloc()
783 ac->dev = dev; in q6asm_audio_client_alloc()
784 ac->q6asm = a; in q6asm_audio_client_alloc()
785 ac->priv = priv; in q6asm_audio_client_alloc()
786 ac->io_mode = ASM_SYNC_IO_MODE; in q6asm_audio_client_alloc()
787 ac->perf_mode = perf_mode; in q6asm_audio_client_alloc()
789 ac->stream_id = 1; in q6asm_audio_client_alloc()
790 ac->adev = a->adev; in q6asm_audio_client_alloc()
791 kref_init(&ac->refcount); in q6asm_audio_client_alloc()
793 init_waitqueue_head(&ac->cmd_wait); in q6asm_audio_client_alloc()
794 mutex_init(&ac->cmd_lock); in q6asm_audio_client_alloc()
795 spin_lock_init(&ac->lock); in q6asm_audio_client_alloc()
803 struct apr_hdr *hdr = &pkt->hdr; in q6asm_ac_send_cmd_sync()
806 mutex_lock(&ac->cmd_lock); in q6asm_ac_send_cmd_sync()
807 ac->result.opcode = 0; in q6asm_ac_send_cmd_sync()
808 ac->result.status = 0; in q6asm_ac_send_cmd_sync()
810 rc = apr_send_pkt(ac->adev, pkt); in q6asm_ac_send_cmd_sync()
814 rc = wait_event_timeout(ac->cmd_wait, in q6asm_ac_send_cmd_sync()
815 (ac->result.opcode == hdr->opcode), 5 * HZ); in q6asm_ac_send_cmd_sync()
817 dev_err(ac->dev, "CMD timeout\n"); in q6asm_ac_send_cmd_sync()
818 rc = -ETIMEDOUT; in q6asm_ac_send_cmd_sync()
822 if (ac->result.status > 0) { in q6asm_ac_send_cmd_sync()
823 dev_err(ac->dev, "DSP returned error[%x]\n", in q6asm_ac_send_cmd_sync()
824 ac->result.status); in q6asm_ac_send_cmd_sync()
825 rc = -EINVAL; in q6asm_ac_send_cmd_sync()
832 mutex_unlock(&ac->cmd_lock); in q6asm_ac_send_cmd_sync()
837 * q6asm_open_write() - Open audio client for writing
857 return -ENOMEM; in q6asm_open_write()
861 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, ac->stream_id); in q6asm_open_write()
863 pkt->hdr.opcode = ASM_STREAM_CMD_OPEN_WRITE_V3; in q6asm_open_write()
864 open->mode_flags = 0x00; in q6asm_open_write()
865 open->mode_flags |= ASM_LEGACY_STREAM_SESSION; in q6asm_open_write()
868 open->sink_endpointype = ASM_END_POINT_DEVICE_MATRIX; in q6asm_open_write()
869 open->bits_per_sample = bits_per_sample; in q6asm_open_write()
870 open->postprocopo_id = ASM_NULL_POPP_TOPOLOGY; in q6asm_open_write()
874 open->dec_fmt_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2; in q6asm_open_write()
877 dev_err(ac->dev, "Invalid format 0x%x\n", format); in q6asm_open_write()
878 rc = -EINVAL; in q6asm_open_write()
886 ac->io_mode |= ASM_TUN_WRITE_IO_MODE; in q6asm_open_write()
905 return -ENOMEM; in __q6asm_run()
910 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, ac->stream_id); in __q6asm_run()
912 pkt->hdr.opcode = ASM_SESSION_CMD_RUN_V2; in __q6asm_run()
913 run->flags = flags; in __q6asm_run()
914 run->time_lsw = lsw_ts; in __q6asm_run()
915 run->time_msw = msw_ts; in __q6asm_run()
919 rc = apr_send_pkt(ac->adev, pkt); in __q6asm_run()
929 * q6asm_run() - start the audio client
946 * q6asm_run_nowait() - start the audio client withou blocking
963 * q6asm_media_format_block_multi_ch_pcm() - setup pcm configuration
987 return -ENOMEM; in q6asm_media_format_block_multi_ch_pcm()
992 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, ac->stream_id); in q6asm_media_format_block_multi_ch_pcm()
994 pkt->hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2; in q6asm_media_format_block_multi_ch_pcm()
995 fmt->fmt_blk.fmt_blk_size = sizeof(*fmt) - sizeof(fmt->fmt_blk); in q6asm_media_format_block_multi_ch_pcm()
996 fmt->num_channels = channels; in q6asm_media_format_block_multi_ch_pcm()
997 fmt->bits_per_sample = bits_per_sample; in q6asm_media_format_block_multi_ch_pcm()
998 fmt->sample_rate = rate; in q6asm_media_format_block_multi_ch_pcm()
999 fmt->is_signed = 1; in q6asm_media_format_block_multi_ch_pcm()
1001 channel_mapping = fmt->channel_mapping; in q6asm_media_format_block_multi_ch_pcm()
1007 dev_err(ac->dev, " map channels failed %d\n", channels); in q6asm_media_format_block_multi_ch_pcm()
1008 rc = -EINVAL; in q6asm_media_format_block_multi_ch_pcm()
1022 * q6asm_enc_cfg_blk_pcm_format_support() - setup pcm configuration for capture
1044 return -ENOMEM; in q6asm_enc_cfg_blk_pcm_format_support()
1048 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, ac->stream_id); in q6asm_enc_cfg_blk_pcm_format_support()
1050 pkt->hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM; in q6asm_enc_cfg_blk_pcm_format_support()
1051 enc_cfg->encdec.param_id = ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2; in q6asm_enc_cfg_blk_pcm_format_support()
1052 enc_cfg->encdec.param_size = sizeof(*enc_cfg) - sizeof(enc_cfg->encdec); in q6asm_enc_cfg_blk_pcm_format_support()
1053 enc_cfg->encblk.frames_per_buf = frames_per_buf; in q6asm_enc_cfg_blk_pcm_format_support()
1054 enc_cfg->encblk.enc_cfg_blk_size = enc_cfg->encdec.param_size - in q6asm_enc_cfg_blk_pcm_format_support()
1057 enc_cfg->num_channels = channels; in q6asm_enc_cfg_blk_pcm_format_support()
1058 enc_cfg->bits_per_sample = bits_per_sample; in q6asm_enc_cfg_blk_pcm_format_support()
1059 enc_cfg->sample_rate = rate; in q6asm_enc_cfg_blk_pcm_format_support()
1060 enc_cfg->is_signed = 1; in q6asm_enc_cfg_blk_pcm_format_support()
1061 channel_mapping = enc_cfg->channel_mapping; in q6asm_enc_cfg_blk_pcm_format_support()
1064 rc = -EINVAL; in q6asm_enc_cfg_blk_pcm_format_support()
1076 * q6asm_read() - read data of period size from audio client
1085 struct audio_port_data *port; in q6asm_read() local
1096 return -ENOMEM; in q6asm_read()
1101 spin_lock_irqsave(&ac->lock, flags); in q6asm_read()
1102 port = &ac->port[SNDRV_PCM_STREAM_CAPTURE]; in q6asm_read()
1103 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, false, ac->stream_id); in q6asm_read()
1104 ab = &port->buf[port->dsp_buf]; in q6asm_read()
1105 pkt->hdr.opcode = ASM_DATA_CMD_READ_V2; in q6asm_read()
1106 read->buf_addr_lsw = lower_32_bits(ab->phys); in q6asm_read()
1107 read->buf_addr_msw = upper_32_bits(ab->phys); in q6asm_read()
1108 read->mem_map_handle = port->mem_map_handle; in q6asm_read()
1110 read->buf_size = ab->size; in q6asm_read()
1111 read->seq_id = port->dsp_buf; in q6asm_read()
1112 pkt->hdr.token = port->dsp_buf; in q6asm_read()
1114 port->dsp_buf++; in q6asm_read()
1116 if (port->dsp_buf >= port->num_periods) in q6asm_read()
1117 port->dsp_buf = 0; in q6asm_read()
1119 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_read()
1120 rc = apr_send_pkt(ac->adev, pkt); in q6asm_read()
1124 pr_err("read op[0x%x]rc[%d]\n", pkt->hdr.opcode, rc); in q6asm_read()
1142 return -ENOMEM; in __q6asm_open_read()
1147 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, ac->stream_id); in __q6asm_open_read()
1148 pkt->hdr.opcode = ASM_STREAM_CMD_OPEN_READ_V3; in __q6asm_open_read()
1150 open->src_endpointype = ASM_END_POINT_DEVICE_MATRIX; in __q6asm_open_read()
1152 open->preprocopo_id = ASM_STREAM_POSTPROC_TOPO_ID_NONE; in __q6asm_open_read()
1153 open->bits_per_sample = bits_per_sample; in __q6asm_open_read()
1154 open->mode_flags = 0x0; in __q6asm_open_read()
1156 open->mode_flags |= ASM_LEGACY_STREAM_SESSION << in __q6asm_open_read()
1161 open->mode_flags |= 0x00; in __q6asm_open_read()
1162 open->enc_cfg_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2; in __q6asm_open_read()
1175 * q6asm_open_read() - Open audio client for reading
1191 * q6asm_write_async() - non blocking write
1205 struct audio_port_data *port; in q6asm_write_async() local
1216 return -ENOMEM; in q6asm_write_async()
1221 spin_lock_irqsave(&ac->lock, flags); in q6asm_write_async()
1222 port = &ac->port[SNDRV_PCM_STREAM_PLAYBACK]; in q6asm_write_async()
1223 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, false, ac->stream_id); in q6asm_write_async()
1225 ab = &port->buf[port->dsp_buf]; in q6asm_write_async()
1226 pkt->hdr.token = port->dsp_buf; in q6asm_write_async()
1227 pkt->hdr.opcode = ASM_DATA_CMD_WRITE_V2; in q6asm_write_async()
1228 write->buf_addr_lsw = lower_32_bits(ab->phys); in q6asm_write_async()
1229 write->buf_addr_msw = upper_32_bits(ab->phys); in q6asm_write_async()
1230 write->buf_size = len; in q6asm_write_async()
1231 write->seq_id = port->dsp_buf; in q6asm_write_async()
1232 write->timestamp_lsw = lsw_ts; in q6asm_write_async()
1233 write->timestamp_msw = msw_ts; in q6asm_write_async()
1234 write->mem_map_handle = in q6asm_write_async()
1235 ac->port[SNDRV_PCM_STREAM_PLAYBACK].mem_map_handle; in q6asm_write_async()
1238 write->flags = (wflags & 0x800000FF); in q6asm_write_async()
1240 write->flags = (0x80000000 | wflags); in q6asm_write_async()
1242 port->dsp_buf++; in q6asm_write_async()
1244 if (port->dsp_buf >= port->num_periods) in q6asm_write_async()
1245 port->dsp_buf = 0; in q6asm_write_async()
1247 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_write_async()
1248 rc = apr_send_pkt(ac->adev, pkt); in q6asm_write_async()
1259 struct audio_port_data *port = NULL; in q6asm_reset_buf_state() local
1262 spin_lock_irqsave(&ac->lock, flags); in q6asm_reset_buf_state()
1263 port = &ac->port[SNDRV_PCM_STREAM_PLAYBACK]; in q6asm_reset_buf_state()
1264 port->dsp_buf = 0; in q6asm_reset_buf_state()
1265 port = &ac->port[SNDRV_PCM_STREAM_CAPTURE]; in q6asm_reset_buf_state()
1266 port->dsp_buf = 0; in q6asm_reset_buf_state()
1267 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_reset_buf_state()
1272 int stream_id = ac->stream_id; in __q6asm_cmd()
1298 return -EINVAL; in __q6asm_cmd()
1304 return apr_send_pkt(ac->adev, &pkt); in __q6asm_cmd()
1316 * q6asm_cmd() - run cmd on audio client
1330 * q6asm_cmd_nowait() - non blocking, run cmd on audio client
1345 struct device *dev = &adev->dev; in q6asm_probe()
1350 return -ENOMEM; in q6asm_probe()
1352 q6core_get_svc_api_info(adev->svc_id, &q6asm->ainfo); in q6asm_probe()
1354 q6asm->dev = dev; in q6asm_probe()
1355 q6asm->adev = adev; in q6asm_probe()
1356 init_waitqueue_head(&q6asm->mem_wait); in q6asm_probe()
1357 spin_lock_init(&q6asm->slock); in q6asm_probe()
1360 return of_platform_populate(dev->of_node, NULL, NULL, dev); in q6asm_probe()
1365 of_platform_depopulate(&adev->dev); in q6asm_remove()
1380 .name = "qcom-q6asm",