Skip to content

Commit 0fa8266

Browse files
vinodkoulandersson
authored andcommitted
soc: qcom: geni: Add support for gpi dma
GPI DMA is one of the DMA modes supported on geni, this adds support to enable that mode Also do better documentation of the enum geni_se_xfer_mode. Signed-off-by: Vinod Koul <[email protected]> Reviewed-by: Douglas Anderson <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Bjorn Andersson <[email protected]>
1 parent cb531ca commit 0fa8266

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

drivers/soc/qcom/qcom-geni-se.c

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,14 +321,38 @@ static void geni_se_select_dma_mode(struct geni_se *se)
321321
writel_relaxed(val, se->base + SE_GENI_DMA_MODE_EN);
322322
}
323323

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+
324348
/**
325349
* geni_se_select_mode() - Select the serial engine transfer mode
326350
* @se: Pointer to the concerned serial engine.
327351
* @mode: Transfer mode to be selected.
328352
*/
329353
void geni_se_select_mode(struct geni_se *se, enum geni_se_xfer_mode mode)
330354
{
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);
332356

333357
switch (mode) {
334358
case GENI_SE_FIFO:
@@ -337,6 +361,9 @@ void geni_se_select_mode(struct geni_se *se, enum geni_se_xfer_mode mode)
337361
case GENI_SE_DMA:
338362
geni_se_select_dma_mode(se);
339363
break;
364+
case GENI_GPI_DMA:
365+
geni_se_select_gpi_mode(se);
366+
break;
340367
case GENI_SE_INVALID:
341368
default:
342369
break;

include/linux/qcom-geni-se.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,24 @@
88

99
#include <linux/interconnect.h>
1010

11-
/* Transfer mode supported by GENI Serial Engines */
11+
/**
12+
* enum geni_se_xfer_mode: Transfer modes supported by Serial Engines
13+
*
14+
* @GENI_SE_INVALID: Invalid mode
15+
* @GENI_SE_FIFO: FIFO mode. Data is transferred with SE FIFO
16+
* by programmed IO method
17+
* @GENI_SE_DMA: Serial Engine DMA mode. Data is transferred
18+
* with SE by DMAengine internal to SE
19+
* @GENI_GPI_DMA: GPI DMA mode. Data is transferred using a DMAengine
20+
* configured by a firmware residing on a GSI engine. This DMA name is
21+
* interchangeably used as GSI or GPI which seem to imply the same DMAengine
22+
*/
23+
1224
enum geni_se_xfer_mode {
1325
GENI_SE_INVALID,
1426
GENI_SE_FIFO,
1527
GENI_SE_DMA,
28+
GENI_GPI_DMA,
1629
};
1730

1831
/* Protocols supported by GENI Serial Engines */

0 commit comments

Comments
 (0)