@@ -321,14 +321,38 @@ static void geni_se_select_dma_mode(struct geni_se *se)
321
321
writel_relaxed (val , se -> base + SE_GENI_DMA_MODE_EN );
322
322
}
323
323
324
+ static void geni_se_select_gpi_mode (struct geni_se * se )
325
+ {
326
+ u32 val ;
327
+
328
+ geni_se_irq_clear (se );
329
+
330
+ writel (0 , se -> base + SE_IRQ_EN );
331
+
332
+ val = readl (se -> base + SE_GENI_S_IRQ_EN );
333
+ val &= ~S_CMD_DONE_EN ;
334
+ writel (val , se -> base + SE_GENI_S_IRQ_EN );
335
+
336
+ val = readl (se -> base + SE_GENI_M_IRQ_EN );
337
+ val &= ~(M_CMD_DONE_EN | M_TX_FIFO_WATERMARK_EN |
338
+ M_RX_FIFO_WATERMARK_EN | M_RX_FIFO_LAST_EN );
339
+ writel (val , se -> base + SE_GENI_M_IRQ_EN );
340
+
341
+ writel (GENI_DMA_MODE_EN , se -> base + SE_GENI_DMA_MODE_EN );
342
+
343
+ val = readl (se -> base + SE_GSI_EVENT_EN );
344
+ val |= (DMA_RX_EVENT_EN | DMA_TX_EVENT_EN | GENI_M_EVENT_EN | GENI_S_EVENT_EN );
345
+ writel (val , se -> base + SE_GSI_EVENT_EN );
346
+ }
347
+
324
348
/**
325
349
* geni_se_select_mode() - Select the serial engine transfer mode
326
350
* @se: Pointer to the concerned serial engine.
327
351
* @mode: Transfer mode to be selected.
328
352
*/
329
353
void geni_se_select_mode (struct geni_se * se , enum geni_se_xfer_mode mode )
330
354
{
331
- WARN_ON (mode != GENI_SE_FIFO && mode != GENI_SE_DMA );
355
+ WARN_ON (mode != GENI_SE_FIFO && mode != GENI_SE_DMA && mode != GENI_GPI_DMA );
332
356
333
357
switch (mode ) {
334
358
case GENI_SE_FIFO :
@@ -337,6 +361,9 @@ void geni_se_select_mode(struct geni_se *se, enum geni_se_xfer_mode mode)
337
361
case GENI_SE_DMA :
338
362
geni_se_select_dma_mode (se );
339
363
break ;
364
+ case GENI_GPI_DMA :
365
+ geni_se_select_gpi_mode (se );
366
+ break ;
340
367
case GENI_SE_INVALID :
341
368
default :
342
369
break ;
0 commit comments