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