1 /* 2 * Copyright (c) 2014 Google, Inc 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 */ 6 7 #include <common.h> 8 #include <dm.h> 9 #include <dm/root.h> 10 11 DECLARE_GLOBAL_DATA_PTR; 12 13 struct simple_bus_plat { 14 u32 base; 15 u32 size; 16 u32 target; 17 }; 18 19 fdt_addr_t simple_bus_translate(struct udevice *dev, fdt_addr_t addr) 20 { 21 struct simple_bus_plat *plat = dev_get_uclass_platdata(dev); 22 23 if (addr >= plat->base && addr < plat->base + plat->size) 24 addr = (addr - plat->base) + plat->target; 25 26 return addr; 27 } 28 29 static int simple_bus_post_bind(struct udevice *dev) 30 { 31 u32 cell[3]; 32 int ret; 33 34 ret = fdtdec_get_int_array(gd->fdt_blob, dev->of_offset, "ranges", 35 cell, ARRAY_SIZE(cell)); 36 if (!ret) { 37 struct simple_bus_plat *plat = dev_get_uclass_platdata(dev); 38 39 plat->base = cell[0]; 40 plat->target = cell[1]; 41 plat->size = cell[2]; 42 } 43 44 return dm_scan_fdt_node(dev, gd->fdt_blob, dev->of_offset, false); 45 } 46 47 UCLASS_DRIVER(simple_bus) = { 48 .id = UCLASS_SIMPLE_BUS, 49 .name = "simple_bus", 50 .post_bind = simple_bus_post_bind, 51 .per_device_platdata_auto_alloc_size = sizeof(struct simple_bus_plat), 52 }; 53 54 static const struct udevice_id generic_simple_bus_ids[] = { 55 { .compatible = "simple-bus" }, 56 { .compatible = "simple-mfd" }, 57 { } 58 }; 59 60 U_BOOT_DRIVER(simple_bus_drv) = { 61 .name = "generic_simple_bus", 62 .id = UCLASS_SIMPLE_BUS, 63 .of_match = generic_simple_bus_ids, 64 }; 65