max77729_pmic: add adc conversion function for THMIO_MUX_USB_TEMP
Bug: 160737498
Signed-off-by: Wasb Liu <[email protected]>
Change-Id: I99aca1ba97cabec0e8fa426d02e9f83cf5394092
diff --git a/max77729_pmic.c b/max77729_pmic.c
index 433da81..47987d7 100644
--- a/max77729_pmic.c
+++ b/max77729_pmic.c
@@ -419,6 +419,12 @@
return 0;
}
+#define NTC_CURVE_THRESHOLD 185
+#define NTC_CURVE_1_BASE 960
+#define NTC_CURVE_1_SHIFT 2
+#define NTC_CURVE_2_BASE 730
+#define NTC_CURVE_2_SHIFT 3
+
static int max77759_read_thm(struct max77729_pmic_data *data, int mux,
unsigned int *value)
{
@@ -465,8 +471,20 @@
ret = max_m5_reg_read(data->fg_i2c_client, MAX77759_FG_AIN0, &ain0);
pr_debug("%s: AIN0=%d (%d)\n", __func__, ain0, ret);
- /* AIN0 is ratiometric on THM, 0xffff = 100%, lsb is 2^-16 */
- *value = (100000 * (unsigned long)(ain0)) / (0x10000 - ain0);
+ if (mux == THMIO_MUX_USB_TEMP) {
+ /* convert form 1.8V to 2.4V and get higher 10 bits */
+ const unsigned int conv_adc = ((ain0 * 1800) / 2400) >> 6;
+
+ /* Temp = (rawadc < 185)? (960-rawadc/4) : (730-rawadc/8) */
+ /* unit: 0.1 degree C */
+ if (conv_adc < NTC_CURVE_THRESHOLD)
+ *value = NTC_CURVE_1_BASE - ((conv_adc * 10) >> NTC_CURVE_1_SHIFT);
+ else
+ *value = NTC_CURVE_2_BASE - ((conv_adc * 10) >> NTC_CURVE_2_SHIFT);
+ } else {
+ /* AIN0 is ratiometric on THM, 0xffff = 100%, lsb is 2^-16 */
+ *value = (100000 * (unsigned long)ain0) / (0x10000 - ain0);
+ }
/* restore THMIO_MUX */
tmp = max77729_pmic_wr8(data, MAX77759_PMIC_CONTROL_FG, pmic_ctrl);
diff --git a/max77759.h b/max77759.h
index 96a8a17..d5e9a38 100644
--- a/max77759.h
+++ b/max77759.h
@@ -68,5 +68,6 @@
#define THMIO_MUX_USB_TEMP 1
#define THMIO_MUX_BATT_ID 2
+int max77759_read_usb_temp(struct i2c_client *client, int *temp);
#endif