Merge branches 'acpi-button', 'acpi-battery', 'acpi-osl', 'acpi-video' and 'acpi-misc'
* acpi-button: ACPI: Add new tiny-power-button driver to directly signal init ACPI: button: move HIDs to acpi/button.h * acpi-battery: ACPI / battery: Cleanup Lenovo Ideapad Miix 320 DMI table entry ACPI / AC: Cleanup DMI quirk table * acpi-osl: ACPI: OSL: Add missing __acquires/__releases annotations * acpi-video: ACPI: video: remove redundant assignments to variable result * acpi-misc: ACPI: list_for_each_safe() -> list_for_each_entry_safe()
This commit is contained in:
commit
f94a57a189
|
@ -190,6 +190,30 @@ config ACPI_BUTTON
|
||||||
To compile this driver as a module, choose M here:
|
To compile this driver as a module, choose M here:
|
||||||
the module will be called button.
|
the module will be called button.
|
||||||
|
|
||||||
|
config ACPI_TINY_POWER_BUTTON
|
||||||
|
tristate "Tiny Power Button Driver"
|
||||||
|
depends on !ACPI_BUTTON
|
||||||
|
help
|
||||||
|
This driver provides a tiny alternative to the ACPI Button driver.
|
||||||
|
The tiny power button driver only handles the power button. Rather
|
||||||
|
than notifying userspace via the input layer or a netlink event, this
|
||||||
|
driver directly signals the init process to shut down.
|
||||||
|
|
||||||
|
This driver is particularly suitable for cloud and VM environments,
|
||||||
|
which use a simulated power button to initiate a controlled poweroff,
|
||||||
|
but which may not want to run a separate userspace daemon to process
|
||||||
|
input events.
|
||||||
|
|
||||||
|
config ACPI_TINY_POWER_BUTTON_SIGNAL
|
||||||
|
int "Tiny Power Button Signal"
|
||||||
|
depends on ACPI_TINY_POWER_BUTTON
|
||||||
|
default 38
|
||||||
|
help
|
||||||
|
Default signal to send to init in response to the power button.
|
||||||
|
|
||||||
|
Likely values here include 38 (SIGRTMIN+4) to power off, or 2
|
||||||
|
(SIGINT) to simulate Ctrl+Alt+Del.
|
||||||
|
|
||||||
config ACPI_VIDEO
|
config ACPI_VIDEO
|
||||||
tristate "Video"
|
tristate "Video"
|
||||||
depends on X86 && BACKLIGHT_CLASS_DEVICE
|
depends on X86 && BACKLIGHT_CLASS_DEVICE
|
||||||
|
|
|
@ -71,6 +71,7 @@ obj-$(CONFIG_ACPI_IPMI) += acpi_ipmi.o
|
||||||
|
|
||||||
obj-$(CONFIG_ACPI_AC) += ac.o
|
obj-$(CONFIG_ACPI_AC) += ac.o
|
||||||
obj-$(CONFIG_ACPI_BUTTON) += button.o
|
obj-$(CONFIG_ACPI_BUTTON) += button.o
|
||||||
|
obj-$(CONFIG_ACPI_TINY_POWER_BUTTON) += tiny-power-button.o
|
||||||
obj-$(CONFIG_ACPI_FAN) += fan.o
|
obj-$(CONFIG_ACPI_FAN) += fan.o
|
||||||
obj-$(CONFIG_ACPI_VIDEO) += video.o
|
obj-$(CONFIG_ACPI_VIDEO) += video.o
|
||||||
obj-$(CONFIG_ACPI_TAD) += acpi_tad.o
|
obj-$(CONFIG_ACPI_TAD) += acpi_tad.o
|
||||||
|
|
|
@ -293,29 +293,30 @@ static int __init ac_do_not_check_pmic_quirk(const struct dmi_system_id *d)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Please keep this list alphabetically sorted */
|
||||||
static const struct dmi_system_id ac_dmi_table[] __initconst = {
|
static const struct dmi_system_id ac_dmi_table[] __initconst = {
|
||||||
{
|
{
|
||||||
/* Thinkpad e530 */
|
/* ECS EF20EA, AXP288 PMIC but uses separate fuel-gauge */
|
||||||
.callback = thinkpad_e530_quirk,
|
|
||||||
.matches = {
|
|
||||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
||||||
DMI_MATCH(DMI_PRODUCT_NAME, "32597CG"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
/* ECS EF20EA */
|
|
||||||
.callback = ac_do_not_check_pmic_quirk,
|
.callback = ac_do_not_check_pmic_quirk,
|
||||||
.matches = {
|
.matches = {
|
||||||
DMI_MATCH(DMI_PRODUCT_NAME, "EF20EA"),
|
DMI_MATCH(DMI_PRODUCT_NAME, "EF20EA"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
/* Lenovo Ideapad Miix 320 */
|
/* Lenovo Ideapad Miix 320, AXP288 PMIC, separate fuel-gauge */
|
||||||
.callback = ac_do_not_check_pmic_quirk,
|
.callback = ac_do_not_check_pmic_quirk,
|
||||||
.matches = {
|
.matches = {
|
||||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "80XF"),
|
DMI_MATCH(DMI_PRODUCT_NAME, "80XF"),
|
||||||
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Lenovo MIIX 320-10ICR"),
|
DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo MIIX 320-10ICR"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* Lenovo Thinkpad e530, see comment in acpi_ac_notify() */
|
||||||
|
.callback = thinkpad_e530_quirk,
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "32597CG"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{},
|
{},
|
||||||
|
|
|
@ -943,7 +943,7 @@ acpi_video_init_brightness(struct acpi_video_device *device)
|
||||||
int i, max_level = 0;
|
int i, max_level = 0;
|
||||||
unsigned long long level, level_old;
|
unsigned long long level, level_old;
|
||||||
struct acpi_video_device_brightness *br = NULL;
|
struct acpi_video_device_brightness *br = NULL;
|
||||||
int result = -EINVAL;
|
int result;
|
||||||
|
|
||||||
result = acpi_video_get_levels(device->dev, &br, &max_level);
|
result = acpi_video_get_levels(device->dev, &br, &max_level);
|
||||||
if (result)
|
if (result)
|
||||||
|
|
|
@ -1365,19 +1365,19 @@ static const struct dmi_system_id bat_dmi_table[] __initconst = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
/* ECS EF20EA */
|
/* ECS EF20EA, AXP288 PMIC but uses separate fuel-gauge */
|
||||||
.callback = battery_do_not_check_pmic_quirk,
|
.callback = battery_do_not_check_pmic_quirk,
|
||||||
.matches = {
|
.matches = {
|
||||||
DMI_MATCH(DMI_PRODUCT_NAME, "EF20EA"),
|
DMI_MATCH(DMI_PRODUCT_NAME, "EF20EA"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
/* Lenovo Ideapad Miix 320 */
|
/* Lenovo Ideapad Miix 320, AXP288 PMIC, separate fuel-gauge */
|
||||||
.callback = battery_do_not_check_pmic_quirk,
|
.callback = battery_do_not_check_pmic_quirk,
|
||||||
.matches = {
|
.matches = {
|
||||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "80XF"),
|
DMI_MATCH(DMI_PRODUCT_NAME, "80XF"),
|
||||||
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Lenovo MIIX 320-10ICR"),
|
DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo MIIX 320-10ICR"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{},
|
{},
|
||||||
|
|
|
@ -30,17 +30,14 @@
|
||||||
#define ACPI_BUTTON_NOTIFY_STATUS 0x80
|
#define ACPI_BUTTON_NOTIFY_STATUS 0x80
|
||||||
|
|
||||||
#define ACPI_BUTTON_SUBCLASS_POWER "power"
|
#define ACPI_BUTTON_SUBCLASS_POWER "power"
|
||||||
#define ACPI_BUTTON_HID_POWER "PNP0C0C"
|
|
||||||
#define ACPI_BUTTON_DEVICE_NAME_POWER "Power Button"
|
#define ACPI_BUTTON_DEVICE_NAME_POWER "Power Button"
|
||||||
#define ACPI_BUTTON_TYPE_POWER 0x01
|
#define ACPI_BUTTON_TYPE_POWER 0x01
|
||||||
|
|
||||||
#define ACPI_BUTTON_SUBCLASS_SLEEP "sleep"
|
#define ACPI_BUTTON_SUBCLASS_SLEEP "sleep"
|
||||||
#define ACPI_BUTTON_HID_SLEEP "PNP0C0E"
|
|
||||||
#define ACPI_BUTTON_DEVICE_NAME_SLEEP "Sleep Button"
|
#define ACPI_BUTTON_DEVICE_NAME_SLEEP "Sleep Button"
|
||||||
#define ACPI_BUTTON_TYPE_SLEEP 0x03
|
#define ACPI_BUTTON_TYPE_SLEEP 0x03
|
||||||
|
|
||||||
#define ACPI_BUTTON_SUBCLASS_LID "lid"
|
#define ACPI_BUTTON_SUBCLASS_LID "lid"
|
||||||
#define ACPI_BUTTON_HID_LID "PNP0C0D"
|
|
||||||
#define ACPI_BUTTON_DEVICE_NAME_LID "Lid Switch"
|
#define ACPI_BUTTON_DEVICE_NAME_LID "Lid Switch"
|
||||||
#define ACPI_BUTTON_TYPE_LID 0x05
|
#define ACPI_BUTTON_TYPE_LID 0x05
|
||||||
|
|
||||||
|
|
|
@ -1598,6 +1598,7 @@ void acpi_os_delete_lock(acpi_spinlock handle)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
acpi_cpu_flags acpi_os_acquire_lock(acpi_spinlock lockp)
|
acpi_cpu_flags acpi_os_acquire_lock(acpi_spinlock lockp)
|
||||||
|
__acquires(lockp)
|
||||||
{
|
{
|
||||||
acpi_cpu_flags flags;
|
acpi_cpu_flags flags;
|
||||||
spin_lock_irqsave(lockp, flags);
|
spin_lock_irqsave(lockp, flags);
|
||||||
|
@ -1609,6 +1610,7 @@ acpi_cpu_flags acpi_os_acquire_lock(acpi_spinlock lockp)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void acpi_os_release_lock(acpi_spinlock lockp, acpi_cpu_flags flags)
|
void acpi_os_release_lock(acpi_spinlock lockp, acpi_cpu_flags flags)
|
||||||
|
__releases(lockp)
|
||||||
{
|
{
|
||||||
spin_unlock_irqrestore(lockp, flags);
|
spin_unlock_irqrestore(lockp, flags);
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,14 +22,13 @@ ACPI_MODULE_NAME("sleep")
|
||||||
static int
|
static int
|
||||||
acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset)
|
acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset)
|
||||||
{
|
{
|
||||||
struct list_head *node, *next;
|
struct acpi_device *dev, *tmp;
|
||||||
|
|
||||||
seq_printf(seq, "Device\tS-state\t Status Sysfs node\n");
|
seq_printf(seq, "Device\tS-state\t Status Sysfs node\n");
|
||||||
|
|
||||||
mutex_lock(&acpi_device_lock);
|
mutex_lock(&acpi_device_lock);
|
||||||
list_for_each_safe(node, next, &acpi_wakeup_device_list) {
|
list_for_each_entry_safe(dev, tmp, &acpi_wakeup_device_list,
|
||||||
struct acpi_device *dev =
|
wakeup_list) {
|
||||||
container_of(node, struct acpi_device, wakeup_list);
|
|
||||||
struct acpi_device_physical_node *entry;
|
struct acpi_device_physical_node *entry;
|
||||||
|
|
||||||
if (!dev->wakeup.flags.valid)
|
if (!dev->wakeup.flags.valid)
|
||||||
|
@ -96,7 +95,7 @@ acpi_system_write_wakeup_device(struct file *file,
|
||||||
const char __user * buffer,
|
const char __user * buffer,
|
||||||
size_t count, loff_t * ppos)
|
size_t count, loff_t * ppos)
|
||||||
{
|
{
|
||||||
struct list_head *node, *next;
|
struct acpi_device *dev, *tmp;
|
||||||
char strbuf[5];
|
char strbuf[5];
|
||||||
char str[5] = "";
|
char str[5] = "";
|
||||||
|
|
||||||
|
@ -109,9 +108,8 @@ acpi_system_write_wakeup_device(struct file *file,
|
||||||
sscanf(strbuf, "%s", str);
|
sscanf(strbuf, "%s", str);
|
||||||
|
|
||||||
mutex_lock(&acpi_device_lock);
|
mutex_lock(&acpi_device_lock);
|
||||||
list_for_each_safe(node, next, &acpi_wakeup_device_list) {
|
list_for_each_entry_safe(dev, tmp, &acpi_wakeup_device_list,
|
||||||
struct acpi_device *dev =
|
wakeup_list) {
|
||||||
container_of(node, struct acpi_device, wakeup_list);
|
|
||||||
if (!dev->wakeup.flags.valid)
|
if (!dev->wakeup.flags.valid)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/sched/signal.h>
|
||||||
|
#include <linux/acpi.h>
|
||||||
|
#include <acpi/button.h>
|
||||||
|
|
||||||
|
ACPI_MODULE_NAME("tiny-power-button");
|
||||||
|
MODULE_AUTHOR("Josh Triplett");
|
||||||
|
MODULE_DESCRIPTION("ACPI Tiny Power Button Driver");
|
||||||
|
MODULE_LICENSE("GPL");
|
||||||
|
|
||||||
|
static int power_signal __read_mostly = CONFIG_ACPI_TINY_POWER_BUTTON_SIGNAL;
|
||||||
|
module_param(power_signal, int, 0644);
|
||||||
|
MODULE_PARM_DESC(power_signal, "Power button sends this signal to init");
|
||||||
|
|
||||||
|
static const struct acpi_device_id tiny_power_button_device_ids[] = {
|
||||||
|
{ ACPI_BUTTON_HID_POWER, 0 },
|
||||||
|
{ ACPI_BUTTON_HID_POWERF, 0 },
|
||||||
|
{ "", 0 },
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(acpi, tiny_power_button_device_ids);
|
||||||
|
|
||||||
|
static int acpi_noop_add_remove(struct acpi_device *device)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void acpi_tiny_power_button_notify(struct acpi_device *device, u32 event)
|
||||||
|
{
|
||||||
|
kill_cad_pid(power_signal, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct acpi_driver acpi_tiny_power_button_driver = {
|
||||||
|
.name = "tiny-power-button",
|
||||||
|
.class = "tiny-power-button",
|
||||||
|
.ids = tiny_power_button_device_ids,
|
||||||
|
.ops = {
|
||||||
|
.add = acpi_noop_add_remove,
|
||||||
|
.remove = acpi_noop_add_remove,
|
||||||
|
.notify = acpi_tiny_power_button_notify,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
module_driver(acpi_tiny_power_button_driver,
|
||||||
|
acpi_bus_register_driver,
|
||||||
|
acpi_bus_unregister_driver);
|
|
@ -30,12 +30,10 @@ ACPI_MODULE_NAME("wakeup_devices")
|
||||||
*/
|
*/
|
||||||
void acpi_enable_wakeup_devices(u8 sleep_state)
|
void acpi_enable_wakeup_devices(u8 sleep_state)
|
||||||
{
|
{
|
||||||
struct list_head *node, *next;
|
struct acpi_device *dev, *tmp;
|
||||||
|
|
||||||
list_for_each_safe(node, next, &acpi_wakeup_device_list) {
|
|
||||||
struct acpi_device *dev =
|
|
||||||
container_of(node, struct acpi_device, wakeup_list);
|
|
||||||
|
|
||||||
|
list_for_each_entry_safe(dev, tmp, &acpi_wakeup_device_list,
|
||||||
|
wakeup_list) {
|
||||||
if (!dev->wakeup.flags.valid
|
if (!dev->wakeup.flags.valid
|
||||||
|| sleep_state > (u32) dev->wakeup.sleep_state
|
|| sleep_state > (u32) dev->wakeup.sleep_state
|
||||||
|| !(device_may_wakeup(&dev->dev)
|
|| !(device_may_wakeup(&dev->dev)
|
||||||
|
@ -57,12 +55,10 @@ void acpi_enable_wakeup_devices(u8 sleep_state)
|
||||||
*/
|
*/
|
||||||
void acpi_disable_wakeup_devices(u8 sleep_state)
|
void acpi_disable_wakeup_devices(u8 sleep_state)
|
||||||
{
|
{
|
||||||
struct list_head *node, *next;
|
struct acpi_device *dev, *tmp;
|
||||||
|
|
||||||
list_for_each_safe(node, next, &acpi_wakeup_device_list) {
|
|
||||||
struct acpi_device *dev =
|
|
||||||
container_of(node, struct acpi_device, wakeup_list);
|
|
||||||
|
|
||||||
|
list_for_each_entry_safe(dev, tmp, &acpi_wakeup_device_list,
|
||||||
|
wakeup_list) {
|
||||||
if (!dev->wakeup.flags.valid
|
if (!dev->wakeup.flags.valid
|
||||||
|| sleep_state > (u32) dev->wakeup.sleep_state
|
|| sleep_state > (u32) dev->wakeup.sleep_state
|
||||||
|| !(device_may_wakeup(&dev->dev)
|
|| !(device_may_wakeup(&dev->dev)
|
||||||
|
@ -79,13 +75,11 @@ void acpi_disable_wakeup_devices(u8 sleep_state)
|
||||||
|
|
||||||
int __init acpi_wakeup_device_init(void)
|
int __init acpi_wakeup_device_init(void)
|
||||||
{
|
{
|
||||||
struct list_head *node, *next;
|
struct acpi_device *dev, *tmp;
|
||||||
|
|
||||||
mutex_lock(&acpi_device_lock);
|
mutex_lock(&acpi_device_lock);
|
||||||
list_for_each_safe(node, next, &acpi_wakeup_device_list) {
|
list_for_each_entry_safe(dev, tmp, &acpi_wakeup_device_list,
|
||||||
struct acpi_device *dev = container_of(node,
|
wakeup_list) {
|
||||||
struct acpi_device,
|
|
||||||
wakeup_list);
|
|
||||||
if (device_can_wakeup(&dev->dev)) {
|
if (device_can_wakeup(&dev->dev)) {
|
||||||
/* Button GPEs are supposed to be always enabled. */
|
/* Button GPEs are supposed to be always enabled. */
|
||||||
acpi_enable_gpe(dev->wakeup.gpe_device,
|
acpi_enable_gpe(dev->wakeup.gpe_device,
|
||||||
|
|
|
@ -2,6 +2,10 @@
|
||||||
#ifndef ACPI_BUTTON_H
|
#ifndef ACPI_BUTTON_H
|
||||||
#define ACPI_BUTTON_H
|
#define ACPI_BUTTON_H
|
||||||
|
|
||||||
|
#define ACPI_BUTTON_HID_POWER "PNP0C0C"
|
||||||
|
#define ACPI_BUTTON_HID_LID "PNP0C0D"
|
||||||
|
#define ACPI_BUTTON_HID_SLEEP "PNP0C0E"
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_ACPI_BUTTON)
|
#if IS_ENABLED(CONFIG_ACPI_BUTTON)
|
||||||
extern int acpi_lid_open(void);
|
extern int acpi_lid_open(void);
|
||||||
#else
|
#else
|
||||||
|
|
Loading…
Reference in New Issue