| /* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 and |
| * only version 2 as published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| */ |
| |
| #ifndef __PM8XXX_BMS_H |
| #define __PM8XXX_BMS_H |
| |
| #include <linux/errno.h> |
| #include <linux/mfd/pm8xxx/batterydata-lib.h> |
| |
| #define PM8921_BMS_DEV_NAME "pm8921-bms" |
| |
| |
| struct pm8xxx_bms_core_data { |
| unsigned int batt_temp_channel; |
| unsigned int vbat_channel; |
| unsigned int ref625mv_channel; |
| unsigned int ref1p25v_channel; |
| unsigned int batt_id_channel; |
| }; |
| |
| /** |
| * struct pm8921_bms_platform_data - |
| * @batt_type: allows to force chose battery calibration data |
| * @r_sense_uohm: sense resistor value in (micro Ohms) |
| * @i_test: current at which the unusable charger cutoff is to be |
| * calculated or the peak system current (mA) |
| * @v_cutoff: the loaded voltage at which the battery |
| * is considered empty(mV) |
| * @enable_fcc_learning: if set the driver will learn full charge |
| * capacity of the battery upon end of charge |
| * @min_fcc_learning_soc: minimum SOC as which CC counting for FCC |
| * learning can start |
| * @min_fcc_ocv_pc: minimum PC (lookup(OCV)) at which CC counting |
| * for FCC learning can start |
| * @min_fcc_learning_samples: Minimum number of FCC measurement cycles to be |
| * used for FCC update |
| * @normal_voltage_calc_ms: The period of soc calculation in ms when battery |
| * voltage higher than cutoff voltage |
| * @low_voltage_calc_ms: The period of soc calculation in ms when battery |
| * voltage is near cutoff voltage |
| * @disable_flat_portion_ocv: feature to disable ocv updates while in sleep |
| * @ocv_dis_high_soc: the high soc percent when ocv should be disabled |
| * @ocv_dis_low_soc: the low soc percent when ocv should be enabled |
| * @low_voltage_detect: feature to enable 0 SOC reporting on low volatge |
| * @vbatt_cutoff_retries: number of tries before we report a 0 SOC |
| * @high_ocv_correction_limit_uv: the max amount of OCV corrections |
| * allowed when ocv is high |
| * (higher than 3.8V) |
| * @low_ocv_correction_limit_uv: the max amount of OCV corrections |
| * allowed when ocv is low |
| * (lower or equal to 3.8V) |
| * @hold_soc_est: the min est soc below which the calculated soc |
| * is allowed to go to 0% |
| */ |
| struct pm8921_bms_platform_data { |
| struct pm8xxx_bms_core_data bms_cdata; |
| enum battery_type battery_type; |
| int r_sense_uohm; |
| unsigned int i_test; |
| unsigned int v_cutoff; |
| unsigned int max_voltage_uv; |
| unsigned int rconn_mohm; |
| unsigned int alarm_low_mv; |
| unsigned int alarm_high_mv; |
| int enable_fcc_learning; |
| int min_fcc_learning_soc; |
| int min_fcc_ocv_pc; |
| int min_fcc_learning_samples; |
| int shutdown_soc_valid_limit; |
| int ignore_shutdown_soc; |
| int adjust_soc_low_threshold; |
| int chg_term_ua; |
| int normal_voltage_calc_ms; |
| int low_voltage_calc_ms; |
| int disable_flat_portion_ocv; |
| int ocv_dis_high_soc; |
| int ocv_dis_low_soc; |
| int low_voltage_detect; |
| int vbatt_cutoff_retries; |
| int high_ocv_correction_limit_uv; |
| int low_ocv_correction_limit_uv; |
| int hold_soc_est; |
| }; |
| |
| #if defined(CONFIG_PM8921_BMS) || defined(CONFIG_PM8921_BMS_MODULE) |
| /** |
| * pm8921_bms_get_vsense_avg - return the voltage across the sense |
| * resitor in microvolts |
| * @result: The pointer where the voltage will be updated. A -ve |
| * result means that the current is flowing in |
| * the battery - during battery charging |
| * |
| * RETURNS: Error code if there was a problem reading vsense, Zero otherwise |
| * The result won't be updated in case of an error. |
| * |
| * |
| */ |
| int pm8921_bms_get_vsense_avg(int *result); |
| |
| /** |
| * pm8921_bms_get_battery_current - return the battery current based on vsense |
| * resitor in microamperes |
| * @result: The pointer where the voltage will be updated. A -ve |
| * result means that the current is flowing in |
| * the battery - during battery charging |
| * |
| * RETURNS: Error code if there was a problem reading vsense, Zero otherwise |
| * The result won't be updated in case of an error. |
| * |
| */ |
| int pm8921_bms_get_battery_current(int *result); |
| |
| /** |
| * pm8921_bms_get_percent_charge - returns the current battery charge in percent |
| * |
| */ |
| int pm8921_bms_get_percent_charge(void); |
| |
| /** |
| * pm8921_bms_get_fcc - returns fcc in mAh of the battery depending on its age |
| * and temperature |
| * |
| */ |
| int pm8921_bms_get_fcc(void); |
| |
| /** |
| * pm8921_bms_charging_began - function to notify the bms driver that charging |
| * has started. Used by the bms driver to keep |
| * track of chargecycles |
| */ |
| void pm8921_bms_charging_began(void); |
| /** |
| * pm8921_bms_charging_end - function to notify the bms driver that charging |
| * has stopped. Used by the bms driver to keep |
| * track of chargecycles |
| */ |
| void pm8921_bms_charging_end(int is_battery_full); |
| |
| void pm8921_bms_calibrate_hkadc(void); |
| /** |
| * pm8921_bms_get_simultaneous_battery_voltage_and_current |
| * - function to take simultaneous vbat and vsense readings |
| * this puts the bms in override mode but keeps coulumb couting |
| * on. Useful when ir compensation needs to be implemented |
| */ |
| int pm8921_bms_get_simultaneous_battery_voltage_and_current(int *ibat_ua, |
| int *vbat_uv); |
| /** |
| * pm8921_bms_get_current_max |
| * - function to get the max current that can be drawn from |
| * the battery before it dips below the min allowed voltage |
| */ |
| int pm8921_bms_get_current_max(void); |
| /** |
| * pm8921_bms_invalidate_shutdown_soc - function to notify the bms driver that |
| * the battery was replaced between reboot |
| * and so it should not use the shutdown |
| * soc stored in a coincell backed register |
| */ |
| void pm8921_bms_invalidate_shutdown_soc(void); |
| |
| /** |
| * pm8921_bms_cc_uah - function to get the coulomb counter based charge. Note |
| * that the coulomb counter are reset when the current |
| * consumption is low (below 8mA for more than 5 minutes), |
| * This will lead in a very low coulomb counter charge |
| * value upon wakeup from sleep. |
| */ |
| int pm8921_bms_cc_uah(int *cc_uah); |
| |
| /** |
| * pm8921_bms_battery_removed - function to be called to tell the bms that |
| * the battery is removed. The bms resets its internal |
| * history data used to report soc. |
| */ |
| void pm8921_bms_battery_removed(void); |
| /** |
| * pm8921_bms_battery_inseted - function to be called to tell the bms that |
| * the battery was inserted. The bms initiates calculations |
| * for reporting soc. |
| */ |
| void pm8921_bms_battery_inserted(void); |
| #else |
| static inline int pm8921_bms_get_vsense_avg(int *result) |
| { |
| return -ENXIO; |
| } |
| static inline int pm8921_bms_get_battery_current(int *result) |
| { |
| return -ENXIO; |
| } |
| static inline int pm8921_bms_get_percent_charge(void) |
| { |
| return -ENXIO; |
| } |
| static inline int pm8921_bms_get_fcc(void) |
| { |
| return -ENXIO; |
| } |
| static inline void pm8921_bms_charging_began(void) |
| { |
| } |
| static inline void pm8921_bms_charging_end(int is_battery_full) |
| { |
| } |
| static inline void pm8921_bms_calibrate_hkadc(void) |
| { |
| } |
| static inline int pm8921_bms_get_simultaneous_battery_voltage_and_current( |
| int *ibat_ua, int *vbat_uv) |
| { |
| return -ENXIO; |
| } |
| static inline int pm8921_bms_get_rbatt(void) |
| { |
| return -EINVAL; |
| } |
| static inline void pm8921_bms_invalidate_shutdown_soc(void) |
| { |
| } |
| static inline int pm8921_bms_cc_uah(int *cc_uah) |
| { |
| return -ENXIO; |
| } |
| static inline int pm8921_bms_get_current_max(void) |
| { |
| return -ENXIO; |
| } |
| static inline void pm8921_bms_battery_removed(void) {} |
| static inline void pm8921_bms_battery_inserted(void) {} |
| #endif |
| |
| #endif |