Patch "dmaengine: ti: k3-udma-glue: fix channel enable functions" has been added to the 5.9-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    dmaengine: ti: k3-udma-glue: fix channel enable functions

to the 5.9-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     dmaengine-ti-k3-udma-glue-fix-channel-enable-functio.patch
and it can be found in the queue-5.9 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 7ccf4901a2468dff72d0db6f63afd08677627163
Author: Grygorii Strashko <grygorii.strashko@xxxxxx>
Date:   Wed Sep 16 15:09:55 2020 +0300

    dmaengine: ti: k3-udma-glue: fix channel enable functions
    
    [ Upstream commit 52c74d3d356b60f3c53dc69e5109752347e144e8 ]
    
    Now the K3 UDMA glue layer enable functions perform RMW operation on UDMA
    RX/TX RT_CTL registers to set EN bit and enable channel, which is
    incorrect, because only EN bit has to be set in those registers to enable
    channel (all other bits should be cleared 0).
    More over, this causes issues when bootloader leaves UDMA channel RX/TX
    RT_CTL registers in incorrect state - TDOWN bit set, for example. As
    result, UDMA channel will just perform teardown right after it's enabled.
    
    Hence, fix it by writing correct values (EN=1) directly in UDMA channel
    RX/TX RT_CTL registers in k3_udma_glue_enable_tx/rx_chn() functions.
    
    Fixes: d70241913413 ("dmaengine: ti: k3-udma: Add glue layer for non DMAengine users")
    Signed-off-by: Grygorii Strashko <grygorii.strashko@xxxxxx>
    Acked-by: Peter Ujfalusi <peter.ujfalusi@xxxxxx>
    Link: https://lore.kernel.org/r/20200916120955.7963-1-grygorii.strashko@xxxxxx
    Signed-off-by: Vinod Koul <vkoul@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/dma/ti/k3-udma-glue.c b/drivers/dma/ti/k3-udma-glue.c
index 3a5d33ea5ebe7..42c8ad10d75eb 100644
--- a/drivers/dma/ti/k3-udma-glue.c
+++ b/drivers/dma/ti/k3-udma-glue.c
@@ -378,17 +378,11 @@ EXPORT_SYMBOL_GPL(k3_udma_glue_pop_tx_chn);
 
 int k3_udma_glue_enable_tx_chn(struct k3_udma_glue_tx_channel *tx_chn)
 {
-	u32 txrt_ctl;
-
-	txrt_ctl = UDMA_PEER_RT_EN_ENABLE;
 	xudma_tchanrt_write(tx_chn->udma_tchanx, UDMA_CHAN_RT_PEER_RT_EN_REG,
-			    txrt_ctl);
+			    UDMA_PEER_RT_EN_ENABLE);
 
-	txrt_ctl = xudma_tchanrt_read(tx_chn->udma_tchanx,
-				      UDMA_CHAN_RT_CTL_REG);
-	txrt_ctl |= UDMA_CHAN_RT_CTL_EN;
 	xudma_tchanrt_write(tx_chn->udma_tchanx, UDMA_CHAN_RT_CTL_REG,
-			    txrt_ctl);
+			    UDMA_CHAN_RT_CTL_EN);
 
 	k3_udma_glue_dump_tx_rt_chn(tx_chn, "txchn en");
 	return 0;
@@ -1058,19 +1052,14 @@ EXPORT_SYMBOL_GPL(k3_udma_glue_rx_flow_disable);
 
 int k3_udma_glue_enable_rx_chn(struct k3_udma_glue_rx_channel *rx_chn)
 {
-	u32 rxrt_ctl;
-
 	if (rx_chn->remote)
 		return -EINVAL;
 
 	if (rx_chn->flows_ready < rx_chn->flow_num)
 		return -EINVAL;
 
-	rxrt_ctl = xudma_rchanrt_read(rx_chn->udma_rchanx,
-				      UDMA_CHAN_RT_CTL_REG);
-	rxrt_ctl |= UDMA_CHAN_RT_CTL_EN;
 	xudma_rchanrt_write(rx_chn->udma_rchanx, UDMA_CHAN_RT_CTL_REG,
-			    rxrt_ctl);
+			    UDMA_CHAN_RT_CTL_EN);
 
 	xudma_rchanrt_write(rx_chn->udma_rchanx, UDMA_CHAN_RT_PEER_RT_EN_REG,
 			    UDMA_PEER_RT_EN_ENABLE);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux