]> git.sur5r.net Git - u-boot/commitdiff
Merge git://www.denx.de/git/u-boot-marvell
authorTom Rini <trini@konsulko.com>
Fri, 24 Mar 2017 11:21:57 +0000 (07:21 -0400)
committerTom Rini <trini@konsulko.com>
Fri, 24 Mar 2017 11:21:57 +0000 (07:21 -0400)
This mainly adds support for some new boards, like the ARMv8 community
boards MACCHIATOBin and ESPRESSBin

drivers/core/regmap.c
drivers/core/root.c
drivers/spi/ti_qspi.c
tools/dtoc/dtoc.py

index 833cd78e8489038496da2ad7fe31a3f4600e9a07..3bec3df9b6e36dc7dac19c1ae414e2ac5094fca4 100644 (file)
@@ -70,6 +70,7 @@ int regmap_init_mem(struct udevice *dev, struct regmap **mapp)
        int addr_len, size_len, both_len;
        int parent;
        int len;
+       int index;
 
        parent = dev_of_offset(dev->parent);
        addr_len = fdt_address_cells(blob, parent);
@@ -86,13 +87,14 @@ int regmap_init_mem(struct udevice *dev, struct regmap **mapp)
        if (!map)
                return -ENOMEM;
 
-       map->base = fdtdec_get_number(cell, addr_len);
-
-       for (range = map->range; count > 0;
-            count--, cell += both_len, range++) {
-               range->start = fdtdec_get_number(cell, addr_len);
-               range->size = fdtdec_get_number(cell + addr_len, size_len);
+       for (range = map->range, index = 0; count > 0;
+            count--, cell += both_len, range++, index++) {
+               fdt_size_t sz;
+               range->start = fdtdec_get_addr_size_fixed(blob, dev->of_offset,
+                               "reg", index, addr_len, size_len, &sz, true);
+               range->size = sz;
        }
+       map->base = map->range[0].start;
 
        *mapp = map;
 
index 93ab568296809b23dab818fd0d9bdc0e78d17e98..33cfde6a5c39332c7f0df70d16893bc78cf16ffb 100644 (file)
@@ -44,8 +44,10 @@ struct udevice *dm_root(void)
 void dm_fixup_for_gd_move(struct global_data *new_gd)
 {
        /* The sentinel node has moved, so update things that point to it */
-       new_gd->uclass_root.next->prev = &new_gd->uclass_root;
-       new_gd->uclass_root.prev->next = &new_gd->uclass_root;
+       if (gd->dm_root) {
+               new_gd->uclass_root.next->prev = &new_gd->uclass_root;
+               new_gd->uclass_root.prev->next = &new_gd->uclass_root;
+       }
 }
 
 fdt_addr_t dm_get_translation_offset(void)
index 79955d75979544ff2540c324695f68c1352bce67..3c4c9dd9867a9781e770cff6c3a876b4c10434a8 100644 (file)
@@ -17,6 +17,8 @@
 #include <asm/omap_common.h>
 #include <asm/ti-common/ti-edma3.h>
 #include <linux/kernel.h>
+#include <regmap.h>
+#include <syscon.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -549,21 +551,56 @@ static int ti_qspi_probe(struct udevice *bus)
        return 0;
 }
 
+static void *map_syscon_chipselects(struct udevice *bus)
+{
+#if CONFIG_IS_ENABLED(SYSCON)
+       struct udevice *syscon;
+       struct regmap *regmap;
+       const fdt32_t *cell;
+       int len, err;
+
+       err = uclass_get_device_by_phandle(UCLASS_SYSCON, bus,
+                                          "syscon-chipselects", &syscon);
+       if (err) {
+               debug("%s: unable to find syscon device (%d)\n", __func__,
+                     err);
+               return NULL;
+       }
+
+       regmap = syscon_get_regmap(syscon);
+       if (IS_ERR(regmap)) {
+               debug("%s: unable to find regmap (%ld)\n", __func__,
+                     PTR_ERR(regmap));
+               return NULL;
+       }
+
+       cell = fdt_getprop(gd->fdt_blob, bus->of_offset, "syscon-chipselects",
+                          &len);
+       if (len < 2*sizeof(fdt32_t)) {
+               debug("%s: offset not available\n", __func__);
+               return NULL;
+       }
+
+       return fdtdec_get_number(cell + 1, 1) + regmap_get_range(regmap, 0);
+#else
+       fdt_addr_t addr;
+       addr = dev_get_addr_index(bus, 2);
+       return (addr == FDT_ADDR_T_NONE) ? NULL :
+               map_physmem(addr, 0, MAP_NOCACHE);
+#endif
+}
+
 static int ti_qspi_ofdata_to_platdata(struct udevice *bus)
 {
        struct ti_qspi_priv *priv = dev_get_priv(bus);
        const void *blob = gd->fdt_blob;
        int node = dev_of_offset(bus);
-       fdt_addr_t addr;
-       void *mmap;
 
+       priv->ctrl_mod_mmap = map_syscon_chipselects(bus);
        priv->base = map_physmem(dev_get_addr(bus), sizeof(struct ti_qspi_regs),
                                 MAP_NOCACHE);
        priv->memory_map = map_physmem(dev_get_addr_index(bus, 1), 0,
                                       MAP_NOCACHE);
-       addr = dev_get_addr_index(bus, 2);
-       mmap = map_physmem(dev_get_addr_index(bus, 2), 0, MAP_NOCACHE);
-       priv->ctrl_mod_mmap = (addr == FDT_ADDR_T_NONE) ? NULL : mmap;
 
        priv->max_hz = fdtdec_get_int(blob, node, "spi-max-frequency", -1);
        if (priv->max_hz < 0) {
index bf67ec80ca1b845db4930bcf347e936a67938721..afc5171c2a0897f3f556509f919c2ddc712b774c 100755 (executable)
@@ -172,6 +172,21 @@ class DtbPlatdata:
         """
         self.fdt = fdt_select.FdtScan(self._dtb_fname)
 
+    def ScanNode(self, root):
+        for node in root.subnodes:
+            if 'compatible' in node.props:
+                status = node.props.get('status')
+                if (not options.include_disabled and not status or
+                    status.value != 'disabled'):
+                    self._valid_nodes.append(node)
+                    phandle_prop = node.props.get('phandle')
+                    if phandle_prop:
+                        phandle = phandle_prop.GetPhandle()
+                        self._phandle_node[phandle] = node
+
+            # recurse to handle any subnodes
+            self.ScanNode(node);
+
     def ScanTree(self):
         """Scan the device tree for useful information
 
@@ -180,8 +195,10 @@ class DtbPlatdata:
             _valid_nodes: A list of nodes we wish to consider include in the
                 platform data
         """
-        node_list = []
         self._phandle_node = {}
+        self._valid_nodes = []
+        return self.ScanNode(self.fdt.GetRoot());
+
         for node in self.fdt.GetRoot().subnodes:
             if 'compatible' in node.props:
                 status = node.props.get('status')