Merge tag 'drivers-5.15' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
[linux-2.6-microblaze.git] / drivers / soc / qcom / qcom-geni-se.c
index 5bdfb15..7d649d2 100644 (file)
@@ -104,7 +104,6 @@ static const char * const icc_path_names[] = {"qup-core", "qup-config",
 #define GENI_OUTPUT_CTRL               0x24
 #define GENI_CGC_CTRL                  0x28
 #define GENI_CLK_CTRL_RO               0x60
-#define GENI_IF_DISABLE_RO             0x64
 #define GENI_FW_S_REVISION_RO          0x6c
 #define SE_GENI_BYTE_GRAN              0x254
 #define SE_GENI_TX_PACKING_CFG0                0x260
@@ -322,6 +321,30 @@ static void geni_se_select_dma_mode(struct geni_se *se)
                writel_relaxed(val, se->base + SE_GENI_DMA_MODE_EN);
 }
 
+static void geni_se_select_gpi_mode(struct geni_se *se)
+{
+       u32 val;
+
+       geni_se_irq_clear(se);
+
+       writel(0, se->base + SE_IRQ_EN);
+
+       val = readl(se->base + SE_GENI_S_IRQ_EN);
+       val &= ~S_CMD_DONE_EN;
+       writel(val, se->base + SE_GENI_S_IRQ_EN);
+
+       val = readl(se->base + SE_GENI_M_IRQ_EN);
+       val &= ~(M_CMD_DONE_EN | M_TX_FIFO_WATERMARK_EN |
+                M_RX_FIFO_WATERMARK_EN | M_RX_FIFO_LAST_EN);
+       writel(val, se->base + SE_GENI_M_IRQ_EN);
+
+       writel(GENI_DMA_MODE_EN, se->base + SE_GENI_DMA_MODE_EN);
+
+       val = readl(se->base + SE_GSI_EVENT_EN);
+       val |= (DMA_RX_EVENT_EN | DMA_TX_EVENT_EN | GENI_M_EVENT_EN | GENI_S_EVENT_EN);
+       writel(val, se->base + SE_GSI_EVENT_EN);
+}
+
 /**
  * geni_se_select_mode() - Select the serial engine transfer mode
  * @se:                Pointer to the concerned serial engine.
@@ -329,7 +352,7 @@ static void geni_se_select_dma_mode(struct geni_se *se)
  */
 void geni_se_select_mode(struct geni_se *se, enum geni_se_xfer_mode mode)
 {
-       WARN_ON(mode != GENI_SE_FIFO && mode != GENI_SE_DMA);
+       WARN_ON(mode != GENI_SE_FIFO && mode != GENI_SE_DMA && mode != GENI_GPI_DMA);
 
        switch (mode) {
        case GENI_SE_FIFO:
@@ -338,6 +361,9 @@ void geni_se_select_mode(struct geni_se *se, enum geni_se_xfer_mode mode)
        case GENI_SE_DMA:
                geni_se_select_dma_mode(se);
                break;
+       case GENI_GPI_DMA:
+               geni_se_select_gpi_mode(se);
+               break;
        case GENI_SE_INVALID:
        default:
                break;