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 u32 cell[3]; 31 int ret; 32 33 ret = fdtdec_get_int_array(gd->fdt_blob, dev->of_offset, "ranges", 34 cell, ARRAY_SIZE(cell)); 35 if (!ret) { 36 struct simple_bus_plat *plat = dev_get_uclass_platdata(dev); 37 38 plat->base = cell[0]; 39 plat->target = cell[1]; 40 plat->size = cell[2]; 41 } 42 43 return dm_scan_fdt_dev(dev); 44 } 45 46 UCLASS_DRIVER(simple_bus) = { 47 .id = UCLASS_SIMPLE_BUS, 48 .name = "simple_bus", 49 .post_bind = simple_bus_post_bind, 50 .per_device_platdata_auto_alloc_size = sizeof(struct simple_bus_plat), 51 }; 52 53 static const struct udevice_id generic_simple_bus_ids[] = { 54 { .compatible = "simple-bus" }, 55 { .compatible = "simple-mfd" }, 56 { } 57 }; 58 59 U_BOOT_DRIVER(simple_bus_drv) = { 60 .name = "generic_simple_bus", 61 .id = UCLASS_SIMPLE_BUS, 62 .of_match = generic_simple_bus_ids, 63 }; 64