@@ -1459,7 +1459,7 @@ static void xilinx_dpdma_enable_irq(struct xilinx_dpdma_device *xdev)
1459
1459
*/
1460
1460
static void xilinx_dpdma_disable_irq (struct xilinx_dpdma_device * xdev )
1461
1461
{
1462
- dpdma_write (xdev -> reg , XILINX_DPDMA_IDS , XILINX_DPDMA_INTR_ERR_ALL );
1462
+ dpdma_write (xdev -> reg , XILINX_DPDMA_IDS , XILINX_DPDMA_INTR_ALL );
1463
1463
dpdma_write (xdev -> reg , XILINX_DPDMA_EIDS , XILINX_DPDMA_EINTR_ALL );
1464
1464
}
1465
1465
@@ -1596,6 +1596,26 @@ static struct dma_chan *of_dma_xilinx_xlate(struct of_phandle_args *dma_spec,
1596
1596
return dma_get_slave_channel (& xdev -> chan [chan_id ]-> vchan .chan );
1597
1597
}
1598
1598
1599
+ static void dpdma_hw_init (struct xilinx_dpdma_device * xdev )
1600
+ {
1601
+ unsigned int i ;
1602
+ void __iomem * reg ;
1603
+
1604
+ /* Disable all interrupts */
1605
+ xilinx_dpdma_disable_irq (xdev );
1606
+
1607
+ /* Stop all channels */
1608
+ for (i = 0 ; i < ARRAY_SIZE (xdev -> chan ); i ++ ) {
1609
+ reg = xdev -> reg + XILINX_DPDMA_CH_BASE
1610
+ + XILINX_DPDMA_CH_OFFSET * i ;
1611
+ dpdma_clr (reg , XILINX_DPDMA_CH_CNTL , XILINX_DPDMA_CH_CNTL_ENABLE );
1612
+ }
1613
+
1614
+ /* Clear the interrupt status registers */
1615
+ dpdma_write (xdev -> reg , XILINX_DPDMA_ISR , XILINX_DPDMA_INTR_ALL );
1616
+ dpdma_write (xdev -> reg , XILINX_DPDMA_EISR , XILINX_DPDMA_EINTR_ALL );
1617
+ }
1618
+
1599
1619
static int xilinx_dpdma_probe (struct platform_device * pdev )
1600
1620
{
1601
1621
struct xilinx_dpdma_device * xdev ;
@@ -1622,6 +1642,8 @@ static int xilinx_dpdma_probe(struct platform_device *pdev)
1622
1642
if (IS_ERR (xdev -> reg ))
1623
1643
return PTR_ERR (xdev -> reg );
1624
1644
1645
+ dpdma_hw_init (xdev );
1646
+
1625
1647
xdev -> irq = platform_get_irq (pdev , 0 );
1626
1648
if (xdev -> irq < 0 ) {
1627
1649
dev_err (xdev -> dev , "failed to get platform irq\n" );
0 commit comments