| /* |
| * 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); |