/*
 * 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.
 */
#ifndef _USB_TYPEDEFS_
#define _USB_TYPEDEFS_

#define __packed __attribute__((packed))
#define __LITTLE_ENDIAN 0
#define __BYTE_ORDER __LITTLE_ENDIAN

typedef int bool;
typedef unsigned char uint_8;
typedef unsigned long uint_32;
#define _PTR_ *
#define pointer void*
typedef unsigned char uchar;
typedef unsigned char * uchar_ptr;
typedef unsigned int	boolean;

typedef unsigned char 	u8;
typedef unsigned short 	u16;
typedef unsigned int 	u32;

typedef unsigned char 	uint8_t;
typedef unsigned short	uint16_t;
typedef unsigned int	uint32_t;

typedef signed char 	s8;
typedef short 			s16;
typedef int 			s32;

typedef u8 __u8;
typedef u16 __u16;
typedef u32 __u32;
typedef u16 __le16;
typedef u32 __le32;

# define cpu_to_le16(x)		(x)
# define cpu_to_le32(x)		(x)
# define cpu_to_le64(x)		(x)
# define le16_to_cpu(x)		(x)
# define le32_to_cpu(x)		(x)
# define le64_to_cpu(x)		(x)

#ifdef AARCH64
typedef unsigned long       u64;
typedef unsigned long       ulong;
typedef unsigned long	fdt_addr_t;
#else
typedef unsigned long long 	u64;
typedef unsigned long long 	ulong;
typedef unsigned long long	fdt_addr_t;
#endif

#define FAIL				  (-1)
#define SUCCESS 			  0
#define EIO 				  1
#define ETIMEOUT			  2
#define EUNALIGN			  3
#define ENODEV				  4
#define ENOMEM				  5
#define EINVAL				  6
#define EFAULTCONTENT		  7
#define EBUSY				  8
#define ENO_PRD_ENTRY		  9
#define ENOACK				  10
#define EUNDEF_BOARD		  11
#define EDEFAULT			  12
#define ECMP				  13
#define ENOINIT 			  14
#define EPERM		15	/* Operation not permitted */
#define ENOEXEC 	16 /* Exec format error */
#define EXDEV		18	/* Cross-device link */

#define ENOSPC		28	/* No space left on device, bandwidth error */
#define EPIPE		32	/* Broken pipe */
#define ENAMETOOLONG	36		/* File name too long */

#define ENOMSG		42	/* No message of desired type */
#define EIDRM		43	/* Identifier removed */

#define ENODATA 	61	/* No data available */
#define ENOSR		63	/* Out of streams resources */

#define ECOMM		70	/* Communication error on send */
#define EPROTO		71	/* Protocol error */
#define EOVERFLOW	75	/* Value too large for defined data type */
#define EILSEQ		84	/* Illegal byte sequence */

#define EMSGSIZE	90	/* Message too long */

#define ECONNRESET	104 /* Connection reset by peer */
#define ENOTCONN	107 	/* Transport endpoint is not connected */
#define ESHUTDOWN	108 	/* cannot send after transport endpoint shutdown */
#define ENOENT		109 	/* No such file or directory */
#define EHOSTUNREACH	113 /* No route to host */
#define EINPROGRESS 115 /* Operation now in progress */
#define EREMOTEIO	121 /* Remote I/O error */

#define min(a, b) (((a) < (b)) ? (a) : (b))
#define max(a, b) (((a) > (b)) ? (a) : (b))

#endif
