Commit c862381b authored by Brady Norander's avatar Brady Norander Committed by Tzung-Bi Shih
Browse files

platform/chrome: cros_ec_lightbar: Check if ec supports suspend commands



The Chromebook Pixel 2013 (Link)'s ec does not support the lightbar manual
suspend commands.  As a result, attempting to suspend the device fails and
prints the following error:

    cros-ec-lightbar cros-ec-lightbar.3.auto: PM: dpm_run_callback(): platform_pm_suspend returns -22
    cros-ec-lightbar cros-ec-lightbar.3.auto: PM: failed to suspend: error -22
    PM: Some devices failed to suspend, or early wake event detected

Check the return value of lb_manual_suspend_ctrl in cros_ec_lightbar_probe
and disable manual suspend control if -EINVAL is returned.

Signed-off-by: default avatarBrady Norander <bradynorander@gmail.com>
Reviewed-by: default avatarBenson Leung <bleung@chromium.org>
Link: https://lore.kernel.org/r/20251030195910.8625-2-bradynorander@gmail.com


Signed-off-by: default avatarTzung-Bi Shih <tzungbi@kernel.org>
parent e4ee0bb0
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -30,6 +30,13 @@ static unsigned long lb_interval_jiffies = 50 * HZ / 1000;
 */
static bool userspace_control;

/*
 * Whether or not the lightbar supports the manual suspend commands.
 * The Pixel 2013 (Link) does not while all other devices with a
 * lightbar do.
 */
static bool has_manual_suspend;

static ssize_t interval_msec_show(struct device *dev,
				  struct device_attribute *attr, char *buf)
{
@@ -550,7 +557,7 @@ static int cros_ec_lightbar_probe(struct platform_device *pd)
		return -ENODEV;

	/* Take control of the lightbar from the EC. */
	lb_manual_suspend_ctrl(ec_dev, 1);
	has_manual_suspend = (lb_manual_suspend_ctrl(ec_dev, 1) != -EINVAL);

	ret = sysfs_create_group(&ec_dev->class_dev.kobj,
				 &cros_ec_lightbar_attr_group);
@@ -569,6 +576,7 @@ static void cros_ec_lightbar_remove(struct platform_device *pd)
			   &cros_ec_lightbar_attr_group);

	/* Let the EC take over the lightbar again. */
	if (has_manual_suspend)
		lb_manual_suspend_ctrl(ec_dev, 0);
}

@@ -576,7 +584,7 @@ static int __maybe_unused cros_ec_lightbar_resume(struct device *dev)
{
	struct cros_ec_dev *ec_dev = dev_get_drvdata(dev->parent);

	if (userspace_control)
	if (userspace_control || !has_manual_suspend)
		return 0;

	return lb_send_empty_cmd(ec_dev, LIGHTBAR_CMD_RESUME);
@@ -586,7 +594,7 @@ static int __maybe_unused cros_ec_lightbar_suspend(struct device *dev)
{
	struct cros_ec_dev *ec_dev = dev_get_drvdata(dev->parent);

	if (userspace_control)
	if (userspace_control || !has_manual_suspend)
		return 0;

	return lb_send_empty_cmd(ec_dev, LIGHTBAR_CMD_SUSPEND);