]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
dmaengine: sun6i: make gate bit in sun8i's DMA engines a common quirk
authorIcenowy Zheng <icenowy@aosc.xyz>
Tue, 29 Aug 2017 04:51:26 +0000 (12:51 +0800)
committerVinod Koul <vinod.koul@intel.com>
Tue, 5 Sep 2017 03:37:20 +0000 (09:07 +0530)
Originally we enable a special gate bit when the compatible indicates
A23/33.

But according to BSP sources and user manuals, more SoCs will need this
gate bit.

So make it a common quirk configured in the config struct.

Signed-off-by: Icenowy Zheng <icenowy@aosc.xyz>
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
drivers/dma/sun6i-dma.c

index a2358780ab2c3ca6ea52c834fa692a644e35c0cb..252b59c1d1d514ff3da6acb7ee5bf30ccc85ab9c 100644 (file)
@@ -101,6 +101,17 @@ struct sun6i_dma_config {
        u32 nr_max_channels;
        u32 nr_max_requests;
        u32 nr_max_vchans;
+       /*
+        * In the datasheets/user manuals of newer Allwinner SoCs, a special
+        * bit (bit 2 at register 0x20) is present.
+        * It's named "DMA MCLK interface circuit auto gating bit" in the
+        * documents, and the footnote of this register says that this bit
+        * should be set up when initializing the DMA controller.
+        * Allwinner A23/A33 user manuals do not have this bit documented,
+        * however these SoCs really have and need this bit, as seen in the
+        * BSP kernel source code.
+        */
+       bool gate_needed;
 };
 
 /*
@@ -1009,6 +1020,7 @@ static struct sun6i_dma_config sun8i_a23_dma_cfg = {
        .nr_max_channels = 8,
        .nr_max_requests = 24,
        .nr_max_vchans   = 37,
+       .gate_needed     = true,
 };
 
 static struct sun6i_dma_config sun8i_a83t_dma_cfg = {
@@ -1174,13 +1186,7 @@ static int sun6i_dma_probe(struct platform_device *pdev)
                goto err_dma_unregister;
        }
 
-       /*
-        * sun8i variant requires us to toggle a dma gating register,
-        * as seen in Allwinner's SDK. This register is not documented
-        * in the A23 user manual.
-        */
-       if (of_device_is_compatible(pdev->dev.of_node,
-                                   "allwinner,sun8i-a23-dma"))
+       if (sdc->cfg->gate_needed)
                writel(SUN8I_DMA_GATE_ENABLE, sdc->base + SUN8I_DMA_GATE);
 
        return 0;