blob: 9b56c796b03e63ee5a498c8a8c1a0cee336bbc57 [file]
/*
* Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
*
* SPDX-License-Identifier: GPL-2.0-only
*/
#include <elfloader_common.h>
#include <drivers/common.h>
#include <printf.h>
#include <strops.h>
#define DRIVER_COMMON 1
#include <devices_gen.h>
#undef DRIVER_COMMON
static int table_has_match(const char *compat, const struct dtb_match_table *table)
{
for (int i = 0; table[i].compatible != NULL; i++) {
if (!strcmp(table[i].compatible, compat)) {
return i;
}
}
return -1;
}
static int init_device(struct elfloader_device *dev)
{
struct elfloader_driver **drvp = __start__driver_list;
while (drvp < __stop__driver_list) {
struct elfloader_driver *drv = *drvp;
int ret = table_has_match(dev->compat, drv->match_table);
if (ret >= 0) {
dev->drv = drv;
drv->init(dev, drv->match_table[ret].match_data);
}
drvp++;
}
return 0;
}
int initialise_devices(void)
{
for (unsigned int i = 0; i < ARRAY_SIZE(elfloader_devices); i++) {
int ret = init_device(&elfloader_devices[i]);
if (ret) {
return ret;
}
}
return 0;
}