]>
Commit | Line | Data |
---|---|---|
da802b9e SG |
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 | ||
f3301771 SG |
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 | ||
da802b9e SG |
29 | static int simple_bus_post_bind(struct udevice *dev) |
30 | { | |
f3301771 SG |
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 | ||
da802b9e SG |
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, | |
f3301771 | 51 | .per_device_platdata_auto_alloc_size = sizeof(struct simple_bus_plat), |
da802b9e SG |
52 | }; |
53 | ||
54 | static const struct udevice_id generic_simple_bus_ids[] = { | |
55 | { .compatible = "simple-bus" }, | |
9f56917a | 56 | { .compatible = "simple-mfd" }, |
da802b9e SG |
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 | }; |