static void bq2419x_work_thread(struct kthread_work *work) { struct bq2419x_chip *bq2419x = container_of(work, struct bq2419x_chip, bq_wdt_work); int ret; for (;;) { if (bq2419x->stop_thread) return; if (bq2419x->chg_restart_timeout) { mutex_lock(&bq2419x->mutex); bq2419x->chg_restart_timeout--; if (!bq2419x->chg_restart_timeout) { ret = bq2419x_charger_enable(bq2419x); if (ret < 0) dev_err(bq2419x->dev, "Charger enable failed %d", ret); } if (bq2419x->suspended) bq2419x->chg_restart_timeout = 0; mutex_unlock(&bq2419x->mutex); } ret = bq2419x_reset_wdt(bq2419x, "THREAD"); if (ret < 0) dev_err(bq2419x->dev, "bq2419x_reset_wdt failed: %d\n", ret); msleep(bq2419x->wdt_refresh_timeout * 1000); } }
static void bq2419x_work_thread(struct kthread_work *work) { struct bq2419x_chip *bq2419x = container_of(work, struct bq2419x_chip, bq_wdt_work); int ret; int val = 0; for (;;) { if (bq2419x->stop_thread) return; if (bq2419x->chg_restart_timeout) { mutex_lock(&bq2419x->mutex); bq2419x->chg_restart_timeout--; if (!bq2419x->chg_restart_timeout) { ret = bq2419x_charger_enable(bq2419x); if (ret < 0) dev_err(bq2419x->dev, "Charger enable failed %d", ret); ret = regmap_read(bq2419x->regmap, BQ2419X_SYS_STAT_REG, &val); if (ret < 0) dev_err(bq2419x->dev, "SYS_STAT_REG read failed %d\n", ret); /* * Update Charging status based on STAT register */ if ((val & BQ2419x_CHRG_STATE_MASK) == BQ2419x_CHRG_STATE_NOTCHARGING) { bq2419x->status = 0; if (bq2419x->update_status) bq2419x->update_status (bq2419x->status, 0); bq2419x->chg_restart_timeout = bq2419x->chg_restart_time / bq2419x->wdt_refresh_timeout; } else { bq2419x->status = 1; if (bq2419x->update_status) bq2419x->update_status (bq2419x->status, 0); } } if (bq2419x->suspended) bq2419x->chg_restart_timeout = 0; mutex_unlock(&bq2419x->mutex); } ret = bq2419x_reset_wdt(bq2419x, "THREAD"); if (ret < 0) dev_err(bq2419x->dev, "bq2419x_reset_wdt failed: %d\n", ret); msleep(bq2419x->wdt_refresh_timeout * 1000); } }
static int bq2419x_watchdog_init(struct bq2419x_chip *bq2419x, int timeout, const char *from) { int ret, val; unsigned int reg05; if (!timeout) { ret = regmap_update_bits(bq2419x->regmap, BQ2419X_TIME_CTRL_REG, BQ2419X_WD_MASK, 0); if (ret < 0) dev_err(bq2419x->dev, "TIME_CTRL_REG read failed: %d\n", ret); return ret; } if (timeout <= 60) { val = BQ2419X_WD_40ms; bq2419x->wdt_refresh_timeout = 25; } else if (timeout <= 120) { val = BQ2419X_WD_80ms; bq2419x->wdt_refresh_timeout = 50; } else { val = BQ2419X_WD_160ms; bq2419x->wdt_refresh_timeout = 125; } ret = regmap_read(bq2419x->regmap, BQ2419X_TIME_CTRL_REG, ®05); if (ret < 0) { dev_err(bq2419x->dev, "TIME_CTRL_REG read failed:%d\n", ret); return ret; } if ((reg05 & BQ2419X_WD_MASK) != val) { ret = regmap_update_bits(bq2419x->regmap, BQ2419X_TIME_CTRL_REG, BQ2419X_WD_MASK, val); if (ret < 0) { dev_err(bq2419x->dev, "TIME_CTRL_REG read failed: %d\n", ret); return ret; } } ret = bq2419x_reset_wdt(bq2419x, from); if (ret < 0) dev_err(bq2419x->dev, "bq2419x_reset_wdt failed: %d\n", ret); return ret; }
static void bq2419x_shutdown(struct i2c_client *client) { int ret = 0; struct bq2419x_chip *bq2419x = i2c_get_clientdata(client); int alarm_time = bq2419x->rtc_alarm_time; if (bq2419x->irq) disable_irq(bq2419x->irq); if (!bq2419x->rtc) bq2419x->rtc = alarmtimer_get_rtcdev(); if (bq2419x->in_current_limit > 500) { dev_info(bq2419x->dev, "HighCurrent %dmA charger is connectd\n", bq2419x->in_current_limit); ret = bq2419x_reset_wdt(bq2419x, "shutdown"); if (ret < 0) dev_err(bq2419x->dev, "bq2419x_reset_wdt failed: %d\n", ret); alarm_time = 20; } mutex_lock(&bq2419x->mutex); bq2419x->suspended = 1; mutex_unlock(&bq2419x->mutex); ret = bq2419x_charger_enable(bq2419x); if (ret < 0) dev_err(bq2419x->dev, "Charger enable failed %d", ret); if (bq2419x->in_current_limit <= 500) { /* Configure charging current to 500mA */ ret = regmap_write(bq2419x->regmap, BQ2419X_INPUT_SRC_REG, 0x32); if (ret < 0) dev_err(bq2419x->dev, "INPUT_SRC_REG write failed %d\n", ret); } ret = bq2419x_wakealarm(bq2419x, alarm_time); if (ret < 0) dev_err(bq2419x->dev, "RTC wake alarm config failed %d\n", ret); cancel_delayed_work_sync(&bq2419x->otg_reset_work); }