init_sequence is an array with function pointers. It produces lots of relocation data and it is hard to debug when something fails.
Transform it into a function, making it smaller and easier to debug. text data bss dec hex filename 1268 212 0 1480 5c8 lib_ppc/board.org 1224 92 0 1316 524 lib_ppc/board.new Signed-off-by: Joakim Tjernlund <joakim.tjernl...@transmode.se> --- lib_ppc/board.c | 123 +++++++++++++++++++++++++++++++++--------------------- 1 files changed, 75 insertions(+), 48 deletions(-) diff --git a/lib_ppc/board.c b/lib_ppc/board.c index 765f97a..f0160e6 100644 --- a/lib_ppc/board.c +++ b/lib_ppc/board.c @@ -157,7 +157,6 @@ ulong monitor_flash_len; * argument, and returns an integer return code, where 0 means * "continue" and != 0 means "fatal error, hang the system". */ -typedef int (init_fnc_t) (void); /************************************************************************ * Init Utilities * @@ -236,17 +235,17 @@ static int init_func_watchdog_init (void) WATCHDOG_RESET (); return (0); } -# define INIT_FUNC_WATCHDOG_INIT init_func_watchdog_init, +# define INIT_FUNC_WATCHDOG_INIT init_func_watchdog_init() static int init_func_watchdog_reset (void) { WATCHDOG_RESET (); return (0); } -# define INIT_FUNC_WATCHDOG_RESET init_func_watchdog_reset, +# define INIT_FUNC_WATCHDOG_RESET init_func_watchdog_reset() #else -# define INIT_FUNC_WATCHDOG_INIT /* undef */ -# define INIT_FUNC_WATCHDOG_RESET /* undef */ +# define INIT_FUNC_WATCHDOG_INIT 0 /* undef */ +# define INIT_FUNC_WATCHDOG_RESET 0 /* undef */ #endif /* CONFIG_WATCHDOG */ /************************************************************************ @@ -254,76 +253,110 @@ static int init_func_watchdog_reset (void) ************************************************************************ */ -init_fnc_t *init_sequence[] = { +void init_sequence(void) +{ #if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx) - probecpu, + if (probecpu()) + goto err_out; #endif #if defined(CONFIG_BOARD_EARLY_INIT_F) - board_early_init_f, + if (board_early_init_f()) + goto err_out; #endif #if !defined(CONFIG_8xx_CPUCLK_DEFAULT) - get_clocks, /* get CPU and bus clocks (etc.) */ + if (get_clocks()) + goto err_out; /* get CPU and bus clocks (etc.) */ #if defined(CONFIG_TQM8xxL) && !defined(CONFIG_TQM866M) \ && !defined(CONFIG_TQM885D) - adjust_sdram_tbs_8xx, + if (adjust_sdram_tbs_8xx()) + goto err_out; #endif - init_timebase, + if (init_timebase()) + goto err_out; #endif #ifdef CONFIG_SYS_ALLOC_DPRAM #if !defined(CONFIG_CPM2) - dpram_init, + if (dpram_init()) + goto err_out; #endif #endif #if defined(CONFIG_BOARD_POSTCLK_INIT) - board_postclk_init, + if (board_postclk_init()) + goto err_out; #endif - env_init, + if (env_init()) + goto err_out; #if defined(CONFIG_8xx_CPUCLK_DEFAULT) - get_clocks_866, /* get CPU and bus clocks according to the environment variable */ - sdram_adjust_866, /* adjust sdram refresh rate according to the new clock */ - init_timebase, -#endif - init_baudrate, - serial_init, - console_init_f, - display_options, + if (get_clocks_866()) + goto err_out; /* get CPU and bus clocks according to the environment variable */ + if (sdram_adjust_866()) + goto err_out; /* adjust sdram refresh rate according to the new clock */ + if (init_timebase()) + goto err_out; +#endif + if (init_baudrate()) + goto err_out; + if (serial_init()) + goto err_out; + if (console_init_f()) + goto err_out; + if (display_options()) + goto err_out; #if defined(CONFIG_8260) - prt_8260_rsr, - prt_8260_clks, + if (prt_8260_rsr()) + goto err_out; + if (prt_8260_clks()) + goto err_out; #endif /* CONFIG_8260 */ #if defined(CONFIG_MPC83xx) - prt_83xx_rsr, + if (prt_83xx_rsr()) + goto err_out; #endif - checkcpu, + if (checkcpu()) + goto err_out; #if defined(CONFIG_MPC5xxx) - prt_mpc5xxx_clks, + if (prt_mpc5xxx_clks()) + goto err_out; #endif /* CONFIG_MPC5xxx */ #if defined(CONFIG_MPC8220) - prt_mpc8220_clks, + if (prt_mpc8220_clks()) + goto err_out; #endif - checkboard, - INIT_FUNC_WATCHDOG_INIT + if (checkboard()) + goto err_out; + if (INIT_FUNC_WATCHDOG_INIT) + goto err_out; #if defined(CONFIG_MISC_INIT_F) - misc_init_f, + if (misc_init_f()) + goto err_out; #endif - INIT_FUNC_WATCHDOG_RESET + if (INIT_FUNC_WATCHDOG_RESET) + goto err_out; #if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) - init_func_i2c, + if (init_func_i2c()) + goto err_out; #endif #if defined(CONFIG_HARD_SPI) - init_func_spi, + if (init_func_spi()) + goto err_out; #endif #ifdef CONFIG_POST - post_init_f, + if (post_init_f()) + goto err_out; #endif - INIT_FUNC_WATCHDOG_RESET - init_func_ram, + if (INIT_FUNC_WATCHDOG_RESET) + goto err_out; + if (init_func_ram()) + goto err_out; #if defined(CONFIG_SYS_DRAM_TEST) - testdram, + if (testdram()) + goto err_out; #endif /* CONFIG_SYS_DRAM_TEST */ - INIT_FUNC_WATCHDOG_RESET - - NULL, /* Terminate this list */ + if (INIT_FUNC_WATCHDOG_RESET) + goto err_out; + return; +err_out: + hang(); }; ulong get_effective_memsize(void) @@ -366,7 +399,6 @@ void board_init_f (ulong bootflag) ulong len, addr, addr_sp; ulong *s; gd_t *id; - init_fnc_t **init_fnc_ptr; #ifdef CONFIG_PRAM int i; ulong reg; @@ -383,12 +415,7 @@ void board_init_f (ulong bootflag) /* Clear initial global data */ memset ((void *) gd, 0, sizeof (gd_t)); #endif - - for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { - if ((*init_fnc_ptr) () != 0) { - hang (); - } - } + init_sequence(); /* * Now that we have DRAM mapped and working, we can -- 1.6.4.4 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot