dmaengine: dw: set polarity of handshake interface
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 17 Aug 2016 16:20:21 +0000 (19:20 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 31 Aug 2016 14:13:29 +0000 (16:13 +0200)
Intel Quark UART uses DesignWare DMA IP. Though the DMA IP is connected in such
way that handshake interface uses inverted polarity. We have to provide a
possibility to set this in the DMA driver when configuring a channel.

Introduce a new member of custom slave configuration called 'hs_polarity' and
set active low polarity in case this value is 'true'.

Acked-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Tested-by: Bryan O'Donoghue <pure.logic@nexus-software.ie>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/dma/dw/core.c
include/linux/platform_data/dma-dw.h

index 81b06dfd7e06fceff3fa0c883157ca58c0dd63cd..80e74216cd5630d1093a61ddada5b9d7e6ddfe05 100644 (file)
@@ -143,6 +143,7 @@ static void dwc_initialize(struct dw_dma_chan *dwc)
        struct dw_dma *dw = to_dw_dma(dwc->chan.device);
        u32 cfghi = DWC_CFGH_FIFO_MODE;
        u32 cfglo = DWC_CFGL_CH_PRIOR(dwc->priority);
+       bool hs_polarity = dwc->dws.hs_polarity;
 
        if (test_bit(DW_DMA_IS_INITIALIZED, &dwc->flags))
                return;
@@ -150,6 +151,9 @@ static void dwc_initialize(struct dw_dma_chan *dwc)
        cfghi |= DWC_CFGH_DST_PER(dwc->dws.dst_id);
        cfghi |= DWC_CFGH_SRC_PER(dwc->dws.src_id);
 
+       /* Set polarity of handshake interface */
+       cfglo |= hs_polarity ? DWC_CFGL_HS_DST_POL | DWC_CFGL_HS_SRC_POL : 0;
+
        channel_writel(dwc, CFG_LO, cfglo);
        channel_writel(dwc, CFG_HI, cfghi);
 
index d15d8ba8cc240c7b846936692b604c0e2488f177..4636c933530516ac6e089c18ada62009bc849c3e 100644 (file)
@@ -23,6 +23,7 @@
  * @dst_id:    dst request line
  * @m_master:  memory master for transfers on allocated channel
  * @p_master:  peripheral master for transfers on allocated channel
+ * @hs_polarity:set active low polarity of handshake interface
  */
 struct dw_dma_slave {
        struct device           *dma_dev;
@@ -30,6 +31,7 @@ struct dw_dma_slave {
        u8                      dst_id;
        u8                      m_master;
        u8                      p_master;
+       bool                    hs_polarity;
 };
 
 /**