blob: 99f95f2d825b581214e3f1607426fb472acfb81b [file] [log] [blame]
/*
* sm5713-private.h - IF-PMIC device driver for SM5713
*
* Copyright (C) 2017 Samsung Electronics
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#ifndef __SM5713_PRIV_H__
#define __SM5713_PRIV_H__
#include <linux/i2c.h>
#include <linux/interrupt.h>
#define SM5713_I2C_SADR_MUIC (0x4A >> 1)
#define SM5713_I2C_SADR_CHG (0x92 >> 1)
#define SM5713_I2C_SADR_FG (0xE2 >> 1)
#define SM5713_IRQSRC_MUIC (1 << 0)
#define SM5713_IRQSRC_CHG (1 << 1)
#define SM5713_IRQSRC_FG (1 << 2)
#define SM5713_REG_INVALID (0xffff)
/* Slave addr = 0x4A : MUIC */
enum sm5713_muic_reg {
SM5713_MUIC_REG_DeviceID = 0x00,
SM5713_MUIC_REG_INT1 = 0x01,
SM5713_MUIC_REG_INT2 = 0x02,
SM5713_MUIC_REG_INTMASK1 = 0x03,
SM5713_MUIC_REG_INTMASK2 = 0x04,
SM5713_MUIC_REG_CNTL = 0x05,
SM5713_MUIC_REG_MANUAL_SW = 0x06,
SM5713_MUIC_REG_DEVICETYPE1 = 0x07,
SM5713_MUIC_REG_DEVICETYPE2 = 0x08,
SM5713_MUIC_REG_AFCCNTL = 0x09,
SM5713_MUIC_REG_AFCTXD = 0x0A,
SM5713_MUIC_REG_AFCSTATUS = 0x0B,
SM5713_MUIC_REG_VBUS_VOLTAGE1 = 0x0C,
SM5713_MUIC_REG_VBUS_VOLTAGE2 = 0x0D,
SM5713_MUIC_REG_AFC_RXD1 = 0x0E,
SM5713_MUIC_REG_AFC_RXD2 = 0x0F,
SM5713_MUIC_REG_AFC_RXD3 = 0x10,
SM5713_MUIC_REG_AFC_RXD4 = 0x11,
SM5713_MUIC_REG_AFC_RXD5 = 0x12,
SM5713_MUIC_REG_AFC_RXD6 = 0x13,
SM5713_MUIC_REG_AFC_RXD7 = 0x14,
SM5713_MUIC_REG_AFC_RXD8 = 0x15,
SM5713_MUIC_REG_AFC_RXD9 = 0x16,
SM5713_MUIC_REG_AFC_RXD10 = 0x17,
SM5713_MUIC_REG_AFC_RXD11 = 0x18,
SM5713_MUIC_REG_AFC_RXD12 = 0x19,
SM5713_MUIC_REG_AFC_RXD13 = 0x1A,
SM5713_MUIC_REG_AFC_RXD14 = 0x1B,
SM5713_MUIC_REG_AFC_RXD15 = 0x1C,
SM5713_MUIC_REG_RESET = 0x1D,
SM5713_MUIC_REG_END,
};
/* Slave addr = 0x92 : SW Charger, RGB, FLED */
enum sm5713_charger_reg {
/* SW Charger */
SM5713_CHG_REG_INT_SOURCE = 0x00,
SM5713_CHG_REG_INT1 = 0x01,
SM5713_CHG_REG_INT2 = 0x02,
SM5713_CHG_REG_INT3 = 0x03,
SM5713_CHG_REG_INT4 = 0x04,
SM5713_CHG_REG_INT5 = 0x05,
SM5713_CHG_REG_INT6 = 0x06,
SM5713_CHG_REG_INTMSK1 = 0x07,
SM5713_CHG_REG_INTMSK2 = 0x08,
SM5713_CHG_REG_INTMSK3 = 0x09,
SM5713_CHG_REG_INTMSK4 = 0x0A,
SM5713_CHG_REG_INTMSK5 = 0x0B,
SM5713_CHG_REG_INTMSK6 = 0x0C,
SM5713_CHG_REG_STATUS1 = 0x0D,
SM5713_CHG_REG_STATUS2 = 0x0E,
SM5713_CHG_REG_STATUS3 = 0x0F,
SM5713_CHG_REG_STATUS4 = 0x10,
SM5713_CHG_REG_STATUS5 = 0x11,
SM5713_CHG_REG_STATUS6 = 0x12,
SM5713_CHG_REG_CNTL1 = 0x13,
SM5713_CHG_REG_CNTL2 = 0x14,
SM5713_CHG_REG_VBUSCNTL = 0x15,
SM5713_CHG_REG_CHGCNTL1 = 0x17,
SM5713_CHG_REG_CHGCNTL2 = 0x18,
SM5713_CHG_REG_CHGCNTL4 = 0x1A,
SM5713_CHG_REG_CHGCNTL5 = 0x1B,
SM5713_CHG_REG_CHGCNTL6 = 0x1C,
SM5713_CHG_REG_CHGCNTL7 = 0x1D,
SM5713_CHG_REG_CHGCNTL8 = 0x1E,
SM5713_CHG_REG_CHGCNTL9 = 0x1F,
SM5713_CHG_REG_CHGCNTL10 = 0x20,
SM5713_CHG_REG_WDTCNTL = 0x22,
SM5713_CHG_REG_BSTCNTL1 = 0x23,
SM5713_CHG_REG_FACTORY1 = 0x25,
SM5713_CHG_REG_FACTORY2 = 0x26,
/* RGB */
SM5713_CHG_REG_LED123MODE = 0x27,
SM5713_CHG_REG_LEDCNTL = 0x28,
SM5713_CHG_REG_LED1CNTL1 = 0x29,
SM5713_CHG_REG_LED1CNTL2 = 0x2A,
SM5713_CHG_REG_LED1CNTL3 = 0x2B,
SM5713_CHG_REG_LED2CNTL1 = 0x2C,
SM5713_CHG_REG_LED2CNTL2 = 0x2D,
SM5713_CHG_REG_LED2CNTL3 = 0x2E,
SM5713_CHG_REG_LED3CNTL1 = 0x2F,
SM5713_CHG_REG_LED3CNTL2 = 0x30,
SM5713_CHG_REG_LED3CNTL3 = 0x31,
/* FLED */
SM5713_CHG_REG_SINKADJ = 0x40,
SM5713_CHG_REG_FLED1CNTL1 = 0x41,
SM5713_CHG_REG_FLED1CNTL2 = 0x42,
SM5713_CHG_REG_FLED2CNTL1 = 0x43,
SM5713_CHG_REG_FLED2CNTL2 = 0x44,
SM5713_CHG_REG_FLED3CNTL = 0x45,
SM5713_CHG_REG_CHGCNTL11 = 0x46,
SM5713_CHG_REG_DEVICEID = 0x50,
SM5713_CHG_REG_END,
};
/* Slave addr = 0xE2 : FUEL GAUGE */
enum sm5713_fuelgauge_reg {
SM5713_FG_REG_DEVICE_ID = 0x00,
SM5713_FG_REG_CNTL = 0x01,
SM5713_FG_REG_INTFG = 0x02,
SM5713_FG_REG_INTFG_MASK = 0x03,
SM5713_FG_REG_STATUS = 0x04,
SM5713_FG_REG_SOC = 0x05,
SM5713_FG_REG_OCV = 0x06,
SM5713_FG_REG_VOLTAGE_VBAT = 0x07,
SM5713_FG_REG_CURRENT = 0x08,
SM5713_FG_REG_TEMPERATURE = 0x09,
SM5713_FG_REG_SOC_CYCLE = 0x0A,
SM5713_FG_REG_VOLTAGE_VSYS = 0x0B,
SM5713_FG_REG_V_L_ALARM = 0x0C,
SM5713_FG_REG_V_H_ALARM = 0x0D,
SM5713_FG_REG_T_ALARM = 0x0E,
SM5713_FG_REG_SOC_ALARM = 0x0F,
SM5713_FG_REG_OP_STATUS = 0x10,
SM5713_FG_REG_TOPOFF_SOC = 0x12,
SM5713_FG_REG_PARAM_CTRL = 0x13,
SM5713_FG_REG_PARAM_RUN_UPDATE = 0x14,
SM5713_FG_REG_SOC_CYCLE_CFG = 0x15,
SM5713_FG_REG_VOLTAGE_CHGOUT = 0x19,
SM5713_FG_REG_VIT_PERIOD = 0x1A,
SM5713_FG_REG_MIX_RATE = 0x1B,
SM5713_FG_REG_MIX_INIT_BLANK = 0x1C,
SM5713_FG_REG_USER_RESERV_1 = 0x1E,
SM5713_FG_REG_USER_RESERV_2 = 0x1F,
SM5713_FG_REG_RCE0 = 0x20,
SM5713_FG_REG_RCE1 = 0x21,
SM5713_FG_REG_RCE2 = 0x22,
SM5713_FG_REG_DTCD = 0x23,
SM5713_FG_REG_AUTO_RS_MAN = 0x24,
SM5713_FG_REG_RS_MIX_FACTOR = 0x25,
SM5713_FG_REG_RS_MAX = 0x26,
SM5713_FG_REG_RS_MIN = 0x27,
SM5713_FG_REG_RS_TUNE = 0x28,
SM5713_FG_REG_RS_MAN = 0x29,
SM5713_FG_REG_IOFF_MODE = 0x2B,
SM5713_FG_REG_IOCV_MAN = 0x2E,
SM5713_FG_REG_END_V_IDX = 0x2F,
SM5713_FG_REG_START_LB_V = 0x30,
SM5713_FG_REG_START_CB_V = 0x38,
SM5713_FG_REG_START_LB_S = 0x40,
SM5713_FG_REG_START_CB_S = 0x48,
SM5713_FG_REG_START_LB_I = 0x50,
SM5713_FG_REG_START_CB_I = 0x58,
SM5713_FG_REG_SOC_CHG_INFO = 0x60,
SM5713_FG_REG_SOC_DISCHG_INFO = 0x61,
SM5713_FG_REG_BAT_CAP = 0x62,
SM5713_FG_REG_Q_MEAS_INIT = 0x63,
SM5713_FG_REG_VOLT_CAL = 0x6F,
SM5713_FG_REG_VOLT_TEMP_CAL = 0x70,
SM5713_FG_REG_VSBC_VOLT_TEMP_CAL= 0x71,
SM5713_FG_REG_DP_EV_I_OFF = 0x74,
SM5713_FG_REG_DP_EV_I_SLO = 0x75,
SM5713_FG_REG_DP_CSP_I_OFF = 0x76,
SM5713_FG_REG_DP_CSP_I_SLO = 0x77,
SM5713_FG_REG_DP_CSN_I_OFF = 0x78,
SM5713_FG_REG_DP_CSN_I_SLO = 0x79,
SM5713_FG_REG_EV_I_OFF = 0x7A,
SM5713_FG_REG_EV_I_SLO = 0x7B,
SM5713_FG_REG_CSP_I_OFF = 0x7C,
SM5713_FG_REG_CSP_I_SLO = 0x7D,
SM5713_FG_REG_CSN_I_OFF = 0x7E,
SM5713_FG_REG_CSN_I_SLO = 0x7F,
/* for debug */
SM5713_FG_REG_OCV_STATE = 0x80,
SM5713_FG_REG_VDS = 0x84,
SM5713_FG_REG_CURRENT_EST = 0x85,
SM5713_FG_REG_CURRENT_ERR = 0x86,
SM5713_FG_REG_CURR_ALG = 0x87,
SM5713_FG_REG_Q_EST = 0x88,
SM5713_FG_REG_Q_MEAS = 0x89,
SM5713_FG_REG_Q_DUMP = 0x8A,
SM5713_FG_REG_AGING_INFO = 0x8B,
SM5713_FG_REG_CURR_MQ = 0x8C,
/* etc */
SM5713_FG_REG_MISC = 0x90,
SM5713_FG_REG_RESET = 0x91,
SM5713_FG_REG_AUX_1 = 0x92,
SM5713_FG_REG_AUX_2 = 0x93,
SM5713_FG_REG_AUX_3 = 0x94,
SM5713_FG_REG_AUX_STAT = 0x95,
SM5713_FG_REG_BAT_PTT1 = 0x96,
SM5713_FG_REG_V_ALARM_HYS = 0x99,
SM5713_FG_REG_AGING_CTRL = 0x9C,
SM5713_FG_REG_TABLE_0_START = 0xA0,
SM5713_FG_REG_TABLE_1_START = 0xB8,
SM5713_FG_REG_TABLE_2_START = 0xD0,
SM5713_FG_REG_END,
};
enum sm5713_irq_source {
MUIC_INT1 = 0,
MUIC_INT2,
CHG_INT1,
CHG_INT2,
CHG_INT3,
CHG_INT4,
CHG_INT5,
CHG_INT6,
FG_INT,
SM5713_IRQ_GROUP_NR,
};
#define SM5713_NUM_IRQ_MUIC_REGS 2
#define SM5713_NUM_IRQ_CHG_REGS 6
enum sm5713_irq {
SM5713_MUIC_IRQ_WORK = (-2), /* -2 */
SM5713_MUIC_IRQ_PROBE = (-1), /* -1 */
/* MUIC INT1 */
SM5713_MUIC_IRQ_INT1_DPDM_OVP = 0, /* 00 */
SM5713_MUIC_IRQ_INT1_VBUS_RID_DETACH, /* 01 */
SM5713_MUIC_IRQ_INT1_AUTOVBUSCHECK, /* 02 */
SM5713_MUIC_IRQ_INT1_RID_DETECT, /* 03 */
SM5713_MUIC_IRQ_INT1_CHGTYPE, /* 04 */
SM5713_MUIC_IRQ_INT1_DCDTIMEOUT, /* 05 */
/* MUIC INT2 */
SM5713_MUIC_IRQ_INT2_AFC_ERROR, /* 06 */
SM5713_MUIC_IRQ_INT2_AFC_STA_CHG, /* 07 */
SM5713_MUIC_IRQ_INT2_MULTI_BYTE, /* 08 */
SM5713_MUIC_IRQ_INT2_VBUS_UPDATE, /* 09 */
SM5713_MUIC_IRQ_INT2_AFC_ACCEPTED, /* 10 */
SM5713_MUIC_IRQ_INT2_AFC_TA_ATTACHED, /* 11 */
/* CHG INT1 */
SM5713_CHG_IRQ_INT1_VBUSLIMIT, /* 12 */
SM5713_CHG_IRQ_INT1_VBUSOVP, /* 13 */
SM5713_CHG_IRQ_INT1_VBUSUVLO, /* 14 */
SM5713_CHG_IRQ_INT1_VBUSPOK, /* 15 */
/* CHG INT2 */
SM5713_CHG_IRQ_INT2_WDTMROFF, /* 16 */
SM5713_CHG_IRQ_INT2_DONE, /* 17 */
SM5713_CHG_IRQ_INT2_TOPOFF, /* 18 */
SM5713_CHG_IRQ_INT2_Q4FULLON, /* 19 */
SM5713_CHG_IRQ_INT2_CHGON, /* 20 */
SM5713_CHG_IRQ_INT2_NOBAT, /* 21 */
SM5713_CHG_IRQ_INT2_BATOVP, /* 22 */
SM5713_CHG_IRQ_INT2_AICL, /* 23 */
/* CHG INT3 */
SM5713_CHG_IRQ_INT3_VSYSOVP, /* 24 */
SM5713_CHG_IRQ_INT3_nENQ4, /* 25 */
SM5713_CHG_IRQ_INT3_FASTTMROFF, /* 26 */
SM5713_CHG_IRQ_INT3_PRETMROFF, /* 27 */
SM5713_CHG_IRQ_INT3_DISLIMIT, /* 28 */
SM5713_CHG_IRQ_INT3_OTGFAIL, /* 29 */
SM5713_CHG_IRQ_INT3_THEMSHDN, /* 30 */
SM5713_CHG_IRQ_INT3_THEMREG, /* 31 */
/* CHG INT4 */
SM5713_CHG_IRQ_INT4_CVMODE, /* 32 */
SM5713_CHG_IRQ_INT4_VBUS_UPDATE, /* 33 */
SM5713_CHG_IRQ_INT4_MRSTB, /* 34 */
SM5713_CHG_IRQ_INT4_nVBUSOK, /* 35 */
SM5713_CHG_IRQ_INT4_BOOSTPOK, /* 36 */
SM5713_CHG_IRQ_INT4_BOOSTPOK_NG, /* 37 */
/* CHG INT5 */
SM5713_CHG_IRQ_INT5_ABSTMR2OFF, /* 38 */
SM5713_CHG_IRQ_INT5_ABSTMR1OFF, /* 39 */
SM5713_CHG_IRQ_INT5_FLED3OPEN, /* 40 */
SM5713_CHG_IRQ_INT5_FLED3SHORT, /* 41 */
SM5713_CHG_IRQ_INT5_FLED2OPEN, /* 42 */
SM5713_CHG_IRQ_INT5_FLED2SHORT, /* 43 */
SM5713_CHG_IRQ_INT5_FLED1OPEN, /* 44 */
SM5713_CHG_IRQ_INT5_FLED1SHORT, /* 45 */
/* CHG INT6 */
SM5713_CHG_IRQ_INT6_VBUSSHORT, /* 46 */
/* FG INT */
SM5713_FG_IRQ_INT_LOW_SOC, /* 47 */
SM5713_FG_IRQ_INT_HIGH_TEMP, /* 48 */
SM5713_FG_IRQ_INT_LOW_TEMP, /* 49 */
SM5713_FG_IRQ_INT_HIGH_VOLTAGE, /* 50 */
SM5713_FG_IRQ_INT_LOW_VOLTAGE, /* 51 */
SM5713_IRQ_NR,
};
struct sm5713_dev {
struct device *dev;
struct i2c_client *charger; /* 0x92; Charger */
struct i2c_client *fuelgauge; /* 0xE2; Fuelgauge */
struct i2c_client *muic; /* 0x4A; MUIC */
struct mutex i2c_lock;
int type;
int irq;
int irq_base;
int irq_gpio;
bool wakeup;
struct mutex irqlock;
int irq_masks_cur[SM5713_IRQ_GROUP_NR];
int irq_masks_cache[SM5713_IRQ_GROUP_NR];
#ifdef CONFIG_HIBERNATION
/* For hibernation */
u8 reg_muic_dump[SM5713_MUIC_REG_END];
u8 reg_chg_dump[SM5713_CHG_REG_END];
u16 reg_fg_dump[SM5713_FG_REG_END];
#endif
/* For IC-Reset protection */
void (*check_muic_reset)(struct i2c_client *, void *);
void (*check_chg_reset)(struct i2c_client *, void *);
void (*check_fg_reset)(struct i2c_client *, void *);
void *muic_data;
void *chg_data;
void *fg_data;
u8 pmic_rev;
u8 vender_id;
struct sm5713_platform_data *pdata;
};
enum sm5713_types {
TYPE_SM5713,
};
enum sm5713_dev_types {
DEV_TYPE_SM5713_MUIC = 0x0,
DEV_TYPE_SM5713_CCIC = 0x1,
};
extern int sm5713_irq_init(struct sm5713_dev *sm5713);
extern void sm5713_irq_exit(struct sm5713_dev *sm5713);
/* SM5713 shared i2c API function */
extern int sm5713_read_reg(struct i2c_client *i2c, u8 reg, u8 *dest);
extern int sm5713_bulk_read(struct i2c_client *i2c, u8 reg, int count, u8 *buf);
extern int sm5713_read_word(struct i2c_client *i2c, u8 reg);
extern int sm5713_write_reg(struct i2c_client *i2c, u8 reg, u8 value);
extern int sm5713_bulk_write(struct i2c_client *i2c, u8 reg, int count, u8 *buf);
extern int sm5713_write_word(struct i2c_client *i2c, u8 reg, u16 value);
extern int sm5713_update_reg(struct i2c_client *i2c, u8 reg, u8 val, u8 mask);
extern int sm5713_update_word(struct i2c_client *i2c, u8 reg, u16 val, u16 mask);
/* support SM5713 Charger operation mode control module */
enum {
SM5713_CHARGER_OP_EVENT_VBUSIN = 0x5,
SM5713_CHARGER_OP_EVENT_USB_OTG = 0x4,
SM5713_CHARGER_OP_EVENT_PWR_SHAR = 0x3,
SM5713_CHARGER_OP_EVENT_FLASH = 0x2,
SM5713_CHARGER_OP_EVENT_TORCH = 0x1,
SM5713_CHARGER_OP_EVENT_SUSPEND = 0x0,
};
extern int sm5713_charger_oper_table_init(struct sm5713_dev *sm5713);
extern int sm5713_charger_oper_push_event(int event_type, bool enable);
extern int sm5713_charger_oper_get_current_status(void);
extern int sm5713_charger_oper_get_current_op_mode(void);
extern int sm5713_charger_oper_get_vbus_voltage(void);
extern int sm5713_charger_oper_en_factory_mode(int dev_type, int rid, bool enable);
#endif /* __SM5713_PRIV_H__ */