/* * Copyright (C) 2010 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. * */ #ifndef __USBPD_SM5713_H__ #define __USBPD_SM5713_H__ #if defined(CONFIG_CCIC_NOTIFIER) #include #endif #if defined(CONFIG_DUAL_ROLE_USB_INTF) #include #endif #define USBPD_DEV_NAME "usbpd-sm5713" #define SM5713_MAX_NUM_MSG_OBJ (7) #define SM5713_REG_INT_STATUS1_VBUSPOK (1<<0) #define SM5713_REG_INT_STATUS1_VBUSUVLO (1<<1) #define SM5713_REG_INT_STATUS1_ADC_DONE (1<<2) #define SM5713_REG_INT_STATUS1_ATTACH (1<<3) #define SM5713_REG_INT_STATUS1_DETACH (1<<4) #define SM5713_REG_INT_STATUS1_WAKEUP (1<<5) #define SM5713_REG_INT_STATUS1_DET_DETECT (1<<6) #define SM5713_REG_INT_STATUS1_DET_RELEASE (1<<7) #define SM5713_REG_INT_STATUS2_RID_INT (1<<0) #define SM5713_REG_INT_STATUS2_VCONN_DISCHG (1<<2) #define SM5713_REG_INT_STATUS2_AES_DONE (1<<3) #define SM5713_REG_INT_STATUS2_SRC_ADV_CHG (1<<4) #define SM5713_REG_INT_STATUS2_VBUS_0V (1<<5) #define SM5713_REG_INT_STATUS2_DEB_ORI_DETECT (1<<6) #define SM5713_REG_INT_STATUS3_WATER (1<<0) #define SM5713_REG_INT_STATUS3_CC1_OVP (1<<1) #define SM5713_REG_INT_STATUS3_CC2_OVP (1<<2) #define SM5713_REG_INT_STATUS3_VCONN_OCP (1<<3) #define SM5713_REG_INT_STATUS3_WATER_RLS (1<<4) #define SM5713_REG_INT_STATUS3_VBUS_ERR (1<<5) #define SM5713_REG_INT_STATUS3_SNKONLY_BAT (1<<6) #define SM5713_REG_INT_STATUS3_DEAD_BAT (1<<7) #define SM5713_REG_INT_STATUS4_RX_DONE (1<<0) #define SM5713_REG_INT_STATUS4_TX_DONE (1<<1) #define SM5713_REG_INT_STATUS4_TX_SOP_ERR (1<<2) #define SM5713_REG_INT_STATUS4_TX_NSOP_ERR (1<<3) #define SM5713_REG_INT_STATUS4_PRL_RST_DONE (1<<4) #define SM5713_REG_INT_STATUS4_HRST_RCVED (1<<5) #define SM5713_REG_INT_STATUS4_HCRST_DONE (1<<6) #define SM5713_REG_INT_STATUS4_TX_DISCARD (1<<7) #define SM5713_REG_INT_STATUS5_SBU1_OVP (1<<0) #define SM5713_REG_INT_STATUS5_SBU2_OVP (1<<1) #define SM5713_REG_INT_STATUS5_CC_ABNORMAL_ST (1<<7) /* interrupt for checking message */ #define ENABLED_INT_1 (SM5713_REG_INT_STATUS1_VBUSPOK |\ SM5713_REG_INT_STATUS1_VBUSUVLO |\ SM5713_REG_INT_STATUS1_ATTACH |\ SM5713_REG_INT_STATUS1_DETACH |\ SM5713_REG_INT_STATUS1_DET_DETECT |\ SM5713_REG_INT_STATUS1_DET_RELEASE) #define ENABLED_INT_2 (SM5713_REG_INT_STATUS2_RID_INT) #define ENABLED_INT_3 (SM5713_REG_INT_STATUS3_WATER |\ SM5713_REG_INT_STATUS3_CC1_OVP |\ SM5713_REG_INT_STATUS3_CC2_OVP |\ SM5713_REG_INT_STATUS3_VCONN_OCP |\ SM5713_REG_INT_STATUS3_WATER_RLS) #define ENABLED_INT_4 (SM5713_REG_INT_STATUS4_RX_DONE |\ SM5713_REG_INT_STATUS4_TX_DONE |\ SM5713_REG_INT_STATUS4_TX_SOP_ERR |\ SM5713_REG_INT_STATUS4_TX_NSOP_ERR |\ SM5713_REG_INT_STATUS4_PRL_RST_DONE |\ SM5713_REG_INT_STATUS4_HRST_RCVED |\ SM5713_REG_INT_STATUS4_HCRST_DONE |\ SM5713_REG_INT_STATUS4_TX_DISCARD) #define ENABLED_INT_5 (SM5713_REG_INT_STATUS5_SBU1_OVP |\ SM5713_REG_INT_STATUS5_SBU2_OVP |\ SM5713_REG_INT_STATUS5_CC_ABNORMAL_ST) #define ATTACHED_DEV_TYPE3_CHARGER_MUIC 55 #define SM5713_ATTACH_SOURCE 0x01 #define SM5713_ATTACH_SINK (0x01 << SM5713_ATTACH_SOURCE) #define SM5713_ATTACH_TYPE 0x07 #define SM5713_REG_CNTL_NOTIFY_RESET_DONE SM5713_ATTACH_SOURCE #define SM5713_REG_CNTL_CABLE_RESET_MESSAGE (SM5713_REG_CNTL_NOTIFY_RESET_DONE << 1) #define SM5713_REG_CNTL_HARD_RESET_MESSAGE (SM5713_REG_CNTL_NOTIFY_RESET_DONE << 2) #define SM5713_REG_CNTL_PROTOCOL_RESET_MESSAGE (SM5713_REG_CNTL_NOTIFY_RESET_DONE << 3) #define SM5713_SBU_CORR_CHECK (1<<6) #define SM5713_ADC_PATH_SEL_CC1 0x05 #define SM5713_ADC_PATH_SEL_CC2 0x07 #define SM5713_ADC_PATH_SEL_SBU1 0x09 #define SM5713_ADC_PATH_SEL_SBU2 0x0B #define SM5713_DEAD_RD_ENABLE (1<<7) /* For SM5713_REG_TX_REQ_MESSAGE */ #define SM5713_REG_MSG_SEND_TX_SOP_REQ 0x01 #define SM5713_REG_MSG_SEND_TX_SOPP_REQ 0x11 #define SM5713_REG_MSG_SEND_TX_SOPPP_REQ 0x21 enum sm5713_power_role { PDIC_SINK, PDIC_SOURCE }; enum sm5713_pdic_rid { REG_RID_UNDF = 0x00, REG_RID_255K = 0x03, REG_RID_301K = 0x04, REG_RID_523K = 0x05, REG_RID_619K = 0x06, REG_RID_OPEN = 0x07, REG_RID_MAX = 0x08, }; /* SM5713 I2C registers */ enum sm5713_usbpd_reg { SM5713_REG_INT1 = 0x01, SM5713_REG_INT3 = 0x03, SM5713_REG_INT_MASK1 = 0x06, SM5713_REG_INT_MASK4 = 0x09, SM5713_REG_INT_MASK5 = 0x0A, SM5713_REG_STATUS1 = 0x0B, SM5713_REG_STATUS3 = 0x0D, SM5713_REG_FACTORY = 0x18, SM5713_REG_ADC_CTRL1 = 0x19, SM5713_REG_ADC_CTRL2 = 0x1A, SM5713_REG_SYS_CNTL = 0x1B, SM5713_REG_CORR_CNTL4 = 0x23, SM5713_REG_CC_STATUS = 0x28, SM5713_REG_CC_CNTL1 = 0x29, SM5713_REG_CC_CNTL2 = 0x2A, SM5713_REG_CC_CNTL3 = 0x2B, SM5713_REG_CC_CNTL4 = 0x2C, SM5713_REG_CC_CNTL5 = 0x2D, SM5713_REG_CC_CNTL6 = 0x2E, SM5713_REG_CC_CNTL7 = 0x2F, SM5713_REG_PD_CNTL1 = 0x38, SM5713_REG_PD_CNTL2 = 0x39, SM5713_REG_PD_CNTL4 = 0x3B, SM5713_REG_RX_HEADER_00 = 0x40, SM5713_REG_RX_HEADER_01 = 0x41, SM5713_REG_RX_PAYLOAD_00 = 0x42, SM5713_REG_RX_SRC = 0x5E, SM5713_REG_TX_HEADER_00 = 0x60, SM5713_REG_TX_HEADER_01 = 0x61, SM5713_REG_TX_PAYLOAD_00 = 0x62, SM5713_REG_TX_REQ = 0x7E, SM5713_REG_AES_D_SEL = 0xAF, SM5713_REG_AES_RW00 = 0xB0, SM5713_REG_AES_CTRL = 0xC0, SM5713_REG_AES_RNCTRL = 0xC1, SM5713_REG_PROBE0 = 0xD0 }; #if defined(CONFIG_DUAL_ROLE_USB_INTF) 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; typedef enum { PLUG_CTRL_RP0 = 0, PLUG_CTRL_RP80 = 1, PLUG_CTRL_RP180 = 2, PLUG_CTRL_RP330 = 3 } CCIC_RP_SCR_SEL; #define DUAL_ROLE_SET_MODE_WAIT_MS 2000 #endif typedef enum { WATER_MODE_OFF = 0, WATER_MODE_ON = 1, } CCIC_WATER_MODE; typedef enum { CLIENT_OFF = 0, CLIENT_ON = 1, } CCIC_DEVICE_REASON; typedef enum { HOST_OFF = 0, HOST_ON = 1, } CCIC_HOST_REASON; #if defined(CONFIG_CCIC_NOTIFIER) struct ccic_state_work { struct work_struct ccic_work; int dest; int id; int attach; int event; }; #endif struct sm5713_usbpd_data { struct device *dev; struct i2c_client *i2c; #if defined(CONFIG_CCIC_NOTIFIER) struct workqueue_struct *ccic_wq; #endif struct mutex _mutex; struct mutex poll_mutex; struct mutex lpm_mutex; int vconn_en; int irq_gpio; int irq; int power_role; int vbus_state; int vbus_tran_st; int data_role; int vconn_source; msg_header_type header; data_obj_type obj[SM5713_MAX_NUM_MSG_OBJ]; u64 status_reg; bool lpm_mode; bool detach_valid; bool is_cc_abnormal_state; bool is_sbu_abnormal_state; bool is_factory_mode; bool is_water_detect; bool is_otg_vboost; bool is_otg_reboost; int check_msg_pass; int rid; int is_host; int is_client; int data_role_dual; /* data_role for dual role swap */ int power_role_dual; /* power_role for dual role swap */ int is_attached; int reset_done; #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 try_state_change; struct delayed_work role_swap_work; #endif struct notifier_block type3_nb; struct workqueue_struct *pdic_queue; struct delayed_work plug_work; /* struct pdic_notifier_struct pdic_notifier; */ }; #if defined(CONFIG_CCIC_NOTIFIER) extern void sm5713_control_option_command(struct sm5713_usbpd_data *usbpd_data, int cmd); extern void sm5713_protocol_layer_reset(void *_data); extern void sm5713_cc_state_hold_on_off(void *_data, int onoff); extern bool sm5713_check_vbus_state(void *_data); void select_pdo(int num); void ccic_event_work(void *data, int dest, int id, int attach, int event); #endif void vbus_turn_on_ctrl(struct sm5713_usbpd_data *usbpd_data, bool enable); void sm5713_src_transition_to_default(void *_data); void sm5713_src_transition_to_pwr_on(void *_data); void sm5713_error_recovery(void *_data); void sm5713_snk_transition_to_default(void *_data); int sm5713_set_lpm_mode(struct sm5713_usbpd_data *pdic_data); int sm5713_set_normal_mode(struct sm5713_usbpd_data *pdic_data); #endif /* __USBPD_SM5713_H__ */