This patch replaces the chrg_to_vol_lookup() with dischrg_curve_lookup() so that The same function can be used for voltage to charge or charge to voltage lookup.
To get the charge now value in some places we are calling msic_read_coloumb_ctr and cc_to_coloumbs, as a cleanup all These calls are replaced with a single call to msic_get_charge_now. Also Fixed IPC command calling with proper arguments. Signed-off-by: Ramakrishna Pallala <[email protected]> --- drivers/power/intel_mdf_battery.c | 59 +++++++++++++++++++----------------- 1 files changed, 31 insertions(+), 28 deletions(-) diff --git a/drivers/power/intel_mdf_battery.c b/drivers/power/intel_mdf_battery.c index c89ac97..ed6eff5 100644 --- a/drivers/power/intel_mdf_battery.c +++ b/drivers/power/intel_mdf_battery.c @@ -234,6 +234,8 @@ /* IPC defines */ #define IPCMSG_BATTERY 0xEF +#define IPCCMD_CC_WRITE 0x00 +#define IPCCMD_CC_READ 0x01 #define TEMP_CHARGE_DELAY_JIFFIES (HZ * 30) /*30 sec */ #define CHARGE_STATUS_DELAY_JIFFIES (HZ * 10) /*10 sec */ @@ -894,12 +896,14 @@ static unsigned int msic_read_coloumb_ctr(void) uint32_t cvalue; /* determine other parameters */ - err = intel_scu_ipc_command(IPCMSG_BATTERY, 0x01, NULL, 0, &cvalue, 1); + err = intel_scu_ipc_command(IPCMSG_BATTERY, IPCCMD_CC_READ, NULL, 0, + &cvalue, sizeof(cvalue)); if (err) dev_warn(msic_dev, "IPC Command Failed %s\n", __func__); return cvalue; } + static unsigned int cc_to_coloumbs(unsigned int cc_val) { unsigned int coloumbs = 0; @@ -985,14 +989,20 @@ static unsigned int mdf_cal_avg(unsigned int avg) return avg / 2; } -static unsigned int chrg_to_vol_lookup(unsigned int chrg) +static unsigned int dischrg_curve_lookup(unsigned int val, int j) { - int ch_diff, ch_total_diff, volt_total_diff, i; - unsigned int volt; + int val_diff, val_total_diff, total_diff, i, k; + unsigned int lookup_val; + + /* if j = 0 input is voltage, we need to lookup + * for charge else if if j =1 input is charge, + * we need to lookup for volatge + */ + k = !j; - /* Find the index of most nearest charge value */ + /* Find the index of most nearest voltage value */ for (i = 0; i < DISCHRG_CURVE_MAX_SAMPLES; i++) { - if (chrg < dischargeCurve[i][1]) + if (val < dischargeCurve[i][j]) continue; else break; @@ -1003,34 +1013,29 @@ static unsigned int chrg_to_vol_lookup(unsigned int chrg) return 0; } - if ((i == 0) || (chrg == dischargeCurve[i][1])) - return dischargeCurve[i][0]; + if ((i == 0) || (val == dischargeCurve[i][j])) + return dischargeCurve[i][k]; - /* Linear approximation of the charge to voltage */ - ch_diff = chrg - dischargeCurve[i][1]; - ch_total_diff = dischargeCurve[i-1][1] - dischargeCurve[i][1]; - volt_total_diff = dischargeCurve[i-1][0] - dischargeCurve[i][0]; + /* Linear approximation of the discharge curve */ + val_diff = val - dischargeCurve[i][j]; + val_total_diff = dischargeCurve[i-1][j] - dischargeCurve[i][j]; + total_diff = dischargeCurve[i-1][k] - dischargeCurve[i][k]; - volt = dischargeCurve[i][0] + - (ch_diff * volt_total_diff) / ch_total_diff; + lookup_val = dischargeCurve[i][k] + + (val_diff * val_total_diff) / total_diff; - return volt; + return lookup_val; } static unsigned int msic_read_energy_now(struct msic_power_module_info *mbi) { unsigned int vltg, chrg; - /* Read CC register value */ - chrg = msic_read_coloumb_ctr(); - /* Covert to milli coloumbs */ - chrg = cc_to_coloumbs(chrg); + /* Read battery charge in mAh */ + chrg = msic_get_charge_now(); /* get voltage form lookup table */ - vltg = chrg_to_vol_lookup(chrg); - - /* Convert from mColoumbs to mAh */ - chrg = chrg / COLMB_TO_MAHRS_CONV_FCTR; + vltg = dischrg_curve_lookup(chrg, 1); return (vltg * chrg) / 1000; } @@ -1629,7 +1634,7 @@ static int check_charge_full(struct msic_power_module_info *mbi, int vref) * temporary fix we are hardcoding the Rbatt as 180 mOhms */ vocv = vbat - (ibatt_avg * MSIC_CHRG_RBATT_VAL)/1000; - dev_dbg(msic_dev, "vocv:%d vbat:%d\n", vocv, vbat); + dev_dbg(msic_dev, "vref:%d vocv:%d vbat:%d\n", vref, vocv, vbat); /* * Check if Vbat is equal to max charge voltage and @@ -1714,7 +1719,7 @@ static void calculate_charge_cycles(struct msic_power_module_info *mbi, */ static void msic_batt_temp_charging(struct work_struct *work) { - int ret, i, charge_now, is_maint_chrg = false, is_lowchrg_enbl; + int ret, i, is_maint_chrg = false, is_lowchrg_enbl; static int iprev = -1, is_chrg_enbl; short int cv = 0, cc = 0, vinlimit = 0, cvref; int adc_temp, adc_vol; @@ -1800,9 +1805,7 @@ static void msic_batt_temp_charging(struct work_struct *work) spin_unlock(&mbi->event_lock); mutex_lock(&mbi->batt_lock); - charge_now = msic_read_coloumb_ctr(); - mbi->batt_props.charge_full = - cc_to_coloumbs(charge_now); + mbi->batt_props.charge_full = msic_get_charge_now(); mbi->batt_props.status = POWER_SUPPLY_STATUS_FULL; mutex_unlock(&mbi->batt_lock); -- 1.7.2.3
0003-Modified-Discharge-curve-loopup-function.patch
Description: 0003-Modified-Discharge-curve-loopup-function.patch
_______________________________________________ MeeGo-kernel mailing list [email protected] http://lists.meego.com/listinfo/meego-kernel
