dai-zephyr/dai-legacy: split the dai_prepare() function

Split the dai_prepare() function and add a new helper,
dai_zephyr_prepare() that can also be invoked from the copier device.
Also modify the dai_config_prepare() function to pass the dai_data and
device separately for use with the copier device.

Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
This commit is contained in:
Ranjani Sridharan 2023-05-02 10:53:05 -07:00 committed by Kai Vehmanen
parent c8dc91ea53
commit 9da71a8708
2 changed files with 51 additions and 39 deletions

View File

@ -618,9 +618,8 @@ static int dai_params(struct comp_dev *dev,
dai_capture_params(dev, period_bytes, period_count);
}
static int dai_config_prepare(struct comp_dev *dev)
static int dai_config_prepare(struct dai_data *dd, struct comp_dev *dev)
{
struct dai_data *dd = comp_get_drvdata(dev);
int channel = 0;
/* cannot configure DAI while active */
@ -669,24 +668,10 @@ static int dai_config_prepare(struct comp_dev *dev)
return 0;
}
static int dai_prepare(struct comp_dev *dev)
static int dai_zephyr_prepare(struct dai_data *dd, struct comp_dev *dev)
{
struct dai_data *dd = comp_get_drvdata(dev);
struct comp_buffer __sparse_cache *buffer_c;
int ret = 0;
comp_info(dev, "dai_prepare()");
ret = dai_config_prepare(dev);
if (ret < 0)
return ret;
ret = comp_set_state(dev, COMP_TRIGGER_PREPARE);
if (ret < 0)
return ret;
if (ret == COMP_STATUS_STATE_ALREADY_SET)
return PPL_STATUS_PATH_STOP;
int ret;
dd->total_data_processed = 0;
@ -711,7 +696,7 @@ static int dai_prepare(struct comp_dev *dev)
if (dd->xrun) {
/* after prepare, we have recovered from xrun */
dd->xrun = 0;
return ret;
return 0;
}
ret = dma_set_config_legacy(dd->chan, &dd->config);
@ -721,6 +706,27 @@ static int dai_prepare(struct comp_dev *dev)
return ret;
}
static int dai_prepare(struct comp_dev *dev)
{
struct dai_data *dd = comp_get_drvdata(dev);
int ret;
comp_info(dev, "dai_prepare()");
ret = dai_config_prepare(dd, dev);
if (ret < 0)
return ret;
ret = comp_set_state(dev, COMP_TRIGGER_PREPARE);
if (ret < 0)
return ret;
if (ret == COMP_STATUS_STATE_ALREADY_SET)
return PPL_STATUS_PATH_STOP;
return dai_zephyr_prepare(dd, dev);
}
static int dai_reset(struct comp_dev *dev)
{
struct dai_data *dd = comp_get_drvdata(dev);

View File

@ -874,9 +874,8 @@ static int dai_params(struct comp_dev *dev, struct sof_ipc_stream_params *params
dai_capture_params(dev, period_bytes, period_count);
}
static int dai_config_prepare(struct comp_dev *dev)
static int dai_config_prepare(struct dai_data *dd, struct comp_dev *dev)
{
struct dai_data *dd = comp_get_drvdata(dev);
int channel;
/* cannot configure DAI while active */
@ -922,35 +921,21 @@ static int dai_config_prepare(struct comp_dev *dev)
return 0;
}
static int dai_prepare(struct comp_dev *dev)
static int dai_zephyr_prepare(struct dai_data *dd, struct comp_dev *dev)
{
struct dai_data *dd = comp_get_drvdata(dev);
struct comp_buffer __sparse_cache *buffer_c;
int ret;
comp_dbg(dev, "dai_prepare()");
ret = dai_config_prepare(dev);
if (ret < 0)
return ret;
ret = comp_set_state(dev, COMP_TRIGGER_PREPARE);
if (ret < 0)
return ret;
if (ret == COMP_STATUS_STATE_ALREADY_SET)
return PPL_STATUS_PATH_STOP;
dd->total_data_processed = 0;
if (!dd->chan) {
comp_err(dev, "dai_prepare(): Missing dd->chan.");
comp_err(dev, "dai_zephyr_prepare(): Missing dd->chan.");
comp_set_state(dev, COMP_TRIGGER_RESET);
return -EINVAL;
}
if (!dd->config.elem_array.elems) {
comp_err(dev, "dai_prepare(): Missing dd->config.elem_array.elems.");
comp_err(dev, "dai_zephyr_prepare(): Missing dd->config.elem_array.elems.");
comp_set_state(dev, COMP_TRIGGER_RESET);
return -EINVAL;
}
@ -964,7 +949,7 @@ static int dai_prepare(struct comp_dev *dev)
if (dd->xrun) {
/* after prepare, we have recovered from xrun */
dd->xrun = 0;
return ret;
return 0;
}
ret = dma_config(dd->chan->dma->z_dev, dd->chan->index, dd->z_config);
@ -974,6 +959,27 @@ static int dai_prepare(struct comp_dev *dev)
return ret;
}
static int dai_prepare(struct comp_dev *dev)
{
struct dai_data *dd = comp_get_drvdata(dev);
int ret;
comp_dbg(dev, "dai_prepare()");
ret = dai_config_prepare(dd, dev);
if (ret < 0)
return ret;
ret = comp_set_state(dev, COMP_TRIGGER_PREPARE);
if (ret < 0)
return ret;
if (ret == COMP_STATUS_STATE_ALREADY_SET)
return PPL_STATUS_PATH_STOP;
return dai_zephyr_prepare(dd, dev);
}
static int dai_reset(struct comp_dev *dev)
{
struct dai_data *dd = comp_get_drvdata(dev);