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 * 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 * 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) enum apr_subsys_state apr_get_modem_state(void)
{ {
return atomic_read(&q6.modem_state); 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; can_open_channel = false;
domain_id = APR_DOMAIN_MODEM; 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 { } else {
pr_err("APR: wrong destination\n"); pr_err("APR: wrong destination\n");
goto done; 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__); 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)) { 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); pr_err("APR: Wrong svc :%d\n", svc);
return; return;
} }
} else if (hdr->src_domain == APR_DOMAIN_SDSP) {
clnt = APR_CLIENT_AUDIO;
} else { } else {
pr_err("APR: Pkt from wrong source: %d\n", hdr->src_domain); pr_err("APR: Pkt from wrong source: %d\n", hdr->src_domain);
return; 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)) { if ((domain_id == APR_DOMAIN_ADSP)) {
tbl = (struct apr_svc_table *)&svc_tbl_qdsp6; tbl = (struct apr_svc_table *)&svc_tbl_qdsp6;
size = ARRAY_SIZE(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 { } else {
tbl = (struct apr_svc_table *)&svc_tbl_voice; tbl = (struct apr_svc_table *)&svc_tbl_voice;
size = ARRAY_SIZE(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. * All rights reserved.
* *
* This program is free software; you can redistribute it and/or modify * 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_audio_svc",
"apr_voice_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]; 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) || if ((clnt >= APR_CLIENT_MAX) || (dest >= APR_DEST_MAX) ||
(dl >= APR_DL_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; 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"); pr_debug("apr_tal:Wakeup done\n");
apr_svc_ch[dl][dest][clnt].dest_state = 0; apr_svc_ch[dl][dest][clnt].dest_state = 0;
} }
rc = smd_named_open_on_edge(svc_names[dest][clnt], dest, rc = smd_named_open_on_edge(svc_names[dest][clnt], dest,
&apr_svc_ch[dl][dest][clnt].ch, &apr_svc_ch[dl][dest][clnt].ch,
&apr_svc_ch[dl][dest][clnt], &apr_svc_ch[dl][dest][clnt],
apr_tal_notify); apr_tal_notify);
if (rc < 0) { if (rc < 0) {
pr_err("apr_tal: smd_open failed %s\n", pr_err("apr_tal: smd_open failed %s\n",
svc_names[dest][clnt]); svc_names[dest][clnt]);
@ -256,6 +267,12 @@ static int apr_smd_probe(struct platform_device *pdev)
clnt = APR_CLIENT_AUDIO; clnt = APR_CLIENT_AUDIO;
apr_svc_ch[APR_DL_SMD][dest][clnt].dest_state = 1; apr_svc_ch[APR_DL_SMD][dest][clnt].dest_state = 1;
wake_up(&apr_svc_ch[APR_DL_SMD][dest][clnt].dest); 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 } else
pr_err("apr_tal:Invalid Dest Id: %d\n", pdev->id); 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) static int __init apr_tal_init(void)
{ {
int i, j, k; 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_q6_driver);
platform_driver_register(&apr_modem_driver); platform_driver_register(&apr_modem_driver);
platform_driver_register(&apr_sdsp_driver);
return 0; return 0;
} }
device_initcall(apr_tal_init); 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; return APR_DEST_MODEM;
else if (hdr->src_domain == APR_DOMAIN_ADSP) else if (hdr->src_domain == APR_DOMAIN_ADSP)
return APR_DEST_QDSP6; return APR_DEST_QDSP6;
else if (hdr->src_domain == APR_DOMAIN_SDSP)
return APR_DEST_DSPS;
else { else {
pr_err("APR: Pkt from wrong source: %d\n", hdr->src_domain); pr_err("APR: Pkt from wrong source: %d\n", hdr->src_domain);
return APR_DEST_MAX; /*RETURN INVALID VALUE*/ return APR_DEST_MAX; /*RETURN INVALID VALUE*/
@ -47,6 +49,8 @@ int apr_get_dest_id(char *dest)
{ {
if (!strcmp(dest, "ADSP")) if (!strcmp(dest, "ADSP"))
return APR_DEST_QDSP6; return APR_DEST_QDSP6;
else if (!strcmp(dest, "SDSP"))
return APR_DEST_DSPS;
else else
return APR_DEST_MODEM; return APR_DEST_MODEM;
} }

View file

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

View file

@ -27,7 +27,8 @@
#define APR_DEST_MODEM 0 #define APR_DEST_MODEM 0
#define APR_DEST_QDSP6 1 #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) || \ #if defined(CONFIG_MSM_QDSP6_APRV2_GLINK) || \
defined(CONFIG_MSM_QDSP6_APRV3_GLINK) defined(CONFIG_MSM_QDSP6_APRV3_GLINK)