diff options
-rw-r--r-- | drivers/power/ab5500_btemp.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/drivers/power/ab5500_btemp.c b/drivers/power/ab5500_btemp.c index 7867455f493..111f0a8b107 100644 --- a/drivers/power/ab5500_btemp.c +++ b/drivers/power/ab5500_btemp.c @@ -38,6 +38,9 @@ #define RESET 0x00 #define ADOUT_10K_PULL_UP 0x07 +/* Enable battery temp monitoring manual mode */ +#define BTEMP_MANUAL_MONITORING + #define to_ab5500_btemp_device_info(x) container_of((x), \ struct ab5500_btemp, btemp_psy); @@ -102,6 +105,8 @@ static enum power_supply_property ab5500_btemp_props[] = { static LIST_HEAD(ab5500_btemp_list); +static int ab5500_btemp_bat_temp_trig(int mux); + struct ab5500_btemp *ab5500_btemp_get(void) { struct ab5500_btemp *di; @@ -451,11 +456,25 @@ static void ab5500_btemp_periodic_work(struct work_struct *work) power_supply_changed(&di->btemp_psy); } di->bat->temp_now = di->bat_temp; +#if defined(BTEMP_MANUAL_MONITORING) + /* Check for temperature limits */ + ab5500_btemp_bat_temp_trig(0); /* Schedule a new measurement */ + if (di->events.usb_conn) + queue_delayed_work(di->btemp_wq, + &di->btemp_periodic_work, + round_jiffies(di->bat->interval_charging * HZ)); + else + queue_delayed_work(di->btemp_wq, + &di->btemp_periodic_work, + round_jiffies(di->bat->interval_not_charging * HZ)); +#else + /* Schedule a new measurement */ queue_delayed_work(di->btemp_wq, &di->btemp_periodic_work, - round_jiffies(20 * HZ)); + round_jiffies(di->bat->interval_charging * HZ)); +#endif } /** @@ -604,13 +623,18 @@ static int ab5500_btemp_get_ext_psy_data(struct device *dev, void *data) /* USB disconnected */ if (!ret.intval && di->events.usb_conn) { di->events.usb_conn = false; +#if !defined(BTEMP_MANUAL_MONITORING) ab5500_btemp_periodic(di, false); +#endif } /* USB connected */ else if (ret.intval && !di->events.usb_conn) { di->events.usb_conn = true; + +#if !defined(BTEMP_MANUAL_MONITORING) ab5500_btemp_periodic(di, true); +#endif } break; default: @@ -646,6 +670,7 @@ static struct ab5500_btemp_interrupts ab5500_btemp_irq[] = { {"BATT_REMOVAL", ab5500_btemp_batt_removal_handler}, {"BATT_ATTACH", ab5500_btemp_batt_attach_handler}, }; + static int ab5500_btemp_bat_temp_trig(int mux) { struct ab5500_btemp *di = ab5500_btemp_get(); @@ -661,6 +686,7 @@ static int ab5500_btemp_bat_temp_trig(int mux) return 0;; } +#if !defined(BTEMP_MANUAL_MONITORING) static int ab5500_btemp_auto_temp(struct ab5500_btemp *di) { struct adc_auto_input *auto_ip; @@ -684,6 +710,7 @@ static int ab5500_btemp_auto_temp(struct ab5500_btemp *di) "failed to set auto trigger for battery temp\n"); return ret; } +#endif #if defined(CONFIG_PM) static int ab5500_btemp_resume(struct platform_device *pdev) @@ -831,14 +858,21 @@ static int __devinit ab5500_btemp_probe(struct platform_device *pdev) dev_dbg(di->dev, "Requested %s IRQ %d: %d\n", ab5500_btemp_irq[i].name, irq, ret); } +#if defined(BTEMP_MANUAL_MONITORING) + /* Schedule monitoring work only if battery type is known */ + if (di->bat->batt_id != BATTERY_UNKNOWN) + queue_delayed_work(di->btemp_wq, &di->btemp_periodic_work, 0); +#else ret = ab5500_btemp_auto_temp(di); if (ret) { dev_err(di->dev, "failed to register auto trigger for battery temp\n"); goto free_irq; } +#endif platform_set_drvdata(pdev, di); + list_add_tail(&di->node, &ab5500_btemp_list); dev_info(di->dev, "probe success\n"); return ret; |