diff mbox

[v5,3/3] power: supply: ltc2941-battery-gauge: Add LTC2944 support

Message ID 20170712011227.jpc5zhotxg4iqjlx@lenoch (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Ladislav Michl July 12, 2017, 1:12 a.m. UTC
From: Dragos Bogdan <dragos.bogdan@analog.com>

LTC2944 is compatible with LTC2943, but used different
voltage and current computing constants.

Signed-off-by: Dragos Bogdan <dragos.bogdan@analog.com>
[ladis: fix voltage conversion, rebase on LTC2942 patchset]
Signed-off-by: Ladislav Michl <ladis@linux-mips.org>
---
 Dragos, LTC2944 datasheet states 500K full range temperature,
 but the rest of paragraph is the same as in LTC2943 datasheet
 (LTC2943 is using 510K full range). As Linear was recently accuired
 by Analog, please ask for the truth there, so we can write it
 into code comment. Thank you!
 http://cds.linear.com/docs/en/datasheet/2943fa.pdf
 http://cds.linear.com/docs/en/datasheet/2944f.pdf
 both on pdf page 15

 Changes:
 - v2: fixed voltage and current conversion
 - v3: skipped
 - v4: skipped
 - v5: fixed voltage conversion overflow, rebased on LTC2942 patchset

 .../devicetree/bindings/power/supply/ltc2941.txt   | 12 +++++------
 drivers/power/supply/ltc2941-battery-gauge.c       | 24 +++++++++++++++++-----
 2 files changed, 25 insertions(+), 11 deletions(-)

Comments

Dragos Bogdan July 14, 2017, 2:55 p.m. UTC | #1
On 07/12/2017 04:13 AM, Ladislav Michl wrote:
> From: Dragos Bogdan <dragos.bogdan@analog.com>
>
> LTC2944 is compatible with LTC2943, but used different
> voltage and current computing constants.
>
> Signed-off-by: Dragos Bogdan <dragos.bogdan@analog.com>
> [ladis: fix voltage conversion, rebase on LTC2942 patchset]
> Signed-off-by: Ladislav Michl <ladis@linux-mips.org>
> ---
>  Dragos, LTC2944 datasheet states 500K full range temperature,
>  but the rest of paragraph is the same as in LTC2943 datasheet
>  (LTC2943 is using 510K full range). As Linear was recently accuired
>  by Analog, please ask for the truth there, so we can write it
>  into code comment. Thank you!
>  http://cds.linear.com/docs/en/datasheet/2943fa.pdf
>  http://cds.linear.com/docs/en/datasheet/2944f.pdf
>  both on pdf page 15

The Full-Scale Temperature is 510 K (as it is displayed in the Electrical Characteristics section)
for both LTC2943 and LTC2944 parts, so the same computing formula should be used.

For LTC2944, the 500 K value used in the Applications Information section is an error that will be
fixed in the next version of the datasheet.

>  Changes:
>  - v2: fixed voltage and current conversion
>  - v3: skipped
>  - v4: skipped
>  - v5: fixed voltage conversion overflow, rebased on LTC2942 patchset
>
>  .../devicetree/bindings/power/supply/ltc2941.txt   | 12 +++++------
>  drivers/power/supply/ltc2941-battery-gauge.c       | 24 +++++++++++++++++-----
>  2 files changed, 25 insertions(+), 11 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/power/supply/ltc2941.txt b/Documentation/devicetree/bindings/power/supply/ltc2941.txt
> index 8ec10366295d..3b9ba147b041 100644
> --- a/Documentation/devicetree/bindings/power/supply/ltc2941.txt
> +++ b/Documentation/devicetree/bindings/power/supply/ltc2941.txt
> @@ -1,14 +1,14 @@
> -binding for LTC2941, LTC2942 and LTC2943 battery gauges
> +binding for LTC2941, LTC2942, LTC2943 and LTC2944 battery gauges
>  
>  All chips measure battery capacity.
>  The LTC2942 is pin compatible with the LTC2941, it adds voltage and
> -temperature monitoring, and is runtime detected. LTC2943 is software
> -compatible, uses a slightly different conversion formula for the
> -charge counter and adds voltage, current and temperature monitoring.
> +temperature monitoring, and is runtime detected. LTC2943 and LTC2944
> +is software compatible, uses a slightly different conversion formula
> +for the charge counter and adds voltage, current and temperature monitoring.
>  
>  Required properties:
> -- compatible: Should contain "lltc,ltc2941", "lltc,ltc2942" or "lltc,ltc2943"
> -    which also indicates the type of I2C chip attached.
> +- compatible: Should contain "lltc,ltc2941", "lltc,ltc2942", "lltc,ltc2943"
> +    or "lltc,ltc2944" which also indicates the type of I2C chip attached.
>  - reg: The 7-bit I2C address.
>  - 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
> diff --git a/drivers/power/supply/ltc2941-battery-gauge.c b/drivers/power/supply/ltc2941-battery-gauge.c
> index f67fa8d8009e..b257ec943041 100644
> --- a/drivers/power/supply/ltc2941-battery-gauge.c
> +++ b/drivers/power/supply/ltc2941-battery-gauge.c
> @@ -1,6 +1,6 @@
>  /*
> - * I2C client/driver for the Linear Technology LTC2941, LTC2942 and LTC2943
> - * Battery Gas Gauge IC
> + * I2C client/driver for the Linear Technology LTC2941, LTC2942, LTC2943
> + * and LTC2944 Battery Gas Gauge IC
>   *
>   * Copyright (C) 2014 Topic Embedded Systems
>   *
> @@ -154,7 +154,8 @@ static int ltc294x_reset(const struct ltc294x_info *info, int prescaler_exp)
>  	case LTC2942_ID:	/* 2942 measures every 2 sec */
>  		control |= LTC2942_REG_CONTROL_MODE_SCAN;
>  		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;
>  		break;
>  	default:
> @@ -270,6 +271,10 @@ static int ltc294x_get_voltage(const struct ltc294x_info *info, int *val)
>  		value /= 0xFFFF;
>  		value *= 1000 / 2;
>  		break;
> +	case LTC2944_ID:
> +		value *= 70800 / 5*4;
> +		value /= 0xFFFF;
> +		value *= 1000 * 5/4;

A break is required here.

>  	default:
>  		value *= 6000 * 10;
>  		value /= 0xFFFF;
> @@ -290,10 +295,14 @@ static int ltc294x_get_current(const struct ltc294x_info *info, int *val)
>  		LTC2943_REG_CURRENT_MSB, &datar[0], 2);
>  	value = (datar[0] << 8) | datar[1];
>  	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,
>  	 * the formula below keeps everything in s32 range while preserving
>  	 * enough digits */
> -	*val = 1000 * ((60000 * value) / (info->r_sense * 0x7FFF)); /* in uA */
> +	*val = 1000 * (value / (info->r_sense * 0x7FFF)); /* in uA */
>  	return ret;
>  }
>  
> @@ -545,6 +554,7 @@ static const struct i2c_device_id ltc294x_i2c_id[] = {
>  	{ "ltc2941", LTC2941_ID, },
>  	{ "ltc2942", LTC2942_ID, },
>  	{ "ltc2943", LTC2943_ID, },
> +	{ "ltc2944", LTC2944_ID, },
>  	{ },
>  };
>  MODULE_DEVICE_TABLE(i2c, ltc294x_i2c_id);
> @@ -562,6 +572,10 @@ static const struct of_device_id ltc294x_i2c_of_match[] = {
>  		.compatible = "lltc,ltc2943",
>  		.data = (void *)LTC2943_ID,
>  	},
> +	{
> +		.compatible = "lltc,ltc2944",
> +		.data = (void *)LTC2944_ID,
> +	},
>  	{ },
>  };
>  MODULE_DEVICE_TABLE(of, ltc294x_i2c_of_match);
> @@ -580,5 +594,5 @@ module_i2c_driver(ltc294x_driver);
>  
>  MODULE_AUTHOR("Auryn Verwegen, Topic Embedded Systems");
>  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");
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/power/supply/ltc2941.txt b/Documentation/devicetree/bindings/power/supply/ltc2941.txt
index 8ec10366295d..3b9ba147b041 100644
--- a/Documentation/devicetree/bindings/power/supply/ltc2941.txt
+++ b/Documentation/devicetree/bindings/power/supply/ltc2941.txt
@@ -1,14 +1,14 @@ 
-binding for LTC2941, LTC2942 and LTC2943 battery gauges
+binding for LTC2941, LTC2942, LTC2943 and LTC2944 battery gauges
 
 All chips measure battery capacity.
 The LTC2942 is pin compatible with the LTC2941, it adds voltage and
-temperature monitoring, and is runtime detected. LTC2943 is software
-compatible, uses a slightly different conversion formula for the
-charge counter and adds voltage, current and temperature monitoring.
+temperature monitoring, and is runtime detected. LTC2943 and LTC2944
+is software compatible, uses a slightly different conversion formula
+for the charge counter and adds voltage, current and temperature monitoring.
 
 Required properties:
-- compatible: Should contain "lltc,ltc2941", "lltc,ltc2942" or "lltc,ltc2943"
-    which also indicates the type of I2C chip attached.
+- compatible: Should contain "lltc,ltc2941", "lltc,ltc2942", "lltc,ltc2943"
+    or "lltc,ltc2944" which also indicates the type of I2C chip attached.
 - reg: The 7-bit I2C address.
 - 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
diff --git a/drivers/power/supply/ltc2941-battery-gauge.c b/drivers/power/supply/ltc2941-battery-gauge.c
index f67fa8d8009e..b257ec943041 100644
--- a/drivers/power/supply/ltc2941-battery-gauge.c
+++ b/drivers/power/supply/ltc2941-battery-gauge.c
@@ -1,6 +1,6 @@ 
 /*
- * I2C client/driver for the Linear Technology LTC2941, LTC2942 and LTC2943
- * Battery Gas Gauge IC
+ * I2C client/driver for the Linear Technology LTC2941, LTC2942, LTC2943
+ * and LTC2944 Battery Gas Gauge IC
  *
  * Copyright (C) 2014 Topic Embedded Systems
  *
@@ -154,7 +154,8 @@  static int ltc294x_reset(const struct ltc294x_info *info, int prescaler_exp)
 	case LTC2942_ID:	/* 2942 measures every 2 sec */
 		control |= LTC2942_REG_CONTROL_MODE_SCAN;
 		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;
 		break;
 	default:
@@ -270,6 +271,10 @@  static int ltc294x_get_voltage(const struct ltc294x_info *info, int *val)
 		value /= 0xFFFF;
 		value *= 1000 / 2;
 		break;
+	case LTC2944_ID:
+		value *= 70800 / 5*4;
+		value /= 0xFFFF;
+		value *= 1000 * 5/4;
 	default:
 		value *= 6000 * 10;
 		value /= 0xFFFF;
@@ -290,10 +295,14 @@  static int ltc294x_get_current(const struct ltc294x_info *info, int *val)
 		LTC2943_REG_CURRENT_MSB, &datar[0], 2);
 	value = (datar[0] << 8) | datar[1];
 	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,
 	 * the formula below keeps everything in s32 range while preserving
 	 * enough digits */
-	*val = 1000 * ((60000 * value) / (info->r_sense * 0x7FFF)); /* in uA */
+	*val = 1000 * (value / (info->r_sense * 0x7FFF)); /* in uA */
 	return ret;
 }
 
@@ -545,6 +554,7 @@  static const struct i2c_device_id ltc294x_i2c_id[] = {
 	{ "ltc2941", LTC2941_ID, },
 	{ "ltc2942", LTC2942_ID, },
 	{ "ltc2943", LTC2943_ID, },
+	{ "ltc2944", LTC2944_ID, },
 	{ },
 };
 MODULE_DEVICE_TABLE(i2c, ltc294x_i2c_id);
@@ -562,6 +572,10 @@  static const struct of_device_id ltc294x_i2c_of_match[] = {
 		.compatible = "lltc,ltc2943",
 		.data = (void *)LTC2943_ID,
 	},
+	{
+		.compatible = "lltc,ltc2944",
+		.data = (void *)LTC2944_ID,
+	},
 	{ },
 };
 MODULE_DEVICE_TABLE(of, ltc294x_i2c_of_match);
@@ -580,5 +594,5 @@  module_i2c_driver(ltc294x_driver);
 
 MODULE_AUTHOR("Auryn Verwegen, Topic Embedded Systems");
 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");