mirror of
https://github.com/torvalds/linux.git
synced 2026-05-29 17:43:52 +02:00
Merge branches 'acpi-resource', 'acpi-pm', 'acpi-platform-profile' and 'acpi-docs'
Merge an ACPI resources management update, ACPI power management updates, an ACPI platform profile driver fix and an ACPI documentation update related to device properties for 6.16-rc1: - Fix a typo for MECHREVO in irq1_edge_low_force_override[] (Mingcong Bai). - Add an LPS0 check() callback to the AMD pinctrl driver and fix up config symbol dependencies in it (Mario Limonciello, Rafael Wysocki). - Avoid initializing the ACPI platform profile driver on non-ACPI platforms (Alexandre Ghiti). - Document that references to ACPI data (non-device) nodes should use string-only references in hierarchical data node packages (Sakari Ailus). * acpi-resource: ACPI: resource: fix a typo for MECHREVO in irq1_edge_low_force_override[] * acpi-pm: pinctrl: amd: Fix hibernation support with CONFIG_SUSPEND unset pinctrl: amd: Fix use of undeclared identifier 'pinctrl_amd_s2idle_dev_ops' pinctrl: amd: Add an LPS0 check() callback ACPI: Add missing prototype for non CONFIG_SUSPEND/CONFIG_X86 case * acpi-platform-profile: ACPI: platform_profile: Avoid initializing on non-ACPI platforms * acpi-docs: Documentation: ACPI: Use all-string data node references
This commit is contained in:
commit
db0e4d5429
|
|
@ -12,11 +12,14 @@ ACPI in general allows referring to device objects in the tree only.
|
|||
Hierarchical data extension nodes may not be referred to directly, hence this
|
||||
document defines a scheme to implement such references.
|
||||
|
||||
A reference consist of the device object name followed by one or more
|
||||
hierarchical data extension [dsd-guide] keys. Specifically, the hierarchical
|
||||
data extension node which is referred to by the key shall lie directly under
|
||||
the parent object i.e. either the device object or another hierarchical data
|
||||
extension node.
|
||||
A reference to a _DSD hierarchical data node is a string consisting of a
|
||||
device object reference followed by a dot (".") and a relative path to a data
|
||||
node object. Do not use non-string references as this will produce a copy of
|
||||
the hierarchical data node, not a reference!
|
||||
|
||||
The hierarchical data extension node which is referred to shall be located
|
||||
directly under its parent object i.e. either the device object or another
|
||||
hierarchical data extension node [dsd-guide].
|
||||
|
||||
The keys in the hierarchical data nodes shall consist of the name of the node,
|
||||
"@" character and the number of the node in hexadecimal notation (without pre-
|
||||
|
|
@ -33,11 +36,9 @@ extension key.
|
|||
Example
|
||||
=======
|
||||
|
||||
In the ASL snippet below, the "reference" _DSD property contains a
|
||||
device object reference to DEV0 and under that device object, a
|
||||
hierarchical data extension key "node@1" referring to the NOD1 object
|
||||
and lastly, a hierarchical data extension key "anothernode" referring to
|
||||
the ANOD object which is also the final target node of the reference.
|
||||
In the ASL snippet below, the "reference" _DSD property contains a string
|
||||
reference to a hierarchical data extension node ANOD under DEV0 under the parent
|
||||
of DEV1. ANOD is also the final target node of the reference.
|
||||
::
|
||||
|
||||
Device (DEV0)
|
||||
|
|
@ -76,10 +77,7 @@ the ANOD object which is also the final target node of the reference.
|
|||
Name (_DSD, Package () {
|
||||
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
|
||||
Package () {
|
||||
Package () {
|
||||
"reference", Package () {
|
||||
^DEV0, "node@1", "anothernode"
|
||||
}
|
||||
Package () { "reference", "^DEV0.ANOD" }
|
||||
},
|
||||
}
|
||||
})
|
||||
|
|
|
|||
|
|
@ -66,12 +66,9 @@ of that port shall be zero. Similarly, if a port may only have a single
|
|||
endpoint, the number of that endpoint shall be zero.
|
||||
|
||||
The endpoint reference uses property extension with "remote-endpoint" property
|
||||
name followed by a reference in the same package. Such references consist of
|
||||
the remote device reference, the first package entry of the port data extension
|
||||
reference under the device and finally the first package entry of the endpoint
|
||||
data extension reference under the port. Individual references thus appear as::
|
||||
name followed by a string reference in the same package. [data-node-ref]::
|
||||
|
||||
Package() { device, "port@X", "endpoint@Y" }
|
||||
"device.datanode"
|
||||
|
||||
In the above example, "X" is the number of the port and "Y" is the number of
|
||||
the endpoint.
|
||||
|
|
@ -109,7 +106,7 @@ A simple example of this is show below::
|
|||
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
|
||||
Package () {
|
||||
Package () { "reg", 0 },
|
||||
Package () { "remote-endpoint", Package() { \_SB.PCI0.ISP, "port@4", "endpoint@0" } },
|
||||
Package () { "remote-endpoint", "\\_SB.PCI0.ISP.EP40" },
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
@ -141,7 +138,7 @@ A simple example of this is show below::
|
|||
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
|
||||
Package () {
|
||||
Package () { "reg", 0 },
|
||||
Package () { "remote-endpoint", Package () { \_SB.PCI0.I2C2.CAM0, "port@0", "endpoint@0" } },
|
||||
Package () { "remote-endpoint", "\\_SB.PCI0.I2C2.CAM0.EP00" },
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,11 +15,6 @@ Referring to LEDs in Device tree is documented in [video-interfaces], in
|
|||
"flash-leds" property documentation. In short, LEDs are directly referred to by
|
||||
using phandles.
|
||||
|
||||
While Device tree allows referring to any node in the tree [devicetree], in
|
||||
ACPI references are limited to device nodes only [acpi]. For this reason using
|
||||
the same mechanism on ACPI is not possible. A mechanism to refer to non-device
|
||||
ACPI nodes is documented in [data-node-ref].
|
||||
|
||||
ACPI allows (as does DT) using integer arguments after the reference. A
|
||||
combination of the LED driver device reference and an integer argument,
|
||||
referring to the "reg" property of the relevant LED, is used to identify
|
||||
|
|
@ -74,7 +69,7 @@ omitted. ::
|
|||
Package () {
|
||||
Package () {
|
||||
"flash-leds",
|
||||
Package () { ^LED, "led@0", ^LED, "led@1" },
|
||||
Package () { "^LED.LED0", "^LED.LED1" },
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
|
|||
|
|
@ -688,6 +688,9 @@ static int __init platform_profile_init(void)
|
|||
{
|
||||
int err;
|
||||
|
||||
if (acpi_disabled)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
err = class_register(&platform_profile_class);
|
||||
if (err)
|
||||
return err;
|
||||
|
|
|
|||
|
|
@ -534,7 +534,7 @@ static const struct dmi_system_id irq1_level_low_skip_override[] = {
|
|||
*/
|
||||
static const struct dmi_system_id irq1_edge_low_force_override[] = {
|
||||
{
|
||||
/* MECHREV Jiaolong17KS Series GM7XG0M */
|
||||
/* MECHREVO Jiaolong17KS Series GM7XG0M */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "GM7XG0M"),
|
||||
},
|
||||
|
|
|
|||
|
|
@ -37,6 +37,10 @@
|
|||
#include "pinctrl-utils.h"
|
||||
#include "pinctrl-amd.h"
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
static struct amd_gpio *pinctrl_dev;
|
||||
#endif
|
||||
|
||||
static int amd_gpio_get_direction(struct gpio_chip *gc, unsigned offset)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
|
@ -890,6 +894,44 @@ static void amd_gpio_irq_init(struct amd_gpio *gpio_dev)
|
|||
}
|
||||
}
|
||||
|
||||
#if defined(CONFIG_SUSPEND) && defined(CONFIG_ACPI)
|
||||
static void amd_gpio_check_pending(void)
|
||||
{
|
||||
struct amd_gpio *gpio_dev = pinctrl_dev;
|
||||
struct pinctrl_desc *desc = gpio_dev->pctrl->desc;
|
||||
int i;
|
||||
|
||||
if (!pm_debug_messages_on)
|
||||
return;
|
||||
|
||||
for (i = 0; i < desc->npins; i++) {
|
||||
int pin = desc->pins[i].number;
|
||||
u32 tmp;
|
||||
|
||||
tmp = readl(gpio_dev->base + pin * 4);
|
||||
if (tmp & PIN_IRQ_PENDING)
|
||||
pm_pr_dbg("%s: GPIO %d is active: 0x%x.\n", __func__, pin, tmp);
|
||||
}
|
||||
}
|
||||
|
||||
static struct acpi_s2idle_dev_ops pinctrl_amd_s2idle_dev_ops = {
|
||||
.check = amd_gpio_check_pending,
|
||||
};
|
||||
|
||||
static void amd_gpio_register_s2idle_ops(void)
|
||||
{
|
||||
acpi_register_lps0_dev(&pinctrl_amd_s2idle_dev_ops);
|
||||
}
|
||||
|
||||
static void amd_gpio_unregister_s2idle_ops(void)
|
||||
{
|
||||
acpi_unregister_lps0_dev(&pinctrl_amd_s2idle_dev_ops);
|
||||
}
|
||||
#else
|
||||
static inline void amd_gpio_register_s2idle_ops(void) {}
|
||||
static inline void amd_gpio_unregister_s2idle_ops(void) {}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static bool amd_gpio_should_save(struct amd_gpio *gpio_dev, unsigned int pin)
|
||||
{
|
||||
|
|
@ -942,6 +984,9 @@ static int amd_gpio_suspend_hibernate_common(struct device *dev, bool is_suspend
|
|||
|
||||
static int amd_gpio_suspend(struct device *dev)
|
||||
{
|
||||
#ifdef CONFIG_SUSPEND
|
||||
pinctrl_dev = dev_get_drvdata(dev);
|
||||
#endif
|
||||
return amd_gpio_suspend_hibernate_common(dev, true);
|
||||
}
|
||||
|
||||
|
|
@ -1115,7 +1160,7 @@ static int amd_gpio_probe(struct platform_device *pdev)
|
|||
if (gpio_dev->irq < 0)
|
||||
return gpio_dev->irq;
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
#ifdef CONFIG_SUSPEND
|
||||
gpio_dev->saved_regs = devm_kcalloc(&pdev->dev, amd_pinctrl_desc.npins,
|
||||
sizeof(*gpio_dev->saved_regs),
|
||||
GFP_KERNEL);
|
||||
|
|
@ -1181,6 +1226,7 @@ static int amd_gpio_probe(struct platform_device *pdev)
|
|||
|
||||
platform_set_drvdata(pdev, gpio_dev);
|
||||
acpi_register_wakeup_handler(gpio_dev->irq, amd_gpio_check_wake, gpio_dev);
|
||||
amd_gpio_register_s2idle_ops();
|
||||
|
||||
dev_dbg(&pdev->dev, "amd gpio driver loaded\n");
|
||||
return ret;
|
||||
|
|
@ -1199,6 +1245,7 @@ static void amd_gpio_remove(struct platform_device *pdev)
|
|||
|
||||
gpiochip_remove(&gpio_dev->gc);
|
||||
acpi_unregister_wakeup_handler(amd_gpio_check_wake, gpio_dev);
|
||||
amd_gpio_unregister_s2idle_ops();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
|
|
|
|||
|
|
@ -1134,13 +1134,13 @@ void acpi_os_set_prepare_extended_sleep(int (*func)(u8 sleep_state,
|
|||
|
||||
acpi_status acpi_os_prepare_extended_sleep(u8 sleep_state,
|
||||
u32 val_a, u32 val_b);
|
||||
#if defined(CONFIG_SUSPEND) && defined(CONFIG_X86)
|
||||
struct acpi_s2idle_dev_ops {
|
||||
struct list_head list_node;
|
||||
void (*prepare)(void);
|
||||
void (*check)(void);
|
||||
void (*restore)(void);
|
||||
};
|
||||
#if defined(CONFIG_SUSPEND) && defined(CONFIG_X86)
|
||||
int acpi_register_lps0_dev(struct acpi_s2idle_dev_ops *arg);
|
||||
void acpi_unregister_lps0_dev(struct acpi_s2idle_dev_ops *arg);
|
||||
int acpi_get_lps0_constraint(struct acpi_device *adev);
|
||||
|
|
@ -1149,6 +1149,13 @@ static inline int acpi_get_lps0_constraint(struct device *dev)
|
|||
{
|
||||
return ACPI_STATE_UNKNOWN;
|
||||
}
|
||||
static inline int acpi_register_lps0_dev(struct acpi_s2idle_dev_ops *arg)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
static inline void acpi_unregister_lps0_dev(struct acpi_s2idle_dev_ops *arg)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_SUSPEND && CONFIG_X86 */
|
||||
void arch_reserve_mem_area(acpi_physical_address addr, size_t size);
|
||||
#else
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user