diff options
author | Josh Kirsch <jkirsch@codeaurora.org> | 2019-01-10 19:30:55 -0800 |
---|---|---|
committer | Meng Wang <mengw@codeaurora.org> | 2019-02-20 19:04:04 +0800 |
commit | 6ec6971e349dd368bc31ae30eb88625882098e1d (patch) | |
tree | 7302b2a1df79466e1f74d378645c29b912862139 /ipc | |
parent | 5bb681434b7ccced31c193393581db898990de4b (diff) | |
download | msm-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.c | 38 | ||||
-rw-r--r-- | ipc/apr_v3.c | 8 |
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) { |