summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Troast <ntroast@codeaurora.org>2016-08-25 10:59:21 -0700
committerNicholas Troast <ntroast@codeaurora.org>2016-09-27 19:55:54 -0700
commit9d4164b5e808c3d45a19ef803d5eaf0df0a4faf3 (patch)
tree5164f0487d2e7c61ed1cddb09f0d64933649bbac
parent654b1238efbf670034721649b9fd5ad5b4f0fad6 (diff)
qcom-charger: fg-util: add float decode function
Some SRAM registers are encoded using a floating point representation. Add a function to decode these registers into signed micro-unit integers. The exponent and mantissa are signed integers represented by two's complement, and the exponent value is offset by -9. This is a half float representation stored as: EEEEE MMMMMMMMMMM Where E are the exponent bits, and M are the mantissa bits. To decode this representation the following formula is applied: 2^(exponent - 9) * mantissa Change-Id: Id9f28a0eeb2a904aca41eb46d0215d80287e0b88 Signed-off-by: Nicholas Troast <ntroast@codeaurora.org>
-rw-r--r--drivers/power/qcom-charger/fg-core.h1
-rw-r--r--drivers/power/qcom-charger/fg-util.c20
2 files changed, 21 insertions, 0 deletions
diff --git a/drivers/power/qcom-charger/fg-core.h b/drivers/power/qcom-charger/fg-core.h
index 08ec7334737e..a609d8fcd400 100644
--- a/drivers/power/qcom-charger/fg-core.h
+++ b/drivers/power/qcom-charger/fg-core.h
@@ -252,4 +252,5 @@ extern int fg_ima_init(struct fg_chip *chip);
extern int fg_sram_debugfs_create(struct fg_chip *chip);
extern void fill_string(char *str, size_t str_len, u8 *buf, int buf_len);
extern int64_t twos_compliment_extend(int64_t val, int s_bit_pos);
+extern s64 fg_float_decode(u16 val);
#endif
diff --git a/drivers/power/qcom-charger/fg-util.c b/drivers/power/qcom-charger/fg-util.c
index 5f133d6f39c1..0d52fb5ba9b8 100644
--- a/drivers/power/qcom-charger/fg-util.c
+++ b/drivers/power/qcom-charger/fg-util.c
@@ -29,6 +29,26 @@ static struct fg_dbgfs dbgfs_data = {
},
};
+#define EXPONENT_SHIFT 11
+#define EXPONENT_OFFSET -9
+#define MANTISSA_SIGN_BIT 10
+#define MICRO_UNIT 1000000
+s64 fg_float_decode(u16 val)
+{
+ s8 exponent;
+ s32 mantissa;
+
+ /* mantissa bits are shifted out during sign extension */
+ exponent = ((s16)val >> EXPONENT_SHIFT) + EXPONENT_OFFSET;
+ /* exponent bits are shifted out during sign extension */
+ mantissa = sign_extend32(val, MANTISSA_SIGN_BIT) * MICRO_UNIT;
+
+ if (exponent < 0)
+ return (s64)mantissa >> -exponent;
+
+ return (s64)mantissa << exponent;
+}
+
void fill_string(char *str, size_t str_len, u8 *buf, int buf_len)
{
int pos = 0;