static void max17047_polling_work(struct work_struct *work) { struct max17047_fuelgauge_data *fg_data = container_of(work, struct max17047_fuelgauge_data, polling_work.work); int reg; int i; u8 data[2]; u8 buf[512]; max17047_get_vcell(fg_data->client); max17047_get_vfocv(fg_data->client); max17047_get_avgvcell(fg_data->client); max17047_get_rawsoc(fg_data->client); max17047_get_soc(fg_data->client); pr_info("%s: VCELL(%d), VFOCV(%d), AVGVCELL(%d), RAWSOC(%d), SOC(%d)\n", __func__, fg_data->vcell, fg_data->vfocv, fg_data->avgvcell, fg_data->rawsoc, fg_data->soc); max17047_test_read(fg_data); schedule_delayed_work(&fg_data->polling_work, msecs_to_jiffies(MAX17047_POLLING_INTERVAL)); }
static int max17047_detect_trim_error(struct max17047_fuelgauge_data *fuelgauge_data) { int vcell, soc; vcell = max17047_get_vcell(fuelgauge_data->client); soc = max17047_get_soc(fuelgauge_data->client); if (((vcell < TRIM_ERROR_DETECT_VOLTAGE1) || ( vcell == TRIM_ERROR_DETECT_VOLTAGE2)) && (soc == 0)) { pr_debug("%s: (maybe)It's a trim error version. VCELL(%d), SOC(%d)\n", __func__, vcell, soc); return 1; } return 0; }
static bool max17047_detect_trim_error(struct max17047_fuelgauge_data *fg_data) { bool ret = false; int vcell, soc; vcell = max17047_get_vcell(fg_data->client); soc = max17047_get_soc(fg_data->client); if (((vcell < TRIM_ERROR_DETECT_VOLTAGE1) || (vcell == TRIM_ERROR_DETECT_VOLTAGE2)) && (soc == 0)) { pr_err("%s: (maybe)It's a trim error version. " "VCELL(%d), SOC(%d)\n", __func__, vcell, soc); ret = true; } return ret; }
static void max17047_update_work(struct work_struct *work) { struct max17047_fuelgauge_data *fg_data = container_of(work, struct max17047_fuelgauge_data, update_work.work); struct power_supply *battery_psy; struct i2c_client *client = fg_data->client; union power_supply_propval value; pr_debug("%s\n", __func__); #ifdef CONFIG_SLP battery_psy = &fg_data->fuelgauge; #else battery_psy = power_supply_get_by_name("battery"); #endif max17047_get_vcell(client); max17047_get_vfocv(client); max17047_get_avgvcell(client); max17047_get_rawsoc(client); max17047_get_soc(client); pr_info("%s: VCELL(%d), VFOCV(%d), AVGVCELL(%d), RAWSOC(%d), SOC(%d)\n", __func__, fg_data->vcell, fg_data->vfocv, fg_data->avgvcell, fg_data->rawsoc, fg_data->soc); max17047_test_read(fg_data); if (!battery_psy || !battery_psy->set_property) { pr_err("%s: fail to get battery power supply\n", __func__); mutex_unlock(&fg_data->irq_lock); return; } battery_psy->set_property(battery_psy, POWER_SUPPLY_PROP_STATUS, &value); wake_lock_timeout(&fg_data->update_wake_lock, HZ); }
static int max17047_get_property(struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val) { struct max17047_fuelgauge_data *fg_data = container_of(psy, struct max17047_fuelgauge_data, fuelgauge); #ifdef USE_TRIM_ERROR_DETECTION if (max17047_detect_trim_error(fg_data)) { switch (psp) { case POWER_SUPPLY_PROP_VOLTAGE_NOW: case POWER_SUPPLY_PROP_VOLTAGE_AVG: val->intval = 4200000; break; case POWER_SUPPLY_PROP_CAPACITY: val->intval = 99; break; case POWER_SUPPLY_PROP_TEMP: val->intval = 300; break; default: return -EINVAL; } return 0; } #endif switch (psp) { case POWER_SUPPLY_PROP_VOLTAGE_NOW: switch (val->intval) { case VOLTAGE_TYPE_VCELL: val->intval = max17047_get_vcell(fg_data->client); break; case VOLTAGE_TYPE_VFOCV: val->intval = max17047_get_vfocv(fg_data->client); break; default: val->intval = max17047_get_vcell(fg_data->client); break; } break; case POWER_SUPPLY_PROP_VOLTAGE_AVG: val->intval = max17047_get_avgvcell(fg_data->client); break; case POWER_SUPPLY_PROP_CAPACITY: switch (val->intval) { case SOC_TYPE_ADJUSTED: val->intval = max17047_get_soc(fg_data->client); break; case SOC_TYPE_RAW: val->intval = max17047_get_rawsoc(fg_data->client); break; case SOC_TYPE_FULL: val->intval = fg_data->full_soc; break; default: val->intval = max17047_get_soc(fg_data->client); break; } break; case POWER_SUPPLY_PROP_TEMP: val->intval = max17047_get_temperature(fg_data->client); break; default: return -EINVAL; } return 0; }