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

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
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -282,6 +282,8 @@ static int max17042_get_property(struct power_supply *psy,
	case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
		if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042)
			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
			ret = regmap_read(map, MAX17047_V_empty, &data);
		if (ret < 0)
@@ -627,7 +629,8 @@ static void max17042_write_config_regs(struct max17042_chip *chip)
			config->filter_cfg);
	regmap_write(map, MAX17042_RelaxCFG, config->relax_cfg);
	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,
						config->full_soc_thresh);
}
@@ -758,6 +761,8 @@ static inline void max17042_override_por_values(struct max17042_chip *chip)

	if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042)
		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
		max17042_override_por(map, MAX17047_V_empty, config->vempty);
	max17042_override_por(map, MAX17042_TempNom, config->temp_nom);
@@ -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_RCOMP0, config->rcomp0);
	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,
						config->empty_tempco);
		max17042_override_por(map, MAX17042_K_empty0,
@@ -929,7 +937,8 @@ max17042_get_default_pdata(struct max17042_chip *chip)
	if (!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->num_init_data =
			ARRAY_SIZE(max17047_default_pdata_init_regs);
@@ -1167,6 +1176,7 @@ static const struct of_device_id max17042_dt_match[] = {
	{ .compatible = "maxim,max17042" },
	{ .compatible = "maxim,max17047" },
	{ .compatible = "maxim,max17050" },
	{ .compatible = "maxim,max17055" },
	{ },
};
MODULE_DEVICE_TABLE(of, max17042_dt_match);
@@ -1176,6 +1186,7 @@ static const struct i2c_device_id max17042_id[] = {
	{ "max17042", MAXIM_DEVICE_TYPE_MAX17042 },
	{ "max17047", MAXIM_DEVICE_TYPE_MAX17047 },
	{ "max17050", MAXIM_DEVICE_TYPE_MAX17050 },
	{ "max17055", MAXIM_DEVICE_TYPE_MAX17055 },
	{ }
};
MODULE_DEVICE_TABLE(i2c, max17042_id);
+47 −1
Original line number Diff line number Diff line
@@ -105,11 +105,56 @@ enum max17042_register {

	MAX17042_OCV		= 0xEE,

	MAX17042_OCVInternal	= 0xFB,
	MAX17042_OCVInternal	= 0xFB,  /* MAX17055 VFOCV */

	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 */
enum max17047_register {
	MAX17047_QRTbl00	= 0x12,
@@ -125,6 +170,7 @@ enum max170xx_chip_type {
	MAXIM_DEVICE_TYPE_MAX17042,
	MAXIM_DEVICE_TYPE_MAX17047,
	MAXIM_DEVICE_TYPE_MAX17050,
	MAXIM_DEVICE_TYPE_MAX17055,

	MAXIM_DEVICE_TYPE_NUM
};