Commit 527953ef authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'acpi-5.19-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull more ACPI updates from Rafael Wysocki:
 "These add some new device IDs, update a few drivers (processor,
  battery, backlight) and clean up code in a few places.

  Specifics:

   - Add Meteor Lake ACPI IDs for DPTF devices (Sumeet Pawnikar)

   - Rearrange find_child_checks() to simplify code (Rafael Wysocki)

   - Use memremap() to map the UCSI mailbox that is always in main
     memory and drop acpi_release_memory() that has no more users
     (Heikki Krogerus, Dan Carpenter)

   - Make max_cstate/nocst/bm_check_disable processor module parameters
     visible in sysfs (Yajun Deng)

   - Fix typo in the CPPC driver (Julia Lawall)

   - Make the ACPI battery driver show the "not-charging" status by
     default unless "charging" or "full" is directly indicated (Werner
     Sembach)

   - Improve the PM notifier in the ACPI backlight driver (Zhang Rui)

   - Clean up some white space in the ACPI code (Ian Cowan)"

* tag 'acpi-5.19-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  usb: typec: ucsi: acpi: fix a NULL vs IS_ERR() check in probe
  ACPI: DPTF: Support Meteor Lake
  ACPI: CPPC: fix typo in comment
  ACPI: video: improve PM notifer callback
  ACPI: clean up white space in a few places for consistency
  ACPI: glue: Rearrange find_child_checks()
  ACPI: processor: idle: Expose max_cstate/nocst/bm_check_disable read-only in sysfs
  ACPI: battery: Make "not-charging" the default on no charging or full info
  ACPI: OSL: Remove the helper for deactivating memory region
  usb: typec: ucsi: acpi: Map the mailbox with memremap()
parents 2c5ca23f 4a577fca
...@@ -32,7 +32,6 @@ MODULE_AUTHOR("Paul Diefenbaugh"); ...@@ -32,7 +32,6 @@ MODULE_AUTHOR("Paul Diefenbaugh");
MODULE_DESCRIPTION("ACPI AC Adapter Driver"); MODULE_DESCRIPTION("ACPI AC Adapter Driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
static int acpi_ac_add(struct acpi_device *device); static int acpi_ac_add(struct acpi_device *device);
static int acpi_ac_remove(struct acpi_device *device); static int acpi_ac_remove(struct acpi_device *device);
static void acpi_ac_notify(struct acpi_device *device, u32 event); static void acpi_ac_notify(struct acpi_device *device, u32 event);
...@@ -125,6 +124,7 @@ static int get_ac_property(struct power_supply *psy, ...@@ -125,6 +124,7 @@ static int get_ac_property(struct power_supply *psy,
default: default:
return -EINVAL; return -EINVAL;
} }
return 0; return 0;
} }
...@@ -286,6 +286,7 @@ static int acpi_ac_resume(struct device *dev) ...@@ -286,6 +286,7 @@ static int acpi_ac_resume(struct device *dev)
return 0; return 0;
if (old_state != ac->state) if (old_state != ac->state)
kobject_uevent(&ac->charger->dev.kobj, KOBJ_CHANGE); kobject_uevent(&ac->charger->dev.kobj, KOBJ_CHANGE);
return 0; return 0;
} }
#else #else
...@@ -296,7 +297,6 @@ static int acpi_ac_remove(struct acpi_device *device) ...@@ -296,7 +297,6 @@ static int acpi_ac_remove(struct acpi_device *device)
{ {
struct acpi_ac *ac = NULL; struct acpi_ac *ac = NULL;
if (!device || !acpi_driver_data(device)) if (!device || !acpi_driver_data(device))
return -EINVAL; return -EINVAL;
......
...@@ -1707,24 +1707,23 @@ static int acpi_video_resume(struct notifier_block *nb, ...@@ -1707,24 +1707,23 @@ static int acpi_video_resume(struct notifier_block *nb,
int i; int i;
switch (val) { switch (val) {
case PM_HIBERNATION_PREPARE: case PM_POST_HIBERNATION:
case PM_SUSPEND_PREPARE: case PM_POST_SUSPEND:
case PM_RESTORE_PREPARE: case PM_POST_RESTORE:
return NOTIFY_DONE; video = container_of(nb, struct acpi_video_bus, pm_nb);
}
dev_info(&video->device->dev, "Restoring backlight state\n");
video = container_of(nb, struct acpi_video_bus, pm_nb);
for (i = 0; i < video->attached_count; i++) {
dev_info(&video->device->dev, "Restoring backlight state\n"); video_device = video->attached_array[i].bind_info;
if (video_device && video_device->brightness)
acpi_video_device_lcd_set_level(video_device,
video_device->brightness->curr);
}
for (i = 0; i < video->attached_count; i++) { return NOTIFY_OK;
video_device = video->attached_array[i].bind_info;
if (video_device && video_device->brightness)
acpi_video_device_lcd_set_level(video_device,
video_device->brightness->curr);
} }
return NOTIFY_DONE;
return NOTIFY_OK;
} }
static acpi_status static acpi_status
......
...@@ -52,7 +52,6 @@ static bool battery_driver_registered; ...@@ -52,7 +52,6 @@ static bool battery_driver_registered;
static int battery_bix_broken_package; static int battery_bix_broken_package;
static int battery_notification_delay_ms; static int battery_notification_delay_ms;
static int battery_ac_is_broken; static int battery_ac_is_broken;
static int battery_quirk_notcharging;
static unsigned int cache_time = 1000; static unsigned int cache_time = 1000;
module_param(cache_time, uint, 0644); module_param(cache_time, uint, 0644);
MODULE_PARM_DESC(cache_time, "cache time in milliseconds"); MODULE_PARM_DESC(cache_time, "cache time in milliseconds");
...@@ -216,10 +215,8 @@ static int acpi_battery_get_property(struct power_supply *psy, ...@@ -216,10 +215,8 @@ static int acpi_battery_get_property(struct power_supply *psy,
val->intval = POWER_SUPPLY_STATUS_CHARGING; val->intval = POWER_SUPPLY_STATUS_CHARGING;
else if (acpi_battery_is_charged(battery)) else if (acpi_battery_is_charged(battery))
val->intval = POWER_SUPPLY_STATUS_FULL; val->intval = POWER_SUPPLY_STATUS_FULL;
else if (battery_quirk_notcharging)
val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
else else
val->intval = POWER_SUPPLY_STATUS_UNKNOWN; val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
break; break;
case POWER_SUPPLY_PROP_PRESENT: case POWER_SUPPLY_PROP_PRESENT:
val->intval = acpi_battery_present(battery); val->intval = acpi_battery_present(battery);
...@@ -1105,12 +1102,6 @@ battery_ac_is_broken_quirk(const struct dmi_system_id *d) ...@@ -1105,12 +1102,6 @@ battery_ac_is_broken_quirk(const struct dmi_system_id *d)
return 0; return 0;
} }
static int __init battery_quirk_not_charging(const struct dmi_system_id *d)
{
battery_quirk_notcharging = 1;
return 0;
}
static const struct dmi_system_id bat_dmi_table[] __initconst = { static const struct dmi_system_id bat_dmi_table[] __initconst = {
{ {
/* NEC LZ750/LS */ /* NEC LZ750/LS */
...@@ -1139,19 +1130,6 @@ static const struct dmi_system_id bat_dmi_table[] __initconst = { ...@@ -1139,19 +1130,6 @@ static const struct dmi_system_id bat_dmi_table[] __initconst = {
DMI_MATCH(DMI_BIOS_DATE, "08/22/2014"), DMI_MATCH(DMI_BIOS_DATE, "08/22/2014"),
}, },
}, },
{
/*
* On Lenovo ThinkPads the BIOS specification defines
* a state when the bits for charging and discharging
* are both set to 0. That state is "Not Charging".
*/
.callback = battery_quirk_not_charging,
.ident = "Lenovo ThinkPad",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad"),
},
},
{ {
/* Microsoft Surface Go 3 */ /* Microsoft Surface Go 3 */
.callback = battery_notification_delay_quirk, .callback = battery_notification_delay_quirk,
......
...@@ -315,7 +315,7 @@ static int send_pcc_cmd(int pcc_ss_id, u16 cmd) ...@@ -315,7 +315,7 @@ static int send_pcc_cmd(int pcc_ss_id, u16 cmd)
goto end; goto end;
} }
/* wait for completion and check for PCC errro bit */ /* wait for completion and check for PCC error bit */
ret = check_pcc_chan(pcc_ss_id, true); ret = check_pcc_chan(pcc_ss_id, true);
if (pcc_ss_data->pcc_mrtt) if (pcc_ss_data->pcc_mrtt)
......
...@@ -151,6 +151,7 @@ static int pch_fivr_remove(struct platform_device *pdev) ...@@ -151,6 +151,7 @@ static int pch_fivr_remove(struct platform_device *pdev)
static const struct acpi_device_id pch_fivr_device_ids[] = { static const struct acpi_device_id pch_fivr_device_ids[] = {
{"INTC1045", 0}, {"INTC1045", 0},
{"INTC1049", 0}, {"INTC1049", 0},
{"INTC1064", 0},
{"INTC10A3", 0}, {"INTC10A3", 0},
{"", 0}, {"", 0},
}; };
......
...@@ -232,6 +232,8 @@ static const struct acpi_device_id int3407_device_ids[] = { ...@@ -232,6 +232,8 @@ static const struct acpi_device_id int3407_device_ids[] = {
{"INTC1050", 0}, {"INTC1050", 0},
{"INTC1060", 0}, {"INTC1060", 0},
{"INTC1061", 0}, {"INTC1061", 0},
{"INTC1065", 0},
{"INTC1066", 0},
{"INTC10A4", 0}, {"INTC10A4", 0},
{"INTC10A5", 0}, {"INTC10A5", 0},
{"", 0}, {"", 0},
......
...@@ -27,6 +27,7 @@ static const struct acpi_device_id int340x_thermal_device_ids[] = { ...@@ -27,6 +27,7 @@ static const struct acpi_device_id int340x_thermal_device_ids[] = {
{"INT3532"}, {"INT3532"},
{"INTC1040"}, {"INTC1040"},
{"INTC1041"}, {"INTC1041"},
{"INTC1042"},
{"INTC1043"}, {"INTC1043"},
{"INTC1044"}, {"INTC1044"},
{"INTC1045"}, {"INTC1045"},
...@@ -37,6 +38,11 @@ static const struct acpi_device_id int340x_thermal_device_ids[] = { ...@@ -37,6 +38,11 @@ static const struct acpi_device_id int340x_thermal_device_ids[] = {
{"INTC1050"}, {"INTC1050"},
{"INTC1060"}, {"INTC1060"},
{"INTC1061"}, {"INTC1061"},
{"INTC1062"},
{"INTC1063"},
{"INTC1064"},
{"INTC1065"},
{"INTC1066"},
{"INTC10A0"}, {"INTC10A0"},
{"INTC10A1"}, {"INTC10A1"},
{"INTC10A2"}, {"INTC10A2"},
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
{"INT3404", }, /* Fan */ \ {"INT3404", }, /* Fan */ \
{"INTC1044", }, /* Fan for Tiger Lake generation */ \ {"INTC1044", }, /* Fan for Tiger Lake generation */ \
{"INTC1048", }, /* Fan for Alder Lake generation */ \ {"INTC1048", }, /* Fan for Alder Lake generation */ \
{"INTC1063", }, /* Fan for Meteor Lake generation */ \
{"INTC10A2", }, /* Fan for Raptor Lake generation */ \ {"INTC10A2", }, /* Fan for Raptor Lake generation */ \
{"PNP0C0B", } /* Generic ACPI fan */ {"PNP0C0B", } /* Generic ACPI fan */
......
...@@ -79,17 +79,17 @@ static struct acpi_bus_type *acpi_get_bus_type(struct device *dev) ...@@ -79,17 +79,17 @@ static struct acpi_bus_type *acpi_get_bus_type(struct device *dev)
static int find_child_checks(struct acpi_device *adev, bool check_children) static int find_child_checks(struct acpi_device *adev, bool check_children)
{ {
bool sta_present = true;
unsigned long long sta; unsigned long long sta;
acpi_status status; acpi_status status;
if (check_children && list_empty(&adev->children))
return -ENODEV;
status = acpi_evaluate_integer(adev->handle, "_STA", NULL, &sta); status = acpi_evaluate_integer(adev->handle, "_STA", NULL, &sta);
if (status == AE_NOT_FOUND) if (status == AE_NOT_FOUND)
sta_present = false; return FIND_CHILD_MIN_SCORE;
else if (ACPI_FAILURE(status) || !(sta & ACPI_STA_DEVICE_ENABLED))
return -ENODEV;
if (check_children && list_empty(&adev->children)) if (ACPI_FAILURE(status) || !(sta & ACPI_STA_DEVICE_ENABLED))
return -ENODEV; return -ENODEV;
/* /*
...@@ -99,8 +99,10 @@ static int find_child_checks(struct acpi_device *adev, bool check_children) ...@@ -99,8 +99,10 @@ static int find_child_checks(struct acpi_device *adev, bool check_children)
* matched going forward. [This means a second spec violation in a row, * matched going forward. [This means a second spec violation in a row,
* so whatever we do here is best effort anyway.] * so whatever we do here is best effort anyway.]
*/ */
return sta_present && !adev->pnp.type.platform_id ? if (adev->pnp.type.platform_id)
FIND_CHILD_MAX_SCORE : FIND_CHILD_MIN_SCORE; return FIND_CHILD_MIN_SCORE;
return FIND_CHILD_MAX_SCORE;
} }
struct acpi_device *acpi_find_child_device(struct acpi_device *parent, struct acpi_device *acpi_find_child_device(struct acpi_device *parent,
......
...@@ -36,7 +36,6 @@ ...@@ -36,7 +36,6 @@
#include <linux/io-64-nonatomic-lo-hi.h> #include <linux/io-64-nonatomic-lo-hi.h>
#include "acpica/accommon.h" #include "acpica/accommon.h"
#include "acpica/acnamesp.h"
#include "internal.h" #include "internal.h"
/* Definitions for ACPI_DEBUG_PRINT() */ /* Definitions for ACPI_DEBUG_PRINT() */
...@@ -1496,91 +1495,6 @@ int acpi_check_region(resource_size_t start, resource_size_t n, ...@@ -1496,91 +1495,6 @@ int acpi_check_region(resource_size_t start, resource_size_t n,
} }
EXPORT_SYMBOL(acpi_check_region); EXPORT_SYMBOL(acpi_check_region);
static acpi_status acpi_deactivate_mem_region(acpi_handle handle, u32 level,
void *_res, void **return_value)
{
struct acpi_mem_space_context **mem_ctx;
union acpi_operand_object *handler_obj;
union acpi_operand_object *region_obj2;
union acpi_operand_object *region_obj;
struct resource *res = _res;
acpi_status status;
region_obj = acpi_ns_get_attached_object(handle);
if (!region_obj)
return AE_OK;
handler_obj = region_obj->region.handler;
if (!handler_obj)
return AE_OK;
if (region_obj->region.space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY)
return AE_OK;
if (!(region_obj->region.flags & AOPOBJ_SETUP_COMPLETE))
return AE_OK;
region_obj2 = acpi_ns_get_secondary_object(region_obj);
if (!region_obj2)
return AE_OK;
mem_ctx = (void *)&region_obj2->extra.region_context;
if (!(mem_ctx[0]->address >= res->start &&
mem_ctx[0]->address < res->end))
return AE_OK;
status = handler_obj->address_space.setup(region_obj,
ACPI_REGION_DEACTIVATE,
NULL, (void **)mem_ctx);
if (ACPI_SUCCESS(status))
region_obj->region.flags &= ~(AOPOBJ_SETUP_COMPLETE);
return status;
}
/**
* acpi_release_memory - Release any mappings done to a memory region
* @handle: Handle to namespace node
* @res: Memory resource
* @level: A level that terminates the search
*
* Walks through @handle and unmaps all SystemMemory Operation Regions that
* overlap with @res and that have already been activated (mapped).
*
* This is a helper that allows drivers to place special requirements on memory
* region that may overlap with operation regions, primarily allowing them to
* safely map the region as non-cached memory.
*
* The unmapped Operation Regions will be automatically remapped next time they
* are called, so the drivers do not need to do anything else.
*/
acpi_status acpi_release_memory(acpi_handle handle, struct resource *res,
u32 level)
{
acpi_status status;
if (!(res->flags & IORESOURCE_MEM))
return AE_TYPE;
status = acpi_walk_namespace(ACPI_TYPE_REGION, handle, level,
acpi_deactivate_mem_region, NULL,
res, NULL);
if (ACPI_FAILURE(status))
return status;
/*
* Wait for all of the mappings queued up for removal by
* acpi_deactivate_mem_region() to actually go away.
*/
synchronize_rcu();
rcu_barrier();
flush_scheduled_work();
return AE_OK;
}
EXPORT_SYMBOL_GPL(acpi_release_memory);
/* /*
* Let drivers know whether the resource checks are effective * Let drivers know whether the resource checks are effective
*/ */
......
...@@ -38,11 +38,11 @@ ...@@ -38,11 +38,11 @@
#define ACPI_IDLE_STATE_START (IS_ENABLED(CONFIG_ARCH_HAS_CPU_RELAX) ? 1 : 0) #define ACPI_IDLE_STATE_START (IS_ENABLED(CONFIG_ARCH_HAS_CPU_RELAX) ? 1 : 0)
static unsigned int max_cstate __read_mostly = ACPI_PROCESSOR_MAX_POWER; static unsigned int max_cstate __read_mostly = ACPI_PROCESSOR_MAX_POWER;
module_param(max_cstate, uint, 0000); module_param(max_cstate, uint, 0400);
static unsigned int nocst __read_mostly; static bool nocst __read_mostly;
module_param(nocst, uint, 0000); module_param(nocst, bool, 0400);
static int bm_check_disable __read_mostly; static bool bm_check_disable __read_mostly;
module_param(bm_check_disable, uint, 0000); module_param(bm_check_disable, bool, 0400);
static unsigned int latency_factor __read_mostly = 2; static unsigned int latency_factor __read_mostly = 2;
module_param(latency_factor, uint, 0644); module_param(latency_factor, uint, 0644);
......
...@@ -663,6 +663,7 @@ static const struct acpi_device_id int3400_thermal_match[] = { ...@@ -663,6 +663,7 @@ static const struct acpi_device_id int3400_thermal_match[] = {
{"INT3400", 0}, {"INT3400", 0},
{"INTC1040", 0}, {"INTC1040", 0},
{"INTC1041", 0}, {"INTC1041", 0},
{"INTC1042", 0},
{"INTC10A0", 0}, {"INTC10A0", 0},
{} {}
}; };
......
...@@ -285,6 +285,7 @@ static const struct acpi_device_id int3403_device_ids[] = { ...@@ -285,6 +285,7 @@ static const struct acpi_device_id int3403_device_ids[] = {
{"INT3403", 0}, {"INT3403", 0},
{"INTC1043", 0}, {"INTC1043", 0},
{"INTC1046", 0}, {"INTC1046", 0},
{"INTC1062", 0},
{"INTC10A1", 0}, {"INTC10A1", 0},
{"", 0}, {"", 0},
}; };
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
struct ucsi_acpi { struct ucsi_acpi {
struct device *dev; struct device *dev;
struct ucsi *ucsi; struct ucsi *ucsi;
void __iomem *base; void *base;
struct completion complete; struct completion complete;
unsigned long flags; unsigned long flags;
guid_t guid; guid_t guid;
...@@ -51,7 +51,7 @@ static int ucsi_acpi_read(struct ucsi *ucsi, unsigned int offset, ...@@ -51,7 +51,7 @@ static int ucsi_acpi_read(struct ucsi *ucsi, unsigned int offset,
if (ret) if (ret)
return ret; return ret;
memcpy(val, (const void __force *)(ua->base + offset), val_len); memcpy(val, ua->base + offset, val_len);
return 0; return 0;
} }
...@@ -61,7 +61,7 @@ static int ucsi_acpi_async_write(struct ucsi *ucsi, unsigned int offset, ...@@ -61,7 +61,7 @@ static int ucsi_acpi_async_write(struct ucsi *ucsi, unsigned int offset,
{ {
struct ucsi_acpi *ua = ucsi_get_drvdata(ucsi); struct ucsi_acpi *ua = ucsi_get_drvdata(ucsi);
memcpy((void __force *)(ua->base + offset), val, val_len); memcpy(ua->base + offset, val, val_len);
return ucsi_acpi_dsm(ua, UCSI_DSM_FUNC_WRITE); return ucsi_acpi_dsm(ua, UCSI_DSM_FUNC_WRITE);
} }
...@@ -132,20 +132,9 @@ static int ucsi_acpi_probe(struct platform_device *pdev) ...@@ -132,20 +132,9 @@ static int ucsi_acpi_probe(struct platform_device *pdev)
return -ENODEV; return -ENODEV;
} }
/* This will make sure we can use ioremap() */ ua->base = devm_memremap(&pdev->dev, res->start, resource_size(res), MEMREMAP_WB);
status = acpi_release_memory(ACPI_HANDLE(&pdev->dev), res, 1); if (IS_ERR(ua->base))
if (ACPI_FAILURE(status)) return PTR_ERR(ua->base);
return -ENOMEM;
/*
* NOTE: The memory region for the data structures is used also in an
* operation region, which means ACPI has already reserved it. Therefore
* it can not be requested here, and we can not use
* devm_ioremap_resource().
*/
ua->base = devm_ioremap(&pdev->dev, res->start, resource_size(res));
if (!ua->base)
return -ENOMEM;
ret = guid_parse(UCSI_DSM_UUID, &ua->guid); ret = guid_parse(UCSI_DSM_UUID, &ua->guid);
if (ret) if (ret)
......
...@@ -520,9 +520,6 @@ int acpi_check_resource_conflict(const struct resource *res); ...@@ -520,9 +520,6 @@ int acpi_check_resource_conflict(const struct resource *res);
int acpi_check_region(resource_size_t start, resource_size_t n, int acpi_check_region(resource_size_t start, resource_size_t n,
const char *name); const char *name);
acpi_status acpi_release_memory(acpi_handle handle, struct resource *res,
u32 level);
int acpi_resources_are_enforced(void); int acpi_resources_are_enforced(void);
#ifdef CONFIG_HIBERNATION #ifdef CONFIG_HIBERNATION
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment