static void twl6030_start_usb_charger(struct twl6030_bci_device_info *di, int mA) { int ret; if (!is_battery_present(di)) { dev_err(di->dev, "BATTERY NOT DETECTED!\n"); return; } if (mA < 50) { ret = twl_i2c_write_u8(TWL6030_MODULE_CHARGER, 0, CONTROLLER_CTRL1); if (ret) goto err; return; } twl6030_config_vichrg_reg(di, di->charger_outcurrentmA); twl6030_config_cinlimit_reg(di, mA); twl6030_config_voreg_reg(di, di->platform_data->max_bat_voltagemV); twl6030_config_iterm_reg(di, di->platform_data->termination_currentmA); if (mA >= 50) { twl6030_set_watchdog(di, di->watchdog_duration); /* disable current termination, suspend mode, boost mode, etc */ twl_i2c_write_u8(TWL6030_MODULE_CHARGER, 0, CHARGERUSB_CTRL1); ret = twl_i2c_write_u8(TWL6030_MODULE_CHARGER, CONTROLLER_CTRL1_EN_CHARGER, CONTROLLER_CTRL1); if (ret) goto err; } /* printk("battery: CHARGER ON\n"); */ return; err: pr_err("%s: Error access to TWL6030 (%d)\n", __func__, ret); }
static void enable_charging(void) { struct charger_device_info *di; di = this_dev; unsigned int charger_incurrentmA; unsigned int charger_outcurrentmA; unsigned int regulation_voltagemV; unsigned int termination_currentmA; u8 state = 0; int cable_status = sec_bci->charger.cable_status; twl_i2c_read_u8(TWL6030_MODULE_ID1, &state, TWL6030_REG_GPADC_CTRL); state |= TWL6030_GPADC_CTRL_SCALER_EN_CH11; twl_i2c_write_u8(TWL6030_MODULE_ID1, state, TWL6030_REG_GPADC_CTRL); switch (cable_status) { case POWER_SUPPLY_TYPE_USB: charger_outcurrentmA = 400; charger_incurrentmA = 400; regulation_voltagemV = 4200; termination_currentmA = 150; dev_dbg(di->dev,"[TA] USB charging start\n"); break; case POWER_SUPPLY_TYPE_MAINS: charger_outcurrentmA = 1000; charger_incurrentmA = 1000; regulation_voltagemV = 4200; termination_currentmA = 150; dev_dbg(di->dev,"[TA] TA charging start\n"); break; default: dev_dbg(di->dev,"[TA] inproper charge mode\n"); goto end_enable_charging; } twl6030_config_vichrg_reg(di, charger_outcurrentmA); twl6030_config_cinlimit_reg(di, charger_incurrentmA); twl6030_config_voreg_reg(di, regulation_voltagemV); twl6030_config_iterm_reg(di, termination_currentmA); twl_i2c_write_u8(TWL6030_MODULE_CHARGER, CONTROLLER_CTRL1_EN_CHARGER, CONTROLLER_CTRL1); dev_dbg(di->dev, "ENABLE CHARGING\n"); sec_bci->charger.is_charging = true; end_enable_charging: ; }
static ssize_t set_termination_current(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { long val; int status = count; struct twl6030_bci_device_info *di = dev_get_drvdata(dev); if ((strict_strtol(buf, 10, &val) < 0) || (val < 50) || (val > 400)) return -EINVAL; di->platform_data->termination_currentmA = val; twl6030_config_iterm_reg(di, val); return status; }