@@ -1459,7 +1459,7 @@ static void xilinx_dpdma_enable_irq(struct xilinx_dpdma_device *xdev)
14591459 */
14601460static void xilinx_dpdma_disable_irq (struct xilinx_dpdma_device * xdev )
14611461{
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 );
14631463 dpdma_write (xdev -> reg , XILINX_DPDMA_EIDS , XILINX_DPDMA_EINTR_ALL );
14641464}
14651465
@@ -1596,6 +1596,26 @@ static struct dma_chan *of_dma_xilinx_xlate(struct of_phandle_args *dma_spec,
15961596 return dma_get_slave_channel (& xdev -> chan [chan_id ]-> vchan .chan );
15971597}
15981598
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+
15991619static int xilinx_dpdma_probe (struct platform_device * pdev )
16001620{
16011621 struct xilinx_dpdma_device * xdev ;
@@ -1622,6 +1642,8 @@ static int xilinx_dpdma_probe(struct platform_device *pdev)
16221642 if (IS_ERR (xdev -> reg ))
16231643 return PTR_ERR (xdev -> reg );
16241644
1645+ dpdma_hw_init (xdev );
1646+
16251647 xdev -> irq = platform_get_irq (pdev , 0 );
16261648 if (xdev -> irq < 0 ) {
16271649 dev_err (xdev -> dev , "failed to get platform irq\n" );
0 commit comments