#ifdef CONFIG_BOARD_REDRIDGE /* TODO: get rid of this */
platform_data.enable_current_sense = true;
platform_data.technology = POWER_SUPPLY_TECHNOLOGY_LION;
+ platform_data.temp_min_lim = 0;
+ platform_data.temp_max_lim = 60;
+ platform_data.volt_min_lim = 3200;
+ platform_data.volt_max_lim = 4500;
platform_data.restore_config_data = mfld_fg_restore_config_data;
platform_data.save_config_data = mfld_fg_save_config_data;
#endif
"SOC threshold write to maxim fail:%d", ret);
}
+static int max17042_get_batt_health(void)
+{
+ struct max17042_chip *chip = i2c_get_clientdata(max17042_client);
+ int vavg, temp, ret;
+
+ ret = read_batt_pack_temp(chip, &temp);
+ if (ret < 0) {
+ dev_err(&chip->client->dev,
+ "battery pack temp read fail:%d", ret);
+ return POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
+ }
+ if ((temp < chip->pdata->temp_min_lim) ||
+ (temp > chip->pdata->temp_max_lim)) {
+ dev_info(&chip->client->dev,
+ "Battery Over Temp condition Detected:%d\n", temp);
+ return POWER_SUPPLY_HEALTH_OVERHEAT;
+ }
+
+ ret = max17042_read_reg(chip->client, MAX17042_AvgVCELL);
+ if (ret < 0) {
+ dev_err(&chip->client->dev, "Vavg read fail:%d", ret);
+ return POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
+ }
+ /* get the voltage to milli volts */
+ vavg = ((ret >> 3) * MAX17042_VOLT_CONV_FCTR) / 1000;
+ if (vavg < chip->pdata->volt_min_lim) {
+ dev_info(&chip->client->dev,
+ "Low Battery condition Detected:%d\n", vavg);
+ return POWER_SUPPLY_HEALTH_DEAD;
+ }
+ if (vavg > chip->pdata->volt_max_lim) {
+ dev_info(&chip->client->dev,
+ "Battery Over Voltage condition Detected:%d\n", vavg);
+ return POWER_SUPPLY_HEALTH_OVERVOLTAGE;
+ }
+
+ return POWER_SUPPLY_HEALTH_GOOD;
+}
+
static void max17042_evt_worker(struct work_struct *work)
{
struct max17042_chip *chip = container_of(work,
/* get the battery health */
if (chip->pdata->battery_health)
health = chip->pdata->battery_health();
+ else
+ health = max17042_get_batt_health();
mutex_lock(&chip->batt_lock);
if (chip->pdata->battery_status)
chip->status = status;
- if (chip->pdata->battery_health)
- chip->health = health;
+ chip->health = health;
mutex_unlock(&chip->batt_lock);
/* Init maxim chip if it is not already initialized */
"error in charger, disabling charging\n");
smb347_charging_disable(smb);
- power_supply_changed(&smb->battery);
+ if (smb->pdata->show_battery)
+ power_supply_changed(&smb->battery);
ret = IRQ_HANDLED;
}
* disabled by the hardware.
*/
if (irqstat_c & (IRQSTAT_C_TERMINATION_IRQ | IRQSTAT_C_TAPER_IRQ)) {
- if (irqstat_c & IRQSTAT_C_TERMINATION_STAT)
+ if ((irqstat_c & IRQSTAT_C_TERMINATION_STAT) &&
+ smb->pdata->show_battery)
power_supply_changed(&smb->battery);
ret = IRQ_HANDLED;
}
}
}
- smb->battery.name = "smb347-battery";
- smb->battery.type = POWER_SUPPLY_TYPE_BATTERY;
- smb->battery.get_property = smb347_battery_get_property;
- smb->battery.properties = smb347_battery_properties;
- smb->battery.num_properties = ARRAY_SIZE(smb347_battery_properties);
- ret = power_supply_register(dev, &smb->battery);
- if (ret < 0) {
- if (smb->pdata->use_usb)
- power_supply_unregister(&smb->usb);
- if (smb->pdata->use_mains)
- power_supply_unregister(&smb->mains);
- return ret;
+ if (smb->pdata->show_battery) {
+ smb->battery.name = "smb347-battery";
+ smb->battery.type = POWER_SUPPLY_TYPE_BATTERY;
+ smb->battery.get_property = smb347_battery_get_property;
+ smb->battery.properties = smb347_battery_properties;
+ smb->battery.num_properties =
+ ARRAY_SIZE(smb347_battery_properties);
+ ret = power_supply_register(dev, &smb->battery);
+ if (ret < 0) {
+ if (smb->pdata->use_usb)
+ power_supply_unregister(&smb->usb);
+ if (smb->pdata->use_mains)
+ power_supply_unregister(&smb->mains);
+ return ret;
+ }
}
/*
}
}
- power_supply_unregister(&smb->battery);
+ if (smb->pdata->show_battery)
+ power_supply_unregister(&smb->battery);
if (smb->pdata->use_usb)
power_supply_unregister(&smb->usb);
if (smb->pdata->use_mains)
bool is_lowbatt_shutdown;
int technology;
+ /* battery safety thresholds */
+ int temp_min_lim; /* in degrees centigrade */
+ int temp_max_lim; /* in degrees centigrade */
+ int volt_min_lim; /* milli volts */
+ int volt_max_lim; /* milli volts */
+
int (*current_sense_enabled)(void);
int (*battery_present)(void);
int (*battery_health)(void);
unsigned int charge_current_compensation;
bool use_mains;
bool use_usb;
+ bool show_battery;
int irq_gpio;
enum smb347_chg_enable enable_control;
enum smb347_otg_control otg_control;