• Weijie Gao's avatar
    board_r: move initr_watchdog to be called after initr_serial · 84b2416b
    Weijie Gao authored
    
    
    The initr_watchdog is currently placed before initr_serial. The
    initr_watchdog calls printf and printf finally calls ops->putc of a serial
    driver.
    
    However, gd->cur_serial_dev points to a udevice allocated in board_f. The
    gd->cur_serial_dev->driver->ops->putc points the the code region before
    relocation.
    
    Some serial drivers call WATCHDOG_RESET() in ops->putc. When DM is enabled
    for watchdog, watchdog_reset() is called. watchdog_reset() calls get_timer
    to get current timer.
    
    On some platforms the timer driver is also a DM driver. initr_watchdog is
    placed right after initr_dm, which means the timer driver hasn't been
    initialized. So dm_timer_init() is called. To create a new udevice, calloc
    is called.
    
    However start from ops->putc, u-boot execution flow is redirected into the
    memory region before relocation (board_f). In board_f, dlmalloc hasn't
    been initialized. The call to calloc will fail, and this will cause DM to
    print out an error message, and it will call printf again, causing
    recursive error outputs.
    
    This patch places initr_watchdog after initr_serial to solve this issue.
    
    Cc: Stefan Roese <sr@denx.de>
    Reviewed-by: default avatarRyder Lee <ryder.lee@mediatek.com>
    Signed-off-by: default avatarWeijie Gao <weijie.gao@mediatek.com>
    Reviewed-by: default avatarStefan Roese <sr@denx.de>
    Tested-by: default avatarFrank Wunderlich <frank-w@public-files.de>
    Tested-by: default avatarSuniel Mahesh <sunil.m@techveda.org>
    84b2416b