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 10 DECLARE_GLOBAL_DATA_PTR; 11 12 struct simple_bus_plat { 13 u32 base; 14 u32 size; 15 u32 target; 16 }; 17 18 fdt_addr_t simple_bus_translate(struct udevice *dev, fdt_addr_t addr) 19 { 20 struct simple_bus_plat *plat = dev_get_uclass_platdata(dev); 21 22 if (addr >= plat->base && addr < plat->base + plat->size) 23 addr = (addr - plat->base) + plat->target; 24 25 return addr; 26 } 27 28 static int simple_bus_post_bind(struct udevice *dev) 29 { 30 #if CONFIG_IS_ENABLED(OF_PLATDATA) 31 return 0; 32 #else 33 u32 cell[3]; 34 int ret; 35 36 ret = dev_read_u32_array(dev, "ranges", cell, ARRAY_SIZE(cell)); 37 if (!ret) { 38 struct simple_bus_plat *plat = dev_get_uclass_platdata(dev); 39 40 plat->base = cell[0]; 41 plat->target = cell[1]; 42 plat->size = cell[2]; 43 } 44 45 return dm_scan_fdt_dev(dev); 46 #endif 47 } 48 49 UCLASS_DRIVER(simple_bus) = { 50 .id = UCLASS_SIMPLE_BUS, 51 .name = "simple_bus", 52 .post_bind = simple_bus_post_bind, 53 .per_device_platdata_auto_alloc_size = sizeof(struct simple_bus_plat), 54 }; 55 56 static const struct udevice_id generic_simple_bus_ids[] = { 57 { .compatible = "simple-bus" }, 58 { .compatible = "simple-mfd" }, 59 { } 60 }; 61 62 U_BOOT_DRIVER(simple_bus_drv) = { 63 .name = "generic_simple_bus", 64 .id = UCLASS_SIMPLE_BUS, 65 .of_match = generic_simple_bus_ids, 66 }; 67