static bool msic_battery_check(void) { if (get_oem0_table() == NULL) { pr_info("Invalid battery detected\n"); return false; } else { pr_info("Valid battery detected\n"); return true; } }
static bool msic_battery_check(char *battid) { struct sfi_table_simple *sb; sb = (struct sfi_table_simple *)get_oem0_table(); if (sb == NULL) { pr_info("invalid battery detected\n"); snprintf(battid, BATTID_LEN + 1 , "UNKNOWNB"); return false; } else { pr_info("valid battery detected\n"); /* First entry in OEM0 table is the BATTID. Read battid * if pentry is not NULL and header length is greater * than BATTID length*/ if (sb->pentry && sb->header.len >= BATTID_LEN) snprintf(battid, BATTID_LEN + 1, "%s", (char *)sb->pentry); return true; } return false; }
static void platform_get_sfi_batt_table(void *table, bool fpo_override_bit) { struct sfi_table_simple *sb = (struct sfi_table_simple *)get_oem0_table(); struct platform_batt_profile *batt_prof; u8 *bprof_ptr; int num_entries, i; pr_debug("%s\n", __func__); if (sb == NULL) { pr_debug("Invalid Battery detected\n"); return; } /* Allocate the memory for sharing battery profile */ ps_pse_mod_prof = kzalloc( sizeof(*ps_pse_mod_prof), GFP_KERNEL); if (!ps_pse_mod_prof) { pr_debug("%s: Error in kzalloc\n", __func__); kfree(ps_pse_mod_prof); ps_pse_mod_prof = NULL; return; } ps_batt_chrg_prof = kzalloc( sizeof(*ps_batt_chrg_prof), GFP_KERNEL); if (!ps_batt_chrg_prof) { pr_debug("%s: Error in kzalloc\n", __func__); kfree(ps_batt_chrg_prof); kfree(ps_pse_mod_prof); ps_batt_chrg_prof = NULL; ps_pse_mod_prof = NULL; return; } bprof_ptr = (u8 *)sb->pentry; memcpy(ps_pse_mod_prof->batt_id, bprof_ptr, BATTID_STR_LEN); bprof_ptr += BATTID_STR_LEN; ps_pse_mod_prof->voltage_max = *(u16 *)bprof_ptr; bprof_ptr += 2; if (fpo_override_bit) { pr_info("OVERRIDE. Read battery profile from SMIP\n"); ps_pse_mod_prof->capacity = *(u32 *)(bprof_ptr); bprof_ptr += 4; } else if (INTEL_MID_BOARD(3, PHONE, CLVTP, VB, PRO, PR1B)) { pr_info("PR1 Battery detected\n"); ps_pse_mod_prof->capacity = *(u16 *)(bprof_ptr); bprof_ptr += 2; } else { pr_info("PR2 Battery detected\n"); ps_pse_mod_prof->capacity = *(u32 *)(bprof_ptr); bprof_ptr += 4; } ps_pse_mod_prof->battery_type = *bprof_ptr; ps_pse_mod_prof->temp_mon_ranges = *++bprof_ptr; ps_pse_mod_prof->chrg_term_ma = 128; ps_pse_mod_prof->low_batt_mV = 3400; ps_pse_mod_prof->disch_tmp_ul = 60; ps_pse_mod_prof->disch_tmp_ll = 0; num_entries = SFI_GET_NUM_ENTRIES(sb, struct platform_batt_profile); batt_prof = (struct platform_batt_profile *)table; pr_info("num_entries = %d\n", num_entries); if (num_entries) { /* Fill the local structure for back up*/ memcpy(batt_prof->batt_id, ps_pse_mod_prof->batt_id, BATTID_STR_LEN); batt_prof->voltage_max = ps_pse_mod_prof->voltage_max; batt_prof->capacity = ps_pse_mod_prof->capacity; batt_prof->battery_type = ps_pse_mod_prof->battery_type; batt_prof->temp_mon_ranges = ps_pse_mod_prof->temp_mon_ranges; memcpy(batt_prof->temp_mon_range, bprof_ptr+1, TEMP_NR_RNG * sizeof(struct platform_temp_mon_table)); } else { batt_prof->temp_mon_ranges = 0; memcpy((void *)batt_prof->batt_id, (void *)"UNKNOWN", 8); } for (i = 0; i < batt_prof->temp_mon_ranges; i++) { ps_pse_mod_prof->temp_mon_range[i].temp_up_lim = batt_prof->temp_mon_range[i].temp_up_lim; ps_pse_mod_prof->temp_mon_range[i].full_chrg_vol = batt_prof->temp_mon_range[i].full_chrg_vol; ps_pse_mod_prof->temp_mon_range[i].full_chrg_cur = batt_prof->temp_mon_range[i].full_chrg_cur; ps_pse_mod_prof->temp_mon_range[i].maint_chrg_vol_ll = batt_prof->temp_mon_range[i].maint_chrg_vol_ll; ps_pse_mod_prof->temp_mon_range[i].maint_chrg_vol_ul = batt_prof->temp_mon_range[i].maint_chrg_vol_ul; ps_pse_mod_prof->temp_mon_range[i].maint_chrg_cur = batt_prof->temp_mon_range[i].maint_chrg_cur; } /* Change need in SMIP since temp zone 4 has all 0's */ ps_pse_mod_prof->temp_mon_range[0].temp_up_lim = 60; ps_batt_chrg_prof->chrg_prof_type = PSE_MOD_CHRG_PROF; ps_batt_chrg_prof->batt_prof = ps_pse_mod_prof; /* Dump the battery charging profile*/ dump_batt_chrg_profile(ps_pse_mod_prof, batt_prof); #ifdef CONFIG_POWER_SUPPLY_BATTID battery_prop_changed(POWER_SUPPLY_BATTERY_INSERTED, ps_batt_chrg_prof); #endif }
static bool msic_battery_check(struct max17042_platform_data *pdata) { struct sfi_table_simple *sb; char *mrfl_batt_str = "INTN0001"; #ifdef CONFIG_SFI sb = (struct sfi_table_simple *)get_oem0_table(); #else sb = NULL; #endif if (sb == NULL) { pr_info("invalid battery detected\n"); snprintf(pdata->battid, BATTID_LEN + 1, "UNKNOWNB"); snprintf(pdata->serial_num, SERIAL_NUM_LEN + 1, "000000"); return false; } else { pr_info("valid battery detected\n"); /* First entry in OEM0 table is the BATTID. Read battid * if pentry is not NULL and header length is greater * than BATTID length*/ if (sb->pentry && sb->header.len >= BATTID_LEN) { if (!((INTEL_MID_BOARD(1, TABLET, MRFL)) || (INTEL_MID_BOARD(1, PHONE, MRFL)) || (INTEL_MID_BOARD(1, PHONE, MOFD)) || (INTEL_MID_BOARD(1, TABLET, MOFD)))) { snprintf(pdata->battid, BATTID_LEN + 1, "%s", (char *)sb->pentry); } else { if (strncmp((char *)sb->pentry, "PG000001", (BATTID_LEN)) == 0) { snprintf(pdata->battid, (BATTID_LEN + 1), "%s", mrfl_batt_str); } else { snprintf(pdata->battid, (BATTID_LEN + 1), "%s", (char *)sb->pentry); } } /* First 2 bytes represent the model name * and the remaining 6 bytes represent the * serial number. */ if (pdata->battid[0] == 'I' && pdata->battid[1] >= '0' && pdata->battid[1] <= '9') { unsigned char tmp[SERIAL_NUM_LEN + 2]; int i, ret = 0; snprintf(pdata->model_name, (MODEL_NAME_LEN) + 1, "%s", pdata->battid); ret = memcpy_safe(tmp, BATTID_LEN, sb->pentry, BATTID_LEN); if (ret) { pr_err("%s, err:%d copying BATTID\n", __func__, ret); return false; } for (i = 0; i < SERIAL_NUM_LEN; i++) { snprintf(pdata->serial_num + i*2, sizeof(pdata->serial_num) - i*2, "%02x", tmp[i + MODEL_NAME_LEN]); } if ((2 * SERIAL_NUM_LEN) < ARRAY_SIZE(pdata->serial_num)) pdata->serial_num[2 * SERIAL_NUM_LEN] = '\0'; } else { snprintf(pdata->model_name, (MODEL_NAME_LEN + 1), "%s", pdata->battid); snprintf(pdata->serial_num, (SERIAL_NUM_LEN + 1), "%s", pdata->battid + MODEL_NAME_LEN); } } return true; } return false; }