Commit 17825ff6 authored by Dragos Bogdan's avatar Dragos Bogdan Committed by Sebastian Reichel

power: supply: ltc2941-battery-gauge: Add LTC2944 support

LTC2944 is compatible with LTC2943, but uses different
voltage and current computing constants.
Signed-off-by: default avatarDragos Bogdan <dragos.bogdan@analog.com>
Signed-off-by: default avatarLadislav Michl <ladis@linux-mips.org>
Tested-by: default avatarDragos Bogdan <dragos.bogdan@analog.com>
Acked-by: default avatarRob Herring <robh@kernel.org>
Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.co.uk>
parent a65df832
binding for LTC2941, LTC2942 and LTC2943 battery gauges binding for LTC2941, LTC2942, LTC2943 and LTC2944 battery gauges
All chips measure battery capacity. All chips measure battery capacity.
The LTC2942 is pin compatible with the LTC2941, it adds voltage and The LTC2942 is pin compatible with the LTC2941, it adds voltage and
temperature monitoring, and is runtime detected. LTC2943 is software temperature monitoring, and is runtime detected. LTC2943 and LTC2944
compatible, uses a slightly different conversion formula for the is software compatible, uses a slightly different conversion formula
charge counter and adds voltage, current and temperature monitoring. for the charge counter and adds voltage, current and temperature monitoring.
Required properties: Required properties:
- compatible: Should contain "lltc,ltc2941", "lltc,ltc2942" or "lltc,ltc2943" - compatible: Should contain "lltc,ltc2941", "lltc,ltc2942", "lltc,ltc2943"
which also indicates the type of I2C chip attached. or "lltc,ltc2944" which also indicates the type of I2C chip attached.
- reg: The 7-bit I2C address. - reg: The 7-bit I2C address.
- lltc,resistor-sense: The sense resistor value in milli-ohms. Can be a 32-bit - lltc,resistor-sense: The sense resistor value in milli-ohms. Can be a 32-bit
negative value when the battery has been connected to the wrong end of the negative value when the battery has been connected to the wrong end of the
......
/* /*
* I2C client/driver for the Linear Technology LTC2941, LTC2942 and LTC2943 * I2C client/driver for the Linear Technology LTC2941, LTC2942, LTC2943
* Battery Gas Gauge IC * and LTC2944 Battery Gas Gauge IC
* *
* Copyright (C) 2014 Topic Embedded Systems * Copyright (C) 2014 Topic Embedded Systems
* *
...@@ -48,6 +48,7 @@ enum ltc294x_id { ...@@ -48,6 +48,7 @@ enum ltc294x_id {
LTC2941_ID, LTC2941_ID,
LTC2942_ID, LTC2942_ID,
LTC2943_ID, LTC2943_ID,
LTC2944_ID,
}; };
#define LTC2941_REG_STATUS_CHIP_ID BIT(7) #define LTC2941_REG_STATUS_CHIP_ID BIT(7)
...@@ -153,7 +154,8 @@ static int ltc294x_reset(const struct ltc294x_info *info, int prescaler_exp) ...@@ -153,7 +154,8 @@ static int ltc294x_reset(const struct ltc294x_info *info, int prescaler_exp)
case LTC2942_ID: /* 2942 measures every 2 sec */ case LTC2942_ID: /* 2942 measures every 2 sec */
control |= LTC2942_REG_CONTROL_MODE_SCAN; control |= LTC2942_REG_CONTROL_MODE_SCAN;
break; break;
case LTC2943_ID: /* 2943 measures every 10 sec */ case LTC2943_ID:
case LTC2944_ID: /* 2943 and 2944 measure every 10 sec */
control |= LTC2943_REG_CONTROL_MODE_SCAN; control |= LTC2943_REG_CONTROL_MODE_SCAN;
break; break;
default: default:
...@@ -269,6 +271,11 @@ static int ltc294x_get_voltage(const struct ltc294x_info *info, int *val) ...@@ -269,6 +271,11 @@ static int ltc294x_get_voltage(const struct ltc294x_info *info, int *val)
value /= 0xFFFF; value /= 0xFFFF;
value *= 1000 / 2; value *= 1000 / 2;
break; break;
case LTC2944_ID:
value *= 70800 / 5*4;
value /= 0xFFFF;
value *= 1000 * 5/4;
break;
default: default:
value *= 6000 * 10; value *= 6000 * 10;
value /= 0xFFFF; value /= 0xFFFF;
...@@ -289,10 +296,14 @@ static int ltc294x_get_current(const struct ltc294x_info *info, int *val) ...@@ -289,10 +296,14 @@ static int ltc294x_get_current(const struct ltc294x_info *info, int *val)
LTC2943_REG_CURRENT_MSB, &datar[0], 2); LTC2943_REG_CURRENT_MSB, &datar[0], 2);
value = (datar[0] << 8) | datar[1]; value = (datar[0] << 8) | datar[1];
value -= 0x7FFF; value -= 0x7FFF;
if (info->id == LTC2944_ID)
value *= 64000;
else
value *= 60000;
/* Value is in range -32k..+32k, r_sense is usually 10..50 mOhm, /* Value is in range -32k..+32k, r_sense is usually 10..50 mOhm,
* the formula below keeps everything in s32 range while preserving * the formula below keeps everything in s32 range while preserving
* enough digits */ * enough digits */
*val = 1000 * ((60000 * value) / (info->r_sense * 0x7FFF)); /* in uA */ *val = 1000 * (value / (info->r_sense * 0x7FFF)); /* in uA */
return ret; return ret;
} }
...@@ -470,6 +481,7 @@ static int ltc294x_i2c_probe(struct i2c_client *client, ...@@ -470,6 +481,7 @@ static int ltc294x_i2c_probe(struct i2c_client *client,
info->supply_desc.type = POWER_SUPPLY_TYPE_BATTERY; info->supply_desc.type = POWER_SUPPLY_TYPE_BATTERY;
info->supply_desc.properties = ltc294x_properties; info->supply_desc.properties = ltc294x_properties;
switch (info->id) { switch (info->id) {
case LTC2944_ID:
case LTC2943_ID: case LTC2943_ID:
info->supply_desc.num_properties = info->supply_desc.num_properties =
ARRAY_SIZE(ltc294x_properties); ARRAY_SIZE(ltc294x_properties);
...@@ -543,6 +555,7 @@ static const struct i2c_device_id ltc294x_i2c_id[] = { ...@@ -543,6 +555,7 @@ static const struct i2c_device_id ltc294x_i2c_id[] = {
{ "ltc2941", LTC2941_ID, }, { "ltc2941", LTC2941_ID, },
{ "ltc2942", LTC2942_ID, }, { "ltc2942", LTC2942_ID, },
{ "ltc2943", LTC2943_ID, }, { "ltc2943", LTC2943_ID, },
{ "ltc2944", LTC2944_ID, },
{ }, { },
}; };
MODULE_DEVICE_TABLE(i2c, ltc294x_i2c_id); MODULE_DEVICE_TABLE(i2c, ltc294x_i2c_id);
...@@ -560,6 +573,10 @@ static const struct of_device_id ltc294x_i2c_of_match[] = { ...@@ -560,6 +573,10 @@ static const struct of_device_id ltc294x_i2c_of_match[] = {
.compatible = "lltc,ltc2943", .compatible = "lltc,ltc2943",
.data = (void *)LTC2943_ID, .data = (void *)LTC2943_ID,
}, },
{
.compatible = "lltc,ltc2944",
.data = (void *)LTC2944_ID,
},
{ }, { },
}; };
MODULE_DEVICE_TABLE(of, ltc294x_i2c_of_match); MODULE_DEVICE_TABLE(of, ltc294x_i2c_of_match);
...@@ -578,5 +595,5 @@ module_i2c_driver(ltc294x_driver); ...@@ -578,5 +595,5 @@ module_i2c_driver(ltc294x_driver);
MODULE_AUTHOR("Auryn Verwegen, Topic Embedded Systems"); MODULE_AUTHOR("Auryn Verwegen, Topic Embedded Systems");
MODULE_AUTHOR("Mike Looijmans, Topic Embedded Products"); MODULE_AUTHOR("Mike Looijmans, Topic Embedded Products");
MODULE_DESCRIPTION("LTC2941/LTC2942/LTC2943 Battery Gas Gauge IC driver"); MODULE_DESCRIPTION("LTC2941/LTC2942/LTC2943/LTC2944 Battery Gas Gauge IC driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
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