Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 11 additions & 10 deletions src/audio/dai.c
Original file line number Diff line number Diff line change
Expand Up @@ -668,7 +668,8 @@ static int dai_position(struct comp_dev *dev, struct sof_ipc_stream_posn *posn)
return 0;
}

static int dai_config(struct comp_dev *dev, struct sof_ipc_dai_config *config)
static int dai_config(struct comp_dev *dev, struct sof_ipc_dai_config *config,
int config_idx)
{
struct sof_ipc_comp_config *dconfig = COMP_GET_CONFIG(dev);
struct dai_data *dd = comp_get_drvdata(dev);
Expand All @@ -677,18 +678,18 @@ static int dai_config(struct comp_dev *dev, struct sof_ipc_dai_config *config)
int handshake;

trace_dai_comp_with_ids(dev, "dai_config() dai %d.%d",
config->type, config->dai_index);
config->params.type, config->params.dai_index);

/* cannot configure DAI while active */
if (dev->state == COMP_STATE_ACTIVE) {
trace_dai_comp_error_with_ids(dev, "dai_config() error: Component is in active state.");
return -EINVAL;
}

switch (config->type) {
switch (config->params.type) {
case SOF_DAI_INTEL_SSP:
/* set dma burst elems to slot number */
dd->config.burst_elems = config->ssp.tdm_slots;
dd->config.burst_elems = config->ssp[config_idx].tdm_slots;
break;
case SOF_DAI_INTEL_DMIC:
tracev_dai_comp_with_ids(dev, "dai_config(), config->type = SOF_DAI_INTEL_DMIC");
Expand All @@ -697,11 +698,11 @@ static int dai_config(struct comp_dev *dev, struct sof_ipc_dai_config *config)
dd->config.burst_elems = 8;

trace_dai_comp_with_ids(dev, "dai_config(), config->dmic.fifo_bits = %u config->dmic.num_pdm_active = %u",
config->dmic.fifo_bits,
config->dmic.num_pdm_active);
config->dmic[config_idx].fifo_bits,
config->dmic[config_idx].num_pdm_active);
break;
case SOF_DAI_INTEL_HDA:
channel = config->hda.link_dma_ch;
channel = config->hda[config_idx].link_dma_ch;
trace_dai_comp_with_ids(dev, "dai_config(), channel = %d",
channel);

Expand Down Expand Up @@ -729,8 +730,8 @@ static int dai_config(struct comp_dev *dev, struct sof_ipc_dai_config *config)
/* As with HDA, the DMA channel is assigned in runtime,
* not during topology parsing.
*/
channel = config->alh.stream_id;
dd->stream_id = config->alh.stream_id;
channel = config->alh[config_idx].stream_id;
dd->stream_id = config->alh[config_idx].stream_id;
trace_dai_comp_with_ids(dev, "dai_config(), channel = %d",
channel);
break;
Expand Down Expand Up @@ -778,7 +779,7 @@ static int dai_config(struct comp_dev *dev, struct sof_ipc_dai_config *config)
dai_dma_cb);
}

return dai_set_config(dd->dai, config);
return dai_set_config(dd->dai, config, config_idx);
}

static int dai_ts_config(struct comp_dev *dev)
Expand Down
11 changes: 6 additions & 5 deletions src/drivers/imx/esai.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,13 +89,14 @@ static int esai_context_restore(struct dai *dai)
}

static inline int esai_set_config(struct dai *dai,
struct sof_ipc_dai_config *config)
struct sof_ipc_dai_config *config,
int config_idx)
{
uint32_t xcr = 0, xccr = 0, mask;

tracev_esai("ESAI: set_config format 0x%04x",
config->format);
switch (config->format & SOF_DAI_FMT_FORMAT_MASK) {
config->params.format);
switch (config->params.format & SOF_DAI_FMT_FORMAT_MASK) {
case SOF_DAI_FMT_I2S:
/* Data on rising edge of bclk, frame low, 1clk before
* data
Expand Down Expand Up @@ -134,7 +135,7 @@ static inline int esai_set_config(struct dai *dai,
return -EINVAL;
}

switch (config->format & SOF_DAI_FMT_INV_MASK) {
switch (config->params.format & SOF_DAI_FMT_INV_MASK) {
case SOF_DAI_FMT_NB_NF:
/* Nothing to do for both normal cases */
break;
Expand All @@ -155,7 +156,7 @@ static inline int esai_set_config(struct dai *dai,
return -EINVAL;
}

switch (config->format & SOF_DAI_FMT_MASTER_MASK) {
switch (config->params.format & SOF_DAI_FMT_MASTER_MASK) {
case SOF_DAI_FMT_CBM_CFM:
/* Nothing to do in the registers */
break;
Expand Down
9 changes: 5 additions & 4 deletions src/drivers/imx/sai.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,15 +95,16 @@ static int sai_context_restore(struct dai *dai)
}

static inline int sai_set_config(struct dai *dai,
struct sof_ipc_dai_config *config)
struct sof_ipc_dai_config *config,
int config_idx)
{
trace_sai("SAI: sai_set_config");
uint32_t val_cr2 = 0, val_cr4 = 0, val_cr5 = 0;
uint32_t mask_cr2 = 0, mask_cr4 = 0, mask_cr5 = 0;
/* TODO: this value will be provided by config */
uint32_t sywd = 32;

switch (config->format & SOF_DAI_FMT_FORMAT_MASK) {
switch (config->params.format & SOF_DAI_FMT_FORMAT_MASK) {
case SOF_DAI_FMT_I2S:
/*
* Frame low, 1clk before data, one word length for frame sync,
Expand Down Expand Up @@ -162,7 +163,7 @@ static inline int sai_set_config(struct dai *dai,
}

/* DAI clock inversion */
switch (config->format & SOF_DAI_FMT_INV_MASK) {
switch (config->params.format & SOF_DAI_FMT_INV_MASK) {
case SOF_DAI_FMT_IB_IF:
/* Invert both clocks */
val_cr2 ^= REG_SAI_CR2_BCP;
Expand All @@ -184,7 +185,7 @@ static inline int sai_set_config(struct dai *dai,
}

/* DAI clock master masks */
switch (config->format & SOF_DAI_FMT_MASTER_MASK) {
switch (config->params.format & SOF_DAI_FMT_MASTER_MASK) {
case SOF_DAI_FMT_CBS_CFS:
trace_sai("SAI: codec is slave");
val_cr2 |= REG_SAI_CR2_MSEL_MCLK1;
Expand Down
66 changes: 37 additions & 29 deletions src/drivers/intel/baytrail/ssp.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ static int ssp_context_restore(struct dai *dai)

/* Digital Audio interface formatting */
static int ssp_set_config(struct dai *dai,
struct sof_ipc_dai_config *config)
struct sof_ipc_dai_config *config, int config_idx)
{
struct ssp_pdata *ssp = dai_get_drvdata(dai);
uint32_t sscr0;
Expand Down Expand Up @@ -106,7 +106,8 @@ static int ssp_set_config(struct dai *dai,
goto out;
}

trace_ssp("ssp_set_config(), config->format = %d", config->format);
trace_ssp("ssp_set_config(), config->format = %d",
config->params.format);

/* reset SSP settings */
/* sscr0 dynamic settings are DSS, EDSS, SCR, FRDC, ECS */
Expand Down Expand Up @@ -164,8 +165,7 @@ static int ssp_set_config(struct dai *dai,
/* sspsp dynamic settings are SCMODE, SFRMP, DMYSTRT, SFRMWDTH */
sspsp = SSPSP_ETDS; /* last value (bit 0) */

ssp->config = *config;
ssp->params = config->ssp;
ssp->params = config->ssp[config_idx];

/* clock masters */
/*
Expand All @@ -174,7 +174,7 @@ static int ssp_set_config(struct dai *dai,
*/
sscr1 |= SSCR1_SFRMDIR;

switch (config->format & SOF_DAI_FMT_MASTER_MASK) {
switch (config->params.format & SOF_DAI_FMT_MASTER_MASK) {
case SOF_DAI_FMT_CBM_CFM:
sscr0 |= SSCR0_ECS; /* external clock used */
sscr1 |= SSCR1_SCLKDIR;
Expand Down Expand Up @@ -219,7 +219,7 @@ static int ssp_set_config(struct dai *dai,
}

/* clock signal polarity */
switch (config->format & SOF_DAI_FMT_INV_MASK) {
switch (config->params.format & SOF_DAI_FMT_INV_MASK) {
case SOF_DAI_FMT_NB_NF:
break;
case SOF_DAI_FMT_NB_IF:
Expand Down Expand Up @@ -281,15 +281,17 @@ static int ssp_set_config(struct dai *dai,
}

/* BCLK is generated from MCLK - must be divisable */
if (config->ssp.mclk_rate % config->ssp.bclk_rate) {
if (config->ssp[config_idx].mclk_rate %
config->ssp[config_idx].bclk_rate) {
trace_ssp_error("ssp_set_config() error: "
"MCLK is not divisable");
ret = -EINVAL;
goto out;
}

/* divisor must be within SCR range */
mdiv = (config->ssp.mclk_rate / config->ssp.bclk_rate) - 1;
mdiv = (config->ssp[config_idx].mclk_rate /
config->ssp[config_idx].bclk_rate) - 1;
if (mdiv > (SSCR0_SCR_MASK >> 8)) {
trace_ssp_error("ssp_set_config() error: "
"divisor is not within SCR range");
Expand All @@ -301,31 +303,33 @@ static int ssp_set_config(struct dai *dai,
sscr0 |= SSCR0_SCR(mdiv);

/* calc frame width based on BCLK and rate - must be divisable */
if (config->ssp.bclk_rate % config->ssp.fsync_rate) {
if (config->ssp[config_idx].bclk_rate %
config->ssp[config_idx].fsync_rate) {
trace_ssp_error("ssp_set_config() error: "
"BLCK is not divisable");
ret = -EINVAL;
goto out;
}

/* must be enouch BCLKs for data */
bdiv = config->ssp.bclk_rate / config->ssp.fsync_rate;
if (bdiv < config->ssp.tdm_slot_width *
config->ssp.tdm_slots) {
bdiv = config->ssp[config_idx].bclk_rate /
config->ssp[config_idx].fsync_rate;
if (bdiv < config->ssp[config_idx].tdm_slot_width *
config->ssp[config_idx].tdm_slots) {
trace_ssp_error("ssp_set_config() error: not enough BCLKs");
ret = -EINVAL;
goto out;
}

/* tdm_slot_width must be <= 38 for SSP */
if (config->ssp.tdm_slot_width > 38) {
if (config->ssp[config_idx].tdm_slot_width > 38) {
trace_ssp_error("ssp_set_config() error: tdm_slot_width > 38");
ret = -EINVAL;
goto out;
}

/* format */
switch (config->format & SOF_DAI_FMT_FORMAT_MASK) {
switch (config->params.format & SOF_DAI_FMT_FORMAT_MASK) {
case SOF_DAI_FMT_I2S:

start_delay = 1;
Expand All @@ -334,7 +338,7 @@ static int ssp_set_config(struct dai *dai,
sscr3 |= SSCR3_I2S_MODE_EN | SSCR3_I2S_TX_EN | SSCR3_I2S_RX_EN;

/* set asserted frame length */
frame_len = config->ssp.tdm_slot_width;
frame_len = config->ssp[config_idx].tdm_slot_width;

/* handle frame polarity, I2S default is falling/active low */
sspsp |= SSPSP_SFRMP(!inverted_frame);
Expand Down Expand Up @@ -364,7 +368,7 @@ static int ssp_set_config(struct dai *dai,
sscr3 |= SSCR3_I2S_MODE_EN | SSCR3_I2S_TX_EN | SSCR3_I2S_RX_EN;

/* set asserted frame length */
frame_len = config->ssp.tdm_slot_width;
frame_len = config->ssp[config_idx].tdm_slot_width;

/* LEFT_J default is rising/active high, opposite of I2S */
sspsp |= SSPSP_SFRMP(inverted_frame);
Expand All @@ -389,7 +393,8 @@ static int ssp_set_config(struct dai *dai,

start_delay = 1;

sscr0 |= SSCR0_MOD | SSCR0_FRDC(config->ssp.tdm_slots);
sscr0 |= SSCR0_MOD |
SSCR0_FRDC(config->ssp[config_idx].tdm_slots);

/* set asserted frame length */
frame_len = 1;
Expand All @@ -406,18 +411,20 @@ static int ssp_set_config(struct dai *dai,
* deasserted time of frame)
*/
if (cbs)
sscr4 |= SSCR4_TOT_FRM_PRD(config->ssp.tdm_slots *
config->ssp.tdm_slot_width);
sscr4 |= SSCR4_TOT_FRM_PRD(
config->ssp[config_idx].tdm_slots *
config->ssp[config_idx].tdm_slot_width);

active_tx_slots = popcount(config->ssp.tx_slots);
active_rx_slots = popcount(config->ssp.rx_slots);
active_tx_slots = popcount(config->ssp[config_idx].tx_slots);
active_rx_slots = popcount(config->ssp[config_idx].rx_slots);

break;
case SOF_DAI_FMT_DSP_B:

start_delay = 0;

sscr0 |= SSCR0_MOD | SSCR0_FRDC(config->ssp.tdm_slots);
sscr0 |= SSCR0_MOD |
SSCR0_FRDC(config->ssp[config_idx].tdm_slots);

/* set asserted frame length */
frame_len = 1;
Expand All @@ -434,11 +441,12 @@ static int ssp_set_config(struct dai *dai,
* deasserted time of frame
*/
if (cbs)
sscr4 |= SSCR4_TOT_FRM_PRD(config->ssp.tdm_slots *
config->ssp.tdm_slot_width);
sscr4 |= SSCR4_TOT_FRM_PRD(
config->ssp[config_idx].tdm_slots *
config->ssp[config_idx].tdm_slot_width);

active_tx_slots = popcount(config->ssp.tx_slots);
active_rx_slots = popcount(config->ssp.rx_slots);
active_tx_slots = popcount(config->ssp[config_idx].tx_slots);
active_rx_slots = popcount(config->ssp[config_idx].rx_slots);

break;
default:
Expand All @@ -452,7 +460,7 @@ static int ssp_set_config(struct dai *dai,
sspsp |= SSPSP_SFRMWDTH(frame_len);
sscr5 |= SSCR5_FRM_ASRT_CLOCKS(frame_len);

data_size = config->ssp.sample_valid_bits;
data_size = config->ssp[config_idx].sample_valid_bits;

if (data_size > 16)
sscr0 |= (SSCR0_EDSS | SSCR0_DSIZE(data_size - 16));
Expand All @@ -473,8 +481,8 @@ static int ssp_set_config(struct dai *dai,
ssp_write(dai, SSCR5, sscr5);
ssp_write(dai, SSPSP, sspsp);
ssp_write(dai, SFIFOTT, sfifott);
ssp_write(dai, SSTSA, config->ssp.tx_slots);
ssp_write(dai, SSRSA, config->ssp.rx_slots);
ssp_write(dai, SSTSA, config->ssp[config_idx].tx_slots);
ssp_write(dai, SSRSA, config->ssp[config_idx].rx_slots);

ssp->state[DAI_DIR_PLAYBACK] = COMP_STATE_PREPARE;
ssp->state[DAI_DIR_CAPTURE] = COMP_STATE_PREPARE;
Expand Down
7 changes: 4 additions & 3 deletions src/drivers/intel/cavs/alh.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,11 @@ static int alh_trigger(struct dai *dai, int cmd, int direction)
return 0;
}

static int alh_set_config(struct dai *dai, struct sof_ipc_dai_config *config)
static int alh_set_config(struct dai *dai, struct sof_ipc_dai_config *config,
int config_idx)
{
trace_alh("alh_set_config() config->format = 0x%4x",
config->format);
trace_alh("alh_set_config() config->params.format = 0x%4x",
config->params.format);

return 0;
}
Expand Down
Loading