Skip to content

Commit 3ecf438

Browse files
authored
Merge pull request #260 from mmaka1/hda-glk
Hda glk
2 parents b9246b0 + b39b17d commit 3ecf438

8 files changed

Lines changed: 515 additions & 306 deletions

File tree

src/audio/dai.c

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -197,9 +197,21 @@ static struct comp_dev *dai_new(struct sof_ipc_comp *comp)
197197
/* TODO: hda: retrieve req'ed caps from the dai,
198198
* dmas are not cross-compatible.
199199
*/
200-
dir = DMA_DIR_MEM_TO_DEV | DMA_DIR_DEV_TO_MEM;
201-
caps = DMA_CAP_GP_LP | DMA_CAP_GP_HP;
202-
dma_dev = DMA_DEV_SSP | DMA_DEV_DMIC;
200+
switch (dai->type) {
201+
case SOF_DAI_INTEL_HDA:
202+
dir = dai->direction == SOF_IPC_STREAM_PLAYBACK ?
203+
DMA_DIR_DEV_TO_MEM : DMA_DIR_MEM_TO_DEV;
204+
caps = DMA_CAP_HDA;
205+
dma_dev = DMA_DEV_HDA;
206+
break;
207+
case SOF_DAI_INTEL_SSP:
208+
case SOF_DAI_INTEL_DMIC:
209+
default:
210+
dir = DMA_DIR_MEM_TO_DEV | DMA_DIR_DEV_TO_MEM;
211+
caps = DMA_CAP_GP_LP | DMA_CAP_GP_HP;
212+
dma_dev = DMA_DEV_SSP | DMA_DEV_DMIC;
213+
break;
214+
}
203215
dd->dma = dma_get(dir, caps, dma_dev, DMA_ACCESS_SHARED);
204216
if (dd->dma == NULL) {
205217
trace_dai_error("eDd");
@@ -213,18 +225,7 @@ static struct comp_dev *dai_new(struct sof_ipc_comp *comp)
213225
dd->xrun = 0;
214226
dd->pointer_init = 0;
215227

216-
/* get DMA channel from DMAC1 */
217-
dd->chan = dma_channel_get(dd->dma, 0);
218-
if (dd->chan < 0){
219-
trace_dai_error("eDc");
220-
goto error;
221-
}
222-
223-
/* set up callback */
224-
dma_set_cb(dd->dma, dd->chan, DMA_IRQ_TYPE_BLOCK |
225-
DMA_IRQ_TYPE_LLIST, dai_dma_cb, dev);
226228
dev->state = COMP_STATE_READY;
227-
dev->is_dma_connected = 1;
228229
return dev;
229230

230231
error:
@@ -392,6 +393,18 @@ static int dai_params(struct comp_dev *dev)
392393
return -EINVAL;
393394
}
394395

396+
/* get DMA channel, once the stream_tag is known */
397+
dd->chan = dma_channel_get(dd->dma, dev->params.stream_tag);
398+
if (dd->chan < 0) {
399+
trace_dai_error("eDc");
400+
return -EINVAL;
401+
}
402+
403+
/* set up callback */
404+
dma_set_cb(dd->dma, dd->chan, DMA_IRQ_TYPE_BLOCK |
405+
DMA_IRQ_TYPE_LLIST, dai_dma_cb, dev);
406+
dev->is_dma_connected = 1;
407+
395408
/* for DAI, we should configure its frame_fmt from topology */
396409
dev->params.frame_fmt = dconfig->frame_fmt;
397410

@@ -701,6 +714,13 @@ static int dai_config(struct comp_dev *dev, struct sof_ipc_dai_config *config)
701714
trace_value(config->dmic.pdm[0].enable_mic_b);
702715
trace_value(dev->frame_bytes);
703716
break;
717+
case SOF_DAI_INTEL_HDA:
718+
/* set to some non-zero value to satisfy the condition below,
719+
* it is recalculated in dai_params() later
720+
* this is temp until dai/hda model is changed.
721+
*/
722+
dev->frame_bytes = 4;
723+
break;
704724
default:
705725
/* other types of DAIs not handled for now */
706726
trace_dai_error("de2");

0 commit comments

Comments
 (0)