Lines Matching +full:1 +full:ac

259 	struct audio_client *session[MAX_SESSIONS + 1];
271 /* idx:1 out port, 0: in port */
280 static inline void q6asm_add_hdr(struct audio_client *ac, struct apr_hdr *hdr, in q6asm_add_hdr() argument
285 hdr->src_port = ((ac->session << 8) & 0xFF00) | (stream_id); in q6asm_add_hdr()
286 hdr->dest_port = ((ac->session << 8) & 0xFF00) | (stream_id); in q6asm_add_hdr()
289 hdr->token = ac->session; in q6asm_add_hdr()
292 static int q6asm_apr_send_session_pkt(struct q6asm *a, struct audio_client *ac, in q6asm_apr_send_session_pkt() argument
298 mutex_lock(&ac->cmd_lock); in q6asm_apr_send_session_pkt()
299 ac->result.opcode = 0; in q6asm_apr_send_session_pkt()
300 ac->result.status = 0; in q6asm_apr_send_session_pkt()
307 (ac->result.opcode == hdr->opcode) || in q6asm_apr_send_session_pkt()
308 (ac->result.opcode == rsp_opcode), in q6asm_apr_send_session_pkt()
312 (ac->result.opcode == hdr->opcode), in q6asm_apr_send_session_pkt()
318 } else if (ac->result.status > 0) { in q6asm_apr_send_session_pkt()
320 ac->result.status); in q6asm_apr_send_session_pkt()
325 mutex_unlock(&ac->cmd_lock); in q6asm_apr_send_session_pkt()
329 static int __q6asm_memory_unmap(struct audio_client *ac, in __q6asm_memory_unmap() argument
333 struct q6asm *a = dev_get_drvdata(ac->dev->parent); in __q6asm_memory_unmap()
338 if (ac->port[dir].mem_map_handle == 0) { in __q6asm_memory_unmap()
339 dev_err(ac->dev, "invalid mem handle\n"); in __q6asm_memory_unmap()
355 pkt->hdr.token = ((ac->session << 8) | dir); in __q6asm_memory_unmap()
358 mem_unmap->mem_map_handle = ac->port[dir].mem_map_handle; in __q6asm_memory_unmap()
360 rc = q6asm_apr_send_session_pkt(a, ac, pkt, 0); in __q6asm_memory_unmap()
366 ac->port[dir].mem_map_handle = 0; in __q6asm_memory_unmap()
373 static void q6asm_audio_client_free_buf(struct audio_client *ac, in q6asm_audio_client_free_buf() argument
378 spin_lock_irqsave(&ac->lock, flags); in q6asm_audio_client_free_buf()
382 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_audio_client_free_buf()
389 * @ac: audio client instanace
393 int q6asm_unmap_memory_regions(unsigned int dir, struct audio_client *ac) in q6asm_unmap_memory_regions() argument
399 port = &ac->port[dir]; in q6asm_unmap_memory_regions()
405 cnt = port->num_periods - 1; in q6asm_unmap_memory_regions()
407 rc = __q6asm_memory_unmap(ac, port->buf[dir].phys, dir); in q6asm_unmap_memory_regions()
409 dev_err(ac->dev, "%s: Memory_unmap_regions failed %d\n", in q6asm_unmap_memory_regions()
415 q6asm_audio_client_free_buf(ac, port); in q6asm_unmap_memory_regions()
422 static int __q6asm_memory_map_regions(struct audio_client *ac, int dir, in __q6asm_memory_map_regions() argument
428 struct q6asm *a = dev_get_drvdata(ac->dev->parent); in __q6asm_memory_map_regions()
438 num_regions = 1; in __q6asm_memory_map_regions()
463 pkt->hdr.token = ((ac->session << 8) | dir); in __q6asm_memory_map_regions()
470 spin_lock_irqsave(&ac->lock, flags); in __q6asm_memory_map_regions()
471 port = &ac->port[dir]; in __q6asm_memory_map_regions()
480 spin_unlock_irqrestore(&ac->lock, flags); in __q6asm_memory_map_regions()
482 rc = q6asm_apr_send_session_pkt(a, ac, pkt, in __q6asm_memory_map_regions()
494 * @ac: audio client instanace
501 int q6asm_map_memory_regions(unsigned int dir, struct audio_client *ac, in q6asm_map_memory_regions() argument
510 spin_lock_irqsave(&ac->lock, flags); in q6asm_map_memory_regions()
511 if (ac->port[dir].buf) { in q6asm_map_memory_regions()
512 dev_err(ac->dev, "Buffer already allocated\n"); in q6asm_map_memory_regions()
513 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_map_memory_regions()
519 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_map_memory_regions()
524 ac->port[dir].buf = buf; in q6asm_map_memory_regions()
529 for (cnt = 1; cnt < periods; cnt++) { in q6asm_map_memory_regions()
535 ac->port[dir].num_periods = periods; in q6asm_map_memory_regions()
537 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_map_memory_regions()
539 rc = __q6asm_memory_map_regions(ac, dir, period_sz, periods, 1); in q6asm_map_memory_regions()
541 dev_err(ac->dev, "Memory_map_regions failed\n"); in q6asm_map_memory_regions()
542 q6asm_audio_client_free_buf(ac, &ac->port[dir]); in q6asm_map_memory_regions()
551 struct audio_client *ac; in q6asm_audio_client_release() local
555 ac = container_of(ref, struct audio_client, refcount); in q6asm_audio_client_release()
556 a = ac->q6asm; in q6asm_audio_client_release()
559 a->session[ac->session] = NULL; in q6asm_audio_client_release()
562 kfree(ac); in q6asm_audio_client_release()
568 * @ac: audio client to free
570 void q6asm_audio_client_free(struct audio_client *ac) in q6asm_audio_client_free() argument
572 kref_put(&ac->refcount, q6asm_audio_client_release); in q6asm_audio_client_free()
579 struct audio_client *ac = NULL; in q6asm_get_audio_client() local
594 ac = a->session[session_id]; in q6asm_get_audio_client()
595 kref_get(&ac->refcount); in q6asm_get_audio_client()
598 return ac; in q6asm_get_audio_client()
609 struct audio_client *ac; in q6asm_stream_callback() local
613 ac = q6asm_get_audio_client(q6asm, session_id); in q6asm_stream_callback()
614 if (!ac)/* Audio client might already be freed by now */ in q6asm_stream_callback()
648 dev_err(ac->dev, in q6asm_stream_callback()
651 ac->result = *result; in q6asm_stream_callback()
652 wake_up(&ac->cmd_wait); in q6asm_stream_callback()
658 dev_err(ac->dev, "command[0x%x] not expecting rsp\n", in q6asm_stream_callback()
663 ac->result = *result; in q6asm_stream_callback()
664 wake_up(&ac->cmd_wait); in q6asm_stream_callback()
666 if (ac->cb) in q6asm_stream_callback()
667 ac->cb(client_event, hdr->token, in q6asm_stream_callback()
668 data->payload, ac->priv); in q6asm_stream_callback()
675 if (ac->io_mode & ASM_SYNC_IO_MODE) { in q6asm_stream_callback()
680 spin_lock_irqsave(&ac->lock, flags); in q6asm_stream_callback()
682 port = &ac->port[SNDRV_PCM_STREAM_PLAYBACK]; in q6asm_stream_callback()
685 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_stream_callback()
694 dev_err(ac->dev, "Expected addr %pa\n", in q6asm_stream_callback()
696 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_stream_callback()
700 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_stream_callback()
705 if (ac->io_mode & ASM_SYNC_IO_MODE) { in q6asm_stream_callback()
710 spin_lock_irqsave(&ac->lock, flags); in q6asm_stream_callback()
711 port = &ac->port[SNDRV_PCM_STREAM_CAPTURE]; in q6asm_stream_callback()
713 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_stream_callback()
722 dev_err(ac->dev, "Expected addr %pa %08x-%08x\n", in q6asm_stream_callback()
726 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_stream_callback()
730 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_stream_callback()
739 if (ac->cb) in q6asm_stream_callback()
740 ac->cb(client_event, hdr->token, data->payload, ac->priv); in q6asm_stream_callback()
743 kref_put(&ac->refcount, q6asm_audio_client_release); in q6asm_stream_callback()
753 struct audio_client *ac = NULL; in q6asm_srvc_callback() local
765 ac = q6asm_get_audio_client(q6asm, sid); in q6asm_srvc_callback()
766 if (!ac) { in q6asm_srvc_callback()
771 a = dev_get_drvdata(ac->dev->parent); in q6asm_srvc_callback()
773 port = &ac->port[dir]; in q6asm_srvc_callback()
781 ac->result = *result; in q6asm_srvc_callback()
791 ac->result.status = 0; in q6asm_srvc_callback()
792 ac->result.opcode = hdr->opcode; in q6asm_srvc_callback()
797 ac->result.opcode = hdr->opcode; in q6asm_srvc_callback()
798 ac->result.status = 0; in q6asm_srvc_callback()
808 if (ac->cb) in q6asm_srvc_callback()
809 ac->cb(hdr->opcode, hdr->token, data->payload, ac->priv); in q6asm_srvc_callback()
812 kref_put(&ac->refcount, q6asm_audio_client_release); in q6asm_srvc_callback()
847 struct audio_client *ac; in q6asm_audio_client_alloc() local
850 ac = q6asm_get_audio_client(a, session_id + 1); in q6asm_audio_client_alloc()
851 if (ac) { in q6asm_audio_client_alloc()
853 return ac; in q6asm_audio_client_alloc()
856 ac = kzalloc(sizeof(*ac), GFP_KERNEL); in q6asm_audio_client_alloc()
857 if (!ac) in q6asm_audio_client_alloc()
861 a->session[session_id + 1] = ac; in q6asm_audio_client_alloc()
863 ac->session = session_id + 1; in q6asm_audio_client_alloc()
864 ac->cb = cb; in q6asm_audio_client_alloc()
865 ac->dev = dev; in q6asm_audio_client_alloc()
866 ac->q6asm = a; in q6asm_audio_client_alloc()
867 ac->priv = priv; in q6asm_audio_client_alloc()
868 ac->io_mode = ASM_SYNC_IO_MODE; in q6asm_audio_client_alloc()
869 ac->perf_mode = perf_mode; in q6asm_audio_client_alloc()
870 ac->adev = a->adev; in q6asm_audio_client_alloc()
871 kref_init(&ac->refcount); in q6asm_audio_client_alloc()
873 init_waitqueue_head(&ac->cmd_wait); in q6asm_audio_client_alloc()
874 mutex_init(&ac->cmd_lock); in q6asm_audio_client_alloc()
875 spin_lock_init(&ac->lock); in q6asm_audio_client_alloc()
877 return ac; in q6asm_audio_client_alloc()
881 static int q6asm_ac_send_cmd_sync(struct audio_client *ac, struct apr_pkt *pkt) in q6asm_ac_send_cmd_sync() argument
886 mutex_lock(&ac->cmd_lock); in q6asm_ac_send_cmd_sync()
887 ac->result.opcode = 0; in q6asm_ac_send_cmd_sync()
888 ac->result.status = 0; in q6asm_ac_send_cmd_sync()
890 rc = apr_send_pkt(ac->adev, pkt); in q6asm_ac_send_cmd_sync()
894 rc = wait_event_timeout(ac->cmd_wait, in q6asm_ac_send_cmd_sync()
895 (ac->result.opcode == hdr->opcode), 5 * HZ); in q6asm_ac_send_cmd_sync()
897 dev_err(ac->dev, "CMD %x timeout\n", hdr->opcode); in q6asm_ac_send_cmd_sync()
902 if (ac->result.status > 0) { in q6asm_ac_send_cmd_sync()
903 dev_err(ac->dev, "DSP returned error[%x]\n", in q6asm_ac_send_cmd_sync()
904 ac->result.status); in q6asm_ac_send_cmd_sync()
912 mutex_unlock(&ac->cmd_lock); in q6asm_ac_send_cmd_sync()
918 * @ac: audio client pointer
927 int q6asm_open_write(struct audio_client *ac, uint32_t stream_id, in q6asm_open_write() argument
944 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in q6asm_open_write()
979 dev_err(ac->dev, "Invalid codec profile 0x%x\n", in q6asm_open_write()
992 dev_err(ac->dev, "Invalid format 0x%x\n", format); in q6asm_open_write()
997 rc = q6asm_ac_send_cmd_sync(ac, pkt); in q6asm_open_write()
1001 ac->io_mode |= ASM_TUN_WRITE_IO_MODE; in q6asm_open_write()
1009 static int __q6asm_run(struct audio_client *ac, uint32_t stream_id, in __q6asm_run() argument
1026 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in __q6asm_run()
1033 rc = q6asm_ac_send_cmd_sync(ac, pkt); in __q6asm_run()
1035 rc = apr_send_pkt(ac->adev, pkt); in __q6asm_run()
1047 * @ac: audio client pointer
1055 int q6asm_run(struct audio_client *ac, uint32_t stream_id, uint32_t flags, in q6asm_run() argument
1058 return __q6asm_run(ac, stream_id, flags, msw_ts, lsw_ts, true); in q6asm_run()
1065 * @ac: audio client pointer
1073 int q6asm_run_nowait(struct audio_client *ac, uint32_t stream_id, in q6asm_run_nowait() argument
1076 return __q6asm_run(ac, stream_id, flags, msw_ts, lsw_ts, false); in q6asm_run_nowait()
1083 * @ac: audio client pointer
1092 int q6asm_media_format_block_multi_ch_pcm(struct audio_client *ac, in q6asm_media_format_block_multi_ch_pcm() argument
1112 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in q6asm_media_format_block_multi_ch_pcm()
1119 fmt->is_signed = 1; in q6asm_media_format_block_multi_ch_pcm()
1127 dev_err(ac->dev, " map channels failed %d\n", channels); in q6asm_media_format_block_multi_ch_pcm()
1133 rc = q6asm_ac_send_cmd_sync(ac, pkt); in q6asm_media_format_block_multi_ch_pcm()
1141 int q6asm_stream_media_format_block_flac(struct audio_client *ac, in q6asm_stream_media_format_block_flac() argument
1158 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in q6asm_stream_media_format_block_flac()
1171 rc = q6asm_ac_send_cmd_sync(ac, pkt); in q6asm_stream_media_format_block_flac()
1178 int q6asm_stream_media_format_block_wma_v9(struct audio_client *ac, in q6asm_stream_media_format_block_wma_v9() argument
1195 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in q6asm_stream_media_format_block_wma_v9()
1209 rc = q6asm_ac_send_cmd_sync(ac, pkt); in q6asm_stream_media_format_block_wma_v9()
1216 int q6asm_stream_media_format_block_wma_v10(struct audio_client *ac, in q6asm_stream_media_format_block_wma_v10() argument
1233 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in q6asm_stream_media_format_block_wma_v10()
1248 rc = q6asm_ac_send_cmd_sync(ac, pkt); in q6asm_stream_media_format_block_wma_v10()
1255 int q6asm_stream_media_format_block_alac(struct audio_client *ac, in q6asm_stream_media_format_block_alac() argument
1272 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in q6asm_stream_media_format_block_alac()
1290 rc = q6asm_ac_send_cmd_sync(ac, pkt); in q6asm_stream_media_format_block_alac()
1297 int q6asm_stream_media_format_block_ape(struct audio_client *ac, in q6asm_stream_media_format_block_ape() argument
1314 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in q6asm_stream_media_format_block_ape()
1330 rc = q6asm_ac_send_cmd_sync(ac, pkt); in q6asm_stream_media_format_block_ape()
1337 static int q6asm_stream_remove_silence(struct audio_client *ac, uint32_t stream_id, in q6asm_stream_remove_silence() argument
1354 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in q6asm_stream_remove_silence()
1358 rc = apr_send_pkt(ac->adev, pkt); in q6asm_stream_remove_silence()
1367 int q6asm_stream_remove_initial_silence(struct audio_client *ac, in q6asm_stream_remove_initial_silence() argument
1371 return q6asm_stream_remove_silence(ac, stream_id, in q6asm_stream_remove_initial_silence()
1377 int q6asm_stream_remove_trailing_silence(struct audio_client *ac, uint32_t stream_id, in q6asm_stream_remove_trailing_silence() argument
1380 return q6asm_stream_remove_silence(ac, stream_id, in q6asm_stream_remove_trailing_silence()
1389 * @ac: audio client pointer
1397 int q6asm_enc_cfg_blk_pcm_format_support(struct audio_client *ac, in q6asm_enc_cfg_blk_pcm_format_support() argument
1416 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in q6asm_enc_cfg_blk_pcm_format_support()
1428 enc_cfg->is_signed = 1; in q6asm_enc_cfg_blk_pcm_format_support()
1436 rc = q6asm_ac_send_cmd_sync(ac, pkt); in q6asm_enc_cfg_blk_pcm_format_support()
1447 * @ac: audio client pointer
1452 int q6asm_read(struct audio_client *ac, uint32_t stream_id) in q6asm_read() argument
1471 spin_lock_irqsave(&ac->lock, flags); in q6asm_read()
1472 port = &ac->port[SNDRV_PCM_STREAM_CAPTURE]; in q6asm_read()
1473 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, false, stream_id); in q6asm_read()
1489 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_read()
1490 rc = apr_send_pkt(ac->adev, pkt); in q6asm_read()
1501 static int __q6asm_open_read(struct audio_client *ac, uint32_t stream_id, in __q6asm_open_read() argument
1517 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id); in __q6asm_open_read()
1538 rc = q6asm_ac_send_cmd_sync(ac, pkt); in __q6asm_open_read()
1547 * @ac: audio client pointer
1554 int q6asm_open_read(struct audio_client *ac, uint32_t stream_id, in q6asm_open_read() argument
1557 return __q6asm_open_read(ac, stream_id, format, bits_per_sample); in q6asm_open_read()
1564 * @ac: audio client pointer
1573 int q6asm_write_async(struct audio_client *ac, uint32_t stream_id, uint32_t len, in q6asm_write_async() argument
1593 spin_lock_irqsave(&ac->lock, flags); in q6asm_write_async()
1594 port = &ac->port[SNDRV_PCM_STREAM_PLAYBACK]; in q6asm_write_async()
1595 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, false, stream_id); in q6asm_write_async()
1607 ac->port[SNDRV_PCM_STREAM_PLAYBACK].mem_map_handle; in q6asm_write_async()
1616 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_write_async()
1617 rc = apr_send_pkt(ac->adev, pkt); in q6asm_write_async()
1626 static void q6asm_reset_buf_state(struct audio_client *ac) in q6asm_reset_buf_state() argument
1631 spin_lock_irqsave(&ac->lock, flags); in q6asm_reset_buf_state()
1632 port = &ac->port[SNDRV_PCM_STREAM_PLAYBACK]; in q6asm_reset_buf_state()
1634 port = &ac->port[SNDRV_PCM_STREAM_CAPTURE]; in q6asm_reset_buf_state()
1636 spin_unlock_irqrestore(&ac->lock, flags); in q6asm_reset_buf_state()
1639 static int __q6asm_cmd(struct audio_client *ac, uint32_t stream_id, int cmd, in __q6asm_cmd() argument
1645 q6asm_add_hdr(ac, &pkt.hdr, APR_HDR_SIZE, true, stream_id); in __q6asm_cmd()
1671 rc = q6asm_ac_send_cmd_sync(ac, &pkt); in __q6asm_cmd()
1673 return apr_send_pkt(ac->adev, &pkt); in __q6asm_cmd()
1679 q6asm_reset_buf_state(ac); in __q6asm_cmd()
1687 * @ac: audio client pointer
1693 int q6asm_cmd(struct audio_client *ac, uint32_t stream_id, int cmd) in q6asm_cmd() argument
1695 return __q6asm_cmd(ac, stream_id, cmd, true); in q6asm_cmd()
1702 * @ac: audio client pointer
1708 int q6asm_cmd_nowait(struct audio_client *ac, uint32_t stream_id, int cmd) in q6asm_cmd_nowait() argument
1710 return __q6asm_cmd(ac, stream_id, cmd, false); in q6asm_cmd_nowait()