diff --git a/ipc/apr_tal_rpmsg.c b/ipc/apr_tal_rpmsg.c index 723de56b9df8..c8830d1c25cc 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 @@ -10,6 +10,7 @@ #include #include #include +#include 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 7bf47749ef80..4160beee4836 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 @@ -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) {