.charger_curr_step = 100,
};
-static const struct abx500_maxim_parameters abx540_maxi_params = {
- .ena_maxi = true,
- .chg_curr = 3000,
- .wait_cycles = 10,
- .charger_curr_step = 200,
-};
-
static const struct abx500_bm_charger_parameters chg = {
.usb_volt_max = 5500,
.usb_curr_max = 1500,
900, 1000, 1100, 1200, 1300, 1400, 1500, 1500,
};
-static int ab8540_charge_output_curr_map[] = {
- 0, 0, 0, 75, 100, 125, 150, 175,
- 200, 225, 250, 275, 300, 325, 350, 375,
- 400, 425, 450, 475, 500, 525, 550, 575,
- 600, 625, 650, 675, 700, 725, 750, 775,
- 800, 825, 850, 875, 900, 925, 950, 975,
- 1000, 1025, 1050, 1075, 1100, 1125, 1150, 1175,
- 1200, 1225, 1250, 1275, 1300, 1325, 1350, 1375,
- 1400, 1425, 1450, 1500, 1600, 1700, 1900, 2000,
-};
-
/*
* This array maps the raw hex value to charger input current used by the
* AB8500 values
700, 800, 900, 1000, 1100, 1300, 1400, 1500,
};
-static int ab8540_charge_input_curr_map[] = {
- 25, 50, 75, 100, 125, 150, 175, 200,
- 225, 250, 275, 300, 325, 350, 375, 400,
- 425, 450, 475, 500, 525, 550, 575, 600,
- 625, 650, 675, 700, 725, 750, 775, 800,
- 825, 850, 875, 900, 925, 950, 975, 1000,
- 1025, 1050, 1075, 1100, 1125, 1150, 1175, 1200,
- 1225, 1250, 1275, 1300, 1325, 1350, 1375, 1400,
- 1425, 1450, 1475, 1500, 1500, 1500, 1500, 1500,
-};
-
struct abx500_bm_data ab8500_bm_data = {
.temp_under = 3,
.temp_low = 8,
.n_chg_in_curr = ARRAY_SIZE(ab8500_charge_input_curr_map),
};
-struct abx500_bm_data ab8540_bm_data = {
- .temp_under = 3,
- .temp_low = 8,
- .temp_high = 43,
- .temp_over = 48,
- .main_safety_tmr_h = 4,
- .temp_interval_chg = 20,
- .temp_interval_nochg = 120,
- .usb_safety_tmr_h = 4,
- .bkup_bat_v = BUP_VCH_SEL_2P6V,
- .bkup_bat_i = BUP_ICH_SEL_150UA,
- .no_maintenance = false,
- .capacity_scaling = false,
- .adc_therm = ABx500_ADC_THERM_BATCTRL,
- .chg_unknown_bat = false,
- .enable_overshoot = false,
- .fg_res = 100,
- .cap_levels = &cap_levels,
- .bat_type = bat_type_thermistor,
- .n_btypes = ARRAY_SIZE(bat_type_thermistor),
- .batt_id = 0,
- .interval_charging = 5,
- .interval_not_charging = 120,
- .temp_hysteresis = 3,
- .gnd_lift_resistance = 0,
- .maxi = &abx540_maxi_params,
- .chg_params = &chg,
- .fg_params = &fg,
- .chg_output_curr = ab8540_charge_output_curr_map,
- .n_chg_out_curr = ARRAY_SIZE(ab8540_charge_output_curr_map),
- .chg_input_curr = ab8540_charge_input_curr_map,
- .n_chg_in_curr = ARRAY_SIZE(ab8540_charge_input_curr_map),
-};
-
int ab8500_bm_of_probe(struct device *dev,
struct device_node *np,
struct abx500_bm_data *bm)
/* Only do this for batteries with internal NTC */
if (di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL && enable) {
- if (is_ab8540(di->parent)) {
- if (di->curr_source == BTEMP_BATCTRL_CURR_SRC_60UA)
- curr = BAT_CTRL_60U_ENA;
- else
- curr = BAT_CTRL_120U_ENA;
- } else if (is_ab9540(di->parent) || is_ab8505(di->parent)) {
- if (di->curr_source == BTEMP_BATCTRL_CURR_SRC_16UA)
- curr = BAT_CTRL_16U_ENA;
- else
- curr = BAT_CTRL_18U_ENA;
- } else {
- if (di->curr_source == BTEMP_BATCTRL_CURR_SRC_7UA)
- curr = BAT_CTRL_7U_ENA;
- else
- curr = BAT_CTRL_20U_ENA;
- }
+ if (di->curr_source == BTEMP_BATCTRL_CURR_SRC_7UA)
+ curr = BAT_CTRL_7U_ENA;
+ else
+ curr = BAT_CTRL_20U_ENA;
dev_dbg(di->dev, "Set BATCTRL %duA\n", di->curr_source);
} else if (di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL && !enable) {
dev_dbg(di->dev, "Disable BATCTRL curr source\n");
- if (is_ab8540(di->parent)) {
- /* Write 0 to the curr bits */
- ret = abx500_mask_and_set_register_interruptible(
- di->dev,
- AB8500_CHARGER, AB8500_BAT_CTRL_CURRENT_SOURCE,
- BAT_CTRL_60U_ENA | BAT_CTRL_120U_ENA,
- ~(BAT_CTRL_60U_ENA | BAT_CTRL_120U_ENA));
- } else if (is_ab9540(di->parent) || is_ab8505(di->parent)) {
- /* Write 0 to the curr bits */
- ret = abx500_mask_and_set_register_interruptible(
- di->dev,
- AB8500_CHARGER, AB8500_BAT_CTRL_CURRENT_SOURCE,
- BAT_CTRL_16U_ENA | BAT_CTRL_18U_ENA,
- ~(BAT_CTRL_16U_ENA | BAT_CTRL_18U_ENA));
- } else {
- /* Write 0 to the curr bits */
- ret = abx500_mask_and_set_register_interruptible(
- di->dev,
- AB8500_CHARGER, AB8500_BAT_CTRL_CURRENT_SOURCE,
- BAT_CTRL_7U_ENA | BAT_CTRL_20U_ENA,
- ~(BAT_CTRL_7U_ENA | BAT_CTRL_20U_ENA));
- }
+ /* Write 0 to the curr bits */
+ ret = abx500_mask_and_set_register_interruptible(
+ di->dev,
+ AB8500_CHARGER, AB8500_BAT_CTRL_CURRENT_SOURCE,
+ BAT_CTRL_7U_ENA | BAT_CTRL_20U_ENA,
+ ~(BAT_CTRL_7U_ENA | BAT_CTRL_20U_ENA));
if (ret) {
dev_err(di->dev, "%s failed disabling current source\n",
* if we got an error above
*/
disable_curr_source:
- if (is_ab8540(di->parent)) {
- /* Write 0 to the curr bits */
- ret = abx500_mask_and_set_register_interruptible(di->dev,
- AB8500_CHARGER, AB8500_BAT_CTRL_CURRENT_SOURCE,
- BAT_CTRL_60U_ENA | BAT_CTRL_120U_ENA,
- ~(BAT_CTRL_60U_ENA | BAT_CTRL_120U_ENA));
- } else if (is_ab9540(di->parent) || is_ab8505(di->parent)) {
- /* Write 0 to the curr bits */
- ret = abx500_mask_and_set_register_interruptible(di->dev,
- AB8500_CHARGER, AB8500_BAT_CTRL_CURRENT_SOURCE,
- BAT_CTRL_16U_ENA | BAT_CTRL_18U_ENA,
- ~(BAT_CTRL_16U_ENA | BAT_CTRL_18U_ENA));
- } else {
- /* Write 0 to the curr bits */
- ret = abx500_mask_and_set_register_interruptible(di->dev,
- AB8500_CHARGER, AB8500_BAT_CTRL_CURRENT_SOURCE,
- BAT_CTRL_7U_ENA | BAT_CTRL_20U_ENA,
- ~(BAT_CTRL_7U_ENA | BAT_CTRL_20U_ENA));
- }
+ /* Write 0 to the curr bits */
+ ret = abx500_mask_and_set_register_interruptible(di->dev,
+ AB8500_CHARGER, AB8500_BAT_CTRL_CURRENT_SOURCE,
+ BAT_CTRL_7U_ENA | BAT_CTRL_20U_ENA,
+ ~(BAT_CTRL_7U_ENA | BAT_CTRL_20U_ENA));
if (ret) {
dev_err(di->dev, "%s failed disabling current source\n",
{
int res;
u8 i;
- if (is_ab8540(di->parent))
- di->curr_source = BTEMP_BATCTRL_CURR_SRC_60UA;
- else if (is_ab9540(di->parent) || is_ab8505(di->parent))
- di->curr_source = BTEMP_BATCTRL_CURR_SRC_16UA;
- else
- di->curr_source = BTEMP_BATCTRL_CURR_SRC_7UA;
+ di->curr_source = BTEMP_BATCTRL_CURR_SRC_7UA;
di->bm->batt_id = BATTERY_UNKNOWN;
res = ab8500_btemp_get_batctrl_res(di);
*/
if (di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL &&
di->bm->batt_id == 1) {
- if (is_ab8540(di->parent)) {
- dev_dbg(di->dev,
- "Set BATCTRL current source to 60uA\n");
- di->curr_source = BTEMP_BATCTRL_CURR_SRC_60UA;
- } else if (is_ab9540(di->parent) || is_ab8505(di->parent)) {
- dev_dbg(di->dev,
- "Set BATCTRL current source to 16uA\n");
- di->curr_source = BTEMP_BATCTRL_CURR_SRC_16UA;
- } else {
- dev_dbg(di->dev, "Set BATCTRL current source to 20uA\n");
- di->curr_source = BTEMP_BATCTRL_CURR_SRC_20UA;
- }
+ dev_dbg(di->dev, "Set BATCTRL current source to 20uA\n");
+ di->curr_source = BTEMP_BATCTRL_CURR_SRC_20UA;
}
return di->bm->batt_id;
#define MAIN_CH_INPUT_CURR_SHIFT 4
#define VBUS_IN_CURR_LIM_SHIFT 4
-#define AB8540_VBUS_IN_CURR_LIM_SHIFT 2
#define AUTO_VBUS_IN_CURR_LIM_SHIFT 4
-#define AB8540_AUTO_VBUS_IN_CURR_MASK 0x3F
#define VBUS_IN_CURR_LIM_RETRY_SET_TIME 30 /* seconds */
#define LED_INDICATOR_PWM_ENA 0x01
no_stepping = true;
break;
case AB8500_USBCH_IPT_CRNTLVL_REG:
- if (is_ab8540(di->parent))
- shift_value = AB8540_VBUS_IN_CURR_LIM_SHIFT;
- else
- shift_value = VBUS_IN_CURR_LIM_SHIFT;
+ shift_value = VBUS_IN_CURR_LIM_SHIFT;
prev_curr_index = (reg_value >> shift_value);
curr_index = ab8500_vbus_in_curr_to_regval(di, ich);
step_udelay = STEP_UDELAY * 100;
return ret;
}
-/**
- * ab8540_charger_power_path_enable() - enable usb power path mode
- * @charger: pointer to the ux500_charger structure
- * @enable: enable/disable flag
- *
- * Enable or disable the power path for usb mode
- * Returns error code in case of failure else 0(on success)
- */
-static int ab8540_charger_power_path_enable(struct ux500_charger *charger,
- bool enable)
-{
- int ret;
- struct ab8500_charger *di;
-
- if (charger->psy->desc->type == POWER_SUPPLY_TYPE_USB)
- di = to_ab8500_charger_usb_device_info(charger);
- else
- return -ENXIO;
-
- ret = abx500_mask_and_set_register_interruptible(di->dev,
- AB8500_CHARGER, AB8540_USB_PP_MODE_REG,
- BUS_POWER_PATH_MODE_ENA, enable);
- if (ret) {
- dev_err(di->dev, "%s write failed\n", __func__);
- return ret;
- }
-
- return ret;
-}
-
-
-/**
- * ab8540_charger_usb_pre_chg_enable() - enable usb pre change
- * @charger: pointer to the ux500_charger structure
- * @enable: enable/disable flag
- *
- * Enable or disable the pre-chage for usb mode
- * Returns error code in case of failure else 0(on success)
- */
-static int ab8540_charger_usb_pre_chg_enable(struct ux500_charger *charger,
- bool enable)
-{
- int ret;
- struct ab8500_charger *di;
-
- if (charger->psy->desc->type == POWER_SUPPLY_TYPE_USB)
- di = to_ab8500_charger_usb_device_info(charger);
- else
- return -ENXIO;
-
- ret = abx500_mask_and_set_register_interruptible(di->dev,
- AB8500_CHARGER, AB8540_USB_PP_CHR_REG,
- BUS_POWER_PATH_PRECHG_ENA, enable);
- if (ret) {
- dev_err(di->dev, "%s write failed\n", __func__);
- return ret;
- }
-
- return ret;
-}
-
static int ab8500_charger_get_ext_psy_data(struct device *dev, void *data)
{
struct power_supply *psy;
abx500_set_register_interruptible(di->dev,
AB8500_CHARGER, AB8500_CHARGER_CTRL, 0x01);
- if (is_ab8540(di->parent))
- ret = abx500_get_register_interruptible(di->dev, AB8500_CHARGER,
- AB8540_CH_USBCH_STAT3_REG, ®_value);
- else
- ret = abx500_get_register_interruptible(di->dev, AB8500_CHARGER,
- AB8500_CH_USBCH_STAT2_REG, ®_value);
+ ret = abx500_get_register_interruptible(di->dev, AB8500_CHARGER,
+ AB8500_CH_USBCH_STAT2_REG, ®_value);
if (ret < 0) {
dev_err(di->dev, "%s read failed\n", __func__);
return;
}
- if (is_ab8540(di->parent))
- curr = di->bm->chg_input_curr[
- reg_value & AB8540_AUTO_VBUS_IN_CURR_MASK];
- else
- curr = di->bm->chg_input_curr[
- reg_value >> AUTO_VBUS_IN_CURR_LIM_SHIFT];
+ curr = di->bm->chg_input_curr[
+ reg_value >> AUTO_VBUS_IN_CURR_LIM_SHIFT];
if (di->max_usb_in_curr.calculated_max != curr) {
/* USB source is collapsing */
goto out;
}
- if (is_ab8540(di->parent))
- ret = abx500_set_register_interruptible(di->dev,
- AB8500_CHARGER, AB8500_CH_OPT_CRNTLVL_MAX_REG,
- CH_OP_CUR_LVL_2P);
- else
- ret = abx500_set_register_interruptible(di->dev,
- AB8500_CHARGER, AB8500_CH_OPT_CRNTLVL_MAX_REG,
- CH_OP_CUR_LVL_1P6);
+ ret = abx500_set_register_interruptible(di->dev,
+ AB8500_CHARGER, AB8500_CH_OPT_CRNTLVL_MAX_REG,
+ CH_OP_CUR_LVL_1P6);
if (ret) {
dev_err(di->dev,
"failed to set CH_OPT_CRNTLVL_MAX_REG\n");
}
}
- if (is_ab9540_2p0(di->parent) || is_ab9540_3p0(di->parent)
- || is_ab8505_2p0(di->parent) || is_ab8540(di->parent))
+ if (is_ab8505_2p0(di->parent))
ret = abx500_mask_and_set_register_interruptible(di->dev,
AB8500_CHARGER,
AB8500_USBCH_CTRL2_REG,
dev_err(di->dev, "failed to setup backup battery charging\n");
goto out;
}
- if (is_ab8540(di->parent)) {
- ret = abx500_set_register_interruptible(di->dev,
- AB8500_RTC,
- AB8500_RTC_CTRL1_REG,
- bup_vch_range | vbup33_vrtcn);
- if (ret) {
- dev_err(di->dev,
- "failed to setup backup battery charging\n");
- goto out;
- }
- }
/* Enable backup battery charging */
ret = abx500_mask_and_set_register_interruptible(di->dev,
goto out;
}
- if (is_ab8540(di->parent)) {
- ret = abx500_mask_and_set_register_interruptible(di->dev,
- AB8500_CHARGER, AB8540_USB_PP_MODE_REG,
- BUS_VSYS_VOL_SELECT_MASK, BUS_VSYS_VOL_SELECT_3P6V);
- if (ret) {
- dev_err(di->dev,
- "failed to setup usb power path vsys voltage\n");
- goto out;
- }
- ret = abx500_mask_and_set_register_interruptible(di->dev,
- AB8500_CHARGER, AB8540_USB_PP_CHR_REG,
- BUS_PP_PRECHG_CURRENT_MASK, 0);
- if (ret) {
- dev_err(di->dev,
- "failed to setup usb power path precharge current\n");
- goto out;
- }
- }
-
out:
return ret;
}
di->usb_chg.ops.check_enable = &ab8500_charger_usb_check_enable;
di->usb_chg.ops.kick_wd = &ab8500_charger_watchdog_kick;
di->usb_chg.ops.update_curr = &ab8500_charger_update_charger_current;
- di->usb_chg.ops.pp_enable = &ab8540_charger_power_path_enable;
- di->usb_chg.ops.pre_chg_enable = &ab8540_charger_usb_pre_chg_enable;
di->usb_chg.max_out_volt = ab8500_charger_voltage_map[
ARRAY_SIZE(ab8500_charger_voltage_map) - 1];
di->usb_chg.max_out_curr =
di->usb_chg.wdt_refresh = CHG_WD_INTERVAL;
di->usb_chg.enabled = di->bm->usb_enabled;
di->usb_chg.external = false;
- di->usb_chg.power_path = di->bm->usb_power_path;
di->usb_state.usb_current = -1;
/* Create a work queue for the charger */
goto out;
}
- if (((is_ab8505(di->parent) || is_ab9540(di->parent)) &&
- abx500_get_chip_id(di->dev) >= AB8500_CUT2P0)
- || is_ab8540(di->parent)) {
+ if (is_ab8505(di->parent)) {
ret = abx500_set_register_interruptible(di->dev, AB8500_RTC,
AB8505_RTC_PCUT_MAX_TIME_REG, di->bm->fg_params->pcut_max_time);
{
unsigned int i;
- if (((is_ab8505(di->parent) || is_ab9540(di->parent)) &&
- abx500_get_chip_id(di->dev) >= AB8500_CUT2P0)
- || is_ab8540(di->parent)) {
+ if (is_ab8505(di->parent)) {
for (i = 0; i < ARRAY_SIZE(ab8505_fg_sysfs_psy_attrs); i++)
if (device_create_file(&di->fg_psy->dev,
&ab8505_fg_sysfs_psy_attrs[i]))
{
unsigned int i;
- if (((is_ab8505(di->parent) || is_ab9540(di->parent)) &&
- abx500_get_chip_id(di->dev) >= AB8500_CUT2P0)
- || is_ab8540(di->parent)) {
+ if (is_ab8505(di->parent)) {
for (i = 0; i < ARRAY_SIZE(ab8505_fg_sysfs_psy_attrs); i++)
(void)device_remove_file(&di->fg_psy->dev,
&ab8505_fg_sysfs_psy_attrs[i]);
/* Five minutes expressed in seconds */
#define FIVE_MINUTES_IN_SECONDS 300
-/* Plus margin for the low battery threshold */
-#define BAT_PLUS_MARGIN (100)
-
#define CHARGALG_CURR_STEP_LOW 0
#define CHARGALG_CURR_STEP_HIGH 100
STATE_HW_TEMP_PROTECT_INIT,
STATE_HW_TEMP_PROTECT,
STATE_NORMAL_INIT,
- STATE_USB_PP_PRE_CHARGE,
STATE_NORMAL,
STATE_WAIT_FOR_RECHARGE_INIT,
STATE_WAIT_FOR_RECHARGE,
"HW_TEMP_PROTECT_INIT",
"HW_TEMP_PROTECT",
"NORMAL_INIT",
- "USB_PP_PRE_CHARGE",
"NORMAL",
"WAIT_FOR_RECHARGE_INIT",
"WAIT_FOR_RECHARGE",
return di->usb_chg->ops.enable(di->usb_chg, enable, vset, iset);
}
- /**
- * ab8540_chargalg_usb_pp_en() - Enable/ disable USB power path
- * @di: pointer to the abx500_chargalg structure
- * @enable: power path enable/disable
- *
- * The USB power path will be enable/ disable
- */
-static int ab8540_chargalg_usb_pp_en(struct abx500_chargalg *di, bool enable)
-{
- if (!di->usb_chg || !di->usb_chg->ops.pp_enable)
- return -ENXIO;
-
- return di->usb_chg->ops.pp_enable(di->usb_chg, enable);
-}
-
-/**
- * ab8540_chargalg_usb_pre_chg_en() - Enable/ disable USB pre-charge
- * @di: pointer to the abx500_chargalg structure
- * @enable: USB pre-charge enable/disable
- *
- * The USB USB pre-charge will be enable/ disable
- */
-static int ab8540_chargalg_usb_pre_chg_en(struct abx500_chargalg *di,
- bool enable)
-{
- if (!di->usb_chg || !di->usb_chg->ops.pre_chg_enable)
- return -ENXIO;
-
- return di->usb_chg->ops.pre_chg_enable(di->usb_chg, enable);
-}
-
/**
* abx500_chargalg_update_chg_curr() - Update charger current
* @di: pointer to the abx500_chargalg structure
di->batt_data.avg_curr > 0) {
if (++di->eoc_cnt >= EOC_COND_CNT) {
di->eoc_cnt = 0;
- if ((di->chg_info.charger_type & USB_CHG) &&
- (di->usb_chg->power_path))
- ab8540_chargalg_usb_pp_en(di, true);
di->charge_status = POWER_SUPPLY_STATUS_FULL;
di->maintenance_chg = true;
dev_dbg(di->dev, "EOC reached!\n");
break;
case STATE_NORMAL_INIT:
- if ((di->chg_info.charger_type & USB_CHG) &&
- di->usb_chg->power_path) {
- if (di->batt_data.volt >
- (di->bm->fg_params->lowbat_threshold +
- BAT_PLUS_MARGIN)) {
- ab8540_chargalg_usb_pre_chg_en(di, false);
- ab8540_chargalg_usb_pp_en(di, false);
- } else {
- ab8540_chargalg_usb_pp_en(di, true);
- ab8540_chargalg_usb_pre_chg_en(di, true);
- abx500_chargalg_state_to(di,
- STATE_USB_PP_PRE_CHARGE);
- break;
- }
- }
-
if (di->curr_status.curr_step == CHARGALG_CURR_STEP_LOW)
abx500_chargalg_stop_charging(di);
else {
break;
- case STATE_USB_PP_PRE_CHARGE:
- if (di->batt_data.volt >
- (di->bm->fg_params->lowbat_threshold +
- BAT_PLUS_MARGIN))
- abx500_chargalg_state_to(di, STATE_NORMAL_INIT);
- break;
-
case STATE_NORMAL:
handle_maxim_chg_curr(di);
if (di->charge_status == POWER_SUPPLY_STATUS_FULL &&
bool autopower_cfg;
bool ac_enabled;
bool usb_enabled;
- bool usb_power_path;
bool no_maintenance;
bool capacity_scaling;
bool chg_unknown_bat;
#define BAT_CTRL_20U_ENA 0x02
#define BAT_CTRL_18U_ENA 0x01
#define BAT_CTRL_16U_ENA 0x02
-#define BAT_CTRL_60U_ENA 0x01
-#define BAT_CTRL_120U_ENA 0x02
#define BAT_CTRL_CMP_ENA 0x04
#define FORCE_BAT_CTRL_CMP_HIGH 0x08
#define BAT_CTRL_PULL_UP_ENA 0x10
int (*check_enable) (struct ux500_charger *, int, int);
int (*kick_wd) (struct ux500_charger *);
int (*update_curr) (struct ux500_charger *, int);
- int (*pp_enable) (struct ux500_charger *, bool);
- int (*pre_chg_enable) (struct ux500_charger *, bool);
};
/**
* @max_out_curr maximum output charger current in mA
* @enabled indicates if this charger is used or not
* @external external charger unit (pm2xxx)
- * @power_path USB power path support
*/
struct ux500_charger {
struct power_supply *psy;
int wdt_refresh;
bool enabled;
bool external;
- bool power_path;
};
extern struct blocking_notifier_head charger_notifier_list;