]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge remote-tracking branch 'devicetree/devicetree/next'
authorStephen Rothwell <sfr@canb.auug.org.au>
Fri, 30 May 2014 03:59:26 +0000 (13:59 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Fri, 30 May 2014 03:59:29 +0000 (13:59 +1000)
Conflicts:
arch/arm/mach-vexpress/platsmp.c

1  2 
arch/arm/mach-exynos/exynos.c
arch/mips/cavium-octeon/setup.c
arch/powerpc/kernel/epapr_paravirt.c
arch/powerpc/kernel/fadump.c
arch/powerpc/mm/hash_utils_64.c
arch/powerpc/platforms/pseries/setup.c
drivers/of/address.c
drivers/of/base.c
drivers/of/platform.c
include/linux/of_address.h

Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index d244b2859aac631b17dca4ecc16920e83fdc51a5,95351b2a112c958fc8443f94857ccc3a93263f9a..5edfcb0da37d9e036dba3f0e9d6764dcd9bc28ef
@@@ -721,113 -701,3 +701,113 @@@ void __iomem *of_iomap(struct device_no
        return ioremap(res.start, resource_size(&res));
  }
  EXPORT_SYMBOL(of_iomap);
- EXPORT_SYMBOL_GPL(of_dma_is_coherent);
 +
 +/**
 + * of_dma_get_range - Get DMA range info
 + * @np:               device node to get DMA range info
 + * @dma_addr: pointer to store initial DMA address of DMA range
 + * @paddr:    pointer to store initial CPU address of DMA range
 + * @size:     pointer to store size of DMA range
 + *
 + * Look in bottom up direction for the first "dma-ranges" property
 + * and parse it.
 + *  dma-ranges format:
 + *    DMA addr (dma_addr)     : naddr cells
 + *    CPU addr (phys_addr_t)  : pna cells
 + *    size                    : nsize cells
 + *
 + * It returns -ENODEV if "dma-ranges" property was not found
 + * for this device in DT.
 + */
 +int of_dma_get_range(struct device_node *np, u64 *dma_addr, u64 *paddr, u64 *size)
 +{
 +      struct device_node *node = of_node_get(np);
 +      const __be32 *ranges = NULL;
 +      int len, naddr, nsize, pna;
 +      int ret = 0;
 +      u64 dmaaddr;
 +
 +      if (!node)
 +              return -EINVAL;
 +
 +      while (1) {
 +              naddr = of_n_addr_cells(node);
 +              nsize = of_n_size_cells(node);
 +              node = of_get_next_parent(node);
 +              if (!node)
 +                      break;
 +
 +              ranges = of_get_property(node, "dma-ranges", &len);
 +
 +              /* Ignore empty ranges, they imply no translation required */
 +              if (ranges && len > 0)
 +                      break;
 +
 +              /*
 +               * At least empty ranges has to be defined for parent node if
 +               * DMA is supported
 +               */
 +              if (!ranges)
 +                      break;
 +      }
 +
 +      if (!ranges) {
 +              pr_debug("%s: no dma-ranges found for node(%s)\n",
 +                       __func__, np->full_name);
 +              ret = -ENODEV;
 +              goto out;
 +      }
 +
 +      len /= sizeof(u32);
 +
 +      pna = of_n_addr_cells(node);
 +
 +      /* dma-ranges format:
 +       * DMA addr     : naddr cells
 +       * CPU addr     : pna cells
 +       * size         : nsize cells
 +       */
 +      dmaaddr = of_read_number(ranges, naddr);
 +      *paddr = of_translate_dma_address(np, ranges);
 +      if (*paddr == OF_BAD_ADDR) {
 +              pr_err("%s: translation of DMA address(%pad) to CPU address failed node(%s)\n",
 +                     __func__, dma_addr, np->full_name);
 +              ret = -EINVAL;
 +              goto out;
 +      }
 +      *dma_addr = dmaaddr;
 +
 +      *size = of_read_number(ranges + naddr + pna, nsize);
 +
 +      pr_debug("dma_addr(%llx) cpu_addr(%llx) size(%llx)\n",
 +               *dma_addr, *paddr, *size);
 +
 +out:
 +      of_node_put(node);
 +
 +      return ret;
 +}
 +EXPORT_SYMBOL_GPL(of_dma_get_range);
 +
 +/**
 + * of_dma_is_coherent - Check if device is coherent
 + * @np:       device node
 + *
 + * It returns true if "dma-coherent" property was found
 + * for this device in DT.
 + */
 +bool of_dma_is_coherent(struct device_node *np)
 +{
 +      struct device_node *node = of_node_get(np);
 +
 +      while (node) {
 +              if (of_property_read_bool(node, "dma-coherent")) {
 +                      of_node_put(node);
 +                      return true;
 +              }
 +              node = of_get_next_parent(node);
 +      }
 +      of_node_put(node);
 +      return false;
 +}
++EXPORT_SYMBOL_GPL(of_dma_is_coherent);
Simple merge
Simple merge
Simple merge