Merge "platform: msm_shared: Avoid the integer overflow in bootloader"
diff --git a/target/init.c b/target/init.c
index 6f57540..7a66623 100644
--- a/target/init.c
+++ b/target/init.c
@@ -54,6 +54,11 @@
#define BATTERY_MIN_VOLTAGE 3200000 //uv
#define PMIC_SLAVE_ID 0x20000
#define BAT_IF_BAT_PRES_STATUS 0x1208
+#define BAT_IF_INT_RT_STS 0x1210
+#define BATT_INFO_VBATT_LSB 0x41A0
+#define BATT_INFO_VBATT_MSB 0x41A1
+#define BATT_VOLTAGE_NUMR 122070
+#define BATT_VOLTAGE_DENR 1000
#if VERIFIED_BOOT
static int vb_version = INVALID;
@@ -417,6 +422,15 @@
BAT_IF_BAT_PRES_STATUS);
}
break;
+ case PMIC_IS_PM660:
+ value = REG_READ(BAT_IF_INT_RT_STS);
+ /* If BAT_TERMINAL_MISSING_RT_STS BIT(5) or BAT_THERM_OR_ID_MISSING_RT_STS BIT(4)
+ are set, battery is not present. */
+ if (value & (BIT(5) | BIT(4)))
+ return false;
+ else
+ return true;
+ break;
default:
dprintf(CRITICAL, "ERROR: Couldn't get the pmic type\n");
break;
@@ -434,6 +448,8 @@
{
uint32_t pmic;
uint32_t vbat = 0;
+ uint8_t buff[2];
+ uint16_t temp;
pmic = target_get_pmic();
@@ -456,6 +472,13 @@
}
}
break;
+ case PMIC_IS_PM660:
+ buff[0] = REG_READ(BATT_INFO_VBATT_LSB);
+ buff[1] = REG_READ(BATT_INFO_VBATT_MSB);
+ temp = buff[1] << 8 | buff[0];
+ /* {MSB,LSB} to decode the voltage level, refer register description. */
+ vbat = (((uint32_t)temp)*BATT_VOLTAGE_NUMR/BATT_VOLTAGE_DENR);
+ break;
default:
dprintf(CRITICAL, "ERROR: Couldn't get the pmic type\n");
break;
diff --git a/target/msm8909/init.c b/target/msm8909/init.c
index c5558b9..268bdab 100644
--- a/target/msm8909/init.c
+++ b/target/msm8909/init.c
@@ -826,5 +826,8 @@
uint32_t target_get_pmic()
{
- return PMIC_IS_PM8909;
+ if (board_hardware_subtype() == HW_PLATFORM_SUBTYPE_8909_PM660)
+ return PMIC_IS_PM660;
+ else
+ return PMIC_IS_PM8909;
}