Commit bc90705b authored by Angus Ainslie (Purism)'s avatar Angus Ainslie (Purism) Committed by Sebastian Reichel

power: supply: max17042: add MAX17055 support

The MAX17055 is very similar to the MAX17042 so extend the driver.
Signed-off-by: default avatarAngus Ainslie (Purism) <angus@akkea.ca>
Reviewed-by: default avatarKrzysztof Kozlowski <krzk@kernel.org>
Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
parent 47a34db3
...@@ -282,6 +282,8 @@ static int max17042_get_property(struct power_supply *psy, ...@@ -282,6 +282,8 @@ static int max17042_get_property(struct power_supply *psy,
case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN: case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042) if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042)
ret = regmap_read(map, MAX17042_V_empty, &data); ret = regmap_read(map, MAX17042_V_empty, &data);
else if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17055)
ret = regmap_read(map, MAX17055_V_empty, &data);
else else
ret = regmap_read(map, MAX17047_V_empty, &data); ret = regmap_read(map, MAX17047_V_empty, &data);
if (ret < 0) if (ret < 0)
...@@ -627,7 +629,8 @@ static void max17042_write_config_regs(struct max17042_chip *chip) ...@@ -627,7 +629,8 @@ static void max17042_write_config_regs(struct max17042_chip *chip)
config->filter_cfg); config->filter_cfg);
regmap_write(map, MAX17042_RelaxCFG, config->relax_cfg); regmap_write(map, MAX17042_RelaxCFG, config->relax_cfg);
if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17047 || if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17047 ||
chip->chip_type == MAXIM_DEVICE_TYPE_MAX17050) chip->chip_type == MAXIM_DEVICE_TYPE_MAX17050 ||
chip->chip_type == MAXIM_DEVICE_TYPE_MAX17055)
regmap_write(map, MAX17047_FullSOCThr, regmap_write(map, MAX17047_FullSOCThr,
config->full_soc_thresh); config->full_soc_thresh);
} }
...@@ -758,6 +761,8 @@ static inline void max17042_override_por_values(struct max17042_chip *chip) ...@@ -758,6 +761,8 @@ static inline void max17042_override_por_values(struct max17042_chip *chip)
if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042) if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042)
max17042_override_por(map, MAX17042_V_empty, config->vempty); max17042_override_por(map, MAX17042_V_empty, config->vempty);
if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17055)
max17042_override_por(map, MAX17055_V_empty, config->vempty);
else else
max17042_override_por(map, MAX17047_V_empty, config->vempty); max17042_override_por(map, MAX17047_V_empty, config->vempty);
max17042_override_por(map, MAX17042_TempNom, config->temp_nom); max17042_override_por(map, MAX17042_TempNom, config->temp_nom);
...@@ -765,7 +770,10 @@ static inline void max17042_override_por_values(struct max17042_chip *chip) ...@@ -765,7 +770,10 @@ static inline void max17042_override_por_values(struct max17042_chip *chip)
max17042_override_por(map, MAX17042_FCTC, config->fctc); max17042_override_por(map, MAX17042_FCTC, config->fctc);
max17042_override_por(map, MAX17042_RCOMP0, config->rcomp0); max17042_override_por(map, MAX17042_RCOMP0, config->rcomp0);
max17042_override_por(map, MAX17042_TempCo, config->tcompc0); max17042_override_por(map, MAX17042_TempCo, config->tcompc0);
if (chip->chip_type) { if (chip->chip_type &&
((chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042) ||
(chip->chip_type == MAXIM_DEVICE_TYPE_MAX17047) ||
(chip->chip_type == MAXIM_DEVICE_TYPE_MAX17050))) {
max17042_override_por(map, MAX17042_EmptyTempCo, max17042_override_por(map, MAX17042_EmptyTempCo,
config->empty_tempco); config->empty_tempco);
max17042_override_por(map, MAX17042_K_empty0, max17042_override_por(map, MAX17042_K_empty0,
...@@ -929,7 +937,8 @@ max17042_get_default_pdata(struct max17042_chip *chip) ...@@ -929,7 +937,8 @@ max17042_get_default_pdata(struct max17042_chip *chip)
if (!pdata) if (!pdata)
return pdata; return pdata;
if (chip->chip_type != MAXIM_DEVICE_TYPE_MAX17042) { if ((chip->chip_type == MAXIM_DEVICE_TYPE_MAX17047) ||
(chip->chip_type == MAXIM_DEVICE_TYPE_MAX17050)) {
pdata->init_data = max17047_default_pdata_init_regs; pdata->init_data = max17047_default_pdata_init_regs;
pdata->num_init_data = pdata->num_init_data =
ARRAY_SIZE(max17047_default_pdata_init_regs); ARRAY_SIZE(max17047_default_pdata_init_regs);
...@@ -1167,6 +1176,7 @@ static const struct of_device_id max17042_dt_match[] = { ...@@ -1167,6 +1176,7 @@ static const struct of_device_id max17042_dt_match[] = {
{ .compatible = "maxim,max17042" }, { .compatible = "maxim,max17042" },
{ .compatible = "maxim,max17047" }, { .compatible = "maxim,max17047" },
{ .compatible = "maxim,max17050" }, { .compatible = "maxim,max17050" },
{ .compatible = "maxim,max17055" },
{ }, { },
}; };
MODULE_DEVICE_TABLE(of, max17042_dt_match); MODULE_DEVICE_TABLE(of, max17042_dt_match);
...@@ -1176,6 +1186,7 @@ static const struct i2c_device_id max17042_id[] = { ...@@ -1176,6 +1186,7 @@ static const struct i2c_device_id max17042_id[] = {
{ "max17042", MAXIM_DEVICE_TYPE_MAX17042 }, { "max17042", MAXIM_DEVICE_TYPE_MAX17042 },
{ "max17047", MAXIM_DEVICE_TYPE_MAX17047 }, { "max17047", MAXIM_DEVICE_TYPE_MAX17047 },
{ "max17050", MAXIM_DEVICE_TYPE_MAX17050 }, { "max17050", MAXIM_DEVICE_TYPE_MAX17050 },
{ "max17055", MAXIM_DEVICE_TYPE_MAX17055 },
{ } { }
}; };
MODULE_DEVICE_TABLE(i2c, max17042_id); MODULE_DEVICE_TABLE(i2c, max17042_id);
......
...@@ -105,11 +105,56 @@ enum max17042_register { ...@@ -105,11 +105,56 @@ enum max17042_register {
MAX17042_OCV = 0xEE, MAX17042_OCV = 0xEE,
MAX17042_OCVInternal = 0xFB, MAX17042_OCVInternal = 0xFB, /* MAX17055 VFOCV */
MAX17042_VFSOC = 0xFF, MAX17042_VFSOC = 0xFF,
}; };
enum max17055_register {
MAX17055_QRes = 0x0C,
MAX17055_TTF = 0x20,
MAX17055_V_empty = 0x3A,
MAX17055_TIMER = 0x3E,
MAX17055_USER_MEM = 0x40,
MAX17055_RGAIN = 0x42,
MAX17055_ConvgCfg = 0x49,
MAX17055_VFRemCap = 0x4A,
MAX17055_STATUS2 = 0xB0,
MAX17055_POWER = 0xB1,
MAX17055_ID = 0xB2,
MAX17055_AvgPower = 0xB3,
MAX17055_IAlrtTh = 0xB4,
MAX17055_TTFCfg = 0xB5,
MAX17055_CVMixCap = 0xB6,
MAX17055_CVHalfTime = 0xB7,
MAX17055_CGTempCo = 0xB8,
MAX17055_Curve = 0xB9,
MAX17055_HibCfg = 0xBA,
MAX17055_Config2 = 0xBB,
MAX17055_VRipple = 0xBC,
MAX17055_RippleCfg = 0xBD,
MAX17055_TimerH = 0xBE,
MAX17055_RSense = 0xD0,
MAX17055_ScOcvLim = 0xD1,
MAX17055_SOCHold = 0xD3,
MAX17055_MaxPeakPwr = 0xD4,
MAX17055_SusPeakPwr = 0xD5,
MAX17055_PackResistance = 0xD6,
MAX17055_SysResistance = 0xD7,
MAX17055_MinSysV = 0xD8,
MAX17055_MPPCurrent = 0xD9,
MAX17055_SPPCurrent = 0xDA,
MAX17055_ModelCfg = 0xDB,
MAX17055_AtQResidual = 0xDC,
MAX17055_AtTTE = 0xDD,
MAX17055_AtAvSOC = 0xDE,
MAX17055_AtAvCap = 0xDF,
};
/* Registers specific to max17047/50 */ /* Registers specific to max17047/50 */
enum max17047_register { enum max17047_register {
MAX17047_QRTbl00 = 0x12, MAX17047_QRTbl00 = 0x12,
...@@ -125,6 +170,7 @@ enum max170xx_chip_type { ...@@ -125,6 +170,7 @@ enum max170xx_chip_type {
MAXIM_DEVICE_TYPE_MAX17042, MAXIM_DEVICE_TYPE_MAX17042,
MAXIM_DEVICE_TYPE_MAX17047, MAXIM_DEVICE_TYPE_MAX17047,
MAXIM_DEVICE_TYPE_MAX17050, MAXIM_DEVICE_TYPE_MAX17050,
MAXIM_DEVICE_TYPE_MAX17055,
MAXIM_DEVICE_TYPE_NUM MAXIM_DEVICE_TYPE_NUM
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment