431 lines
10 KiB
C
Executable File
431 lines
10 KiB
C
Executable File
/*
|
|
* include/linux/ccic/ccic_alternate.h
|
|
* - S2MM005 USB CCIC Alternate mode header file
|
|
*
|
|
* Copyright (C) 2016 Samsung Electronics
|
|
* Author: Wookwang Lee <wookwang.lee@samsung.com>
|
|
*
|
|
* 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 __LINUX_CCIC_ALTERNATE_MODE_H__
|
|
#define __LINUX_CCIC_ALTERNATE_MODE_H__
|
|
|
|
typedef union {
|
|
uint32_t DATA;
|
|
struct {
|
|
uint8_t BDATA[4];
|
|
} BYTES;
|
|
struct {
|
|
uint32_t Number_of_obj:3,
|
|
MSG_ID:3,
|
|
Port_Power_Role:1,
|
|
Specification_Rev:2,
|
|
Port_Data_Role:1,
|
|
Reserved:1,
|
|
MSG_Type:4;
|
|
} BITS;
|
|
} U_DATA_MSG_HEADER_Type;
|
|
|
|
typedef union {
|
|
uint32_t DATA;
|
|
struct {
|
|
uint8_t BDATA[4];
|
|
} BYTES;
|
|
struct {
|
|
uint32_t VDM_command:5,
|
|
Rsvd2_VDM_header:1,
|
|
VDM_command_type:2,
|
|
Object_Position:3,
|
|
Rsvd_VDM_header:2,
|
|
Structured_VDM_Version:2,
|
|
VDM_Type:1,
|
|
Standard_Vendor_ID:16;
|
|
} BITS;
|
|
} U_DATA_MSG_VDM_HEADER_Type;
|
|
|
|
typedef union {
|
|
uint32_t DATA;
|
|
struct {
|
|
uint8_t BDATA[4];
|
|
} BYTES;
|
|
struct {
|
|
uint32_t USB_Vendor_ID:16,
|
|
Rsvd_ID_header:10,
|
|
Modal_Operation_Supported:1,
|
|
Product_Type:3,
|
|
Data_Capable_USB_Device:1,
|
|
Data_Capable_USB_Host:1;
|
|
} BITS;
|
|
} U_DATA_MSG_ID_HEADER_Type;
|
|
|
|
typedef union {
|
|
uint32_t DATA;
|
|
struct {
|
|
uint8_t BDATA[4];
|
|
} BYTES;
|
|
struct {
|
|
uint32_t Cert_TID:20,
|
|
Rsvd_cert_VDOer:12;
|
|
} BITS;
|
|
} U_CERT_STAT_VDO_Type;
|
|
|
|
typedef union {
|
|
uint32_t DATA;
|
|
struct {
|
|
uint8_t BDATA[4];
|
|
} BYTES;
|
|
struct {
|
|
uint32_t Device_Version:16,
|
|
Product_ID:16;
|
|
} BITS;
|
|
} U_PRODUCT_VDO_Type;
|
|
|
|
typedef union {
|
|
uint32_t DATA;
|
|
struct {
|
|
uint8_t BDATA[4];
|
|
} BYTES;
|
|
struct {
|
|
uint32_t USB_Superspeed_Signaling_Support:3,
|
|
SOP_contoller_present:1,
|
|
Vbus_through_cable:1,
|
|
Vbus_Current_Handling_Capability:2,
|
|
SSRX2_Directionality_Support:1,
|
|
SSRX1_Directionality_Support:1,
|
|
SSTX2_Directionality_Support:1,
|
|
SSTX1_Directionality_Support:1,
|
|
Cable_Termination_Type:2,
|
|
Cable_Latency:4,
|
|
TypeC_to_Plug_Receptacle:1,
|
|
TypeC_to_ABC:2,
|
|
Rsvd_CABLE_VDO:4,
|
|
Cable_Firmware_Version:4,
|
|
Cable_HW_Version:4;
|
|
} BITS;
|
|
} U_CABLE_VDO_Type;
|
|
|
|
typedef union {
|
|
uint32_t DATA;
|
|
struct {
|
|
uint8_t BDATA[4];
|
|
} BYTES;
|
|
struct {
|
|
uint32_t SVID_1:16,
|
|
SVID_0:16;
|
|
} BITS;
|
|
} U_VDO1_Type;
|
|
|
|
typedef union {
|
|
uint32_t DATA;
|
|
struct {
|
|
uint8_t BDATA[4];
|
|
} BYTES;
|
|
struct {
|
|
uint32_t VENDOR_DEFINED_MESSAGE:15,
|
|
VDM_TYPE:1,
|
|
USB_Vendor_ID:16;
|
|
} BITS;
|
|
} U_UNSTRUCTURED_VDM_HEADER_Type;
|
|
|
|
typedef union {
|
|
uint32_t DATA;
|
|
struct {
|
|
uint8_t BDATA[4];
|
|
} BYTES;
|
|
struct {
|
|
uint32_t DATA:8,
|
|
TOTAL_NUMBER_OF_UVDM_SET:4,
|
|
RESERVED:1,
|
|
COMMAND_TYPE:2,
|
|
DATA_TYPE:1,
|
|
PID:16;
|
|
} BITS;
|
|
} U_SEC_UNSTRUCTURED_VDM_HEADER_Type;
|
|
|
|
typedef union {
|
|
uint32_t DATA;
|
|
struct {
|
|
uint8_t BDATA[4];
|
|
} BYTES;
|
|
struct {
|
|
uint32_t VENDOR_DEFINED_MESSAGE:15,
|
|
VDM_TYPE:1,
|
|
USB_Vendor_ID:16;
|
|
} BITS;
|
|
} U_SEC_DATA_HEADER_Type;
|
|
|
|
typedef union {
|
|
uint32_t DATA;
|
|
struct {
|
|
uint8_t BDATA[4];
|
|
} BYTES;
|
|
struct {
|
|
uint32_t VENDOR_DEFINED_MESSAGE:15,
|
|
VDM_TYPE:1,
|
|
USB_Vendor_ID:16;
|
|
} BITS;
|
|
} U_SEC_DATA_TAILER_Type;
|
|
|
|
typedef union {
|
|
uint32_t DATA;
|
|
struct {
|
|
uint8_t BDATA[4];
|
|
} BYTES;
|
|
struct {
|
|
uint32_t ORDER_OF_CURRENT_UVDM_SET:4,
|
|
RESERVED:9,
|
|
COMMAND_TYPE:2,
|
|
DATA_TYPE:1,
|
|
PID:16;
|
|
} BITS;
|
|
} U_SEC_UNSTRUCTURED_VDM_RESPONSE_HEADER_Type;
|
|
|
|
typedef union {
|
|
uint32_t DATA;
|
|
struct {
|
|
uint8_t BDATA[4];
|
|
} BYTES;
|
|
struct {
|
|
uint32_t VENDOR_DEFINED_MESSAGE:15,
|
|
VDM_TYPE:1,
|
|
USB_Vendor_ID:16;
|
|
} BITS;
|
|
} U_SEC_DATA_RESPONSE_HEADER_Type;
|
|
|
|
typedef struct {
|
|
uint32_t VDO[6];
|
|
} VDO_MESSAGE_Type;
|
|
|
|
/* For DP */
|
|
#define TypeC_POWER_SINK_INPUT 0
|
|
#define TypeC_POWER_SOURCE_OUTPUT 1
|
|
#define TypeC_DP_SUPPORT (0xFF01)
|
|
|
|
/* For Dex */
|
|
#define TypeC_Dex_SUPPORT (0x04E8)
|
|
|
|
/* For DP VDM Modes VDO Port_Capability */
|
|
typedef enum
|
|
{
|
|
num_Reserved_Capable = 0,
|
|
num_UFP_D_Capable = 1,
|
|
num_DFP_D_Capable = 2,
|
|
num_DFP_D_and_UFP_D_Capable = 3
|
|
}Num_DP_Port_Capability_Type;
|
|
|
|
#endif
|
|
/* For DP VDM Modes VDO Receptacle_Indication */
|
|
typedef enum
|
|
{
|
|
num_USB_TYPE_C_PLUG = 0,
|
|
num_USB_TYPE_C_Receptacle = 1
|
|
}Num_DP_Receptacle_Indication_Type;
|
|
|
|
|
|
/* For DP_Status_Update Port_Connected */
|
|
typedef enum
|
|
{
|
|
num_Adaptor_Disable = 0,
|
|
num_Connect_DFP_D = 1,
|
|
num_Connect_UFP_D = 2,
|
|
num_Connect_DFP_D_and_UFP_D = 3
|
|
}Num_DP_Port_Connected_Type;
|
|
|
|
/* For DP_Configure Select_Configuration */
|
|
typedef enum
|
|
{
|
|
num_Cfg_for_USB = 0,
|
|
num_Cfg_UFP_U_as_DFP_D = 1,
|
|
num_Cfg_UFP_U_as_UFP_D = 2,
|
|
num_Cfg_Reserved = 3
|
|
}Num_DP_Sel_Configuration_Type;
|
|
|
|
typedef union {
|
|
uint32_t DATA;
|
|
struct {
|
|
uint8_t BDATA[4];
|
|
} BYTES;
|
|
struct {
|
|
uint32_t Port_Capability:2,
|
|
Signalling_DP:4,
|
|
Receptacle_Indication:1,
|
|
USB_2p0_Not_Used:1,
|
|
DFP_D_Pin_Assignments:8,
|
|
UFP_D_Pin_Assignments:8,
|
|
DP_MODE_VDO_Reserved:8;
|
|
} BITS;
|
|
} U_VDO_MODE_DP_CAPABILITY_Type;
|
|
|
|
typedef union {
|
|
uint32_t DATA;
|
|
struct {
|
|
uint8_t BDATA[4];
|
|
} BYTES;
|
|
struct {
|
|
uint32_t Port_Connected:2,
|
|
Power_Low:1,
|
|
Enabled:1,
|
|
Multi_Function_Preference:1,
|
|
USB_Configuration_Req:1,
|
|
Exit_DP_Mode_Req:1,
|
|
HPD_State:1,
|
|
HPD_Interrupt:1,
|
|
Reserved:23;
|
|
} BITS;
|
|
} U_VDO_DP_STATUS_UPDATES_Type;
|
|
|
|
typedef union {
|
|
uint32_t DATA;
|
|
struct {
|
|
uint8_t BDATA[4];
|
|
} BYTES;
|
|
struct {
|
|
uint32_t SEL_Configuration:2,
|
|
Select_DP_V1p3:1,
|
|
Select_USB_Gen2:1,
|
|
Select_Reserved_1:2,
|
|
Select_Reserved_2:2,
|
|
DFP_D_PIN_Assign_A:1,
|
|
DFP_D_PIN_Assign_B:1,
|
|
DFP_D_PIN_Assign_C:1,
|
|
DFP_D_PIN_Assign_D:1,
|
|
DFP_D_PIN_Assign_E:1,
|
|
DFP_D_PIN_Assign_F:1,
|
|
DFP_D_PIN_Reserved:2,
|
|
UFP_D_PIN_Assign_A:1,
|
|
UFP_D_PIN_Assign_B:1,
|
|
UFP_D_PIN_Assign_C:1,
|
|
UFP_D_PIN_Assign_D:1,
|
|
UFP_D_PIN_Assign_E:1,
|
|
UFP_D_PIN_Assign_F:1,
|
|
UFP_D_PIN_Reserved:2,
|
|
DP_MODE_Reserved:8;
|
|
} BITS;
|
|
} U_DP_CONFIG_UPDATE_Type;
|
|
|
|
typedef struct {
|
|
U_DATA_MSG_HEADER_Type MSG_HEADER;
|
|
U_DATA_MSG_VDM_HEADER_Type DATA_MSG_VDM_HEADER;
|
|
U_VDO_MODE_DP_CAPABILITY_Type DATA_MSG_MODE_VDO_DP;
|
|
} DIS_MODE_DP_CAPA_Type;
|
|
|
|
typedef struct {
|
|
U_DATA_MSG_HEADER_Type MSG_HEADER;
|
|
U_DATA_MSG_VDM_HEADER_Type DATA_MSG_VDM_HEADER;
|
|
U_VDO_DP_STATUS_UPDATES_Type DATA_DP_STATUS_UPDATE;
|
|
} DP_STATUS_UPDATE_Type;
|
|
|
|
typedef struct {
|
|
U_DATA_MSG_HEADER_Type MSG_HEADER;
|
|
U_DATA_MSG_VDM_HEADER_Type DATA_MSG_VDM_HEADER;
|
|
U_VDO_DP_STATUS_UPDATES_Type DATA_MSG_DP_STATUS;
|
|
} DIS_ATTENTION_MESSAGE_DP_STATUS_Type;
|
|
|
|
|
|
enum VDM_MSG_IRQ_State {
|
|
VDM_DISCOVER_ID = (1 << 0),
|
|
VDM_DISCOVER_SVIDS = (1 << 1),
|
|
VDM_DISCOVER_MODES = (1 << 2),
|
|
VDM_ENTER_MODE = (1 << 3),
|
|
VDM_EXIT_MODE = (1 << 4),
|
|
VDM_ATTENTION = (1 << 5),
|
|
VDM_DP_STATUS_UPDATE = (1 << 6),
|
|
VDM_DP_CONFIGURE = (1 << 7),
|
|
};
|
|
|
|
#define ALTERNATE_MODE_NOT_READY (1 << 0)
|
|
#define ALTERNATE_MODE_READY (1 << 1)
|
|
#define ALTERNATE_MODE_STOP (1 << 2)
|
|
#define ALTERNATE_MODE_START (1 << 3)
|
|
#define ALTERNATE_MODE_RESET (1 << 4)
|
|
|
|
/* VMD Message Register I2C address by S.LSI */
|
|
#define REG_VDM_MSG_REQ 0x02C0
|
|
#define REG_SSM_MSG_READ 0x0340
|
|
#define REG_SSM_MSG_SEND 0x0360
|
|
|
|
#define REG_TX_DIS_ID_RESPONSE 0x0400
|
|
#define REG_TX_DIS_SVID_RESPONSE 0x0420
|
|
#define REG_TX_DIS_MODE_RESPONSE 0x0440
|
|
#define REG_TX_ENTER_MODE_RESPONSE 0x0460
|
|
#define REG_TX_EXIT_MODE_RESPONSE 0x0480
|
|
#define REG_TX_DIS_ATTENTION_RESPONSE 0x04A0
|
|
|
|
#define REG_RX_DIS_ID_CABLE 0x0500
|
|
#define REG_RX_DIS_ID 0x0520
|
|
#define REG_RX_DIS_SVID 0x0540
|
|
#define REG_RX_MODE 0x0560
|
|
#define REG_RX_ENTER_MODE 0x0580
|
|
#define REG_RX_EXIT_MODE 0x05A0
|
|
#define REG_RX_DIS_ATTENTION 0x05C0
|
|
#define REG_RX_DIS_DP_STATUS_UPDATE 0x0600
|
|
#define REG_RX_DIS_DP_CONFIGURE 0x0620
|
|
|
|
#define GEAR_VR_DETACH_WAIT_MS 1000
|
|
#define MODE_INT_CLEAR 0x01
|
|
#define PD_NEXT_STATE 0x02
|
|
#define MODE_INTERFACE 0x03
|
|
#define SVID_SELECT 0x07
|
|
#define REQ_PR_SWAP 0x10
|
|
#define REQ_DR_SWAP 0x11
|
|
#define SEL_SSM_MSG_REQ 0x20
|
|
#define DP_ALT_MODE_REQ 0x30
|
|
/* Samsung Acc VID */
|
|
#define SAMSUNG_VENDOR_ID 0x04E8
|
|
#define SAMSUNG_MPA_VENDOR_ID 0x04B4
|
|
/* Samsung Acc PID */
|
|
#define GEARVR_PRODUCT_ID 0xA500
|
|
#define GEARVR_PRODUCT_ID_1 0xA501
|
|
#define GEARVR_PRODUCT_ID_2 0xA502
|
|
#define GEARVR_PRODUCT_ID_3 0xA503
|
|
#define GEARVR_PRODUCT_ID_4 0xA504
|
|
#define GEARVR_PRODUCT_ID_5 0xA505
|
|
#define DEXDOCK_PRODUCT_ID 0xA020
|
|
#define HDMI_PRODUCT_ID 0xA025
|
|
#define MPA_PRODUCT_ID 0x2122
|
|
/* Samsung UVDM structure */
|
|
#define SEC_UVDM_SHORT_DATA 0x0
|
|
#define SEC_UVDM_LONG_DATA 0x1
|
|
#define SEC_UVDM_ININIATOR 0x0
|
|
#define SEC_UVDM_RESPONDER_ACK 0x1
|
|
#define SEC_UVDM_RESPONDER_NAK 0x2
|
|
#define SEC_UVDM_RESPONDER_BUSY 0x3
|
|
#define SEC_UVDM_UNSTRUCTURED_VDM 0x0
|
|
|
|
/*For DP Pin Assignment */
|
|
#define DP_PIN_ASSIGNMENT_NODE 0x00000000
|
|
#define DP_PIN_ASSIGNMENT_A 0x00000001 /* ( 1 << 0 ) */
|
|
#define DP_PIN_ASSIGNMENT_B 0x00000002 /* ( 1 << 1 ) */
|
|
#define DP_PIN_ASSIGNMENT_C 0x00000004 /* ( 1 << 2 ) */
|
|
#define DP_PIN_ASSIGNMENT_D 0x00000008 /* ( 1 << 3 ) */
|
|
#define DP_PIN_ASSIGNMENT_E 0x00000010 /* ( 1 << 4 ) */
|
|
#define DP_PIN_ASSIGNMENT_F 0x00000020 /* ( 1 << 5 ) */
|
|
|
|
void send_alternate_message(void *data, int cmd);
|
|
void receive_alternate_message(void *data, VDM_MSG_IRQ_STATUS_Type
|
|
*VDM_MSG_IRQ_State);
|
|
int ccic_register_switch_device(int mode);
|
|
void acc_detach_check(struct work_struct *work);
|
|
void send_unstructured_vdm_message(void * data, int cmd);
|
|
void send_dna_audio_unstructured_vdm_message(void * data, int cmd);
|
|
void receive_unstructured_vdm_message(void * data, SSM_MSG_IRQ_STATUS_Type *SSM_MSG_IRQ_State);
|
|
void do_alternate_mode_step_by_step(void * data, int cmd);
|
|
void send_dex_fan_unstructured_vdm_message(void * data, int cmd);
|
|
int send_samsung_unstructured_vdm_message(void * data, const char *buf, size_t size);
|
|
void set_enable_alternate_mode(int mode);
|
|
void set_clear_discover_mode(void);
|
|
void set_host_turn_on_event(int mode);
|