Thread (63 messages) 63 messages, 10 authors, 2014-06-02

Re: [PATCH v3 4/7] of: configure the platform device dma parameters

From: Rob Herring <hidden>
Date: 2014-05-02 00:49:09
Also in: linux-arm-kernel, lkml

On Thu, Apr 24, 2014 at 10:30 AM, Santosh Shilimkar
[off-list ref] wrote:
Retrieve DMA configuration from DT and setup platform device's DMA
parameters. The DMA configuration in DT has to be specified using
"dma-ranges" and "dma-coherent" properties if supported.

We setup dma_pfn_offset using "dma-ranges" and dma_coherent_ops
using "dma-coherent" device tree properties.

The set_arch_dma_coherent_ops macro has to be defined by arch if
it supports coherent dma_ops. Otherwise, set_arch_dma_coherent_ops() is
declared as nop.
[...]
+       /*
+        * if dma-ranges property doesn't exist - just return else
+        * setup the dma offset
+        */
+       ret = of_dma_get_range(dev->of_node, &dma_addr, &paddr, &size);
+       if ((ret == -ENODEV) || (ret < 0)) {
The 1st condition is redundant.
quoted hunk ↗ jump to hunk
+               dev_dbg(dev, "no dma range information to setup\n");
+               return;
+       }
+
+       /* DMA ranges found. Calculate and set dma_pfn_offset */
+       dev->dma_pfn_offset = PFN_DOWN(paddr - dma_addr);
+       dev_dbg(dev, "dma_pfn_offset(%#08lx)\n", dev->dma_pfn_offset);
+}
+
+/**
  * of_platform_device_create_pdata - Alloc, initialize and register an of_device
  * @np: pointer to node to create device for
  * @bus_id: name to assign device
@@ -214,9 +258,7 @@ static struct platform_device *of_platform_device_create_pdata(
 #if defined(CONFIG_MICROBLAZE)
        dev->archdata.dma_mask = 0xffffffffUL;
 #endif
This is also dma related setup. Please move *all* dma setup into the function.
quoted hunk ↗ jump to hunk
-       dev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
-       if (!dev->dev.dma_mask)
-               dev->dev.dma_mask = &dev->dev.coherent_dma_mask;
+       of_dma_configure(&dev->dev);
        dev->dev.bus = &platform_bus_type;
        dev->dev.platform_data = platform_data;
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
index fd4aee2..c7d9b1b 100644
--- a/include/linux/dma-mapping.h
+++ b/include/linux/dma-mapping.h
@@ -123,6 +123,13 @@ static inline int dma_coerce_mask_and_coherent(struct device *dev, u64 mask)

 extern u64 dma_get_required_mask(struct device *dev);

+#ifndef set_arch_dma_coherent_ops
+static inline int set_arch_dma_coherent_ops(struct device *dev)
+{
+       return 0;
+}
+#endif
+
 static inline unsigned int dma_get_max_seg_size(struct device *dev)
 {
        return dev->dma_parms ? dev->dma_parms->max_segment_size : 65536;
--
1.7.9.5
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help