Commit 25095550 authored by Sebastian Reichel's avatar Sebastian Reichel

Merge tag 'ib-mfd-power-v5.13' into psy-next

Immutable branch between MFD and Power due for the v5.13 merge window.
Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
parents 25faa935 ee0975c3
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
#include <linux/mfd/core.h> #include <linux/mfd/core.h>
#include <linux/mfd/abx500.h> #include <linux/mfd/abx500.h>
#include <linux/mfd/abx500/ab8500.h> #include <linux/mfd/abx500/ab8500.h>
#include <linux/mfd/abx500/ab8500-bm.h>
#include <linux/mfd/dbx500-prcmu.h> #include <linux/mfd/dbx500-prcmu.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_device.h> #include <linux/of_device.h>
...@@ -609,14 +608,14 @@ int ab8500_suspend(struct ab8500 *ab8500) ...@@ -609,14 +608,14 @@ int ab8500_suspend(struct ab8500 *ab8500)
} }
static const struct mfd_cell ab8500_bm_devs[] = { static const struct mfd_cell ab8500_bm_devs[] = {
MFD_CELL_OF("ab8500-charger", NULL, &ab8500_bm_data, MFD_CELL_OF("ab8500-charger", NULL, NULL, 0, 0,
sizeof(ab8500_bm_data), 0, "stericsson,ab8500-charger"), "stericsson,ab8500-charger"),
MFD_CELL_OF("ab8500-btemp", NULL, &ab8500_bm_data, MFD_CELL_OF("ab8500-btemp", NULL, NULL, 0, 0,
sizeof(ab8500_bm_data), 0, "stericsson,ab8500-btemp"), "stericsson,ab8500-btemp"),
MFD_CELL_OF("ab8500-fg", NULL, &ab8500_bm_data, MFD_CELL_OF("ab8500-fg", NULL, NULL, 0, 0,
sizeof(ab8500_bm_data), 0, "stericsson,ab8500-fg"), "stericsson,ab8500-fg"),
MFD_CELL_OF("ab8500-chargalg", NULL, &ab8500_bm_data, MFD_CELL_OF("ab8500-chargalg", NULL, NULL, 0, 0,
sizeof(ab8500_bm_data), 0, "stericsson,ab8500-chargalg"), "stericsson,ab8500-chargalg"),
}; };
static const struct mfd_cell ab8500_devs[] = { static const struct mfd_cell ab8500_devs[] = {
......
...@@ -698,7 +698,7 @@ config BATTERY_GAUGE_LTC2941 ...@@ -698,7 +698,7 @@ config BATTERY_GAUGE_LTC2941
config AB8500_BM config AB8500_BM
bool "AB8500 Battery Management Driver" bool "AB8500 Battery Management Driver"
depends on AB8500_CORE && AB8500_GPADC && (IIO = y) depends on AB8500_CORE && AB8500_GPADC && (IIO = y) && OF
help help
Say Y to include support for AB8500 battery management. Say Y to include support for AB8500 battery management.
......
/* SPDX-License-Identifier: GPL-2.0-only */ /* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright ST-Ericsson 2012.
*
* Author: Arun Murthy <arun.murthy@stericsson.com>
*/
#ifndef _AB8500_BM_H #ifndef _AB8500_CHARGER_H_
#define _AB8500_BM_H #define _AB8500_CHARGER_H_
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/mfd/abx500.h>
/* /*
* System control 2 register offsets. * System control 2 register offsets.
...@@ -273,6 +267,277 @@ enum bup_vch_sel { ...@@ -273,6 +267,277 @@ enum bup_vch_sel {
#define BUS_PP_PRECHG_CURRENT_MASK 0x0E #define BUS_PP_PRECHG_CURRENT_MASK 0x0E
#define BUS_POWER_PATH_PRECHG_ENA 0x01 #define BUS_POWER_PATH_PRECHG_ENA 0x01
/*
* ADC for the battery thermistor.
* When using the ABx500_ADC_THERM_BATCTRL the battery ID resistor is combined
* with a NTC resistor to both identify the battery and to measure its
* temperature. Different phone manufactures uses different techniques to both
* identify the battery and to read its temperature.
*/
enum abx500_adc_therm {
ABx500_ADC_THERM_BATCTRL,
ABx500_ADC_THERM_BATTEMP,
};
/**
* struct abx500_res_to_temp - defines one point in a temp to res curve. To
* be used in battery packs that combines the identification resistor with a
* NTC resistor.
* @temp: battery pack temperature in Celsius
* @resist: NTC resistor net total resistance
*/
struct abx500_res_to_temp {
int temp;
int resist;
};
/**
* struct abx500_v_to_cap - Table for translating voltage to capacity
* @voltage: Voltage in mV
* @capacity: Capacity in percent
*/
struct abx500_v_to_cap {
int voltage;
int capacity;
};
/* Forward declaration */
struct abx500_fg;
/**
* struct abx500_fg_parameters - Fuel gauge algorithm parameters, in seconds
* if not specified
* @recovery_sleep_timer: Time between measurements while recovering
* @recovery_total_time: Total recovery time
* @init_timer: Measurement interval during startup
* @init_discard_time: Time we discard voltage measurement at startup
* @init_total_time: Total init time during startup
* @high_curr_time: Time current has to be high to go to recovery
* @accu_charging: FG accumulation time while charging
* @accu_high_curr: FG accumulation time in high current mode
* @high_curr_threshold: High current threshold, in mA
* @lowbat_threshold: Low battery threshold, in mV
* @overbat_threshold: Over battery threshold, in mV
* @battok_falling_th_sel0 Threshold in mV for battOk signal sel0
* Resolution in 50 mV step.
* @battok_raising_th_sel1 Threshold in mV for battOk signal sel1
* Resolution in 50 mV step.
* @user_cap_limit Capacity reported from user must be within this
* limit to be considered as sane, in percentage
* points.
* @maint_thres This is the threshold where we stop reporting
* battery full while in maintenance, in per cent
* @pcut_enable: Enable power cut feature in ab8505
* @pcut_max_time: Max time threshold
* @pcut_flag_time: Flagtime threshold
* @pcut_max_restart: Max number of restarts
* @pcut_debounce_time: Sets battery debounce time
*/
struct abx500_fg_parameters {
int recovery_sleep_timer;
int recovery_total_time;
int init_timer;
int init_discard_time;
int init_total_time;
int high_curr_time;
int accu_charging;
int accu_high_curr;
int high_curr_threshold;
int lowbat_threshold;
int overbat_threshold;
int battok_falling_th_sel0;
int battok_raising_th_sel1;
int user_cap_limit;
int maint_thres;
bool pcut_enable;
u8 pcut_max_time;
u8 pcut_flag_time;
u8 pcut_max_restart;
u8 pcut_debounce_time;
};
/**
* struct abx500_charger_maximization - struct used by the board config.
* @use_maxi: Enable maximization for this battery type
* @maxi_chg_curr: Maximum charger current allowed
* @maxi_wait_cycles: cycles to wait before setting charger current
* @charger_curr_step delta between two charger current settings (mA)
*/
struct abx500_maxim_parameters {
bool ena_maxi;
int chg_curr;
int wait_cycles;
int charger_curr_step;
};
/**
* struct abx500_battery_type - different batteries supported
* @name: battery technology
* @resis_high: battery upper resistance limit
* @resis_low: battery lower resistance limit
* @charge_full_design: Maximum battery capacity in mAh
* @nominal_voltage: Nominal voltage of the battery in mV
* @termination_vol: max voltage upto which battery can be charged
* @termination_curr battery charging termination current in mA
* @recharge_cap battery capacity limit that will trigger a new
* full charging cycle in the case where maintenan-
* -ce charging has been disabled
* @normal_cur_lvl: charger current in normal state in mA
* @normal_vol_lvl: charger voltage in normal state in mV
* @maint_a_cur_lvl: charger current in maintenance A state in mA
* @maint_a_vol_lvl: charger voltage in maintenance A state in mV
* @maint_a_chg_timer_h: charge time in maintenance A state
* @maint_b_cur_lvl: charger current in maintenance B state in mA
* @maint_b_vol_lvl: charger voltage in maintenance B state in mV
* @maint_b_chg_timer_h: charge time in maintenance B state
* @low_high_cur_lvl: charger current in temp low/high state in mA
* @low_high_vol_lvl: charger voltage in temp low/high state in mV'
* @battery_resistance: battery inner resistance in mOhm.
* @n_r_t_tbl_elements: number of elements in r_to_t_tbl
* @r_to_t_tbl: table containing resistance to temp points
* @n_v_cap_tbl_elements: number of elements in v_to_cap_tbl
* @v_to_cap_tbl: Voltage to capacity (in %) table
* @n_batres_tbl_elements number of elements in the batres_tbl
* @batres_tbl battery internal resistance vs temperature table
*/
struct abx500_battery_type {
int name;
int resis_high;
int resis_low;
int charge_full_design;
int nominal_voltage;
int termination_vol;
int termination_curr;
int recharge_cap;
int normal_cur_lvl;
int normal_vol_lvl;
int maint_a_cur_lvl;
int maint_a_vol_lvl;
int maint_a_chg_timer_h;
int maint_b_cur_lvl;
int maint_b_vol_lvl;
int maint_b_chg_timer_h;
int low_high_cur_lvl;
int low_high_vol_lvl;
int battery_resistance;
int n_temp_tbl_elements;
const struct abx500_res_to_temp *r_to_t_tbl;
int n_v_cap_tbl_elements;
const struct abx500_v_to_cap *v_to_cap_tbl;
int n_batres_tbl_elements;
const struct batres_vs_temp *batres_tbl;
};
/**
* struct abx500_bm_capacity_levels - abx500 capacity level data
* @critical: critical capacity level in percent
* @low: low capacity level in percent
* @normal: normal capacity level in percent
* @high: high capacity level in percent
* @full: full capacity level in percent
*/
struct abx500_bm_capacity_levels {
int critical;
int low;
int normal;
int high;
int full;
};
/**
* struct abx500_bm_charger_parameters - Charger specific parameters
* @usb_volt_max: maximum allowed USB charger voltage in mV
* @usb_curr_max: maximum allowed USB charger current in mA
* @ac_volt_max: maximum allowed AC charger voltage in mV
* @ac_curr_max: maximum allowed AC charger current in mA
*/
struct abx500_bm_charger_parameters {
int usb_volt_max;
int usb_curr_max;
int ac_volt_max;
int ac_curr_max;
};
/**
* struct abx500_bm_data - abx500 battery management data
* @temp_under under this temp, charging is stopped
* @temp_low between this temp and temp_under charging is reduced
* @temp_high between this temp and temp_over charging is reduced
* @temp_over over this temp, charging is stopped
* @temp_now present battery temperature
* @temp_interval_chg temperature measurement interval in s when charging
* @temp_interval_nochg temperature measurement interval in s when not charging
* @main_safety_tmr_h safety timer for main charger
* @usb_safety_tmr_h safety timer for usb charger
* @bkup_bat_v voltage which we charge the backup battery with
* @bkup_bat_i current which we charge the backup battery with
* @no_maintenance indicates that maintenance charging is disabled
* @capacity_scaling indicates whether capacity scaling is to be used
* @abx500_adc_therm placement of thermistor, batctrl or battemp adc
* @chg_unknown_bat flag to enable charging of unknown batteries
* @enable_overshoot flag to enable VBAT overshoot control
* @auto_trig flag to enable auto adc trigger
* @fg_res resistance of FG resistor in 0.1mOhm
* @n_btypes number of elements in array bat_type
* @batt_id index of the identified battery in array bat_type
* @interval_charging charge alg cycle period time when charging (sec)
* @interval_not_charging charge alg cycle period time when not charging (sec)
* @temp_hysteresis temperature hysteresis
* @gnd_lift_resistance Battery ground to phone ground resistance (mOhm)
* @n_chg_out_curr number of elements in array chg_output_curr
* @n_chg_in_curr number of elements in array chg_input_curr
* @chg_output_curr charger output current level map
* @chg_input_curr charger input current level map
* @maxi maximization parameters
* @cap_levels capacity in percent for the different capacity levels
* @bat_type table of supported battery types
* @chg_params charger parameters
* @fg_params fuel gauge parameters
*/
struct abx500_bm_data {
int temp_under;
int temp_low;
int temp_high;
int temp_over;
int temp_now;
int temp_interval_chg;
int temp_interval_nochg;
int main_safety_tmr_h;
int usb_safety_tmr_h;
int bkup_bat_v;
int bkup_bat_i;
bool autopower_cfg;
bool ac_enabled;
bool usb_enabled;
bool no_maintenance;
bool capacity_scaling;
bool chg_unknown_bat;
bool enable_overshoot;
bool auto_trig;
enum abx500_adc_therm adc_therm;
int fg_res;
int n_btypes;
int batt_id;
int interval_charging;
int interval_not_charging;
int temp_hysteresis;
int gnd_lift_resistance;
int n_chg_out_curr;
int n_chg_in_curr;
int *chg_output_curr;
int *chg_input_curr;
const struct abx500_maxim_parameters *maxi;
const struct abx500_bm_capacity_levels *cap_levels;
struct abx500_battery_type *bat_type;
const struct abx500_bm_charger_parameters *chg_params;
const struct abx500_fg_parameters *fg_params;
};
enum {
NTC_EXTERNAL = 0,
NTC_INTERNAL,
};
/** /**
* struct res_to_temp - defines one point in a temp to res curve. To * struct res_to_temp - defines one point in a temp to res curve. To
* be used in battery packs that combines the identification resistor with a * be used in battery packs that combines the identification resistor with a
...@@ -452,25 +717,17 @@ struct ab8500_bm_data { ...@@ -452,25 +717,17 @@ struct ab8500_bm_data {
const struct ab8500_fg_parameters *fg_params; const struct ab8500_fg_parameters *fg_params;
}; };
struct ab8500_btemp;
struct ab8500_gpadc;
struct ab8500_fg;
#ifdef CONFIG_AB8500_BM
extern struct abx500_bm_data ab8500_bm_data; extern struct abx500_bm_data ab8500_bm_data;
void ab8500_charger_usb_state_changed(u8 bm_usb_state, u16 mA); void ab8500_charger_usb_state_changed(u8 bm_usb_state, u16 mA);
struct ab8500_btemp *ab8500_btemp_get(void);
int ab8500_btemp_get_batctrl_temp(struct ab8500_btemp *btemp);
int ab8500_btemp_get_temp(struct ab8500_btemp *btemp);
struct ab8500_fg *ab8500_fg_get(void); struct ab8500_fg *ab8500_fg_get(void);
int ab8500_fg_inst_curr_blocking(struct ab8500_fg *dev); int ab8500_fg_inst_curr_blocking(struct ab8500_fg *dev);
int ab8500_fg_inst_curr_start(struct ab8500_fg *di); int ab8500_fg_inst_curr_start(struct ab8500_fg *di);
int ab8500_fg_inst_curr_finalize(struct ab8500_fg *di, int *res); int ab8500_fg_inst_curr_finalize(struct ab8500_fg *di, int *res);
int ab8500_fg_inst_curr_started(struct ab8500_fg *di); int ab8500_fg_inst_curr_started(struct ab8500_fg *di);
int ab8500_fg_inst_curr_done(struct ab8500_fg *di); int ab8500_fg_inst_curr_done(struct ab8500_fg *di);
int ab8500_bm_of_probe(struct device *dev,
struct device_node *np,
struct abx500_bm_data *bm);
#else #endif /* _AB8500_CHARGER_H_ */
static struct abx500_bm_data ab8500_bm_data;
#endif
#endif /* _AB8500_BM_H */
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
* Author: Johan Gardsmark <johan.gardsmark@stericsson.com> for ST-Ericsson. * Author: Johan Gardsmark <johan.gardsmark@stericsson.com> for ST-Ericsson.
*/ */
#ifndef _UX500_CHARGALG_H #ifndef _AB8500_CHARGALG_H_
#define _UX500_CHARGALG_H #define _AB8500_CHARGALG_H_
#include <linux/power_supply.h> #include <linux/power_supply.h>
...@@ -48,4 +48,4 @@ struct ux500_charger { ...@@ -48,4 +48,4 @@ struct ux500_charger {
extern struct blocking_notifier_head charger_notifier_list; extern struct blocking_notifier_head charger_notifier_list;
#endif #endif /* _AB8500_CHARGALG_H_ */
...@@ -4,7 +4,8 @@ ...@@ -4,7 +4,8 @@
#include <linux/of.h> #include <linux/of.h>
#include <linux/mfd/abx500.h> #include <linux/mfd/abx500.h>
#include <linux/mfd/abx500/ab8500.h> #include <linux/mfd/abx500/ab8500.h>
#include <linux/mfd/abx500/ab8500-bm.h>
#include "ab8500-bm.h"
/* /*
* These are the defined batteries that uses a NTC and ID resistor placed * These are the defined batteries that uses a NTC and ID resistor placed
......
...@@ -25,9 +25,10 @@ ...@@ -25,9 +25,10 @@
#include <linux/mfd/core.h> #include <linux/mfd/core.h>
#include <linux/mfd/abx500.h> #include <linux/mfd/abx500.h>
#include <linux/mfd/abx500/ab8500.h> #include <linux/mfd/abx500/ab8500.h>
#include <linux/mfd/abx500/ab8500-bm.h>
#include <linux/iio/consumer.h> #include <linux/iio/consumer.h>
#include "ab8500-bm.h"
#define VTVOUT_V 1800 #define VTVOUT_V 1800
#define BTEMP_THERMAL_LOW_LIMIT -10 #define BTEMP_THERMAL_LOW_LIMIT -10
...@@ -119,16 +120,6 @@ static enum power_supply_property ab8500_btemp_props[] = { ...@@ -119,16 +120,6 @@ static enum power_supply_property ab8500_btemp_props[] = {
static LIST_HEAD(ab8500_btemp_list); static LIST_HEAD(ab8500_btemp_list);
/**
* ab8500_btemp_get() - returns a reference to the primary AB8500 BTEMP
* (i.e. the first BTEMP in the instance list)
*/
struct ab8500_btemp *ab8500_btemp_get(void)
{
return list_first_entry(&ab8500_btemp_list, struct ab8500_btemp, node);
}
EXPORT_SYMBOL(ab8500_btemp_get);
/** /**
* ab8500_btemp_batctrl_volt_to_res() - convert batctrl voltage to resistance * ab8500_btemp_batctrl_volt_to_res() - convert batctrl voltage to resistance
* @di: pointer to the ab8500_btemp structure * @di: pointer to the ab8500_btemp structure
...@@ -754,7 +745,7 @@ static void ab8500_btemp_periodic(struct ab8500_btemp *di, ...@@ -754,7 +745,7 @@ static void ab8500_btemp_periodic(struct ab8500_btemp *di,
* *
* Returns battery temperature * Returns battery temperature
*/ */
int ab8500_btemp_get_temp(struct ab8500_btemp *di) static int ab8500_btemp_get_temp(struct ab8500_btemp *di)
{ {
int temp = 0; int temp = 0;
...@@ -790,19 +781,6 @@ int ab8500_btemp_get_temp(struct ab8500_btemp *di) ...@@ -790,19 +781,6 @@ int ab8500_btemp_get_temp(struct ab8500_btemp *di)
} }
return temp; return temp;
} }
EXPORT_SYMBOL(ab8500_btemp_get_temp);
/**
* ab8500_btemp_get_batctrl_temp() - get the temperature
* @btemp: pointer to the btemp structure
*
* Returns the batctrl temperature in millidegrees
*/
int ab8500_btemp_get_batctrl_temp(struct ab8500_btemp *btemp)
{
return btemp->bat_temp * 1000;
}
EXPORT_SYMBOL(ab8500_btemp_get_batctrl_temp);
/** /**
* ab8500_btemp_get_property() - get the btemp properties * ab8500_btemp_get_property() - get the btemp properties
...@@ -991,7 +969,6 @@ static const struct power_supply_desc ab8500_btemp_desc = { ...@@ -991,7 +969,6 @@ static const struct power_supply_desc ab8500_btemp_desc = {
static int ab8500_btemp_probe(struct platform_device *pdev) static int ab8500_btemp_probe(struct platform_device *pdev)
{ {
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
struct abx500_bm_data *plat = pdev->dev.platform_data;
struct power_supply_config psy_cfg = {}; struct power_supply_config psy_cfg = {};
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct ab8500_btemp *di; struct ab8500_btemp *di;
...@@ -1002,19 +979,13 @@ static int ab8500_btemp_probe(struct platform_device *pdev) ...@@ -1002,19 +979,13 @@ static int ab8500_btemp_probe(struct platform_device *pdev)
if (!di) if (!di)
return -ENOMEM; return -ENOMEM;
if (!plat) { di->bm = &ab8500_bm_data;
dev_err(dev, "no battery management data supplied\n");
return -EINVAL;
}
di->bm = plat;
if (np) {
ret = ab8500_bm_of_probe(dev, np, di->bm); ret = ab8500_bm_of_probe(dev, np, di->bm);
if (ret) { if (ret) {
dev_err(dev, "failed to get battery information\n"); dev_err(dev, "failed to get battery information\n");
return ret; return ret;
} }
}
/* get parent data */ /* get parent data */
di->dev = dev; di->dev = dev;
......
...@@ -28,12 +28,13 @@ ...@@ -28,12 +28,13 @@
#include <linux/mfd/core.h> #include <linux/mfd/core.h>
#include <linux/mfd/abx500/ab8500.h> #include <linux/mfd/abx500/ab8500.h>
#include <linux/mfd/abx500.h> #include <linux/mfd/abx500.h>
#include <linux/mfd/abx500/ab8500-bm.h>
#include <linux/mfd/abx500/ux500_chargalg.h>
#include <linux/usb/otg.h> #include <linux/usb/otg.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/iio/consumer.h> #include <linux/iio/consumer.h>
#include "ab8500-bm.h"
#include "ab8500-chargalg.h"
/* Charger constants */ /* Charger constants */
#define NO_PW_CONN 0 #define NO_PW_CONN 0
#define AC_PW_CONN 1 #define AC_PW_CONN 1
...@@ -3344,7 +3345,6 @@ static const struct power_supply_desc ab8500_usb_chg_desc = { ...@@ -3344,7 +3345,6 @@ static const struct power_supply_desc ab8500_usb_chg_desc = {
static int ab8500_charger_probe(struct platform_device *pdev) static int ab8500_charger_probe(struct platform_device *pdev)
{ {
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
struct abx500_bm_data *plat = pdev->dev.platform_data;
struct power_supply_config ac_psy_cfg = {}, usb_psy_cfg = {}; struct power_supply_config ac_psy_cfg = {}, usb_psy_cfg = {};
struct ab8500_charger *di; struct ab8500_charger *di;
int irq, i, charger_status, ret = 0, ch_stat; int irq, i, charger_status, ret = 0, ch_stat;
...@@ -3354,21 +3354,14 @@ static int ab8500_charger_probe(struct platform_device *pdev) ...@@ -3354,21 +3354,14 @@ static int ab8500_charger_probe(struct platform_device *pdev)
if (!di) if (!di)
return -ENOMEM; return -ENOMEM;
if (!plat) { di->bm = &ab8500_bm_data;
dev_err(dev, "no battery management data supplied\n");
return -EINVAL;
}
di->bm = plat;
if (np) {
ret = ab8500_bm_of_probe(dev, np, di->bm); ret = ab8500_bm_of_probe(dev, np, di->bm);
if (ret) { if (ret) {
dev_err(dev, "failed to get battery information\n"); dev_err(dev, "failed to get battery information\n");
return ret; return ret;
} }
di->autopower_cfg = of_property_read_bool(np, "autopower_cfg"); di->autopower_cfg = of_property_read_bool(np, "autopower_cfg");
} else
di->autopower_cfg = false;
/* get parent data */ /* get parent data */
di->dev = dev; di->dev = dev;
......
...@@ -31,10 +31,11 @@ ...@@ -31,10 +31,11 @@
#include <linux/mfd/core.h> #include <linux/mfd/core.h>
#include <linux/mfd/abx500.h> #include <linux/mfd/abx500.h>
#include <linux/mfd/abx500/ab8500.h> #include <linux/mfd/abx500/ab8500.h>
#include <linux/mfd/abx500/ab8500-bm.h>
#include <linux/iio/consumer.h> #include <linux/iio/consumer.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include "ab8500-bm.h"
#define MILLI_TO_MICRO 1000 #define MILLI_TO_MICRO 1000
#define FG_LSB_IN_MA 1627 #define FG_LSB_IN_MA 1627
#define QLSB_NANO_AMP_HOURS_X10 1071 #define QLSB_NANO_AMP_HOURS_X10 1071
...@@ -3026,7 +3027,6 @@ static const struct power_supply_desc ab8500_fg_desc = { ...@@ -3026,7 +3027,6 @@ static const struct power_supply_desc ab8500_fg_desc = {
static int ab8500_fg_probe(struct platform_device *pdev) static int ab8500_fg_probe(struct platform_device *pdev)
{ {
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
struct abx500_bm_data *plat = pdev->dev.platform_data;
struct power_supply_config psy_cfg = {}; struct power_supply_config psy_cfg = {};
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct ab8500_fg *di; struct ab8500_fg *di;
...@@ -3037,19 +3037,13 @@ static int ab8500_fg_probe(struct platform_device *pdev) ...@@ -3037,19 +3037,13 @@ static int ab8500_fg_probe(struct platform_device *pdev)
if (!di) if (!di)
return -ENOMEM; return -ENOMEM;
if (!plat) { di->bm = &ab8500_bm_data;
dev_err(dev, "no battery management data supplied\n");
return -EINVAL;
}
di->bm = plat;
if (np) {
ret = ab8500_bm_of_probe(dev, np, di->bm); ret = ab8500_bm_of_probe(dev, np, di->bm);
if (ret) { if (ret) {
dev_err(dev, "failed to get battery information\n"); dev_err(dev, "failed to get battery information\n");
return ret; return ret;
} }
}
mutex_init(&di->cc_lock); mutex_init(&di->cc_lock);
......
...@@ -28,10 +28,11 @@ ...@@ -28,10 +28,11 @@
#include <linux/mfd/core.h> #include <linux/mfd/core.h>
#include <linux/mfd/abx500.h> #include <linux/mfd/abx500.h>
#include <linux/mfd/abx500/ab8500.h> #include <linux/mfd/abx500/ab8500.h>
#include <linux/mfd/abx500/ux500_chargalg.h>
#include <linux/mfd/abx500/ab8500-bm.h>
#include <linux/notifier.h> #include <linux/notifier.h>
#include "ab8500-bm.h"
#include "ab8500-chargalg.h"
/* Watchdog kick interval */ /* Watchdog kick interval */
#define CHG_WD_INTERVAL (6 * HZ) #define CHG_WD_INTERVAL (6 * HZ)
...@@ -1980,7 +1981,6 @@ static const struct power_supply_desc abx500_chargalg_desc = { ...@@ -1980,7 +1981,6 @@ static const struct power_supply_desc abx500_chargalg_desc = {
static int abx500_chargalg_probe(struct platform_device *pdev) static int abx500_chargalg_probe(struct platform_device *pdev)
{ {
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
struct abx500_bm_data *plat = pdev->dev.platform_data;
struct power_supply_config psy_cfg = {}; struct power_supply_config psy_cfg = {};
struct abx500_chargalg *di; struct abx500_chargalg *di;
int ret = 0; int ret = 0;
...@@ -1991,19 +1991,13 @@ static int abx500_chargalg_probe(struct platform_device *pdev) ...@@ -1991,19 +1991,13 @@ static int abx500_chargalg_probe(struct platform_device *pdev)
return -ENOMEM; return -ENOMEM;
} }
if (!plat) { di->bm = &ab8500_bm_data;
dev_err(&pdev->dev, "no battery management data supplied\n");
return -EINVAL;
}
di->bm = plat;
if (np) {
ret = ab8500_bm_of_probe(&pdev->dev, np, di->bm); ret = ab8500_bm_of_probe(&pdev->dev, np, di->bm);
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to get battery information\n"); dev_err(&pdev->dev, "failed to get battery information\n");
return ret; return ret;
} }
}
/* get device struct and parent */ /* get device struct and parent */
di->dev = &pdev->dev; di->dev = &pdev->dev;
......
...@@ -18,13 +18,13 @@ ...@@ -18,13 +18,13 @@
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/mfd/abx500/ab8500.h> #include <linux/mfd/abx500/ab8500.h>
#include <linux/mfd/abx500/ab8500-bm.h>
#include <linux/mfd/abx500/ux500_chargalg.h>
#include <linux/pm2301_charger.h> #include <linux/pm2301_charger.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/pm.h> #include <linux/pm.h>
#include "ab8500-bm.h"
#include "ab8500-chargalg.h"
#include "pm2301_charger.h" #include "pm2301_charger.h"
#define to_pm2xxx_charger_ac_device_info(x) container_of((x), \ #define to_pm2xxx_charger_ac_device_info(x) container_of((x), \
......
...@@ -28,282 +28,6 @@ struct abx500_init_settings { ...@@ -28,282 +28,6 @@ struct abx500_init_settings {
u8 setting; u8 setting;
}; };
/* Battery driver related data */
/*
* ADC for the battery thermistor.
* When using the ABx500_ADC_THERM_BATCTRL the battery ID resistor is combined
* with a NTC resistor to both identify the battery and to measure its
* temperature. Different phone manufactures uses different techniques to both
* identify the battery and to read its temperature.
*/
enum abx500_adc_therm {
ABx500_ADC_THERM_BATCTRL,
ABx500_ADC_THERM_BATTEMP,
};
/**
* struct abx500_res_to_temp - defines one point in a temp to res curve. To
* be used in battery packs that combines the identification resistor with a
* NTC resistor.
* @temp: battery pack temperature in Celsius
* @resist: NTC resistor net total resistance
*/
struct abx500_res_to_temp {
int temp;
int resist;
};
/**
* struct abx500_v_to_cap - Table for translating voltage to capacity
* @voltage: Voltage in mV
* @capacity: Capacity in percent
*/
struct abx500_v_to_cap {
int voltage;
int capacity;
};
/* Forward declaration */
struct abx500_fg;
/**
* struct abx500_fg_parameters - Fuel gauge algorithm parameters, in seconds
* if not specified
* @recovery_sleep_timer: Time between measurements while recovering
* @recovery_total_time: Total recovery time
* @init_timer: Measurement interval during startup
* @init_discard_time: Time we discard voltage measurement at startup
* @init_total_time: Total init time during startup
* @high_curr_time: Time current has to be high to go to recovery
* @accu_charging: FG accumulation time while charging
* @accu_high_curr: FG accumulation time in high current mode
* @high_curr_threshold: High current threshold, in mA
* @lowbat_threshold: Low battery threshold, in mV
* @overbat_threshold: Over battery threshold, in mV
* @battok_falling_th_sel0 Threshold in mV for battOk signal sel0
* Resolution in 50 mV step.
* @battok_raising_th_sel1 Threshold in mV for battOk signal sel1
* Resolution in 50 mV step.
* @user_cap_limit Capacity reported from user must be within this
* limit to be considered as sane, in percentage
* points.
* @maint_thres This is the threshold where we stop reporting
* battery full while in maintenance, in per cent
* @pcut_enable: Enable power cut feature in ab8505
* @pcut_max_time: Max time threshold
* @pcut_flag_time: Flagtime threshold
* @pcut_max_restart: Max number of restarts
* @pcut_debounce_time: Sets battery debounce time
*/
struct abx500_fg_parameters {
int recovery_sleep_timer;
int recovery_total_time;
int init_timer;
int init_discard_time;
int init_total_time;
int high_curr_time;
int accu_charging;
int accu_high_curr;
int high_curr_threshold;
int lowbat_threshold;
int overbat_threshold;
int battok_falling_th_sel0;
int battok_raising_th_sel1;
int user_cap_limit;
int maint_thres;
bool pcut_enable;
u8 pcut_max_time;
u8 pcut_flag_time;
u8 pcut_max_restart;
u8 pcut_debounce_time;
};
/**
* struct abx500_charger_maximization - struct used by the board config.
* @use_maxi: Enable maximization for this battery type
* @maxi_chg_curr: Maximum charger current allowed
* @maxi_wait_cycles: cycles to wait before setting charger current
* @charger_curr_step delta between two charger current settings (mA)
*/
struct abx500_maxim_parameters {
bool ena_maxi;
int chg_curr;
int wait_cycles;
int charger_curr_step;
};
/**
* struct abx500_battery_type - different batteries supported
* @name: battery technology
* @resis_high: battery upper resistance limit
* @resis_low: battery lower resistance limit
* @charge_full_design: Maximum battery capacity in mAh
* @nominal_voltage: Nominal voltage of the battery in mV
* @termination_vol: max voltage upto which battery can be charged
* @termination_curr battery charging termination current in mA
* @recharge_cap battery capacity limit that will trigger a new
* full charging cycle in the case where maintenan-
* -ce charging has been disabled
* @normal_cur_lvl: charger current in normal state in mA
* @normal_vol_lvl: charger voltage in normal state in mV
* @maint_a_cur_lvl: charger current in maintenance A state in mA
* @maint_a_vol_lvl: charger voltage in maintenance A state in mV
* @maint_a_chg_timer_h: charge time in maintenance A state
* @maint_b_cur_lvl: charger current in maintenance B state in mA
* @maint_b_vol_lvl: charger voltage in maintenance B state in mV
* @maint_b_chg_timer_h: charge time in maintenance B state
* @low_high_cur_lvl: charger current in temp low/high state in mA
* @low_high_vol_lvl: charger voltage in temp low/high state in mV'
* @battery_resistance: battery inner resistance in mOhm.
* @n_r_t_tbl_elements: number of elements in r_to_t_tbl
* @r_to_t_tbl: table containing resistance to temp points
* @n_v_cap_tbl_elements: number of elements in v_to_cap_tbl
* @v_to_cap_tbl: Voltage to capacity (in %) table
* @n_batres_tbl_elements number of elements in the batres_tbl
* @batres_tbl battery internal resistance vs temperature table
*/
struct abx500_battery_type {
int name;
int resis_high;
int resis_low;
int charge_full_design;
int nominal_voltage;
int termination_vol;
int termination_curr;
int recharge_cap;
int normal_cur_lvl;
int normal_vol_lvl;
int maint_a_cur_lvl;
int maint_a_vol_lvl;
int maint_a_chg_timer_h;
int maint_b_cur_lvl;
int maint_b_vol_lvl;
int maint_b_chg_timer_h;
int low_high_cur_lvl;
int low_high_vol_lvl;
int battery_resistance;
int n_temp_tbl_elements;
const struct abx500_res_to_temp *r_to_t_tbl;
int n_v_cap_tbl_elements;
const struct abx500_v_to_cap *v_to_cap_tbl;
int n_batres_tbl_elements;
const struct batres_vs_temp *batres_tbl;
};
/**
* struct abx500_bm_capacity_levels - abx500 capacity level data
* @critical: critical capacity level in percent
* @low: low capacity level in percent
* @normal: normal capacity level in percent
* @high: high capacity level in percent
* @full: full capacity level in percent
*/
struct abx500_bm_capacity_levels {
int critical;
int low;
int normal;
int high;
int full;
};
/**
* struct abx500_bm_charger_parameters - Charger specific parameters
* @usb_volt_max: maximum allowed USB charger voltage in mV
* @usb_curr_max: maximum allowed USB charger current in mA
* @ac_volt_max: maximum allowed AC charger voltage in mV
* @ac_curr_max: maximum allowed AC charger current in mA
*/
struct abx500_bm_charger_parameters {
int usb_volt_max;
int usb_curr_max;
int ac_volt_max;
int ac_curr_max;
};
/**
* struct abx500_bm_data - abx500 battery management data
* @temp_under under this temp, charging is stopped
* @temp_low between this temp and temp_under charging is reduced
* @temp_high between this temp and temp_over charging is reduced
* @temp_over over this temp, charging is stopped
* @temp_now present battery temperature
* @temp_interval_chg temperature measurement interval in s when charging
* @temp_interval_nochg temperature measurement interval in s when not charging
* @main_safety_tmr_h safety timer for main charger
* @usb_safety_tmr_h safety timer for usb charger
* @bkup_bat_v voltage which we charge the backup battery with
* @bkup_bat_i current which we charge the backup battery with
* @no_maintenance indicates that maintenance charging is disabled
* @capacity_scaling indicates whether capacity scaling is to be used
* @abx500_adc_therm placement of thermistor, batctrl or battemp adc
* @chg_unknown_bat flag to enable charging of unknown batteries
* @enable_overshoot flag to enable VBAT overshoot control
* @auto_trig flag to enable auto adc trigger
* @fg_res resistance of FG resistor in 0.1mOhm
* @n_btypes number of elements in array bat_type
* @batt_id index of the identified battery in array bat_type
* @interval_charging charge alg cycle period time when charging (sec)
* @interval_not_charging charge alg cycle period time when not charging (sec)
* @temp_hysteresis temperature hysteresis
* @gnd_lift_resistance Battery ground to phone ground resistance (mOhm)
* @n_chg_out_curr number of elements in array chg_output_curr
* @n_chg_in_curr number of elements in array chg_input_curr
* @chg_output_curr charger output current level map
* @chg_input_curr charger input current level map
* @maxi maximization parameters
* @cap_levels capacity in percent for the different capacity levels
* @bat_type table of supported battery types
* @chg_params charger parameters
* @fg_params fuel gauge parameters
*/
struct abx500_bm_data {
int temp_under;
int temp_low;
int temp_high;
int temp_over;
int temp_now;
int temp_interval_chg;
int temp_interval_nochg;
int main_safety_tmr_h;
int usb_safety_tmr_h;
int bkup_bat_v;
int bkup_bat_i;
bool autopower_cfg;
bool ac_enabled;
bool usb_enabled;
bool no_maintenance;
bool capacity_scaling;
bool chg_unknown_bat;
bool enable_overshoot;
bool auto_trig;
enum abx500_adc_therm adc_therm;
int fg_res;
int n_btypes;
int batt_id;
int interval_charging;
int interval_not_charging;
int temp_hysteresis;
int gnd_lift_resistance;
int n_chg_out_curr;
int n_chg_in_curr;
int *chg_output_curr;
int *chg_input_curr;
const struct abx500_maxim_parameters *maxi;
const struct abx500_bm_capacity_levels *cap_levels;
struct abx500_battery_type *bat_type;
const struct abx500_bm_charger_parameters *chg_params;
const struct abx500_fg_parameters *fg_params;
};
enum {
NTC_EXTERNAL = 0,
NTC_INTERNAL,
};
int ab8500_bm_of_probe(struct device *dev,
struct device_node *np,
struct abx500_bm_data *bm);
int abx500_set_register_interruptible(struct device *dev, u8 bank, u8 reg, int abx500_set_register_interruptible(struct device *dev, u8 bank, u8 reg,
u8 value); u8 value);
int abx500_get_register_interruptible(struct device *dev, u8 bank, u8 reg, int abx500_get_register_interruptible(struct device *dev, u8 bank, u8 reg,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment