Lines Matching +full:apr +full:- +full:v2

1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2011-2017, The Linux Foundation. All rights reserved.
5 #include <dt-bindings/sound/qcom,q6afe.h>
18 #include <linux/soc/qcom/apr.h>
20 #include <sound/soc-dai.h>
23 #include "q6dsp-errno.h"
132 (AFE_PORT_ID_TDM_PORT_RANGE_START+0x50-1)
136 (AFE_PORT_ID_TDM_PORT_RANGE_END - \
368 struct apr_device *apr; member
386 /* Reserved for 32-bit alignment. This field must be set to 0.*/
430 * Supported values: - #AFE_SLIMBUS_DEVICE_1 - #AFE_SLIMBUS_DEVICE_2
455 * - #AFE_PORT_SAMPLE_RATE_8K
456 * - #AFE_PORT_SAMPLE_RATE_16K
457 * - #AFE_PORT_SAMPLE_RATE_48K
458 * - #AFE_PORT_SAMPLE_RATE_96K
459 * - #AFE_PORT_SAMPLE_RATE_192K
845 afe = port->afe; in q6afe_port_free()
846 spin_lock_irqsave(&afe->port_list_lock, flags); in q6afe_port_free()
847 list_del(&port->node); in q6afe_port_free()
848 spin_unlock_irqrestore(&afe->port_list_lock, flags); in q6afe_port_free()
849 kfree(port->scfg); in q6afe_port_free()
859 spin_lock_irqsave(&afe->port_list_lock, flags); in q6afe_find_port()
860 list_for_each_entry(p, &afe->port_list, node) in q6afe_find_port()
861 if (p->token == token) { in q6afe_find_port()
863 kref_get(&p->refcount); in q6afe_find_port()
867 spin_unlock_irqrestore(&afe->port_list_lock, flags); in q6afe_find_port()
873 struct q6afe *afe = dev_get_drvdata(&adev->dev); in q6afe_callback()
875 struct apr_hdr *hdr = &data->hdr; in q6afe_callback()
878 if (!data->payload_size) in q6afe_callback()
881 res = data->payload; in q6afe_callback()
882 switch (hdr->opcode) { in q6afe_callback()
884 if (res->status) { in q6afe_callback()
885 dev_err(afe->dev, "cmd = 0x%x returned error = 0x%x\n", in q6afe_callback()
886 res->opcode, res->status); in q6afe_callback()
888 switch (res->opcode) { in q6afe_callback()
893 port = q6afe_find_port(afe, hdr->token); in q6afe_callback()
895 port->result = *res; in q6afe_callback()
896 wake_up(&port->wait); in q6afe_callback()
897 kref_put(&port->refcount, q6afe_port_free); in q6afe_callback()
898 } else if (hdr->token == AFE_CLK_TOKEN) { in q6afe_callback()
899 afe->result = *res; in q6afe_callback()
900 wake_up(&afe->wait); in q6afe_callback()
904 dev_err(afe->dev, "Unknown cmd 0x%x\n", res->opcode); in q6afe_callback()
910 afe->result.opcode = hdr->opcode; in q6afe_callback()
911 afe->result.status = res->status; in q6afe_callback()
912 wake_up(&afe->wait); in q6afe_callback()
922 * q6afe_get_port_id() - Get port id from a given port index
931 return -EINVAL; in q6afe_get_port_id()
944 mutex_lock(&afe->lock); in afe_apr_send_pkt()
946 wait = &port->wait; in afe_apr_send_pkt()
947 result = &port->result; in afe_apr_send_pkt()
949 result = &afe->result; in afe_apr_send_pkt()
950 wait = &afe->wait; in afe_apr_send_pkt()
953 result->opcode = 0; in afe_apr_send_pkt()
954 result->status = 0; in afe_apr_send_pkt()
956 ret = apr_send_pkt(afe->apr, pkt); in afe_apr_send_pkt()
958 dev_err(afe->dev, "packet not transmitted (%d)\n", ret); in afe_apr_send_pkt()
959 ret = -EINVAL; in afe_apr_send_pkt()
963 ret = wait_event_timeout(*wait, (result->opcode == rsp_opcode), in afe_apr_send_pkt()
966 ret = -ETIMEDOUT; in afe_apr_send_pkt()
967 } else if (result->status > 0) { in afe_apr_send_pkt()
968 dev_err(afe->dev, "DSP returned error[%x]\n", in afe_apr_send_pkt()
969 result->status); in afe_apr_send_pkt()
970 ret = -EINVAL; in afe_apr_send_pkt()
976 mutex_unlock(&afe->lock); in afe_apr_send_pkt()
994 return -ENOMEM; in q6afe_set_param()
1002 pkt->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, in q6afe_set_param()
1005 pkt->hdr.pkt_size = pkt_size; in q6afe_set_param()
1006 pkt->hdr.src_port = 0; in q6afe_set_param()
1007 pkt->hdr.dest_port = 0; in q6afe_set_param()
1008 pkt->hdr.token = token; in q6afe_set_param()
1009 pkt->hdr.opcode = AFE_SVC_CMD_SET_PARAM; in q6afe_set_param()
1011 param->payload_size = sizeof(*pdata) + psize; in q6afe_set_param()
1012 param->payload_address_lsw = 0x00; in q6afe_set_param()
1013 param->payload_address_msw = 0x00; in q6afe_set_param()
1014 param->mem_map_handle = 0x00; in q6afe_set_param()
1015 pdata->module_id = module_id; in q6afe_set_param()
1016 pdata->param_id = param_id; in q6afe_set_param()
1017 pdata->param_size = psize; in q6afe_set_param()
1021 dev_err(afe->dev, "AFE set params failed %d\n", ret); in q6afe_set_param()
1030 return q6afe_set_param(port->afe, port, data, param_id, module_id, in q6afe_port_set_param()
1031 psize, port->token); in q6afe_port_set_param()
1039 struct q6afe *afe = port->afe; in q6afe_port_set_param_v2()
1041 u16 port_id = port->id; in q6afe_port_set_param_v2()
1048 return -ENOMEM; in q6afe_port_set_param_v2()
1056 pkt->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, in q6afe_port_set_param_v2()
1059 pkt->hdr.pkt_size = pkt_size; in q6afe_port_set_param_v2()
1060 pkt->hdr.src_port = 0; in q6afe_port_set_param_v2()
1061 pkt->hdr.dest_port = 0; in q6afe_port_set_param_v2()
1062 pkt->hdr.token = port->token; in q6afe_port_set_param_v2()
1063 pkt->hdr.opcode = AFE_PORT_CMD_SET_PARAM_V2; in q6afe_port_set_param_v2()
1065 param->port_id = port_id; in q6afe_port_set_param_v2()
1066 param->payload_size = sizeof(*pdata) + psize; in q6afe_port_set_param_v2()
1067 param->payload_address_lsw = 0x00; in q6afe_port_set_param_v2()
1068 param->payload_address_msw = 0x00; in q6afe_port_set_param_v2()
1069 param->mem_map_handle = 0x00; in q6afe_port_set_param_v2()
1070 pdata->module_id = module_id; in q6afe_port_set_param_v2()
1071 pdata->param_id = param_id; in q6afe_port_set_param_v2()
1072 pdata->param_size = psize; in q6afe_port_set_param_v2()
1076 dev_err(afe->dev, "AFE enable for port 0x%x failed %d\n", in q6afe_port_set_param_v2()
1111 struct q6afe *afe = dev_get_drvdata(dev->parent); in q6afe_set_lpass_clock()
1173 ret = -EINVAL; in q6afe_port_set_sysclk()
1182 * q6afe_port_stop() - Stop a afe port
1191 struct q6afe *afe = port->afe; in q6afe_port_stop()
1193 int port_id = port->id; in q6afe_port_stop()
1198 index = port->token; in q6afe_port_stop()
1200 dev_err(afe->dev, "AFE port index[%d] invalid!\n", index); in q6afe_port_stop()
1201 return -EINVAL; in q6afe_port_stop()
1207 return -ENOMEM; in q6afe_port_stop()
1212 pkt->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, in q6afe_port_stop()
1215 pkt->hdr.pkt_size = pkt_size; in q6afe_port_stop()
1216 pkt->hdr.src_port = 0; in q6afe_port_stop()
1217 pkt->hdr.dest_port = 0; in q6afe_port_stop()
1218 pkt->hdr.token = index; in q6afe_port_stop()
1219 pkt->hdr.opcode = AFE_PORT_CMD_DEVICE_STOP; in q6afe_port_stop()
1220 stop->port_id = port_id; in q6afe_port_stop()
1221 stop->reserved = 0; in q6afe_port_stop()
1225 dev_err(afe->dev, "AFE close failed %d\n", ret); in q6afe_port_stop()
1233 * q6afe_slim_port_prepare() - Prepare slim afe port.
1242 union afe_port_config *pcfg = &port->port_cfg; in q6afe_slim_port_prepare()
1244 pcfg->slim_cfg.sb_cfg_minor_version = AFE_API_VERSION_SLIMBUS_CONFIG; in q6afe_slim_port_prepare()
1245 pcfg->slim_cfg.sample_rate = cfg->sample_rate; in q6afe_slim_port_prepare()
1246 pcfg->slim_cfg.bit_width = cfg->bit_width; in q6afe_slim_port_prepare()
1247 pcfg->slim_cfg.num_channels = cfg->num_channels; in q6afe_slim_port_prepare()
1248 pcfg->slim_cfg.data_format = cfg->data_format; in q6afe_slim_port_prepare()
1249 pcfg->slim_cfg.shared_ch_mapping[0] = cfg->ch_mapping[0]; in q6afe_slim_port_prepare()
1250 pcfg->slim_cfg.shared_ch_mapping[1] = cfg->ch_mapping[1]; in q6afe_slim_port_prepare()
1251 pcfg->slim_cfg.shared_ch_mapping[2] = cfg->ch_mapping[2]; in q6afe_slim_port_prepare()
1252 pcfg->slim_cfg.shared_ch_mapping[3] = cfg->ch_mapping[3]; in q6afe_slim_port_prepare()
1258 * q6afe_tdm_port_prepare() - Prepare tdm afe port.
1267 union afe_port_config *pcfg = &port->port_cfg; in q6afe_tdm_port_prepare()
1269 pcfg->tdm_cfg.tdm_cfg_minor_version = AFE_API_VERSION_TDM_CONFIG; in q6afe_tdm_port_prepare()
1270 pcfg->tdm_cfg.num_channels = cfg->num_channels; in q6afe_tdm_port_prepare()
1271 pcfg->tdm_cfg.sample_rate = cfg->sample_rate; in q6afe_tdm_port_prepare()
1272 pcfg->tdm_cfg.bit_width = cfg->bit_width; in q6afe_tdm_port_prepare()
1273 pcfg->tdm_cfg.data_format = cfg->data_format; in q6afe_tdm_port_prepare()
1274 pcfg->tdm_cfg.sync_mode = cfg->sync_mode; in q6afe_tdm_port_prepare()
1275 pcfg->tdm_cfg.sync_src = cfg->sync_src; in q6afe_tdm_port_prepare()
1276 pcfg->tdm_cfg.nslots_per_frame = cfg->nslots_per_frame; in q6afe_tdm_port_prepare()
1278 pcfg->tdm_cfg.slot_width = cfg->slot_width; in q6afe_tdm_port_prepare()
1279 pcfg->tdm_cfg.slot_mask = cfg->slot_mask; in q6afe_tdm_port_prepare()
1280 port->scfg = kzalloc(sizeof(*port->scfg), GFP_KERNEL); in q6afe_tdm_port_prepare()
1281 if (!port->scfg) in q6afe_tdm_port_prepare()
1284 port->scfg->minor_version = AFE_API_VERSION_SLOT_MAPPING_CONFIG; in q6afe_tdm_port_prepare()
1285 port->scfg->num_channels = cfg->num_channels; in q6afe_tdm_port_prepare()
1286 port->scfg->bitwidth = cfg->bit_width; in q6afe_tdm_port_prepare()
1287 port->scfg->data_align_type = cfg->data_align_type; in q6afe_tdm_port_prepare()
1288 memcpy(port->scfg->ch_mapping, cfg->ch_mapping, in q6afe_tdm_port_prepare()
1294 * q6afe_hdmi_port_prepare() - Prepare hdmi afe port.
1303 union afe_port_config *pcfg = &port->port_cfg; in q6afe_hdmi_port_prepare()
1305 pcfg->hdmi_multi_ch.hdmi_cfg_minor_version = in q6afe_hdmi_port_prepare()
1307 pcfg->hdmi_multi_ch.datatype = cfg->datatype; in q6afe_hdmi_port_prepare()
1308 pcfg->hdmi_multi_ch.channel_allocation = cfg->channel_allocation; in q6afe_hdmi_port_prepare()
1309 pcfg->hdmi_multi_ch.sample_rate = cfg->sample_rate; in q6afe_hdmi_port_prepare()
1310 pcfg->hdmi_multi_ch.bit_width = cfg->bit_width; in q6afe_hdmi_port_prepare()
1315 * q6afe_i2s_port_prepare() - Prepare i2s afe port.
1323 union afe_port_config *pcfg = &port->port_cfg; in q6afe_i2s_port_prepare()
1324 struct device *dev = port->afe->dev; in q6afe_i2s_port_prepare()
1327 pcfg->i2s_cfg.i2s_cfg_minor_version = AFE_API_VERSION_I2S_CONFIG; in q6afe_i2s_port_prepare()
1328 pcfg->i2s_cfg.sample_rate = cfg->sample_rate; in q6afe_i2s_port_prepare()
1329 pcfg->i2s_cfg.bit_width = cfg->bit_width; in q6afe_i2s_port_prepare()
1330 pcfg->i2s_cfg.data_format = AFE_LINEAR_PCM_DATA; in q6afe_i2s_port_prepare()
1332 switch (cfg->fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) { in q6afe_i2s_port_prepare()
1334 pcfg->i2s_cfg.ws_src = AFE_PORT_CONFIG_I2S_WS_SRC_INTERNAL; in q6afe_i2s_port_prepare()
1338 pcfg->i2s_cfg.ws_src = AFE_PORT_CONFIG_I2S_WS_SRC_EXTERNAL; in q6afe_i2s_port_prepare()
1344 num_sd_lines = hweight_long(cfg->sd_line_mask); in q6afe_i2s_port_prepare()
1349 return -EINVAL; in q6afe_i2s_port_prepare()
1351 switch (cfg->sd_line_mask) { in q6afe_i2s_port_prepare()
1353 pcfg->i2s_cfg.channel_mode = AFE_PORT_I2S_SD0; in q6afe_i2s_port_prepare()
1356 pcfg->i2s_cfg.channel_mode = AFE_PORT_I2S_SD1; in q6afe_i2s_port_prepare()
1359 pcfg->i2s_cfg.channel_mode = AFE_PORT_I2S_SD2; in q6afe_i2s_port_prepare()
1362 pcfg->i2s_cfg.channel_mode = AFE_PORT_I2S_SD3; in q6afe_i2s_port_prepare()
1366 return -EINVAL; in q6afe_i2s_port_prepare()
1370 switch (cfg->sd_line_mask) { in q6afe_i2s_port_prepare()
1372 pcfg->i2s_cfg.channel_mode = AFE_PORT_I2S_QUAD01; in q6afe_i2s_port_prepare()
1375 pcfg->i2s_cfg.channel_mode = AFE_PORT_I2S_QUAD23; in q6afe_i2s_port_prepare()
1379 return -EINVAL; in q6afe_i2s_port_prepare()
1383 switch (cfg->sd_line_mask) { in q6afe_i2s_port_prepare()
1385 pcfg->i2s_cfg.channel_mode = AFE_PORT_I2S_6CHS; in q6afe_i2s_port_prepare()
1389 return -EINVAL; in q6afe_i2s_port_prepare()
1393 switch (cfg->sd_line_mask) { in q6afe_i2s_port_prepare()
1395 pcfg->i2s_cfg.channel_mode = AFE_PORT_I2S_8CHS; in q6afe_i2s_port_prepare()
1400 return -EINVAL; in q6afe_i2s_port_prepare()
1405 return -EINVAL; in q6afe_i2s_port_prepare()
1408 switch (cfg->num_channels) { in q6afe_i2s_port_prepare()
1411 switch (pcfg->i2s_cfg.channel_mode) { in q6afe_i2s_port_prepare()
1415 pcfg->i2s_cfg.channel_mode = AFE_PORT_I2S_SD0; in q6afe_i2s_port_prepare()
1418 pcfg->i2s_cfg.channel_mode = AFE_PORT_I2S_SD2; in q6afe_i2s_port_prepare()
1422 if (cfg->num_channels == 2) in q6afe_i2s_port_prepare()
1423 pcfg->i2s_cfg.mono_stereo = AFE_PORT_I2S_STEREO; in q6afe_i2s_port_prepare()
1425 pcfg->i2s_cfg.mono_stereo = AFE_PORT_I2S_MONO; in q6afe_i2s_port_prepare()
1430 if (pcfg->i2s_cfg.channel_mode < AFE_PORT_I2S_QUAD01) { in q6afe_i2s_port_prepare()
1432 return -EINVAL; in q6afe_i2s_port_prepare()
1437 if (pcfg->i2s_cfg.channel_mode < AFE_PORT_I2S_6CHS) { in q6afe_i2s_port_prepare()
1439 return -EINVAL; in q6afe_i2s_port_prepare()
1444 if (pcfg->i2s_cfg.channel_mode < AFE_PORT_I2S_8CHS) { in q6afe_i2s_port_prepare()
1446 return -EINVAL; in q6afe_i2s_port_prepare()
1458 * q6afe_cdc_dma_port_prepare() - Prepare dma afe port.
1467 union afe_port_config *pcfg = &port->port_cfg; in q6afe_cdc_dma_port_prepare()
1468 struct afe_param_id_cdc_dma_cfg *dma_cfg = &pcfg->dma_cfg; in q6afe_cdc_dma_port_prepare()
1470 dma_cfg->cdc_dma_cfg_minor_version = AFE_API_VERSION_CODEC_DMA_CONFIG; in q6afe_cdc_dma_port_prepare()
1471 dma_cfg->sample_rate = cfg->sample_rate; in q6afe_cdc_dma_port_prepare()
1472 dma_cfg->bit_width = cfg->bit_width; in q6afe_cdc_dma_port_prepare()
1473 dma_cfg->data_format = cfg->data_format; in q6afe_cdc_dma_port_prepare()
1474 dma_cfg->num_channels = cfg->num_channels; in q6afe_cdc_dma_port_prepare()
1475 if (!cfg->active_channels_mask) in q6afe_cdc_dma_port_prepare()
1476 dma_cfg->active_channels_mask = (1 << cfg->num_channels) - 1; in q6afe_cdc_dma_port_prepare()
1480 * q6afe_port_start() - Start a afe port
1489 struct q6afe *afe = port->afe; in q6afe_port_start()
1490 int port_id = port->id; in q6afe_port_start()
1491 int ret, param_id = port->cfg_type; in q6afe_port_start()
1496 ret = q6afe_port_set_param_v2(port, &port->port_cfg, param_id, in q6afe_port_start()
1498 sizeof(port->port_cfg)); in q6afe_port_start()
1500 dev_err(afe->dev, "AFE enable for port 0x%x failed %d\n", in q6afe_port_start()
1505 if (port->scfg) { in q6afe_port_start()
1506 ret = q6afe_port_set_param_v2(port, port->scfg, in q6afe_port_start()
1508 AFE_MODULE_TDM, sizeof(*port->scfg)); in q6afe_port_start()
1510 dev_err(afe->dev, "AFE enable for port 0x%x failed %d\n", in q6afe_port_start()
1519 return -ENOMEM; in q6afe_port_start()
1524 pkt->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, in q6afe_port_start()
1527 pkt->hdr.pkt_size = pkt_size; in q6afe_port_start()
1528 pkt->hdr.src_port = 0; in q6afe_port_start()
1529 pkt->hdr.dest_port = 0; in q6afe_port_start()
1530 pkt->hdr.token = port->token; in q6afe_port_start()
1531 pkt->hdr.opcode = AFE_PORT_CMD_DEVICE_START; in q6afe_port_start()
1533 start->port_id = port_id; in q6afe_port_start()
1537 dev_err(afe->dev, "AFE enable for port 0x%x failed %d\n", in q6afe_port_start()
1546 * q6afe_port_get_from_id() - Get port instance from a port id
1557 struct q6afe *afe = dev_get_drvdata(dev->parent); in q6afe_port_get_from_id()
1564 return ERR_PTR(-EINVAL); in q6afe_port_get_from_id()
1618 return ERR_PTR(-EINVAL); in q6afe_port_get_from_id()
1623 return ERR_PTR(-ENOMEM); in q6afe_port_get_from_id()
1625 init_waitqueue_head(&port->wait); in q6afe_port_get_from_id()
1627 port->token = id; in q6afe_port_get_from_id()
1628 port->id = port_id; in q6afe_port_get_from_id()
1629 port->afe = afe; in q6afe_port_get_from_id()
1630 port->cfg_type = cfg_type; in q6afe_port_get_from_id()
1631 kref_init(&port->refcount); in q6afe_port_get_from_id()
1633 spin_lock_irqsave(&afe->port_list_lock, flags); in q6afe_port_get_from_id()
1634 list_add_tail(&port->node, &afe->port_list); in q6afe_port_get_from_id()
1635 spin_unlock_irqrestore(&afe->port_list_lock, flags); in q6afe_port_get_from_id()
1643 * q6afe_port_put() - Release port reference
1649 kref_put(&port->refcount, q6afe_port_free); in q6afe_port_put()
1656 struct q6afe *afe = dev_get_drvdata(dev->parent); in q6afe_unvote_lpass_core_hw()
1666 return -ENOMEM; in q6afe_unvote_lpass_core_hw()
1671 pkt->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, in q6afe_unvote_lpass_core_hw()
1674 pkt->hdr.pkt_size = pkt_size; in q6afe_unvote_lpass_core_hw()
1675 pkt->hdr.src_port = 0; in q6afe_unvote_lpass_core_hw()
1676 pkt->hdr.dest_port = 0; in q6afe_unvote_lpass_core_hw()
1677 pkt->hdr.token = hw_block_id; in q6afe_unvote_lpass_core_hw()
1678 pkt->hdr.opcode = AFE_CMD_REMOTE_LPASS_CORE_HW_DEVOTE_REQUEST; in q6afe_unvote_lpass_core_hw()
1679 vote_cfg->hw_block_id = hw_block_id; in q6afe_unvote_lpass_core_hw()
1680 vote_cfg->client_handle = client_handle; in q6afe_unvote_lpass_core_hw()
1682 ret = apr_send_pkt(afe->apr, pkt); in q6afe_unvote_lpass_core_hw()
1684 dev_err(afe->dev, "AFE failed to unvote (%d)\n", hw_block_id); in q6afe_unvote_lpass_core_hw()
1694 struct q6afe *afe = dev_get_drvdata(dev->parent); in q6afe_vote_lpass_core_hw()
1704 return -ENOMEM; in q6afe_vote_lpass_core_hw()
1709 pkt->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, in q6afe_vote_lpass_core_hw()
1712 pkt->hdr.pkt_size = pkt_size; in q6afe_vote_lpass_core_hw()
1713 pkt->hdr.src_port = 0; in q6afe_vote_lpass_core_hw()
1714 pkt->hdr.dest_port = 0; in q6afe_vote_lpass_core_hw()
1715 pkt->hdr.token = hw_block_id; in q6afe_vote_lpass_core_hw()
1716 pkt->hdr.opcode = AFE_CMD_REMOTE_LPASS_CORE_HW_VOTE_REQUEST; in q6afe_vote_lpass_core_hw()
1717 vote_cfg->hw_block_id = hw_block_id; in q6afe_vote_lpass_core_hw()
1718 strscpy(vote_cfg->client_name, client_name, in q6afe_vote_lpass_core_hw()
1719 sizeof(vote_cfg->client_name)); in q6afe_vote_lpass_core_hw()
1724 dev_err(afe->dev, "AFE failed to vote (%d)\n", hw_block_id); in q6afe_vote_lpass_core_hw()
1735 struct device *dev = &adev->dev; in q6afe_probe()
1739 return -ENOMEM; in q6afe_probe()
1741 q6core_get_svc_api_info(adev->svc_id, &afe->ainfo); in q6afe_probe()
1742 afe->apr = adev; in q6afe_probe()
1743 mutex_init(&afe->lock); in q6afe_probe()
1744 init_waitqueue_head(&afe->wait); in q6afe_probe()
1745 afe->dev = dev; in q6afe_probe()
1746 INIT_LIST_HEAD(&afe->port_list); in q6afe_probe()
1747 spin_lock_init(&afe->port_list_lock); in q6afe_probe()
1766 .name = "qcom-q6afe",
1774 MODULE_LICENSE("GPL v2");