Merge "soc: msm: add apr sensor domain support"

This commit is contained in:
Linux Build Service Account 2018-05-01 06:26:31 -07:00 committed by Gerrit - the friendly Code Review server
commit 036d89dd56
5 changed files with 65 additions and 8 deletions

View file

@ -1,4 +1,5 @@
/* Copyright (c) 2010-2014, 2016 The Linux Foundation. All rights reserved.
/* Copyright (c) 2010-2014, 2016, 2018 The Linux Foundation.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@ -209,6 +210,16 @@ static struct apr_svc_table svc_tbl_voice[] = {
},
};
static const struct apr_svc_table svc_tbl_sdsp[] = {
{
/* Micro Audio Service */
.name = "MAS",
.idx = 0,
.id = APR_SVC_MAS,
.client_id = APR_CLIENT_AUDIO,
},
};
enum apr_subsys_state apr_get_modem_state(void)
{
return atomic_read(&q6.modem_state);
@ -444,6 +455,9 @@ struct apr_svc *apr_register(char *dest, char *svc_name, apr_fn svc_fn,
*/
can_open_channel = false;
domain_id = APR_DOMAIN_MODEM;
} else if (!strcmp(dest, "SDSP")) {
domain_id = APR_DOMAIN_SDSP;
pr_debug("APR: SDSP DOMAIN_ID %d\n", domain_id);
} else {
pr_err("APR: wrong destination\n");
goto done;
@ -472,6 +486,8 @@ struct apr_svc *apr_register(char *dest, char *svc_name, apr_fn svc_fn,
}
}
pr_debug("%s: modem Up\n", __func__);
} else if (dest_id == APR_DEST_DSPS) {
pr_debug("%s: Sensor DSP Up\n", __func__);
}
if (apr_get_svc(svc_name, domain_id, &client_id, &svc_idx, &svc_id)) {
@ -624,6 +640,8 @@ void apr_cb_func(void *buf, int len, void *priv)
pr_err("APR: Wrong svc :%d\n", svc);
return;
}
} else if (hdr->src_domain == APR_DOMAIN_SDSP) {
clnt = APR_CLIENT_AUDIO;
} else {
pr_err("APR: Pkt from wrong source: %d\n", hdr->src_domain);
return;
@ -700,6 +718,9 @@ int apr_get_svc(const char *svc_name, int domain_id, int *client_id,
if ((domain_id == APR_DOMAIN_ADSP)) {
tbl = (struct apr_svc_table *)&svc_tbl_qdsp6;
size = ARRAY_SIZE(svc_tbl_qdsp6);
} else if (domain_id == APR_DOMAIN_SDSP) {
tbl = (struct apr_svc_table *)&svc_tbl_sdsp;
size = ARRAY_SIZE(svc_tbl_sdsp);
} else {
tbl = (struct apr_svc_table *)&svc_tbl_voice;
size = ARRAY_SIZE(svc_tbl_voice);

View file

@ -1,4 +1,4 @@
/* Copyright (c) 2010-2011, 2013-2014, 2016 The Linux Foundation.
/* Copyright (c) 2010-2011, 2013-2014, 2016, 2018 The Linux Foundation.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@ -38,6 +38,14 @@ static char *svc_names[APR_DEST_MAX][APR_CLIENT_MAX] = {
"apr_audio_svc",
"apr_voice_svc",
},
{
"",
"",
},
{
"apr_apps_sdsp",
"apr_apps_sdsp",
},
};
struct apr_svc_ch_dev apr_svc_ch[APR_DL_MAX][APR_DEST_MAX][APR_CLIENT_MAX];
@ -162,7 +170,8 @@ struct apr_svc_ch_dev *apr_tal_open(uint32_t clnt, uint32_t dest,
if ((clnt >= APR_CLIENT_MAX) || (dest >= APR_DEST_MAX) ||
(dl >= APR_DL_MAX)) {
pr_err("apr_tal: Invalid params\n");
pr_err("apr_tal: Invalid params clnt %d dest %d dl %d\n",
clnt, dest, dl);
return NULL;
}
@ -184,10 +193,12 @@ struct apr_svc_ch_dev *apr_tal_open(uint32_t clnt, uint32_t dest,
pr_debug("apr_tal:Wakeup done\n");
apr_svc_ch[dl][dest][clnt].dest_state = 0;
}
rc = smd_named_open_on_edge(svc_names[dest][clnt], dest,
&apr_svc_ch[dl][dest][clnt].ch,
&apr_svc_ch[dl][dest][clnt],
apr_tal_notify);
if (rc < 0) {
pr_err("apr_tal: smd_open failed %s\n",
svc_names[dest][clnt]);
@ -256,6 +267,12 @@ static int apr_smd_probe(struct platform_device *pdev)
clnt = APR_CLIENT_AUDIO;
apr_svc_ch[APR_DL_SMD][dest][clnt].dest_state = 1;
wake_up(&apr_svc_ch[APR_DL_SMD][dest][clnt].dest);
} else if (pdev->id == APR_DEST_DSPS) {
pr_info("apr_tal:Sensor DSP Is Up\n");
dest = APR_DEST_DSPS;
clnt = APR_CLIENT_AUDIO;
apr_svc_ch[APR_DL_SMD][dest][clnt].dest_state = 1;
wake_up(&apr_svc_ch[APR_DL_SMD][dest][clnt].dest);
} else
pr_err("apr_tal:Invalid Dest Id: %d\n", pdev->id);
@ -278,6 +295,14 @@ static struct platform_driver apr_modem_driver = {
},
};
static struct platform_driver apr_sdsp_driver = {
.probe = apr_smd_probe,
.driver = {
.name = "apr_apps_sdsp",
.owner = THIS_MODULE,
},
};
static int __init apr_tal_init(void)
{
int i, j, k;
@ -293,6 +318,7 @@ static int __init apr_tal_init(void)
}
platform_driver_register(&apr_q6_driver);
platform_driver_register(&apr_modem_driver);
platform_driver_register(&apr_sdsp_driver);
return 0;
}
device_initcall(apr_tal_init);

View file

@ -37,6 +37,8 @@ uint16_t apr_get_data_src(struct apr_hdr *hdr)
return APR_DEST_MODEM;
else if (hdr->src_domain == APR_DOMAIN_ADSP)
return APR_DEST_QDSP6;
else if (hdr->src_domain == APR_DOMAIN_SDSP)
return APR_DEST_DSPS;
else {
pr_err("APR: Pkt from wrong source: %d\n", hdr->src_domain);
return APR_DEST_MAX; /*RETURN INVALID VALUE*/
@ -47,6 +49,8 @@ int apr_get_dest_id(char *dest)
{
if (!strcmp(dest, "ADSP"))
return APR_DEST_QDSP6;
else if (!strcmp(dest, "SDSP"))
return APR_DEST_DSPS;
else
return APR_DEST_MODEM;
}

View file

@ -69,7 +69,9 @@ struct apr_hdr {
#define APR_DOMAIN_MODEM 0x3
#define APR_DOMAIN_ADSP 0x4
#define APR_DOMAIN_APPS 0x5
#define APR_DOMAIN_MAX 0x6
#define APR_DOMAIN_SDSP 0x8
#define APR_DOMAIN_MAX 0x9
/* ADSP service IDs */
#define APR_SVC_TEST_CLIENT 0x2
@ -94,6 +96,9 @@ struct apr_hdr {
#define APR_SVC_CVP 0x6
#define APR_SVC_SRD 0x7
/* Sensor DSP Micro Audio Service IDs */
#define APR_SVC_MAS 0x3
/* APR Port IDs */
#define APR_MAX_PORTS 0x80

View file

@ -27,7 +27,8 @@
#define APR_DEST_MODEM 0
#define APR_DEST_QDSP6 1
#define APR_DEST_MAX 2
#define APR_DEST_DSPS 3
#define APR_DEST_MAX 4
#if defined(CONFIG_MSM_QDSP6_APRV2_GLINK) || \
defined(CONFIG_MSM_QDSP6_APRV3_GLINK)