blob: 2c755f605747954c51add9fc692fa4aa459e9554 [file] [edit]
/* SPDX-License-Identifier: GPL-2.0+ */
/*
* include/linux/mfd/samsung/s2mpg1x-register.h
*
* Copyright (C) 2021 Samsung Electronics
*
* header file including common register information of s2mpg10, s2mpg11, 2mpg12, s2mpg13
*/
#ifndef __LINUX_MFD_S2MPG1X_REGISTER_H
#define __LINUX_MFD_S2MPG1X_REGISTER_H
#include <linux/bits.h>
#if IS_ENABLED(CONFIG_SOC_GS101)
#define S2MPG1X_METER_CHANNEL_MAX 8
#elif IS_ENABLED(CONFIG_SOC_GS201)
#define S2MPG1X_METER_CHANNEL_MAX 12
#endif
#define MASK(width, shift) GENMASK(shift + width - 1, shift)
typedef enum {
MUXSEL_NONE,
BUCK1 = 0x1,
BUCK2 = 0x2,
BUCK3 = 0x3,
BUCK4 = 0x4,
BUCK5 = 0x5,
BUCK6 = 0x6,
BUCK7 = 0x7,
BUCK8 = 0x8,
BUCK9 = 0x9,
BUCK10 = 0xA,
BUCKD = 0xB,
BUCKA = 0xC,
BUCKC = 0xD,
BUCKBOOST_0D = 0xD,
BUCKBOOST_10 = 0x10,
VSEN_V1 = 0x1C,
VSEN_V2 = 0x1D,
VSEN_V3 = 0x1E,
VSEN_P4 = 0x1C,
VSEN_P5 = 0x1D,
VSEN_P6 = 0x1E,
VBAT = 0x1F,
LDO1 = 0x21,
LDO2 = 0x22,
LDO3 = 0x23,
LDO4 = 0x24,
LDO5 = 0x25,
LDO6 = 0x26,
LDO7 = 0x27,
LDO8 = 0x28,
LDO9 = 0x29,
LDO10 = 0x2A,
LDO11 = 0x2B,
LDO12 = 0x2C,
LDO13 = 0x2D,
LDO14 = 0x2E,
LDO15 = 0x2F,
LDO16 = 0x30,
LDO17 = 0x31,
LDO18 = 0x32,
LDO19 = 0x33,
LDO20 = 0x34,
LDO21 = 0x35,
LDO22 = 0x36,
LDO23 = 0x37,
LDO24 = 0x38,
LDO25 = 0x39,
LDO26 = 0x3A,
LDO27 = 0x3B,
LDO28 = 0x3C,
LDO29 = 0x3D,
LDO30 = 0x3E,
LDO31 = 0x3F,
VSEN_C1 = 0x5C,
VSEN_C2 = 0x5D,
VSEN_C3 = 0x5E,
VSEN_C4 = 0x5C,
VSEN_C5 = 0x5D,
VSEN_C6 = 0x5E
} s2mpg1x_meter_muxsel;
/**
* sec_opmode_data - regulator operation mode data
* @id: regulator id
* @mode: regulator operation mode
*/
struct sec_opmode_data {
int id;
unsigned int mode;
};
/**
* struct sec_wtsr_smpl - settings for WTSR/SMPL
* @wtsr_en: WTSR Function Enable Control
* @smpl_en: SMPL Function Enable Control
* @wtsr_timer_val: Set the WTSR timer Threshold
* @smpl_timer_val: Set the SMPL timer Threshold
* @check_jigon: if this value is true, do not enable SMPL function when
* JIGONB is low(JIG cable is attached)
*/
struct sec_wtsr_smpl {
bool wtsr_en;
bool coldrst_en;
bool smpl_en;
bool sub_smpl_en;
int wtsr_timer_val;
int coldrst_timer_val;
int smpl_timer_val;
bool check_jigon;
};
#define REG_VAL(val, offset, mask) (((val) << (offset)) & (mask))
#define ENUM_STR(x, s, r) \
{ \
case x: \
r = #x s; \
break; \
}
typedef enum {
INT_7P_8125HZ = 0,
INT_15P_625HZ,
INT_31P_25HZ,
INT_62P_5HZ,
INT_125HZ,
INT_250HZ,
#if IS_ENABLED(CONFIG_SOC_GS101)
INT_500HZ,
#endif
INT_1000HZ,
S2MPG1X_INT_FREQ_COUNT,
S2MPG1X_INT_FREQ_NONE,
} s2mpg1x_int_samp_rate;
typedef enum {
#if IS_ENABLED(CONFIG_SOC_GS101)
EXT_7P_628125HZ = 0,
EXT_15P_25625HZ,
EXT_30P_5125HZ,
EXT_61P_025HZ,
EXT_122P_05HZ,
#elif IS_ENABLED(CONFIG_SOC_GS201)
EXT_7P_8125HZ = 0,
EXT_15P_625HZ,
EXT_31P_25HZ,
EXT_62P_5HZ,
EXT_125HZ,
#endif
S2MPG1X_EXT_FREQ_COUNT,
S2MPG1X_EXT_FREQ_NONE,
} s2mpg1x_ext_samp_rate;
typedef enum {
S2MPG1X_METER_POWER = 0,
S2MPG1X_METER_CURRENT = 1,
} s2mpg1x_meter_mode;
/* MUXSEL0~7 */
#define MUXSEL_MASK 0x7F
#define S2MPG1X_METER_LPF 0
#define S2MPG1X_METER_ACC 1
#define S2MPG1X_METER_LPF_BUF 3 /* 21-bit */
#define S2MPG1X_METER_ACC_BUF 6 /* 41-bit */
#define S2MPG1X_METER_COUNT_BUF 3 /* 20-bit */
#define S2MPG1X_METER_BUCKEN_BUF 2
/* MT_TRIM(0xE) MASK */
#define S2MPG1X_PMETER_MRST_MASK BIT(7)
/* S2MPG1x_METER_CTRL1 */
#define METER_EN_MASK BIT(0)
#define EXT_METER_EN_MASK BIT(1)
#define INT_SAMP_RATE_SHIFT 2
#define INT_SAMP_RATE_MASK (0x7 << INT_SAMP_RATE_SHIFT)
#define NTC_SAMP_RATE_SHIFT 5
#define NTC_SAMP_RATE_MASK (0x7 << NTC_SAMP_RATE_SHIFT)
typedef enum {
NTC_0P15625HZ = 1,
NTC_0P3125HZ,
NTC_0P625HZ,
NTC_1P25HZ,
NTC_2P5HZ,
NTC_5HZ,
NTC_10HZ,
} s2mpg1x_ntc_samp_rate;
/* S2MPG1x_METER_CTRL2 */
#define ASYNC_RD_MASK BIT(7)
#define ONESHOT_RD_MASK BIT(6)
#define EXT_METER_CHANNEL_EN_ALL 0x7
#define EXT_METER_CHANNEL_EN_OFFSET 3
#define EXT_METER_CHANNEL_EN_MASK (0x7 << EXT_METER_CHANNEL_EN_OFFSET)
#define EXT_SAMP_RATE_MASK (0x7 << 0)
#define _IQX(_pow, _type, _val) ((_type)((_val) * (1 << (_pow))))
#define _IQX_to_int(_pow, _iqval) ((_iqval) >> (_pow))
// Note: powx > powy
#define _IQX_to_IQY(_powx, _powy, _iqxval) \
((_iqxval) >> ((_powx) - (_powy)))
#define _IQ30(_type, _val) _IQX(30, _type, _val)
#define _IQ30_to_IQ22(_iqval) _IQX_to_IQY(30, 22, _iqval)
#define _IQ22_to_int(_iqval) _IQX_to_int(22, _iqval)
#define _IQ30_to_int(_iqval) _IQX_to_int(30, _iqval)
/* 1-bit resolution define for meter */
/* Unit : 1mA, 1mW, 1mV, converted to unsigned _iq30 */
/* Note: A value above or equal 4.0 would cause an overflow on a u32 IQ30 */
#define INVALID_RESOLUTION ((u32)(0))
#define CMS_BUCK_CURRENT _IQ30(u32, 0.976800977)
#define CMS_BUCK_POWER _IQ30(u32, 0.006105006)
#define CMD_BUCK_CURRENT _IQ30(u32, 1.953601954)
#define CMD_BUCK_POWER _IQ30(u32, 0.012210012)
#define CMT_BUCK_CURRENT _IQ30(u32, 2.93040293)
#define CMT_BUCK_POWER _IQ30(u32, 0.018315018)
#define VM_CURRENT _IQ30(u32, 0.976800977)
#define VM_POWER _IQ30(u32, 0.012210012)
#define BB_CURRENT _IQ30(u32, 0.879120879)
#define BB_POWER _IQ30(u32, 0.010989011)
#define DVS_NLDO_CURRENT_150mA _IQ30(u32, 0.036630037)
#if IS_ENABLED(CONFIG_SOC_GS101)
#define DVS_NLDO_POWER_150mA _IQ30(u32, 0.000228938)
#elif IS_ENABLED(CONFIG_SOC_GS201)
#define DVS_NLDO_POWER_150mA _IQ30(u32, 0.000457875)
#endif
#define NLDO_CURRENT_150mA _IQ30(u32, 0.036630037)
#define NLDO_POWER_150mA _IQ30(u32, 0.000457875)
#define PLDO_CURRENT_150mA _IQ30(u32, 0.036630037)
#define PLDO_POWER_150mA _IQ30(u32, 0.000915751)
#define NLDO_CURRENT_300mA _IQ30(u32, 0.073260073)
#define NLDO_POWER_300mA _IQ30(u32, 0.000915751)
#define PLDO_CURRENT_300mA _IQ30(u32, 0.073260073)
#define PLDO_POWER_300mA _IQ30(u32, 0.001831502)
#define DVS_NLDO_CURRENT_450mA _IQ30(u32, 0.10989011)
#define DVS_NLDO_POWER_450mA _IQ30(u32, 0.000686813)
#define NLDO_CURRENT_450mA _IQ30(u32, 0.10989011)
#define NLDO_POWER_450mA _IQ30(u32, 0.001373626)
#define PLDO_CURRENT_600mA _IQ30(u32, 0.146520147)
#define PLDO_POWER_600mA _IQ30(u32, 0.003663004)
#define DVS_NLDO_CURRENT_800mA _IQ30(u32, 0.195360195)
#define DVS_NLDO_POWER_800mA _IQ30(u32, 0.001221001)
#define NLDO_CURRENT_800mA _IQ30(u32, 0.195360195)
#define NLDO_POWER_800mA _IQ30(u32, 0.002442002)
#define PLDO_CURRENT_800mA _IQ30(u32, 0.195360195)
#define PLDO_POWER_800mA _IQ30(u32, 0.004884005)
#define NLDO_CURRENT_1000mA _IQ30(u32, 0.244200244)
#define NLDO_POWER_1000mA _IQ30(u32, 0.001418251)
#define NLDO_CURRENT_1200mA _IQ30(u32, 0.244200244)
#define NLDO_POWER_1200mA _IQ30(u32, 0.001418251)
#if IS_ENABLED(CONFIG_SOC_GS101)
#define EXTERNAL_RESOLUTION_VRAIL _IQ30(u32, 1.3186813)
#elif IS_ENABLED(CONFIG_SOC_GS201)
#define EXTERNAL_RESOLUTION_VRAIL _IQ30(u32, 2.1978021)
#endif
#define EXTERNAL_RESOLUTION_VSHUNT _IQ30(u32, 0.7935698) // mA/LSB
#define EXTERNAL_RESOLUTION_TRIM BIT(3) // 3 bits
#endif /* __LINUX_MFD_S2MPG1X_REGISTER_H */