summaryrefslogtreecommitdiff
path: root/common/peripheral_charger.c
diff options
context:
space:
mode:
authorDaisuke Nojiri <dnojiri@chromium.org>2021-04-30 09:07:10 -0700
committerCommit Bot <commit-bot@chromium.org>2021-06-11 21:20:29 +0000
commit4a46ad60f03301f0184df4a0f977b02cfeb3a1f7 (patch)
tree8a69e9960bc058a88a0dfb8725d76108a62c645b /common/peripheral_charger.c
parentfae894230df4f0e34dc4f13c587ee4d721dfa812 (diff)
downloadchrome-ec-4a46ad60f03301f0184df4a0f977b02cfeb3a1f7.tar.gz
PCHG: Handle WLC_CHG_CTRL_DEVICE_STATE_DEVICE_DOCKED
We'll extend the period for a stylus to be statically charged so that EEPROM corruption can be avoided by not entering negotiated mode with a depleted battery. During this static charge period, the user currently doesn't see any charging indication. To prevent users from removing a stylus, we'll add a new state 'device docked' to ctn730. The EC firmware is updated to handle this new state as follows: - PCHG_STATE_DETECTED will be reused to indicate a device is in proximity but not ready for communication. - PCHG_STATE_CONNECTED will be added to indicate a device is ready for digital communication. This is formerly called DETECTED. - CTN730 driver produces PCHG_EVENT_DETECTED on 'docked' event and PCHG_EVENT_CONNECTED on 'detected' event. - When DEVICE_UNDOCKED is received in PCHG_STATE_DETECTED, transition to PCHG_STATE_ENABLED. BUG=b:189323070, b:173235954 BRANCH=trogdor TEST=Verify unpowered listener board can be detected. Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org> Change-Id: I7fa83f6dd31cf74eab7c158e557ddc09f8976798 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2920628 Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Diffstat (limited to 'common/peripheral_charger.c')
-rw-r--r--common/peripheral_charger.c52
1 files changed, 46 insertions, 6 deletions
diff --git a/common/peripheral_charger.c b/common/peripheral_charger.c
index 0b467afc6e..0a597ad6bd 100644
--- a/common/peripheral_charger.c
+++ b/common/peripheral_charger.c
@@ -65,6 +65,7 @@ static const char *_text_event(enum pchg_event event)
[PCHG_EVENT_ENABLED] = "ENABLED",
[PCHG_EVENT_DISABLED] = "DISABLED",
[PCHG_EVENT_DEVICE_DETECTED] = "DEVICE_DETECTED",
+ [PCHG_EVENT_DEVICE_CONNECTED] = "DEVICE_CONNECTED",
[PCHG_EVENT_DEVICE_LOST] = "DEVICE_LOST",
[PCHG_EVENT_CHARGE_STARTED] = "CHARGE_STARTED",
[PCHG_EVENT_CHARGE_UPDATE] = "CHARGE_UPDATE",
@@ -194,15 +195,15 @@ static void pchg_state_enabled(struct pchg *ctx)
ctx->state = PCHG_STATE_INITIALIZED;
break;
case PCHG_EVENT_DEVICE_DETECTED:
+ ctx->state = PCHG_STATE_DETECTED;
+ break;
+ case PCHG_EVENT_DEVICE_CONNECTED:
/*
* Proactively query SOC in case charging info won't be sent
* because device is already charged.
*/
ctx->cfg->drv->get_soc(ctx);
- ctx->state = PCHG_STATE_DETECTED;
- break;
- case PCHG_EVENT_CHARGE_STARTED:
- ctx->state = PCHG_STATE_CHARGING;
+ ctx->state = PCHG_STATE_CONNECTED;
break;
default:
break;
@@ -228,6 +229,42 @@ static void pchg_state_detected(struct pchg *ctx)
case PCHG_EVENT_DISABLED:
ctx->state = PCHG_STATE_INITIALIZED;
break;
+ case PCHG_EVENT_DEVICE_CONNECTED:
+ /*
+ * Proactively query SOC in case charging info won't be sent
+ * because device is already charged.
+ */
+ ctx->cfg->drv->get_soc(ctx);
+ ctx->state = PCHG_STATE_CONNECTED;
+ break;
+ case PCHG_EVENT_DEVICE_LOST:
+ ctx->battery_percent = 0;
+ ctx->state = PCHG_STATE_ENABLED;
+ break;
+ default:
+ break;
+ }
+}
+
+static void pchg_state_connected(struct pchg *ctx)
+{
+ int rv;
+
+ switch (ctx->event) {
+ case PCHG_EVENT_RESET:
+ ctx->state = pchg_reset(ctx);
+ break;
+ case PCHG_EVENT_DISABLE:
+ ctx->error |= PCHG_ERROR_HOST;
+ rv = ctx->cfg->drv->enable(ctx, false);
+ if (rv == EC_SUCCESS)
+ ctx->state = PCHG_STATE_INITIALIZED;
+ else if (rv != EC_SUCCESS_IN_PROGRESS)
+ CPRINTS("ERR: Failed to disable");
+ break;
+ case PCHG_EVENT_DISABLED:
+ ctx->state = PCHG_STATE_INITIALIZED;
+ break;
case PCHG_EVENT_CHARGE_STARTED:
ctx->state = PCHG_STATE_CHARGING;
break;
@@ -273,7 +310,7 @@ static void pchg_state_charging(struct pchg *ctx)
break;
case PCHG_EVENT_CHARGE_ENDED:
case PCHG_EVENT_CHARGE_STOPPED:
- ctx->state = PCHG_STATE_DETECTED;
+ ctx->state = PCHG_STATE_CONNECTED;
break;
default:
break;
@@ -395,6 +432,9 @@ static int pchg_run(struct pchg *ctx)
case PCHG_STATE_DETECTED:
pchg_state_detected(ctx);
break;
+ case PCHG_STATE_CONNECTED:
+ pchg_state_connected(ctx);
+ break;
case PCHG_STATE_CHARGING:
pchg_state_charging(ctx);
break;
@@ -546,7 +586,7 @@ static enum ec_status hc_pchg(struct host_cmd_handler_args *args)
ctx = &pchgs[port];
- if (ctx->state == PCHG_STATE_DETECTED
+ if (ctx->state == PCHG_STATE_CONNECTED
&& ctx->battery_percent >= ctx->cfg->full_percent)
r->state = PCHG_STATE_FULL;
else