| /* |
| * Copyright (C) 2013 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 _SM5508_MUIC_H_ |
| #define _SM5508_MUIC_H_ |
| |
| #include <linux/muic/muic.h> |
| |
| /* SM5508 I2C registers */ |
| enum sm5508_muic_reg { |
| SM5508_MUIC_REG_DEVID = 0x01, |
| SM5508_MUIC_REG_CTRL = 0x02, |
| SM5508_MUIC_REG_INT1 = 0x03, |
| SM5508_MUIC_REG_INT2 = 0x04, |
| SM5508_MUIC_REG_INT3 = 0x05, |
| SM5508_MUIC_REG_INTMASK1 = 0x06, |
| SM5508_MUIC_REG_INTMASK2 = 0x07, |
| SM5508_MUIC_REG_INTMASK3 = 0x08, |
| SM5508_MUIC_REG_ADC = 0x09, |
| SM5508_MUIC_REG_DEV_T1 = 0x0A, |
| SM5508_MUIC_REG_DEV_T2 = 0x0B, |
| SM5508_MUIC_REG_DEV_T3 = 0x0C, |
| SM5508_MUIC_REG_TIMING1 = 0x0D, |
| SM5508_MUIC_REG_TIMING2 = 0x0E, |
| SM5508_MUIC_REG_BUTTON1 = 0x10, |
| SM5508_MUIC_REG_BUTTON2 = 0x11, |
| SM5508_MUIC_REG_CARKIT_STATUS = 0x12, |
| SM5508_MUIC_REG_MANSW1 = 0x13, |
| SM5508_MUIC_REG_MANSW2 = 0x14, |
| SM5508_MUIC_REG_VBUS_VALID = 0x15, |
| SM5508_MUIC_REG_RESERVED_ID2 = 0x16, |
| SM5508_MUIC_REG_CHG_TYPE = 0x17, |
| SM5508_MUIC_REG_AFC_CTRL = 0x18, |
| SM5508_MUIC_REG_AFC_TXD = 0x19, |
| SM5508_MUIC_REG_AFC_STATUS = 0x1A, |
| SM5508_MUIC_REG_AFC_RXD1 = 0x1D, |
| SM5508_MUIC_REG_AFC_RXD2 = 0x1E, |
| SM5508_MUIC_REG_AFC_RXD3 = 0x1F, |
| SM5508_MUIC_REG_AFC_RXD4 = 0x20, |
| SM5508_MUIC_REG_AFC_RXD5 = 0x21, |
| SM5508_MUIC_REG_AFC_RXD6 = 0x22, |
| SM5508_MUIC_REG_STATUS = 0x23, |
| SM5508_MUIC_REG_RESET = 0x24, |
| SM5508_MUIC_REG_GPIO = 0x25, |
| SM5508_MUIC_REG_END, |
| }; |
| |
| /* SM5508 Control register */ |
| #define SM5508_CTRL_SWITCH_OPEN_SHIFT 4 |
| #define SM5508_CTRL_RAW_DATA_SHIFT 3 |
| #define SM5508_CTRL_MANUAL_SW_SHIFT 2 |
| #define SM5508_CTRL_WAIT_SHIFT 1 |
| #define SM5508_CTRL_MASK_INT_SHIFT 0 |
| |
| #define SM5508_CTRL_SWITCH_OPEN_MASK (1 << SM5508_CTRL_SWITCH_OPEN_SHIFT) |
| #define SM5508_CTRL_RAW_DATA_MASK (1 << SM5508_CTRL_RAW_DATA_SHIFT) |
| #define SM5508_CTRL_MANUAL_SW_MASK (1 << SM5508_CTRL_MANUAL_SW_SHIFT) |
| #define SM5508_CTRL_WAIT_MASK (1 << SM5508_CTRL_WAIT_SHIFT) |
| #define SM5508_CTRL_MASK_INT_MASK (1 << SM5508_CTRL_MASK_INT_SHIFT) |
| #define SM5508_CTRL_MASK (SM5508_CTRL_SWITCH_OPEN_MASK | SM5508_CTRL_WAIT_MASK) |
| |
| /* SM5508 Interrupt 1 register */ |
| #define SM5508_INT1_LKR_SHIFT 4 |
| #define SM5508_INT1_LKP_SHIFT 3 |
| #define SM5508_INT1_KP_SHIFT 2 |
| #define SM5508_INT1_DETACH_SHIFT 1 |
| #define SM5508_INT1_ATTACH_SHIFT 0 |
| |
| #define SM5508_INT1_LKR_MASK (1 << SM5508_INT1_LKR_SHIFT) |
| #define SM5508_INT1_LKP_MASK (1 << SM5508_INT1_LKP_SHIFT) |
| #define SM5508_INT1_KP_MASK (1 << SM5508_INT1_KP_SHIFT) |
| #define SM5508_INT1_DETACH_MASK (1 << SM5508_INT1_DETACH_SHIFT) |
| #define SM5508_INT1_ATTACH_MASK (1 << SM5508_INT1_ATTACH_SHIFT) |
| |
| |
| /* SM5508 Interrupt 2 register */ |
| #define SM5508_INT2_VBUS_U_ON_SHIFT 7 |
| #define SM5508_INT2_RID_CHARGER_SHIFT 6 |
| #define SM5508_INT2_MHL_SHIFT 5 |
| #define SM5508_INT2_STUCK_KEY_RCV_SHIFT 4 |
| #define SM5508_INT2_STUCK_KEY_SHIFT 3 |
| #define SM5508_INT2_ADC_CHANGE_SHIFT 2 |
| #define SM5508_INT2_RSRV_ATTACH_SHIFT 1 |
| #define SM5508_INT2_VBUS_U_OFF_SHIFT 0 |
| |
| #define SM5508_INT2_VBUS_U_ON_MASK (1 << SM5508_INT2_VBUS_U_ON_SHIFT) |
| #define SM5508_INT2_RID_CHARGER_MASK (1 << SM5508_INT2_RID_CHARGER_SHIFT) |
| #define SM5508_INT2_MHL_MASK (1 << SM5508_INT2_MHL_SHIFT) |
| #define SM5508_INT2_STUCK_KEY_RCV_MASK (1 << SM5508_INT2_STUCK_KEY_RCV_SHIFT) |
| #define SM5508_INT2_STUCK_KEY_MASK (1 << SM5508_INT2_STUCK_KEY_SHIFT) |
| #define SM5508_INT2_ADC_CHANGE_MASK (1 << SM5508_INT2_ADC_CHANGE_SHIFT) |
| #define SM5508_INT2_RSRV_ATTACH_MASK (1 << SM5508_INT2_RSRV_ATTACH_SHIFT) |
| #define SM5508_INT2_VBUS_U_OFF_MASK (1 << SM5508_INT2_VBUS_U_OFF_SHIFT) |
| |
| |
| /* SM5508 Interrupt 3 AFC register */ |
| #define SM5508_INT3_AFC_QC_VBUS_9V_SHIFT 7 |
| #define SM5508_INT3_AFC_QC20ACCEPTED_SHIFT 6 |
| #define SM5508_INT3_AFC_ERROR_SHIFT 5 |
| #define SM5508_INT3_AFC_STA_CHG_SHIFT 4 |
| #define SM5508_INT3_AFC_MULTI_BYTE_SHIFT 3 |
| #define SM5508_INT3_AFC_AFC_VBUS_9V_SHIFT 2 |
| #define SM5508_INT3_AFC_ACCEPTED_SHIFT 1 |
| #define SM5508_INT3_AFC_TA_ATTACHED_SHIFT 0 |
| |
| #define SM5508_INT3_AFC_QC_VBUS_9V_MASK (1 << SM5508_INT3_AFC_QC_VBUS_9V_SHIFT) |
| #define SM5508_INT3_AFC_QC20ACCEPTED_MASK (1 << SM5508_INT3_AFC_QC20ACCEPTED_SHIFT) |
| #define SM5508_INT3_AFC_ERROR_MASK (1 << SM5508_INT3_AFC_ERROR_SHIFT) |
| #define SM5508_INT3_AFC_STA_CHG_MASK (1 << SM5508_INT3_AFC_STA_CHG_SHIFT) |
| #define SM5508_INT3_AFC_MULTI_BYTE_MASK (1 << SM5508_INT3_AFC_MULTI_BYTE_SHIFT) |
| #define SM5508_INT3_AFC_AFC_VBUS_9V_MASK (1 << SM5508_INT3_AFC_AFC_VBUS_9V_SHIFT) |
| #define SM5508_INT3_AFC_ACCEPTED_MASK (1 << SM5508_INT3_AFC_ACCEPTED_SHIFT) |
| #define SM5508_INT3_AFC_TA_ATTACHED_MASK (1 << SM5508_INT3_AFC_TA_ATTACHED_SHIFT) |
| |
| |
| /* SM5508 AFC CTRL register */ |
| #define SM5508_AFC_ENQC20_12V_SHIFT 7 |
| #define SM5508_AFC_ENQC20_9V_SHIFT 6 |
| #define SM5508_AFC_DISAFC_SHIFT 5 |
| #define SM5508_AFC_DM_RESET_SHIFT 2 |
| #define SM5508_AFC_DP_RESET_SHIFT 1 |
| #define SM5508_AFC_ENAFC_SHIFT 0 |
| |
| #define SM5508_AFC_ENQC20_12V_MASK (1 << SM5508_AFC_ENQC20_12V_SHIFT) |
| #define SM5508_AFC_ENQC20_9V_MASK (1 << SM5508_AFC_ENQC20_9V_SHIFT) |
| #define SM5508_AFC_DISAFC_MASK (1 << SM5508_AFC_DISAFC_SHIFT) |
| #define SM5508_AFC_DM_RESET_MASK (1 << SM5508_AFC_DM_RESET_SHIFT) |
| #define SM5508_AFC_DP_RESET_MASK (1 << SM5508_AFC_DP_RESET_SHIFT) |
| #define SM5508_AFC_ENAFC_MASK (1 << SM5508_AFC_ENAFC_SHIFT) |
| |
| /* SM5508 Device Type 1 register */ |
| #define SM5508_DEV_TYPE1_USB_OTG (1 << 7) |
| #define SM5508_DEV_TYPE1_TA (1 << 6) |
| #define SM5508_DEV_TYPE1_CDP (1 << 5) |
| #define SM5508_DEV_TYPE1_CARKIT_CHG (1 << 4) |
| #define SM5508_DEV_TYPE1_UART (1 << 3) |
| #define SM5508_DEV_TYPE1_USB (1 << 2) |
| #define SM5508_DEV_TYPE1_AUDIO_2 (1 << 1) |
| #define SM5508_DEV_TYPE1_AUDIO_1 (1 << 0) |
| |
| /* SM5508 Device Type 2 register */ |
| #define SM5508_DEV_TYPE2_AV (1 << 6) |
| #define SM5508_DEV_TYPE2_TTY (1 << 5) |
| #define SM5508_DEV_TYPE2_PPD (1 << 4) |
| #define SM5508_DEV_TYPE2_JIG_UART_OFF (1 << 3) |
| #define SM5508_DEV_TYPE2_JIG_UART_ON (1 << 2) |
| #define SM5508_DEV_TYPE2_JIG_USB_OFF (1 << 1) |
| #define SM5508_DEV_TYPE2_JIG_USB_ON (1 << 0) |
| |
| /* SM5508 Device Type 3 register */ |
| #define SM5508_DEV_TYPE3_AFC_TA_CHG (1 << 7) |
| #define SM5508_DEV_TYPE3_U200_CHG (1 << 6) |
| #define SM5508_DEV_TYPE3_LO_TA_CHG (1 << 5) |
| #define SM5508_DEV_TYPE3_AV_WITH_VBUS (1 << 4) |
| #define SM5508_DEV_TYPE3_DCD_OUT_SDP_CHG (1 << 2) |
| #define SM5508_DEV_TYPE3_QC20_TA_CHG (1 << 1) |
| #define SM5508_DEV_TYPE3_MHL (1 << 0) |
| |
| /* ADC VALUE */ |
| #define SM5508_ADC_OTG 0x00 |
| #define SM5508_ADC_MHL 0x20 |
| #define SM5508_ADC_VZW_DOCK 0x0E |
| #define SM5508_ADC_VZW_INCOMPATIBLE 0x0F |
| #define SM5508_ADC_SMART_DOCK 0x10 |
| #define SM5508_ADC_HMT 0x11 |
| #define SM5508_ADC_AUDIO_DOCK 0x12 |
| #define SM5508_ADC_LANHUB 0x13 |
| #define SM5508_ADC_CHARGING_CABLE 0x14 |
| #define SM5508_ADC_MPOS 0x15 |
| #define SM5508_ADC_UART 0x16 |
| #define SM5508_ADC_LCABLE 0x17 |
| #define SM5508_ADC_JIG_USB_OFF 0x18 |
| #define SM5508_ADC_JIG_USB_ON 0x19 |
| #define SM5508_ADC_DESKDOCK 0x1A |
| #define SM5508_ADC_CEA2 0x1B |
| #define SM5508_ADC_JIG_UART_OFF 0x1C |
| #define SM5508_ADC_JIG_UART_ON 0x1d |
| #define SM5508_ADC_OPEN 0x1F |
| |
| #define SM5508_MUIC_AFC_5V 0x08 |
| #define SM5508_MUIC_AFC_9V 0x46 |
| #define SM5508_MUIC_AFC_12V 0x79 |
| #define SM5508_MUIC_QC20_5V 0x0 |
| #define SM5508_MUIC_QC20_9V 0x1 |
| |
| #define SM5508_CONTROL_VALUE 0x1E |
| #define SM5508_INT_MASK1_VALUE 0x1C |
| #define SM5508_INT_MASK2_VALUE 0x00 |
| #define SM5508_INT_MASK3_VALUE 0x00 |
| |
| /* vbusin valid */ |
| #define SM5508_DEV_VBUSIN_VALID (1 << 1) |
| /* vbusout valid */ |
| #define SM5508_DEV_VBUSOUT_VALID (1 << 0) |
| |
| /* |
| * Manual Switch |
| * D- [7:5] / D+ [4:2] |
| * 000: Open |
| * 001: DM_CON_U connected to DM_CON_A |
| * 011: DM_CON_U connected to TxD |
| */ |
| #define SM5508_SW_TO_USB ((1 << 5) | (1 << 2)) |
| #define SM5508_SW_TO_UART ((3 << 5) | (3 << 2)) |
| #define SM5508_SW_ALL_OPEN (0) |
| |
| enum sm5508_reg_manual_sw1_value { |
| SM5508_MANSW1_OPEN = SM5508_SW_ALL_OPEN, |
| SM5508_MANSW1_TO_USB = SM5508_SW_TO_USB, |
| SM5508_MANSW1_TO_UART = SM5508_SW_TO_UART, |
| }; |
| |
| struct sm5508_muic_platform_data { |
| int gpio_irq; |
| }; |
| |
| struct sm5508_muic_usbsw { |
| struct i2c_client *client; |
| struct mutex muic_mutex; |
| struct sm5508_muic_platform_data *pdata; |
| struct muic_platform_data *muic_pdata; |
| /* muic current attached device */ |
| muic_attached_dev_t attached_dev; |
| bool is_hv_disabled; |
| int intr1; |
| int intr2; |
| int intr3; |
| int dev1; |
| int dev2; |
| int dev3; |
| int adc; |
| int mansw; |
| int vbus; |
| int afc_txd; |
| int afc_retry_count; |
| |
| struct delayed_work init_work; |
| }; |
| |
| extern struct muic_platform_data muic_pdata2; |
| |
| #endif /* _SM5508_MUIC_H_ */ |