Commit c28dc9fc authored by Thomas Weißschuh's avatar Thomas Weißschuh Committed by Sebastian Reichel
Browse files

power: supply: cros_charge-control: hide start threshold on v2 cmd



ECs implementing the v2 command will not stop charging when the end
threshold is reached. Instead they will begin discharging until the
start threshold is reached, leading to permanent charge and discharge
cycles. This defeats the point of the charge control mechanism.

Avoid the issue by hiding the start threshold on v2 systems.
Instead on those systems program the EC with start == end which forces
the EC to reach and stay at that level.

v1 does not support thresholds and v3 works correctly,
at least judging from the code.

Reported-by: default avatarThomas Koch <linrunner@gmx.net>
Fixes: c6ed48ef ("power: supply: add ChromeOS EC based charge control driver")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarThomas Weißschuh <linux@weissschuh.net>
Link: https://lore.kernel.org/r/20241208-cros_charge-control-v2-v1-3-8d168d0f08a3@weissschuh.net


Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
parent e65a1b7f
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -139,6 +139,10 @@ static ssize_t cros_chctl_store_threshold(struct device *dev, struct cros_chctl_
		return -EINVAL;

	if (is_end_threshold) {
		/* Start threshold is not exposed, use fixed value */
		if (priv->cmd_version == 2)
			priv->current_start_threshold = val == 100 ? 0 : val;

		if (val < priv->current_start_threshold)
			return -EINVAL;
		priv->current_end_threshold = val;
@@ -234,12 +238,10 @@ static umode_t cros_chtl_attr_is_visible(struct kobject *kobj, struct attribute
{
	struct cros_chctl_priv *priv = cros_chctl_attr_to_priv(attr, n);

	if (priv->cmd_version < 2) {
		if (n == CROS_CHCTL_ATTR_START_THRESHOLD)
	if (n == CROS_CHCTL_ATTR_START_THRESHOLD && priv->cmd_version < 3)
		return 0;
		if (n == CROS_CHCTL_ATTR_END_THRESHOLD)
	else if (n == CROS_CHCTL_ATTR_END_THRESHOLD && priv->cmd_version < 2)
		return 0;
	}

	return attr->mode;
}