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