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