summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Chen <chenche@codeaurora.org>2017-10-30 14:16:11 -0400
committerGerrit - the friendly Code Review server <code-review@localhost>2018-04-20 10:43:14 -0700
commit6bb3622c732c018a33c5f9a19f356632fa5ca72b (patch)
treea27559dbdcce76810c0ff04b828c88c6155f18f1
parentace014f81d7b6e900f9137313e6356ff803d52dc (diff)
soc: msm: add apr sensor domain support
Add APR Sensor (DSPS) domain support for Active Noise Cancellation (ANC) usecase. CRs-fixed: 2153236 Change-Id: I5a271aac25ac6e538751d742dc0bf1b105221112 Signed-off-by: Derek Chen <chenche@codeaurora.org>
-rw-r--r--drivers/soc/qcom/qdsp6v2/apr.c23
-rw-r--r--drivers/soc/qcom/qdsp6v2/apr_tal.c36
-rw-r--r--drivers/soc/qcom/qdsp6v2/apr_v2.c4
-rw-r--r--include/linux/qdsp6v2/apr.h7
-rw-r--r--include/linux/qdsp6v2/apr_tal.h3
5 files changed, 65 insertions, 8 deletions
diff --git a/drivers/soc/qcom/qdsp6v2/apr.c b/drivers/soc/qcom/qdsp6v2/apr.c
index b1afd02b49bf..fefc348c0027 100644
--- a/drivers/soc/qcom/qdsp6v2/apr.c
+++ b/drivers/soc/qcom/qdsp6v2/apr.c
@@ -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);
diff --git a/drivers/soc/qcom/qdsp6v2/apr_tal.c b/drivers/soc/qcom/qdsp6v2/apr_tal.c
index 6cffe7be655a..3884667cc12c 100644
--- a/drivers/soc/qcom/qdsp6v2/apr_tal.c
+++ b/drivers/soc/qcom/qdsp6v2/apr_tal.c
@@ -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);
+ &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);
diff --git a/drivers/soc/qcom/qdsp6v2/apr_v2.c b/drivers/soc/qcom/qdsp6v2/apr_v2.c
index 037fb3327ef0..d42f2ff5912e 100644
--- a/drivers/soc/qcom/qdsp6v2/apr_v2.c
+++ b/drivers/soc/qcom/qdsp6v2/apr_v2.c
@@ -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;
}
diff --git a/include/linux/qdsp6v2/apr.h b/include/linux/qdsp6v2/apr.h
index adcdbcbc5907..98432952f278 100644
--- a/include/linux/qdsp6v2/apr.h
+++ b/include/linux/qdsp6v2/apr.h
@@ -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
diff --git a/include/linux/qdsp6v2/apr_tal.h b/include/linux/qdsp6v2/apr_tal.h
index bf324064960b..9b35c9f9882d 100644
--- a/include/linux/qdsp6v2/apr_tal.h
+++ b/include/linux/qdsp6v2/apr_tal.h
@@ -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)