mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-08-24 23:41:23 +01:00

This allows the compiler to generate significantly better code, because it does not have to maintain either the loop counter or loop limit. Plus there are half as many symbols to relocate. This also simplifies passing carray arrays to helper functions. Signed-off-by: Samuel Holland <samuel.holland@sifive.com> Reviewed-by: Anup Patel <anup@brainfault.org>
51 lines
1.1 KiB
C
51 lines
1.1 KiB
C
/*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*
|
|
* Copyright (c) 2020 Western Digital Corporation or its affiliates.
|
|
*
|
|
* Authors:
|
|
* Anup Patel <anup.patel@wdc.com>
|
|
*/
|
|
|
|
#include <sbi/sbi_console.h>
|
|
#include <sbi/sbi_error.h>
|
|
#include <sbi/sbi_scratch.h>
|
|
#include <sbi_utils/fdt/fdt_helper.h>
|
|
#include <sbi_utils/reset/fdt_reset.h>
|
|
|
|
/* List of FDT reset drivers generated at compile time */
|
|
extern struct fdt_reset *const fdt_reset_drivers[];
|
|
|
|
int fdt_reset_driver_init(const void *fdt, struct fdt_reset *drv)
|
|
{
|
|
int noff, rc, cnt = 0;
|
|
const struct fdt_match *match;
|
|
|
|
noff = -1;
|
|
while ((noff = fdt_find_match(fdt, noff,
|
|
drv->match_table, &match)) >= 0) {
|
|
if (!fdt_node_is_enabled(fdt, noff))
|
|
continue;
|
|
|
|
if (drv->init) {
|
|
rc = drv->init(fdt, noff, match);
|
|
if (!rc)
|
|
cnt++;
|
|
else if (rc != SBI_ENODEV) {
|
|
sbi_printf("%s: %s init failed, %d\n",
|
|
__func__, match->compatible, rc);
|
|
}
|
|
}
|
|
}
|
|
|
|
return cnt > 0 ? 0 : SBI_ENODEV;
|
|
}
|
|
|
|
void fdt_reset_init(const void *fdt)
|
|
{
|
|
int pos;
|
|
|
|
for (pos = 0; fdt_reset_drivers[pos]; pos++)
|
|
fdt_reset_driver_init(fdt, fdt_reset_drivers[pos]);
|
|
}
|