mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 11:46:19 +00:00
Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6
* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6: (47 commits) ACPI: pci_link: remove acpi_irq_balance_set() interface fujitsu-laptop: Add DMI callback for Lifebook S6420 ACPI: EC: Don't do transaction from GPE handler in poll mode. ACPI: EC: lower interrupt storm treshold ACPICA: Use spinlock for acpi_{en|dis}able_gpe ACPI: EC: restart failed command ACPI: EC: wait for last write gpe ACPI: EC: make kernel messages more useful when GPE storm is detected ACPI: EC: revert msleep patch thinkpad_acpi: fingers off backlight if video.ko is serving this functionality sony-laptop: fingers off backlight if video.ko is serving this functionality msi-laptop: fingers off backlight if video.ko is serving this functionality fujitsu-laptop: fingers off backlight if video.ko is serving this functionality eeepc-laptop: fingers off backlight if video.ko is serving this functionality compal: fingers off backlight if video.ko is serving this functionality asus-acpi: fingers off backlight if video.ko is serving this functionality Acer-WMI: fingers off backlight if video.ko is serving this functionality ACPI video: if no ACPI backlight support, use vendor drivers ACPI: video: Ignore devices that aren't present in hardware Delete an unwanted return statement at evgpe.c ...
This commit is contained in:
commit
08c1184fa2
56 changed files with 935 additions and 388 deletions
|
@ -89,7 +89,7 @@ Description:
|
|||
|
||||
error - an interrupt that can't be accounted for above.
|
||||
|
||||
invalid: it's either a wakeup GPE or a GPE/Fixed Event that
|
||||
invalid: it's either a GPE or a Fixed Event that
|
||||
doesn't have an event handler.
|
||||
|
||||
disable: the GPE/Fixed Event is valid but disabled.
|
||||
|
@ -117,30 +117,30 @@ Description:
|
|||
and other user space applications so that the machine won't shutdown
|
||||
when pressing the power button.
|
||||
# cat ff_pwr_btn
|
||||
0
|
||||
0 enabled
|
||||
# press the power button for 3 times;
|
||||
# cat ff_pwr_btn
|
||||
3
|
||||
3 enabled
|
||||
# echo disable > ff_pwr_btn
|
||||
# cat ff_pwr_btn
|
||||
disable
|
||||
3 disabled
|
||||
# press the power button for 3 times;
|
||||
# cat ff_pwr_btn
|
||||
disable
|
||||
3 disabled
|
||||
# echo enable > ff_pwr_btn
|
||||
# cat ff_pwr_btn
|
||||
4
|
||||
4 enabled
|
||||
/*
|
||||
* this is because the status bit is set even if the enable bit is cleared,
|
||||
* and it triggers an ACPI fixed event when the enable bit is set again
|
||||
*/
|
||||
# press the power button for 3 times;
|
||||
# cat ff_pwr_btn
|
||||
7
|
||||
7 enabled
|
||||
# echo disable > ff_pwr_btn
|
||||
# press the power button for 3 times;
|
||||
# echo clear > ff_pwr_btn /* clear the status bit */
|
||||
# echo disable > ff_pwr_btn
|
||||
# cat ff_pwr_btn
|
||||
7
|
||||
7 enabled
|
||||
|
||||
|
|
148
Documentation/acpi/debug.txt
Normal file
148
Documentation/acpi/debug.txt
Normal file
|
@ -0,0 +1,148 @@
|
|||
ACPI Debug Output
|
||||
|
||||
|
||||
The ACPI CA, the Linux ACPI core, and some ACPI drivers can generate debug
|
||||
output. This document describes how to use this facility.
|
||||
|
||||
Compile-time configuration
|
||||
--------------------------
|
||||
|
||||
ACPI debug output is globally enabled by CONFIG_ACPI_DEBUG. If this config
|
||||
option is turned off, the debug messages are not even built into the
|
||||
kernel.
|
||||
|
||||
Boot- and run-time configuration
|
||||
--------------------------------
|
||||
|
||||
When CONFIG_ACPI_DEBUG=y, you can select the component and level of messages
|
||||
you're interested in. At boot-time, use the acpi.debug_layer and
|
||||
acpi.debug_level kernel command line options. After boot, you can use the
|
||||
debug_layer and debug_level files in /sys/module/acpi/parameters/ to control
|
||||
the debug messages.
|
||||
|
||||
debug_layer (component)
|
||||
-----------------------
|
||||
|
||||
The "debug_layer" is a mask that selects components of interest, e.g., a
|
||||
specific driver or part of the ACPI interpreter. To build the debug_layer
|
||||
bitmask, look for the "#define _COMPONENT" in an ACPI source file.
|
||||
|
||||
You can set the debug_layer mask at boot-time using the acpi.debug_layer
|
||||
command line argument, and you can change it after boot by writing values
|
||||
to /sys/module/acpi/parameters/debug_layer.
|
||||
|
||||
The possible components are defined in include/acpi/acoutput.h and
|
||||
include/acpi/acpi_drivers.h. Reading /sys/module/acpi/parameters/debug_layer
|
||||
shows the supported mask values, currently these:
|
||||
|
||||
ACPI_UTILITIES 0x00000001
|
||||
ACPI_HARDWARE 0x00000002
|
||||
ACPI_EVENTS 0x00000004
|
||||
ACPI_TABLES 0x00000008
|
||||
ACPI_NAMESPACE 0x00000010
|
||||
ACPI_PARSER 0x00000020
|
||||
ACPI_DISPATCHER 0x00000040
|
||||
ACPI_EXECUTER 0x00000080
|
||||
ACPI_RESOURCES 0x00000100
|
||||
ACPI_CA_DEBUGGER 0x00000200
|
||||
ACPI_OS_SERVICES 0x00000400
|
||||
ACPI_CA_DISASSEMBLER 0x00000800
|
||||
ACPI_COMPILER 0x00001000
|
||||
ACPI_TOOLS 0x00002000
|
||||
ACPI_BUS_COMPONENT 0x00010000
|
||||
ACPI_AC_COMPONENT 0x00020000
|
||||
ACPI_BATTERY_COMPONENT 0x00040000
|
||||
ACPI_BUTTON_COMPONENT 0x00080000
|
||||
ACPI_SBS_COMPONENT 0x00100000
|
||||
ACPI_FAN_COMPONENT 0x00200000
|
||||
ACPI_PCI_COMPONENT 0x00400000
|
||||
ACPI_POWER_COMPONENT 0x00800000
|
||||
ACPI_CONTAINER_COMPONENT 0x01000000
|
||||
ACPI_SYSTEM_COMPONENT 0x02000000
|
||||
ACPI_THERMAL_COMPONENT 0x04000000
|
||||
ACPI_MEMORY_DEVICE_COMPONENT 0x08000000
|
||||
ACPI_VIDEO_COMPONENT 0x10000000
|
||||
ACPI_PROCESSOR_COMPONENT 0x20000000
|
||||
|
||||
debug_level
|
||||
-----------
|
||||
|
||||
The "debug_level" is a mask that selects different types of messages, e.g.,
|
||||
those related to initialization, method execution, informational messages, etc.
|
||||
To build debug_level, look at the level specified in an ACPI_DEBUG_PRINT()
|
||||
statement.
|
||||
|
||||
The ACPI interpreter uses several different levels, but the Linux
|
||||
ACPI core and ACPI drivers generally only use ACPI_LV_INFO.
|
||||
|
||||
You can set the debug_level mask at boot-time using the acpi.debug_level
|
||||
command line argument, and you can change it after boot by writing values
|
||||
to /sys/module/acpi/parameters/debug_level.
|
||||
|
||||
The possible levels are defined in include/acpi/acoutput.h. Reading
|
||||
/sys/module/acpi/parameters/debug_level shows the supported mask values,
|
||||
currently these:
|
||||
|
||||
ACPI_LV_INIT 0x00000001
|
||||
ACPI_LV_DEBUG_OBJECT 0x00000002
|
||||
ACPI_LV_INFO 0x00000004
|
||||
ACPI_LV_INIT_NAMES 0x00000020
|
||||
ACPI_LV_PARSE 0x00000040
|
||||
ACPI_LV_LOAD 0x00000080
|
||||
ACPI_LV_DISPATCH 0x00000100
|
||||
ACPI_LV_EXEC 0x00000200
|
||||
ACPI_LV_NAMES 0x00000400
|
||||
ACPI_LV_OPREGION 0x00000800
|
||||
ACPI_LV_BFIELD 0x00001000
|
||||
ACPI_LV_TABLES 0x00002000
|
||||
ACPI_LV_VALUES 0x00004000
|
||||
ACPI_LV_OBJECTS 0x00008000
|
||||
ACPI_LV_RESOURCES 0x00010000
|
||||
ACPI_LV_USER_REQUESTS 0x00020000
|
||||
ACPI_LV_PACKAGE 0x00040000
|
||||
ACPI_LV_ALLOCATIONS 0x00100000
|
||||
ACPI_LV_FUNCTIONS 0x00200000
|
||||
ACPI_LV_OPTIMIZATIONS 0x00400000
|
||||
ACPI_LV_MUTEX 0x01000000
|
||||
ACPI_LV_THREADS 0x02000000
|
||||
ACPI_LV_IO 0x04000000
|
||||
ACPI_LV_INTERRUPTS 0x08000000
|
||||
ACPI_LV_AML_DISASSEMBLE 0x10000000
|
||||
ACPI_LV_VERBOSE_INFO 0x20000000
|
||||
ACPI_LV_FULL_TABLES 0x40000000
|
||||
ACPI_LV_EVENTS 0x80000000
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
For example, drivers/acpi/bus.c contains this:
|
||||
|
||||
#define _COMPONENT ACPI_BUS_COMPONENT
|
||||
...
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device insertion detected\n"));
|
||||
|
||||
To turn on this message, set the ACPI_BUS_COMPONENT bit in acpi.debug_layer
|
||||
and the ACPI_LV_INFO bit in acpi.debug_level. (The ACPI_DEBUG_PRINT
|
||||
statement uses ACPI_DB_INFO, which is macro based on the ACPI_LV_INFO
|
||||
definition.)
|
||||
|
||||
Enable all AML "Debug" output (stores to the Debug object while interpreting
|
||||
AML) during boot:
|
||||
|
||||
acpi.debug_layer=0xffffffff acpi.debug_level=0x2
|
||||
|
||||
Enable PCI and PCI interrupt routing debug messages:
|
||||
|
||||
acpi.debug_layer=0x400000 acpi.debug_level=0x4
|
||||
|
||||
Enable all ACPI hardware-related messages:
|
||||
|
||||
acpi.debug_layer=0x2 acpi.debug_level=0xffffffff
|
||||
|
||||
Enable all ACPI_DB_INFO messages after boot:
|
||||
|
||||
# echo 0x4 > /sys/module/acpi/parameters/debug_level
|
||||
|
||||
Show all valid component values:
|
||||
|
||||
# cat /sys/module/acpi/parameters/debug_layer
|
|
@ -198,59 +198,42 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
that require a timer override, but don't have
|
||||
HPET
|
||||
|
||||
acpi.debug_layer= [HW,ACPI]
|
||||
acpi_backlight= [HW,ACPI]
|
||||
acpi_backlight=vendor
|
||||
acpi_backlight=video
|
||||
If set to vendor, prefer vendor specific driver
|
||||
(e.g. thinkpad_acpi, sony_acpi, etc.) instead
|
||||
of the ACPI video.ko driver.
|
||||
|
||||
acpi_display_output= [HW,ACPI]
|
||||
acpi_display_output=vendor
|
||||
acpi_display_output=video
|
||||
See above.
|
||||
|
||||
acpi.debug_layer= [HW,ACPI,ACPI_DEBUG]
|
||||
acpi.debug_level= [HW,ACPI,ACPI_DEBUG]
|
||||
Format: <int>
|
||||
Each bit of the <int> indicates an ACPI debug layer,
|
||||
1: enable, 0: disable. It is useful for boot time
|
||||
debugging. After system has booted up, it can be set
|
||||
via /sys/module/acpi/parameters/debug_layer.
|
||||
CONFIG_ACPI_DEBUG must be enabled for this to produce any output.
|
||||
Available bits (add the numbers together) to enable debug output
|
||||
for specific parts of the ACPI subsystem:
|
||||
0x01 utilities 0x02 hardware 0x04 events 0x08 tables
|
||||
0x10 namespace 0x20 parser 0x40 dispatcher
|
||||
0x80 executer 0x100 resources 0x200 acpica debugger
|
||||
0x400 os services 0x800 acpica disassembler.
|
||||
The number can be in decimal or prefixed with 0x in hex.
|
||||
Warning: Many of these options can produce a lot of
|
||||
output and make your system unusable. Be very careful.
|
||||
CONFIG_ACPI_DEBUG must be enabled to produce any ACPI
|
||||
debug output. Bits in debug_layer correspond to a
|
||||
_COMPONENT in an ACPI source file, e.g.,
|
||||
#define _COMPONENT ACPI_PCI_COMPONENT
|
||||
Bits in debug_level correspond to a level in
|
||||
ACPI_DEBUG_PRINT statements, e.g.,
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, ...
|
||||
See Documentation/acpi/debug.txt for more information
|
||||
about debug layers and levels.
|
||||
|
||||
acpi.debug_level= [HW,ACPI]
|
||||
Format: <int>
|
||||
Each bit of the <int> indicates an ACPI debug level,
|
||||
which corresponds to the level in an ACPI_DEBUG_PRINT
|
||||
statement. After system has booted up, this mask
|
||||
can be set via /sys/module/acpi/parameters/debug_level.
|
||||
Enable AML "Debug" output, i.e., stores to the Debug
|
||||
object while interpreting AML:
|
||||
acpi.debug_layer=0xffffffff acpi.debug_level=0x2
|
||||
Enable PCI/PCI interrupt routing info messages:
|
||||
acpi.debug_layer=0x400000 acpi.debug_level=0x4
|
||||
Enable all messages related to ACPI hardware:
|
||||
acpi.debug_layer=0x2 acpi.debug_level=0xffffffff
|
||||
|
||||
CONFIG_ACPI_DEBUG must be enabled for this to produce
|
||||
any output. The number can be in decimal or prefixed
|
||||
with 0x in hex. Some of these options produce so much
|
||||
output that the system is unusable.
|
||||
|
||||
The following global components are defined by the
|
||||
ACPI CA:
|
||||
0x01 error
|
||||
0x02 warn
|
||||
0x04 init
|
||||
0x08 debug object
|
||||
0x10 info
|
||||
0x20 init names
|
||||
0x40 parse
|
||||
0x80 load
|
||||
0x100 dispatch
|
||||
0x200 execute
|
||||
0x400 names
|
||||
0x800 operation region
|
||||
0x1000 bfield
|
||||
0x2000 tables
|
||||
0x4000 values
|
||||
0x8000 objects
|
||||
0x10000 resources
|
||||
0x20000 user requests
|
||||
0x40000 package
|
||||
The number can be in decimal or prefixed with 0x in hex.
|
||||
Warning: Many of these options can produce a lot of
|
||||
output and make your system unusable. Be very careful.
|
||||
Some values produce so much output that the system is
|
||||
unusable. The "log_buf_len" parameter may be useful
|
||||
if you need to capture more output.
|
||||
|
||||
acpi.power_nocheck= [HW,ACPI]
|
||||
Format: 1/0 enable/disable the check of power state.
|
||||
|
|
11
MAINTAINERS
11
MAINTAINERS
|
@ -2216,6 +2216,13 @@ M: adaplas@gmail.com
|
|||
L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
|
||||
INTEL MENLOW THERMAL DRIVER
|
||||
P: Sujith Thomas
|
||||
M: sujith.thomas@intel.com
|
||||
L: linux-acpi@vger.kernel.org
|
||||
W: http://www.lesswatts.org/projects/acpi/
|
||||
S: Supported
|
||||
|
||||
INTEL IA32 MICROCODE UPDATE SUPPORT
|
||||
P: Tigran Aivazian
|
||||
M: tigran@aivazian.fsnet.co.uk
|
||||
|
@ -3377,7 +3384,9 @@ S: Maintained
|
|||
|
||||
PNP SUPPORT
|
||||
P: Adam Belay
|
||||
M: ambx1@neo.rr.com
|
||||
M: abelay@mit.edu
|
||||
P: Bjorn Helgaas
|
||||
M: bjorn.helgaas@hp.com
|
||||
S: Maintained
|
||||
|
||||
PNXxxxx I2C DRIVER
|
||||
|
|
|
@ -113,7 +113,6 @@ static inline void acpi_disable_pci(void)
|
|||
acpi_pci_disabled = 1;
|
||||
acpi_noirq_set();
|
||||
}
|
||||
extern int acpi_irq_balance_set(char *str);
|
||||
|
||||
/* routines for saving/restoring kernel state */
|
||||
extern int acpi_save_state_mem(void);
|
||||
|
|
|
@ -1343,7 +1343,6 @@ static void __init acpi_process_madt(void)
|
|||
error = acpi_parse_madt_ioapic_entries();
|
||||
if (!error) {
|
||||
acpi_irq_model = ACPI_IRQ_MODEL_IOAPIC;
|
||||
acpi_irq_balance_set(NULL);
|
||||
acpi_ioapic = 1;
|
||||
|
||||
smp_found_config = 1;
|
||||
|
|
|
@ -312,9 +312,13 @@ config ACPI_DEBUG
|
|||
bool "Debug Statements"
|
||||
default n
|
||||
help
|
||||
The ACPI driver can optionally report errors with a great deal
|
||||
of verbosity. Saying Y enables these statements. This will increase
|
||||
your kernel size by around 50K.
|
||||
The ACPI subsystem can produce debug output. Saying Y enables this
|
||||
output and increases the kernel size by around 50K.
|
||||
|
||||
Use the acpi.debug_layer and acpi.debug_level kernel command-line
|
||||
parameters documented in Documentation/acpi/debug.txt and
|
||||
Documentation/kernel-parameters.txt to control the type and
|
||||
amount of debug output.
|
||||
|
||||
config ACPI_DEBUG_FUNC_TRACE
|
||||
bool "Additionally enable ACPI function tracing"
|
||||
|
@ -324,14 +328,6 @@ config ACPI_DEBUG_FUNC_TRACE
|
|||
ACPI Debug Statements slow down ACPI processing. Function trace
|
||||
is about half of the penalty and is rarely useful.
|
||||
|
||||
config ACPI_EC
|
||||
bool
|
||||
default y
|
||||
help
|
||||
This driver is required on some systems for the proper operation of
|
||||
the battery and thermal drivers. If you are compiling for a
|
||||
mobile system, say Y.
|
||||
|
||||
config ACPI_PCI_SLOT
|
||||
tristate "PCI slot detection driver"
|
||||
default n
|
||||
|
@ -341,10 +337,6 @@ config ACPI_PCI_SLOT
|
|||
help you correlate PCI bus addresses with the physical geography
|
||||
of your slots. If you are unsure, say N.
|
||||
|
||||
config ACPI_POWER
|
||||
bool
|
||||
default y
|
||||
|
||||
config ACPI_SYSTEM
|
||||
bool
|
||||
default y
|
||||
|
|
|
@ -39,19 +39,23 @@ obj-y += sleep/
|
|||
obj-y += bus.o glue.o
|
||||
obj-y += scan.o
|
||||
# Keep EC driver first. Initialization of others depend on it.
|
||||
obj-$(CONFIG_ACPI_EC) += ec.o
|
||||
obj-y += ec.o
|
||||
obj-$(CONFIG_ACPI_AC) += ac.o
|
||||
obj-$(CONFIG_ACPI_BATTERY) += battery.o
|
||||
obj-$(CONFIG_ACPI_BUTTON) += button.o
|
||||
obj-$(CONFIG_ACPI_FAN) += fan.o
|
||||
obj-$(CONFIG_ACPI_DOCK) += dock.o
|
||||
obj-$(CONFIG_ACPI_VIDEO) += video.o
|
||||
ifdef CONFIG_ACPI_VIDEO
|
||||
obj-y += video_detect.o
|
||||
endif
|
||||
|
||||
obj-y += pci_root.o pci_link.o pci_irq.o pci_bind.o
|
||||
obj-$(CONFIG_ACPI_PCI_SLOT) += pci_slot.o
|
||||
obj-$(CONFIG_ACPI_PROCESSOR) += processor.o
|
||||
obj-$(CONFIG_ACPI_CONTAINER) += container.o
|
||||
obj-$(CONFIG_ACPI_THERMAL) += thermal.o
|
||||
obj-$(CONFIG_ACPI_POWER) += power.o
|
||||
obj-y += power.o
|
||||
obj-$(CONFIG_ACPI_SYSTEM) += system.o event.o
|
||||
obj-$(CONFIG_ACPI_DEBUG) += debug.o
|
||||
obj-$(CONFIG_ACPI_NUMA) += numa.o
|
||||
|
|
|
@ -37,7 +37,6 @@
|
|||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
|
||||
#define ACPI_AC_COMPONENT 0x00020000
|
||||
#define ACPI_AC_CLASS "ac_adapter"
|
||||
#define ACPI_AC_DEVICE_NAME "AC Adapter"
|
||||
#define ACPI_AC_FILE_STATE "state"
|
||||
|
@ -242,7 +241,7 @@ static void acpi_ac_notify(acpi_handle handle, u32 event, void *data)
|
|||
acpi_ac_get_state(ac);
|
||||
acpi_bus_generate_proc_event(device, event, (u32) ac->state);
|
||||
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||
device->dev.bus_id, event,
|
||||
dev_name(&device->dev), event,
|
||||
(u32) ac->state);
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE);
|
||||
|
|
|
@ -32,7 +32,6 @@
|
|||
#include <linux/memory_hotplug.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
|
||||
#define ACPI_MEMORY_DEVICE_COMPONENT 0x08000000UL
|
||||
#define ACPI_MEMORY_DEVICE_CLASS "memory"
|
||||
#define ACPI_MEMORY_DEVICE_HID "PNP0C80"
|
||||
#define ACPI_MEMORY_DEVICE_NAME "Hotplug Mem Device"
|
||||
|
|
|
@ -46,7 +46,6 @@
|
|||
|
||||
#define ACPI_BATTERY_VALUE_UNKNOWN 0xFFFFFFFF
|
||||
|
||||
#define ACPI_BATTERY_COMPONENT 0x00040000
|
||||
#define ACPI_BATTERY_CLASS "battery"
|
||||
#define ACPI_BATTERY_DEVICE_NAME "Battery"
|
||||
#define ACPI_BATTERY_NOTIFY_STATUS 0x80
|
||||
|
@ -782,7 +781,7 @@ static void acpi_battery_notify(acpi_handle handle, u32 event, void *data)
|
|||
acpi_bus_generate_proc_event(device, event,
|
||||
acpi_battery_present(battery));
|
||||
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||
device->dev.bus_id, event,
|
||||
dev_name(&device->dev), event,
|
||||
acpi_battery_present(battery));
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
/* acpi_batter_update could remove power_supply object */
|
||||
|
|
|
@ -688,6 +688,14 @@ void __init acpi_early_init(void)
|
|||
if (acpi_disabled)
|
||||
return;
|
||||
|
||||
/*
|
||||
* ACPI CA initializes acpi_dbg_level to non-zero, which means
|
||||
* we get debug output merely by turning on CONFIG_ACPI_DEBUG.
|
||||
* Turn it off so we don't get output unless the user specifies
|
||||
* acpi.debug_level.
|
||||
*/
|
||||
acpi_dbg_level = 0;
|
||||
|
||||
printk(KERN_INFO PREFIX "Core revision %08x\n", ACPI_CA_VERSION);
|
||||
|
||||
/* enable workarounds, unless strict ACPI spec. compliance */
|
||||
|
@ -774,7 +782,7 @@ static int __init acpi_bus_init(void)
|
|||
"Unable to initialize ACPI OS objects\n");
|
||||
goto error1;
|
||||
}
|
||||
#ifdef CONFIG_ACPI_EC
|
||||
|
||||
/*
|
||||
* ACPI 2.0 requires the EC driver to be loaded and work before
|
||||
* the EC device is found in the namespace (i.e. before acpi_initialize_objects()
|
||||
|
@ -785,7 +793,6 @@ static int __init acpi_bus_init(void)
|
|||
*/
|
||||
status = acpi_ec_ecdt_probe();
|
||||
/* Ignore result. Not having an ECDT is not fatal. */
|
||||
#endif
|
||||
|
||||
status = acpi_initialize_objects(ACPI_FULL_INITIALIZATION);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
|
|
@ -33,7 +33,6 @@
|
|||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
|
||||
#define ACPI_BUTTON_COMPONENT 0x00080000
|
||||
#define ACPI_BUTTON_CLASS "button"
|
||||
#define ACPI_BUTTON_FILE_INFO "info"
|
||||
#define ACPI_BUTTON_FILE_STATE "state"
|
||||
|
@ -479,7 +478,7 @@ static int acpi_button_add(struct acpi_device *device)
|
|||
device->wakeup.gpe_number,
|
||||
ACPI_GPE_TYPE_WAKE_RUN);
|
||||
acpi_enable_gpe(device->wakeup.gpe_device,
|
||||
device->wakeup.gpe_number, ACPI_NOT_ISR);
|
||||
device->wakeup.gpe_number);
|
||||
device->wakeup.state.enabled = 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
ACPI_MODULE_NAME("cm_sbs");
|
||||
#define ACPI_AC_CLASS "ac_adapter"
|
||||
#define ACPI_BATTERY_CLASS "battery"
|
||||
#define ACPI_SBS_COMPONENT 0x00080000
|
||||
#define _COMPONENT ACPI_SBS_COMPONENT
|
||||
static struct proc_dir_entry *acpi_ac_dir;
|
||||
static struct proc_dir_entry *acpi_battery_dir;
|
||||
|
@ -105,9 +104,3 @@ void acpi_unlock_battery_dir(struct proc_dir_entry *acpi_battery_dir_param)
|
|||
return;
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_unlock_battery_dir);
|
||||
|
||||
static int __init acpi_cm_sbs_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
subsys_initcall(acpi_cm_sbs_init);
|
||||
|
|
|
@ -41,7 +41,6 @@
|
|||
#define INSTALL_NOTIFY_HANDLER 1
|
||||
#define UNINSTALL_NOTIFY_HANDLER 2
|
||||
|
||||
#define ACPI_CONTAINER_COMPONENT 0x01000000
|
||||
#define _COMPONENT ACPI_CONTAINER_COMPONENT
|
||||
ACPI_MODULE_NAME("container");
|
||||
|
||||
|
|
|
@ -44,6 +44,21 @@ static const struct acpi_dlayer acpi_debug_layers[] = {
|
|||
ACPI_DEBUG_INIT(ACPI_CA_DISASSEMBLER),
|
||||
ACPI_DEBUG_INIT(ACPI_COMPILER),
|
||||
ACPI_DEBUG_INIT(ACPI_TOOLS),
|
||||
|
||||
ACPI_DEBUG_INIT(ACPI_BUS_COMPONENT),
|
||||
ACPI_DEBUG_INIT(ACPI_AC_COMPONENT),
|
||||
ACPI_DEBUG_INIT(ACPI_BATTERY_COMPONENT),
|
||||
ACPI_DEBUG_INIT(ACPI_BUTTON_COMPONENT),
|
||||
ACPI_DEBUG_INIT(ACPI_SBS_COMPONENT),
|
||||
ACPI_DEBUG_INIT(ACPI_FAN_COMPONENT),
|
||||
ACPI_DEBUG_INIT(ACPI_PCI_COMPONENT),
|
||||
ACPI_DEBUG_INIT(ACPI_POWER_COMPONENT),
|
||||
ACPI_DEBUG_INIT(ACPI_CONTAINER_COMPONENT),
|
||||
ACPI_DEBUG_INIT(ACPI_SYSTEM_COMPONENT),
|
||||
ACPI_DEBUG_INIT(ACPI_THERMAL_COMPONENT),
|
||||
ACPI_DEBUG_INIT(ACPI_MEMORY_DEVICE_COMPONENT),
|
||||
ACPI_DEBUG_INIT(ACPI_VIDEO_COMPONENT),
|
||||
ACPI_DEBUG_INIT(ACPI_PROCESSOR_COMPONENT),
|
||||
};
|
||||
|
||||
static const struct acpi_dlevel acpi_debug_levels[] = {
|
||||
|
|
|
@ -70,7 +70,7 @@ enum ec_command {
|
|||
#define ACPI_EC_UDELAY_GLK 1000 /* Wait 1ms max. to get global lock */
|
||||
#define ACPI_EC_UDELAY 100 /* Wait 100us before polling EC again */
|
||||
|
||||
#define ACPI_EC_STORM_THRESHOLD 20 /* number of false interrupts
|
||||
#define ACPI_EC_STORM_THRESHOLD 8 /* number of false interrupts
|
||||
per one transaction */
|
||||
|
||||
enum {
|
||||
|
@ -100,8 +100,11 @@ struct transaction {
|
|||
u8 *rdata;
|
||||
unsigned short irq_count;
|
||||
u8 command;
|
||||
u8 wi;
|
||||
u8 ri;
|
||||
u8 wlen;
|
||||
u8 rlen;
|
||||
bool done;
|
||||
};
|
||||
|
||||
static struct acpi_ec {
|
||||
|
@ -178,34 +181,45 @@ static int ec_transaction_done(struct acpi_ec *ec)
|
|||
unsigned long flags;
|
||||
int ret = 0;
|
||||
spin_lock_irqsave(&ec->curr_lock, flags);
|
||||
if (!ec->curr || (!ec->curr->wlen && !ec->curr->rlen))
|
||||
if (!ec->curr || ec->curr->done)
|
||||
ret = 1;
|
||||
spin_unlock_irqrestore(&ec->curr_lock, flags);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void start_transaction(struct acpi_ec *ec)
|
||||
{
|
||||
ec->curr->irq_count = ec->curr->wi = ec->curr->ri = 0;
|
||||
ec->curr->done = false;
|
||||
acpi_ec_write_cmd(ec, ec->curr->command);
|
||||
}
|
||||
|
||||
static void gpe_transaction(struct acpi_ec *ec, u8 status)
|
||||
{
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&ec->curr_lock, flags);
|
||||
if (!ec->curr)
|
||||
goto unlock;
|
||||
if (ec->curr->wlen > 0) {
|
||||
if ((status & ACPI_EC_FLAG_IBF) == 0) {
|
||||
acpi_ec_write_data(ec, *(ec->curr->wdata++));
|
||||
--ec->curr->wlen;
|
||||
} else
|
||||
/* false interrupt, state didn't change */
|
||||
++ec->curr->irq_count;
|
||||
|
||||
} else if (ec->curr->rlen > 0) {
|
||||
if (ec->curr->wlen > ec->curr->wi) {
|
||||
if ((status & ACPI_EC_FLAG_IBF) == 0)
|
||||
acpi_ec_write_data(ec,
|
||||
ec->curr->wdata[ec->curr->wi++]);
|
||||
else
|
||||
goto err;
|
||||
} else if (ec->curr->rlen > ec->curr->ri) {
|
||||
if ((status & ACPI_EC_FLAG_OBF) == 1) {
|
||||
*(ec->curr->rdata++) = acpi_ec_read_data(ec);
|
||||
--ec->curr->rlen;
|
||||
ec->curr->rdata[ec->curr->ri++] = acpi_ec_read_data(ec);
|
||||
if (ec->curr->rlen == ec->curr->ri)
|
||||
ec->curr->done = true;
|
||||
} else
|
||||
goto err;
|
||||
} else if (ec->curr->wlen == ec->curr->wi &&
|
||||
(status & ACPI_EC_FLAG_IBF) == 0)
|
||||
ec->curr->done = true;
|
||||
goto unlock;
|
||||
err:
|
||||
/* false interrupt, state didn't change */
|
||||
++ec->curr->irq_count;
|
||||
}
|
||||
unlock:
|
||||
spin_unlock_irqrestore(&ec->curr_lock, flags);
|
||||
}
|
||||
|
@ -215,6 +229,15 @@ static int acpi_ec_wait(struct acpi_ec *ec)
|
|||
if (wait_event_timeout(ec->wait, ec_transaction_done(ec),
|
||||
msecs_to_jiffies(ACPI_EC_DELAY)))
|
||||
return 0;
|
||||
/* try restart command if we get any false interrupts */
|
||||
if (ec->curr->irq_count &&
|
||||
(acpi_ec_read_status(ec) & ACPI_EC_FLAG_IBF) == 0) {
|
||||
pr_debug(PREFIX "controller reset, restart transaction\n");
|
||||
start_transaction(ec);
|
||||
if (wait_event_timeout(ec->wait, ec_transaction_done(ec),
|
||||
msecs_to_jiffies(ACPI_EC_DELAY)))
|
||||
return 0;
|
||||
}
|
||||
/* missing GPEs, switch back to poll mode */
|
||||
if (printk_ratelimit())
|
||||
pr_info(PREFIX "missing confirmations, "
|
||||
|
@ -239,10 +262,10 @@ static int ec_check_sci(struct acpi_ec *ec, u8 state)
|
|||
static int ec_poll(struct acpi_ec *ec)
|
||||
{
|
||||
unsigned long delay = jiffies + msecs_to_jiffies(ACPI_EC_DELAY);
|
||||
msleep(1);
|
||||
udelay(ACPI_EC_UDELAY);
|
||||
while (time_before(jiffies, delay)) {
|
||||
gpe_transaction(ec, acpi_ec_read_status(ec));
|
||||
msleep(1);
|
||||
udelay(ACPI_EC_UDELAY);
|
||||
if (ec_transaction_done(ec))
|
||||
return 0;
|
||||
}
|
||||
|
@ -259,14 +282,13 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,
|
|||
/* disable GPE during transaction if storm is detected */
|
||||
if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) {
|
||||
clear_bit(EC_FLAGS_GPE_MODE, &ec->flags);
|
||||
acpi_disable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
|
||||
acpi_disable_gpe(NULL, ec->gpe);
|
||||
}
|
||||
/* start transaction */
|
||||
spin_lock_irqsave(&ec->curr_lock, tmp);
|
||||
/* following two actions should be kept atomic */
|
||||
t->irq_count = 0;
|
||||
ec->curr = t;
|
||||
acpi_ec_write_cmd(ec, ec->curr->command);
|
||||
start_transaction(ec);
|
||||
if (ec->curr->command == ACPI_EC_COMMAND_QUERY)
|
||||
clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
|
||||
spin_unlock_irqrestore(&ec->curr_lock, tmp);
|
||||
|
@ -283,10 +305,11 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,
|
|||
/* check if we received SCI during transaction */
|
||||
ec_check_sci(ec, acpi_ec_read_status(ec));
|
||||
/* it is safe to enable GPE outside of transaction */
|
||||
acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
|
||||
acpi_enable_gpe(NULL, ec->gpe);
|
||||
} else if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags) &&
|
||||
t->irq_count > ACPI_EC_STORM_THRESHOLD) {
|
||||
pr_debug(PREFIX "GPE storm detected\n");
|
||||
pr_info(PREFIX "GPE storm detected, "
|
||||
"transactions will use polling mode\n");
|
||||
set_bit(EC_FLAGS_GPE_STORM, &ec->flags);
|
||||
}
|
||||
return ret;
|
||||
|
@ -558,17 +581,26 @@ static u32 acpi_ec_gpe_handler(void *data)
|
|||
pr_debug(PREFIX "~~~> interrupt\n");
|
||||
status = acpi_ec_read_status(ec);
|
||||
|
||||
if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags)) {
|
||||
gpe_transaction(ec, status);
|
||||
if (ec_transaction_done(ec) && (status & ACPI_EC_FLAG_IBF) == 0)
|
||||
if (ec_transaction_done(ec) &&
|
||||
(status & ACPI_EC_FLAG_IBF) == 0)
|
||||
wake_up(&ec->wait);
|
||||
}
|
||||
|
||||
ec_check_sci(ec, status);
|
||||
if (!test_bit(EC_FLAGS_GPE_MODE, &ec->flags) &&
|
||||
!test_bit(EC_FLAGS_NO_GPE, &ec->flags)) {
|
||||
/* this is non-query, must be confirmation */
|
||||
if (!test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) {
|
||||
if (printk_ratelimit())
|
||||
pr_info(PREFIX "non-query interrupt received,"
|
||||
" switching to interrupt mode\n");
|
||||
} else {
|
||||
/* hush, STORM switches the mode every transaction */
|
||||
pr_debug(PREFIX "non-query interrupt received,"
|
||||
" switching to interrupt mode\n");
|
||||
}
|
||||
set_bit(EC_FLAGS_GPE_MODE, &ec->flags);
|
||||
}
|
||||
return ACPI_INTERRUPT_HANDLED;
|
||||
|
@ -736,7 +768,7 @@ static acpi_status
|
|||
ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval)
|
||||
{
|
||||
acpi_status status;
|
||||
unsigned long long tmp;
|
||||
unsigned long long tmp = 0;
|
||||
|
||||
struct acpi_ec *ec = context;
|
||||
status = acpi_walk_resources(handle, METHOD_NAME__CRS,
|
||||
|
@ -751,6 +783,7 @@ ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval)
|
|||
return status;
|
||||
ec->gpe = tmp;
|
||||
/* Use the global lock for all EC transactions? */
|
||||
tmp = 0;
|
||||
acpi_evaluate_integer(handle, "_GLK", NULL, &tmp);
|
||||
ec->global_lock = tmp;
|
||||
ec->handle = handle;
|
||||
|
@ -868,7 +901,7 @@ static int ec_install_handlers(struct acpi_ec *ec)
|
|||
if (ACPI_FAILURE(status))
|
||||
return -ENODEV;
|
||||
acpi_set_gpe_type(NULL, ec->gpe, ACPI_GPE_TYPE_RUNTIME);
|
||||
acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
|
||||
acpi_enable_gpe(NULL, ec->gpe);
|
||||
status = acpi_install_address_space_handler(ec->handle,
|
||||
ACPI_ADR_SPACE_EC,
|
||||
&acpi_ec_space_handler,
|
||||
|
@ -1007,7 +1040,7 @@ static int acpi_ec_suspend(struct acpi_device *device, pm_message_t state)
|
|||
/* Stop using GPE */
|
||||
set_bit(EC_FLAGS_NO_GPE, &ec->flags);
|
||||
clear_bit(EC_FLAGS_GPE_MODE, &ec->flags);
|
||||
acpi_disable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
|
||||
acpi_disable_gpe(NULL, ec->gpe);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1016,7 +1049,7 @@ static int acpi_ec_resume(struct acpi_device *device)
|
|||
struct acpi_ec *ec = acpi_driver_data(device);
|
||||
/* Enable use of GPE back */
|
||||
clear_bit(EC_FLAGS_NO_GPE, &ec->flags);
|
||||
acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
|
||||
acpi_enable_gpe(NULL, ec->gpe);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -289,8 +289,6 @@ acpi_status acpi_ev_disable_gpe(struct acpi_gpe_event_info *gpe_event_info)
|
|||
*/
|
||||
status = acpi_hw_low_disable_gpe(gpe_event_info);
|
||||
return_ACPI_STATUS(status);
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
|
|
@ -248,21 +248,15 @@ ACPI_EXPORT_SYMBOL(acpi_set_gpe_type)
|
|||
* DESCRIPTION: Enable an ACPI event (general purpose)
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags)
|
||||
acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
acpi_cpu_flags flags;
|
||||
struct acpi_gpe_event_info *gpe_event_info;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_enable_gpe);
|
||||
|
||||
/* Use semaphore lock if not executing at interrupt level */
|
||||
|
||||
if (flags & ACPI_NOT_ISR) {
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
|
||||
|
||||
/* Ensure that we have a valid GPE number */
|
||||
|
||||
|
@ -277,9 +271,7 @@ acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags)
|
|||
status = acpi_ev_enable_gpe(gpe_event_info, TRUE);
|
||||
|
||||
unlock_and_exit:
|
||||
if (flags & ACPI_NOT_ISR) {
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
|
||||
}
|
||||
acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
@ -299,22 +291,15 @@ ACPI_EXPORT_SYMBOL(acpi_enable_gpe)
|
|||
* DESCRIPTION: Disable an ACPI event (general purpose)
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags)
|
||||
acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
acpi_cpu_flags flags;
|
||||
struct acpi_gpe_event_info *gpe_event_info;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_disable_gpe);
|
||||
|
||||
/* Use semaphore lock if not executing at interrupt level */
|
||||
|
||||
if (flags & ACPI_NOT_ISR) {
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
|
||||
/* Ensure that we have a valid GPE number */
|
||||
|
||||
gpe_event_info = acpi_ev_get_gpe_event_info(gpe_device, gpe_number);
|
||||
|
@ -325,10 +310,8 @@ acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags)
|
|||
|
||||
status = acpi_ev_disable_gpe(gpe_event_info);
|
||||
|
||||
unlock_and_exit:
|
||||
if (flags & ACPI_NOT_ISR) {
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
|
||||
}
|
||||
unlock_and_exit:
|
||||
acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
@ -521,6 +504,9 @@ acpi_status acpi_get_event_status(u32 event, acpi_event_status * event_status)
|
|||
if (value)
|
||||
*event_status |= ACPI_EVENT_FLAG_SET;
|
||||
|
||||
if (acpi_gbl_fixed_event_handlers[event].handler)
|
||||
*event_status |= ACPI_EVENT_FLAG_HANDLE;
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
@ -571,6 +557,9 @@ acpi_get_gpe_status(acpi_handle gpe_device,
|
|||
|
||||
status = acpi_hw_get_gpe_status(gpe_event_info, event_status);
|
||||
|
||||
if (gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK)
|
||||
*event_status |= ACPI_EVENT_FLAG_HANDLE;
|
||||
|
||||
unlock_and_exit:
|
||||
if (flags & ACPI_NOT_ISR) {
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
|
||||
#define ACPI_FAN_COMPONENT 0x00200000
|
||||
#define ACPI_FAN_CLASS "fan"
|
||||
#define ACPI_FAN_FILE_STATE "state"
|
||||
|
||||
|
|
|
@ -140,6 +140,46 @@ struct device *acpi_get_physical_device(acpi_handle handle)
|
|||
|
||||
EXPORT_SYMBOL(acpi_get_physical_device);
|
||||
|
||||
/* ToDo: When a PCI bridge is found, return the PCI device behind the bridge
|
||||
* This should work in general, but did not on a Lenovo T61 for the
|
||||
* graphics card. But this must be fixed when the PCI device is
|
||||
* bound and the kernel device struct is attached to the acpi device
|
||||
* Note: A success call will increase reference count by one
|
||||
* Do call put_device(dev) on the returned device then
|
||||
*/
|
||||
struct device *acpi_get_physical_pci_device(acpi_handle handle)
|
||||
{
|
||||
struct device *dev;
|
||||
long long device_id;
|
||||
acpi_status status;
|
||||
|
||||
status =
|
||||
acpi_evaluate_integer(handle, "_ADR", NULL, &device_id);
|
||||
|
||||
if (ACPI_FAILURE(status))
|
||||
return NULL;
|
||||
|
||||
/* We need to attempt to determine whether the _ADR refers to a
|
||||
PCI device or not. There's no terribly good way to do this,
|
||||
so the best we can hope for is to assume that there'll never
|
||||
be a device in the host bridge */
|
||||
if (device_id >= 0x10000) {
|
||||
/* It looks like a PCI device. Does it exist? */
|
||||
dev = acpi_get_physical_device(handle);
|
||||
} else {
|
||||
/* It doesn't look like a PCI device. Does its parent
|
||||
exist? */
|
||||
acpi_handle phandle;
|
||||
if (acpi_get_parent(handle, &phandle))
|
||||
return NULL;
|
||||
dev = acpi_get_physical_device(phandle);
|
||||
}
|
||||
if (!dev)
|
||||
return NULL;
|
||||
return dev;
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_get_physical_pci_device);
|
||||
|
||||
static int acpi_bind_one(struct device *dev, acpi_handle handle)
|
||||
{
|
||||
struct acpi_device *acpi_dev;
|
||||
|
|
|
@ -531,7 +531,7 @@ int __init acpi_irq_penalty_init(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_irq_balance; /* 0: static, 1: balance */
|
||||
static int acpi_irq_balance = -1; /* 0: static, 1: balance */
|
||||
|
||||
static int acpi_pci_link_allocate(struct acpi_pci_link *link)
|
||||
{
|
||||
|
@ -950,10 +950,17 @@ device_initcall(irqrouter_init_sysfs);
|
|||
|
||||
static int __init acpi_pci_link_init(void)
|
||||
{
|
||||
|
||||
if (acpi_noirq)
|
||||
return 0;
|
||||
|
||||
if (acpi_irq_balance == -1) {
|
||||
/* no command line switch: enable balancing in IOAPIC mode */
|
||||
if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC)
|
||||
acpi_irq_balance = 1;
|
||||
else
|
||||
acpi_irq_balance = 0;
|
||||
}
|
||||
|
||||
acpi_link.count = 0;
|
||||
INIT_LIST_HEAD(&acpi_link.entries);
|
||||
|
||||
|
|
|
@ -376,15 +376,9 @@ static int acpi_pci_root_remove(struct acpi_device *device, int type)
|
|||
|
||||
static int __init acpi_pci_root_init(void)
|
||||
{
|
||||
|
||||
if (acpi_pci_disabled)
|
||||
return 0;
|
||||
|
||||
/* DEBUG:
|
||||
acpi_dbg_layer = ACPI_PCI_COMPONENT;
|
||||
acpi_dbg_level = 0xFFFFFFFF;
|
||||
*/
|
||||
|
||||
if (acpi_bus_register_driver(&acpi_pci_root_driver) < 0)
|
||||
return -ENODEV;
|
||||
|
||||
|
|
|
@ -46,7 +46,6 @@
|
|||
|
||||
#define _COMPONENT ACPI_POWER_COMPONENT
|
||||
ACPI_MODULE_NAME("power");
|
||||
#define ACPI_POWER_COMPONENT 0x00800000
|
||||
#define ACPI_POWER_CLASS "power_resource"
|
||||
#define ACPI_POWER_DEVICE_NAME "Power Resource"
|
||||
#define ACPI_POWER_FILE_INFO "info"
|
||||
|
@ -153,7 +152,8 @@ static int acpi_power_get_state(acpi_handle handle, int *state)
|
|||
ACPI_POWER_RESOURCE_STATE_OFF;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resource [%s] is %s\n",
|
||||
acpi_ut_get_node_name(handle), state ? "on" : "off"));
|
||||
acpi_ut_get_node_name(handle),
|
||||
*state ? "on" : "off"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -516,11 +516,6 @@ int acpi_power_transition(struct acpi_device *device, int state)
|
|||
cl = &device->power.states[device->power.state].resources;
|
||||
tl = &device->power.states[state].resources;
|
||||
|
||||
if (!cl->count && !tl->count) {
|
||||
result = -ENODEV;
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* TBD: Resources must be ordered. */
|
||||
|
||||
/*
|
||||
|
|
|
@ -59,7 +59,6 @@
|
|||
#include <acpi/acpi_drivers.h>
|
||||
#include <acpi/processor.h>
|
||||
|
||||
#define ACPI_PROCESSOR_COMPONENT 0x01000000
|
||||
#define ACPI_PROCESSOR_CLASS "processor"
|
||||
#define ACPI_PROCESSOR_DEVICE_NAME "Processor"
|
||||
#define ACPI_PROCESSOR_FILE_INFO "info"
|
||||
|
@ -89,6 +88,7 @@ static int acpi_processor_handle_eject(struct acpi_processor *pr);
|
|||
|
||||
|
||||
static const struct acpi_device_id processor_device_ids[] = {
|
||||
{ACPI_PROCESSOR_OBJECT_HID, 0},
|
||||
{ACPI_PROCESSOR_HID, 0},
|
||||
{"", 0},
|
||||
};
|
||||
|
@ -409,7 +409,7 @@ static int acpi_processor_remove_fs(struct acpi_device *device)
|
|||
/* Use the acpiid in MADT to map cpus in case of SMP */
|
||||
|
||||
#ifndef CONFIG_SMP
|
||||
static int get_cpu_id(acpi_handle handle, u32 acpi_id) {return -1;}
|
||||
static int get_cpu_id(acpi_handle handle, int type, u32 acpi_id) { return -1; }
|
||||
#else
|
||||
|
||||
static struct acpi_table_madt *madt;
|
||||
|
@ -428,27 +428,35 @@ static int map_lapic_id(struct acpi_subtable_header *entry,
|
|||
}
|
||||
|
||||
static int map_lsapic_id(struct acpi_subtable_header *entry,
|
||||
u32 acpi_id, int *apic_id)
|
||||
int device_declaration, u32 acpi_id, int *apic_id)
|
||||
{
|
||||
struct acpi_madt_local_sapic *lsapic =
|
||||
(struct acpi_madt_local_sapic *)entry;
|
||||
u32 tmp = (lsapic->id << 8) | lsapic->eid;
|
||||
|
||||
/* Only check enabled APICs*/
|
||||
if (lsapic->lapic_flags & ACPI_MADT_ENABLED) {
|
||||
/* First check against id */
|
||||
if (lsapic->processor_id == acpi_id) {
|
||||
*apic_id = (lsapic->id << 8) | lsapic->eid;
|
||||
return 1;
|
||||
/* Check against optional uid */
|
||||
} else if (entry->length >= 16 &&
|
||||
lsapic->uid == acpi_id) {
|
||||
*apic_id = lsapic->uid;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if (!(lsapic->lapic_flags & ACPI_MADT_ENABLED))
|
||||
return 0;
|
||||
|
||||
/* Device statement declaration type */
|
||||
if (device_declaration) {
|
||||
if (entry->length < 16)
|
||||
printk(KERN_ERR PREFIX
|
||||
"Invalid LSAPIC with Device type processor (SAPIC ID %#x)\n",
|
||||
tmp);
|
||||
else if (lsapic->uid == acpi_id)
|
||||
goto found;
|
||||
/* Processor statement declaration type */
|
||||
} else if (lsapic->processor_id == acpi_id)
|
||||
goto found;
|
||||
|
||||
return 0;
|
||||
found:
|
||||
*apic_id = tmp;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int map_madt_entry(u32 acpi_id)
|
||||
static int map_madt_entry(int type, u32 acpi_id)
|
||||
{
|
||||
unsigned long madt_end, entry;
|
||||
int apic_id = -1;
|
||||
|
@ -469,7 +477,7 @@ static int map_madt_entry(u32 acpi_id)
|
|||
if (map_lapic_id(header, acpi_id, &apic_id))
|
||||
break;
|
||||
} else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) {
|
||||
if (map_lsapic_id(header, acpi_id, &apic_id))
|
||||
if (map_lsapic_id(header, type, acpi_id, &apic_id))
|
||||
break;
|
||||
}
|
||||
entry += header->length;
|
||||
|
@ -477,7 +485,7 @@ static int map_madt_entry(u32 acpi_id)
|
|||
return apic_id;
|
||||
}
|
||||
|
||||
static int map_mat_entry(acpi_handle handle, u32 acpi_id)
|
||||
static int map_mat_entry(acpi_handle handle, int type, u32 acpi_id)
|
||||
{
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
union acpi_object *obj;
|
||||
|
@ -500,7 +508,7 @@ static int map_mat_entry(acpi_handle handle, u32 acpi_id)
|
|||
if (header->type == ACPI_MADT_TYPE_LOCAL_APIC) {
|
||||
map_lapic_id(header, acpi_id, &apic_id);
|
||||
} else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) {
|
||||
map_lsapic_id(header, acpi_id, &apic_id);
|
||||
map_lsapic_id(header, type, acpi_id, &apic_id);
|
||||
}
|
||||
|
||||
exit:
|
||||
|
@ -509,14 +517,14 @@ exit:
|
|||
return apic_id;
|
||||
}
|
||||
|
||||
static int get_cpu_id(acpi_handle handle, u32 acpi_id)
|
||||
static int get_cpu_id(acpi_handle handle, int type, u32 acpi_id)
|
||||
{
|
||||
int i;
|
||||
int apic_id = -1;
|
||||
|
||||
apic_id = map_mat_entry(handle, acpi_id);
|
||||
apic_id = map_mat_entry(handle, type, acpi_id);
|
||||
if (apic_id == -1)
|
||||
apic_id = map_madt_entry(acpi_id);
|
||||
apic_id = map_madt_entry(type, acpi_id);
|
||||
if (apic_id == -1)
|
||||
return apic_id;
|
||||
|
||||
|
@ -532,15 +540,16 @@ static int get_cpu_id(acpi_handle handle, u32 acpi_id)
|
|||
Driver Interface
|
||||
-------------------------------------------------------------------------- */
|
||||
|
||||
static int acpi_processor_get_info(struct acpi_processor *pr, unsigned has_uid)
|
||||
static int acpi_processor_get_info(struct acpi_device *device)
|
||||
{
|
||||
acpi_status status = 0;
|
||||
union acpi_object object = { 0 };
|
||||
struct acpi_buffer buffer = { sizeof(union acpi_object), &object };
|
||||
int cpu_index;
|
||||
struct acpi_processor *pr;
|
||||
int cpu_index, device_declaration = 0;
|
||||
static int cpu0_initialized;
|
||||
|
||||
|
||||
pr = acpi_driver_data(device);
|
||||
if (!pr)
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -561,22 +570,23 @@ static int acpi_processor_get_info(struct acpi_processor *pr, unsigned has_uid)
|
|||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"No bus mastering arbitration control\n"));
|
||||
|
||||
/* Check if it is a Device with HID and UID */
|
||||
if (has_uid) {
|
||||
if (!strcmp(acpi_device_hid(device), ACPI_PROCESSOR_HID)) {
|
||||
/*
|
||||
* Declared with "Device" statement; match _UID.
|
||||
* Note that we don't handle string _UIDs yet.
|
||||
*/
|
||||
unsigned long long value;
|
||||
status = acpi_evaluate_integer(pr->handle, METHOD_NAME__UID,
|
||||
NULL, &value);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
printk(KERN_ERR PREFIX "Evaluating processor _UID\n");
|
||||
printk(KERN_ERR PREFIX
|
||||
"Evaluating processor _UID [%#x]\n", status);
|
||||
return -ENODEV;
|
||||
}
|
||||
device_declaration = 1;
|
||||
pr->acpi_id = value;
|
||||
} else {
|
||||
/*
|
||||
* Evalute the processor object. Note that it is common on SMP to
|
||||
* have the first (boot) processor with a valid PBLK address while
|
||||
* all others have a NULL address.
|
||||
*/
|
||||
/* Declared with "Processor" statement; match ProcessorID */
|
||||
status = acpi_evaluate_object(pr->handle, NULL, NULL, &buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
printk(KERN_ERR PREFIX "Evaluating processor object\n");
|
||||
|
@ -585,11 +595,12 @@ static int acpi_processor_get_info(struct acpi_processor *pr, unsigned has_uid)
|
|||
|
||||
/*
|
||||
* TBD: Synch processor ID (via LAPIC/LSAPIC structures) on SMP.
|
||||
* >>> 'acpi_get_processor_id(acpi_id, &id)' in arch/xxx/acpi.c
|
||||
* >>> 'acpi_get_processor_id(acpi_id, &id)' in
|
||||
* arch/xxx/acpi.c
|
||||
*/
|
||||
pr->acpi_id = object.processor.proc_id;
|
||||
}
|
||||
cpu_index = get_cpu_id(pr->handle, pr->acpi_id);
|
||||
cpu_index = get_cpu_id(pr->handle, device_declaration, pr->acpi_id);
|
||||
|
||||
/* Handle UP system running SMP kernel, with no LAPIC in MADT */
|
||||
if (!cpu0_initialized && (cpu_index == -1) &&
|
||||
|
@ -661,7 +672,7 @@ static int __cpuinit acpi_processor_start(struct acpi_device *device)
|
|||
|
||||
pr = acpi_driver_data(device);
|
||||
|
||||
result = acpi_processor_get_info(pr, device->flags.unique_id);
|
||||
result = acpi_processor_get_info(device);
|
||||
if (result) {
|
||||
/* Processor is physically not present */
|
||||
return 0;
|
||||
|
@ -761,20 +772,20 @@ static void acpi_processor_notify(acpi_handle handle, u32 event, void *data)
|
|||
acpi_bus_generate_proc_event(device, event,
|
||||
pr->performance_platform_limit);
|
||||
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||
device->dev.bus_id, event,
|
||||
dev_name(&device->dev), event,
|
||||
pr->performance_platform_limit);
|
||||
break;
|
||||
case ACPI_PROCESSOR_NOTIFY_POWER:
|
||||
acpi_processor_cst_has_changed(pr);
|
||||
acpi_bus_generate_proc_event(device, event, 0);
|
||||
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||
device->dev.bus_id, event, 0);
|
||||
dev_name(&device->dev), event, 0);
|
||||
break;
|
||||
case ACPI_PROCESSOR_NOTIFY_THROTTLING:
|
||||
acpi_processor_tstate_has_changed(pr);
|
||||
acpi_bus_generate_proc_event(device, event, 0);
|
||||
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||
device->dev.bus_id, event, 0);
|
||||
dev_name(&device->dev), event, 0);
|
||||
default:
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Unsupported event [0x%x]\n", event));
|
||||
|
|
|
@ -59,7 +59,6 @@
|
|||
#include <acpi/processor.h>
|
||||
#include <asm/processor.h>
|
||||
|
||||
#define ACPI_PROCESSOR_COMPONENT 0x01000000
|
||||
#define ACPI_PROCESSOR_CLASS "processor"
|
||||
#define _COMPONENT ACPI_PROCESSOR_COMPONENT
|
||||
ACPI_MODULE_NAME("processor_idle");
|
||||
|
|
|
@ -44,9 +44,9 @@
|
|||
#endif
|
||||
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
#include <acpi/processor.h>
|
||||
|
||||
#define ACPI_PROCESSOR_COMPONENT 0x01000000
|
||||
#define ACPI_PROCESSOR_CLASS "processor"
|
||||
#define ACPI_PROCESSOR_FILE_PERFORMANCE "performance"
|
||||
#define _COMPONENT ACPI_PROCESSOR_COMPONENT
|
||||
|
|
|
@ -40,7 +40,6 @@
|
|||
#include <acpi/processor.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
|
||||
#define ACPI_PROCESSOR_COMPONENT 0x01000000
|
||||
#define ACPI_PROCESSOR_CLASS "processor"
|
||||
#define _COMPONENT ACPI_PROCESSOR_COMPONENT
|
||||
ACPI_MODULE_NAME("processor_thermal");
|
||||
|
|
|
@ -38,9 +38,9 @@
|
|||
#include <asm/uaccess.h>
|
||||
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
#include <acpi/processor.h>
|
||||
|
||||
#define ACPI_PROCESSOR_COMPONENT 0x01000000
|
||||
#define ACPI_PROCESSOR_CLASS "processor"
|
||||
#define _COMPONENT ACPI_PROCESSOR_COMPONENT
|
||||
ACPI_MODULE_NAME("processor_throttling");
|
||||
|
|
|
@ -15,28 +15,9 @@ void acpi_reboot(void)
|
|||
|
||||
rr = &acpi_gbl_FADT.reset_register;
|
||||
|
||||
/*
|
||||
* Is the ACPI reset register supported?
|
||||
*
|
||||
* According to ACPI 3.0, FADT.flags.RESET_REG_SUP indicates
|
||||
* whether the ACPI reset mechanism is supported.
|
||||
*
|
||||
* However, some boxes have this bit clear, yet a valid
|
||||
* ACPI_RESET_REG & RESET_VALUE, and ACPI reboot is the only
|
||||
* mechanism that works for them after S3.
|
||||
*
|
||||
* This suggests that other operating systems may not be checking
|
||||
* the RESET_REG_SUP bit, and are using other means to decide
|
||||
* whether to use the ACPI reboot mechanism or not.
|
||||
*
|
||||
* So when acpi reboot is requested,
|
||||
* only the reset_register is checked. If the following
|
||||
* conditions are met, it indicates that the reset register is supported.
|
||||
* a. reset_register is not zero
|
||||
* b. the access width is eight
|
||||
* c. the bit_offset is zero
|
||||
*/
|
||||
if (!(rr->address) || rr->bit_width != 8 || rr->bit_offset != 0)
|
||||
/* Is the reset register supported? */
|
||||
if (!(acpi_gbl_FADT.flags & ACPI_FADT_RESET_REGISTER) ||
|
||||
rr->bit_width != 8 || rr->bit_offset != 0)
|
||||
return;
|
||||
|
||||
reset_value = acpi_gbl_FADT.reset_value;
|
||||
|
|
|
@ -109,8 +109,7 @@ static int acpi_bus_hot_remove_device(void *context)
|
|||
return 0;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Hot-removing device %s...\n", device->dev.bus_id));
|
||||
|
||||
"Hot-removing device %s...\n", dev_name(&device->dev)));
|
||||
|
||||
if (acpi_bus_trim(device, 1)) {
|
||||
printk(KERN_ERR PREFIX
|
||||
|
@ -460,7 +459,7 @@ static int acpi_device_register(struct acpi_device *device,
|
|||
acpi_device_bus_id->instance_no = 0;
|
||||
list_add_tail(&acpi_device_bus_id->node, &acpi_bus_id_list);
|
||||
}
|
||||
sprintf(device->dev.bus_id, "%s:%02x", acpi_device_bus_id->bus_id, acpi_device_bus_id->instance_no);
|
||||
dev_set_name(&device->dev, "%s:%02x", acpi_device_bus_id->bus_id, acpi_device_bus_id->instance_no);
|
||||
|
||||
if (device->parent) {
|
||||
list_add_tail(&device->node, &device->parent->children);
|
||||
|
@ -484,7 +483,8 @@ static int acpi_device_register(struct acpi_device *device,
|
|||
|
||||
result = acpi_device_setup_files(device);
|
||||
if(result)
|
||||
printk(KERN_ERR PREFIX "Error creating sysfs interface for device %s\n", device->dev.bus_id);
|
||||
printk(KERN_ERR PREFIX "Error creating sysfs interface for device %s\n",
|
||||
dev_name(&device->dev));
|
||||
|
||||
device->removal_type = ACPI_BUS_REMOVAL_NORMAL;
|
||||
return 0;
|
||||
|
@ -919,36 +919,6 @@ static void acpi_device_get_busid(struct acpi_device *device,
|
|||
}
|
||||
}
|
||||
|
||||
static int
|
||||
acpi_video_bus_match(struct acpi_device *device)
|
||||
{
|
||||
acpi_handle h_dummy;
|
||||
|
||||
if (!device)
|
||||
return -EINVAL;
|
||||
|
||||
/* Since there is no HID, CID for ACPI Video drivers, we have
|
||||
* to check well known required nodes for each feature we support.
|
||||
*/
|
||||
|
||||
/* Does this device able to support video switching ? */
|
||||
if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOD", &h_dummy)) &&
|
||||
ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOS", &h_dummy)))
|
||||
return 0;
|
||||
|
||||
/* Does this device able to retrieve a video ROM ? */
|
||||
if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_ROM", &h_dummy)))
|
||||
return 0;
|
||||
|
||||
/* Does this device able to configure which video head to be POSTed ? */
|
||||
if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_VPO", &h_dummy)) &&
|
||||
ACPI_SUCCESS(acpi_get_handle(device->handle, "_GPD", &h_dummy)) &&
|
||||
ACPI_SUCCESS(acpi_get_handle(device->handle, "_SPD", &h_dummy)))
|
||||
return 0;
|
||||
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/*
|
||||
* acpi_bay_match - see if a device is an ejectable driver bay
|
||||
*
|
||||
|
@ -1031,7 +1001,7 @@ static void acpi_device_set_id(struct acpi_device *device,
|
|||
will get autoloaded and the device might still match
|
||||
against another driver.
|
||||
*/
|
||||
if (ACPI_SUCCESS(acpi_video_bus_match(device)))
|
||||
if (acpi_is_video_device(device))
|
||||
cid_add = ACPI_VIDEO_HID;
|
||||
else if (ACPI_SUCCESS(acpi_bay_match(device)))
|
||||
cid_add = ACPI_BAY_HID;
|
||||
|
@ -1043,7 +1013,7 @@ static void acpi_device_set_id(struct acpi_device *device,
|
|||
hid = ACPI_POWER_HID;
|
||||
break;
|
||||
case ACPI_BUS_TYPE_PROCESSOR:
|
||||
hid = ACPI_PROCESSOR_HID;
|
||||
hid = ACPI_PROCESSOR_OBJECT_HID;
|
||||
break;
|
||||
case ACPI_BUS_TYPE_SYSTEM:
|
||||
hid = ACPI_SYSTEM_HID;
|
||||
|
|
|
@ -366,8 +366,8 @@ acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset)
|
|||
dev->wakeup.state.enabled ? "enabled" : "disabled");
|
||||
if (ldev)
|
||||
seq_printf(seq, "%s:%s",
|
||||
ldev->bus ? ldev->bus->name : "no-bus",
|
||||
ldev->bus_id);
|
||||
dev_name(ldev) ? ldev->bus->name : "no-bus",
|
||||
dev_name(ldev));
|
||||
seq_printf(seq, "\n");
|
||||
put_device(ldev);
|
||||
|
||||
|
|
|
@ -88,7 +88,7 @@ void acpi_enable_wakeup_device(u8 sleep_state)
|
|||
spin_unlock(&acpi_device_lock);
|
||||
if (!dev->wakeup.flags.run_wake)
|
||||
acpi_enable_gpe(dev->wakeup.gpe_device,
|
||||
dev->wakeup.gpe_number, ACPI_ISR);
|
||||
dev->wakeup.gpe_number);
|
||||
spin_lock(&acpi_device_lock);
|
||||
}
|
||||
spin_unlock(&acpi_device_lock);
|
||||
|
@ -122,7 +122,7 @@ void acpi_disable_wakeup_device(u8 sleep_state)
|
|||
ACPI_GPE_TYPE_WAKE_RUN);
|
||||
/* Re-enable it, since set_gpe_type will disable it */
|
||||
acpi_enable_gpe(dev->wakeup.gpe_device,
|
||||
dev->wakeup.gpe_number, ACPI_NOT_ISR);
|
||||
dev->wakeup.gpe_number);
|
||||
spin_lock(&acpi_device_lock);
|
||||
}
|
||||
continue;
|
||||
|
@ -133,7 +133,7 @@ void acpi_disable_wakeup_device(u8 sleep_state)
|
|||
/* Never disable run-wake GPE */
|
||||
if (!dev->wakeup.flags.run_wake) {
|
||||
acpi_disable_gpe(dev->wakeup.gpe_device,
|
||||
dev->wakeup.gpe_number, ACPI_NOT_ISR);
|
||||
dev->wakeup.gpe_number);
|
||||
acpi_clear_gpe(dev->wakeup.gpe_device,
|
||||
dev->wakeup.gpe_number, ACPI_NOT_ISR);
|
||||
}
|
||||
|
@ -162,7 +162,7 @@ static int __init acpi_wakeup_device_init(void)
|
|||
dev->wakeup.gpe_number,
|
||||
ACPI_GPE_TYPE_WAKE_RUN);
|
||||
acpi_enable_gpe(dev->wakeup.gpe_device,
|
||||
dev->wakeup.gpe_number, ACPI_NOT_ISR);
|
||||
dev->wakeup.gpe_number);
|
||||
dev->wakeup.state.enabled = 1;
|
||||
spin_lock(&acpi_device_lock);
|
||||
}
|
||||
|
|
|
@ -78,9 +78,15 @@ static ssize_t acpi_table_show(struct kobject *kobj,
|
|||
container_of(bin_attr, struct acpi_table_attr, attr);
|
||||
struct acpi_table_header *table_header = NULL;
|
||||
acpi_status status;
|
||||
char name[ACPI_NAME_SIZE];
|
||||
|
||||
if (strncmp(table_attr->name, "NULL", 4))
|
||||
memcpy(name, table_attr->name, ACPI_NAME_SIZE);
|
||||
else
|
||||
memcpy(name, "\0\0\0\0", 4);
|
||||
|
||||
status =
|
||||
acpi_get_table(table_attr->name, table_attr->instance,
|
||||
acpi_get_table(name, table_attr->instance,
|
||||
&table_header);
|
||||
if (ACPI_FAILURE(status))
|
||||
return -ENODEV;
|
||||
|
@ -95,21 +101,24 @@ static void acpi_table_attr_init(struct acpi_table_attr *table_attr,
|
|||
struct acpi_table_header *header = NULL;
|
||||
struct acpi_table_attr *attr = NULL;
|
||||
|
||||
memcpy(table_attr->name, table_header->signature, ACPI_NAME_SIZE);
|
||||
if (table_header->signature[0] != '\0')
|
||||
memcpy(table_attr->name, table_header->signature,
|
||||
ACPI_NAME_SIZE);
|
||||
else
|
||||
memcpy(table_attr->name, "NULL", 4);
|
||||
|
||||
list_for_each_entry(attr, &acpi_table_attr_list, node) {
|
||||
if (!memcmp(table_header->signature, attr->name,
|
||||
ACPI_NAME_SIZE))
|
||||
if (!memcmp(table_attr->name, attr->name, ACPI_NAME_SIZE))
|
||||
if (table_attr->instance < attr->instance)
|
||||
table_attr->instance = attr->instance;
|
||||
}
|
||||
table_attr->instance++;
|
||||
|
||||
if (table_attr->instance > 1 || (table_attr->instance == 1 &&
|
||||
!acpi_get_table(table_header->
|
||||
signature, 2,
|
||||
&header)))
|
||||
sprintf(table_attr->name + 4, "%d", table_attr->instance);
|
||||
!acpi_get_table
|
||||
(table_header->signature, 2, &header)))
|
||||
sprintf(table_attr->name + ACPI_NAME_SIZE, "%d",
|
||||
table_attr->instance);
|
||||
|
||||
table_attr->attr.size = 0;
|
||||
table_attr->attr.read = acpi_table_show;
|
||||
|
@ -167,7 +176,6 @@ static int acpi_system_sysfs_init(void)
|
|||
#define COUNT_ERROR 2 /* other */
|
||||
#define NUM_COUNTERS_EXTRA 3
|
||||
|
||||
#define ACPI_EVENT_VALID 0x01
|
||||
struct event_counter {
|
||||
u32 count;
|
||||
u32 flags;
|
||||
|
@ -312,12 +320,6 @@ static int get_status(u32 index, acpi_event_status *status, acpi_handle *handle)
|
|||
} else if (index < (num_gpes + ACPI_NUM_FIXED_EVENTS))
|
||||
result = acpi_get_event_status(index - num_gpes, status);
|
||||
|
||||
/*
|
||||
* sleep/power button GPE/Fixed Event is enabled after acpi_system_init,
|
||||
* check the status at runtime and mark it as valid once it's enabled
|
||||
*/
|
||||
if (!result && (*status & ACPI_EVENT_FLAG_ENABLED))
|
||||
all_counters[index].flags |= ACPI_EVENT_VALID;
|
||||
end:
|
||||
return result;
|
||||
}
|
||||
|
@ -346,12 +348,14 @@ static ssize_t counter_show(struct kobject *kobj,
|
|||
if (result)
|
||||
goto end;
|
||||
|
||||
if (!(all_counters[index].flags & ACPI_EVENT_VALID))
|
||||
if (!(status & ACPI_EVENT_FLAG_HANDLE))
|
||||
size += sprintf(buf + size, " invalid");
|
||||
else if (status & ACPI_EVENT_FLAG_ENABLED)
|
||||
size += sprintf(buf + size, " enable");
|
||||
size += sprintf(buf + size, " enabled");
|
||||
else if (status & ACPI_EVENT_FLAG_WAKE_ENABLED)
|
||||
size += sprintf(buf + size, " wake_enabled");
|
||||
else
|
||||
size += sprintf(buf + size, " disable");
|
||||
size += sprintf(buf + size, " disabled");
|
||||
|
||||
end:
|
||||
size += sprintf(buf + size, "\n");
|
||||
|
@ -385,7 +389,7 @@ static ssize_t counter_set(struct kobject *kobj,
|
|||
if (result)
|
||||
goto end;
|
||||
|
||||
if (!(all_counters[index].flags & ACPI_EVENT_VALID)) {
|
||||
if (!(status & ACPI_EVENT_FLAG_HANDLE)) {
|
||||
printk(KERN_WARNING PREFIX
|
||||
"Can not change Invalid GPE/Fixed Event status\n");
|
||||
return -EINVAL;
|
||||
|
@ -394,10 +398,10 @@ static ssize_t counter_set(struct kobject *kobj,
|
|||
if (index < num_gpes) {
|
||||
if (!strcmp(buf, "disable\n") &&
|
||||
(status & ACPI_EVENT_FLAG_ENABLED))
|
||||
result = acpi_disable_gpe(handle, index, ACPI_NOT_ISR);
|
||||
result = acpi_disable_gpe(handle, index);
|
||||
else if (!strcmp(buf, "enable\n") &&
|
||||
!(status & ACPI_EVENT_FLAG_ENABLED))
|
||||
result = acpi_enable_gpe(handle, index, ACPI_NOT_ISR);
|
||||
result = acpi_enable_gpe(handle, index);
|
||||
else if (!strcmp(buf, "clear\n") &&
|
||||
(status & ACPI_EVENT_FLAG_SET))
|
||||
result = acpi_clear_gpe(handle, index, ACPI_NOT_ISR);
|
||||
|
|
|
@ -304,7 +304,7 @@ static void acpi_tb_convert_fadt(void)
|
|||
* The ACPI 1.0 reserved fields that will be zeroed are the bytes located at
|
||||
* offset 45, 55, 95, and the word located at offset 109, 110.
|
||||
*/
|
||||
if (acpi_gbl_FADT.header.revision < 3) {
|
||||
if (acpi_gbl_FADT.header.revision < FADT2_REVISION_ID) {
|
||||
acpi_gbl_FADT.preferred_profile = 0;
|
||||
acpi_gbl_FADT.pstate_control = 0;
|
||||
acpi_gbl_FADT.cst_control = 0;
|
||||
|
|
|
@ -47,7 +47,6 @@
|
|||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
|
||||
#define ACPI_THERMAL_COMPONENT 0x04000000
|
||||
#define ACPI_THERMAL_CLASS "thermal_zone"
|
||||
#define ACPI_THERMAL_DEVICE_NAME "Thermal Zone"
|
||||
#define ACPI_THERMAL_FILE_STATE "state"
|
||||
|
@ -576,7 +575,7 @@ static int acpi_thermal_critical(struct acpi_thermal *tz)
|
|||
acpi_bus_generate_proc_event(tz->device, ACPI_THERMAL_NOTIFY_CRITICAL,
|
||||
tz->trips.critical.flags.enabled);
|
||||
acpi_bus_generate_netlink_event(tz->device->pnp.device_class,
|
||||
tz->device->dev.bus_id,
|
||||
dev_name(&tz->device->dev),
|
||||
ACPI_THERMAL_NOTIFY_CRITICAL,
|
||||
tz->trips.critical.flags.enabled);
|
||||
|
||||
|
@ -605,7 +604,7 @@ static int acpi_thermal_hot(struct acpi_thermal *tz)
|
|||
acpi_bus_generate_proc_event(tz->device, ACPI_THERMAL_NOTIFY_HOT,
|
||||
tz->trips.hot.flags.enabled);
|
||||
acpi_bus_generate_netlink_event(tz->device->pnp.device_class,
|
||||
tz->device->dev.bus_id,
|
||||
dev_name(&tz->device->dev),
|
||||
ACPI_THERMAL_NOTIFY_HOT,
|
||||
tz->trips.hot.flags.enabled);
|
||||
|
||||
|
@ -1592,14 +1591,14 @@ static void acpi_thermal_notify(acpi_handle handle, u32 event, void *data)
|
|||
acpi_thermal_check(tz);
|
||||
acpi_bus_generate_proc_event(device, event, 0);
|
||||
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||
device->dev.bus_id, event, 0);
|
||||
dev_name(&device->dev), event, 0);
|
||||
break;
|
||||
case ACPI_THERMAL_NOTIFY_DEVICES:
|
||||
acpi_thermal_trips_update(tz, ACPI_TRIPS_REFRESH_DEVICES);
|
||||
acpi_thermal_check(tz);
|
||||
acpi_bus_generate_proc_event(device, event, 0);
|
||||
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||
device->dev.bus_id, event, 0);
|
||||
dev_name(&device->dev), event, 0);
|
||||
break;
|
||||
default:
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
|
|
|
@ -41,7 +41,6 @@
|
|||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
|
||||
#define ACPI_VIDEO_COMPONENT 0x08000000
|
||||
#define ACPI_VIDEO_CLASS "video"
|
||||
#define ACPI_VIDEO_BUS_NAME "Video Bus"
|
||||
#define ACPI_VIDEO_DEVICE_NAME "Video Device"
|
||||
|
@ -739,6 +738,7 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
|
|||
device->cap._DSS = 1;
|
||||
}
|
||||
|
||||
if (acpi_video_backlight_support())
|
||||
max_level = acpi_video_init_brightness(device);
|
||||
|
||||
if (device->cap._BCL && device->cap._BCM && max_level > 0) {
|
||||
|
@ -785,8 +785,11 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
|
|||
printk(KERN_ERR PREFIX "Create sysfs link\n");
|
||||
|
||||
}
|
||||
if (device->cap._DCS && device->cap._DSS){
|
||||
static int count = 0;
|
||||
|
||||
if (acpi_video_display_switch_support()) {
|
||||
|
||||
if (device->cap._DCS && device->cap._DSS) {
|
||||
static int count;
|
||||
char *name;
|
||||
name = kzalloc(MAX_NAME_LEN, GFP_KERNEL);
|
||||
if (!name)
|
||||
|
@ -796,7 +799,7 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
|
|||
NULL, device, &acpi_output_properties);
|
||||
kfree(name);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -842,11 +845,16 @@ static void acpi_video_bus_find_cap(struct acpi_video_bus *video)
|
|||
static int acpi_video_bus_check(struct acpi_video_bus *video)
|
||||
{
|
||||
acpi_status status = -ENOENT;
|
||||
|
||||
struct device *dev;
|
||||
|
||||
if (!video)
|
||||
return -EINVAL;
|
||||
|
||||
dev = acpi_get_physical_pci_device(video->device->handle);
|
||||
if (!dev)
|
||||
return -ENODEV;
|
||||
put_device(dev);
|
||||
|
||||
/* Since there is no HID, CID and so on for VGA driver, we have
|
||||
* to check well known required nodes.
|
||||
*/
|
||||
|
@ -2094,12 +2102,6 @@ static int __init acpi_video_init(void)
|
|||
{
|
||||
int result = 0;
|
||||
|
||||
|
||||
/*
|
||||
acpi_dbg_level = 0xFFFFFFFF;
|
||||
acpi_dbg_layer = 0x08000000;
|
||||
*/
|
||||
|
||||
acpi_video_dir = proc_mkdir(ACPI_VIDEO_CLASS, acpi_root_dir);
|
||||
if (!acpi_video_dir)
|
||||
return -ENODEV;
|
||||
|
|
267
drivers/acpi/video_detect.c
Normal file
267
drivers/acpi/video_detect.c
Normal file
|
@ -0,0 +1,267 @@
|
|||
/*
|
||||
* Copyright (C) 2008 SuSE Linux Products GmbH
|
||||
* Thomas Renninger <trenn@suse.de>
|
||||
*
|
||||
* May be copied or modified under the terms of the GNU General Public License
|
||||
*
|
||||
* video_detect.c:
|
||||
* Provides acpi_is_video_device() for early scanning of ACPI devices in scan.c
|
||||
* There a Linux specific (Spec does not provide a HID for video devices) is
|
||||
* assinged
|
||||
*
|
||||
* After PCI devices are glued with ACPI devices
|
||||
* acpi_get_physical_pci_device() can be called to identify ACPI graphics
|
||||
* devices for which a real graphics card is plugged in
|
||||
*
|
||||
* Now acpi_video_get_capabilities() can be called to check which
|
||||
* capabilities the graphics cards plugged in support. The check for general
|
||||
* video capabilities will be triggered by the first caller of
|
||||
* acpi_video_get_capabilities(NULL); which will happen when the first
|
||||
* backlight (or display output) switching supporting driver calls:
|
||||
* acpi_video_backlight_support();
|
||||
*
|
||||
* Depending on whether ACPI graphics extensions (cmp. ACPI spec Appendix B)
|
||||
* are available, video.ko should be used to handle the device.
|
||||
*
|
||||
* Otherwise vendor specific drivers like thinkpad_acpi, asus_acpi,
|
||||
* sony_acpi,... can take care about backlight brightness and display output
|
||||
* switching.
|
||||
*
|
||||
* If CONFIG_ACPI_VIDEO is neither set as "compiled in" (y) nor as a module (m)
|
||||
* this file will not be compiled, acpi_video_get_capabilities() and
|
||||
* acpi_video_backlight_support() will always return 0 and vendor specific
|
||||
* drivers always can handle backlight.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/dmi.h>
|
||||
|
||||
ACPI_MODULE_NAME("video");
|
||||
#define _COMPONENT ACPI_VIDEO_COMPONENT
|
||||
|
||||
static long acpi_video_support;
|
||||
static bool acpi_video_caps_checked;
|
||||
|
||||
static acpi_status
|
||||
acpi_backlight_cap_match(acpi_handle handle, u32 level, void *context,
|
||||
void **retyurn_value)
|
||||
{
|
||||
long *cap = context;
|
||||
acpi_handle h_dummy;
|
||||
|
||||
if (ACPI_SUCCESS(acpi_get_handle(handle, "_BCM", &h_dummy)) &&
|
||||
ACPI_SUCCESS(acpi_get_handle(handle, "_BCL", &h_dummy))) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found generic backlight "
|
||||
"support\n"));
|
||||
*cap |= ACPI_VIDEO_BACKLIGHT;
|
||||
/* We have backlight support, no need to scan further */
|
||||
return AE_CTRL_TERMINATE;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Returns true if the device is a video device which can be handled by
|
||||
* video.ko.
|
||||
* The device will get a Linux specific CID added in scan.c to
|
||||
* identify the device as an ACPI graphics device
|
||||
* Be aware that the graphics device may not be physically present
|
||||
* Use acpi_video_get_capabilities() to detect general ACPI video
|
||||
* capabilities of present cards
|
||||
*/
|
||||
long acpi_is_video_device(struct acpi_device *device)
|
||||
{
|
||||
acpi_handle h_dummy;
|
||||
long video_caps = 0;
|
||||
|
||||
if (!device)
|
||||
return 0;
|
||||
|
||||
/* Does this device able to support video switching ? */
|
||||
if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOD", &h_dummy)) &&
|
||||
ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOS", &h_dummy)))
|
||||
video_caps |= ACPI_VIDEO_OUTPUT_SWITCHING;
|
||||
|
||||
/* Does this device able to retrieve a video ROM ? */
|
||||
if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_ROM", &h_dummy)))
|
||||
video_caps |= ACPI_VIDEO_ROM_AVAILABLE;
|
||||
|
||||
/* Does this device able to configure which video head to be POSTed ? */
|
||||
if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_VPO", &h_dummy)) &&
|
||||
ACPI_SUCCESS(acpi_get_handle(device->handle, "_GPD", &h_dummy)) &&
|
||||
ACPI_SUCCESS(acpi_get_handle(device->handle, "_SPD", &h_dummy)))
|
||||
video_caps |= ACPI_VIDEO_DEVICE_POSTING;
|
||||
|
||||
/* Only check for backlight functionality if one of the above hit. */
|
||||
if (video_caps)
|
||||
acpi_walk_namespace(ACPI_TYPE_DEVICE, device->handle,
|
||||
ACPI_UINT32_MAX, acpi_backlight_cap_match,
|
||||
&video_caps, NULL);
|
||||
|
||||
return video_caps;
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_is_video_device);
|
||||
|
||||
static acpi_status
|
||||
find_video(acpi_handle handle, u32 lvl, void *context, void **rv)
|
||||
{
|
||||
long *cap = context;
|
||||
struct device *dev;
|
||||
struct acpi_device *acpi_dev;
|
||||
|
||||
const struct acpi_device_id video_ids[] = {
|
||||
{ACPI_VIDEO_HID, 0},
|
||||
{"", 0},
|
||||
};
|
||||
if (acpi_bus_get_device(handle, &acpi_dev))
|
||||
return AE_OK;
|
||||
|
||||
if (!acpi_match_device_ids(acpi_dev, video_ids)) {
|
||||
dev = acpi_get_physical_pci_device(handle);
|
||||
if (!dev)
|
||||
return AE_OK;
|
||||
put_device(dev);
|
||||
*cap |= acpi_is_video_device(acpi_dev);
|
||||
}
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns the video capabilities of a specific ACPI graphics device
|
||||
*
|
||||
* if NULL is passed as argument all ACPI devices are enumerated and
|
||||
* all graphics capabilities of physically present devices are
|
||||
* summerized and returned. This is cached and done only once.
|
||||
*/
|
||||
long acpi_video_get_capabilities(acpi_handle graphics_handle)
|
||||
{
|
||||
long caps = 0;
|
||||
struct acpi_device *tmp_dev;
|
||||
acpi_status status;
|
||||
|
||||
if (acpi_video_caps_checked && graphics_handle == NULL)
|
||||
return acpi_video_support;
|
||||
|
||||
if (!graphics_handle) {
|
||||
/* Only do the global walk through all graphics devices once */
|
||||
acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
|
||||
ACPI_UINT32_MAX, find_video,
|
||||
&caps, NULL);
|
||||
/* There might be boot param flags set already... */
|
||||
acpi_video_support |= caps;
|
||||
acpi_video_caps_checked = 1;
|
||||
/* Add blacklists here. Be careful to use the right *DMI* bits
|
||||
* to still be able to override logic via boot params, e.g.:
|
||||
*
|
||||
* if (dmi_name_in_vendors("XY")) {
|
||||
* acpi_video_support |=
|
||||
* ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VENDOR;
|
||||
* acpi_video_support |=
|
||||
* ACPI_VIDEO_BACKLIGHT_DMI_VENDOR;
|
||||
*}
|
||||
*/
|
||||
} else {
|
||||
status = acpi_bus_get_device(graphics_handle, &tmp_dev);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status, "Invalid device"));
|
||||
return 0;
|
||||
}
|
||||
acpi_walk_namespace(ACPI_TYPE_DEVICE, graphics_handle,
|
||||
ACPI_UINT32_MAX, find_video,
|
||||
&caps, NULL);
|
||||
}
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "We have 0x%lX video support %s %s\n",
|
||||
graphics_handle ? caps : acpi_video_support,
|
||||
graphics_handle ? "on device " : "in general",
|
||||
graphics_handle ? acpi_device_bid(tmp_dev) : ""));
|
||||
return caps;
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_video_get_capabilities);
|
||||
|
||||
/* Returns true if video.ko can do backlight switching */
|
||||
int acpi_video_backlight_support(void)
|
||||
{
|
||||
/*
|
||||
* We must check whether the ACPI graphics device is physically plugged
|
||||
* in. Therefore this must be called after binding PCI and ACPI devices
|
||||
*/
|
||||
if (!acpi_video_caps_checked)
|
||||
acpi_video_get_capabilities(NULL);
|
||||
|
||||
/* First check for boot param -> highest prio */
|
||||
if (acpi_video_support & ACPI_VIDEO_BACKLIGHT_FORCE_VENDOR)
|
||||
return 0;
|
||||
else if (acpi_video_support & ACPI_VIDEO_BACKLIGHT_FORCE_VIDEO)
|
||||
return 1;
|
||||
|
||||
/* Then check for DMI blacklist -> second highest prio */
|
||||
if (acpi_video_support & ACPI_VIDEO_BACKLIGHT_DMI_VENDOR)
|
||||
return 0;
|
||||
else if (acpi_video_support & ACPI_VIDEO_BACKLIGHT_DMI_VIDEO)
|
||||
return 1;
|
||||
|
||||
/* Then go the default way */
|
||||
return acpi_video_support & ACPI_VIDEO_BACKLIGHT;
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_video_backlight_support);
|
||||
|
||||
/*
|
||||
* Returns true if video.ko can do display output switching.
|
||||
* This does not work well/at all with binary graphics drivers
|
||||
* which disable system io ranges and do it on their own.
|
||||
*/
|
||||
int acpi_video_display_switch_support(void)
|
||||
{
|
||||
if (!acpi_video_caps_checked)
|
||||
acpi_video_get_capabilities(NULL);
|
||||
|
||||
if (acpi_video_support & ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VENDOR)
|
||||
return 0;
|
||||
else if (acpi_video_support & ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VIDEO)
|
||||
return 1;
|
||||
|
||||
if (acpi_video_support & ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VENDOR)
|
||||
return 0;
|
||||
else if (acpi_video_support & ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VIDEO)
|
||||
return 1;
|
||||
|
||||
return acpi_video_support & ACPI_VIDEO_OUTPUT_SWITCHING;
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_video_display_switch_support);
|
||||
|
||||
/*
|
||||
* Use acpi_display_output=vendor/video or acpi_backlight=vendor/video
|
||||
* To force that backlight or display output switching is processed by vendor
|
||||
* specific acpi drivers or video.ko driver.
|
||||
*/
|
||||
int __init acpi_backlight(char *str)
|
||||
{
|
||||
if (str == NULL || *str == '\0')
|
||||
return 1;
|
||||
else {
|
||||
if (!strcmp("vendor", str))
|
||||
acpi_video_support |=
|
||||
ACPI_VIDEO_BACKLIGHT_FORCE_VENDOR;
|
||||
if (!strcmp("video", str))
|
||||
acpi_video_support |=
|
||||
ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VIDEO;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
__setup("acpi_backlight=", acpi_backlight);
|
||||
|
||||
int __init acpi_display_output(char *str)
|
||||
{
|
||||
if (str == NULL || *str == '\0')
|
||||
return 1;
|
||||
else {
|
||||
if (!strcmp("vendor", str))
|
||||
acpi_video_support |=
|
||||
ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VENDOR;
|
||||
if (!strcmp("video", str))
|
||||
acpi_video_support |=
|
||||
ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VIDEO;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
__setup("acpi_display_output=", acpi_display_output);
|
|
@ -660,7 +660,7 @@ static void acpi_wmi_notify(acpi_handle handle, u32 event, void *data)
|
|||
wblock->handler(event, wblock->handler_data);
|
||||
|
||||
acpi_bus_generate_netlink_event(
|
||||
device->pnp.device_class, device->dev.bus_id,
|
||||
device->pnp.device_class, dev_name(&device->dev),
|
||||
event, 0);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -523,7 +523,7 @@ static int acpi_driver_registered;
|
|||
|
||||
static int sonypi_ec_write(u8 addr, u8 value)
|
||||
{
|
||||
#ifdef CONFIG_ACPI_EC
|
||||
#ifdef CONFIG_ACPI
|
||||
if (SONYPI_ACPI_ACTIVE)
|
||||
return ec_write(addr, value);
|
||||
#endif
|
||||
|
@ -539,7 +539,7 @@ static int sonypi_ec_write(u8 addr, u8 value)
|
|||
|
||||
static int sonypi_ec_read(u8 addr, u8 *value)
|
||||
{
|
||||
#ifdef CONFIG_ACPI_EC
|
||||
#ifdef CONFIG_ACPI
|
||||
if (SONYPI_ACPI_ACTIVE)
|
||||
return ec_read(addr, value);
|
||||
#endif
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
|
||||
menu "Memory power savings"
|
||||
depends on X86_64
|
||||
|
||||
config I7300_IDLE_IOAT_CHANNEL
|
||||
bool
|
||||
|
@ -7,7 +8,7 @@ config I7300_IDLE_IOAT_CHANNEL
|
|||
config I7300_IDLE
|
||||
tristate "Intel chipset idle memory power saving driver"
|
||||
select I7300_IDLE_IOAT_CHANNEL
|
||||
depends on X86_64 && EXPERIMENTAL
|
||||
depends on EXPERIMENTAL
|
||||
help
|
||||
Enable memory power savings when idle with certain Intel server
|
||||
chipsets. The chipset must have I/O AT support, such as the
|
||||
|
|
|
@ -230,7 +230,7 @@ config HP_WMI
|
|||
config MSI_LAPTOP
|
||||
tristate "MSI Laptop Extras"
|
||||
depends on X86
|
||||
depends on ACPI_EC
|
||||
depends on ACPI
|
||||
depends on BACKLIGHT_CLASS_DEVICE
|
||||
---help---
|
||||
This is a driver for laptops built by MSI (MICRO-STAR
|
||||
|
@ -260,7 +260,7 @@ config PANASONIC_LAPTOP
|
|||
config COMPAL_LAPTOP
|
||||
tristate "Compal Laptop Extras"
|
||||
depends on X86
|
||||
depends on ACPI_EC
|
||||
depends on ACPI
|
||||
depends on BACKLIGHT_CLASS_DEVICE
|
||||
---help---
|
||||
This is a driver for laptops built by Compal:
|
||||
|
|
|
@ -1297,6 +1297,12 @@ static int __init acer_wmi_init(void)
|
|||
|
||||
set_quirks();
|
||||
|
||||
if (!acpi_video_backlight_support() && has_cap(ACER_CAP_BRIGHTNESS)) {
|
||||
interface->capability &= ~ACER_CAP_BRIGHTNESS;
|
||||
printk(ACER_INFO "Brightness must be controlled by "
|
||||
"generic video driver\n");
|
||||
}
|
||||
|
||||
if (platform_driver_register(&acer_platform_driver)) {
|
||||
printk(ACER_ERR "Unable to register platform driver.\n");
|
||||
goto error_platform_register;
|
||||
|
|
|
@ -1208,9 +1208,13 @@ static int __init asus_laptop_init(void)
|
|||
|
||||
dev = acpi_get_physical_device(hotk->device->handle);
|
||||
|
||||
if (!acpi_video_backlight_support()) {
|
||||
result = asus_backlight_init(dev);
|
||||
if (result)
|
||||
goto fail_backlight;
|
||||
} else
|
||||
printk(ASUS_INFO "Brightness ignored, must be controlled by "
|
||||
"ACPI video driver\n");
|
||||
|
||||
result = asus_led_init(dev);
|
||||
if (result)
|
||||
|
|
|
@ -326,12 +326,14 @@ static int __init compal_init(void)
|
|||
|
||||
/* Register backlight stuff */
|
||||
|
||||
if (!acpi_video_backlight_support()) {
|
||||
compalbl_device = backlight_device_register("compal-laptop", NULL, NULL,
|
||||
&compalbl_ops);
|
||||
if (IS_ERR(compalbl_device))
|
||||
return PTR_ERR(compalbl_device);
|
||||
|
||||
compalbl_device->props.max_brightness = COMPAL_LCD_LEVEL_MAX-1;
|
||||
}
|
||||
|
||||
ret = platform_driver_register(&compal_driver);
|
||||
if (ret)
|
||||
|
|
|
@ -825,9 +825,15 @@ static int __init eeepc_laptop_init(void)
|
|||
return -ENODEV;
|
||||
}
|
||||
dev = acpi_get_physical_device(ehotk->device->handle);
|
||||
|
||||
if (!acpi_video_backlight_support()) {
|
||||
result = eeepc_backlight_init(dev);
|
||||
if (result)
|
||||
goto fail_backlight;
|
||||
} else
|
||||
printk(EEEPC_INFO "Backlight controlled by ACPI video "
|
||||
"driver\n");
|
||||
|
||||
result = eeepc_hwmon_init(dev);
|
||||
if (result)
|
||||
goto fail_hwmon;
|
||||
|
|
|
@ -464,6 +464,14 @@ static int dmi_check_cb_s6410(const struct dmi_system_id *id)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int dmi_check_cb_s6420(const struct dmi_system_id *id)
|
||||
{
|
||||
dmi_check_cb_common(id);
|
||||
fujitsu->keycode1 = KEY_SCREENLOCK; /* "Lock" */
|
||||
fujitsu->keycode2 = KEY_HELP; /* "Mobility Center" */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dmi_check_cb_p8010(const struct dmi_system_id *id)
|
||||
{
|
||||
dmi_check_cb_common(id);
|
||||
|
@ -473,7 +481,7 @@ static int dmi_check_cb_p8010(const struct dmi_system_id *id)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct dmi_system_id __initdata fujitsu_dmi_table[] = {
|
||||
static struct dmi_system_id fujitsu_dmi_table[] = {
|
||||
{
|
||||
.ident = "Fujitsu Siemens S6410",
|
||||
.matches = {
|
||||
|
@ -481,6 +489,13 @@ static struct dmi_system_id __initdata fujitsu_dmi_table[] = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK S6410"),
|
||||
},
|
||||
.callback = dmi_check_cb_s6410},
|
||||
{
|
||||
.ident = "Fujitsu Siemens S6420",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK S6420"),
|
||||
},
|
||||
.callback = dmi_check_cb_s6420},
|
||||
{
|
||||
.ident = "Fujitsu LifeBook P8010",
|
||||
.matches = {
|
||||
|
@ -990,16 +1005,16 @@ static int __init fujitsu_init(void)
|
|||
|
||||
/* Register backlight stuff */
|
||||
|
||||
if (!acpi_video_backlight_support()) {
|
||||
fujitsu->bl_device =
|
||||
backlight_device_register("fujitsu-laptop", NULL, NULL,
|
||||
&fujitsubl_ops);
|
||||
if (IS_ERR(fujitsu->bl_device))
|
||||
return PTR_ERR(fujitsu->bl_device);
|
||||
|
||||
max_brightness = fujitsu->max_brightness;
|
||||
|
||||
fujitsu->bl_device->props.max_brightness = max_brightness - 1;
|
||||
fujitsu->bl_device->props.brightness = fujitsu->brightness_level;
|
||||
}
|
||||
|
||||
ret = platform_driver_register(&fujitsupf_driver);
|
||||
if (ret)
|
||||
|
@ -1035,6 +1050,7 @@ fail_hotkey:
|
|||
|
||||
fail_backlight:
|
||||
|
||||
if (fujitsu->bl_device)
|
||||
backlight_device_unregister(fujitsu->bl_device);
|
||||
|
||||
fail_platform_device2:
|
||||
|
@ -1062,6 +1078,7 @@ static void __exit fujitsu_cleanup(void)
|
|||
&fujitsupf_attribute_group);
|
||||
platform_device_unregister(fujitsu->pf_device);
|
||||
platform_driver_unregister(&fujitsupf_driver);
|
||||
if (fujitsu->bl_device)
|
||||
backlight_device_unregister(fujitsu->bl_device);
|
||||
|
||||
acpi_bus_unregister_driver(&acpi_fujitsu_driver);
|
||||
|
|
|
@ -52,6 +52,11 @@ MODULE_LICENSE("GPL");
|
|||
#define MEMORY_ARG_CUR_BANDWIDTH 1
|
||||
#define MEMORY_ARG_MAX_BANDWIDTH 0
|
||||
|
||||
/*
|
||||
* GTHS returning 'n' would mean that [0,n-1] states are supported
|
||||
* In that case max_cstate would be n-1
|
||||
* GTHS returning '0' would mean that no bandwidth control states are supported
|
||||
*/
|
||||
static int memory_get_int_max_bandwidth(struct thermal_cooling_device *cdev,
|
||||
unsigned long *max_state)
|
||||
{
|
||||
|
@ -71,6 +76,9 @@ static int memory_get_int_max_bandwidth(struct thermal_cooling_device *cdev,
|
|||
if (ACPI_FAILURE(status))
|
||||
return -EFAULT;
|
||||
|
||||
if (!value)
|
||||
return -EINVAL;
|
||||
|
||||
*max_state = value - 1;
|
||||
return 0;
|
||||
}
|
||||
|
@ -121,7 +129,7 @@ static int memory_set_cur_bandwidth(struct thermal_cooling_device *cdev,
|
|||
if (memory_get_int_max_bandwidth(cdev, &max_state))
|
||||
return -EFAULT;
|
||||
|
||||
if (max_state < 0 || state > max_state)
|
||||
if (state > max_state)
|
||||
return -EINVAL;
|
||||
|
||||
arg_list.count = 1;
|
||||
|
|
|
@ -347,12 +347,16 @@ static int __init msi_init(void)
|
|||
|
||||
/* Register backlight stuff */
|
||||
|
||||
msibl_device = backlight_device_register("msi-laptop-bl", NULL, NULL,
|
||||
&msibl_ops);
|
||||
if (acpi_video_backlight_support()) {
|
||||
printk(KERN_INFO "MSI: Brightness ignored, must be controlled "
|
||||
"by ACPI video driver\n");
|
||||
} else {
|
||||
msibl_device = backlight_device_register("msi-laptop-bl", NULL,
|
||||
NULL, &msibl_ops);
|
||||
if (IS_ERR(msibl_device))
|
||||
return PTR_ERR(msibl_device);
|
||||
|
||||
msibl_device->props.max_brightness = MSI_LCD_LEVEL_MAX-1;
|
||||
}
|
||||
|
||||
ret = platform_driver_register(&msipf_driver);
|
||||
if (ret)
|
||||
|
|
|
@ -1038,7 +1038,11 @@ static int sony_nc_add(struct acpi_device *device)
|
|||
goto outinput;
|
||||
}
|
||||
|
||||
if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, "GBRT", &handle))) {
|
||||
if (!acpi_video_backlight_support()) {
|
||||
printk(KERN_INFO DRV_PFX "Sony: Brightness ignored, must be "
|
||||
"controlled by ACPI video driver\n");
|
||||
} else if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, "GBRT",
|
||||
&handle))) {
|
||||
sony_backlight_device = backlight_device_register("sony", NULL,
|
||||
NULL,
|
||||
&sony_backlight_ops);
|
||||
|
|
|
@ -4932,16 +4932,25 @@ static int __init brightness_init(struct ibm_init_struct *iibm)
|
|||
*/
|
||||
b = tpacpi_check_std_acpi_brightness_support();
|
||||
if (b > 0) {
|
||||
if (thinkpad_id.vendor == PCI_VENDOR_ID_LENOVO) {
|
||||
printk(TPACPI_NOTICE
|
||||
"Lenovo BIOS switched to ACPI backlight "
|
||||
"control mode\n");
|
||||
}
|
||||
|
||||
if (acpi_video_backlight_support()) {
|
||||
if (brightness_enable > 1) {
|
||||
printk(TPACPI_NOTICE
|
||||
"standard ACPI backlight interface "
|
||||
"available, not loading native one...\n");
|
||||
"Standard ACPI backlight interface "
|
||||
"available, not loading native one.\n");
|
||||
return 1;
|
||||
} else if (brightness_enable == 1) {
|
||||
printk(TPACPI_NOTICE
|
||||
"Backlight control force enabled, even if standard "
|
||||
"ACPI backlight interface is available\n");
|
||||
}
|
||||
} else {
|
||||
if (brightness_enable > 1) {
|
||||
printk(TPACPI_NOTICE
|
||||
"Standard ACPI backlight interface not "
|
||||
"available, thinkpad_acpi native "
|
||||
"brightness control enabled\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -380,6 +380,8 @@ struct acpi_bus_type {
|
|||
int register_acpi_bus_type(struct acpi_bus_type *);
|
||||
int unregister_acpi_bus_type(struct acpi_bus_type *);
|
||||
struct device *acpi_get_physical_device(acpi_handle);
|
||||
struct device *acpi_get_physical_pci_device(acpi_handle);
|
||||
|
||||
/* helper */
|
||||
acpi_handle acpi_get_child(acpi_handle, acpi_integer);
|
||||
acpi_handle acpi_get_pci_rootbridge_handle(unsigned int, unsigned int);
|
||||
|
|
|
@ -31,8 +31,24 @@
|
|||
|
||||
#define ACPI_MAX_STRING 80
|
||||
|
||||
/*
|
||||
* Please update drivers/acpi/debug.c and Documentation/acpi/debug.txt
|
||||
* if you add to this list.
|
||||
*/
|
||||
#define ACPI_BUS_COMPONENT 0x00010000
|
||||
#define ACPI_AC_COMPONENT 0x00020000
|
||||
#define ACPI_BATTERY_COMPONENT 0x00040000
|
||||
#define ACPI_BUTTON_COMPONENT 0x00080000
|
||||
#define ACPI_SBS_COMPONENT 0x00100000
|
||||
#define ACPI_FAN_COMPONENT 0x00200000
|
||||
#define ACPI_PCI_COMPONENT 0x00400000
|
||||
#define ACPI_POWER_COMPONENT 0x00800000
|
||||
#define ACPI_CONTAINER_COMPONENT 0x01000000
|
||||
#define ACPI_SYSTEM_COMPONENT 0x02000000
|
||||
#define ACPI_THERMAL_COMPONENT 0x04000000
|
||||
#define ACPI_MEMORY_DEVICE_COMPONENT 0x08000000
|
||||
#define ACPI_VIDEO_COMPONENT 0x10000000
|
||||
#define ACPI_PROCESSOR_COMPONENT 0x20000000
|
||||
|
||||
/*
|
||||
* _HID definitions
|
||||
|
@ -41,6 +57,7 @@
|
|||
*/
|
||||
|
||||
#define ACPI_POWER_HID "LNXPOWER"
|
||||
#define ACPI_PROCESSOR_OBJECT_HID "ACPI_CPU"
|
||||
#define ACPI_PROCESSOR_HID "ACPI0007"
|
||||
#define ACPI_SYSTEM_HID "LNXSYSTM"
|
||||
#define ACPI_THERMAL_HID "LNXTHERM"
|
||||
|
@ -54,7 +71,6 @@
|
|||
PCI
|
||||
-------------------------------------------------------------------------- */
|
||||
|
||||
#define ACPI_PCI_COMPONENT 0x00400000
|
||||
|
||||
/* ACPI PCI Interrupt Link (pci_link.c) */
|
||||
|
||||
|
@ -86,7 +102,6 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_device *device, int domain,
|
|||
Power Resource
|
||||
-------------------------------------------------------------------------- */
|
||||
|
||||
#ifdef CONFIG_ACPI_POWER
|
||||
int acpi_device_sleep_wake(struct acpi_device *dev,
|
||||
int enable, int sleep_state, int dev_state);
|
||||
int acpi_enable_wakeup_device_power(struct acpi_device *dev, int sleep_state);
|
||||
|
@ -94,15 +109,12 @@ int acpi_disable_wakeup_device_power(struct acpi_device *dev);
|
|||
int acpi_power_get_inferred_state(struct acpi_device *device);
|
||||
int acpi_power_transition(struct acpi_device *device, int state);
|
||||
extern int acpi_power_nocheck;
|
||||
#endif
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Embedded Controller
|
||||
-------------------------------------------------------------------------- */
|
||||
#ifdef CONFIG_ACPI_EC
|
||||
int acpi_ec_ecdt_probe(void);
|
||||
int acpi_boot_ec_enable(void);
|
||||
#endif
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Processor
|
||||
|
|
|
@ -252,9 +252,9 @@ acpi_status acpi_get_event_status(u32 event, acpi_event_status * event_status);
|
|||
|
||||
acpi_status acpi_set_gpe_type(acpi_handle gpe_device, u32 gpe_number, u8 type);
|
||||
|
||||
acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags);
|
||||
acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number);
|
||||
|
||||
acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags);
|
||||
acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number);
|
||||
|
||||
acpi_status acpi_clear_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags);
|
||||
|
||||
|
|
|
@ -525,6 +525,7 @@ typedef u32 acpi_event_status;
|
|||
#define ACPI_EVENT_FLAG_ENABLED (acpi_event_status) 0x01
|
||||
#define ACPI_EVENT_FLAG_WAKE_ENABLED (acpi_event_status) 0x02
|
||||
#define ACPI_EVENT_FLAG_SET (acpi_event_status) 0x04
|
||||
#define ACPI_EVENT_FLAG_HANDLE (acpi_event_status) 0x08
|
||||
|
||||
/*
|
||||
* General Purpose Events (GPE)
|
||||
|
|
|
@ -163,8 +163,6 @@ struct acpi_pci_driver {
|
|||
int acpi_pci_register_driver(struct acpi_pci_driver *driver);
|
||||
void acpi_pci_unregister_driver(struct acpi_pci_driver *driver);
|
||||
|
||||
#ifdef CONFIG_ACPI_EC
|
||||
|
||||
extern int ec_read(u8 addr, u8 *val);
|
||||
extern int ec_write(u8 addr, u8 val);
|
||||
extern int ec_transaction(u8 command,
|
||||
|
@ -172,8 +170,6 @@ extern int ec_transaction(u8 command,
|
|||
u8 *rdata, unsigned rdata_len,
|
||||
int force_poll);
|
||||
|
||||
#endif /*CONFIG_ACPI_EC*/
|
||||
|
||||
#if defined(CONFIG_ACPI_WMI) || defined(CONFIG_ACPI_WMI_MODULE)
|
||||
|
||||
typedef void (*wmi_notify_handler) (u32 value, void *context);
|
||||
|
@ -194,6 +190,50 @@ extern bool wmi_has_guid(const char *guid);
|
|||
|
||||
#endif /* CONFIG_ACPI_WMI */
|
||||
|
||||
#define ACPI_VIDEO_OUTPUT_SWITCHING 0x0001
|
||||
#define ACPI_VIDEO_DEVICE_POSTING 0x0002
|
||||
#define ACPI_VIDEO_ROM_AVAILABLE 0x0004
|
||||
#define ACPI_VIDEO_BACKLIGHT 0x0008
|
||||
#define ACPI_VIDEO_BACKLIGHT_FORCE_VENDOR 0x0010
|
||||
#define ACPI_VIDEO_BACKLIGHT_FORCE_VIDEO 0x0020
|
||||
#define ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VENDOR 0x0040
|
||||
#define ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VIDEO 0x0080
|
||||
#define ACPI_VIDEO_BACKLIGHT_DMI_VENDOR 0x0100
|
||||
#define ACPI_VIDEO_BACKLIGHT_DMI_VIDEO 0x0200
|
||||
#define ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VENDOR 0x0400
|
||||
#define ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VIDEO 0x0800
|
||||
|
||||
#if defined(CONFIG_ACPI_VIDEO) || defined(CONFIG_ACPI_VIDEO_MODULE)
|
||||
|
||||
extern long acpi_video_get_capabilities(acpi_handle graphics_dev_handle);
|
||||
extern long acpi_is_video_device(struct acpi_device *device);
|
||||
extern int acpi_video_backlight_support(void);
|
||||
extern int acpi_video_display_switch_support(void);
|
||||
|
||||
#else
|
||||
|
||||
static inline long acpi_video_get_capabilities(acpi_handle graphics_dev_handle)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline long acpi_is_video_device(struct acpi_device *device)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int acpi_video_backlight_support(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int acpi_video_display_switch_support(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* defined(CONFIG_ACPI_VIDEO) || defined(CONFIG_ACPI_VIDEO_MODULE) */
|
||||
|
||||
extern int acpi_blacklisted(void);
|
||||
#ifdef CONFIG_DMI
|
||||
extern void acpi_dmi_osi_linux(int enable, const struct dmi_system_id *d);
|
||||
|
|
Loading…
Reference in a new issue