/*
  *
  **************************************************************************
  **                        STMicroelectronics				**
  **************************************************************************
  **                        marco.cali@st.com				 **
  **************************************************************************
  *                                                                        *
  *                  FTS error/info kernel log reporting		  *
  *                                                                        *
  **************************************************************************
  **************************************************************************
  *
  */

/*!
  * \file ftsError.h
  * \brief Contains all the definitions and structs which refer to Error
  * conditions
  */

#ifndef FTS_ERROR_H
#define FTS_ERROR_H

#include "ftsHardware.h"
#include "ftsSoftware.h"


/** @defgroup error_codes Error Codes
  * Error codes that can be reported by the driver functions.
  * An error code is made up by 4 bytes, each byte indicate a logic error
  * level.\n
  * From the LSB to the MSB, the logic level increase going from a low level
  * error (I2C,TIMEOUT) to an high level error (flashing procedure fail,
  * production test fail etc)
  * @{
  */

/* FIRST LEVEL ERROR CODE */
/** @defgroup first_level	First Level Error Code
  * @ingroup error_codes
  * Errors related to low level operation which are not under control of driver,
  * such as: communication protocol (I2C/SPI), timeout, file operations ...
  * @{
  */
#define OK			(0x00000000)	/* /< No ERROR */
#define ERROR_ALLOC		(0x80000001)	/* /< allocation of memory
						 * failed */
#define ERROR_BUS_R		(0x80000002)	/* /< i2c/spi read failed */
#define ERROR_BUS_W		(0x80000003)	/* /< i2c/spi write failed */
#define ERROR_BUS_WR		(0x80000004)	/* /< i2c/spi write/read
						 * failed */
#define ERROR_BUS_O		(0x80000005)	/* /< error during
						 * opening an i2c device */
#define ERROR_OP_NOT_ALLOW	(0x80000006)	/* /< operation not allowed */
#define ERROR_TIMEOUT		(0x80000007)	/* /< timeout expired!
						 * exceed the max number
						 * of retries or the max
						 * waiting time */
#define ERROR_FILE_NOT_FOUND	(0x80000008)	/* /< the file that i
						 * want to open is not found */
#define ERROR_FILE_PARSE	(0x80000009)	/* /< error during parsing
						 * the file */
#define ERROR_FILE_READ		(0x8000000A)	/* /< error during
						 * reading the file */
#define ERROR_LABEL_NOT_FOUND	(0x8000000B)	/* /< label not found */
#define ERROR_FW_NO_UPDATE	(0x8000000C)	/* /< fw in the chip
						 * newer than the one in
						 * the memmh */
#define ERROR_FLASH_UNKNOWN	(0x8000000D)	/* /< flash status busy
						 * or unknown */
/** @}*/

/* SECOND LEVEL ERROR CODE */
/** @defgroup second_level Second Level Error Code
  * @ingroup error_codes
  * Errors related to simple logic operations in the IC which require one
  * command or which are part of a more complex procedure
  * @{
  */
#define ERROR_DISABLE_INTER		(0x80000200)	/* /< unable to
							 * disable the
							 * interrupt */
#define ERROR_ENABLE_INTER		(0x80000300)	/* /< unable to activate
							 * the interrupt */
#define ERROR_READ_CONFIG		(0x80000400)	/* /< failed to read
							 * config memory */
#define ERROR_GET_OFFSET		(0x80000500)	/* /< unable to
							 * read an offset from
							 * memory */
#define ERROR_GET_FRAME_DATA		(0x80000600)	/* /< unable to
							 * retrieve the data of
							 * a required frame */
#define ERROR_DIFF_DATA_TYPE		(0x80000700)	/* /< FW answers
							 * with an event that
							 * has a different
							 * address respect the
							 * request done */
#define ERROR_WRONG_DATA_SIGN		(0x80000800)	/* /< the signature of
							 * the host data is not
							 * HEADER_SIGNATURE */
#define ERROR_SET_SCAN_MODE_FAIL	(0x80000900)	/* /< setting
							 * the scanning mode
							 * failed
							 * (sense on/off
							 * etc...) */
#define ERROR_SET_FEATURE_FAIL		(0x80000A00)	/* /< setting a specific
							 * feature failed */
#define ERROR_SYSTEM_RESET_FAIL		(0x80000B00)	/* /< the command
							 * SYSTEM RESET
							 * failed */
#define ERROR_FLASH_NOT_READY		(0x80000C00)	/* /< flash status not
							 * ready within a
							 * timeout */
#define ERROR_FW_VER_READ		(0x80000D00)	/* /< unable to retrieve
							 * fw_vers or the
							 * config_id */
#define ERROR_GESTURE_ENABLE_FAIL	(0x80000E00)	/* /< unable to
							 * enable/disable
							 * the gesture */
#define ERROR_GESTURE_START_ADD		(0x80000F00)	/* /< unable to start to
							 * add custom gesture */
#define ERROR_GESTURE_FINISH_ADD	(0x80001000)	/* /< unable to finish
							 * to add custom gesture
							 */
#define ERROR_GESTURE_DATA_ADD		(0x80001100)	/* /< unable to add
							 * custom gesture data
							 * */
#define ERROR_GESTURE_REMOVE		(0x80001200)	/* /< unable to remove
							 * custom gesture data
							 * */
#define ERROR_FEATURE_ENABLE_DISABLE	(0x80001300)	/* /< unable to
							 * enable/disable a
							 * feature mode in
							 * the IC */
#define ERROR_NOISE_PARAMETERS		(0x80001400)	/* /< unable to set/read
							 * noise parameter in
							 * the IC */
#define ERROR_CH_LEN			(0x80001500)	/* /< unable to retrieve
							 * the force and/or
							 * sense length */
#define ERROR_INFO_BLOCK		(0x80001600)	/* /< info
							 * block
							 * corruption */
/** @}*/

/* THIRD LEVEL ERROR CODE */
/** @defgroup third_level	Third Level Error Code
  * @ingroup error_codes
  * Errors related to logic operations in the IC which require more
  * commands/steps or which are part of a more complex procedure
  * @{
  */
#define ERROR_REQU_HDM_DOWNLOAD	(0x80010000)	/* /< HDM download
						 * request failed */
#define ERROR_REQU_DATA		(0x80020000)	/* /< data request
						 * failed */
#define ERROR_HDM_DATA_HEADER	(0x80030000)	/* /< unable to retrieve
						 * the HDM data
						 * header */
#define ERROR_COMP_DATA_GLOBAL	(0x80040000)	/* /< unable to retrieve
						 * the global
						 * compensation data */
#define ERROR_COMP_DATA_NODE	(0x80050000)	/* /< unable to retrieve
						 * the compensation data
						 * for each node */
#define ERROR_TEST_CHECK_FAIL	(0x80060000) /* /< check of
					      * production limits or
					      * of fw answers failed */
#define ERROR_MEMH_READ		(0x80070000)	/* /< memh reading
						 * failed */
#define ERROR_FLASH_BURN_FAILED (0x80080000) /* /< flash burn failed */
#define ERROR_MS_TUNING		(0x80090000) /* /< ms tuning failed */
#define ERROR_SS_TUNING		(0x800A0000)	/* /< ss tuning failed */
#define ERROR_LP_TIMER_TUNING	(0x800B0000)	/* /< lp timer
						 * calibration failed */
#define ERROR_SAVE_CX_TUNING	(0x800C0000)	/* /< save cx data to
						 * flash failed */
#define ERROR_HANDLER_STOP_PROC (0x800D0000)	/* /< stop the poll of the FIFO
						 * if particular errors are
						 * found */
#define ERROR_CHECK_ECHO_FAIL	(0x800E0000)	/* /< unable to retrieve
						 * echo event */
#define ERROR_GET_FRAME		(0x800F0000)	/* /< unable to get frame */
#define ERROR_GOLDEN_MUTUAL_DATA (0x80100000)	/* /< unable to read Golden
 						 * Mutual Data */
/** @}*/

/* FOURTH LEVEL ERROR CODE */
/** @defgroup fourth_level	Fourth Level Error Code
  * @ingroup error_codes
  * Errors related to the highest logic operations in the IC which have an
  * important impact on the driver flow or which require several commands and
  * steps to be executed
  * @{
  */
#define ERROR_PROD_TEST_DATA		(0x81000000)	/* /< production data
							 * test failed */
#define ERROR_FLASH_PROCEDURE		(0x82000000)	/* /< fw update
							 * procedure failed */
#define ERROR_PROD_TEST_ITO		(0x83000000)	/* /< production
							 * ito test failed */
#define ERROR_PROD_TEST_INITIALIZATION	(0x84000000) /* /< production
						      * initialization
						      * test failed */
#define ERROR_GET_INIT_STATUS		(0x85000000) /* /< mismatch of the MS or
						      * SS tuning_version */
/** @}*/

/** @}*/	/* end of error_commands section */

/**
  * Struct which store an ordered list of the errors events encountered during
  *the polling of a FIFO.
  * The max number of error events that can be stored is equal to FIFO_DEPTH
  */
typedef struct {
	u8 list[FIFO_DEPTH * FIFO_EVENT_SIZE];	/* /< byte array which contains
						 * the series of error events
						 * encountered from the last
						 * reset of the list. */
	int count;	/* /< number of error events stored in the list */
	int last_index;	/* /< index of the list where will be stored the next
			 * error event. Subtract -1 to have the index of the
			 * last error event! */
} ErrorList;

int isI2cError(int error);
int dumpErrorInfo(u8 *outBuf, int size);
int errorHandler(u8 *event, int size);
int addErrorIntoList(u8 *event, int size);
int getErrorListCount(void);
int resetErrorList(void);
int pollErrorList(int *event_to_search, int event_bytes);
int pollForErrorType(u8 *list, int size);
#endif
