summaryrefslogtreecommitdiff
path: root/ipc
diff options
context:
space:
mode:
authorJosh Kirsch <jkirsch@codeaurora.org>2019-01-10 19:30:55 -0800
committerMeng Wang <mengw@codeaurora.org>2019-02-20 19:04:04 +0800
commit6ec6971e349dd368bc31ae30eb88625882098e1d (patch)
tree7302b2a1df79466e1f74d378645c29b912862139 /ipc
parent5bb681434b7ccced31c193393581db898990de4b (diff)
downloadmsm-extra-6ec6971e349dd368bc31ae30eb88625882098e1d.tar.gz
audio-kernel: asoc: ipc: add support for MDSP target
Add support for MDSP based targets. Change-Id: Iac1402db89b321e85d4ccdb3863d697484c8251e Signed-off-by: Josh Kirsch <jkirsch@codeaurora.org>
Diffstat (limited to 'ipc')
-rw-r--r--ipc/apr_tal_rpmsg.c38
-rw-r--r--ipc/apr_v3.c8
2 files changed, 37 insertions, 9 deletions
diff --git a/ipc/apr_tal_rpmsg.c b/ipc/apr_tal_rpmsg.c
index 723de56b..c8830d1c 100644
--- a/ipc/apr_tal_rpmsg.c
+++ b/ipc/apr_tal_rpmsg.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
*/
#include <linux/module.h>
@@ -10,6 +10,7 @@
#include <linux/delay.h>
#include <linux/rpmsg.h>
#include <ipc/apr_tal.h>
+#include <linux/of_device.h>
enum apr_channel_state {
APR_CH_DISCONNECTED,
@@ -125,14 +126,13 @@ struct apr_svc_ch_dev *apr_tal_open(uint32_t clnt, uint32_t dest, uint32_t dl,
int rc = 0;
struct apr_svc_ch_dev *apr_ch = NULL;
- if ((clnt != APR_CLIENT_AUDIO) || (dest != APR_DEST_QDSP6) ||
+ if ((clnt != APR_CLIENT_AUDIO) || (dest >= APR_DEST_MAX) ||
(dl != APR_DL_SMD)) {
pr_err("%s: Invalid params, clnt:%d, dest:%d, dl:%d\n",
__func__, clnt, dest, dl);
return NULL;
}
-
- apr_ch = &apr_svc_ch[APR_DL_SMD][APR_DEST_QDSP6][APR_CLIENT_AUDIO];
+ apr_ch = &apr_svc_ch[dl][dest][clnt];
mutex_lock(&apr_ch->m_lock);
if (!apr_ch->handle) {
rc = wait_event_timeout(apr_ch->wait,
@@ -207,24 +207,46 @@ static int apr_tal_rpmsg_callback(struct rpmsg_device *rpdev,
static int apr_tal_rpmsg_probe(struct rpmsg_device *rpdev)
{
struct apr_svc_ch_dev *apr_ch = NULL;
+ int ret = 0;
+ const char* dest;
+
+ ret = of_property_read_string(rpdev->dev.parent->of_node,
+ "mbox-names", &dest);
+
+ if(ret < 0){
+ pr_err("%s no parent source pid found\n", __func__);
+ return -EINVAL;
+ }
if (!strcmp(rpdev->id.name, "apr_audio_svc")) {
dev_info(&rpdev->dev, "%s: Channel[%s] state[Up]\n",
__func__, rpdev->id.name);
-
+ } else {
+ dev_err(&rpdev->dev, "%s, Invalid Channel [%s]\n",
+ __func__, rpdev->id.name);
+ return -EINVAL;
+ }
+ if(strstr(dest, "adsp")) {
apr_ch =
&apr_svc_ch[APR_DL_SMD][APR_DEST_QDSP6][APR_CLIENT_AUDIO];
apr_ch->handle = rpdev;
apr_ch->channel_state = APR_CH_CONNECTED;
dev_set_drvdata(&rpdev->dev, apr_ch);
wake_up(&apr_ch->wait);
+ } else if(strstr(dest, "mpss")) {
+ apr_ch =
+ &apr_svc_ch[APR_DL_SMD][APR_DEST_MODEM][APR_CLIENT_AUDIO];
+ apr_ch->handle = rpdev;
+ apr_ch->channel_state = APR_CH_CONNECTED;
+ dev_set_drvdata(&rpdev->dev, apr_ch);
+ wake_up(&apr_ch->wait);
} else {
- dev_err(&rpdev->dev, "%s, Invalid Channel [%s]\n",
- __func__, rpdev->id.name);
+ dev_err(&rpdev->dev, "%s, unsupported dest %s\n",
+ __func__, dest);
return -EINVAL;
}
- return 0;
+ return ret;
}
static void apr_tal_rpmsg_remove(struct rpmsg_device *rpdev)
diff --git a/ipc/apr_v3.c b/ipc/apr_v3.c
index 7bf47749..4160beee 100644
--- a/ipc/apr_v3.c
+++ b/ipc/apr_v3.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2016, 2019 The Linux Foundation. All rights reserved.
*/
#include <linux/types.h>
@@ -13,10 +13,16 @@
#define DEST_ID APR_DEST_MODEM
+/**
+ * apr_get_subsys_state - get modem subsys status
+ *
+ * Returns apr_subsys_state
+ */
enum apr_subsys_state apr_get_subsys_state(void)
{
return apr_get_modem_state();
}
+EXPORT_SYMBOL(apr_get_subsys_state);
void apr_set_subsys_state(void)
{