/*
 * s2mm005.h - S2MM005 USBPD device driver header
 *
 * Copyright (C) 2015 Samsung Electronics
 *
 * 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
 *
 */
#ifndef __S2MM005_H
#define __S2MM005_H __FILE__

#include <linux/gpio.h>
#include <linux/of_gpio.h>
#include <linux/i2c.h>
#include <linux/interrupt.h>
#include <linux/slab.h>
#include <linux/platform_device.h>
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/firmware.h>
#include <linux/mutex.h>
#include <linux/types.h>
#include <linux/wakelock.h>

#if defined(CONFIG_CCIC_NOTIFIER)
#include <linux/ccic/ccic_notifier.h>
#endif
#if defined(CONFIG_DUAL_ROLE_USB_INTF)
#include <linux/usb/class-dual-role.h>
#elif defined(CONFIG_TYPEC)
#include <linux/usb/typec.h>
#endif

#define AVAILABLE_VOLTAGE 12000
#define UNIT_FOR_VOLTAGE 50
#define UNIT_FOR_CURRENT 10

#define REG_I2C_SLV_CMD		0x10
#define REG_TX_SINK_CAPA_MSG    0x0220
#define REG_TX_REQUEST_MSG	0x0240
#define REG_RX_SRC_CAPA_MSG	0x0260

#define CCIC_FW_VERSION_INVALID -1
#define CCIC_I2C_VALUE_INVALID 274

/******************************************************************************/
/* definitions & structures                                                   */
/******************************************************************************/
#define USBPD005_DEV_NAME  "usbpd-s2mm005"

/*
******************************************************************************
* @file    EXT_SRAM.h
* @author  Power Device Team
* @version V1.0.0
* @date    2016.03.28
* @brief   Header for EXT SRAM map
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
typedef union
{
	uint32_t DATA;
	struct
	{
		uint32_t Message_Type:4,
			Rsvd2_msg_header:1,
			Port_Data_Role:1,
			Specification_Revision:2,
			Port_Power_Role:1,
			Message_ID:3,
			Number_of_obj:3,
			Rsvd_msg_header:1,
			Reserved:16;
	} BITS;
} MSG_HEADER_Typedef;

typedef union
{
	uint32_t DATA;
	uint8_t  BYTES[4];
	struct
	{
		uint32_t Maximum_Current:10,
			Voltage_Unit:10,
			Peak_Current:2,
			Reserved:3,
			Data_Role_Swap:1,
			USB_Comm_Capable:1,
			Externally_POW:1,
			Higher_Capability:1,
			Dual_Role_Power:1,
			PDO_Parameter:2;
	} BITS;
} SINK_FIXED_SUPPLY_Typedef;

typedef union
{
	uint32_t DATA;
	uint8_t BYTES[4];
	struct {
		uint32_t Operational_Current:10,
		Minimum_Voltage:10,
		Maximum_Voltage:10,
		PDO_Parameter:2;
	} BITS;
} SINK_VAR_SUPPLY_Typedef;

typedef union
{
	MSG_HEADER_Typedef MSG_HEADER;
	SINK_FIXED_SUPPLY_Typedef MSG_FIXED_SUPPLY;
	SINK_VAR_SUPPLY_Typedef MSG_VAR_SUPPLY;
}SINK_CAPABILITY_MESSAGE_Typedef;

typedef union
{
    uint32_t DATA;
    struct {
        uint32_t   Reserved:32;
	}BITS;
} EXT_SRAM_Reserved_Type;


typedef union
{
	uint32_t        DATA;
    struct {
        uint32_t HW_VERSION_Reserved:32;
	}BITS;
} HW_VERSION_Type;

typedef union
{
	uint32_t        DATA;
    struct {
        uint32_t SW_VERSION_Reserved:32;
	}BITS;
} SW_VERSION_Type;

typedef union
{
	uint32_t        DATA;
    struct {
        uint32_t    CMD_MODE_SEL:8,
                    CMD_HOST:8,
                    CMD_WR_DATA1:8,
                    CMD_WR_DATA2:8;
	}BITS;
} I2C_SLV_CMD_Type;

typedef union
{
	uint32_t        DATA;
    struct {
        uint32_t    RSP_WORD1:16,
                    RSP_WORD2:16;
    } WORDS;
    struct {
        uint32_t    RSP_BYTE1:8,
                    RSP_BYTE2:8,
                    RSP_BYTE3:8,
                    RSP_BYTE4:8;
	}BYTES;
} I2C_SLV_RSP_Type;

typedef union
{
	uint32_t	DATA;
	uint8_t	BYTE[4];
	struct {
        uint32_t    PD_State:8,
                    RSP_BYTE1:8,
                    PD_Next_State:8,
                    RSP_BYTE2:8;
	}BYTES;
    struct {
        uint32_t    PD_State:8,
                    CC1_PLUG_STATE:3,
                    RSP_BYTE1:1,
                    CC2_PLUG_STATE:3,
                    RSP_BYTE2:1,
                    PD_Next_State:8,
                    ATTACH_DONE:1,
                    IS_SOURCE:1,
                    IS_DFP:1,
                    RP_CurrentLvl:2,
                    VBUS_CC_Short:1,
			VBUS_SBU_Short:1,
                    RESET:1;
	}BITS;
} FUNC_STATE_Type;

typedef union
{
	uint32_t	DATA;
	uint8_t	BYTE[4];
	struct {
        uint32_t    AUTO_LP_ENABLE_BIT:1,
                    LOW_POWER_BIT:1,
                    Force_LP_BIT:1,
                    WATER_DET:1,
                    SW_JIGON:1,
                    RUN_DRY:1,
                    removing_charge_by_sbu_low:1,
                    BOOTING_RUN_DRY:1,
			Sleep_Cable_Detect:1, //b8
			PDSTATE29_SBU_DONE:1, //b9
			RSP_BYTE:22;		//b10 ~ b31
	} BITS;
} LP_STATE_Type;

typedef union
{
	uint32_t        DATA;
	uint8_t	BYTE[4];
    struct {
        uint32_t    Flash_State:8,
                    Reserved:24;
	}BITS;
} FLASH_STATE_Type;


typedef union
{
    uint32_t DATA;
    uint8_t  BYTES[4];
    struct {
        uint32_t    SOP2p_Debug:1,
                    SOPp_Debug:1,
                    SOP2p:1,
                    SOPp:1,
                    SOP:1,
                    RSVD_1:27;
  } BITS;
} SYNC_STATUS_Type;

typedef union
{
    uint32_t DATA;
    uint8_t  BYTES[4];
    struct {
        uint32_t    FR_Swap:1,
                    Get_Source_Status:1,
                    Get_Source_Extended:1,
                    Not_Supported:1,
                    Soft_Reset:1,
                    Wait:1,
                    VCONN_Swap:1,
                    PR_Swap:1,
                    DR_Swap:1,
                    Get_Sink_Cap:1,
                    Get_Source_Cap:1,
                    PS_RDY:1,
                    Ping:1,
                    Reject:1,
                    Accept:1,
                    GotoMin:1,
                    GoodCRC:1,
                    RSVD_1:15;
  } BITS;
} CTRL_MSG_STATUS_Type;

typedef union
{
    uint32_t DATA;
    uint8_t  BYTES[4];
    struct {
        uint32_t    Attention:1,
                    Exit_Mode:1,
                    Enter_Mode:1,
                    Discover_Modes:1,
                    Discover_SVIDs:1,
                    Discover_Identity:1,
                    Source_Alert:1,
                    Battery_Status:1,
                    Vendor_Defined:1,
                    BIST_TEST_Data:1,
                    BIST_Carrier_Mode2:1,
                    Request:1,
                    Sink_Capability:1,
                    Source_Capability:1,
                    RSVD_1:18;
  } BITS;
} DATA_MSG_STATUS_Type;

typedef union
{
    uint32_t DATA;
    uint8_t  BYTES[4];
    struct {
        uint32_t    FW_UPDATE_Response:1,
                    FW_UPDATA_Request:1,
                    Security_Response:1,
                    Security_Request:1,
                    Manufacturer_Info:1,
                    Battery_Capabilities:1,
                    Get_Battery_Status:1,
                    Get_Battery_Cap:1,
                    Source_Status:1,
                    Source_Cap_Extended:1,
                    RSVD_1:21;
  } BITS;
} EXTENDED_MSG_STATUS_Type;


typedef union
{
    uint32_t DATA;
    uint8_t  BYTES[4];
    struct {
        uint32_t    Ctrl_Flag_Reserved_b0:1,        // b0
                    Ctrl_Flag_GoodCRC:1,            // b1
                    Ctrl_Flag_GotoMin:1,            // b2
                    Ctrl_Flag_Accept:1,             // b3
                    Ctrl_Flag_Reject:1,             // b4
                    Ctrl_Flag_Ping:1,               // b5
                    Ctrl_Flag_PS_RDY:1,             // b6
                    Ctrl_Flag_Get_Source_Cap:1,     // b7
                    Ctrl_Flag_Get_Sink_Cap:1,       // b8
                    Ctrl_Flag_DR_Swap:1,            // b9
                    Ctrl_Flag_PR_Swap:1,            // b10
                    Ctrl_Flag_VCONN_Swap:1,         // b11
                    Ctrl_Flag_Wait:1,               // b12
                    Ctrl_Flag_Soft_Reset:1,         // b13
                    Ctrl_Flag_Reserved_b14:1,       // b14
                    Ctrl_Flag_Reserved_b15:1,       // b15
                    Data_Flag_Reserved_b16:1,       // b16
                    Data_Flag_SRC_Capability:1,     // b17
                    Data_Flag_Request:1,            // b18
                    Data_Flag_BIST:1,               // b19
                    Data_Flag_SNK_Capability:1,     // b20
                    Data_Flag_Reserved_05:1,        // b21
                    Data_Flag_Reserved_06:1,        // b22
                    Data_Flag_Reserved_07:1,        // b23
                    Data_Flag_Reserved_08:1,        // b24
                    Data_Flag_Reserved_09:1,        // b25
                    Data_Flag_Reserved_10:1,        // b26
                    Data_Flag_Reserved_11:1,        // b27
                    Data_Flag_Reserved_12:1,        // b28
                    Data_Flag_Reserved_13:1,        // b29
                    Data_Flag_Reserved_14:1,        // b30
                    Data_Flag_Vender_Defined:1;     // b31

    }BITS;
} MSG_IRQ_STATUS_Type;


typedef union
{
	uint32_t DATA;
	uint8_t  BYTES[4];
	struct {
	    uint32_t	Vdm_Flag_Reserve_b0:1,		// b0
			Vdm_Flag_Discover_ID:1,		// b1
			Vdm_Flag_Discover_SVIDs:1,	// b2
			Vdm_Flag_Discover_MODEs:1,	// b3
			Vdm_Flag_Enter_Mode:1,		// b4
			Vdm_Flag_Exit_Mode:1,		// b5
			Vdm_Flag_Attention:1,		// b6
			Vdm_Flag_Reserved:9,		// b7 - b15
			Vdm_Flag_DP_Status_Update:1,	// b16
			Vdm_Flag_DP_Configure:1,	// b17
			Vdm_Flag_Reserved2:14;		// b18 - b31
	}BITS;
} VDM_MSG_IRQ_STATUS_Type;

typedef union
{
    uint32_t DATA;
    uint8_t  BYTES[4];
    struct {
        uint32_t    AP_Req_Get:2,                   // b0-b1
                    UPSM_By_I2C:1,                  // b2
                    Reserved:1,                     // b3
                    Is_HardReset:1,                 // b4
                    FAC_Abnormal_Repeat_State:1,    // b5
                    FAC_Abnormal_Repeat_RID:1,      // b6
                    FAC_Abnormal_RID0:1,            // b7
                    SBU1_CNT:8,                     // b8 - b15
                    SBU2_CNT:8,                     // b16 - b23
                    SBU_LOW_CNT:4,                  // b24 - b27
                    Alt_Mode_By_I2C:2,              // b28 - b29
                    AP_Req_Reserved_H:1,            // b30
                    Func_Abnormal_State:1;          // b31
  } BITS;
} AP_REQ_GET_STATUS_Type;

typedef union
{
    uint32_t DATA;
    uint8_t  BYTES[4];
    struct {
        uint32_t    Ssm_Flag_Reserve_b0:1,		// b0
                    Ssm_Flag_Identification:1,		// b1
                    Ssm_Flag_RandomNumber:1,		// b2
                    Ssm_Flag_Encrypted_Data:1,		// b3
                    Ssm_Flag_Unstructured_Data:1,	// b4
                    Ssm_Flag_Reserved:26,		// b5 - b30
                    Ssm_Flag_AES_Done:1;
  } BITS;
} SSM_MSG_IRQ_STATUS_Type;

typedef union
    {
    uint32_t DATA;
    uint8_t  BYTES[4];
    struct {
        uint32_t    RID:8,
                    KID:8,
                    ACC_CMD:8,
                    Reserved:8;
  } BITS;
} SSM_HW_ID_VALUE_Type;

typedef union
    {
    uint32_t DATA;
    uint8_t  BYTES[4];
    struct {
        uint32_t    Product_ID:16,
                    Reserved:16;
    }BITS;
} SSM_HW_PID_VALUE_Type;

typedef union
{
    uint32_t DATA;
    uint8_t  BYTES[4];
    struct {
        uint8_t Use_CMD1   : 8,
                Use_CMD2   : 8,
                Use_Data1  : 8,
                Use_Data2  : 8;
    }BITS;
} SSM_HW_USE_MSG_Type;

typedef struct
{
    HW_VERSION_Type		HW_VERSION_1;		// 0x0000h
    HW_VERSION_Type		HW_VERSION_2;		// 0x0004h
    SW_VERSION_Type		SW_VERSION_1;		// 0x0008h
    SW_VERSION_Type		SW_VERSION_2;		// 0x000Ch
    I2C_SLV_CMD_Type		I2C_SLV_CMD;		// 0x0010h
    I2C_SLV_RSP_Type		I2C_SLV_RSP;		// 0x0014h
    EXT_SRAM_Reserved_Type	Reserved_18h;		// 0x0018h
    EXT_SRAM_Reserved_Type	Reserved_1Ch;		// 0x001Ch
    FUNC_STATE_Type		FUNC_STATE;		// 0x0020h
    FLASH_STATE_Type		FLASH_STATE;		// 0x0024h
    EXT_SRAM_Reserved_Type	Reserved_28h;		// 0x0028h
    EXT_SRAM_Reserved_Type	Reserved_2Ch;		// 0x002Ch
    SYNC_STATUS_Type		SYNC_STATUS;		// 0x0030h
    CTRL_MSG_STATUS_Type	CTRL_MSG_STATUS;	// 0x0034h
    DATA_MSG_STATUS_Type	DATA_MSG_STATUS;	// 0x0038h
    EXTENDED_MSG_STATUS_Type	EXTENDED_MSG_STATUS;	// 0x003Ch
    MSG_IRQ_STATUS_Type		MSG_IRQ_STATUS;		// 0x0040h
    VDM_MSG_IRQ_STATUS_Type	VDM_MSG_IRQ_STATUS;	// 0x0044h
    SSM_MSG_IRQ_STATUS_Type	SSM_MSG_IRQ_STATUS;	// 0x0048h
    AP_REQ_GET_STATUS_Type      AP_REQ_GET_STATUS;      // 0x004Ch
    SSM_HW_ID_VALUE_Type	SSM_HW_ID_VALUE;	// 0x0050h
    SSM_HW_PID_VALUE_Type	SSM_HW_PID_VALUE;	// 0x0054h
    SSM_HW_USE_MSG_Type		SSM_HW_USE_MSG;		// 0x0058h
} EXT_SRAM_Type;

typedef struct
{
    uint32_t	SW_Version;
    uint32_t	SW_Start_Addr;
    uint32_t	SW_End_Addr;
    uint32_t	SW_CRC_VALUE;
} SW_IMAGE_HEADER_Type;


////////////////////////////////////////////////////////////////////////////////////////////
/*********************************** SAMSUNG Mobile Add ************************************/
////////////////////////////////////////////////////////////////////////////////////////////

typedef enum
{
	// PDO Message
	MSG_Idx_TX_SRC_CAPA             = 1,
	MSG_Idx_TX_SINK_CAPA            = 2,
	MSG_Idx_TX_REQUEST              = 3,

	MSG_Idx_RX_SRC_CAPA             = 4,
	MSG_Idx_RX_SINK_CAPA            = 5,
	MSG_Idx_RX_REQUEST              = 6,

	// VDM User Message
	MSG_Idx_VDM_MSG_REQUEST         = 9,
	MSG_Idx_CTRL_MSG                = 10,

	// VDM TX Message
	MSG_Idx_TX_DISC_ID_RESP         = 17,
	MSG_Idx_TX_DISC_SVIDs_RESP      = 18,
	MSG_Idx_TX_DISC_MODE_RESP       = 19,
	MSG_Idx_TX_DISC_ENTER_MODE_RESP = 20,
	MSG_Idx_TX_DISC_EXIT_MODE_RESP  = 21,
	MSG_Idx_TX_DISC_ATTENTION_RESP  = 22,

	// VDM RX Message
	MSG_Idx_RX_DISC_ID_CABLE        = 25,
	MSG_Idx_RX_DISC_ID_RESP         = 26,
	MSG_Idx_RX_DISC_SVIDs_RESP      = 27,
	MSG_Idx_RX_DISC_MODE_RESP       = 28,
	MSG_Idx_RX_DISC_ENTER_MODE_RESP = 29,
	MSG_Idx_RX_DISC_EXIT_MODE_RESP  = 30,
	MSG_Idx_RX_DISC_ATTENTION_RESP  = 31

} Num_MSG_INDEX;

typedef struct
{
	uint16_t	Message_Type:4;
	uint16_t	Rsvd2_msg_header:1;
	uint16_t	Port_Data_Role:1;
	uint16_t	Specification_Revision:2;
	uint16_t	Port_Power_Role:1;
	uint16_t	Message_ID:3;
	uint16_t	Number_of_obj:3;
	uint16_t	Rsvd_msg_header:1;
} MSG_HEADER_Type;

typedef struct
{
	uint32_t    Maximum_Allow_Power:10;
	uint32_t    Minimum_Voltage:10;
	uint32_t    Maximum_Voltage:10;
	uint32_t    PDO_Parameter:2;
} SRC_BAT_SUPPLY_Typedef;

// ================== Capabilities Message ==============
// Source Capabilities

typedef struct
{
	uint32_t    Maximum_Current:10;
	uint32_t    Voltage_Unit:10;
	uint32_t    Peak_Current:2;
	uint32_t    Reserved:3;
	uint32_t    Data_Role_Swap:1;
	uint32_t    USB_Comm_Capable:1;
	uint32_t    Externally_POW:1;
	uint32_t    USB_Suspend_Support:1;
	uint32_t    Dual_Role_Power:1;
	uint32_t    PDO_Parameter:2;
}SRC_FIXED_SUPPLY_Typedef;

typedef struct
{
	uint32_t    Maximum_Current:10;
	uint32_t    Minimum_Voltage:10;
	uint32_t    Maximum_Voltage:10;
	uint32_t    PDO_Parameter:2;
}SRC_VAR_SUPPLY_Typedef;


typedef union
{
    uint16_t        DATA;

    struct
    {
        uint8_t     BDATA[2];
    }BYTES;

    struct
    {
        uint32_t    Maximum_Current:10,
                    Voltage_Unit:10,
                    Peak_Current:2,
                    Reserved:3,
                    Data_Role_Swap:1,
                    USB_Comm_Capable:1,
                    Externally_POW:1,
                    USB_Suspend_Support:1,
                    Dual_Role_Power:1,
                    PDO_Parameter:2;
    }BITS;
} U_SRC_FIXED_SUPPLY_Typedef;


typedef union
{
    uint16_t        DATA;

    struct
    {
        uint8_t     BDATA[2];
    }BYTES;

    struct
    {
        uint32_t    Maximum_Current:10,
                    Minimum_Voltage:10,
                    Maximum_Voltage:10,
                    PDO_Parameter:2;
    }BITS;
} U_SRC_VAR_SUPPLY_Typedef;


typedef union
{
    uint16_t        DATA;

    struct
    {
        uint8_t     BDATA[2];
    }BYTES;

    struct
    {
        uint32_t    Maximum_Allow_Power:10,
                    Minimum_Voltage:10,
                    Maximum_Voltage:10,
                    PDO_Parameter:2;
    }BITS;
} U_SRC_BAT_SUPPLY_Typedef;


    // Sink Capabilities
typedef union
{
    uint16_t        DATA;

    struct
    {
        uint8_t     BDATA[2];
    }BYTES;

    struct
    {
        uint32_t    Maximum_Current:10,
                    Voltage_Unit:10,
                    Peak_Current:2,
                    Reserved:3,
                    Data_Role_Swap:1,
                    USB_Comm_Capable:1,
                    Externally_POW:1,
                    Higher_Capability:1,
                    Dual_Role_Power:1,
                    PDO_Parameter:2;
    }BITS;
} U_SINK_FIXED_SUPPLY_Typedef;


typedef union
{
    uint16_t        DATA;

    struct
    {
        uint8_t     BDATA[2];
    }BYTES;

    struct
    {
        uint32_t    Operational_Current:10,
                    Minimum_Voltage:10,
                    Maximum_Voltage:10,
                    PDO_Parameter:2;
    }BITS;
} U_SINK_VAR_SUPPLY_Typedef;


typedef union
{
    uint16_t        DATA;

    struct
    {
        uint8_t     BDATA[2];
    }BYTES;

    struct
    {
        uint32_t    Operational_Power:10,
                    Minimum_Voltage:10,
                    Maximum_Voltage:10,
                    PDO_Parameter:2;
    }BITS;
} U_SINK_BAT_SUPPLY_Typedef;

// ================== Request Message ================

typedef struct
{
	uint32_t    Maximum_OP_Current:10;  // 10mA
	uint32_t    OP_Current:10;          // 10mA
	uint32_t    Reserved_1:4;           // Set to Zero
	uint32_t    No_USB_Suspend:1;
	uint32_t    USB_Comm_Capable:1;
	uint32_t    Capa_Mismatch:1;
	uint32_t    GiveBack_Flag:1;        // GiveBack Support set to 1
	uint32_t    Object_Position:3;      // 000 is reserved
	uint32_t    Reserved_2:1;
} REQUEST_FIXED_SUPPLY_STRUCT_Typedef;

typedef union
{
    uint32_t        DATA;

    struct
    {
        uint8_t     BDATA[4];
    }BYTES;

    struct
    {
        uint32_t    Minimum_OP_Current:10,  // 10mA
                    OP_Current:10,          // 10mA
                    Reserved_1:4,           // Set to Zero
                    No_USB_Suspend:1,
                    USB_Comm_Capable:1,
                    Capa_Mismatch:1,
                    GiveBack_Flag:1,        // GiveBack Support set to 1
                    Object_Position:3,      // 000 is reserved
                    Reserved_2:1;
    }BITS;
}U_REQUEST_FIXED_SUPPLY_STRUCT_Typedef;

// Function Status (0x20)
typedef enum {
	State_PE_Initial_detach			= 0,

	// source Port
	State_PE_SRC_Startup			= 1,
	State_PE_SRC_Discovery			= 2,
	State_PE_SRC_Send_Capabilities		= 3,
	State_PE_SRC_Negotiate_Capability	= 4,
	State_PE_SRC_Transition_Supply		= 5,
	State_PE_SRC_Ready			= 6,
	State_PE_SRC_Disabled			= 7,
	State_PE_SRC_Capability_Response	= 8,
	State_PE_SRC_Hard_Rest			= 9,
	State_PE_SRC_Hard_Rest_Received		= 10,
	State_PE_SRC_Transition_to_default	= 11,
	State_PE_SRC_Give_Source_Cap		= 12,
	State_PE_SRC_Get_Sink_Cap		= 13,
	State_PE_SRC_Wait_New_Capabilities	= 14,

	// Sink Port
	State_PE_SNK_Startup			= 15,
	State_PE_SNK_Discovery			= 16,
	State_PE_SNK_Wait_for_Capabilities	= 17,
	State_PE_SNK_Evaluate_Capability	= 18,
	State_PE_SNK_Select_Capability		= 19,
	State_PE_SNK_Transition_Sink		= 20,
	State_PE_SNK_Ready			= 21,
	State_PE_SNK_Hard_Reset			= 22,
	State_PE_SNK_Transition_to_default	= 23,
	State_PE_SNK_Give_Sink_Cap		= 24,
	State_PE_SNK_Get_Source_Cap		= 25,

	// Source Startup Structured VDM Discover Indentity
	State_PE_SRC_CABLE_VDM_Identity_Request	= 26,
	State_PE_SRC_CABLE_VDM_Identity_ACKed	= 27,
	State_PE_SRC_CABLE_VDM_Identity_NAKed	= 28,

	// Type-C referenced states
	State_ErrorRecovery			= 29,
	State_PE_PRS_SRC_SNK_Transition_to_off	= 52,
	State_PE_PRS_SNK_SRC_Source_on		= 64,
} function_status_t;

typedef enum
{
	TYPE_C_DETACH = 0,
	TYPE_C_ATTACH_DFP = 1, // Host
	TYPE_C_ATTACH_UFP = 2, // Device
	TYPE_C_ATTACH_DRP = 3, // Dual role
} CCIC_OTP_MODE;

#define DUAL_ROLE_SET_MODE_WAIT_MS 1500
typedef enum
{
	CLIENT_OFF = 0,
	CLIENT_ON = 1,
} CCIC_DEVICE_REASON;

typedef enum
{
	HOST_OFF = 0,
	HOST_ON_BY_RD = 1, // Rd detection
	HOST_ON_BY_RID000K = 2, // RID000K detection
} CCIC_HOST_REASON;

typedef enum
{
	Rp_Sbu_check = 0,
	Rp_56K = 1,	/* 80uA */
	Rp_22K = 2,	/* 180uA */
	Rp_10K = 3,	/* 330uA */
	Rp_Abnormal = 4,
} CCIC_RP_CurrentLvl;

#define S2MM005_REG_MASK(reg, mask)	((reg & mask##_MASK) >> mask##_SHIFT)

#if defined(CONFIG_CCIC_NOTIFIER)
struct ccic_state_work {
	struct work_struct ccic_work;
	int dest;
	int id;
	int attach;
	int event;
	int sub;
};
#endif

struct s2mm005_data {
	struct device *dev;
	struct i2c_client *i2c;
#if defined(CONFIG_CCIC_NOTIFIER)
	struct workqueue_struct *ccic_wq;
#endif
	int irq;
	int irq_gpio;
	int redriver_en;
	int s2mm005_om;
	int s2mm005_sda;
	int s2mm005_scl;
	int s2mm005_i2c_err;
	u32 hw_rev;
	struct mutex i2c_mutex;
	u8 attach;
	u8 vbus_detach;
	struct wake_lock wlock;

	int wq_times;
	int p_prev_rid;
	int prev_rid;
	int cur_rid;
	int water_detect_support;
	int water_det;
	int run_dry;
	int booting_run_dry;
#if defined(CONFIG_SEC_FACTORY)
	int fac_booting_dry_check;
#endif

	u8 firm_ver[4];

	int pd_state;
	uint32_t func_state;

	int is_host;
	int is_client;
	int is_dr_swap;
	int is_pr_swap;

	int plug_rprd_sel;
	uint32_t data_role;
#if defined(CONFIG_CCIC_ALTERNATE_MODE)
	uint32_t alternate_state;
	uint32_t acc_type;
	uint32_t Vendor_ID;
	uint32_t Product_ID;
	uint32_t Device_Version;
	uint32_t SVID_0;
	uint32_t SVID_1;
	struct delayed_work acc_detach_work;
	uint32_t dp_is_connect;
	uint32_t dp_hs_connect;
	uint32_t dp_selected_pin;
	u8 pin_assignment;
	uint32_t is_sent_pin_configuration;
	wait_queue_head_t host_turn_on_wait_q;
	int host_turn_on_event;
	int host_turn_on_wait_time;
	int is_samsung_accessory_enter_mode;
	int is_in_first_sec_uvdm_req;
	int is_in_sec_uvdm_out;
	struct completion uvdm_out_wait;
	struct completion uvdm_longpacket_in_wait;
#endif
	int manual_lpm_mode;
#if defined(CONFIG_DUAL_ROLE_USB_INTF)
	struct dual_role_phy_instance *dual_role;
	struct dual_role_phy_desc *desc;
	struct completion reverse_completion;
	int power_role;
	int try_state_change;
	struct delayed_work role_swap_work;
#elif defined(CONFIG_TYPEC)
	struct typec_port *port;
	struct typec_partner *partner;
	struct usb_pd_identity partner_identity;
	struct typec_capability typec_cap;
	struct completion typec_reverse_completion;
	int typec_power_role;
	int typec_data_role;
	int typec_try_state_change;
	int pwr_opmode;
	struct delayed_work typec_role_swap_work;
#endif
	bool pd_support;
	int s2mm005_fw_product_id;
	u8 fw_product_id;

#if defined(CONFIG_SEC_FACTORY)
	int fac_water_enable;
#endif
	struct delayed_work ccic_init_work;
	int ccic_check_at_booting;
	struct delayed_work usb_external_notifier_register_work;
	struct notifier_block usb_external_notifier_nb;

};
#endif /* __S2MM005_H */
