Samsung VZW MB1 update
/drivers/power/sec_battery.c
blob:663c5a6de2f7229e7414f4ca9395023f6cce5c2e -> blob:8db61d972ae4ca6415b4c7b39515d71e73c8d684
--- drivers/power/sec_battery.c
+++ drivers/power/sec_battery.c
@@ -60,6 +60,7 @@
#define TOTAL_EVENT_TIME (10 * 60) /* 10 minites */
static int is_charging_disabled;
+static unsigned int sec_bat_recovery_mode;
enum cable_type_t {
CABLE_TYPE_NONE = 0,
@@ -424,10 +425,11 @@ static int sec_bat_get_property(struct p
info->test_info.test_value);
val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
} else if (info->is_timeout_chgstop &&
- info->charging_status == POWER_SUPPLY_STATUS_FULL) {
+ info->charging_status == POWER_SUPPLY_STATUS_FULL &&
+ info->batt_soc != 100) {
/*
new concept : in case of time-out charging stop,
- Do not update FULL for UI,
+ Do not update FULL for UI except soc 100%,
Use same time-out value
for first charing and re-charging
*/
@@ -458,9 +460,40 @@ static int sec_bat_get_property(struct p
case POWER_SUPPLY_PROP_ONLINE:
if (info->charging_status == POWER_SUPPLY_STATUS_DISCHARGING &&
info->cable_type != CABLE_TYPE_NONE) {
- val->intval = CABLE_TYPE_NONE;
- } else
- val->intval = info->cable_type;
+ val->intval = POWER_SUPPLY_TYPE_BATTERY;
+ } else {
+ switch (info->cable_type) {
+ case CABLE_TYPE_NONE:
+ val->intval = POWER_SUPPLY_TYPE_BATTERY;
+ break;
+ case CABLE_TYPE_USB:
+ val->intval = POWER_SUPPLY_TYPE_USB;
+ break;
+ case CABLE_TYPE_AC:
+ val->intval = POWER_SUPPLY_TYPE_MAINS;
+ break;
+ case CABLE_TYPE_MISC:
+ val->intval = POWER_SUPPLY_TYPE_MISC;
+ break;
+ case CABLE_TYPE_CARDOCK:
+ val->intval = POWER_SUPPLY_TYPE_CARDOCK;
+ break;
+ case CABLE_TYPE_UARTOFF:
+ val->intval = POWER_SUPPLY_TYPE_UARTOFF;
+ break;
+ case CABLE_TYPE_CDP:
+ val->intval = POWER_SUPPLY_TYPE_USB_CDP;
+ break;
+#if defined(CONFIG_WIRELESS_CHARGING)
+ case CABLE_TYPE_WPC:
+ val->intval = POWER_SUPPLY_TYPE_WPC;
+ break;
+#endif
+ default:
+ val->intval = POWER_SUPPLY_TYPE_UNKNOWN;
+ break;
+ }
+ }
break;
case POWER_SUPPLY_PROP_VOLTAGE_NOW:
val->intval = sec_bat_get_fuelgauge_data(info, FG_T_VCELL);
@@ -789,7 +822,8 @@ static int sec_ac_get_property(struct po
if (info->cable_type == CABLE_TYPE_MISC ||
info->cable_type == CABLE_TYPE_UARTOFF ||
info->cable_type == CABLE_TYPE_CARDOCK) {
- if (!info->dcin_intr_triggered)
+ if (sec_bat_is_charging(info)
+ == POWER_SUPPLY_STATUS_DISCHARGING)
val->intval = 0;
else
val->intval = 1;
@@ -1333,6 +1367,8 @@ static void sec_bat_cable_work(struct wo
wake_lock(&info->cable_wake_lock);
+ info->prev_cable = info->cable_type;
+
if ((info->present == BATT_STATUS_MISSING)
&& (info->cable_type != CABLE_TYPE_NONE)) {
pr_info("[battery] VF is open, do not care cable_work\n");
@@ -1361,6 +1397,7 @@ static void sec_bat_cable_work(struct wo
if (ret < 0)
pr_err("%s : failed to set charger state(%d)\n",
__func__, ret);
+ wake_lock_timeout(&info->cable_wake_lock, 2*HZ);
queue_delayed_work(info->monitor_wqueue,
&info->cable_work,
msecs_to_jiffies(500));
@@ -1418,12 +1455,12 @@ static void sec_bat_cable_work(struct wo
case CABLE_TYPE_MISC:
case CABLE_TYPE_CARDOCK:
case CABLE_TYPE_UARTOFF:
- if (!info->dcin_intr_triggered && !info->lpm_chg_mode) {
+ if (sec_bat_is_charging(info)
+ == POWER_SUPPLY_STATUS_DISCHARGING) {
wake_lock_timeout(&info->vbus_wake_lock, 5 * HZ);
pr_info("%s : dock inserted, but dcin nok skip charging!\n",
__func__);
- sec_bat_enable_charging(info, true);
- info->charging_enabled = false;
+ sec_bat_enable_charging(info, false);
break;
}
case CABLE_TYPE_UNKNOWN:
@@ -1578,22 +1615,40 @@ static void sec_bat_monitor_work(struct
goto monitoring_skip;
}
- pm8921_enable_batt_therm(1);
- /* check battery 5 times */
- for (i = 0; i < 5; i++) {
- msleep(500);
- info->present = !gpio_get_value_cansleep(info->batt_int);
-
- /* If the battery is missing, then check more */
- if (info->present) {
- i++;
- break;
+ if (sec_bat_recovery_mode == 1
+ || system_state == SYSTEM_RESTART) {
+ pm8921_enable_batt_therm(0);
+ info->present = 1;
+ pr_info("%s : recovery/restart, skip batt check(1)\n",
+ __func__);
+ } else {
+ pm8921_enable_batt_therm(1);
+ /* check battery 5 times */
+ for (i = 0; i < 5; i++) {
+ msleep(500);
+ if (sec_bat_recovery_mode == 1
+ || system_state == SYSTEM_RESTART) {
+ pm8921_enable_batt_therm(0);
+ info->present = 1;
+ pr_info("%s : recovery/restart, skip batt check(2)\n",
+ __func__);
+ break;
+ }
+
+ info->present = !gpio_get_value_cansleep(
+ info->batt_int);
+
+ /* If the battery is missing, then check more */
+ if (info->present) {
+ i++;
+ break;
+ }
}
+ pm8921_enable_batt_therm(0);
+ pr_info("%s: battery check is %s (%d time%c)\n",
+ __func__, info->present ? "present" : "absent",
+ i, (i == 1) ? ' ' : 's');
}
- pm8921_enable_batt_therm(0);
- pr_info("%s: battery check is %s (%d time%c)\n",
- __func__, info->present ? "present" : "absent",
- i, (i == 1) ? ' ' : 's');
if ((info->present == BATT_STATUS_MISSING)
&& (info->cable_type != CABLE_TYPE_NONE)) {
@@ -1726,8 +1781,10 @@ static void sec_bat_monitor_work(struct
info->batt_soc = 100;
info->check_full_state_cnt++;
} else {
- if (info->batt_presoc > info->batt_soc) {
+ if ((info->batt_presoc > info->batt_soc)
+ && (info->check_full_state_cnt <= 4)) {
info->batt_soc = info->batt_presoc - 1;
+ info->check_full_state_cnt++;
} else {
info->check_full_state = false;
info->check_full_state_cnt = 0;
@@ -1782,6 +1839,7 @@ static void sec_bat_measure_work(struct
}
local_irq_restore(flags);
+ wake_lock_timeout(&info->cable_wake_lock, 2*HZ);
queue_delayed_work(info->monitor_wqueue,
&info->cable_work, HZ);
}
@@ -1881,7 +1939,7 @@ static struct device_attribute sec_batte
SEC_BATTERY_ATTR(batt_current_adc),
SEC_BATTERY_ATTR(batt_esus_test),
SEC_BATTERY_ATTR(sys_rev),
- SEC_BATTERY_ATTR(fg_psoc),
+ SEC_BATTERY_ATTR(batt_read_raw_soc),
SEC_BATTERY_ATTR(batt_reset_soc),
#ifdef CONFIG_WIRELESS_CHARGING
SEC_BATTERY_ATTR(wc_status),
@@ -1933,7 +1991,7 @@ enum {
BATT_CURRENT_ADC,
BATT_ESUS_TEST,
BATT_SYSTEM_REV,
- BATT_FG_PSOC,
+ BATT_READ_RAW_SOC,
BATT_RESET_SOC,
#ifdef CONFIG_WIRELESS_CHARGING
BATT_WC_STATUS,
@@ -2078,12 +2136,44 @@ static ssize_t sec_bat_show_property(str
info->batt_temp_radc);
break;
case BATT_CHARGING_SOURCE:
- val = info->cable_type;
+
+ switch(info->cable_type) {
+ case CABLE_TYPE_NONE:
+ val = POWER_SUPPLY_TYPE_BATTERY;
+ break;
+ case CABLE_TYPE_USB:
+ val = POWER_SUPPLY_TYPE_USB;
+ break;
+ case CABLE_TYPE_AC:
+ val = POWER_SUPPLY_TYPE_MAINS;
+ break;
+ case CABLE_TYPE_MISC:
+ val = POWER_SUPPLY_TYPE_MISC;
+ break;
+ case CABLE_TYPE_CARDOCK:
+ val = POWER_SUPPLY_TYPE_CARDOCK;
+ break;
+ case CABLE_TYPE_UARTOFF:
+ val = POWER_SUPPLY_TYPE_UARTOFF;
+ break;
+ case CABLE_TYPE_CDP:
+ val = POWER_SUPPLY_TYPE_USB_CDP;
+ break;
+#ifdef CONFIG_WIRELESS_CHARGING
+ case CABLE_TYPE_WPC:
+ val = POWER_SUPPLY_TYPE_WPC;
+ break;
+#endif
+ default:
+ val = POWER_SUPPLY_TYPE_UNKNOWN;
+ break;
+ }
+
/*val = 2; // for lpm test */
if (info->lpm_chg_mode &&
info->cable_type != CABLE_TYPE_NONE &&
info->charging_status == POWER_SUPPLY_STATUS_DISCHARGING) {
- val = CABLE_TYPE_NONE;
+ val = POWER_SUPPLY_TYPE_BATTERY;
}
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", val);
break;
@@ -2140,7 +2230,7 @@ static ssize_t sec_bat_show_property(str
case BATT_SYSTEM_REV:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", info->hw_rev);
break;
- case BATT_FG_PSOC:
+ case BATT_READ_RAW_SOC:
val = sec_bat_get_fuelgauge_data(info, FG_T_PSOC);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", val);
break;
@@ -2530,6 +2620,25 @@ static void sec_bat_late_resume(struct e
return;
}
+static int __init sec_bat_current_boot_mode(char *mode)
+{
+ /*
+ * 1 is recovery booting
+ * 0 is normal booting
+ */
+
+ if (strncmp(mode, "1", 1) == 0)
+ sec_bat_recovery_mode = 1;
+ else
+ sec_bat_recovery_mode = 0;
+
+ pr_info("%s : %s", __func__, sec_bat_recovery_mode == 1 ?
+ "recovery" : "normal");
+
+ return 1;
+}
+__setup("androidboot.batt_check_recovery=", sec_bat_current_boot_mode);
+
static __devinit int sec_bat_probe(struct platform_device *pdev)
{
struct sec_bat_platform_data *pdata = dev_get_platdata(&pdev->dev);