1/*
2 * Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 */
6#include <elfloader_common.h>
7#include <drivers/common.h>
8#include <printf.h>
9#include <strops.h>
10
11#define DRIVER_COMMON 1
12#include <devices_gen.h>
13#undef DRIVER_COMMON
14
15
16static int table_has_match(const char *compat, const struct dtb_match_table *table)
17{
18    for (int i = 0; table[i].compatible != NULL; i++) {
19        if (!strcmp(table[i].compatible, compat)) {
20            return i;
21        }
22    }
23
24    return -1;
25}
26
27static int init_device(struct elfloader_device *dev)
28{
29    struct elfloader_driver **drvp = __start__driver_list;
30
31    while (drvp < __stop__driver_list) {
32        struct elfloader_driver *drv = *drvp;
33        int ret = table_has_match(dev->compat, drv->match_table);
34        if (ret >= 0) {
35            dev->drv = drv;
36            drv->init(dev, drv->match_table[ret].match_data);
37        }
38        drvp++;
39    }
40
41    return 0;
42
43}
44
45int initialise_devices(void)
46{
47    for (unsigned int i = 0; i < ARRAY_SIZE(elfloader_devices); i++) {
48        int ret = init_device(&elfloader_devices[i]);
49        if (ret) {
50            return ret;
51        }
52    }
53
54    return 0;
55}
56