summaryrefslogtreecommitdiffstats
path: root/src/lib/nhlt.c
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2016-06-28 14:59:21 -0500
committerAaron Durbin <adurbin@chromium.org>2016-06-29 23:13:54 +0200
commited0f6d7cb762b40d282101cf847f3d45209a5f26 (patch)
tree6e99d1ee5fe1c5e234bb7d670ddb10fbac8c7f89 /src/lib/nhlt.c
parent78461a9d55de07f3187b48dfd6abca48db90e906 (diff)
downloadcoreboot-ed0f6d7cb762b40d282101cf847f3d45209a5f26.tar.gz
coreboot-ed0f6d7cb762b40d282101cf847f3d45209a5f26.tar.bz2
coreboot-ed0f6d7cb762b40d282101cf847f3d45209a5f26.zip
lib/nhlt: add helper functions for adding endpoints
In order to ease the porting of supporting NHLT endpoints introduce a nhlt_endpoint_descriptor structure as well as corresponding helper functions. Change-Id: I68edaf681b4e60502f6ddbbd04de21d8aa072296 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: https://review.coreboot.org/15486 Reviewed-by: Furquan Shaikh <furquan@google.com> Tested-by: build bot (Jenkins)
Diffstat (limited to 'src/lib/nhlt.c')
-rw-r--r--src/lib/nhlt.c60
1 files changed, 59 insertions, 1 deletions
diff --git a/src/lib/nhlt.c b/src/lib/nhlt.c
index 11a397ca8ef1..7bf8ce89606e 100644
--- a/src/lib/nhlt.c
+++ b/src/lib/nhlt.c
@@ -24,6 +24,7 @@
#define NHLT_RID 1
#define NHLT_SSID 1
#define WAVEFORMAT_TAG 0xfffe
+#define DEFAULT_VIRTUAL_BUS_ID 0
static const struct sub_format pcm_subformat = {
.data1 = 0x00000001,
@@ -68,7 +69,7 @@ struct nhlt_endpoint *nhlt_add_endpoint(struct nhlt *nhlt, int link_type,
endp->subsystem_id = NHLT_SSID;
endp->device_type = device_type;
endp->direction = dir;
- endp->virtual_bus_id = 0;
+ endp->virtual_bus_id = DEFAULT_VIRTUAL_BUS_ID;
nhlt->num_endpoints++;
@@ -437,3 +438,60 @@ uintptr_t nhlt_serialize_oem_overrides(struct nhlt *nhlt,
return acpi_addr;
}
+
+static int _nhlt_add_single_endpoint(struct nhlt *nhlt, int virtual_bus_id,
+ const struct nhlt_endp_descriptor *epd)
+{
+ struct nhlt_endpoint *endp;
+
+ endp = nhlt_add_endpoint(nhlt, epd->link, epd->device, epd->direction,
+ epd->vid, epd->did);
+
+ if (endp == NULL)
+ return -1;
+
+ endp->virtual_bus_id = virtual_bus_id;
+
+ if (nhlt_endpoint_append_config(endp, epd->cfg, epd->cfg_size))
+ return -1;
+
+ if (nhlt_endpoint_add_formats(endp, epd->formats, epd->num_formats))
+ return -1;
+
+ return 0;
+}
+
+static int _nhlt_add_endpoints(struct nhlt *nhlt, int virtual_bus_id,
+ const struct nhlt_endp_descriptor *epds,
+ size_t num_epds)
+{
+ size_t i;
+
+ for (i = 0; i < num_epds; i++)
+ if (_nhlt_add_single_endpoint(nhlt, virtual_bus_id, &epds[i]))
+ return -1;
+
+ return 0;
+}
+
+int nhlt_add_endpoints(struct nhlt *nhlt,
+ const struct nhlt_endp_descriptor *epds,
+ size_t num_epds)
+{
+ int ret;
+ ret = _nhlt_add_endpoints(nhlt, DEFAULT_VIRTUAL_BUS_ID, epds, num_epds);
+ return ret;
+}
+
+int nhlt_add_ssp_endpoints(struct nhlt *nhlt, int virtual_bus_id,
+ const struct nhlt_endp_descriptor *epds, size_t num_epds)
+{
+ int ret;
+
+ ret = _nhlt_add_endpoints(nhlt, virtual_bus_id, epds, num_epds);
+
+ if (!ret)
+ nhlt_next_instance(nhlt, NHLT_LINK_SSP);
+
+ return ret;
+}