538 lines
18 KiB
C
538 lines
18 KiB
C
|
/*
|
||
|
* Copyright (C) 2016 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.
|
||
|
*
|
||
|
*/
|
||
|
#include <linux/ccic/usbpd_msg.h>
|
||
|
#if defined (CONFIG_CCIC_NOTIFIER)
|
||
|
#include <linux/ccic/pdic_notifier.h>
|
||
|
#endif
|
||
|
|
||
|
#ifndef __USBPD_S2MU004_H__
|
||
|
#define __USBPD_S2MU004_H__
|
||
|
|
||
|
#define USBPD_DEV_NAME "usbpd-s2mu004"
|
||
|
|
||
|
/* message buffer */
|
||
|
#define S2MU004_MAX_NUM_MSG_OBJ (7)
|
||
|
/* INTERRUPT STATUS NUM */
|
||
|
#define S2MU004_MAX_NUM_INT_STATUS (7)
|
||
|
|
||
|
#define S2MU004_REG_TYPEC_DIS (1 << 2)
|
||
|
|
||
|
#define TA_WATER_CHK_DURATION_MS 5000
|
||
|
|
||
|
/* define timer */
|
||
|
#define S2MU004_ROLE_SWAP_TIME_MS (1350)
|
||
|
#define S2MU004_HARD_RESET_DELAY_MS (300)
|
||
|
#define S2MU004_WAIT_RD_DETACH_DELAY_MS (200)
|
||
|
#define S2MU004_WAIT_ATTACH_DELAY_MS (30)
|
||
|
#if defined(CONFIG_DUAL_ROLE_USB_INTF)
|
||
|
#define DUAL_ROLE_SET_MODE_WAIT_MS (2000)
|
||
|
#endif
|
||
|
#define S2MU004_WATER_CHK_INTERVAL_TIME (200)
|
||
|
|
||
|
#define WATER_CHK_RETRY_CNT 5
|
||
|
|
||
|
/*****************************************/
|
||
|
/***********DEFINITION REGISTER***********/
|
||
|
/*****************************************/
|
||
|
#define S2MU004_RESET_REG_00 (0x00)
|
||
|
|
||
|
/* reg 0x01 LPM MODE ENABLE */
|
||
|
#define S2MU004_REG_LP_LDO_D_SHIFT (0)
|
||
|
#define S2MU004_REG_LPM_EN_SHIFT (1)
|
||
|
#define S2MU004_REG_LP_LDO_D \
|
||
|
(1 << S2MU004_REG_LP_LDO_D_SHIFT) /* 0x01 */
|
||
|
#define S2MU004_REG_LPM_EN \
|
||
|
(0x1 << S2MU004_REG_LPM_EN_SHIFT) /* 0x02 */
|
||
|
|
||
|
/* reg 0x02 */
|
||
|
#define S2MU004_REG_CC_OCP_SHIFT (4)
|
||
|
#define S2MU004_REG_CC_OCP_MASK (0xf << S2MU004_REG_CC_OCP_SHIFT)
|
||
|
|
||
|
/* reg 0x18 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_MODE_SHIFT (0)
|
||
|
#define S2MU004_REG_PLUG_CTRL_RP_SEL_SHIFT (4)
|
||
|
#define S2MU004_REG_PLUG_CTRL_DETECT_BAT_DISABLE_SHIFT (6)
|
||
|
#define S2MU004_REG_PLUG_CTRL_DETECT_OCP_DISABLE_SHIFT (7)
|
||
|
#define S2MU004_REG_PLUG_CTRL_DFP \
|
||
|
(0x1 << S2MU004_REG_PLUG_CTRL_MODE_SHIFT) /* 0x01 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_UFP \
|
||
|
(0x2 << S2MU004_REG_PLUG_CTRL_MODE_SHIFT) /* 0x02 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_DRP \
|
||
|
(0x3 << S2MU004_REG_PLUG_CTRL_MODE_SHIFT) /* 0x03 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_RP0 \
|
||
|
(0x0 << S2MU004_REG_PLUG_CTRL_RP_SEL_SHIFT) /* 0x00 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_RP80 \
|
||
|
(0x1 << S2MU004_REG_PLUG_CTRL_RP_SEL_SHIFT) /* 0x10 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_RP180 \
|
||
|
(0x2 << S2MU004_REG_PLUG_CTRL_RP_SEL_SHIFT) /* 0x20 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_MODE_MASK \
|
||
|
(0x3 << S2MU004_REG_PLUG_CTRL_MODE_SHIFT) /* 0x03 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_RP_SEL_MASK \
|
||
|
(0x3 << S2MU004_REG_PLUG_CTRL_RP_SEL_SHIFT)/* 0x30 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_DETECT_BAT_DISABLE_MASK \
|
||
|
(0x1 << S2MU004_REG_PLUG_CTRL_DETECT_BAT_DISABLE_SHIFT)/* 0x40 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_DETECT_OCP_DISABLE_MASK \
|
||
|
(0x1 << S2MU004_REG_PLUG_CTRL_DETECT_OCP_DISABLE_SHIFT)/* 0x80 */
|
||
|
|
||
|
/* reg 0x19 */
|
||
|
#define S2MU004_REG_MSG_DATA_ROLE_SHIFT (5)
|
||
|
#define S2MU004_REG_MSG_POWER_ROLE_SHIFT (6)
|
||
|
#define S2MU004_REG_MSG_DATA_ROLE_UFP \
|
||
|
(0x0 << S2MU004_REG_MSG_DATA_ROLE_SHIFT) /* 0x00 */
|
||
|
#define S2MU004_REG_MSG_DATA_ROLE_DFP \
|
||
|
(0x1 << S2MU004_REG_MSG_DATA_ROLE_SHIFT) /* 0x20 */
|
||
|
#define S2MU004_REG_MSG_DATA_ROLE_MASK \
|
||
|
(0x1 << S2MU004_REG_MSG_DATA_ROLE_SHIFT) /* 0x20 */
|
||
|
#define S2MU004_REG_MSG_POWER_ROLE_SINK \
|
||
|
(0x0 << S2MU004_REG_MSG_POWER_ROLE_SHIFT) /* 0x00 */
|
||
|
#define S2MU004_REG_MSG_POWER_ROLE_SOURCE \
|
||
|
(0x1 << S2MU004_REG_MSG_POWER_ROLE_SHIFT) /* 0x40 */
|
||
|
#define S2MU004_REG_MSG_POWER_ROLE_MASK \
|
||
|
(0x1 << S2MU004_REG_MSG_POWER_ROLE_SHIFT) /* 0x40 */
|
||
|
|
||
|
/* reg 0x26 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_CC_HOLD_BIT (0x1)
|
||
|
|
||
|
/* reg 0x27 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_RpRd_PLUG_SEL_SHIFT (3)
|
||
|
#define S2MU004_REG_PLUG_CTRL_VCONN_MANUAL_EN_SHIFT (4)
|
||
|
#define S2MU004_REG_PLUG_CTRL_RpRd_CC1_VCONN_SHIFT (5)
|
||
|
#define S2MU004_REG_PLUG_CTRL_RpRd_CC2_VCONN_SHIFT (6)
|
||
|
#define S2MU004_REG_PLUG_CTRL_RpRd_MANUAL_EN_SHIFT (7)
|
||
|
|
||
|
#define S2MU004_REG_PLUG_CTRL_RpRd_MANUAL_MASK \
|
||
|
(0x1 << S2MU004_REG_PLUG_CTRL_RpRd_PLUG_SEL_SHIFT | \
|
||
|
0x1 << S2MU004_REG_PLUG_CTRL_RpRd_MANUAL_EN_SHIFT) /* 0x88 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_RpRd_Rp_Source_Mode \
|
||
|
(0x1 << S2MU004_REG_PLUG_CTRL_RpRd_PLUG_SEL_SHIFT | \
|
||
|
0x1 << S2MU004_REG_PLUG_CTRL_RpRd_MANUAL_EN_SHIFT) /* 0x88 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_RpRd_Rd_Sink_Mode \
|
||
|
(0x1 << S2MU004_REG_PLUG_CTRL_RpRd_MANUAL_EN_SHIFT) /* 0x80 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_RpRd_MANUAL_EN_MASK \
|
||
|
(0x1 << S2MU004_REG_PLUG_CTRL_RpRd_MANUAL_EN_SHIFT) /* 0x80 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_VCONN_MANUAL_EN \
|
||
|
(0x1 << S2MU004_REG_PLUG_CTRL_VCONN_MANUAL_EN_SHIFT) /* 0x10 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_RpRd_CC1_VCONN \
|
||
|
(0x1 << S2MU004_REG_PLUG_CTRL_RpRd_CC1_VCONN_SHIFT) /* 0x20 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_RpRd_CC2_VCONN \
|
||
|
(0x1 << S2MU004_REG_PLUG_CTRL_RpRd_CC2_VCONN_SHIFT) /* 0x40 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_RpRd_VCONN_MASK \
|
||
|
(0x1 << S2MU004_REG_PLUG_CTRL_VCONN_MANUAL_EN_SHIFT | \
|
||
|
0x1 << S2MU004_REG_PLUG_CTRL_RpRd_CC1_VCONN_SHIFT | \
|
||
|
0x1 << S2MU004_REG_PLUG_CTRL_RpRd_CC2_VCONN_SHIFT) /* 0x70 */
|
||
|
|
||
|
/* reg 0x28 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_CC_MANUAL_EN_SHIFT (4)
|
||
|
#define S2MU004_REG_PLUG_CTRL_CC1_MANUAL_EN_SHIFT (5)
|
||
|
#define S2MU004_REG_PLUG_CTRL_CC2_MANUAL_EN_SHIFT (6)
|
||
|
|
||
|
#define S2MU004_REG_PLUG_CTRL_CC1_MANUAL_ON \
|
||
|
(0x1 << S2MU004_REG_PLUG_CTRL_CC_MANUAL_EN_SHIFT | \
|
||
|
0x1 << S2MU004_REG_PLUG_CTRL_CC1_MANUAL_EN_SHIFT) /* 0x30 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_CC2_MANUAL_ON \
|
||
|
(0x1 << S2MU004_REG_PLUG_CTRL_CC_MANUAL_EN_SHIFT | \
|
||
|
0x1 << S2MU004_REG_PLUG_CTRL_CC2_MANUAL_EN_SHIFT) /* 0x50 */
|
||
|
#define S2MU004_REG_PLUG_CTRL_CC_MANUAL_MASK \
|
||
|
(0x1 << S2MU004_REG_PLUG_CTRL_CC_MANUAL_EN_SHIFT | \
|
||
|
0x1 << S2MU004_REG_PLUG_CTRL_CC1_MANUAL_EN_SHIFT | \
|
||
|
0x1 << S2MU004_REG_PLUG_CTRL_CC2_MANUAL_EN_SHIFT) /* 0x70 */
|
||
|
|
||
|
/* reg 0x90 (For S2MU004_REG_MSG_SEND_CON) */
|
||
|
#define S2MU004_REG_MSG_SEND_CON_SEND_MSG_EN_SHIFT (0)
|
||
|
#define S2MU004_REG_MSG_SEND_CON_OP_MODE_SHIFT (1)
|
||
|
#define S2MU004_REG_MSG_SEND_CON_SOP_SHIFT (2)
|
||
|
|
||
|
#define S2MU004_REG_MSG_SEND_CON_SEND_MSG_EN \
|
||
|
(0x1 << S2MU004_REG_MSG_SEND_CON_SEND_MSG_EN_SHIFT) /* 0x01 */
|
||
|
#define S2MU004_REG_MSG_SEND_CON_OP_MODE \
|
||
|
(0x1 << S2MU004_REG_MSG_SEND_CON_OP_MODE_SHIFT) /* 0x02 */
|
||
|
#define S2MU004_REG_MSG_SEND_CON_SOP \
|
||
|
(0x0 << S2MU004_REG_MSG_SEND_CON_SOP_SHIFT) /* 0x00 */
|
||
|
#define S2MU004_REG_MSG_SEND_CON_SOP_Prime \
|
||
|
(0x1 << S2MU004_REG_MSG_SEND_CON_SOP_SHIFT) /* 0x04 */
|
||
|
#define S2MU004_REG_MSG_SEND_CON_SOP_DPrime \
|
||
|
(0x2 << S2MU004_REG_MSG_SEND_CON_SOP_SHIFT) /* 0x08 */
|
||
|
#define S2MU004_REG_MSG_SEND_CON_SOP_PDebug \
|
||
|
(0x3 << S2MU004_REG_MSG_SEND_CON_SOP_SHIFT) /* 0x0C */
|
||
|
#define S2MU004_REG_MSG_SEND_CON_SOP_DPDebug \
|
||
|
(0x4 << S2MU004_REG_MSG_SEND_CON_SOP_SHIFT) /* 0x10 */
|
||
|
#define S2MU004_REG_MSG_SEND_CON_SOP_HardRST \
|
||
|
(0x5 << S2MU004_REG_MSG_SEND_CON_SOP_SHIFT) /* 0x14 */
|
||
|
#define S2MU004_REG_MSG_SEND_CON_SOP_CableRST \
|
||
|
(0x6 << S2MU004_REG_MSG_SEND_CON_SOP_SHIFT) /* 0x18 */
|
||
|
|
||
|
/* reg 0xB2 */
|
||
|
#define S2MU004_PDIC_RID_SHIFT (5)
|
||
|
#define S2MU004_PDIC_RID_MASK (0x7 << S2MU004_PDIC_RID_SHIFT) /* 0xE0 */
|
||
|
|
||
|
/* reg 0xB3 */
|
||
|
#define S2MU004_REG_CTRL_MON_CC1_SHIFT (0)
|
||
|
#define S2MU004_REG_CTRL_MON_CC2_SHIFT (3)
|
||
|
#define S2MU004_REG_CTRL_MON_CC1_MASK \
|
||
|
(0x7 << S2MU004_REG_CTRL_MON_CC1_SHIFT) /* 0x07 */
|
||
|
#define S2MU004_REG_CTRL_MON_CC2_MASK \
|
||
|
(0x7 << S2MU004_REG_CTRL_MON_CC2_SHIFT) /* 0x38 */
|
||
|
|
||
|
/* reg 0xB4 */
|
||
|
#define S2MU004_PDIC_PLUG_ATTACH_DONE_SHIFT (1)
|
||
|
#define S2MU004_PDIC_SINK_SEL_MONITOR_SHIFT (2)
|
||
|
#define S2MU004_PDIC_SOURCE_SEL_MONITOR_SHIFT (3)
|
||
|
|
||
|
#define S2MU004_PDIC_SINK (1 << S2MU004_PDIC_SINK_SEL_MONITOR_SHIFT \
|
||
|
| 1 << S2MU004_PDIC_PLUG_ATTACH_DONE_SHIFT) /* 0x06 */
|
||
|
#define S2MU004_PDIC_SOURCE (1 << S2MU004_PDIC_SOURCE_SEL_MONITOR_SHIFT \
|
||
|
| 1 << S2MU004_PDIC_PLUG_ATTACH_DONE_SHIFT) /* 0x0A */
|
||
|
#define S2MU004_PDIC_ATTACH_MASK (1 << S2MU004_PDIC_PLUG_ATTACH_DONE_SHIFT) /* 0x02 */
|
||
|
#define S2MU004_PR_MASK (S2MU004_PDIC_SINK | S2MU004_PDIC_SOURCE) /* 0x0E */
|
||
|
|
||
|
/* reg 0xF7 */
|
||
|
#define S2MU004_REG_ETC_SOFT_RESET_EN_SHIFT (1)
|
||
|
#define S2MU004_REG_ETC_SOFT_RESET_EN \
|
||
|
(0x1 << S2MU004_REG_ETC_SOFT_RESET_EN_SHIFT) /* 0x02 */
|
||
|
#define S2MU004_REG_ETC_SOFT_RESET_DIS \
|
||
|
(0x0 << S2MU004_REG_ETC_SOFT_RESET_EN_SHIFT) /* 0x00 */
|
||
|
|
||
|
/* reg 0xF8 */
|
||
|
#define S2MU004_REG_ID_MONITOR_MSG_ID_MASK (0x07)
|
||
|
|
||
|
|
||
|
/*****************************************/
|
||
|
/***********DEFINITION INTERRUPT**********/
|
||
|
/*****************************************/
|
||
|
#define S2MU004_REG_INT_STATUS0_MSG_ACCEPT (1<<0)
|
||
|
#define S2MU004_REG_INT_STATUS0_MSG_GOODCRC (1<<1)
|
||
|
#define S2MU004_REG_INT_STATUS0_VDM_ATTENTION (1<<2)
|
||
|
#define S2MU004_REG_INT_STATUS0_VDM_EXIT (1<<3)
|
||
|
#define S2MU004_REG_INT_STATUS0_VDM_ENTER (1<<4)
|
||
|
#define S2MU004_REG_INT_STATUS0_VDM_DISCOVER_MODE (1<<5)
|
||
|
#define S2MU004_REG_INT_STATUS0_VDM_DISCOVER_SVID (1<<6)
|
||
|
#define S2MU004_REG_INT_STATUS0_VDM_DISCOVER_ID (1<<7)
|
||
|
|
||
|
/* reg 0xE1 */
|
||
|
#define S2MU004_REG_INT_STATUS1_MSG_PING (1<<7)
|
||
|
#define S2MU004_REG_INT_STATUS1_MSG_GOTOMIN (1<<6)
|
||
|
#define S2MU004_REG_INT_STATUS1_MSG_REJECT (1<<5)
|
||
|
#define S2MU004_REG_INT_STATUS1_MSG_PSRDY (1<<4)
|
||
|
#define S2MU004_REG_INT_STATUS1_MSG_GETSRCCAP (1<<3)
|
||
|
#define S2MU004_REG_INT_STATUS1_MSG_GETSNKCAP (1<<2)
|
||
|
#define S2MU004_REG_INT_STATUS1_MSG_DR_SWAP (1<<1)
|
||
|
#define S2MU004_REG_INT_STATUS1_MSG_PR_SWAP (1<<0)
|
||
|
|
||
|
/* reg 0xE2 */
|
||
|
#define S2MU004_REG_INT_STATUS2_MSG_VCONN_SWAP (1<<7)
|
||
|
#define S2MU004_REG_INT_STATUS2_MSG_WAIT (1<<6)
|
||
|
#define S2MU004_REG_INT_STATUS2_MSG_SRC_CAP (1<<5)
|
||
|
#define S2MU004_REG_INT_STATUS2_MSG_SNK_CAP (1<<4)
|
||
|
#define S2MU004_REG_INT_STATUS2_MSG_REQUEST (1<<3)
|
||
|
#define S2MU004_REG_INT_STATUS2_MSG_SOFTRESET (1<<2)
|
||
|
#define S2MU004_REG_INT_STATUS2_WAKEUP (1<<0)
|
||
|
|
||
|
/* reg 0xE3 */
|
||
|
#define S2MU004_REG_INT_STATUS3_UNS_CMD_DATA (1<<5)
|
||
|
|
||
|
/* reg 0xE4 */
|
||
|
#define S2MU004_REG_INT_STATUS4_CC12_DET_IRQ (1<<6)
|
||
|
#define S2MU004_REG_INT_STATUS4_PLUG_IRQ (1<<5)
|
||
|
#define S2MU004_REG_INT_STATUS4_USB_DETACH (1<<4)
|
||
|
#define S2MU004_REG_INT_STATUS4_MSG_PASS (1<<3)
|
||
|
#define S2MU004_REG_INT_STATUS4_MSG_SENT (1<<2)
|
||
|
#define S2MU004_REG_INT_STATUS4_MSG_ERROR (1<<1)
|
||
|
|
||
|
/* reg 0xE5 */
|
||
|
#define S2MU004_REG_INT_STATUS5_HARD_RESET (1<<2)
|
||
|
|
||
|
/* interrupt for checking message */
|
||
|
#define ENABLED_INT_0 (S2MU004_REG_INT_STATUS0_MSG_ACCEPT)
|
||
|
#define ENABLED_INT_1 (S2MU004_REG_INT_STATUS1_MSG_DR_SWAP |\
|
||
|
S2MU004_REG_INT_STATUS1_MSG_PR_SWAP |\
|
||
|
S2MU004_REG_INT_STATUS1_MSG_GETSRCCAP |\
|
||
|
S2MU004_REG_INT_STATUS1_MSG_GETSNKCAP |\
|
||
|
S2MU004_REG_INT_STATUS1_MSG_REJECT |\
|
||
|
S2MU004_REG_INT_STATUS1_MSG_PSRDY)
|
||
|
#define ENABLED_INT_2 (S2MU004_REG_INT_STATUS2_MSG_SRC_CAP |\
|
||
|
S2MU004_REG_INT_STATUS2_MSG_SNK_CAP |\
|
||
|
S2MU004_REG_INT_STATUS2_MSG_REQUEST |\
|
||
|
S2MU004_REG_INT_STATUS2_MSG_SOFTRESET |\
|
||
|
S2MU004_REG_INT_STATUS2_MSG_VCONN_SWAP)
|
||
|
#define ENABLED_INT_3 0
|
||
|
#define ENABLED_INT_4 (S2MU004_REG_INT_STATUS4_USB_DETACH |\
|
||
|
S2MU004_REG_INT_STATUS4_PLUG_IRQ |\
|
||
|
S2MU004_REG_INT_STATUS4_MSG_PASS)
|
||
|
|
||
|
/* S2MU004 I2C registers */
|
||
|
enum s2mu004_usbpd_reg {
|
||
|
S2MU004_REG_PD_CTRL = 0x01,
|
||
|
S2MU004_REG_PD_CTRL_2 = 0x02,
|
||
|
S2MU004_REG_PLUG_CTRL_PORT = 0x18,
|
||
|
S2MU004_REG_PLUG_CTRL_MSG = 0x19,
|
||
|
S2MU004_REG_PLUG_CTRL_SET_RD = 0x1E,
|
||
|
S2MU004_REG_PLUG_CTRL_SET_RP = 0x1F,
|
||
|
S2MU004_REG_PLUG_CTRL_CC_HOLD = 0x26,
|
||
|
S2MU004_REG_PLUG_CTRL_RpRd = 0x27,
|
||
|
S2MU004_REG_PLUG_CTRL_CC12 = 0x28,
|
||
|
S2MU004_REG_PLUG_CTRL = 0x2E,
|
||
|
S2MU004_REG_CTRL = 0x2F,
|
||
|
|
||
|
S2MU004_REG_INT_MASK0 = 0x3E,
|
||
|
S2MU004_REG_INT_MASK1 = 0x3F,
|
||
|
S2MU004_REG_INT_MASK2 = 0x40,
|
||
|
S2MU004_REG_INT_MASK3 = 0x41,
|
||
|
S2MU004_REG_INT_MASK4 = 0x42,
|
||
|
S2MU004_REG_INT_STATUS0 = 0xE0,
|
||
|
S2MU004_REG_INT_STATUS1 = 0xE1,
|
||
|
S2MU004_REG_INT_STATUS2 = 0xE2,
|
||
|
S2MU004_REG_INT_STATUS3 = 0xE3,
|
||
|
S2MU004_REG_INT_STATUS4 = 0xE4,
|
||
|
S2MU004_REG_ADC_STATUS = 0xB2,
|
||
|
S2MU004_REG_PLUG_MON1 = 0xB3,
|
||
|
S2MU004_REG_PLUG_MON2 = 0xB4,
|
||
|
|
||
|
S2MU004_REG_MSG_SEND_CON = 0x90,
|
||
|
S2MU004_REG_MSG_HEADER_L = 0x91,
|
||
|
S2MU004_REG_MSG_HEADER_H = 0x92,
|
||
|
S2MU004_REG_MSG_OBJECT0_0_L = 0x93,
|
||
|
S2MU004_REG_MSG_OBJECT0_0_H = 0x94,
|
||
|
S2MU004_REG_MSG_OBJECT0_1_L = 0x95,
|
||
|
S2MU004_REG_MSG_OBJECT0_1_H = 0x96,
|
||
|
S2MU004_REG_MSG_OBJECT1_0_L = 0x97,
|
||
|
S2MU004_REG_MSG_OBJECT1_0_H = 0x98,
|
||
|
S2MU004_REG_MSG_OBJECT1_1_L = 0x99,
|
||
|
S2MU004_REG_MSG_OBJECT1_1_H = 0x9A,
|
||
|
S2MU004_REG_MSG_OBJECT2_0_L = 0x9B,
|
||
|
S2MU004_REG_MSG_OBJECT2_0_H = 0x9C,
|
||
|
S2MU004_REG_MSG_OBJECT2_1_L = 0x9D,
|
||
|
S2MU004_REG_MSG_OBJECT2_1_H = 0x9E,
|
||
|
S2MU004_REG_MSG_OBJECT3_0_L = 0x9F,
|
||
|
S2MU004_REG_MSG_OBJECT3_0_H = 0xA0,
|
||
|
S2MU004_REG_MSG_OBJECT3_1_L = 0xA1,
|
||
|
S2MU004_REG_MSG_OBJECT3_1_H = 0xA2,
|
||
|
S2MU004_REG_MSG_OBJECT4_0_L = 0xA3,
|
||
|
S2MU004_REG_MSG_OBJECT4_0_H = 0xA4,
|
||
|
S2MU004_REG_MSG_OBJECT4_1_L = 0xA5,
|
||
|
S2MU004_REG_MSG_OBJECT4_1_H = 0xA6,
|
||
|
S2MU004_REG_MSG_OBJECT5_0_L = 0xA7,
|
||
|
S2MU004_REG_MSG_OBJECT5_0_H = 0xA8,
|
||
|
S2MU004_REG_MSG_OBJECT5_1_L = 0xA9,
|
||
|
S2MU004_REG_MSG_OBJECT5_1_H = 0xAA,
|
||
|
S2MU004_REG_MSG_OBJECT6_0_L = 0xAB,
|
||
|
S2MU004_REG_MSG_OBJECT6_0_H = 0xAC,
|
||
|
S2MU004_REG_MSG_OBJECT6_1_L = 0xAD,
|
||
|
S2MU004_REG_MSG_OBJECT6_1_H = 0xAE,
|
||
|
|
||
|
S2MU004_REG_ETC = 0xF7,
|
||
|
S2MU004_REG_ID_MONITOR = 0xF8
|
||
|
};
|
||
|
|
||
|
typedef enum {
|
||
|
S2MU004_THRESHOLD_128MV = 2,
|
||
|
S2MU004_THRESHOLD_171MV = 3,
|
||
|
S2MU004_THRESHOLD_214MV = 4,
|
||
|
S2MU004_THRESHOLD_257MV = 5,
|
||
|
S2MU004_THRESHOLD_300MV = 6,
|
||
|
S2MU004_THRESHOLD_342MV = 7,
|
||
|
S2MU004_THRESHOLD_385MV = 8,
|
||
|
S2MU004_THRESHOLD_428MV = 9,
|
||
|
S2MU004_THRESHOLD_450MV = 10,
|
||
|
S2MU004_THRESHOLD_471MV = 11,
|
||
|
S2MU004_THRESHOLD_492MV = 12,
|
||
|
S2MU004_THRESHOLD_514MV = 13,
|
||
|
S2MU004_THRESHOLD_535MV = 14,
|
||
|
S2MU004_THRESHOLD_557MV = 15,
|
||
|
S2MU004_THRESHOLD_578MV = 16,
|
||
|
S2MU004_THRESHOLD_600MV = 17,
|
||
|
S2MU004_THRESHOLD_621MV = 18,
|
||
|
S2MU004_THRESHOLD_642MV = 19,
|
||
|
S2MU004_THRESHOLD_685MV = 20,
|
||
|
|
||
|
S2MU004_THRESHOLD_1328MV = 35,
|
||
|
S2MU004_THRESHOLD_1371MV = 36,
|
||
|
S2MU004_THRESHOLD_1414MV = 37,
|
||
|
S2MU004_THRESHOLD_1457MV = 38,
|
||
|
S2MU004_THRESHOLD_1500MV = 39,
|
||
|
S2MU004_THRESHOLD_1542MV = 40,
|
||
|
S2MU004_THRESHOLD_1587MV = 41,
|
||
|
S2MU004_THRESHOLD_1628MV = 42,
|
||
|
S2MU004_THRESHOLD_1671MV = 43,
|
||
|
S2MU004_THRESHOLD_1714MV = 44,
|
||
|
S2MU004_THRESHOLD_1757MV = 45,
|
||
|
S2MU004_THRESHOLD_1799MV = 46,
|
||
|
S2MU004_THRESHOLD_1842MV = 47,
|
||
|
S2MU004_THRESHOLD_1885MV = 48,
|
||
|
S2MU004_THRESHOLD_1928MV = 49,
|
||
|
S2MU004_THRESHOLD_1971MV = 50,
|
||
|
S2MU004_THRESHOLD_2014MV = 51,
|
||
|
S2MU004_THRESHOLD_2057MV = 52,
|
||
|
S2MU004_THRESHOLD_2099MV = 53,
|
||
|
S2MU004_THRESHOLD_2142MV = 54,
|
||
|
S2MU004_THRESHOLD_2185MV = 55,
|
||
|
S2MU004_THRESHOLD_2228MV = 56,
|
||
|
S2MU004_THRESHOLD_2271MV = 57,
|
||
|
|
||
|
S2MU004_THRESHOLD_MAX = 63
|
||
|
} CCIC_THRESHOLD_SEL;
|
||
|
|
||
|
typedef enum {
|
||
|
S2MU004_CC_OCP_255MV = 0,
|
||
|
S2MU004_CC_OCP_262MV = 1,
|
||
|
S2MU004_CC_OCP_273MV = 2,
|
||
|
S2MU004_CC_OCP_282MV = 3,
|
||
|
S2MU004_CC_OCP_301MV = 4,
|
||
|
S2MU004_CC_OCP_311MV = 5,
|
||
|
S2MU004_CC_OCP_327MV = 6,
|
||
|
S2MU004_CC_OCP_339MV = 7,
|
||
|
S2MU004_CC_OCP_375MV = 8,
|
||
|
S2MU004_CC_OCP_390MV = 9,
|
||
|
S2MU004_CC_OCP_415MV = 10,
|
||
|
S2MU004_CC_OCP_433MV = 11,
|
||
|
S2MU004_CC_OCP_478MV = 12,
|
||
|
S2MU004_CC_OCP_502MV = 13,
|
||
|
S2MU004_CC_OCP_542MV = 14,
|
||
|
S2MU004_CC_OCP_575MV = 15,
|
||
|
|
||
|
S2MU004_CC_OCP_MAX = 16
|
||
|
} CCIC_CC_OCP_SEL;
|
||
|
|
||
|
enum s2mu004_power_role {
|
||
|
PDIC_SINK,
|
||
|
PDIC_SOURCE
|
||
|
};
|
||
|
|
||
|
enum s2mu004_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,
|
||
|
};
|
||
|
|
||
|
typedef enum {
|
||
|
CLIENT_OFF = 0,
|
||
|
CLIENT_ON = 1,
|
||
|
} CCIC_DEVICE_REASON;
|
||
|
|
||
|
typedef enum {
|
||
|
HOST_OFF = 0,
|
||
|
HOST_ON = 1,
|
||
|
} CCIC_HOST_REASON;
|
||
|
|
||
|
typedef enum {
|
||
|
VBUS_OFF = 0,
|
||
|
VBUS_ON = 1,
|
||
|
} CCIC_VBUS_SEL;
|
||
|
|
||
|
typedef enum {
|
||
|
DET_HARD_RESET = 0,
|
||
|
DET_DETACH = 1,
|
||
|
} CCIC_DETACH_TYPE;
|
||
|
|
||
|
typedef enum {
|
||
|
PLUG_CTRL_RP0 = 0,
|
||
|
PLUG_CTRL_RP80 = 1,
|
||
|
PLUG_CTRL_RP180 = 2,
|
||
|
PLUG_CTRL_RP330 = 3
|
||
|
} CCIC_RP_SCR_SEL;
|
||
|
|
||
|
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_RD = 0,
|
||
|
PLUG_CTRL_RP = 1,
|
||
|
} CCIC_RP_RD_SEL;
|
||
|
|
||
|
#if defined(CONFIG_CCIC_NOTIFIER)
|
||
|
struct ccic_state_work {
|
||
|
struct work_struct ccic_work;
|
||
|
int dest;
|
||
|
int id;
|
||
|
int attach;
|
||
|
int event;
|
||
|
};
|
||
|
#endif
|
||
|
|
||
|
struct s2mu004_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 regulator_en;
|
||
|
int irq_gpio;
|
||
|
int irq;
|
||
|
int power_role;
|
||
|
int data_role;
|
||
|
int vconn_source;
|
||
|
msg_header_type header;
|
||
|
data_obj_type obj[S2MU004_MAX_NUM_MSG_OBJ];
|
||
|
u64 status_reg;
|
||
|
bool lpm_mode;
|
||
|
bool detach_valid;
|
||
|
bool is_factory_mode;
|
||
|
bool is_water_detect;
|
||
|
bool is_muic_water_detect;
|
||
|
bool is_otg_vboost;
|
||
|
bool is_otg_reboost;
|
||
|
bool is_muic_attached;
|
||
|
int water_detect_cnt;
|
||
|
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;
|
||
|
#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;
|
||
|
#if defined (CONFIG_CCIC_NOTIFIER)
|
||
|
struct s2mu004_pdic_notifier_struct pdic_notifier;
|
||
|
#endif
|
||
|
struct delayed_work water_detect_handler;
|
||
|
struct delayed_work ta_water_detect_handler;
|
||
|
struct delayed_work water_dry_handler;
|
||
|
|
||
|
struct regulator *regulator;
|
||
|
};
|
||
|
|
||
|
extern int s2mu004_usbpd_get_adc(void);
|
||
|
extern void s2mu004_usbpd_set_muic_type(int type);
|
||
|
#if defined(CONFIG_CCIC_NOTIFIER)
|
||
|
extern void s2mu004_control_option_command(struct s2mu004_usbpd_data *usbpd_data, int cmd);
|
||
|
#endif
|
||
|
#if defined(CONFIG_DUAL_ROLE_USB_INTF)
|
||
|
extern void s2mu004_rprd_mode_change(struct s2mu004_usbpd_data *usbpd_data, u8 mode);
|
||
|
#endif
|
||
|
extern void vbus_turn_on_ctrl(struct s2mu004_usbpd_data *usbpd_data, bool enable);
|
||
|
extern int s2mu004_set_lpm_mode(struct s2mu004_usbpd_data *pdic_data);
|
||
|
extern int s2mu004_set_normal_mode(struct s2mu004_usbpd_data *pdic_data);
|
||
|
#endif /* __USBPD_S2MU004_H__ */
|