/*
 * Copyright (C) 2018 Synaptics Incorporated. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND
 * SYNAPTICS EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES,
 * INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE, AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY
 * INTELLECTUAL PROPERTY RIGHTS. IN NO EVENT SHALL SYNAPTICS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, OR
 * CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE USE
 * OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED AND
 * BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF
 * COMPETENT JURISDICTION DOES NOT PERMIT THE DISCLAIMER OF DIRECT
 * DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' TOTAL CUMULATIVE LIABILITY
 * TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. DOLLARS.
 */

#include "common.h"
#include "chipctrl_const.h"
#include "config.h"
#include "nand_priv.h"
#include "util.h"
#include "global.h"
#if defined(__UBOOT__)
#include <malloc.h>
#include "galois_io.h"
#else
#include "io.h"
#include "lgpl_printf.h"
#endif /* #if defined(__UBOOT__) */
#include "apb_perif_base.h"
#include "apb_gpio.h"
#include "pin_settings.h"
#include "wol.h"

#include "version_table.h"

#include "android/bootimg.h"
#include "flash_ts.h"

#include "nflash_drv.h"

#if defined(DEBUG)
#define debug_printf(a...) lgpl_printf(a)
#else
#define debug_printf(a...)
#endif

extern unsigned int uiWarmDown_2_Linux_Addr;

void bootloader_customize_initialize_postprocess(unsigned int boot_state);
void bootloader_customize_load_image_preprocess(unsigned int boot_state);
void bootloader_customize_load_image_postprocess(unsigned int boot_state);
void bootloader_customize_response_to_sm_preprocess(unsigned int boot_state);
void bootloader_customize_start_kernel_preprocess(unsigned int boot_state);
