@@ -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
230231error :
@@ -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