summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXin Xie <xxie@nvidia.com>2013-06-03 18:23:46 -0700
committerRiham Haidar <rhaidar@nvidia.com>2013-06-12 18:51:48 -0700
commit6b4edf8cc448f0b3f65e718bcc248d0f2d205c39 (patch)
treeaed179999096e2874a457c37bb55d0a4b065faa5
parent65198caacee0f8a273e80abeeadde496330e3c3f (diff)
arm: tegra: pluto: enable INA230/INA231/HPA01112 current sensing
Note: HPA01112, INA230 and INA231 are similar devices and using the same driver. This patch will set correct calibration for the INA230 on Pluto platform based on the battery in-serial resistor value and max battery current. After this patch will can read back battery current and power correctly using the INA230. This patch also leave comment on how to enable the over-current(OC) throttling using the INA230 device. It is not enabled on the Pluto platform currently because MAX77665 is used for the OC throttling. bug 1298931 Change-Id: I37f40e0d3a9ca14314af4f7ee5a5007c5665581f Signed-off-by: Xin Xie <xxie@nvidia.com> Reviewed-on: http://git-master/r/235214 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
-rw-r--r--arch/arm/mach-tegra/board-pluto-powermon.c63
-rw-r--r--include/linux/platform_data/ina230.h1
2 files changed, 53 insertions, 11 deletions
diff --git a/arch/arm/mach-tegra/board-pluto-powermon.c b/arch/arm/mach-tegra/board-pluto-powermon.c
index 06b984d66ffc..981a956a4161 100644
--- a/arch/arm/mach-tegra/board-pluto-powermon.c
+++ b/arch/arm/mach-tegra/board-pluto-powermon.c
@@ -18,7 +18,6 @@
*/
#include <linux/i2c.h>
-#include <linux/ina219.h>
#include <linux/platform_data/ina230.h>
#include <linux/i2c/pca954x.h>
@@ -34,6 +33,7 @@
#define PLUTO_POWER_REWORKED_CONFIG 0x10
enum {
+ PM_VDD_CELL,
UNUSED_RAIL,
};
@@ -59,8 +59,49 @@ enum {
VDDIO_1V8_BB,
};
-static struct ina219_platform_data power_mon_info_0[] = {
- /* All unused INA219 devices use below data*/
+static struct ina230_platform_data power_mon_info_0[] = {
+ [PM_VDD_CELL] = {
+ /*
+ * Calibration data is calculated by:
+ * Imax = 6A (max peak current from battery)
+ * Current_LSB = Imax / 2^15
+ * = 0.000183
+ * ~= 0.0002(A per bit)
+ *
+ * Rshunt (on Pluto) = 0.01(Ohm)
+ * cal = 0.00512 / (Current_LSB * Rshunt)
+ * = 0.00512 / (0.0002 * 0.01)
+ * = 2560
+ */
+ .calibration_data = 2560,
+ .rail_name = "PM_VDD_CELL",
+ /*
+ * Current_LSB is 0.0002A per bit (0.2mA per bit), and we use mA
+ * as display as unit:
+ * current_lsb = 0.2
+ * power_lsb = current_lsb * POWER_LSB_TO_CURRENT_LSB_RATIO
+ * = 0.2 * 25 = 5
+ *
+ */
+ .divisor = POWER_LSB_TO_CURRENT_LSB_RATIO,
+ .power_lsb = 5,
+ .precision_multiplier = 1,
+ /*
+ * this value specify the battery in-serial resistor value in
+ * the unit of mOhm.
+ */
+ .resistor = 10,
+ .shunt_polarity_inverted = 1,
+ /*
+ * INA230's alert pin can be used to generate the OC throttling
+ * signal to AP. To do so set the 'current_threshold' to a
+ * non-zero value in the unit of mA; set it to 0 will disable
+ * the alert pin generating OC
+ * signal.
+ */
+ .current_threshold = 0,
+ },
+ /* All unused HPA01112 devices use below data*/
[UNUSED_RAIL] = {
.calibration_data = 0x369c,
.power_lsb = 3.051979018 * PRECISION_MULTIPLIER_PLUTO,
@@ -232,27 +273,27 @@ enum {
INA_I2C_2_2_ADDR_4C,
};
-static struct i2c_board_info pluto_i2c2_0_ina219_board_info[] = {
+static struct i2c_board_info pluto_i2c2_0_ina230_board_info[] = {
[INA_I2C_2_0_ADDR_40] = {
- I2C_BOARD_INFO("ina219", 0x40),
- .platform_data = &power_mon_info_0[UNUSED_RAIL],
+ I2C_BOARD_INFO("ina230", 0x40),
+ .platform_data = &power_mon_info_0[PM_VDD_CELL],
.irq = -1,
},
[INA_I2C_2_0_ADDR_41] = {
- I2C_BOARD_INFO("ina219", 0x41),
+ I2C_BOARD_INFO("ina230", 0x41),
.platform_data = &power_mon_info_0[UNUSED_RAIL],
.irq = -1,
},
[INA_I2C_2_0_ADDR_42] = {
- I2C_BOARD_INFO("ina219", 0x42),
+ I2C_BOARD_INFO("ina230", 0x42),
.platform_data = &power_mon_info_0[UNUSED_RAIL],
.irq = -1,
},
[INA_I2C_2_0_ADDR_43] = {
- I2C_BOARD_INFO("ina219", 0x43),
+ I2C_BOARD_INFO("ina230", 0x43),
.platform_data = &power_mon_info_0[UNUSED_RAIL],
.irq = -1,
},
@@ -434,8 +475,8 @@ int __init pluto_pmon_init(void)
ARRAY_SIZE(pluto_i2c2_board_info));
i2c_register_board_info(PCA954x_I2C_BUS0,
- pluto_i2c2_0_ina219_board_info,
- ARRAY_SIZE(pluto_i2c2_0_ina219_board_info));
+ pluto_i2c2_0_ina230_board_info,
+ ARRAY_SIZE(pluto_i2c2_0_ina230_board_info));
i2c_register_board_info(PCA954x_I2C_BUS1,
pluto_i2c2_1_ina230_board_info,
diff --git a/include/linux/platform_data/ina230.h b/include/linux/platform_data/ina230.h
index b5d4f8fa9ec8..ebd502f23b44 100644
--- a/include/linux/platform_data/ina230.h
+++ b/include/linux/platform_data/ina230.h
@@ -24,6 +24,7 @@
#define INA3221_RAIL_NAME_SIZE 32
+#define POWER_LSB_TO_CURRENT_LSB_RATIO 25
struct ina230_platform_data {
const char rail_name[INA3221_RAIL_NAME_SIZE];
s32 current_threshold;