/*
 * (C) Copyright 2002
 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 *
 * Be sure to mark tests to be run before relocation as such with the
 * CONFIG_SYS_POST_PREREL flag so that logging is done correctly if the
 * logbuffer support is enabled.
 */

#include <common.h>
#include <config.h>
#ifdef CONFIG_POST

#include <post.h>
#define CONFIG_SYS_POST_FLASH  0x00004000
#define CONFIG_SYS_POST_LED    0x00008000
#define CONFIG_SYS_POST_BUTTON 0x00010000

extern int cache_post_test(int flags);
extern int watchdog_post_test(int flags);
extern int i2c_post_test(int flags);
extern int rtc_post_test(int flags);
extern int memory_post_test(int flags);
extern int cpu_post_test(int flags);
extern int uart_post_test(int flags);
extern int ether_post_test(int flags);
extern int spi_post_test(int flags);
extern int usb_post_test(int flags);
extern int spr_post_test(int flags);
extern int sysmon_post_test(int flags);
extern int dsp_post_test(int flags);
extern int codec_post_test(int flags);

extern int sysmon_init_f(void);

extern void sysmon_reloc(void);

extern int flash_post_test(int flags);
extern int led_post_test(int flags);
extern int button_post_test(int flags);

struct post_test post_list[] = {
#if CONFIG_POST & CONFIG_SYS_POST_CACHE
	{
	 "Cache test",
	 "cache",
	 "This test verifies the CPU cache operation.",
	 POST_RAM | POST_ALWAYS,
	 &cache_post_test,
	 NULL,
	 NULL,
	 CONFIG_SYS_POST_CACHE},
#endif
#if CONFIG_POST & CONFIG_SYS_POST_WATCHDOG
	{
	 "Watchdog timer test",
	 "watchdog",
	 "This test checks the watchdog timer.",
	 POST_RAM | POST_POWERON | POST_SLOWTEST | POST_MANUAL | POST_REBOOT,
	 &watchdog_post_test,
	 NULL,
	 NULL,
	 CONFIG_SYS_POST_WATCHDOG},
#endif
#if CONFIG_POST & CONFIG_SYS_POST_I2C
	{
	 "I2C test",
	 "i2c",
	 "This test verifies the I2C operation.",
	 POST_RAM | POST_ALWAYS,
	 &i2c_post_test,
	 NULL,
	 NULL,
	 CONFIG_SYS_POST_I2C},
#endif
#if CONFIG_POST & CONFIG_SYS_POST_RTC
	{
	 "RTC test",
	 "rtc",
	 "This test verifies the RTC operation.",
	 POST_RAM | POST_SLOWTEST | POST_MANUAL,
	 &rtc_post_test,
	 NULL,
	 NULL,
	 CONFIG_SYS_POST_RTC},
#endif
#if CONFIG_POST & CONFIG_SYS_POST_MEMORY
	{
	 "Memory test",
	 "memory",
	 "This test checks RAM.",
	 POST_ROM | POST_POWERON | POST_SLOWTEST | POST_PREREL,
	 &memory_post_test,
	 NULL,
	 NULL,
	 CONFIG_SYS_POST_MEMORY},
#endif
#if CONFIG_POST & CONFIG_SYS_POST_CPU
	{
	 "CPU test",
	 "cpu",
	 "This test verifies the arithmetic logic unit of" " CPU.",
	 POST_RAM | POST_ALWAYS,
	 &cpu_post_test,
	 NULL,
	 NULL,
	 CONFIG_SYS_POST_CPU},
#endif
#if CONFIG_POST & CONFIG_SYS_POST_UART
	{
	 "UART test",
	 "uart",
	 "This test verifies the UART operation.",
	 POST_RAM | POST_SLOWTEST | POST_MANUAL,
	 &uart_post_test,
	 NULL,
	 NULL,
	 CONFIG_SYS_POST_UART},
#endif
#if CONFIG_POST & CONFIG_SYS_POST_ETHER
	{
	 "ETHERNET test",
	 "ethernet",
	 "This test verifies the ETHERNET operation.",
	 POST_RAM | POST_ALWAYS | POST_MANUAL,
	 &ether_post_test,
	 NULL,
	 NULL,
	 CONFIG_SYS_POST_ETHER},
#endif
#if CONFIG_POST & CONFIG_SYS_POST_SPI
	{
	 "SPI test",
	 "spi",
	 "This test verifies the SPI operation.",
	 POST_RAM | POST_ALWAYS | POST_MANUAL,
	 &spi_post_test,
	 NULL,
	 NULL,
	 CONFIG_SYS_POST_SPI},
#endif
#if CONFIG_POST & CONFIG_SYS_POST_USB
	{
	 "USB test",
	 "usb",
	 "This test verifies the USB operation.",
	 POST_RAM | POST_ALWAYS | POST_MANUAL,
	 &usb_post_test,
	 NULL,
	 NULL,
	 CONFIG_SYS_POST_USB},
#endif
#if CONFIG_POST & CONFIG_SYS_POST_SPR
	{
	 "SPR test",
	 "spr",
	 "This test checks SPR contents.",
	 POST_ROM | POST_ALWAYS | POST_PREREL,
	 &spr_post_test,
	 NULL,
	 NULL,
	 CONFIG_SYS_POST_SPR},
#endif
#if CONFIG_POST & CONFIG_SYS_POST_SYSMON
	{
	 "SYSMON test",
	 "sysmon",
	 "This test monitors system hardware.",
	 POST_RAM | POST_ALWAYS,
	 &sysmon_post_test,
	 &sysmon_init_f,
	 &sysmon_reloc,
	 CONFIG_SYS_POST_SYSMON},
#endif
#if CONFIG_POST & CONFIG_SYS_POST_DSP
	{
	 "DSP test",
	 "dsp",
	 "This test checks any connected DSP(s).",
	 POST_RAM | POST_MANUAL,
	 &dsp_post_test,
	 NULL,
	 NULL,
	 CONFIG_SYS_POST_DSP},
#endif
#if CONFIG_POST & CONFIG_SYS_POST_CODEC
	{
	 "CODEC test",
	 "codec",
	 "This test checks any connected codec(s).",
	 POST_RAM | POST_MANUAL,
	 &codec_post_test,
	 NULL,
	 NULL,
	 CONFIG_SYS_POST_CODEC},
#endif
#if CONFIG_POST & CONFIG_SYS_POST_FLASH
	{
	 "FLASH test",
	 "flash",
	 "This test checks flash.",
	 POST_RAM | POST_ALWAYS | POST_MANUAL,
	 &flash_post_test,
	 NULL,
	 NULL,
	 CONFIG_SYS_POST_FLASH},
#endif
#if CONFIG_POST & CONFIG_SYS_POST_LED
	{
	 "LED test",
	 "LED",
	 "This test checks LED ",
	 POST_RAM | POST_ALWAYS | POST_MANUAL,
	 &led_post_test,
	 NULL,
	 NULL,
	 CONFIG_SYS_POST_LED},
#endif
#if CONFIG_POST & CONFIG_SYS_POST_BUTTON
	{
	 "Button test",
	 "button",
	 "This test checks Button ",
	 POST_RAM | POST_ALWAYS | POST_MANUAL,
	 &button_post_test,
	 NULL,
	 NULL,
	 CONFIG_SYS_POST_BUTTON},
#endif

};

unsigned int post_list_size = sizeof(post_list) / sizeof(struct post_test);

#endif				/* CONFIG_POST */
