Lines Matching refs:ac

279 static inline void q6asm_add_hdr(struct audio_client *ac, struct apr_hdr *hdr,
284 hdr->src_port = ((ac->session << 8) & 0xFF00) | (stream_id);
285 hdr->dest_port = ((ac->session << 8) & 0xFF00) | (stream_id);
288 hdr->token = ac->session;
291 static int q6asm_apr_send_session_pkt(struct q6asm *a, struct audio_client *ac,
297 mutex_lock(&ac->cmd_lock);
298 ac->result.opcode = 0;
299 ac->result.status = 0;
306 (ac->result.opcode == hdr->opcode) ||
307 (ac->result.opcode == rsp_opcode),
311 (ac->result.opcode == hdr->opcode),
317 } else if (ac->result.status > 0) {
319 ac->result.status);
324 mutex_unlock(&ac->cmd_lock);
328 static int __q6asm_memory_unmap(struct audio_client *ac,
332 struct q6asm *a = dev_get_drvdata(ac->dev->parent);
337 if (ac->port[dir].mem_map_handle == 0) {
338 dev_err(ac->dev, "invalid mem handle\n");
354 pkt->hdr.token = ((ac->session << 8) | dir);
357 mem_unmap->mem_map_handle = ac->port[dir].mem_map_handle;
359 rc = q6asm_apr_send_session_pkt(a, ac, pkt, 0);
365 ac->port[dir].mem_map_handle = 0;
372 static void q6asm_audio_client_free_buf(struct audio_client *ac,
377 spin_lock_irqsave(&ac->lock, flags);
381 spin_unlock_irqrestore(&ac->lock, flags);
388 * @ac: audio client instanace
392 int q6asm_unmap_memory_regions(unsigned int dir, struct audio_client *ac)
398 port = &ac->port[dir];
406 rc = __q6asm_memory_unmap(ac, port->buf[dir].phys, dir);
408 dev_err(ac->dev, "%s: Memory_unmap_regions failed %d\n",
414 q6asm_audio_client_free_buf(ac, port);
421 static int __q6asm_memory_map_regions(struct audio_client *ac, int dir,
427 struct q6asm *a = dev_get_drvdata(ac->dev->parent);
462 pkt->hdr.token = ((ac->session << 8) | dir);
469 spin_lock_irqsave(&ac->lock, flags);
470 port = &ac->port[dir];
479 spin_unlock_irqrestore(&ac->lock, flags);
481 rc = q6asm_apr_send_session_pkt(a, ac, pkt,
493 * @ac: audio client instanace
500 int q6asm_map_memory_regions(unsigned int dir, struct audio_client *ac,
509 spin_lock_irqsave(&ac->lock, flags);
510 if (ac->port[dir].buf) {
511 dev_err(ac->dev, "Buffer already allocated\n");
512 spin_unlock_irqrestore(&ac->lock, flags);
518 spin_unlock_irqrestore(&ac->lock, flags);
523 ac->port[dir].buf = buf;
534 ac->port[dir].num_periods = periods;
536 spin_unlock_irqrestore(&ac->lock, flags);
538 rc = __q6asm_memory_map_regions(ac, dir, period_sz, periods, 1);
540 dev_err(ac->dev, "Memory_map_regions failed\n");
541 q6asm_audio_client_free_buf(ac, &ac->port[dir]);
550 struct audio_client *ac;
554 ac = container_of(ref, struct audio_client, refcount);
555 a = ac->q6asm;
558 a->session[ac->session] = NULL;
561 kfree(ac);
567 * @ac: audio client to free
569 void q6asm_audio_client_free(struct audio_client *ac)
571 kref_put(&ac->refcount, q6asm_audio_client_release);
578 struct audio_client *ac = NULL;
593 ac = a->session[session_id];
594 kref_get(&ac->refcount);
597 return ac;
608 struct audio_client *ac;
612 ac = q6asm_get_audio_client(q6asm, session_id);
613 if (!ac)/* Audio client might already be freed by now */
647 dev_err(ac->dev,
650 ac->result = *result;
651 wake_up(&ac->cmd_wait);
657 dev_err(ac->dev, "command[0x%x] not expecting rsp\n",
662 ac->result = *result;
663 wake_up(&ac->cmd_wait);
665 if (ac->cb)
666 ac->cb(client_event, hdr->token,
667 data->payload, ac->priv);
674 if (ac->io_mode & ASM_SYNC_IO_MODE) {
679 spin_lock_irqsave(&ac->lock, flags);
681 port = &ac->port[SNDRV_PCM_STREAM_PLAYBACK];
684 spin_unlock_irqrestore(&ac->lock, flags);
693 dev_err(ac->dev, "Expected addr %pa\n",
695 spin_unlock_irqrestore(&ac->lock, flags);
699 spin_unlock_irqrestore(&ac->lock, flags);
704 if (ac->io_mode & ASM_SYNC_IO_MODE) {
709 spin_lock_irqsave(&ac->lock, flags);
710 port = &ac->port[SNDRV_PCM_STREAM_CAPTURE];
712 spin_unlock_irqrestore(&ac->lock, flags);
721 dev_err(ac->dev, "Expected addr %pa %08x-%08x\n",
725 spin_unlock_irqrestore(&ac->lock, flags);
729 spin_unlock_irqrestore(&ac->lock, flags);
738 if (ac->cb)
739 ac->cb(client_event, hdr->token, data->payload, ac->priv);
742 kref_put(&ac->refcount, q6asm_audio_client_release);
752 struct audio_client *ac = NULL;
764 ac = q6asm_get_audio_client(q6asm, sid);
765 if (!ac) {
770 a = dev_get_drvdata(ac->dev->parent);
772 port = &ac->port[dir];
780 ac->result = *result;
790 ac->result.status = 0;
791 ac->result.opcode = hdr->opcode;
796 ac->result.opcode = hdr->opcode;
797 ac->result.status = 0;
807 if (ac->cb)
808 ac->cb(hdr->opcode, hdr->token, data->payload, ac->priv);
811 kref_put(&ac->refcount, q6asm_audio_client_release);
846 struct audio_client *ac;
849 ac = q6asm_get_audio_client(a, session_id + 1);
850 if (ac) {
852 return ac;
855 ac = kzalloc(sizeof(*ac), GFP_KERNEL);
856 if (!ac)
860 a->session[session_id + 1] = ac;
862 ac->session = session_id + 1;
863 ac->cb = cb;
864 ac->dev = dev;
865 ac->q6asm = a;
866 ac->priv = priv;
867 ac->io_mode = ASM_SYNC_IO_MODE;
868 ac->perf_mode = perf_mode;
869 ac->adev = a->adev;
870 kref_init(&ac->refcount);
872 init_waitqueue_head(&ac->cmd_wait);
873 mutex_init(&ac->cmd_lock);
874 spin_lock_init(&ac->lock);
876 return ac;
880 static int q6asm_ac_send_cmd_sync(struct audio_client *ac, struct apr_pkt *pkt)
885 mutex_lock(&ac->cmd_lock);
886 ac->result.opcode = 0;
887 ac->result.status = 0;
889 rc = apr_send_pkt(ac->adev, pkt);
893 rc = wait_event_timeout(ac->cmd_wait,
894 (ac->result.opcode == hdr->opcode), 5 * HZ);
896 dev_err(ac->dev, "CMD %x timeout\n", hdr->opcode);
901 if (ac->result.status > 0) {
902 dev_err(ac->dev, "DSP returned error[%x]\n",
903 ac->result.status);
911 mutex_unlock(&ac->cmd_lock);
917 * @ac: audio client pointer
926 int q6asm_open_write(struct audio_client *ac, uint32_t stream_id,
943 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id);
978 dev_err(ac->dev, "Invalid codec profile 0x%x\n",
991 dev_err(ac->dev, "Invalid format 0x%x\n", format);
996 rc = q6asm_ac_send_cmd_sync(ac, pkt);
1000 ac->io_mode |= ASM_TUN_WRITE_IO_MODE;
1008 static int __q6asm_run(struct audio_client *ac, uint32_t stream_id,
1025 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id);
1032 rc = q6asm_ac_send_cmd_sync(ac, pkt);
1034 rc = apr_send_pkt(ac->adev, pkt);
1046 * @ac: audio client pointer
1054 int q6asm_run(struct audio_client *ac, uint32_t stream_id, uint32_t flags,
1057 return __q6asm_run(ac, stream_id, flags, msw_ts, lsw_ts, true);
1064 * @ac: audio client pointer
1072 int q6asm_run_nowait(struct audio_client *ac, uint32_t stream_id,
1075 return __q6asm_run(ac, stream_id, flags, msw_ts, lsw_ts, false);
1082 * @ac: audio client pointer
1091 int q6asm_media_format_block_multi_ch_pcm(struct audio_client *ac,
1111 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id);
1126 dev_err(ac->dev, " map channels failed %d\n", channels);
1132 rc = q6asm_ac_send_cmd_sync(ac, pkt);
1140 int q6asm_stream_media_format_block_flac(struct audio_client *ac,
1157 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id);
1170 rc = q6asm_ac_send_cmd_sync(ac, pkt);
1177 int q6asm_stream_media_format_block_wma_v9(struct audio_client *ac,
1194 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id);
1208 rc = q6asm_ac_send_cmd_sync(ac, pkt);
1215 int q6asm_stream_media_format_block_wma_v10(struct audio_client *ac,
1232 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id);
1247 rc = q6asm_ac_send_cmd_sync(ac, pkt);
1254 int q6asm_stream_media_format_block_alac(struct audio_client *ac,
1271 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id);
1289 rc = q6asm_ac_send_cmd_sync(ac, pkt);
1296 int q6asm_stream_media_format_block_ape(struct audio_client *ac,
1313 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id);
1329 rc = q6asm_ac_send_cmd_sync(ac, pkt);
1336 static int q6asm_stream_remove_silence(struct audio_client *ac, uint32_t stream_id,
1353 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id);
1357 rc = apr_send_pkt(ac->adev, pkt);
1366 int q6asm_stream_remove_initial_silence(struct audio_client *ac,
1370 return q6asm_stream_remove_silence(ac, stream_id,
1376 int q6asm_stream_remove_trailing_silence(struct audio_client *ac, uint32_t stream_id,
1379 return q6asm_stream_remove_silence(ac, stream_id,
1388 * @ac: audio client pointer
1396 int q6asm_enc_cfg_blk_pcm_format_support(struct audio_client *ac,
1415 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id);
1435 rc = q6asm_ac_send_cmd_sync(ac, pkt);
1446 * @ac: audio client pointer
1451 int q6asm_read(struct audio_client *ac, uint32_t stream_id)
1470 spin_lock_irqsave(&ac->lock, flags);
1471 port = &ac->port[SNDRV_PCM_STREAM_CAPTURE];
1472 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, false, stream_id);
1488 spin_unlock_irqrestore(&ac->lock, flags);
1489 rc = apr_send_pkt(ac->adev, pkt);
1500 static int __q6asm_open_read(struct audio_client *ac, uint32_t stream_id,
1516 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id);
1537 rc = q6asm_ac_send_cmd_sync(ac, pkt);
1546 * @ac: audio client pointer
1553 int q6asm_open_read(struct audio_client *ac, uint32_t stream_id,
1556 return __q6asm_open_read(ac, stream_id, format, bits_per_sample);
1563 * @ac: audio client pointer
1572 int q6asm_write_async(struct audio_client *ac, uint32_t stream_id, uint32_t len,
1592 spin_lock_irqsave(&ac->lock, flags);
1593 port = &ac->port[SNDRV_PCM_STREAM_PLAYBACK];
1594 q6asm_add_hdr(ac, &pkt->hdr, pkt_size, false, stream_id);
1606 ac->port[SNDRV_PCM_STREAM_PLAYBACK].mem_map_handle;
1615 spin_unlock_irqrestore(&ac->lock, flags);
1616 rc = apr_send_pkt(ac->adev, pkt);
1625 static void q6asm_reset_buf_state(struct audio_client *ac)
1630 spin_lock_irqsave(&ac->lock, flags);
1631 port = &ac->port[SNDRV_PCM_STREAM_PLAYBACK];
1633 port = &ac->port[SNDRV_PCM_STREAM_CAPTURE];
1635 spin_unlock_irqrestore(&ac->lock, flags);
1638 static int __q6asm_cmd(struct audio_client *ac, uint32_t stream_id, int cmd,
1644 q6asm_add_hdr(ac, &pkt.hdr, APR_HDR_SIZE, true, stream_id);
1670 rc = q6asm_ac_send_cmd_sync(ac, &pkt);
1672 return apr_send_pkt(ac->adev, &pkt);
1678 q6asm_reset_buf_state(ac);
1686 * @ac: audio client pointer
1692 int q6asm_cmd(struct audio_client *ac, uint32_t stream_id, int cmd)
1694 return __q6asm_cmd(ac, stream_id, cmd, true);
1701 * @ac: audio client pointer
1707 int q6asm_cmd_nowait(struct audio_client *ac, uint32_t stream_id, int cmd)
1709 return __q6asm_cmd(ac, stream_id, cmd, false);