platform/chrome: wilco_ec: Add Boot on AC support
Boot on AC is a policy which makes the device boot from S5 when AC power is connected. This is useful for users who want to run their device headless or with a dock. Signed-off-by: Nick Crews <ncrews@chromium.org> Signed-off-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
This commit is contained in:
parent
0c0b7ea23a
commit
4c1ca625c6
9
Documentation/ABI/testing/sysfs-platform-wilco-ec
Normal file
9
Documentation/ABI/testing/sysfs-platform-wilco-ec
Normal file
@ -0,0 +1,9 @@
|
||||
What: /sys/bus/platform/devices/GOOG000C\:00/boot_on_ac
|
||||
Date: April 2019
|
||||
KernelVersion: 5.3
|
||||
Description:
|
||||
Boot on AC is a policy which makes the device boot from S5
|
||||
when AC power is connected. This is useful for users who
|
||||
want to run their device headless or with a dock.
|
||||
|
||||
Input should be parseable by kstrtou8() to 0 or 1.
|
@ -1,6 +1,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
wilco_ec-objs := core.o mailbox.o properties.o
|
||||
wilco_ec-objs := core.o mailbox.o properties.o sysfs.o
|
||||
obj-$(CONFIG_WILCO_EC) += wilco_ec.o
|
||||
wilco_ec_debugfs-objs := debugfs.o
|
||||
obj-$(CONFIG_WILCO_EC_DEBUGFS) += wilco_ec_debugfs.o
|
||||
|
@ -89,8 +89,16 @@ static int wilco_ec_probe(struct platform_device *pdev)
|
||||
goto unregister_debugfs;
|
||||
}
|
||||
|
||||
ret = wilco_ec_add_sysfs(ec);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Failed to create sysfs entries: %d", ret);
|
||||
goto unregister_rtc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
unregister_rtc:
|
||||
platform_device_unregister(ec->rtc_pdev);
|
||||
unregister_debugfs:
|
||||
if (ec->debugfs_pdev)
|
||||
platform_device_unregister(ec->debugfs_pdev);
|
||||
@ -102,6 +110,7 @@ static int wilco_ec_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct wilco_ec_device *ec = platform_get_drvdata(pdev);
|
||||
|
||||
wilco_ec_remove_sysfs(ec);
|
||||
platform_device_unregister(ec->rtc_pdev);
|
||||
if (ec->debugfs_pdev)
|
||||
platform_device_unregister(ec->debugfs_pdev);
|
||||
|
77
drivers/platform/chrome/wilco_ec/sysfs.c
Normal file
77
drivers/platform/chrome/wilco_ec/sysfs.c
Normal file
@ -0,0 +1,77 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright 2019 Google LLC
|
||||
*
|
||||
* Sysfs properties to view and modify EC-controlled features on Wilco devices.
|
||||
* The entries will appear under /sys/bus/platform/devices/GOOG000C:00/
|
||||
*
|
||||
* See Documentation/ABI/testing/sysfs-platform-wilco-ec for more information.
|
||||
*/
|
||||
|
||||
#include <linux/platform_data/wilco-ec.h>
|
||||
#include <linux/sysfs.h>
|
||||
|
||||
#define CMD_KB_CMOS 0x7C
|
||||
#define SUB_CMD_KB_CMOS_AUTO_ON 0x03
|
||||
|
||||
struct boot_on_ac_request {
|
||||
u8 cmd; /* Always CMD_KB_CMOS */
|
||||
u8 reserved1;
|
||||
u8 sub_cmd; /* Always SUB_CMD_KB_CMOS_AUTO_ON */
|
||||
u8 reserved3to5[3];
|
||||
u8 val; /* Either 0 or 1 */
|
||||
u8 reserved7;
|
||||
} __packed;
|
||||
|
||||
static ssize_t boot_on_ac_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct wilco_ec_device *ec = dev_get_drvdata(dev);
|
||||
struct boot_on_ac_request rq;
|
||||
struct wilco_ec_message msg;
|
||||
int ret;
|
||||
u8 val;
|
||||
|
||||
ret = kstrtou8(buf, 10, &val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (val > 1)
|
||||
return -EINVAL;
|
||||
|
||||
memset(&rq, 0, sizeof(rq));
|
||||
rq.cmd = CMD_KB_CMOS;
|
||||
rq.sub_cmd = SUB_CMD_KB_CMOS_AUTO_ON;
|
||||
rq.val = val;
|
||||
|
||||
memset(&msg, 0, sizeof(msg));
|
||||
msg.type = WILCO_EC_MSG_LEGACY;
|
||||
msg.request_data = &rq;
|
||||
msg.request_size = sizeof(rq);
|
||||
ret = wilco_ec_mailbox(ec, &msg);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR_WO(boot_on_ac);
|
||||
|
||||
static struct attribute *wilco_dev_attrs[] = {
|
||||
&dev_attr_boot_on_ac.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group wilco_dev_attr_group = {
|
||||
.attrs = wilco_dev_attrs,
|
||||
};
|
||||
|
||||
int wilco_ec_add_sysfs(struct wilco_ec_device *ec)
|
||||
{
|
||||
return sysfs_create_group(&ec->dev->kobj, &wilco_dev_attr_group);
|
||||
}
|
||||
|
||||
void wilco_ec_remove_sysfs(struct wilco_ec_device *ec)
|
||||
{
|
||||
sysfs_remove_group(&ec->dev->kobj, &wilco_dev_attr_group);
|
||||
}
|
@ -194,4 +194,16 @@ int wilco_ec_get_byte_property(struct wilco_ec_device *ec, u32 property_id,
|
||||
int wilco_ec_set_byte_property(struct wilco_ec_device *ec, u32 property_id,
|
||||
u8 val);
|
||||
|
||||
/**
|
||||
* wilco_ec_add_sysfs() - Create sysfs entries
|
||||
* @ec: Wilco EC device
|
||||
*
|
||||
* wilco_ec_remove_sysfs() needs to be called afterwards
|
||||
* to perform the necessary cleanup.
|
||||
*
|
||||
* Return: 0 on success or negative error code on failure.
|
||||
*/
|
||||
int wilco_ec_add_sysfs(struct wilco_ec_device *ec);
|
||||
void wilco_ec_remove_sysfs(struct wilco_ec_device *ec);
|
||||
|
||||
#endif /* WILCO_EC_H */
|
||||
|
Loading…
Reference in New Issue
Block a user