@@ -682,6 +682,30 @@ EXPORT_SYMBOL(geni_se_clk_freq_match);
682682#define GENI_SE_DMA_EOT_EN BIT(1)
683683#define GENI_SE_DMA_AHB_ERR_EN BIT(2)
684684#define GENI_SE_DMA_EOT_BUF BIT(0)
685+
686+ /**
687+ * geni_se_tx_init_dma() - Initiate TX DMA transfer on the serial engine
688+ * @se: Pointer to the concerned serial engine.
689+ * @iova: Mapped DMA address.
690+ * @len: Length of the TX buffer.
691+ *
692+ * This function is used to initiate DMA TX transfer.
693+ */
694+ void geni_se_tx_init_dma (struct geni_se * se , dma_addr_t iova , size_t len )
695+ {
696+ u32 val ;
697+
698+ val = GENI_SE_DMA_DONE_EN ;
699+ val |= GENI_SE_DMA_EOT_EN ;
700+ val |= GENI_SE_DMA_AHB_ERR_EN ;
701+ writel_relaxed (val , se -> base + SE_DMA_TX_IRQ_EN_SET );
702+ writel_relaxed (lower_32_bits (iova ), se -> base + SE_DMA_TX_PTR_L );
703+ writel_relaxed (upper_32_bits (iova ), se -> base + SE_DMA_TX_PTR_H );
704+ writel_relaxed (GENI_SE_DMA_EOT_BUF , se -> base + SE_DMA_TX_ATTR );
705+ writel (len , se -> base + SE_DMA_TX_LEN );
706+ }
707+ EXPORT_SYMBOL (geni_se_tx_init_dma );
708+
685709/**
686710 * geni_se_tx_dma_prep() - Prepare the serial engine for TX DMA transfer
687711 * @se: Pointer to the concerned serial engine.
@@ -697,7 +721,6 @@ int geni_se_tx_dma_prep(struct geni_se *se, void *buf, size_t len,
697721 dma_addr_t * iova )
698722{
699723 struct geni_wrapper * wrapper = se -> wrapper ;
700- u32 val ;
701724
702725 if (!wrapper )
703726 return - EINVAL ;
@@ -706,17 +729,34 @@ int geni_se_tx_dma_prep(struct geni_se *se, void *buf, size_t len,
706729 if (dma_mapping_error (wrapper -> dev , * iova ))
707730 return - EIO ;
708731
732+ geni_se_tx_init_dma (se , * iova , len );
733+ return 0 ;
734+ }
735+ EXPORT_SYMBOL (geni_se_tx_dma_prep );
736+
737+ /**
738+ * geni_se_rx_init_dma() - Initiate RX DMA transfer on the serial engine
739+ * @se: Pointer to the concerned serial engine.
740+ * @iova: Mapped DMA address.
741+ * @len: Length of the RX buffer.
742+ *
743+ * This function is used to initiate DMA RX transfer.
744+ */
745+ void geni_se_rx_init_dma (struct geni_se * se , dma_addr_t iova , size_t len )
746+ {
747+ u32 val ;
748+
709749 val = GENI_SE_DMA_DONE_EN ;
710750 val |= GENI_SE_DMA_EOT_EN ;
711751 val |= GENI_SE_DMA_AHB_ERR_EN ;
712- writel_relaxed (val , se -> base + SE_DMA_TX_IRQ_EN_SET );
713- writel_relaxed (lower_32_bits (* iova ), se -> base + SE_DMA_TX_PTR_L );
714- writel_relaxed (upper_32_bits (* iova ), se -> base + SE_DMA_TX_PTR_H );
715- writel_relaxed ( GENI_SE_DMA_EOT_BUF , se -> base + SE_DMA_TX_ATTR );
716- writel ( len , se -> base + SE_DMA_TX_LEN );
717- return 0 ;
752+ writel_relaxed (val , se -> base + SE_DMA_RX_IRQ_EN_SET );
753+ writel_relaxed (lower_32_bits (iova ), se -> base + SE_DMA_RX_PTR_L );
754+ writel_relaxed (upper_32_bits (iova ), se -> base + SE_DMA_RX_PTR_H );
755+ /* RX does not have EOT buffer type bit. So just reset RX_ATTR */
756+ writel_relaxed ( 0 , se -> base + SE_DMA_RX_ATTR );
757+ writel ( len , se -> base + SE_DMA_RX_LEN ) ;
718758}
719- EXPORT_SYMBOL (geni_se_tx_dma_prep );
759+ EXPORT_SYMBOL (geni_se_rx_init_dma );
720760
721761/**
722762 * geni_se_rx_dma_prep() - Prepare the serial engine for RX DMA transfer
@@ -733,7 +773,6 @@ int geni_se_rx_dma_prep(struct geni_se *se, void *buf, size_t len,
733773 dma_addr_t * iova )
734774{
735775 struct geni_wrapper * wrapper = se -> wrapper ;
736- u32 val ;
737776
738777 if (!wrapper )
739778 return - EINVAL ;
@@ -742,15 +781,7 @@ int geni_se_rx_dma_prep(struct geni_se *se, void *buf, size_t len,
742781 if (dma_mapping_error (wrapper -> dev , * iova ))
743782 return - EIO ;
744783
745- val = GENI_SE_DMA_DONE_EN ;
746- val |= GENI_SE_DMA_EOT_EN ;
747- val |= GENI_SE_DMA_AHB_ERR_EN ;
748- writel_relaxed (val , se -> base + SE_DMA_RX_IRQ_EN_SET );
749- writel_relaxed (lower_32_bits (* iova ), se -> base + SE_DMA_RX_PTR_L );
750- writel_relaxed (upper_32_bits (* iova ), se -> base + SE_DMA_RX_PTR_H );
751- /* RX does not have EOT buffer type bit. So just reset RX_ATTR */
752- writel_relaxed (0 , se -> base + SE_DMA_RX_ATTR );
753- writel (len , se -> base + SE_DMA_RX_LEN );
784+ geni_se_rx_init_dma (se , * iova , len );
754785 return 0 ;
755786}
756787EXPORT_SYMBOL (geni_se_rx_dma_prep );
0 commit comments