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