]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
Merge branch 'topic/xilinx' into for-linus
authorVinod Koul <vkoul@kernel.org>
Fri, 17 Aug 2018 12:29:01 +0000 (17:59 +0530)
committerVinod Koul <vkoul@kernel.org>
Fri, 17 Aug 2018 12:29:01 +0000 (17:59 +0530)
Documentation/devicetree/bindings/dma/xilinx/xilinx_dma.txt
drivers/dma/xilinx/xilinx_dma.c
include/linux/dma/xilinx_dma.h

index a2b8bfaec43cc12654175f22494e3ddbd8f818cf..174af2c45e7774ca5c15de325d4db580cca694e5 100644 (file)
@@ -66,6 +66,8 @@ Optional child node properties:
 Optional child node properties for VDMA:
 - xlnx,genlock-mode: Tells Genlock synchronization is
        enabled/disabled in hardware.
+- xlnx,enable-vert-flip: Tells vertical flip is
+       enabled/disabled in hardware(S2MM path).
 Optional child node properties for AXI DMA:
 -dma-channels: Number of dma channels in child node.
 
index 27b523530c4a5a632cd007444b972a9a84e6d017..c1244231259518d08dda4427c977fac160aee76b 100644 (file)
 #define XILINX_VDMA_REG_START_ADDRESS(n)       (0x000c + 4 * (n))
 #define XILINX_VDMA_REG_START_ADDRESS_64(n)    (0x000c + 8 * (n))
 
+#define XILINX_VDMA_REG_ENABLE_VERTICAL_FLIP   0x00ec
+#define XILINX_VDMA_ENABLE_VERTICAL_FLIP       BIT(0)
+
 /* HW specific definitions */
 #define XILINX_DMA_MAX_CHANS_PER_DEVICE        0x20
 
@@ -340,6 +343,7 @@ struct xilinx_dma_tx_descriptor {
  * @start_transfer: Differentiate b/w DMA IP's transfer
  * @stop_transfer: Differentiate b/w DMA IP's quiesce
  * @tdest: TDEST value for mcdma
+ * @has_vflip: S2MM vertical flip
  */
 struct xilinx_dma_chan {
        struct xilinx_dma_device *xdev;
@@ -376,6 +380,7 @@ struct xilinx_dma_chan {
        void (*start_transfer)(struct xilinx_dma_chan *chan);
        int (*stop_transfer)(struct xilinx_dma_chan *chan);
        u16 tdest;
+       bool has_vflip;
 };
 
 /**
@@ -1092,6 +1097,14 @@ static void xilinx_vdma_start_transfer(struct xilinx_dma_chan *chan)
                                desc->async_tx.phys);
 
        /* Configure the hardware using info in the config structure */
+       if (chan->has_vflip) {
+               reg = dma_read(chan, XILINX_VDMA_REG_ENABLE_VERTICAL_FLIP);
+               reg &= ~XILINX_VDMA_ENABLE_VERTICAL_FLIP;
+               reg |= config->vflip_en;
+               dma_write(chan, XILINX_VDMA_REG_ENABLE_VERTICAL_FLIP,
+                         reg);
+       }
+
        reg = dma_ctrl_read(chan, XILINX_DMA_REG_DMACR);
 
        if (config->frm_cnt_en)
@@ -2105,6 +2118,8 @@ int xilinx_vdma_channel_set_config(struct dma_chan *dchan,
        }
 
        chan->config.frm_cnt_en = cfg->frm_cnt_en;
+       chan->config.vflip_en = cfg->vflip_en;
+
        if (cfg->park)
                chan->config.park_frm = cfg->park_frm;
        else
@@ -2428,6 +2443,13 @@ static int xilinx_dma_chan_probe(struct xilinx_dma_device *xdev,
                chan->direction = DMA_DEV_TO_MEM;
                chan->id = chan_id;
                chan->tdest = chan_id - xdev->nr_channels;
+               chan->has_vflip = of_property_read_bool(node,
+                                       "xlnx,enable-vert-flip");
+               if (chan->has_vflip) {
+                       chan->config.vflip_en = dma_read(chan,
+                               XILINX_VDMA_REG_ENABLE_VERTICAL_FLIP) &
+                               XILINX_VDMA_ENABLE_VERTICAL_FLIP;
+               }
 
                chan->ctrl_offset = XILINX_DMA_S2MM_CTRL_OFFSET;
                if (xdev->dma_config->dmatype == XDMA_TYPE_VDMA) {
index 34b98f276ed03c0d758d50aef27e95e63c11d52d..5b6e61e4b3aa1e4cc0529cd0e2c33adfd80ba260 100644 (file)
@@ -27,6 +27,7 @@
  * @delay: Delay counter
  * @reset: Reset Channel
  * @ext_fsync: External Frame Sync source
+ * @vflip_en:  Vertical Flip enable
  */
 struct xilinx_vdma_config {
        int frm_dly;
@@ -39,6 +40,7 @@ struct xilinx_vdma_config {
        int delay;
        int reset;
        int ext_fsync;
+       bool vflip_en;
 };
 
 int xilinx_vdma_channel_set_config(struct dma_chan *dchan,