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