]> Git Repo - J-u-boot.git/blobdiff - drivers/core/simple-bus.c
Merge patch series "mtd: spi-nor: Remove recently added nor->addr_width == 3 test"
[J-u-boot.git] / drivers / core / simple-bus.c
index e16d8a9ff4a9b6bb111e391d70792d7481c8c84d..f402bb5d6748f3c9b492da78a0538d4e22c334fb 100644 (file)
@@ -3,18 +3,18 @@
  * Copyright (c) 2014 Google, Inc
  */
 
-#include <common.h>
+#define LOG_CATEGORY UCLASS_SIMPLE_BUS
+
+#include <asm/global_data.h>
 #include <dm.h>
+#include <dm/simple_bus.h>
+#include <fdt_support.h>
 
-struct simple_bus_plat {
-       u32 base;
-       u32 size;
-       u32 target;
-};
+DECLARE_GLOBAL_DATA_PTR;
 
 fdt_addr_t simple_bus_translate(struct udevice *dev, fdt_addr_t addr)
 {
-       struct simple_bus_plat *plat = dev_get_uclass_platdata(dev);
+       struct simple_bus_plat *plat = dev_get_uclass_plat(dev);
 
        if (addr >= plat->base && addr < plat->base + plat->size)
                addr = (addr - plat->base) + plat->target;
@@ -27,16 +27,30 @@ static int simple_bus_post_bind(struct udevice *dev)
 #if CONFIG_IS_ENABLED(OF_PLATDATA)
        return 0;
 #else
-       u32 cell[3];
+       struct simple_bus_plat *plat = dev_get_uclass_plat(dev);
        int ret;
 
-       ret = dev_read_u32_array(dev, "ranges", cell, ARRAY_SIZE(cell));
-       if (!ret) {
-               struct simple_bus_plat *plat = dev_get_uclass_platdata(dev);
+       if (CONFIG_IS_ENABLED(SIMPLE_BUS_CORRECT_RANGE)) {
+               uint64_t caddr, paddr, len;
 
-               plat->base = cell[0];
-               plat->target = cell[1];
-               plat->size = cell[2];
+               /* only read range index 0 */
+               ret = fdt_read_range((void *)gd->fdt_blob, dev_of_offset(dev),
+                                    0, &caddr, &paddr, &len);
+               if (!ret) {
+                       plat->base = caddr;
+                       plat->target = paddr;
+                       plat->size = len;
+               }
+       } else {
+               u32 cell[3];
+
+               ret = dev_read_u32_array(dev, "ranges", cell,
+                                        ARRAY_SIZE(cell));
+               if (!ret) {
+                       plat->base = cell[0];
+                       plat->target = cell[1];
+                       plat->size = cell[2];
+               }
        }
 
        return dm_scan_fdt_dev(dev);
@@ -47,17 +61,20 @@ UCLASS_DRIVER(simple_bus) = {
        .id             = UCLASS_SIMPLE_BUS,
        .name           = "simple_bus",
        .post_bind      = simple_bus_post_bind,
-       .per_device_platdata_auto_alloc_size = sizeof(struct simple_bus_plat),
+       .per_device_plat_auto   = sizeof(struct simple_bus_plat),
 };
 
+#if CONFIG_IS_ENABLED(OF_REAL)
 static const struct udevice_id generic_simple_bus_ids[] = {
        { .compatible = "simple-bus" },
        { .compatible = "simple-mfd" },
        { }
 };
+#endif
 
-U_BOOT_DRIVER(simple_bus_drv) = {
-       .name   = "generic_simple_bus",
+U_BOOT_DRIVER(simple_bus) = {
+       .name   = "simple_bus",
        .id     = UCLASS_SIMPLE_BUS,
-       .of_match = generic_simple_bus_ids,
+       .of_match = of_match_ptr(generic_simple_bus_ids),
+       .flags  = DM_FLAG_PRE_RELOC,
 };
This page took 0.028176 seconds and 4 git commands to generate.