From 9c725348369a08cf2f6e741d81b1ea94f3354086 Mon Sep 17 00:00:00 2001 From: Viorel Suman Date: Thu, 25 Mar 2021 13:21:11 +0200 Subject: [PATCH] dai: add DAI driver "hw_params" callback Add "hw_params" callback in order to provide the stream information like stream rate, number of channels and format to DAI IP driver. Signed-off-by: Viorel Suman --- src/audio/dai.c | 26 ++++++++++++++++++++++++++ src/include/sof/lib/dai.h | 15 +++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/audio/dai.c b/src/audio/dai.c index 7992f18b1..dfc48ef18 100644 --- a/src/audio/dai.c +++ b/src/audio/dai.c @@ -295,6 +295,25 @@ static int dai_comp_get_hw_params(struct comp_dev *dev, return 0; } +static int dai_comp_hw_params(struct comp_dev *dev, + struct sof_ipc_stream_params *params) +{ + struct dai_data *dd = comp_get_drvdata(dev); + int ret; + + comp_dbg(dev, "dai_comp_hw_params()"); + + /* configure hw dai stream params */ + ret = dai_hw_params(dd->dai, params); + if (ret < 0) { + comp_err(dev, "dai_comp_hw_params(): dai_hw_params failed ret %d", + ret); + return ret; + } + + return 0; +} + static int dai_verify_params(struct comp_dev *dev, struct sof_ipc_stream_params *params) { @@ -524,6 +543,13 @@ static int dai_params(struct comp_dev *dev, return -EINVAL; } + /* params verification passed, so now configure hw dai stream params */ + err = dai_comp_hw_params(dev, params); + if (err < 0) { + comp_err(dev, "dai_params(): dai_comp_hw_params failed err %d", err); + return err; + } + if (dev->direction == SOF_IPC_STREAM_PLAYBACK) dd->local_buffer = list_first_item(&dev->bsource_list, struct comp_buffer, diff --git a/src/include/sof/lib/dai.h b/src/include/sof/lib/dai.h index 5218aed42..ece4c13f8 100644 --- a/src/include/sof/lib/dai.h +++ b/src/include/sof/lib/dai.h @@ -77,6 +77,7 @@ struct dai_ops { int (*pm_context_store)(struct dai *dai); int (*get_hw_params)(struct dai *dai, struct sof_ipc_stream_params *params, int dir); + int (*hw_params)(struct dai *dai, struct sof_ipc_stream_params *params); int (*get_handshake)(struct dai *dai, int direction, int stream_id); int (*get_fifo)(struct dai *dai, int direction, int stream_id); int (*probe)(struct dai *dai); @@ -378,6 +379,20 @@ static inline int dai_get_hw_params(struct dai *dai, return ret; } +/** + * \brief Configure Digital Audio interface stream parameters + */ +static inline int dai_hw_params(struct dai *dai, + struct sof_ipc_stream_params *params) +{ + int ret = 0; + + if (dai->drv->ops.hw_params) + ret = dai->drv->ops.hw_params(dai, params); + + return ret; +} + /** * \brief Get Digital Audio interface DMA Handshake */