diff --git a/include/target.h b/include/target.h index 9d527a8fe..b482b2d85 100644 --- a/include/target.h +++ b/include/target.h @@ -91,4 +91,8 @@ bool target_build_variant_user(); uint32_t get_vibration_type(); #endif +uint32_t target_get_battery_voltage(); +bool target_battery_soc_ok(); +bool target_battery_is_present(); +uint32_t target_get_pmic(); #endif diff --git a/platform/msm_shared/smem.h b/platform/msm_shared/smem.h index 93737c44e..e264e4e89 100644 --- a/platform/msm_shared/smem.h +++ b/platform/msm_shared/smem.h @@ -136,6 +136,12 @@ typedef enum PMIC_IS_PM8019 = 3, PMIC_IS_PM8026 = 4, PMIC_IS_PM8110 = 5, + PMIC_IS_PM8916 = 11, + PMIC_IS_PM8909 = 13, + PMIC_IS_PMI8950 = 17, + PMIC_IS_PMI8994 = 10, + PMIC_IS_PMI8996 = 19, + } pm_model_type_bfly; struct smem_board_info_v3 { diff --git a/target/init.c b/target/init.c index 6eba00e9c..2ec443303 100644 --- a/target/init.c +++ b/target/init.c @@ -29,13 +29,25 @@ #include #include #if PON_VIB_SUPPORT -#include #include #include #endif +#include +#include +#include + +#if CHECK_BAT_VOLTAGE +#include +#endif + #define EXPAND(NAME) #NAME #define TARGET(NAME) EXPAND(NAME) + +#define BATTERY_MIN_VOLTAGE 3600000 //uv +#define PMIC_SLAVE_ID 0x20000 +#define BAT_IF_BAT_PRES_STATUS 0x1208 + /* * default implementations of these routines, if the target code * chooses not to implement. @@ -268,3 +280,91 @@ __WEAK bool target_build_variant_user() return false; #endif } + +__WEAK uint32_t target_get_pmic() +{ + return PMIC_IS_UNKNOWN; +} + +/* Check battery if it's exist */ +bool target_battery_is_present() +{ + bool batt_is_exist; + uint8_t value = 0; + uint32_t pmic; + + pmic = target_get_pmic(); + + switch(pmic) + { + case PMIC_IS_PM8909: + case PMIC_IS_PM8916: + case PMIC_IS_PM8941: + value = REG_READ(BAT_IF_BAT_PRES_STATUS); + break; + case PMIC_IS_PMI8950: + case PMIC_IS_PMI8994: + case PMIC_IS_PMI8996: + value = REG_READ(PMIC_SLAVE_ID| + BAT_IF_BAT_PRES_STATUS); + break; + default: + dprintf(CRITICAL, "ERROR: Couldn't get the pmic type\n"); + break; + } + + batt_is_exist = value >> 7; + + return batt_is_exist; + +} + +#if CHECK_BAT_VOLTAGE +/* Return battery voltage */ +uint32_t target_get_battery_voltage() +{ + uint32_t pmic; + uint32_t vbat = 0; + + pmic = target_get_pmic(); + + switch(pmic) + { + case PMIC_IS_PM8909: + case PMIC_IS_PM8916: + case PMIC_IS_PM8941: + vbat = pm8x41_get_batt_voltage(); //uv + break; + case PMIC_IS_PMI8950: + case PMIC_IS_PMI8994: + case PMIC_IS_PMI8996: + if (!pm_fg_usr_get_vbat(1, &vbat)) { + vbat = vbat*1000; //uv + } else { + dprintf(CRITICAL, "ERROR: Get battery voltage failed!!!\n"); + } + break; + default: + dprintf(CRITICAL, "ERROR: Couldn't get the pmic type\n"); + break; + } + + return vbat; +} + +/* Add safeguards such as refusing to flash if minimum battery levels + * are not present or be bypass if the device doesn't have a battery + */ +bool target_battery_soc_ok() +{ + if (!target_battery_is_present()) { + dprintf(INFO, "battery is not present\n"); + return true; + } + + if (target_get_battery_voltage() >= BATTERY_MIN_VOLTAGE) + return true; + + return false; +} +#endif diff --git a/target/msm8909/init.c b/target/msm8909/init.c index 23e19ebde..cbf1b3d11 100644 --- a/target/msm8909/init.c +++ b/target/msm8909/init.c @@ -49,6 +49,7 @@ #include #include #include +#include #if LONG_PRESS_POWER_ON #include @@ -690,3 +691,8 @@ uint32_t target_get_hlos_subtype() { return board_hlos_subtype(); } + +uint32_t target_get_pmic() +{ + return PMIC_IS_PM8909; +} diff --git a/target/msm8909/rules.mk b/target/msm8909/rules.mk index b3e20594e..508609f0c 100644 --- a/target/msm8909/rules.mk +++ b/target/msm8909/rules.mk @@ -22,6 +22,7 @@ MODULES += \ lib/ptable \ dev/gcdb/display \ dev/pmic/pm8x41 \ + dev/pmic/pmi8994 \ lib/libfdt DEFINES += \ diff --git a/target/msm8916/init.c b/target/msm8916/init.c index af4daf311..39f008be9 100644 --- a/target/msm8916/init.c +++ b/target/msm8916/init.c @@ -48,6 +48,7 @@ #include #include #include +#include #if LONG_PRESS_POWER_ON #include @@ -516,3 +517,8 @@ uint32_t target_get_hlos_subtype() { return board_hlos_subtype(); } + +uint32_t target_get_pmic() +{ + return PMIC_IS_PM8916; +} diff --git a/target/msm8916/rules.mk b/target/msm8916/rules.mk index 6acddefdf..1533102e7 100644 --- a/target/msm8916/rules.mk +++ b/target/msm8916/rules.mk @@ -21,6 +21,7 @@ MODULES += \ lib/ptable \ dev/pmic/pm8x41 \ lib/libfdt \ + dev/pmic/pmi8994 \ dev/gcdb/display DEFINES += \ diff --git a/target/msm8952/init.c b/target/msm8952/init.c index 27d74709a..f87828529 100644 --- a/target/msm8952/init.c +++ b/target/msm8952/init.c @@ -56,6 +56,7 @@ #include #include #include +#include #include "target/display.h" @@ -670,3 +671,8 @@ void target_crypto_init_params() crypto_init_params(&ce_params); } + +uint32_t target_get_pmic() +{ + return PMIC_IS_PMI8950; +} diff --git a/target/msm8974/init.c b/target/msm8974/init.c index 35b17bd7e..266e09170 100644 --- a/target/msm8974/init.c +++ b/target/msm8974/init.c @@ -826,3 +826,8 @@ void target_usb_phy_mux_configure(void) tcsr_hs_phy_mux_configure(); } } + +uint32_t target_get_pmic() +{ + return PMIC_IS_PM8941; +} \ No newline at end of file diff --git a/target/msm8974/rules.mk b/target/msm8974/rules.mk index b5b121801..f95a81604 100644 --- a/target/msm8974/rules.mk +++ b/target/msm8974/rules.mk @@ -23,6 +23,7 @@ MODULES += \ dev/keys \ dev/pmic/pm8x41 \ dev/gcdb/display \ + dev/pmic/pmi8994 \ lib/ptable \ lib/libfdt diff --git a/target/msm8994/init.c b/target/msm8994/init.c index d939724f2..f85ff03fd 100644 --- a/target/msm8994/init.c +++ b/target/msm8994/init.c @@ -583,3 +583,8 @@ uint32_t target_ddr_cfg_val() { return DDR_CFG_DLY_VAL; } + +uint32_t target_get_pmic() +{ + return PMIC_IS_PMI8994; +} diff --git a/target/msm8994/rules.mk b/target/msm8994/rules.mk index 4ac3ff15a..b9ad22c3f 100644 --- a/target/msm8994/rules.mk +++ b/target/msm8994/rules.mk @@ -30,6 +30,7 @@ MODULES += \ dev/qpnp_led \ lib/ptable \ dev/gcdb/display \ + dev/pmic/pmi8994 \ lib/libfdt DEFINES += \ diff --git a/target/msm8996/init.c b/target/msm8996/init.c index 554bf863f..d38e9c451 100644 --- a/target/msm8996/init.c +++ b/target/msm8996/init.c @@ -508,3 +508,8 @@ void shutdown_device() ASSERT(0); } + +uint32_t target_get_pmic() +{ + return PMIC_IS_PMI8996; +}