Merge branches 'acpi-battery', 'acpi-ec', 'acpi-pfr' and 'acpi-osl'

Merge updates of the ACPI battery and EC drivers, an ACPI Platform
Firmware Runtime (PFR) telemetry driver update and an ACPI OS support
layer change for 6.13-rc1:

 - Use DEFINE_SIMPLE_DEV_PM_OPS in the ACPI battery driver, make it use
   devm_ for initializing mutexes and allocating driver data, and make
   it check the register_pm_notifier() return value (Thomas Weißschuh,
   Andy Shevchenko).

 - Make the ACPI EC driver support compile-time conditional and allow
   ACPI to be built without CONFIG_HAS_IOPORT (Arnd Bergmann).

 - Remove a redundant error check from the pfr_telemetry driver (Colin
   Ian King).

* acpi-battery:
  ACPI: battery: Check for error code from devm_mutex_init() call
  ACPI: battery: use DEFINE_SIMPLE_DEV_PM_OPS
  ACPI: battery: initialize mutexes through devm_ APIs
  ACPI: battery: allocate driver data through devm_ APIs
  ACPI: battery: check result of register_pm_notifier()

* acpi-ec:
  ACPI: EC: make EC support compile-time conditional

* acpi-pfr:
  ACPI: pfr_telemetry: remove redundant error check on ret

* acpi-osl:
  ACPI: allow building without CONFIG_HAS_IOPORT
This commit is contained in:
Rafael J. Wysocki 2024-11-15 20:45:14 +01:00
15 changed files with 91 additions and 46 deletions

View File

@ -132,8 +132,17 @@ config ACPI_REV_OVERRIDE_POSSIBLE
makes it possible to force the kernel to return "5" as the supported makes it possible to force the kernel to return "5" as the supported
ACPI revision via the "acpi_rev_override" command line switch. ACPI revision via the "acpi_rev_override" command line switch.
config ACPI_EC
bool "Embedded Controller"
depends on HAS_IOPORT
default X86
help
This driver handles communication with the microcontroller
on many x86 laptops and other machines.
config ACPI_EC_DEBUGFS config ACPI_EC_DEBUGFS
tristate "EC read/write access through /sys/kernel/debug/ec" tristate "EC read/write access through /sys/kernel/debug/ec"
depends on ACPI_EC
help help
Say N to disable Embedded Controller /sys/kernel/debug interface Say N to disable Embedded Controller /sys/kernel/debug interface
@ -433,7 +442,7 @@ config ACPI_HOTPLUG_IOAPIC
config ACPI_SBS config ACPI_SBS
tristate "Smart Battery System" tristate "Smart Battery System"
depends on X86 depends on X86 && ACPI_EC
select POWER_SUPPLY select POWER_SUPPLY
help help
This driver supports the Smart Battery System, another This driver supports the Smart Battery System, another

View File

@ -41,7 +41,7 @@ acpi-y += resource.o
acpi-y += acpi_processor.o acpi-y += acpi_processor.o
acpi-y += processor_core.o acpi-y += processor_core.o
acpi-$(CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC) += processor_pdc.o acpi-$(CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC) += processor_pdc.o
acpi-y += ec.o acpi-$(CONFIG_ACPI_EC) += ec.o
acpi-$(CONFIG_ACPI_DOCK) += dock.o acpi-$(CONFIG_ACPI_DOCK) += dock.o
acpi-$(CONFIG_PCI) += pci_root.o pci_link.o pci_irq.o acpi-$(CONFIG_PCI) += pci_root.o pci_link.o pci_irq.o
obj-$(CONFIG_ACPI_MCFG) += pci_mcfg.o obj-$(CONFIG_ACPI_MCFG) += pci_mcfg.o

View File

@ -1218,15 +1218,21 @@ static int acpi_battery_add(struct acpi_device *device)
if (device->dep_unmet) if (device->dep_unmet)
return -EPROBE_DEFER; return -EPROBE_DEFER;
battery = kzalloc(sizeof(struct acpi_battery), GFP_KERNEL); battery = devm_kzalloc(&device->dev, sizeof(*battery), GFP_KERNEL);
if (!battery) if (!battery)
return -ENOMEM; return -ENOMEM;
battery->device = device; battery->device = device;
strscpy(acpi_device_name(device), ACPI_BATTERY_DEVICE_NAME); strscpy(acpi_device_name(device), ACPI_BATTERY_DEVICE_NAME);
strscpy(acpi_device_class(device), ACPI_BATTERY_CLASS); strscpy(acpi_device_class(device), ACPI_BATTERY_CLASS);
device->driver_data = battery; device->driver_data = battery;
mutex_init(&battery->lock); result = devm_mutex_init(&device->dev, &battery->lock);
mutex_init(&battery->sysfs_lock); if (result)
return result;
result = devm_mutex_init(&device->dev, &battery->sysfs_lock);
if (result)
return result;
if (acpi_has_method(battery->device->handle, "_BIX")) if (acpi_has_method(battery->device->handle, "_BIX"))
set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags); set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags);
@ -1238,7 +1244,9 @@ static int acpi_battery_add(struct acpi_device *device)
device->status.battery_present ? "present" : "absent"); device->status.battery_present ? "present" : "absent");
battery->pm_nb.notifier_call = battery_notify; battery->pm_nb.notifier_call = battery_notify;
register_pm_notifier(&battery->pm_nb); result = register_pm_notifier(&battery->pm_nb);
if (result)
goto fail;
device_init_wakeup(&device->dev, 1); device_init_wakeup(&device->dev, 1);
@ -1254,9 +1262,6 @@ fail_pm:
unregister_pm_notifier(&battery->pm_nb); unregister_pm_notifier(&battery->pm_nb);
fail: fail:
sysfs_remove_battery(battery); sysfs_remove_battery(battery);
mutex_destroy(&battery->lock);
mutex_destroy(&battery->sysfs_lock);
kfree(battery);
return result; return result;
} }
@ -1276,13 +1281,8 @@ static void acpi_battery_remove(struct acpi_device *device)
device_init_wakeup(&device->dev, 0); device_init_wakeup(&device->dev, 0);
unregister_pm_notifier(&battery->pm_nb); unregister_pm_notifier(&battery->pm_nb);
sysfs_remove_battery(battery); sysfs_remove_battery(battery);
mutex_destroy(&battery->lock);
mutex_destroy(&battery->sysfs_lock);
kfree(battery);
} }
#ifdef CONFIG_PM_SLEEP
/* this is needed to learn about changes made in suspended state */ /* this is needed to learn about changes made in suspended state */
static int acpi_battery_resume(struct device *dev) static int acpi_battery_resume(struct device *dev)
{ {
@ -1299,11 +1299,8 @@ static int acpi_battery_resume(struct device *dev)
acpi_battery_update(battery, true); acpi_battery_update(battery, true);
return 0; return 0;
} }
#else
#define acpi_battery_resume NULL
#endif
static SIMPLE_DEV_PM_OPS(acpi_battery_pm, NULL, acpi_battery_resume); static DEFINE_SIMPLE_DEV_PM_OPS(acpi_battery_pm, NULL, acpi_battery_resume);
static struct acpi_driver acpi_battery_driver = { static struct acpi_driver acpi_battery_driver = {
.name = "battery", .name = "battery",
@ -1313,7 +1310,7 @@ static struct acpi_driver acpi_battery_driver = {
.add = acpi_battery_add, .add = acpi_battery_add,
.remove = acpi_battery_remove, .remove = acpi_battery_remove,
}, },
.drv.pm = &acpi_battery_pm, .drv.pm = pm_sleep_ptr(&acpi_battery_pm),
.drv.probe_type = PROBE_PREFER_ASYNCHRONOUS, .drv.probe_type = PROBE_PREFER_ASYNCHRONOUS,
}; };

View File

@ -1011,7 +1011,8 @@ static int cpc_read(int cpu, struct cpc_register_resource *reg_res, u64 *val)
*val = 0; *val = 0;
size = GET_BIT_WIDTH(reg); size = GET_BIT_WIDTH(reg);
if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) { if (IS_ENABLED(CONFIG_HAS_IOPORT) &&
reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) {
u32 val_u32; u32 val_u32;
acpi_status status; acpi_status status;
@ -1085,7 +1086,8 @@ static int cpc_write(int cpu, struct cpc_register_resource *reg_res, u64 val)
size = GET_BIT_WIDTH(reg); size = GET_BIT_WIDTH(reg);
if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) { if (IS_ENABLED(CONFIG_HAS_IOPORT) &&
reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) {
acpi_status status; acpi_status status;
status = acpi_os_write_port((acpi_io_address)reg->address, status = acpi_os_write_port((acpi_io_address)reg->address,

View File

@ -215,6 +215,8 @@ extern struct acpi_ec *first_ec;
/* External interfaces use first EC only, so remember */ /* External interfaces use first EC only, so remember */
typedef int (*acpi_ec_query_func) (void *data); typedef int (*acpi_ec_query_func) (void *data);
#ifdef CONFIG_ACPI_EC
void acpi_ec_init(void); void acpi_ec_init(void);
void acpi_ec_ecdt_probe(void); void acpi_ec_ecdt_probe(void);
void acpi_ec_dsdt_probe(void); void acpi_ec_dsdt_probe(void);
@ -231,6 +233,29 @@ void acpi_ec_flush_work(void);
bool acpi_ec_dispatch_gpe(void); bool acpi_ec_dispatch_gpe(void);
#endif #endif
#else
static inline void acpi_ec_init(void) {}
static inline void acpi_ec_ecdt_probe(void) {}
static inline void acpi_ec_dsdt_probe(void) {}
static inline void acpi_ec_block_transactions(void) {}
static inline void acpi_ec_unblock_transactions(void) {}
static inline int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
acpi_handle handle, acpi_ec_query_func func,
void *data)
{
return -ENXIO;
}
static inline void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit) {}
static inline void acpi_ec_register_opregions(struct acpi_device *adev) {}
static inline void acpi_ec_flush_work(void) {}
static inline bool acpi_ec_dispatch_gpe(void)
{
return false;
}
#endif
/*-------------------------------------------------------------------------- /*--------------------------------------------------------------------------
Suspend/Resume Suspend/Resume

View File

@ -642,6 +642,15 @@ acpi_status acpi_os_read_port(acpi_io_address port, u32 *value, u32 width)
{ {
u32 dummy; u32 dummy;
if (!IS_ENABLED(CONFIG_HAS_IOPORT)) {
/*
* set all-1 result as if reading from non-existing
* I/O port
*/
*value = GENMASK(width, 0);
return AE_NOT_IMPLEMENTED;
}
if (value) if (value)
*value = 0; *value = 0;
else else
@ -665,6 +674,9 @@ EXPORT_SYMBOL(acpi_os_read_port);
acpi_status acpi_os_write_port(acpi_io_address port, u32 value, u32 width) acpi_status acpi_os_write_port(acpi_io_address port, u32 value, u32 width)
{ {
if (!IS_ENABLED(CONFIG_HAS_IOPORT))
return AE_NOT_IMPLEMENTED;
if (width <= 8) { if (width <= 8) {
outb(value, port); outb(value, port);
} else if (width <= 16) { } else if (width <= 16) {

View File

@ -272,9 +272,6 @@ static long pfrt_log_ioctl(struct file *file, unsigned int cmd, unsigned long ar
case PFRT_LOG_IOC_GET_INFO: case PFRT_LOG_IOC_GET_INFO:
info.log_level = get_pfrt_log_level(pfrt_log_dev); info.log_level = get_pfrt_log_level(pfrt_log_dev);
if (ret < 0)
return ret;
info.log_type = pfrt_log_dev->info.log_type; info.log_type = pfrt_log_dev->info.log_type;
info.log_revid = pfrt_log_dev->info.log_revid; info.log_revid = pfrt_log_dev->info.log_revid;
if (copy_to_user(p, &info, sizeof(info))) if (copy_to_user(p, &info, sizeof(info)))

View File

@ -14,6 +14,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include "sbshc.h" #include "sbshc.h"
#include "internal.h"
#define ACPI_SMB_HC_CLASS "smbus_host_ctl" #define ACPI_SMB_HC_CLASS "smbus_host_ctl"
#define ACPI_SMB_HC_DEVICE_NAME "ACPI SMBus HC" #define ACPI_SMB_HC_DEVICE_NAME "ACPI SMBus HC"
@ -236,12 +237,6 @@ static int smbus_alarm(void *context)
return 0; return 0;
} }
typedef int (*acpi_ec_query_func) (void *data);
extern int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
acpi_handle handle, acpi_ec_query_func func,
void *data);
static int acpi_smbus_hc_add(struct acpi_device *device) static int acpi_smbus_hc_add(struct acpi_device *device)
{ {
int status; int status;
@ -278,8 +273,6 @@ static int acpi_smbus_hc_add(struct acpi_device *device)
return 0; return 0;
} }
extern void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit);
static void acpi_smbus_hc_remove(struct acpi_device *device) static void acpi_smbus_hc_remove(struct acpi_device *device)
{ {
struct acpi_smb_hc *hc; struct acpi_smb_hc *hc;

View File

@ -238,6 +238,7 @@ config APPLICOM
config SONYPI config SONYPI
tristate "Sony Vaio Programmable I/O Control Device support" tristate "Sony Vaio Programmable I/O Control Device support"
depends on X86_32 && PCI && INPUT depends on X86_32 && PCI && INPUT
depends on ACPI_EC || !ACPI
help help
This driver enables access to the Sony Programmable I/O Control This driver enables access to the Sony Programmable I/O Control
Device which can be found in many (all ?) Sony Vaio laptops. Device which can be found in many (all ?) Sony Vaio laptops.

View File

@ -1752,7 +1752,7 @@ source "drivers/hwmon/occ/Kconfig"
config SENSORS_OXP config SENSORS_OXP
tristate "OneXPlayer EC fan control" tristate "OneXPlayer EC fan control"
depends on ACPI depends on ACPI_EC
depends on X86 depends on X86
help help
If you say yes here you get support for fan readings and control over If you say yes here you get support for fan readings and control over
@ -2592,6 +2592,7 @@ config SENSORS_ASUS_WMI
config SENSORS_ASUS_EC config SENSORS_ASUS_EC
tristate "ASUS EC Sensors" tristate "ASUS EC Sensors"
depends on X86 depends on X86
depends on ACPI_EC
help help
If you say yes here you get support for the ACPI embedded controller If you say yes here you get support for the ACPI embedded controller
hardware monitoring interface found in ASUS motherboards. The driver hardware monitoring interface found in ASUS motherboards. The driver

View File

@ -52,6 +52,7 @@ config WMI_BMOF
config HUAWEI_WMI config HUAWEI_WMI
tristate "Huawei WMI laptop extras driver" tristate "Huawei WMI laptop extras driver"
depends on ACPI_BATTERY depends on ACPI_BATTERY
depends on ACPI_EC
depends on ACPI_WMI depends on ACPI_WMI
depends on INPUT depends on INPUT
select INPUT_SPARSEKMAP select INPUT_SPARSEKMAP
@ -147,7 +148,7 @@ config YT2_1380
config ACERHDF config ACERHDF
tristate "Acer Aspire One temperature and fan driver" tristate "Acer Aspire One temperature and fan driver"
depends on ACPI && THERMAL depends on ACPI_EC && THERMAL
select THERMAL_GOV_BANG_BANG select THERMAL_GOV_BANG_BANG
help help
This is a driver for Acer Aspire One netbooks. It allows to access This is a driver for Acer Aspire One netbooks. It allows to access
@ -186,6 +187,7 @@ config ACER_WMI
depends on SERIO_I8042 depends on SERIO_I8042
depends on INPUT depends on INPUT
depends on RFKILL || RFKILL = n depends on RFKILL || RFKILL = n
depends on ACPI_EC
depends on ACPI_WMI depends on ACPI_WMI
depends on ACPI_VIDEO || ACPI_VIDEO = n depends on ACPI_VIDEO || ACPI_VIDEO = n
depends on HWMON depends on HWMON
@ -334,7 +336,7 @@ config MERAKI_MX100
config EEEPC_LAPTOP config EEEPC_LAPTOP
tristate "Eee PC Hotkey Driver" tristate "Eee PC Hotkey Driver"
depends on ACPI depends on ACPI_EC
depends on INPUT depends on INPUT
depends on RFKILL || RFKILL = n depends on RFKILL || RFKILL = n
depends on ACPI_VIDEO || ACPI_VIDEO = n depends on ACPI_VIDEO || ACPI_VIDEO = n
@ -503,7 +505,7 @@ config SENSORS_HDAPS
config THINKPAD_ACPI config THINKPAD_ACPI
tristate "ThinkPad ACPI Laptop Extras" tristate "ThinkPad ACPI Laptop Extras"
depends on ACPI depends on ACPI_EC
depends on ACPI_BATTERY depends on ACPI_BATTERY
depends on INPUT depends on INPUT
depends on RFKILL || RFKILL = n depends on RFKILL || RFKILL = n
@ -682,7 +684,7 @@ config MEEGOPAD_ANX7428
config MSI_EC config MSI_EC
tristate "MSI EC Extras" tristate "MSI EC Extras"
depends on ACPI depends on ACPI_EC
depends on ACPI_BATTERY depends on ACPI_BATTERY
help help
This driver allows various MSI laptops' functionalities to be This driver allows various MSI laptops' functionalities to be
@ -690,7 +692,7 @@ config MSI_EC
config MSI_LAPTOP config MSI_LAPTOP
tristate "MSI Laptop Extras" tristate "MSI Laptop Extras"
depends on ACPI depends on ACPI_EC
depends on BACKLIGHT_CLASS_DEVICE depends on BACKLIGHT_CLASS_DEVICE
depends on ACPI_VIDEO || ACPI_VIDEO = n depends on ACPI_VIDEO || ACPI_VIDEO = n
depends on RFKILL depends on RFKILL
@ -796,7 +798,7 @@ config SAMSUNG_LAPTOP
config SAMSUNG_Q10 config SAMSUNG_Q10
tristate "Samsung Q10 Extras" tristate "Samsung Q10 Extras"
depends on ACPI depends on ACPI_EC
select BACKLIGHT_CLASS_DEVICE select BACKLIGHT_CLASS_DEVICE
help help
This driver provides support for backlight control on Samsung Q10 This driver provides support for backlight control on Samsung Q10
@ -804,7 +806,7 @@ config SAMSUNG_Q10
config ACPI_TOSHIBA config ACPI_TOSHIBA
tristate "Toshiba Laptop Extras" tristate "Toshiba Laptop Extras"
depends on ACPI depends on ACPI_EC
depends on ACPI_BATTERY depends on ACPI_BATTERY
depends on ACPI_WMI depends on ACPI_WMI
select LEDS_CLASS select LEDS_CLASS
@ -904,7 +906,7 @@ config ACPI_CMPC
config COMPAL_LAPTOP config COMPAL_LAPTOP
tristate "Compal (and others) Laptop Extras" tristate "Compal (and others) Laptop Extras"
depends on ACPI depends on ACPI_EC
depends on BACKLIGHT_CLASS_DEVICE depends on BACKLIGHT_CLASS_DEVICE
depends on ACPI_VIDEO || ACPI_VIDEO = n depends on ACPI_VIDEO || ACPI_VIDEO = n
depends on RFKILL depends on RFKILL
@ -949,7 +951,7 @@ config PANASONIC_LAPTOP
config SONY_LAPTOP config SONY_LAPTOP
tristate "Sony Laptop Extras" tristate "Sony Laptop Extras"
depends on ACPI depends on ACPI_EC
depends on ACPI_VIDEO || ACPI_VIDEO = n depends on ACPI_VIDEO || ACPI_VIDEO = n
depends on BACKLIGHT_CLASS_DEVICE depends on BACKLIGHT_CLASS_DEVICE
depends on INPUT depends on INPUT
@ -972,7 +974,7 @@ config SONYPI_COMPAT
config SYSTEM76_ACPI config SYSTEM76_ACPI
tristate "System76 ACPI Driver" tristate "System76 ACPI Driver"
depends on ACPI depends on ACPI_EC
depends on ACPI_BATTERY depends on ACPI_BATTERY
depends on HWMON depends on HWMON
depends on INPUT depends on INPUT

View File

@ -194,6 +194,7 @@ config DELL_WMI
config DELL_WMI_PRIVACY config DELL_WMI_PRIVACY
bool "Dell WMI Hardware Privacy Support" bool "Dell WMI Hardware Privacy Support"
depends on DELL_WMI depends on DELL_WMI
depends on ACPI_EC
help help
This option adds integration with the "Dell Hardware Privacy" This option adds integration with the "Dell Hardware Privacy"
feature of Dell laptops to the dell-wmi driver. feature of Dell laptops to the dell-wmi driver.

View File

@ -37,6 +37,7 @@ config HP_ACCEL
config HP_WMI config HP_WMI
tristate "HP WMI extras" tristate "HP WMI extras"
default m default m
depends on ACPI_EC
depends on ACPI_WMI depends on ACPI_WMI
depends on INPUT depends on INPUT
depends on RFKILL || RFKILL = n depends on RFKILL || RFKILL = n

View File

@ -62,7 +62,7 @@ config INTEL_INT0002_VGPIO
config INTEL_OAKTRAIL config INTEL_OAKTRAIL
tristate "Intel Oaktrail Platform Extras" tristate "Intel Oaktrail Platform Extras"
depends on ACPI depends on ACPI_EC
depends on ACPI_VIDEO || ACPI_VIDEO=n depends on ACPI_VIDEO || ACPI_VIDEO=n
depends on RFKILL && BACKLIGHT_CLASS_DEVICE && ACPI depends on RFKILL && BACKLIGHT_CLASS_DEVICE && ACPI
help help

View File

@ -1164,8 +1164,6 @@ int acpi_subsys_suspend_noirq(struct device *dev);
int acpi_subsys_suspend(struct device *dev); int acpi_subsys_suspend(struct device *dev);
int acpi_subsys_freeze(struct device *dev); int acpi_subsys_freeze(struct device *dev);
int acpi_subsys_poweroff(struct device *dev); int acpi_subsys_poweroff(struct device *dev);
void acpi_ec_mark_gpe_for_wake(void);
void acpi_ec_set_gpe_wake_mask(u8 action);
int acpi_subsys_restore_early(struct device *dev); int acpi_subsys_restore_early(struct device *dev);
#else #else
static inline int acpi_subsys_prepare(struct device *dev) { return 0; } static inline int acpi_subsys_prepare(struct device *dev) { return 0; }
@ -1176,6 +1174,12 @@ static inline int acpi_subsys_suspend(struct device *dev) { return 0; }
static inline int acpi_subsys_freeze(struct device *dev) { return 0; } static inline int acpi_subsys_freeze(struct device *dev) { return 0; }
static inline int acpi_subsys_poweroff(struct device *dev) { return 0; } static inline int acpi_subsys_poweroff(struct device *dev) { return 0; }
static inline int acpi_subsys_restore_early(struct device *dev) { return 0; } static inline int acpi_subsys_restore_early(struct device *dev) { return 0; }
#endif
#if defined(CONFIG_ACPI_EC) && defined(CONFIG_PM_SLEEP)
void acpi_ec_mark_gpe_for_wake(void);
void acpi_ec_set_gpe_wake_mask(u8 action);
#else
static inline void acpi_ec_mark_gpe_for_wake(void) {} static inline void acpi_ec_mark_gpe_for_wake(void) {}
static inline void acpi_ec_set_gpe_wake_mask(u8 action) {} static inline void acpi_ec_set_gpe_wake_mask(u8 action) {}
#endif #endif