Merge tag 'acpi-5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull ACPI fixes from Rafael Wysocki:
"These are mostly docmentation fixes and janitorial changes plus some
new device IDs and a new quirk.
Specifics:
- Fix documentation regarding GPIO properties (Andy Shevchenko)
- Fix spelling mistakes in ACPI documentation (Flavio Suligoi)
- Fix white space inconsistencies in ACPI code (Maximilian Luz)
- Fix string formatting in the ACPI Generic Event Device (GED) driver
(Nick Desaulniers)
- Add Intel Alder Lake device IDs to the ACPI drivers used by the
Dynamic Platform and Thermal Framework (Srinivas Pandruvada)
- Add lid-related DMI quirk for Medion Akoya E2228T to the ACPI
button driver (Hans de Goede)"
* tag 'acpi-5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
ACPI: DPTF: Support Alder Lake
Documentation: ACPI: fix spelling mistakes
ACPI: button: Add DMI quirk for Medion Akoya E2228T
ACPI: GED: fix -Wformat
ACPI: Fix whitespace inconsistencies
ACPI: scan: Fix acpi_dma_configure_id() kerneldoc name
Documentation: firmware-guide: gpio-properties: Clarify initial output state
Documentation: firmware-guide: gpio-properties: active_low only for GpioIo()
Documentation: firmware-guide: gpio-properties: Fix factual mistakes
This commit is contained in:
@@ -19,9 +19,9 @@ report the "current" state of the lid as either "opened" or "closed".
|
|||||||
|
|
||||||
For most platforms, both the _LID method and the lid notifications are
|
For most platforms, both the _LID method and the lid notifications are
|
||||||
reliable. However, there are exceptions. In order to work with these
|
reliable. However, there are exceptions. In order to work with these
|
||||||
exceptional buggy platforms, special restrictions and expections should be
|
exceptional buggy platforms, special restrictions and exceptions should be
|
||||||
taken into account. This document describes the restrictions and the
|
taken into account. This document describes the restrictions and the
|
||||||
expections of the Linux ACPI lid device driver.
|
exceptions of the Linux ACPI lid device driver.
|
||||||
|
|
||||||
|
|
||||||
Restrictions of the returning value of the _LID control method
|
Restrictions of the returning value of the _LID control method
|
||||||
@@ -46,7 +46,7 @@ state is changed to "closed". The "closed" notification is normally used to
|
|||||||
trigger some system power saving operations on Windows. Since it is fully
|
trigger some system power saving operations on Windows. Since it is fully
|
||||||
tested, it is reliable from all AML tables.
|
tested, it is reliable from all AML tables.
|
||||||
|
|
||||||
Expections for the userspace users of the ACPI lid device driver
|
Exceptions for the userspace users of the ACPI lid device driver
|
||||||
================================================================
|
================================================================
|
||||||
|
|
||||||
The ACPI button driver exports the lid state to the userspace via the
|
The ACPI button driver exports the lid state to the userspace via the
|
||||||
@@ -100,7 +100,7 @@ use the following kernel parameter:
|
|||||||
C. button.lid_init_state=ignore:
|
C. button.lid_init_state=ignore:
|
||||||
When this option is specified, the ACPI button driver never reports the
|
When this option is specified, the ACPI button driver never reports the
|
||||||
initial lid state and there is a compensation mechanism implemented to
|
initial lid state and there is a compensation mechanism implemented to
|
||||||
ensure that the reliable "closed" notifications can always be delievered
|
ensure that the reliable "closed" notifications can always be delivered
|
||||||
to the userspace by always pairing "closed" input events with complement
|
to the userspace by always pairing "closed" input events with complement
|
||||||
"opened" input events. But there is still no guarantee that the "opened"
|
"opened" input events. But there is still no guarantee that the "opened"
|
||||||
notifications can be delivered to the userspace when the lid is actually
|
notifications can be delivered to the userspace when the lid is actually
|
||||||
|
|||||||
@@ -20,9 +20,9 @@ index, like the ASL example below shows::
|
|||||||
|
|
||||||
Name (_CRS, ResourceTemplate ()
|
Name (_CRS, ResourceTemplate ()
|
||||||
{
|
{
|
||||||
GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionInputOnly,
|
GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionOutputOnly,
|
||||||
"\\_SB.GPO0", 0, ResourceConsumer) {15}
|
"\\_SB.GPO0", 0, ResourceConsumer) {15}
|
||||||
GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionInputOnly,
|
GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionOutputOnly,
|
||||||
"\\_SB.GPO0", 0, ResourceConsumer) {27, 31}
|
"\\_SB.GPO0", 0, ResourceConsumer) {27, 31}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -49,15 +49,41 @@ index
|
|||||||
pin
|
pin
|
||||||
Pin in the GpioIo()/GpioInt() resource. Typically this is zero.
|
Pin in the GpioIo()/GpioInt() resource. Typically this is zero.
|
||||||
active_low
|
active_low
|
||||||
If 1 the GPIO is marked as active_low.
|
If 1, the GPIO is marked as active_low.
|
||||||
|
|
||||||
Since ACPI GpioIo() resource does not have a field saying whether it is
|
Since ACPI GpioIo() resource does not have a field saying whether it is
|
||||||
active low or high, the "active_low" argument can be used here. Setting
|
active low or high, the "active_low" argument can be used here. Setting
|
||||||
it to 1 marks the GPIO as active low.
|
it to 1 marks the GPIO as active low.
|
||||||
|
|
||||||
|
Note, active_low in _DSD does not make sense for GpioInt() resource and
|
||||||
|
must be 0. GpioInt() resource has its own means of defining it.
|
||||||
|
|
||||||
In our Bluetooth example the "reset-gpios" refers to the second GpioIo()
|
In our Bluetooth example the "reset-gpios" refers to the second GpioIo()
|
||||||
resource, second pin in that resource with the GPIO number of 31.
|
resource, second pin in that resource with the GPIO number of 31.
|
||||||
|
|
||||||
|
The GpioIo() resource unfortunately doesn't explicitly provide an initial
|
||||||
|
state of the output pin which driver should use during its initialization.
|
||||||
|
|
||||||
|
Linux tries to use common sense here and derives the state from the bias
|
||||||
|
and polarity settings. The table below shows the expectations:
|
||||||
|
|
||||||
|
========= ============= ==============
|
||||||
|
Pull Bias Polarity Requested...
|
||||||
|
========= ============= ==============
|
||||||
|
Implicit x AS IS (assumed firmware configured for us)
|
||||||
|
Explicit x (no _DSD) as Pull Bias (Up == High, Down == Low),
|
||||||
|
assuming non-active (Polarity = !Pull Bias)
|
||||||
|
Down Low as low, assuming active
|
||||||
|
Down High as low, assuming non-active
|
||||||
|
Up Low as high, assuming non-active
|
||||||
|
Up High as high, assuming active
|
||||||
|
========= ============= ==============
|
||||||
|
|
||||||
|
That said, for our above example the both GPIOs, since the bias setting
|
||||||
|
is explicit and _DSD is present, will be treated as active with a high
|
||||||
|
polarity and Linux will configure the pins in this state until a driver
|
||||||
|
reprograms them differently.
|
||||||
|
|
||||||
It is possible to leave holes in the array of GPIOs. This is useful in
|
It is possible to leave holes in the array of GPIOs. This is useful in
|
||||||
cases like with SPI host controllers where some chip selects may be
|
cases like with SPI host controllers where some chip selects may be
|
||||||
implemented as GPIOs and some as native signals. For example a SPI host
|
implemented as GPIOs and some as native signals. For example a SPI host
|
||||||
@@ -112,8 +138,8 @@ Example::
|
|||||||
Package () {
|
Package () {
|
||||||
"gpio-line-names",
|
"gpio-line-names",
|
||||||
Package () {
|
Package () {
|
||||||
"SPI0_CS_N", "EXP2_INT", "MUX6_IO", "UART0_RXD", "MUX7_IO",
|
"SPI0_CS_N", "EXP2_INT", "MUX6_IO", "UART0_RXD",
|
||||||
"LVL_C_A1", "MUX0_IO", "SPI1_MISO"
|
"MUX7_IO", "LVL_C_A1", "MUX0_IO", "SPI1_MISO",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,7 +163,7 @@ to the GPIO lines it is going to use and provide the GPIO subsystem with a
|
|||||||
mapping between those names and the ACPI GPIO resources corresponding to them.
|
mapping between those names and the ACPI GPIO resources corresponding to them.
|
||||||
|
|
||||||
To do that, the driver needs to define a mapping table as a NULL-terminated
|
To do that, the driver needs to define a mapping table as a NULL-terminated
|
||||||
array of struct acpi_gpio_mapping objects that each contain a name, a pointer
|
array of struct acpi_gpio_mapping objects that each contains a name, a pointer
|
||||||
to an array of line data (struct acpi_gpio_params) objects and the size of that
|
to an array of line data (struct acpi_gpio_params) objects and the size of that
|
||||||
array. Each struct acpi_gpio_params object consists of three fields,
|
array. Each struct acpi_gpio_params object consists of three fields,
|
||||||
crs_entry_index, line_index, active_low, representing the index of the target
|
crs_entry_index, line_index, active_low, representing the index of the target
|
||||||
@@ -154,13 +180,14 @@ question would look like this::
|
|||||||
static const struct acpi_gpio_mapping bluetooth_acpi_gpios[] = {
|
static const struct acpi_gpio_mapping bluetooth_acpi_gpios[] = {
|
||||||
{ "reset-gpios", &reset_gpio, 1 },
|
{ "reset-gpios", &reset_gpio, 1 },
|
||||||
{ "shutdown-gpios", &shutdown_gpio, 1 },
|
{ "shutdown-gpios", &shutdown_gpio, 1 },
|
||||||
{ },
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
Next, the mapping table needs to be passed as the second argument to
|
Next, the mapping table needs to be passed as the second argument to
|
||||||
acpi_dev_add_driver_gpios() that will register it with the ACPI device object
|
acpi_dev_add_driver_gpios() or its managed analogue that will
|
||||||
pointed to by its first argument. That should be done in the driver's .probe()
|
register it with the ACPI device object pointed to by its first
|
||||||
routine. On removal, the driver should unregister its GPIO mapping table by
|
argument. That should be done in the driver's .probe() routine.
|
||||||
|
On removal, the driver should unregister its GPIO mapping table by
|
||||||
calling acpi_dev_remove_driver_gpios() on the ACPI device object where that
|
calling acpi_dev_remove_driver_gpios() on the ACPI device object where that
|
||||||
table was previously registered.
|
table was previously registered.
|
||||||
|
|
||||||
@@ -191,12 +218,12 @@ The driver might expect to get the right GPIO when it does::
|
|||||||
but since there is no way to know the mapping between "reset" and
|
but since there is no way to know the mapping between "reset" and
|
||||||
the GpioIo() in _CRS desc will hold ERR_PTR(-ENOENT).
|
the GpioIo() in _CRS desc will hold ERR_PTR(-ENOENT).
|
||||||
|
|
||||||
The driver author can solve this by passing the mapping explictly
|
The driver author can solve this by passing the mapping explicitly
|
||||||
(the recommended way and documented in the above chapter).
|
(this is the recommended way and it's documented in the above chapter).
|
||||||
|
|
||||||
The ACPI GPIO mapping tables should not contaminate drivers that are not
|
The ACPI GPIO mapping tables should not contaminate drivers that are not
|
||||||
knowing about which exact device they are servicing on. It implies that
|
knowing about which exact device they are servicing on. It implies that
|
||||||
the ACPI GPIO mapping tables are hardly linked to ACPI ID and certain
|
the ACPI GPIO mapping tables are hardly linked to an ACPI ID and certain
|
||||||
objects, as listed in the above chapter, of the device in question.
|
objects, as listed in the above chapter, of the device in question.
|
||||||
|
|
||||||
Getting GPIO descriptor
|
Getting GPIO descriptor
|
||||||
@@ -229,5 +256,5 @@ Case 2 explicitly tells GPIO core to look for resources in _CRS.
|
|||||||
Be aware that gpiod_get_index() in cases 1 and 2, assuming that there
|
Be aware that gpiod_get_index() in cases 1 and 2, assuming that there
|
||||||
are two versions of ACPI device description provided and no mapping is
|
are two versions of ACPI device description provided and no mapping is
|
||||||
present in the driver, will return different resources. That's why a
|
present in the driver, will return different resources. That's why a
|
||||||
certain driver has to handle them carefully as explained in previous
|
certain driver has to handle them carefully as explained in the previous
|
||||||
chapter.
|
chapter.
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ subject to change::
|
|||||||
[ 0.188903] exdebug-0398 ex_trace_point : Method End [0xf58394d8:\_SB.PCI0.LPCB.ECOK] execution.
|
[ 0.188903] exdebug-0398 ex_trace_point : Method End [0xf58394d8:\_SB.PCI0.LPCB.ECOK] execution.
|
||||||
|
|
||||||
Developers can utilize these special log entries to track the AML
|
Developers can utilize these special log entries to track the AML
|
||||||
interpretion, thus can aid issue debugging and performance tuning. Note
|
interpretation, thus can aid issue debugging and performance tuning. Note
|
||||||
that, as the "AML tracer" logs are implemented via ACPI_DEBUG_PRINT()
|
that, as the "AML tracer" logs are implemented via ACPI_DEBUG_PRINT()
|
||||||
macro, CONFIG_ACPI_DEBUG is also required to be enabled for enabling
|
macro, CONFIG_ACPI_DEBUG is also required to be enabled for enabling
|
||||||
"AML tracer" logs.
|
"AML tracer" logs.
|
||||||
|
|||||||
@@ -89,7 +89,18 @@ static const struct dmi_system_id dmi_lid_quirks[] = {
|
|||||||
*/
|
*/
|
||||||
.matches = {
|
.matches = {
|
||||||
DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
|
DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
|
||||||
DMI_MATCH(DMI_PRODUCT_NAME, "E2215T MD60198"),
|
DMI_MATCH(DMI_PRODUCT_NAME, "E2215T"),
|
||||||
|
},
|
||||||
|
.driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_OPEN,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Medion Akoya E2228T, notification of the LID device only
|
||||||
|
* happens on close, not on open and _LID always returns closed.
|
||||||
|
*/
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "E2228T"),
|
||||||
},
|
},
|
||||||
.driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_OPEN,
|
.driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_OPEN,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -106,6 +106,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},
|
||||||
{"", 0},
|
{"", 0},
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(acpi, pch_fivr_device_ids);
|
MODULE_DEVICE_TABLE(acpi, pch_fivr_device_ids);
|
||||||
|
|||||||
@@ -229,6 +229,8 @@ static const struct acpi_device_id int3407_device_ids[] = {
|
|||||||
{"INT3532", 0},
|
{"INT3532", 0},
|
||||||
{"INTC1047", 0},
|
{"INTC1047", 0},
|
||||||
{"INTC1050", 0},
|
{"INTC1050", 0},
|
||||||
|
{"INTC1060", 0},
|
||||||
|
{"INTC1061", 0},
|
||||||
{"", 0},
|
{"", 0},
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(acpi, int3407_device_ids);
|
MODULE_DEVICE_TABLE(acpi, int3407_device_ids);
|
||||||
|
|||||||
@@ -25,10 +25,16 @@ static const struct acpi_device_id int340x_thermal_device_ids[] = {
|
|||||||
{"INT340A"},
|
{"INT340A"},
|
||||||
{"INT340B"},
|
{"INT340B"},
|
||||||
{"INTC1040"},
|
{"INTC1040"},
|
||||||
|
{"INTC1041"},
|
||||||
{"INTC1043"},
|
{"INTC1043"},
|
||||||
{"INTC1044"},
|
{"INTC1044"},
|
||||||
{"INTC1045"},
|
{"INTC1045"},
|
||||||
|
{"INTC1046"},
|
||||||
{"INTC1047"},
|
{"INTC1047"},
|
||||||
|
{"INTC1048"},
|
||||||
|
{"INTC1049"},
|
||||||
|
{"INTC1060"},
|
||||||
|
{"INTC1061"},
|
||||||
{""},
|
{""},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ static acpi_status acpi_ged_request_interrupt(struct acpi_resource *ares,
|
|||||||
|
|
||||||
switch (gsi) {
|
switch (gsi) {
|
||||||
case 0 ... 255:
|
case 0 ... 255:
|
||||||
sprintf(ev_name, "_%c%02hhX",
|
sprintf(ev_name, "_%c%02X",
|
||||||
trigger == ACPI_EDGE_SENSITIVE ? 'E' : 'L', gsi);
|
trigger == ACPI_EDGE_SENSITIVE ? 'E' : 'L', gsi);
|
||||||
|
|
||||||
if (ACPI_SUCCESS(acpi_get_handle(handle, ev_name, &evt_handle)))
|
if (ACPI_SUCCESS(acpi_get_handle(handle, ev_name, &evt_handle)))
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ static const struct acpi_device_id fan_device_ids[] = {
|
|||||||
{"PNP0C0B", 0},
|
{"PNP0C0B", 0},
|
||||||
{"INT3404", 0},
|
{"INT3404", 0},
|
||||||
{"INTC1044", 0},
|
{"INTC1044", 0},
|
||||||
|
{"INTC1048", 0},
|
||||||
{"", 0},
|
{"", 0},
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(acpi, fan_device_ids);
|
MODULE_DEVICE_TABLE(acpi, fan_device_ids);
|
||||||
|
|||||||
@@ -1453,7 +1453,7 @@ int acpi_dma_get_range(struct device *dev, u64 *dma_addr, u64 *offset,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* acpi_dma_configure - Set-up DMA configuration for the device.
|
* acpi_dma_configure_id - Set-up DMA configuration for the device.
|
||||||
* @dev: The pointer to the device
|
* @dev: The pointer to the device
|
||||||
* @attr: device dma attributes
|
* @attr: device dma attributes
|
||||||
* @input_id: input device id const value pointer
|
* @input_id: input device id const value pointer
|
||||||
|
|||||||
Reference in New Issue
Block a user