diff options
author | Aaron Durbin <adurbin@chromium.org> | 2016-06-28 14:59:21 -0500 |
---|---|---|
committer | Aaron Durbin <adurbin@chromium.org> | 2016-06-29 23:13:54 +0200 |
commit | ed0f6d7cb762b40d282101cf847f3d45209a5f26 (patch) | |
tree | 6e99d1ee5fe1c5e234bb7d670ddb10fbac8c7f89 /src/lib | |
parent | 78461a9d55de07f3187b48dfd6abca48db90e906 (diff) | |
download | coreboot-ed0f6d7cb762b40d282101cf847f3d45209a5f26.tar.xz |
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')
-rw-r--r-- | src/lib/nhlt.c | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/src/lib/nhlt.c b/src/lib/nhlt.c index 11a397ca8e..7bf8ce8960 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; +} |