xref: /rk3399_rockchip-uboot/lib/initcall.c (revision 2f43f85460453f928005e06915892167addbd49a)
1c8a311d9SSimon Glass /*
2c8a311d9SSimon Glass  * Copyright (c) 2013 The Chromium OS Authors.
3c8a311d9SSimon Glass  *
41a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
5c8a311d9SSimon Glass  */
6c8a311d9SSimon Glass 
7c8a311d9SSimon Glass #include <common.h>
8c8a311d9SSimon Glass #include <initcall.h>
9c8a311d9SSimon Glass 
10*2f43f854SSimon Glass DECLARE_GLOBAL_DATA_PTR;
11*2f43f854SSimon Glass 
12*2f43f854SSimon Glass int initcall_run_list(const init_fnc_t init_sequence[])
13c8a311d9SSimon Glass {
14*2f43f854SSimon Glass 	const init_fnc_t *init_fnc_ptr;
15c8a311d9SSimon Glass 
16c8a311d9SSimon Glass 	for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
17*2f43f854SSimon Glass 		unsigned long reloc_ofs = 0;
18*2f43f854SSimon Glass 
19*2f43f854SSimon Glass 		if (gd->flags & GD_FLG_RELOC)
20*2f43f854SSimon Glass 			reloc_ofs = gd->reloc_off;
21*2f43f854SSimon Glass 		debug("initcall: %p\n", (char *)*init_fnc_ptr - reloc_ofs);
22c8a311d9SSimon Glass 		if ((*init_fnc_ptr)()) {
23*2f43f854SSimon Glass 			printf("initcall sequence %p failed at call %p\n",
24*2f43f854SSimon Glass 			       init_sequence,
25*2f43f854SSimon Glass 			       (char *)*init_fnc_ptr - reloc_ofs);
26c8a311d9SSimon Glass 			return -1;
27c8a311d9SSimon Glass 		}
28c8a311d9SSimon Glass 	}
29c8a311d9SSimon Glass 	return 0;
30c8a311d9SSimon Glass }
31