Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
f028ebf3
Commit
f028ebf3
authored
Sep 30, 2003
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
http://linux-acpi.bkbits.net/linux-acpi-release-2.6.0
into home.osdl.org:/home/torvalds/v2.5/linux
parents
ef4604f8
9d363b8d
Changes
34
Hide whitespace changes
Inline
Side-by-side
Showing
34 changed files
with
554 additions
and
392 deletions
+554
-392
MAINTAINERS
MAINTAINERS
+10
-0
arch/i386/kernel/acpi/boot.c
arch/i386/kernel/acpi/boot.c
+5
-5
arch/i386/kernel/cpu/cpufreq/acpi.c
arch/i386/kernel/cpu/cpufreq/acpi.c
+8
-8
arch/i386/kernel/dmi_scan.c
arch/i386/kernel/dmi_scan.c
+4
-6
arch/i386/kernel/mpparse.c
arch/i386/kernel/mpparse.c
+27
-23
arch/i386/kernel/setup.c
arch/i386/kernel/setup.c
+3
-3
arch/ia64/kernel/acpi.c
arch/ia64/kernel/acpi.c
+1
-1
drivers/acpi/Kconfig
drivers/acpi/Kconfig
+49
-48
drivers/acpi/Makefile
drivers/acpi/Makefile
+1
-1
drivers/acpi/asus_acpi.c
drivers/acpi/asus_acpi.c
+154
-123
drivers/acpi/bus.c
drivers/acpi/bus.c
+1
-2
drivers/acpi/dispatcher/dsfield.c
drivers/acpi/dispatcher/dsfield.c
+24
-18
drivers/acpi/dispatcher/dsinit.c
drivers/acpi/dispatcher/dsinit.c
+2
-2
drivers/acpi/dispatcher/dsopcode.c
drivers/acpi/dispatcher/dsopcode.c
+23
-12
drivers/acpi/dispatcher/dsutils.c
drivers/acpi/dispatcher/dsutils.c
+64
-52
drivers/acpi/dispatcher/dswload.c
drivers/acpi/dispatcher/dswload.c
+18
-0
drivers/acpi/dispatcher/dswscope.c
drivers/acpi/dispatcher/dswscope.c
+4
-7
drivers/acpi/dispatcher/dswstate.c
drivers/acpi/dispatcher/dswstate.c
+20
-10
drivers/acpi/ec.c
drivers/acpi/ec.c
+5
-2
drivers/acpi/events/evregion.c
drivers/acpi/events/evregion.c
+3
-3
drivers/acpi/executer/excreate.c
drivers/acpi/executer/excreate.c
+2
-6
drivers/acpi/executer/exfldio.c
drivers/acpi/executer/exfldio.c
+35
-1
drivers/acpi/namespace/nsdump.c
drivers/acpi/namespace/nsdump.c
+2
-2
drivers/acpi/namespace/nssearch.c
drivers/acpi/namespace/nssearch.c
+4
-4
drivers/acpi/namespace/nsutils.c
drivers/acpi/namespace/nsutils.c
+7
-2
drivers/acpi/parser/psparse.c
drivers/acpi/parser/psparse.c
+15
-16
drivers/acpi/pci_irq.c
drivers/acpi/pci_irq.c
+3
-0
drivers/acpi/pci_link.c
drivers/acpi/pci_link.c
+52
-12
drivers/acpi/tables.c
drivers/acpi/tables.c
+2
-13
include/acpi/acconfig.h
include/acpi/acconfig.h
+1
-1
include/acpi/acdisasm.h
include/acpi/acdisasm.h
+0
-4
include/acpi/acstruct.h
include/acpi/acstruct.h
+2
-1
include/linux/acpi.h
include/linux/acpi.h
+3
-3
init/do_mounts.h
init/do_mounts.h
+0
-1
No files found.
MAINTAINERS
View file @
f028ebf3
...
...
@@ -284,6 +284,16 @@ P: Jonathan Layes
L: linux-net@vger.kernel.org
S: Maintained
ASUS ACPI EXTRAS DRIVER
P: Karol Kozimor
M: sziwan@users.sourceforge.net
P: Julien Lerouge
M: julien.lerouge@free.fr
L: acpi4asus-user@lists.sourceforge.net
W: http://sourceforge.net/projects/acpi4asus
W: http://julien.lerouge.free.fr
S: Maintained
ATM
P: Chas Williams
M: chas@cmf.nrl.navy.mil
...
...
arch/i386/kernel/acpi/boot.c
View file @
f028ebf3
...
...
@@ -183,8 +183,7 @@ acpi_parse_lapic_nmi (
#endif
/*CONFIG_X86_LOCAL_APIC*/
#ifdef CONFIG_X86_IO_APIC
#if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_ACPI_INTERPRETER)
static
int
__init
acpi_parse_ioapic
(
...
...
@@ -368,7 +367,6 @@ acpi_boot_init (void)
result
=
acpi_table_parse
(
ACPI_APIC
,
acpi_parse_madt
);
if
(
!
result
)
{
printk
(
KERN_WARNING
PREFIX
"MADT not present
\n
"
);
return
0
;
}
else
if
(
result
<
0
)
{
...
...
@@ -416,7 +414,7 @@ acpi_boot_init (void)
#endif
/*CONFIG_X86_LOCAL_APIC*/
#if
def CONFIG_X86_IO_APIC
#if
defined(CONFIG_X86_IO_APIC) && defined(CONFIG_ACPI_INTERPRETER)
/*
* I/O APIC
...
...
@@ -472,7 +470,8 @@ acpi_boot_init (void)
acpi_irq_model
=
ACPI_IRQ_MODEL_IOAPIC
;
acpi_ioapic
=
1
;
#endif
/*CONFIG_X86_IO_APIC*/
#endif
/* CONFIG_X86_IO_APIC && CONFIG_ACPI_INTERPRETER */
#ifdef CONFIG_X86_LOCAL_APIC
if
(
acpi_lapic
&&
acpi_ioapic
)
{
...
...
@@ -480,6 +479,7 @@ acpi_boot_init (void)
clustered_apic_check
();
}
#endif
#ifdef CONFIG_HPET_TIMER
acpi_table_parse
(
ACPI_HPET
,
acpi_parse_hpet
);
#endif
...
...
arch/i386/kernel/cpu/cpufreq/acpi.c
View file @
f028ebf3
...
...
@@ -231,7 +231,7 @@ acpi_processor_set_performance (
int
state
)
{
u16
port
=
0
;
u
8
value
=
0
;
u
16
value
=
0
;
int
i
=
0
;
struct
cpufreq_freqs
cpufreq_freqs
;
...
...
@@ -282,9 +282,9 @@ acpi_processor_set_performance (
value
=
(
u16
)
perf
->
states
[
state
].
control
;
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Writing 0x%0
2
x to port 0x%04x
\n
"
,
value
,
port
));
"Writing 0x%0
4
x to port 0x%04x
\n
"
,
value
,
port
));
out
b
(
value
,
port
);
out
w
(
value
,
port
);
/*
* Then we read the 'status_register' and compare the value with the
...
...
@@ -296,12 +296,12 @@ acpi_processor_set_performance (
port
=
perf
->
status_register
;
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Looking for 0x%0
2
x from port 0x%04x
\n
"
,
(
u
8
)
perf
->
states
[
state
].
status
,
port
));
"Looking for 0x%0
4
x from port 0x%04x
\n
"
,
(
u
16
)
perf
->
states
[
state
].
status
,
port
));
for
(
i
=
0
;
i
<
100
;
i
++
)
{
value
=
in
b
(
port
);
if
(
value
==
(
u
8
)
perf
->
states
[
state
].
status
)
value
=
in
w
(
port
);
if
(
value
==
(
u
16
)
perf
->
states
[
state
].
status
)
break
;
udelay
(
10
);
}
...
...
@@ -309,7 +309,7 @@ acpi_processor_set_performance (
/* notify cpufreq */
cpufreq_notify_transition
(
&
cpufreq_freqs
,
CPUFREQ_POSTCHANGE
);
if
(
value
!=
perf
->
states
[
state
].
status
)
{
if
(
value
!=
(
u16
)
perf
->
states
[
state
].
status
)
{
unsigned
int
tmp
=
cpufreq_freqs
.
new
;
cpufreq_freqs
.
new
=
cpufreq_freqs
.
old
;
cpufreq_freqs
.
old
=
tmp
;
...
...
arch/i386/kernel/dmi_scan.c
View file @
f028ebf3
...
...
@@ -939,11 +939,6 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
MATCH
(
DMI_BOARD_NAME
,
"CUR-DLS"
),
NO_MATCH
,
NO_MATCH
}},
{
force_acpi_ht
,
"ASUS A7V"
,
{
MATCH
(
DMI_BOARD_VENDOR
,
"ASUSTeK Computer INC"
),
MATCH
(
DMI_BOARD_NAME
,
"<A7V>"
),
MATCH
(
DMI_BIOS_VERSION
,
"ASUS A7V ACPI BIOS Revision 1011"
),
NO_MATCH
}},
{
force_acpi_ht
,
"ABIT i440BX-W83977"
,
{
MATCH
(
DMI_BOARD_VENDOR
,
"ABIT <http://www.abit.com>"
),
MATCH
(
DMI_BOARD_NAME
,
"i440BX-W83977 (BP6)"
),
...
...
@@ -978,7 +973,10 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
{
disable_acpi_pci
,
"ASUS A7V"
,
{
MATCH
(
DMI_BOARD_VENDOR
,
"ASUSTeK Computer INC"
),
MATCH
(
DMI_BOARD_NAME
,
"<A7V>"
),
MATCH
(
DMI_BIOS_VERSION
,
"ASUS A7V ACPI BIOS Revision 1007"
),
NO_MATCH
}},
/* newer BIOS, Revision 1011, does work */
MATCH
(
DMI_BIOS_VERSION
,
"ASUS A7V ACPI BIOS Revision 1007"
),
NO_MATCH
}},
#endif
{
NULL
,
}
...
...
arch/i386/kernel/mpparse.c
View file @
f028ebf3
...
...
@@ -830,7 +830,7 @@ void __init mp_register_lapic (
MP_processor_info
(
&
processor
);
}
#if
def CONFIG_X86_IO_APIC
#if
defined(CONFIG_X86_IO_APIC) && defined(CONFIG_ACPI_INTERPRETER)
#define MP_ISA_BUS 0
#define MP_MAX_IOAPIC_PIN 127
...
...
@@ -1019,10 +1019,6 @@ void __init mp_config_acpi_legacy_irqs (void)
}
}
#ifdef CONFIG_ACPI
/* Ensure the ACPI SCI interrupt level is active low, edge-triggered */
extern
FADT_DESCRIPTOR
acpi_fadt
;
void
__init
mp_config_ioapic_for_sci
(
int
irq
)
...
...
@@ -1031,6 +1027,7 @@ void __init mp_config_ioapic_for_sci(int irq)
int
ioapic_pin
;
struct
acpi_table_madt
*
madt
;
struct
acpi_table_int_src_ovr
*
entry
=
NULL
;
acpi_interrupt_flags
flags
;
void
*
madt_end
;
acpi_status
status
;
...
...
@@ -1049,32 +1046,37 @@ void __init mp_config_ioapic_for_sci(int irq)
while
((
void
*
)
entry
<
madt_end
)
{
if
(
entry
->
header
.
type
==
ACPI_MADT_INT_SRC_OVR
&&
acpi_fadt
.
sci_int
==
entry
->
bus_irq
)
{
/*
* See the note at the end of ACPI 2.0b section
* 5.2.10.8 for what this is about.
*/
if
(
entry
->
bus_irq
!=
entry
->
global_irq
)
{
acpi_fadt
.
sci_int
=
entry
->
global_irq
;
irq
=
entry
->
global_irq
;
break
;
}
else
return
;
}
acpi_fadt
.
sci_int
==
entry
->
bus_irq
)
goto
found
;
entry
=
(
struct
acpi_table_int_src_ovr
*
)
((
unsigned
long
)
entry
+
entry
->
header
.
length
);
}
}
/*
* Although the ACPI spec says that the SCI should be level/low
* don't reprogram it unless there is an explicit MADT OVR entry
* instructing us to do so -- otherwise we break Tyan boards which
* have the SCI wired edge/high but no MADT OVR.
*/
return
;
found:
/*
* See the note at the end of ACPI 2.0b section
* 5.2.10.8 for what this is about.
*/
flags
=
entry
->
flags
;
acpi_fadt
.
sci_int
=
entry
->
global_irq
;
irq
=
entry
->
global_irq
;
ioapic
=
mp_find_ioapic
(
irq
);
ioapic_pin
=
irq
-
mp_ioapic_routing
[
ioapic
].
irq_start
;
io_apic_set_pci_routing
(
ioapic
,
ioapic_pin
,
irq
,
1
,
1
);
// Active low, level triggered
io_apic_set_pci_routing
(
ioapic
,
ioapic_pin
,
irq
,
(
flags
.
trigger
>>
1
)
,
(
flags
.
polarity
>>
1
));
}
#endif
/* CONFIG_ACPI */
#ifdef CONFIG_ACPI_PCI
...
...
@@ -1110,8 +1112,10 @@ void __init mp_parse_prt (void)
}
/* Don't set up the ACPI SCI because it's already set up */
if
(
acpi_fadt
.
sci_int
==
irq
)
if
(
acpi_fadt
.
sci_int
==
irq
)
{
entry
->
irq
=
irq
;
/*we still need to set entry's irq*/
continue
;
}
ioapic
=
mp_find_ioapic
(
irq
);
if
(
ioapic
<
0
)
...
...
@@ -1154,5 +1158,5 @@ void __init mp_parse_prt (void)
}
#endif
/*CONFIG_ACPI_PCI*/
#endif
/* CONFIG_X86_IO_APIC
*/
#endif
/*CONFIG_X86_IO_APIC && CONFIG_ACPI_INTERPRETER
*/
#endif
/*CONFIG_ACPI_BOOT*/
arch/i386/kernel/setup.c
View file @
f028ebf3
...
...
@@ -64,10 +64,10 @@ struct cpuinfo_x86 boot_cpu_data = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
unsigned
long
mmu_cr4_features
;
EXPORT_SYMBOL_GPL
(
mmu_cr4_features
);
#ifdef CONFIG_ACPI
int
acpi_disabled
__initdata
=
0
;
#ifdef CONFIG_ACPI
_INTERPRETER
int
acpi_disabled
=
0
;
#else
int
acpi_disabled
__initdata
=
1
;
int
acpi_disabled
=
1
;
#endif
EXPORT_SYMBOL
(
acpi_disabled
);
...
...
arch/ia64/kernel/acpi.c
View file @
f028ebf3
...
...
@@ -56,7 +56,7 @@ void (*pm_power_off) (void);
unsigned
char
acpi_kbd_controller_present
=
1
;
int
acpi_disabled
__initdata
;
/* XXX this shouldn't be needed---we can't boot without ACPI! */
int
acpi_disabled
;
/* XXX this shouldn't be needed---we can't boot without ACPI! */
const
char
*
acpi_get_sysname
(
void
)
...
...
drivers/acpi/Kconfig
View file @
f028ebf3
...
...
@@ -3,34 +3,14 @@
#
menu "ACPI (Advanced Configuration and Power Interface) Support"
config ACPI_HT
bool "ACPI Processor Enumeration for HT"
depends on X86
default y
---help---
ACPI enumerates both logical (a.k.a. Hyper-Threaded -- HT)
and physical processors. It is designed to obsolete several older
specifications, including the MultiProcessor Specification (MPS),
which supported only physical processors.
CONFIG_ACPI_HT includes the minimal ACPI boot-time code
necessary to enumerate logical processors and enable HT.
CONFIG_ACPI includes CONFIG_ACPI_HT, plus IO APIC enumeration,
and the hooks to run the ACPI AML interpreter for run-time events.
When CONFIG_ACPI is selected, the command-line option "acpi=ht"
is available to run just the ACPI boot-time code -- just as if
only CONFIG_ACPI_HT were selected.
Note that "acpi=off" can be used to disable all ACPI code in the kernel.
config ACPI
bool "Full ACPI Support"
depends on !X86_VISWS
depends on !IA64_HP_SIM
depends on IA64 || (X86 || ACPI_HT)
depends on IA64 || X86
config ACPI
bool "ACPI Support"
depends on IA64 || X86
default y
---help---
Advanced Configuration and Power Interface (ACPI) support for
...
...
@@ -62,12 +42,19 @@ config ACPI
config ACPI_BOOT
bool
depends on ACPI || ACPI_HT
depends on ACPI || X86_HT
default y
config ACPI_INTERPRETER
bool
depends on ACPI
depends on !IA64_SGI_SN
default y
config ACPI_SLEEP
bool "Sleep States (EXPERIMENTAL)"
depends on X86 && ACPI
depends on ACPI_INTERPRETER
depends on EXPERIMENTAL && PM
default y
---help---
...
...
@@ -93,7 +80,8 @@ config ACPI_SLEEP_PROC_FS
config ACPI_AC
tristate "AC Adapter"
depends on X86 && ACPI
depends on X86
depends on ACPI_INTERPRETER
default m
help
This driver adds support for the AC Adapter object, which indicates
...
...
@@ -102,7 +90,8 @@ config ACPI_AC
config ACPI_BATTERY
tristate "Battery"
depends on X86 && ACPI
depends on X86
depends on ACPI_INTERPRETER
default m
help
This driver adds support for battery information through
...
...
@@ -111,7 +100,7 @@ config ACPI_BATTERY
config ACPI_BUTTON
tristate "Button"
depends on ACPI
depends on ACPI
_INTERPRETER
depends on !IA64_SGI_SN
default m
help
...
...
@@ -123,7 +112,7 @@ config ACPI_BUTTON
config ACPI_FAN
tristate "Fan"
depends on ACPI
depends on ACPI
_INTERPRETER
depends on !IA64_SGI_SN
default m
help
...
...
@@ -132,7 +121,7 @@ config ACPI_FAN
config ACPI_PROCESSOR
tristate "Processor"
depends on ACPI
depends on ACPI
_INTERPRETER
depends on !IA64_SGI_SN
default m
help
...
...
@@ -152,14 +141,15 @@ config ACPI_THERMAL
config ACPI_NUMA
bool "NUMA support"
depends on ACPI
depends on ACPI
_INTERPRETER
depends on NUMA
depends on !X86_64
default y if IA64_GENERIC || IA64_SGI_SN2
config ACPI_ASUS
tristate "ASUS/Medion Laptop Extras"
depends on X86 && ACPI
depends on X86
depends on ACPI_INTERPRETER
default m
---help---
This driver provides support for extra features of ACPI-compatible
...
...
@@ -170,6 +160,9 @@ config ACPI_ASUS
display brightness and output, switching the LCD backlight on and off,
and most importantly, allows you to blink those fancy LEDs intended
for reporting mail and wireless status.
Note: display switching code is currently considered EXPERIMENTAL,
toying with these values may even lock your machine.
All settings are changed via /proc/acpi/asus directory entries. Owner
and group for these entries can be set with asus_uid and asus_gid
...
...
@@ -185,7 +178,8 @@ config ACPI_ASUS
config ACPI_TOSHIBA
tristate "Toshiba Laptop Extras"
depends on X86 && ACPI
depends on X86
depends on ACPI_INTERPRETER
default m
---help---
This driver adds support for access to certain system settings
...
...
@@ -212,7 +206,7 @@ config ACPI_TOSHIBA
config ACPI_DEBUG
bool "Debug Statements"
depends on ACPI
depends on ACPI
_INTERPRETER
depends on !IA64_SGI_SN
default n
help
...
...
@@ -222,19 +216,14 @@ config ACPI_DEBUG
config ACPI_BUS
bool
depends on ACPI
depends on !IA64_SGI_SN
default y
config ACPI_INTERPRETER
bool
depends on ACPI
depends on ACPI_INTERPRETER
depends on !IA64_SGI_SN
default y
config ACPI_EC
bool
depends on X86 && ACPI
depends on X86
depends on ACPI_INTERPRETER
default y
help
This driver is required on some systems for the proper operation of
...
...
@@ -243,19 +232,19 @@ config ACPI_EC
config ACPI_POWER
bool
depends on ACPI
depends on ACPI
_INTERPRETER
depends on !IA64_SGI_SN
default y
config ACPI_PCI
bool
depends on ACPI
depends on ACPI
_INTERPRETER
depends on !IA64_SGI_SN
default PCI
config ACPI_SYSTEM
bool
depends on ACPI
depends on ACPI
_INTERPRETER
depends on !IA64_SGI_SN
default y
help
...
...
@@ -264,9 +253,21 @@ config ACPI_SYSTEM
config ACPI_EFI
bool
depends on ACPI
depends on ACPI
_INTERPRETER
depends on IA64
default y
config ACPI_RELAXED_AML
bool "Relaxed AML"
depends on ACPI_INTERPRETER
depends on !IA64_SGI_SN
default n
help
If you say `Y' here, the ACPI interpreter will relax its checking
for valid AML and will ignore some AML mistakes, such as off-by-one
errors in region sizes. Some laptops may require this option. In
particular, many Toshiba laptops require this for correct operation
of the AC module.
endmenu
drivers/acpi/Makefile
View file @
f028ebf3
...
...
@@ -18,7 +18,7 @@ obj-$(CONFIG_ACPI) := acpi_ksyms.o
# ACPI Boot-Time Table Parsing
#
obj-$(CONFIG_ACPI_BOOT)
+=
tables.o
obj-$(CONFIG_ACPI
)
+=
blacklist.o
obj-$(CONFIG_ACPI
_INTERPRETER)
+=
blacklist.o
#
# ACPI Core Subsystem (Interpreter)
...
...
drivers/acpi/asus_acpi.c
View file @
f028ebf3
...
...
@@ -26,13 +26,17 @@
* Johann Wiesner - Small compile fixes
* John Belmonte - ACPI code for Toshiba laptop was a good starting point.
*
* TODO
* TODO
:
* add Fn key status
* Add mode selection on module loading (parameter) -> still necessary
?
* Add mode selection on module loading (parameter) -> still necessary?
* Complete display switching -- may require dirty hacks?
*
*/
#include <linux/config.h>
#if defined (CONFIG_MODVERSIONS) && !defined (MODVERSIONS) && defined (MODULE)
#include <linux/modversions.h>
#endif
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
...
...
@@ -41,7 +45,7 @@
#include <acpi/acpi_drivers.h>
#include <acpi/acpi_bus.h>
#define ASUS_ACPI_VERSION "0.2
4a
"
#define ASUS_ACPI_VERSION "0.2
6
"
#define PROC_ASUS "asus" //the directory
#define PROC_MLED "mled"
...
...
@@ -110,20 +114,24 @@ struct asus_hotk {
struct
model_data
*
methods
;
//methods available on the laptop
u8
brightness
;
//brighness level
enum
{
L2X
=
0
,
//L200D -> TODO check Q11 (Fn+F8)
// Calling this method simply hang the
A1X
=
0
,
//A1340D, A1300F
A2X
,
//A2500H
D1X
,
//D1
L1X
,
//L1400B
L2X
,
//L2000D -> TODO check Q11 (Fn+F8)
// Calling this method simply hangs the
// computer, ISMI method hangs the laptop.
L3X
,
//L3C
L3D
,
//L3400D
L3X
,
//L3C
L5X
,
//L5C TODO this model seems to have one more
// LED, add support
M2X
,
//M2400E
M3N
,
//M3700N, but also S1300N -> TODO WLED
S1X
,
//S1300A -> TODO special keys do not work ?
D1X
,
//D1
L1X
,
//L1400B
A1X
,
//A1340D, A1300F
J1X
,
//S200 (J1)
//TODO A1370D does not seems to have a ATK device
S2X
,
//S200 (J1 reported), Victor MP-XP7210
//TODO A1370D does not seem to have an ATK device
// L8400 model doesn't have ATK
END_MODEL
,
END_MODEL
}
model
;
//Models currently supported
u16
event_count
[
128
];
//count for each event TODO make this better
};
...
...
@@ -133,7 +141,8 @@ struct asus_hotk {
#define S1X_PREFIX "\\_SB.PCI0.PX40."
#define L1X_PREFIX S1X_PREFIX
#define A1X_PREFIX "\\_SB.PCI0.ISA.EC0."
#define J1X_PREFIX A1X_PREFIX
#define S2X_PREFIX A1X_PREFIX
#define M3N_PREFIX "\\_SB.PCI0.SBRG.EC0."
static
struct
model_data
model_conf
[
END_MODEL
]
=
{
/*
...
...
@@ -147,33 +156,43 @@ static struct model_data model_conf[END_MODEL] = {
* it seems to be a kind of switch, but what for ?
*
*/
{
"A1X"
,
"MLED"
,
"
\\
MAIL"
,
NULL
,
NULL
,
A1X_PREFIX
"_Q10"
,
"
\\
BKLI"
,
A1X_PREFIX
"_Q0E"
,
A1X_PREFIX
"_Q0F"
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
},
{
"A2X"
,
"MLED"
,
NULL
,
"WLED"
,
"
\\
SG66"
,
"
\\
Q10"
,
"
\\
BAOF"
,
"
\\
Q0E"
,
"
\\
Q0F"
,
"SPLV"
,
"GPLV"
,
"
\\
CMOD"
,
"SDSP"
,
"
\\
INFB"
},
{
"D1X"
,
"MLED"
,
NULL
,
NULL
,
NULL
,
"
\\
Q0D"
,
"
\\
GP11"
,
"
\\
Q0C"
,
"
\\
Q0B"
,
NULL
,
NULL
,
"
\\
BLVL"
,
"SDSP"
,
"
\\
INFB"
},
{
"L1X"
,
"MLED"
,
NULL
,
"WLED"
,
NULL
,
L1X_PREFIX
"Q10"
,
"
\\
PNOF"
,
L1X_PREFIX
"Q0F"
,
L1X_PREFIX
"Q0E"
,
"SPLV"
,
"GPLV"
,
"
\\
BRIT"
,
NULL
,
NULL
},
{
"L2X"
,
"MLED"
,
"
\\
SGP6"
,
"WLED"
,
"
\\
RCP3"
,
"
\\
Q10"
,
"
\\
SGP0"
,
"
\\
Q0E"
,
"
\\
Q0F"
,
NULL
,
NULL
,
NULL
,
"SDSP"
,
"
\\
INFB"
},
{
"L3D"
,
"MLED"
,
"
\\
MALD"
,
"WLED"
,
NULL
,
"
\\
Q10"
,
"
\\
BKLG"
,
"
\\
Q0E"
,
"
\\
Q0F"
,
"SPLV"
,
"GPLV"
,
"
\\
BLVL"
,
"SDSP"
,
"
\\
INFB"
},
{
"L3X"
,
"MLED"
,
NULL
,
"WLED"
,
NULL
,
L3X_PREFIX
"_Q10"
,
"
\\
GL32"
,
L3X_PREFIX
"_Q0F"
,
L3X_PREFIX
"_Q0E"
,
"SPLV"
,
"GPLV"
,
"
\\
BLVL"
,
"SDSP"
,
"
\\
_SB.PCI0.PCI1.VGAC.NMAP"
},
{
"L
3D"
,
"MLED"
,
"
\\
MALD"
,
"WLED"
,
NULL
,
"
\\
Q10"
,
"
\\
BKLG"
,
"
\\
Q0
E"
,
"
\\
Q0F"
,
"SPLV"
,
"GPLV"
,
"
\\
BLVL"
,
"SDSP"
,
"
\\
INFB"
},
{
"L
5X"
,
"MLED"
,
NULL
,
"WLED"
,
"WRED"
,
"
\\
Q0D"
,
"
\\
BAOF"
,
"
\\
Q0
C"
,
"
\\
Q0B"
,
"SPLV"
,
"GPLV"
,
NULL
,
"SDSP"
,
"
\\
INFB"
},
{
"M2X"
,
"MLED"
,
NULL
,
"WLED"
,
NULL
,
"
\\
Q10"
,
"
\\
GP06"
,
"
\\
Q0E"
,
"
\\
Q0F"
,
"SPLV"
,
"GPLV"
,
NULL
,
"SDSP"
,
"
\\
INFB"
},
{
"M3N"
,
"MLED"
,
NULL
,
"WLED"
,
"
\\
PO33"
,
M3N_PREFIX
"_Q10"
,
"
\\
BKLT"
,
M3N_PREFIX
"_Q0F"
,
M3N_PREFIX
"_Q0E"
,
"SPLV"
,
"GPLV"
,
"
\\
LBTN"
,
"SDSP"
,
"
\\
ADVG"
},
{
"S1X"
,
"MLED"
,
"
\\
EMLE"
,
"WLED"
,
NULL
,
S1X_PREFIX
"Q10"
,
"
\\
PNOF"
,
S1X_PREFIX
"Q0F"
,
S1X_PREFIX
"Q0E"
,
"SPLV"
,
"GPLV"
,
"
\\
BRIT"
,
NULL
,
NULL
},
{
"D1X"
,
"MLED"
,
NULL
,
NULL
,
NULL
,
"
\\
Q0D"
,
"
\\
GP11"
,
"
\\
Q0C"
,
"
\\
Q0B"
,
NULL
,
NULL
,
"
\\
BLVL"
,
"SDSP"
,
"
\\
INFB"
},
{
"L1X"
,
"MLED"
,
NULL
,
"WLED"
,
NULL
,
L1X_PREFIX
"Q10"
,
"
\\
PNOF"
,
L1X_PREFIX
"Q0F"
,
L1X_PREFIX
"Q0E"
,
"SPLV"
,
"GPLV"
,
"
\\
BRIT"
,
NULL
,
NULL
},
{
"A1X"
,
"MLED"
,
"
\\
MAIL"
,
NULL
,
NULL
,
A1X_PREFIX
"_Q10"
,
"
\\
BKLI"
,
A1X_PREFIX
"_Q0E"
,
A1X_PREFIX
"_Q0F"
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
},
{
"J1X"
,
"MLED"
,
"
\\
MAIL"
,
NULL
,
NULL
,
J1X_PREFIX
"_Q10"
,
"
\\
BKLI"
,
J1X_PREFIX
"_Q0B"
,
J1X_PREFIX
"_Q0A"
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
}
{
"S2X"
,
"MLED"
,
"
\\
MAIL"
,
NULL
,
NULL
,
S2X_PREFIX
"_Q10"
,
"
\\
BKLI"
,
S2X_PREFIX
"_Q0B"
,
S2X_PREFIX
"_Q0A"
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
}
};
/* procdir we use */
...
...
@@ -234,7 +253,7 @@ static int read_acpi_int(acpi_handle handle, const char *method, int *val)
output
.
length
=
sizeof
(
out_obj
);
output
.
pointer
=
&
out_obj
;
status
=
acpi_evaluate_object
(
handle
,
(
char
*
)
method
,
NULL
,
&
output
);
status
=
acpi_evaluate_object
(
handle
,
(
char
*
)
method
,
NULL
,
&
output
);
*
val
=
out_obj
.
integer
.
value
;
return
(
status
==
AE_OK
)
&&
(
out_obj
.
type
==
ACPI_TYPE_INTEGER
);
}
...
...
@@ -249,6 +268,7 @@ proc_read_info(char *page, char **start, off_t off, int count, int *eof,
void
*
data
)
{
int
len
=
0
;
int
sfun
;
struct
asus_hotk
*
hotk
=
(
struct
asus_hotk
*
)
data
;
char
buf
[
16
];
//enough for all info
/*
...
...
@@ -257,28 +277,27 @@ proc_read_info(char *page, char **start, off_t off, int count, int *eof,
*/
len
+=
sprintf
(
page
,
ACPI_HOTK_NAME
" "
ASUS_ACPI_VERSION
"
\n
"
);
len
+=
sprintf
(
page
+
len
,
"Model reference : %s
\n
"
,
hotk
->
methods
->
name
);
len
+=
sprintf
(
page
+
len
,
"Model reference : %s
\n
"
,
hotk
->
methods
->
name
);
if
(
read_acpi_int
(
hotk
->
handle
,
"SFUN"
,
&
sfun
))
len
+=
sprintf
(
page
+
len
,
"SFUN value : 0x%04x
\n
"
,
sfun
);
if
(
asus_info
)
{
snprintf
(
buf
,
5
,
"%s"
,
asus_info
->
signature
);
len
+=
sprintf
(
page
+
len
,
"ACPI signature : %s
\n
"
,
buf
);
snprintf
(
buf
,
16
,
"%d"
,
asus_info
->
length
);
len
+=
sprintf
(
page
+
len
,
"Table length : %s
\n
"
,
buf
);
snprintf
(
buf
,
16
,
"%d"
,
asus_info
->
revision
);
len
+=
sprintf
(
page
+
len
,
"ACPI minor version : %s
\n
"
,
buf
);
len
+=
sprintf
(
page
+
len
,
"DSDT length : %s
\n
"
,
buf
);
snprintf
(
buf
,
16
,
"%d"
,
asus_info
->
checksum
);
len
+=
sprintf
(
page
+
len
,
"Checksum : %s
\n
"
,
buf
);
len
+=
sprintf
(
page
+
len
,
"DSDT checksum : %s
\n
"
,
buf
);
snprintf
(
buf
,
16
,
"%d"
,
asus_info
->
revision
);
len
+=
sprintf
(
page
+
len
,
"DSDT revision : %s
\n
"
,
buf
);
snprintf
(
buf
,
7
,
"%s"
,
asus_info
->
oem_id
);
len
+=
sprintf
(
page
+
len
,
"OEM id
entification
: %s
\n
"
,
buf
);
len
+=
sprintf
(
page
+
len
,
"OEM id
: %s
\n
"
,
buf
);
snprintf
(
buf
,
9
,
"%s"
,
asus_info
->
oem_table_id
);
len
+=
sprintf
(
page
+
len
,
"OEM table id : %s
\n
"
,
buf
);
snprintf
(
buf
,
16
,
"%x"
,
asus_info
->
oem_revision
);
len
+=
sprintf
(
page
+
len
,
"OEM rev
number
: 0x%s
\n
"
,
buf
);
len
+=
sprintf
(
page
+
len
,
"OEM rev
ision
: 0x%s
\n
"
,
buf
);
snprintf
(
buf
,
5
,
"%s"
,
asus_info
->
asl_compiler_id
);
len
+=
sprintf
(
page
+
len
,
"ASL comp vendor
ID
: %s
\n
"
,
buf
);
len
+=
sprintf
(
page
+
len
,
"ASL comp vendor
id
: %s
\n
"
,
buf
);
snprintf
(
buf
,
16
,
"%x"
,
asus_info
->
asl_compiler_revision
);
len
+=
sprintf
(
page
+
len
,
"ASL comp rev
number
: 0x%s
\n
"
,
buf
);
len
+=
sprintf
(
page
+
len
,
"ASL comp rev
ision
: 0x%s
\n
"
,
buf
);
}
return
len
;
...
...
@@ -304,7 +323,7 @@ proc_read_mled(char *page, char **start, off_t off, int count, int *eof,
&
led_status
))
len
=
sprintf
(
page
,
"%d
\n
"
,
led_status
);
else
printk
(
KERN_
NOTICE
"Asus ACPI: Error reading MLED "
printk
(
KERN_
WARNING
"Asus ACPI: Error reading MLED "
"status
\n
"
);
}
else
{
len
=
sprintf
(
page
,
"%d
\n
"
,
(
hotk
->
status
&
MLED_ON
)
?
1
:
0
);
...
...
@@ -334,7 +353,7 @@ proc_write_mled(struct file *file, const char *buffer,
/* We don't have to check mt_mled exists if we are here :) */
if
(
!
write_acpi_int
(
hotk
->
handle
,
hotk
->
methods
->
mt_mled
,
led_out
,
NULL
))
printk
(
KERN_
NOTICE
"Asus ACPI: MLED write failed
\n
"
);
printk
(
KERN_
WARNING
"Asus ACPI: MLED write failed
\n
"
);
...
...
@@ -355,11 +374,11 @@ proc_read_wled(char *page, char **start, off_t off, int count, int *eof,
int
led_status
;
if
(
hotk
->
methods
->
wled_status
)
{
if
(
read_acpi_int
(
NULL
,
hotk
->
methods
->
m
led_status
,
if
(
read_acpi_int
(
NULL
,
hotk
->
methods
->
w
led_status
,
&
led_status
))
len
=
sprintf
(
page
,
"%d
\n
"
,
led_status
);
else
printk
(
KERN_
NOTICE
"Asus ACPI: Error reading WLED "
printk
(
KERN_
WARNING
"Asus ACPI: Error reading WLED "
"status
\n
"
);
}
else
{
len
=
sprintf
(
page
,
"%d
\n
"
,
(
hotk
->
status
&
WLED_ON
)
?
1
:
0
);
...
...
@@ -386,7 +405,7 @@ proc_write_wled(struct file *file, const char *buffer,
/* We don't have to check if mt_wled exists if we are here :) */
if
(
!
write_acpi_int
(
hotk
->
handle
,
hotk
->
methods
->
mt_wled
,
led_out
,
NULL
))
printk
(
KERN_
NOTICE
"Asus ACPI: WLED write failed
\n
"
);
printk
(
KERN_
WARNING
"Asus ACPI: WLED write failed
\n
"
);
return
count
;
...
...
@@ -399,7 +418,7 @@ static int get_lcd_state(struct asus_hotk *hotk)
/* We don't have to check anything, if we are here */
if
(
!
read_acpi_int
(
NULL
,
hotk
->
methods
->
lcd_status
,
&
lcd
))
printk
(
KERN_
NOTICE
"Asus ACPI: Error reading LCD status
\n
"
);
printk
(
KERN_
WARNING
"Asus ACPI: Error reading LCD status
\n
"
);
if
(
hotk
->
model
==
L2X
)
lcd
=
~
lcd
;
...
...
@@ -438,7 +457,7 @@ proc_write_lcd(struct file *file, const char *buffer,
acpi_evaluate_object
(
NULL
,
hotk
->
methods
->
mt_lcd_switch
,
NULL
,
NULL
);
if
(
ACPI_FAILURE
(
status
))
printk
(
KERN_
NOTICE
"Asus ACPI: Error switching LCD
\n
"
);
printk
(
KERN_
WARNING
"Asus ACPI: Error switching LCD
\n
"
);
}
return
count
;
...
...
@@ -452,15 +471,15 @@ static void set_brightness(int value, struct asus_hotk *hotk)
{
acpi_status
status
=
0
;
/*
ATKD
laptop */
/*
SPLV
laptop */
if
(
hotk
->
methods
->
brightness_set
)
{
if
(
!
write_acpi_int
(
hotk
->
handle
,
hotk
->
methods
->
brightness_set
,
value
,
NULL
))
printk
(
KERN_
NOTICE
"Asus ACPI: Error changing brightness
\n
"
);
printk
(
KERN_
WARNING
"Asus ACPI: Error changing brightness
\n
"
);
return
;
}
/*
HOTK laptop
if we are here, act as appropriate */
/*
No SPLV method
if we are here, act as appropriate */
value
-=
hotk
->
brightness
;
while
(
value
!=
0
)
{
status
=
acpi_evaluate_object
(
NULL
,
(
value
>
0
)
?
...
...
@@ -469,7 +488,7 @@ static void set_brightness(int value, struct asus_hotk *hotk)
NULL
,
NULL
);
(
value
>
0
)
?
value
--
:
value
++
;
if
(
ACPI_FAILURE
(
status
))
printk
(
KERN_
NOTICE
"Asus ACPI: Error changing brightness
\n
"
);
printk
(
KERN_
WARNING
"Asus ACPI: Error changing brightness
\n
"
);
}
return
;
}
...
...
@@ -478,15 +497,15 @@ static int read_brightness(struct asus_hotk *hotk)
{
int
value
;
if
(
hotk
->
methods
->
brightness_get
)
{
/*
ATKD
laptop */
if
(
hotk
->
methods
->
brightness_get
)
{
/*
SPLV/GPLV
laptop */
if
(
!
read_acpi_int
(
hotk
->
handle
,
hotk
->
methods
->
brightness_get
,
&
value
))
printk
(
KERN_
NOTICE
"Asus ACPI: Error reading brightness
\n
"
);
printk
(
KERN_
WARNING
"Asus ACPI: Error reading brightness
\n
"
);
}
else
if
(
hotk
->
methods
->
brightness_status
)
{
/* For D1 for example */
if
(
!
read_acpi_int
(
NULL
,
hotk
->
methods
->
brightness_status
,
&
value
))
printk
(
KERN_
NOTICE
"Asus ACPI: Error reading brightness
\n
"
);
}
else
/*
HOTK laptop
*/
printk
(
KERN_
WARNING
"Asus ACPI: Error reading brightness
\n
"
);
}
else
/*
No GPLV method
*/
value
=
hotk
->
brightness
;
return
value
;
}
...
...
@@ -512,7 +531,7 @@ proc_write_brn(struct file *file, const char *buffer,
/* 0 <= value <= 15 */
set_brightness
(
value
,
hotk
);
}
else
{
printk
(
KERN_
NOTICE
"Asus ACPI: Error reading user input
\n
"
);
printk
(
KERN_
WARNING
"Asus ACPI: Error reading user input
\n
"
);
}
return
count
;
...
...
@@ -523,7 +542,7 @@ static void set_display(int value, struct asus_hotk *hotk)
/* no sanity check needed for now */
if
(
!
write_acpi_int
(
hotk
->
handle
,
hotk
->
methods
->
display_set
,
value
,
NULL
))
printk
(
KERN_
NOTICE
"Asus ACPI: Error setting display
\n
"
);
printk
(
KERN_
WARNING
"Asus ACPI: Error setting display
\n
"
);
return
;
}
...
...
@@ -540,12 +559,12 @@ proc_read_disp(char *page, char **start, off_t off, int count, int *eof,
struct
asus_hotk
*
hotk
=
(
struct
asus_hotk
*
)
data
;
if
(
!
read_acpi_int
(
hotk
->
handle
,
hotk
->
methods
->
display_get
,
&
value
))
printk
(
KERN_
NOTICE
"Asus ACPI: Error reading display status
\n
"
);
printk
(
KERN_
WARNING
"Asus ACPI: Error reading display status
\n
"
);
return
sprintf
(
page
,
"%d
\n
"
,
value
);
}
/*
*
Preliminary
support for display switching. As of now: 0x01 should activate
*
Experimental
support for display switching. As of now: 0x01 should activate
* the LCD output, 0x02 should do for CRT, and 0x04 for TV-Out. Any combination
* (bitwise) of these will suffice. I never actually tested 3 displays hooked up
* simultaneously, so be warned.
...
...
@@ -562,13 +581,13 @@ proc_write_disp(struct file *file, const char *buffer,
if
(
sscanf
(
buffer
,
"%d"
,
&
value
)
==
1
)
set_display
(
value
,
hotk
);
else
{
printk
(
KERN_
NOTICE
"Asus ACPI: Error reading user input
\n
"
);
printk
(
KERN_
WARNING
"Asus ACPI: Error reading user input
\n
"
);
}
return
count
;
}
static
int
asus_hotk_add_fs
(
struct
acpi_device
*
device
)
static
int
__init
asus_hotk_add_fs
(
struct
acpi_device
*
device
)
{
struct
proc_dir_entry
*
proc
;
struct
asus_hotk
*
hotk
=
acpi_driver_data
(
device
);
...
...
@@ -582,7 +601,7 @@ static int asus_hotk_add_fs(struct acpi_device *device)
if
((
asus_uid
==
0
)
&&
(
asus_gid
==
0
)){
mode
=
S_IFREG
|
S_IRUGO
|
S_IWUGO
;
}
else
{
}
else
{
mode
=
S_IFREG
|
S_IRUSR
|
S_IRGRP
|
S_IWUSR
|
S_IWGRP
;
}
...
...
@@ -598,7 +617,7 @@ static int asus_hotk_add_fs(struct acpi_device *device)
proc
->
uid
=
asus_uid
;
proc
->
gid
=
asus_gid
;;
}
else
{
printk
(
KERN_
NOTICE
" Unable to create "
PROC_INFOS
printk
(
KERN_
WARNING
" Unable to create "
PROC_INFOS
" fs entry
\n
"
);
}
...
...
@@ -612,7 +631,7 @@ static int asus_hotk_add_fs(struct acpi_device *device)
proc
->
uid
=
asus_uid
;
proc
->
gid
=
asus_gid
;;
}
else
{
printk
(
KERN_
NOTICE
" Unable to create "
PROC_WLED
printk
(
KERN_
WARNING
" Unable to create "
PROC_WLED
" fs entry
\n
"
);
}
}
...
...
@@ -627,7 +646,7 @@ static int asus_hotk_add_fs(struct acpi_device *device)
proc
->
uid
=
asus_uid
;
proc
->
gid
=
asus_gid
;;
}
else
{
printk
(
KERN_
NOTICE
" Unable to create "
PROC_MLED
printk
(
KERN_
WARNING
" Unable to create "
PROC_MLED
" fs entry
\n
"
);
}
}
...
...
@@ -646,7 +665,7 @@ static int asus_hotk_add_fs(struct acpi_device *device)
proc
->
uid
=
asus_uid
;
proc
->
gid
=
asus_gid
;;
}
else
{
printk
(
KERN_
NOTICE
" Unable to create "
PROC_LCD
printk
(
KERN_
WARNING
" Unable to create "
PROC_LCD
" fs entry
\n
"
);
}
}
...
...
@@ -662,7 +681,7 @@ static int asus_hotk_add_fs(struct acpi_device *device)
proc
->
uid
=
asus_uid
;
proc
->
gid
=
asus_gid
;;
}
else
{
printk
(
KERN_
NOTICE
" Unable to create "
PROC_BRN
printk
(
KERN_
WARNING
" Unable to create "
PROC_BRN
" fs entry
\n
"
);
}
}
...
...
@@ -677,19 +696,19 @@ static int asus_hotk_add_fs(struct acpi_device *device)
proc
->
uid
=
asus_uid
;
proc
->
gid
=
asus_gid
;;
}
else
{
printk
(
KERN_
NOTICE
" Unable to create "
PROC_DISP
printk
(
KERN_
WARNING
" Unable to create "
PROC_DISP
" fs entry
\n
"
);
}
}
return
(
AE_OK
)
;
return
0
;
}
static
void
asus_hotk_notify
(
acpi_handle
handle
,
u32
event
,
void
*
data
)
{
/* TODO Find a better way to handle events count. Here, in data, we receive
* the hotk, so we can
make anything !
!
* the hotk, so we can
do anything
!
*/
struct
asus_hotk
*
hotk
=
(
struct
asus_hotk
*
)
data
;
...
...
@@ -712,19 +731,40 @@ static void asus_hotk_notify(acpi_handle handle, u32 event, void *data)
* This function is used to initialize the hotk with right values. In this
* method, we can make all the detection we want, and modify the hotk struct
*/
static
int
asus_hotk_get_info
(
struct
asus_hotk
*
hotk
)
static
int
__init
asus_hotk_get_info
(
struct
asus_hotk
*
hotk
)
{
struct
acpi_buffer
buffer
=
{
ACPI_ALLOCATE_BUFFER
,
NULL
};
struct
acpi_buffer
dsdt
=
{
ACPI_ALLOCATE_BUFFER
,
NULL
};
union
acpi_object
*
model
=
NULL
;
int
bsts_result
;
acpi_status
status
;
/*
* We have to write 0 on init this far for all ASUS models
/*
* Get DSDT headers early enough to allow for differentiating between
* models, but late enough to allow acpi_bus_register_driver() to fail
* before doing anything ACPI-specific. Should we encounter a machine,
* which needs special handling (i.e. its hotkey device has a different
* HID), this bit will be moved. A global variable asus_info contains
* the DSDT header.
*/
status
=
acpi_get_table
(
ACPI_TABLE_DSDT
,
1
,
&
dsdt
);
if
(
ACPI_FAILURE
(
status
))
printk
(
KERN_WARNING
" Couldn't get the DSDT table header
\n
"
);
else
asus_info
=
(
struct
acpi_table_header
*
)
dsdt
.
pointer
;
/* We have to write 0 on init this far for all ASUS models */
if
(
!
write_acpi_int
(
hotk
->
handle
,
"INIT"
,
0
,
&
buffer
))
{
printk
(
KERN_
NOTICE
" Hotkey initialization failed
\n
"
);
printk
(
KERN_
ERR
" Hotkey initialization failed
\n
"
);
return
-
ENODEV
;
}
/* For testing purposes */
if
(
!
read_acpi_int
(
hotk
->
handle
,
"BSTS"
,
&
bsts_result
))
printk
(
KERN_WARNING
" Error calling BSTS
\n
"
);
else
if
(
bsts_result
)
printk
(
KERN_NOTICE
" BSTS called, 0x%02x returned
\n
"
,
bsts_result
);
/*
* Here, we also use asus_info to make decision. For example, on INIT
* method, S1X and L1X models both reports to be L84F, but they don't
...
...
@@ -749,26 +789,34 @@ static int asus_hotk_get_info(struct asus_hotk *hotk)
hotk
->
model
=
L3X
;
else
if
(
strncmp
(
model
->
string
.
pointer
,
"M2"
,
2
)
==
0
)
hotk
->
model
=
M2X
;
else
if
(
strncmp
(
model
->
string
.
pointer
,
"M3N"
,
3
)
==
0
||
strncmp
(
model
->
string
.
pointer
,
"S1N"
,
3
)
==
0
)
hotk
->
model
=
M3N
;
/* S1300N is similar enough */
else
if
(
strncmp
(
model
->
string
.
pointer
,
"L2"
,
2
)
==
0
)
hotk
->
model
=
L2X
;
else
if
(
strncmp
(
model
->
string
.
pointer
,
"L8"
,
2
)
==
0
)
else
if
(
strncmp
(
model
->
string
.
pointer
,
"L8"
,
2
)
==
0
)
{
/* S1300A reports L84F, but L1400B too */
if
(
strncmp
(
asus_info
->
oem_table_id
,
"L1"
,
2
)
==
0
)
hotk
->
model
=
L1X
;
else
if
(
asus_info
)
{
if
(
strncmp
(
asus_info
->
oem_table_id
,
"L1"
,
2
)
==
0
)
hotk
->
model
=
L1X
;
}
else
hotk
->
model
=
S1X
;
}
else
if
(
strncmp
(
model
->
string
.
pointer
,
"D1"
,
2
)
==
0
)
hotk
->
model
=
D1X
;
else
if
(
strncmp
(
model
->
string
.
pointer
,
"A1"
,
2
)
==
0
)
hotk
->
model
=
A1X
;
else
if
(
strncmp
(
model
->
string
.
pointer
,
"A2"
,
2
)
==
0
)
hotk
->
model
=
A2X
;
else
if
(
strncmp
(
model
->
string
.
pointer
,
"J1"
,
2
)
==
0
)
hotk
->
model
=
J1X
;
hotk
->
model
=
S2X
;
else
if
(
strncmp
(
model
->
string
.
pointer
,
"L5"
,
2
)
==
0
)
hotk
->
model
=
L5X
;
if
(
hotk
->
model
==
END_MODEL
)
{
/* By default use the same values, as I don't know others */
printk
(
"unsupported, trying default values,
contact
the "
"developers
\n
"
);
printk
(
"unsupported, trying default values,
supply
the "
"developers
with your DSDT
\n
"
);
hotk
->
model
=
L2X
;
}
else
{
printk
(
"supported
\n
"
);
...
...
@@ -783,7 +831,7 @@ static int asus_hotk_get_info(struct asus_hotk *hotk)
static
int
asus_hotk_check
(
struct
asus_hotk
*
hotk
)
static
int
__init
asus_hotk_check
(
struct
asus_hotk
*
hotk
)
{
int
result
=
0
;
...
...
@@ -797,7 +845,7 @@ static int asus_hotk_check(struct asus_hotk *hotk)
if
(
hotk
->
device
->
status
.
present
)
{
result
=
asus_hotk_get_info
(
hotk
);
}
else
{
printk
(
KERN_
NOTICE
" Hotkey device not present, aborting
\n
"
);
printk
(
KERN_
ERR
" Hotkey device not present, aborting
\n
"
);
return
(
-
EINVAL
);
}
...
...
@@ -806,7 +854,7 @@ static int asus_hotk_check(struct asus_hotk *hotk)
static
int
asus_hotk_add
(
struct
acpi_device
*
device
)
static
int
__init
asus_hotk_add
(
struct
acpi_device
*
device
)
{
struct
asus_hotk
*
hotk
=
NULL
;
acpi_status
status
=
AE_OK
;
...
...
@@ -815,6 +863,9 @@ static int asus_hotk_add(struct acpi_device *device)
if
(
!
device
)
return
(
-
EINVAL
);
printk
(
KERN_NOTICE
"Asus Laptop ACPI Extras version %s
\n
"
,
ASUS_ACPI_VERSION
);
hotk
=
(
struct
asus_hotk
*
)
kmalloc
(
sizeof
(
struct
asus_hotk
),
GFP_KERNEL
);
if
(
!
hotk
)
...
...
@@ -842,25 +893,23 @@ static int asus_hotk_add(struct acpi_device *device)
*/
status
=
acpi_install_notify_handler
(
hotk
->
handle
,
ACPI_SYSTEM_NOTIFY
,
asus_hotk_notify
,
hotk
);
if
(
ACPI_FAILURE
(
status
))
{
printk
(
KERN_NOTICE
" Error installing notify handler
\n
"
);
}
else
{
printk
(
KERN_DEBUG
" Notify Handler installed successfully
\n
"
);
}
if
(
ACPI_FAILURE
(
status
))
printk
(
KERN_ERR
" Error installing notify handler
\n
"
);
/* For
HOTK laptops
: init the hotk->brightness value */
/* For
laptops without GPLV
: init the hotk->brightness value */
if
((
!
hotk
->
methods
->
brightness_get
)
&&
(
!
hotk
->
methods
->
brightness_status
)
&&
(
hotk
->
methods
->
brightness_up
&&
hotk
->
methods
->
brightness_down
))
{
status
=
acpi_evaluate_object
(
NULL
,
hotk
->
methods
->
brightness_down
,
NULL
,
NULL
);
if
(
ACPI_FAILURE
(
status
))
printk
(
KERN_NOTICE
" Error changing brightness
\n
"
);
status
=
acpi_evaluate_object
(
NULL
,
hotk
->
methods
->
brightness_up
,
NULL
,
NULL
);
if
(
ACPI_FAILURE
(
status
))
printk
(
KERN_NOTICE
" Error changing brightness
\n
"
);
printk
(
KERN_WARNING
" Error changing brightness
\n
"
);
else
{
status
=
acpi_evaluate_object
(
NULL
,
hotk
->
methods
->
brightness_up
,
NULL
,
NULL
);
if
(
ACPI_FAILURE
(
status
))
printk
(
KERN_WARNING
" Strange, error changing"
" brightness
\n
"
);
}
}
end:
...
...
@@ -887,7 +936,7 @@ static int asus_hotk_remove(struct acpi_device *device, int type)
status
=
acpi_remove_notify_handler
(
hotk
->
handle
,
ACPI_SYSTEM_NOTIFY
,
asus_hotk_notify
);
if
(
ACPI_FAILURE
(
status
))
printk
(
KERN_
NOTICE
"
Error removing notify handler
\n
"
);
printk
(
KERN_
ERR
"Asus ACPI:
Error removing notify handler
\n
"
);
kfree
(
hotk
);
...
...
@@ -899,35 +948,17 @@ static int asus_hotk_remove(struct acpi_device *device, int type)
static
int
__init
asus_acpi_init
(
void
)
{
int
result
=
0
;
acpi_status
status
=
0
;
struct
acpi_buffer
dsdt
=
{
ACPI_ALLOCATE_BUFFER
,
NULL
};
printk
(
KERN_NOTICE
"Asus Laptop ACPI Extras version %s
\n
"
,
ASUS_ACPI_VERSION
);
/*
* Here is the code to know the model we are running on. We need to
* know this before calling the acpi_bus_register_driver function, in
* case the HID for the laptop we are running on is different from
* ACPI_HOTK_HID, which I have never seen yet :)
*
* This information is then available in the global var asus_info
*/
status
=
acpi_get_table
(
ACPI_TABLE_DSDT
,
1
,
&
dsdt
);
if
(
ACPI_FAILURE
(
status
))
{
printk
(
KERN_NOTICE
" Couldn't get the DSDT table header
\n
"
);
}
else
{
asus_info
=
(
struct
acpi_table_header
*
)
dsdt
.
pointer
;
}
int
result
;
asus_proc_dir
=
proc_mkdir
(
PROC_ASUS
,
acpi_root_dir
);
if
(
!
asus_proc_dir
)
if
(
!
asus_proc_dir
)
{
printk
(
KERN_ERR
"Asus ACPI: Unable to create /proc entry"
);
return
(
-
ENODEV
);
}
asus_proc_dir
->
owner
=
THIS_MODULE
;
result
=
acpi_bus_register_driver
(
&
asus_hotk_driver
);
if
(
result
<
0
)
{
printk
(
KERN_NOTICE
" Error registering "
ACPI_HOTK_NAME
"
\n
"
);
remove_proc_entry
(
PROC_ASUS
,
acpi_root_dir
);
return
(
-
ENODEV
);
}
...
...
drivers/acpi/bus.c
View file @
f028ebf3
...
...
@@ -634,8 +634,7 @@ acpi_bus_init (void)
* the EC parameters out of that.
*/
status
=
acpi_ec_ecdt_probe
();
if
(
ACPI_FAILURE
(
status
))
goto
error1
;
/* Ignore result. Not having an ECDT is not fatal. */
#endif
status
=
acpi_initialize_objects
(
ACPI_FULL_INITIALIZATION
);
...
...
drivers/acpi/dispatcher/dsfield.c
View file @
f028ebf3
...
...
@@ -105,27 +105,33 @@ acpi_ds_create_buffer_field (
return_ACPI_STATUS
(
AE_AML_NO_OPERAND
);
}
/*
* During the load phase, we want to enter the name of the field into
* the namespace. During the execute phase (when we evaluate the size
* operand), we want to lookup the name
*/
if
(
walk_state
->
parse_flags
&
ACPI_PARSE_EXECUTE
)
{
flags
=
ACPI_NS_NO_UPSEARCH
|
ACPI_NS_DONT_OPEN_SCOPE
;
if
(
walk_state
->
deferred_node
)
{
node
=
walk_state
->
deferred_node
;
status
=
AE_OK
;
}
else
{
flags
=
ACPI_NS_NO_UPSEARCH
|
ACPI_NS_DONT_OPEN_SCOPE
|
ACPI_NS_ERROR_IF_FOUND
;
}
/*
* During the load phase, we want to enter the name of the field into
* the namespace. During the execute phase (when we evaluate the size
* operand), we want to lookup the name
*/
if
(
walk_state
->
parse_flags
&
ACPI_PARSE_EXECUTE
)
{
flags
=
ACPI_NS_NO_UPSEARCH
|
ACPI_NS_DONT_OPEN_SCOPE
;
}
else
{
flags
=
ACPI_NS_NO_UPSEARCH
|
ACPI_NS_DONT_OPEN_SCOPE
|
ACPI_NS_ERROR_IF_FOUND
;
}
/*
* Enter the name_string into the namespace
*/
status
=
acpi_ns_lookup
(
walk_state
->
scope_info
,
arg
->
common
.
value
.
string
,
ACPI_TYPE_ANY
,
ACPI_IMODE_LOAD_PASS1
,
flags
,
walk_state
,
&
(
node
));
if
(
ACPI_FAILURE
(
status
))
{
ACPI_REPORT_NSERROR
(
arg
->
common
.
value
.
string
,
status
);
return_ACPI_STATUS
(
status
);
/*
* Enter the name_string into the namespace
*/
status
=
acpi_ns_lookup
(
walk_state
->
scope_info
,
arg
->
common
.
value
.
string
,
ACPI_TYPE_ANY
,
ACPI_IMODE_LOAD_PASS1
,
flags
,
walk_state
,
&
(
node
));
if
(
ACPI_FAILURE
(
status
))
{
ACPI_REPORT_NSERROR
(
arg
->
common
.
value
.
string
,
status
);
return_ACPI_STATUS
(
status
);
}
}
/* We could put the returned object (Node) on the object stack for later, but
...
...
drivers/acpi/dispatcher/dsinit.c
View file @
f028ebf3
...
...
@@ -135,7 +135,7 @@ acpi_ds_init_one_object (
}
/*
* Always parse methods to detect errors, we
may
delete
* Always parse methods to detect errors, we
will
delete
* the parse tree below
*/
status
=
acpi_ds_parse_method
(
obj_handle
);
...
...
@@ -150,7 +150,7 @@ acpi_ds_init_one_object (
}
/*
* Delete the parse tree. We simpl
e
re-parse the method
* Delete the parse tree. We simpl
y
re-parse the method
* for every execution since there isn't much overhead
*/
acpi_ns_delete_namespace_subtree
(
obj_handle
);
...
...
drivers/acpi/dispatcher/dsopcode.c
View file @
f028ebf3
...
...
@@ -65,7 +65,7 @@
*
* RETURN: Status.
*
* DESCRIPTION: Late execution of region or field arguments
* DESCRIPTION: Late
(deferred)
execution of region or field arguments
*
****************************************************************************/
...
...
@@ -111,7 +111,10 @@ acpi_ds_execute_arguments (
return_ACPI_STATUS
(
status
);
}
/* Mark this parse as a deferred opcode */
walk_state
->
parse_flags
=
ACPI_PARSE_DEFERRED_OP
;
walk_state
->
deferred_node
=
node
;
/* Pass1: Parse the entire declaration */
...
...
@@ -128,7 +131,7 @@ acpi_ds_execute_arguments (
arg
->
common
.
node
=
node
;
acpi_ps_delete_parse_tree
(
op
);
/* Evaluate the
address and length arguments for the Buffer Field
*/
/* Evaluate the
deferred arguments
*/
op
=
acpi_ps_alloc_op
(
AML_INT_EVAL_SUBTREE_OP
);
if
(
!
op
)
{
...
...
@@ -144,6 +147,8 @@ acpi_ds_execute_arguments (
return_ACPI_STATUS
(
AE_NO_MEMORY
);
}
/* Execute the opcode and arguments */
status
=
acpi_ds_init_aml_walk
(
walk_state
,
op
,
NULL
,
aml_start
,
aml_length
,
NULL
,
NULL
,
3
);
if
(
ACPI_FAILURE
(
status
))
{
...
...
@@ -151,6 +156,9 @@ acpi_ds_execute_arguments (
return_ACPI_STATUS
(
status
);
}
/* Mark this execution as a deferred opcode */
walk_state
->
deferred_node
=
node
;
status
=
acpi_ps_parse_aml
(
walk_state
);
acpi_ps_delete_parse_tree
(
op
);
return_ACPI_STATUS
(
status
);
...
...
@@ -192,7 +200,7 @@ acpi_ds_get_buffer_field_arguments (
node
=
obj_desc
->
buffer_field
.
node
;
ACPI_DEBUG_EXEC
(
acpi_ut_display_init_pathname
(
ACPI_TYPE_BUFFER_FIELD
,
node
,
NULL
));
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"[%4.4s] buffer_field
JIT
Init
\n
"
,
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"[%4.4s] buffer_field
Arg
Init
\n
"
,
node
->
name
.
ascii
));
/* Execute the AML code for the term_arg arguments */
...
...
@@ -207,7 +215,7 @@ acpi_ds_get_buffer_field_arguments (
*
* FUNCTION: acpi_ds_get_buffer_arguments
*
* PARAMETERS: obj_desc - A valid Bufferobject
* PARAMETERS: obj_desc - A valid Buffer
object
*
* RETURN: Status.
*
...
...
@@ -240,7 +248,7 @@ acpi_ds_get_buffer_arguments (
return_ACPI_STATUS
(
AE_AML_INTERNAL
);
}
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"Buffer
JIT
Init
\n
"
));
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"Buffer
Arg
Init
\n
"
));
/* Execute the AML code for the term_arg arguments */
...
...
@@ -254,7 +262,7 @@ acpi_ds_get_buffer_arguments (
*
* FUNCTION: acpi_ds_get_package_arguments
*
* PARAMETERS: obj_desc - A valid Packageobject
* PARAMETERS: obj_desc - A valid Package
object
*
* RETURN: Status.
*
...
...
@@ -287,7 +295,7 @@ acpi_ds_get_package_arguments (
return_ACPI_STATUS
(
AE_AML_INTERNAL
);
}
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"Package
JIT
Init
\n
"
));
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"Package
Arg
Init
\n
"
));
/* Execute the AML code for the term_arg arguments */
...
...
@@ -335,11 +343,12 @@ acpi_ds_get_region_arguments (
node
=
obj_desc
->
region
.
node
;
ACPI_DEBUG_EXEC
(
acpi_ut_display_init_pathname
(
ACPI_TYPE_REGION
,
node
,
NULL
));
ACPI_DEBUG_EXEC
(
acpi_ut_display_init_pathname
(
ACPI_TYPE_REGION
,
node
,
NULL
));
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"[%4.4s] op_region Init at AML %p
\n
"
,
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"[%4.4s] op_region
Arg
Init at AML %p
\n
"
,
node
->
name
.
ascii
,
extra_desc
->
extra
.
aml_start
));
/* Execute the argument AML */
status
=
acpi_ds_execute_arguments
(
node
,
acpi_ns_get_parent_node
(
node
),
extra_desc
->
extra
.
aml_length
,
extra_desc
->
extra
.
aml_start
);
...
...
@@ -505,14 +514,16 @@ acpi_ds_init_buffer_field (
goto
cleanup
;
}
/* Entire field must fit within the current length of the buffer */
if
((
bit_offset
+
bit_count
)
>
(
8
*
(
u32
)
buffer_desc
->
buffer
.
length
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"Field size %d exceeds Buffer size %d (bits)
\n
"
,
bit_offset
+
bit_count
,
8
*
(
u32
)
buffer_desc
->
buffer
.
length
));
"Field [%4.4s] size %d exceeds Buffer [%4.4s] size %d (bits)
\n
"
,
((
struct
acpi_namespace_node
*
)
result_desc
)
->
name
.
ascii
,
bit_offset
+
bit_count
,
buffer_desc
->
buffer
.
node
->
name
.
ascii
,
8
*
(
u32
)
buffer_desc
->
buffer
.
length
));
status
=
AE_AML_BUFFER_LIMIT
;
goto
cleanup
;
}
...
...
drivers/acpi/dispatcher/dsutils.c
View file @
f028ebf3
...
...
@@ -53,6 +53,7 @@
#define _COMPONENT ACPI_DISPATCHER
ACPI_MODULE_NAME
(
"dsutils"
)
#ifndef ACPI_NO_METHOD_EXECUTION
/*******************************************************************************
...
...
@@ -196,7 +197,6 @@ acpi_ds_is_result_used (
acpi_ps_get_opcode_name
(
op
->
common
.
parent
->
common
.
aml_opcode
),
op
));
return_VALUE
(
FALSE
);
}
...
...
@@ -239,7 +239,6 @@ acpi_ds_delete_result_if_not_used (
return_VOID
;
}
if
(
!
acpi_ds_is_result_used
(
op
,
walk_state
))
{
/*
* Must pop the result stack (obj_desc should be equal to result_obj)
...
...
@@ -389,61 +388,77 @@ acpi_ds_create_operand (
* in name_string
*/
/*
* Differentiate between a namespace "create" operation
* versus a "lookup" operation (IMODE_LOAD_PASS2 vs.
* IMODE_EXECUTE) in order to support the creation of
* namespace objects during the execution of control methods.
* Special handling for buffer_field declarations. This is a deferred
* opcode that unfortunately defines the field name as the last
* parameter instead of the first. We get here when we are performing
* the deferred execution, so the actual name of the field is already
* in the namespace. We don't want to attempt to look it up again
* because we may be executing in a different scope than where the
* actual opcode exists.
*/
parent_op
=
arg
->
common
.
parent
;
op_info
=
acpi_ps_get_opcode_info
(
parent_op
->
common
.
aml_opcode
);
if
((
op_info
->
flags
&
AML_NSNODE
)
&&
(
parent_op
->
common
.
aml_opcode
!=
AML_INT_METHODCALL_OP
)
&&
(
parent_op
->
common
.
aml_opcode
!=
AML_REGION_OP
)
&&
(
parent_op
->
common
.
aml_opcode
!=
AML_INT_NAMEPATH_OP
))
{
/* Enter name into namespace if not found */
interpreter_mode
=
ACPI_IMODE_LOAD_PASS2
;
}
else
{
/* Return a failure if name not found */
interpreter_mode
=
ACPI_IMODE_EXECUTE
;
if
((
walk_state
->
deferred_node
)
&&
(
walk_state
->
deferred_node
->
type
==
ACPI_TYPE_BUFFER_FIELD
)
&&
(
arg_index
!=
0
))
{
obj_desc
=
ACPI_CAST_PTR
(
union
acpi_operand_object
,
walk_state
->
deferred_node
);
status
=
AE_OK
;
}
else
/* All other opcodes */
{
/*
* Differentiate between a namespace "create" operation
* versus a "lookup" operation (IMODE_LOAD_PASS2 vs.
* IMODE_EXECUTE) in order to support the creation of
* namespace objects during the execution of control methods.
*/
parent_op
=
arg
->
common
.
parent
;
op_info
=
acpi_ps_get_opcode_info
(
parent_op
->
common
.
aml_opcode
);
if
((
op_info
->
flags
&
AML_NSNODE
)
&&
(
parent_op
->
common
.
aml_opcode
!=
AML_INT_METHODCALL_OP
)
&&
(
parent_op
->
common
.
aml_opcode
!=
AML_REGION_OP
)
&&
(
parent_op
->
common
.
aml_opcode
!=
AML_INT_NAMEPATH_OP
))
{
/* Enter name into namespace if not found */
interpreter_mode
=
ACPI_IMODE_LOAD_PASS2
;
}
else
{
/* Return a failure if name not found */
status
=
acpi_ns_lookup
(
walk_state
->
scope_info
,
name_string
,
ACPI_TYPE_ANY
,
interpreter_mode
,
ACPI_NS_SEARCH_PARENT
|
ACPI_NS_DONT_OPEN_SCOPE
,
walk_state
,
ACPI_CAST_INDIRECT_PTR
(
struct
acpi_namespace_node
,
&
obj_desc
));
/*
* The only case where we pass through (ignore) a NOT_FOUND
* error is for the cond_ref_of opcode.
*/
if
(
status
==
AE_NOT_FOUND
)
{
if
(
parent_op
->
common
.
aml_opcode
==
AML_COND_REF_OF_OP
)
{
/*
* For the Conditional Reference op, it's OK if
* the name is not found; We just need a way to
* indicate this to the interpreter, set the
* object to the root
*/
obj_desc
=
ACPI_CAST_PTR
(
union
acpi_operand_object
,
acpi_gbl_root_node
);
status
=
AE_OK
;
interpreter_mode
=
ACPI_IMODE_EXECUTE
;
}
else
{
/*
* We just plain didn't find it -- which is a
* very serious error at this point
*/
status
=
AE_AML_NAME_NOT_FOUND
;
status
=
acpi_ns_lookup
(
walk_state
->
scope_info
,
name_string
,
ACPI_TYPE_ANY
,
interpreter_mode
,
ACPI_NS_SEARCH_PARENT
|
ACPI_NS_DONT_OPEN_SCOPE
,
walk_state
,
ACPI_CAST_INDIRECT_PTR
(
struct
acpi_namespace_node
,
&
obj_desc
));
/*
* The only case where we pass through (ignore) a NOT_FOUND
* error is for the cond_ref_of opcode.
*/
if
(
status
==
AE_NOT_FOUND
)
{
if
(
parent_op
->
common
.
aml_opcode
==
AML_COND_REF_OF_OP
)
{
/*
* For the Conditional Reference op, it's OK if
* the name is not found; We just need a way to
* indicate this to the interpreter, set the
* object to the root
*/
obj_desc
=
ACPI_CAST_PTR
(
union
acpi_operand_object
,
acpi_gbl_root_node
);
status
=
AE_OK
;
}
else
{
/*
* We just plain didn't find it -- which is a
* very serious error at this point
*/
status
=
AE_AML_NAME_NOT_FOUND
;
}
}
}
if
(
ACPI_FAILURE
(
status
))
{
ACPI_REPORT_NSERROR
(
name_string
,
status
);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_REPORT_NSERROR
(
name_string
,
status
);
}
}
/* Free the namestring created above */
...
...
@@ -464,8 +479,6 @@ acpi_ds_create_operand (
}
ACPI_DEBUGGER_EXEC
(
acpi_db_display_argument_object
(
obj_desc
,
walk_state
));
}
else
{
/* Check for null name case */
...
...
@@ -480,7 +493,6 @@ acpi_ds_create_operand (
ACPI_DEBUG_PRINT
((
ACPI_DB_DISPATCH
,
"Null namepath: Arg=%p
\n
"
,
arg
));
}
else
{
opcode
=
arg
->
common
.
aml_opcode
;
}
...
...
drivers/acpi/dispatcher/dswload.c
View file @
f028ebf3
...
...
@@ -248,6 +248,14 @@ acpi_ds_load1_begin_op (
* buffer_field, or Package), the name of the object is already
* in the namespace.
*/
if
(
walk_state
->
deferred_node
)
{
/* This name is already in the namespace, get the node */
node
=
walk_state
->
deferred_node
;
status
=
AE_OK
;
break
;
}
flags
=
ACPI_NS_NO_UPSEARCH
;
if
((
walk_state
->
opcode
!=
AML_SCOPE_OP
)
&&
(
!
(
walk_state
->
parse_flags
&
ACPI_PARSE_DEFERRED_OP
)))
{
...
...
@@ -589,7 +597,17 @@ acpi_ds_load2_begin_op (
* Enter the named type into the internal namespace. We enter the name
* as we go downward in the parse tree. Any necessary subobjects that involve
* arguments to the opcode must be created as we go back up the parse tree later.
*
* Note: Name may already exist if we are executing a deferred opcode.
*/
if
(
walk_state
->
deferred_node
)
{
/* This name is already in the namespace, get the node */
node
=
walk_state
->
deferred_node
;
status
=
AE_OK
;
break
;
}
status
=
acpi_ns_lookup
(
walk_state
->
scope_info
,
buffer_ptr
,
object_type
,
ACPI_IMODE_EXECUTE
,
ACPI_NS_NO_UPSEARCH
,
walk_state
,
&
(
node
));
break
;
...
...
drivers/acpi/dispatcher/dswscope.c
View file @
f028ebf3
...
...
@@ -121,10 +121,9 @@ acpi_ds_scope_stack_push (
/* Make sure object type is valid */
if
(
!
acpi_ut_valid_object_type
(
type
))
{
ACPI_REPORT_WARNING
((
"ds_scope_stack_push:
type code out of range
\n
"
));
ACPI_REPORT_WARNING
((
"ds_scope_stack_push:
Invalid object type: 0x%X
\n
"
,
type
));
}
/* Allocate a new scope object */
scope_info
=
acpi_ut_create_generic_state
();
...
...
@@ -146,13 +145,13 @@ acpi_ds_scope_stack_push (
old_scope_info
=
walk_state
->
scope_info
;
if
(
old_scope_info
)
{
ACPI_DEBUG_PRINT_RAW
((
ACPI_DB_EXEC
,
"[%4.4s] (%
10
s)"
,
"[%4.4s] (%s)"
,
old_scope_info
->
scope
.
node
->
name
.
ascii
,
acpi_ut_get_type_name
(
old_scope_info
->
common
.
value
)));
}
else
{
ACPI_DEBUG_PRINT_RAW
((
ACPI_DB_EXEC
,
"[
\\
___] (%
10
s)"
,
"ROOT"
));
"[
\\
___] (%s)"
,
"ROOT"
));
}
ACPI_DEBUG_PRINT_RAW
((
ACPI_DB_EXEC
,
...
...
@@ -163,7 +162,6 @@ acpi_ds_scope_stack_push (
/* Push new scope object onto stack */
acpi_ut_push_generic_state
(
&
walk_state
->
scope_info
,
scope_info
);
return_ACPI_STATUS
(
AE_OK
);
}
...
...
@@ -207,7 +205,7 @@ acpi_ds_scope_stack_pop (
walk_state
->
scope_depth
--
;
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"[%.2d] Popped scope [%4.4s] (%
10
s), New scope -> "
,
"[%.2d] Popped scope [%4.4s] (%s), New scope -> "
,
(
u32
)
walk_state
->
scope_depth
,
scope_info
->
scope
.
node
->
name
.
ascii
,
acpi_ut_get_type_name
(
scope_info
->
common
.
value
)));
...
...
@@ -225,7 +223,6 @@ acpi_ds_scope_stack_pop (
}
acpi_ut_delete_generic_state
(
scope_info
);
return_ACPI_STATUS
(
AE_OK
);
}
...
...
drivers/acpi/dispatcher/dswstate.c
View file @
f028ebf3
...
...
@@ -56,11 +56,12 @@
* FUNCTION: acpi_ds_result_insert
*
* PARAMETERS: Object - Object to push
* Index - Where to insert the object
* walk_state - Current Walk state
*
* RETURN: Status
*
* DESCRIPTION:
Push
an object onto this walk's result stack
* DESCRIPTION:
Insert
an object onto this walk's result stack
*
******************************************************************************/
...
...
@@ -114,6 +115,7 @@ acpi_ds_result_insert (
* FUNCTION: acpi_ds_result_remove
*
* PARAMETERS: Object - Where to return the popped object
* Index - Where to extract the object
* walk_state - Current Walk state
*
* RETURN: Status
...
...
@@ -233,6 +235,7 @@ acpi_ds_result_pop (
return
(
AE_AML_NO_RETURN_VALUE
);
}
/*******************************************************************************
*
* FUNCTION: acpi_ds_result_pop_from_bottom
...
...
@@ -295,7 +298,6 @@ acpi_ds_result_pop_from_bottom (
*
object
,
(
*
object
)
?
acpi_ut_get_object_type_name
(
*
object
)
:
"NULL"
,
state
,
walk_state
));
return
(
AE_OK
);
}
...
...
@@ -358,8 +360,7 @@ acpi_ds_result_push (
*
* FUNCTION: acpi_ds_result_stack_push
*
* PARAMETERS: Object - Object to push
* walk_state - Current Walk state
* PARAMETERS: walk_state - Current Walk state
*
* RETURN: Status
*
...
...
@@ -420,7 +421,6 @@ acpi_ds_result_stack_pop (
return
(
AE_AML_NO_OPERAND
);
}
state
=
acpi_ut_pop_generic_state
(
&
walk_state
->
results
);
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
...
...
@@ -572,6 +572,7 @@ acpi_ds_obj_stack_pop_object (
}
#endif
/*******************************************************************************
*
* FUNCTION: acpi_ds_obj_stack_pop
...
...
@@ -641,6 +642,7 @@ acpi_ds_obj_stack_pop_and_delete (
u32
i
;
union
acpi_operand_object
*
obj_desc
;
ACPI_FUNCTION_NAME
(
"ds_obj_stack_pop_and_delete"
);
...
...
@@ -883,8 +885,15 @@ acpi_ds_create_walk_state (
* FUNCTION: acpi_ds_init_aml_walk
*
* PARAMETERS: walk_state - New state to be initialized
* Op - Current parse op
* method_node - Control method NS node, if any
* aml_start - Start of AML
* aml_length - Length of AML
* Params - Method args, if any
* return_obj_desc - Where to store a return object, if any
* pass_number - 1, 2, or 3
*
* RETURN:
None
* RETURN:
Status
*
* DESCRIPTION: Initialize a walk state for a pass 1 or 2 parse tree walk
*
...
...
@@ -927,9 +936,9 @@ acpi_ds_init_aml_walk (
if
(
method_node
)
{
walk_state
->
parser_state
.
start_node
=
method_node
;
walk_state
->
walk_type
=
ACPI_WALK_METHOD
;
walk_state
->
method_node
=
method_node
;
walk_state
->
method_desc
=
acpi_ns_get_attached_object
(
method_node
);
walk_state
->
walk_type
=
ACPI_WALK_METHOD
;
walk_state
->
method_node
=
method_node
;
walk_state
->
method_desc
=
acpi_ns_get_attached_object
(
method_node
);
/* Push start scope on scope stack and make it current */
...
...
@@ -956,6 +965,7 @@ acpi_ds_init_aml_walk (
while
(
extra_op
&&
!
extra_op
->
common
.
node
)
{
extra_op
=
extra_op
->
common
.
parent
;
}
if
(
!
extra_op
)
{
parser_state
->
start_node
=
NULL
;
}
...
...
@@ -1014,7 +1024,7 @@ acpi_ds_delete_walk_state (
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"%p walk still has a scope list
\n
"
,
walk_state
));
}
/* Always must free any linked control states */
/* Always must free any linked control states */
while
(
walk_state
->
control_state
)
{
state
=
walk_state
->
control_state
;
...
...
drivers/acpi/ec.c
View file @
f028ebf3
...
...
@@ -32,7 +32,7 @@
#include <asm/io.h>
#include <acpi/acpi_bus.h>
#include <acpi/acpi_drivers.h>
#include <acpi/actypes.h>
#define _COMPONENT ACPI_EC_COMPONENT
ACPI_MODULE_NAME
(
"acpi_ec"
)
...
...
@@ -412,7 +412,10 @@ acpi_ec_space_setup (
* The EC object is in the handler context and is needed
* when calling the acpi_ec_space_handler.
*/
*
return_context
=
handler_context
;
if
(
function
==
ACPI_REGION_DEACTIVATE
)
*
return_context
=
NULL
;
else
*
return_context
=
handler_context
;
return
AE_OK
;
}
...
...
drivers/acpi/events/evregion.c
View file @
f028ebf3
...
...
@@ -382,7 +382,7 @@ acpi_ev_detach_region(
union
acpi_operand_object
*
obj_desc
;
union
acpi_operand_object
**
last_obj_ptr
;
acpi_adr_space_setup
region_setup
;
void
*
region_context
;
void
*
*
region_context
;
union
acpi_operand_object
*
region_obj2
;
acpi_status
status
;
...
...
@@ -394,7 +394,7 @@ acpi_ev_detach_region(
if
(
!
region_obj2
)
{
return_VOID
;
}
region_context
=
region_obj2
->
extra
.
region_context
;
region_context
=
&
region_obj2
->
extra
.
region_context
;
/* Get the address handler from the region object */
...
...
@@ -450,7 +450,7 @@ acpi_ev_detach_region(
region_setup
=
handler_obj
->
address_space
.
setup
;
status
=
region_setup
(
region_obj
,
ACPI_REGION_DEACTIVATE
,
handler_obj
->
address_space
.
context
,
&
region_context
);
handler_obj
->
address_space
.
context
,
region_context
);
/* Init routine may fail, Just ignore errors */
...
...
drivers/acpi/executer/excreate.c
View file @
f028ebf3
...
...
@@ -286,7 +286,7 @@ acpi_ex_create_region (
ACPI_FUNCTION_TRACE
(
"ex_create_region"
);
/* Get the N
ode from the object stack
*/
/* Get the N
amespace Node
*/
node
=
walk_state
->
op
->
common
.
node
;
...
...
@@ -311,7 +311,6 @@ acpi_ex_create_region (
ACPI_DEBUG_PRINT
((
ACPI_DB_LOAD
,
"Region Type - %s (%X)
\n
"
,
acpi_ut_get_region_name
(
region_space
),
region_space
));
/* Create the region descriptor */
obj_desc
=
acpi_ut_create_internal_object
(
ACPI_TYPE_REGION
);
...
...
@@ -375,6 +374,7 @@ acpi_ex_create_table_region (
ACPI_FUNCTION_TRACE
(
"ex_create_table_region"
);
/* Get the Node from the object stack */
node
=
walk_state
->
op
->
common
.
node
;
...
...
@@ -392,7 +392,6 @@ acpi_ex_create_table_region (
status
=
acpi_tb_find_table
(
operand
[
1
]
->
string
.
pointer
,
operand
[
2
]
->
string
.
pointer
,
operand
[
3
]
->
string
.
pointer
,
&
table
);
if
(
ACPI_FAILURE
(
status
))
{
return_ACPI_STATUS
(
status
);
}
...
...
@@ -489,7 +488,6 @@ acpi_ex_create_processor (
status
=
acpi_ns_attach_object
((
struct
acpi_namespace_node
*
)
operand
[
0
],
obj_desc
,
ACPI_TYPE_PROCESSOR
);
/* Remove local reference to the object */
acpi_ut_remove_reference
(
obj_desc
);
...
...
@@ -540,7 +538,6 @@ acpi_ex_create_power_resource (
status
=
acpi_ns_attach_object
((
struct
acpi_namespace_node
*
)
operand
[
0
],
obj_desc
,
ACPI_TYPE_POWER
);
/* Remove local reference to the object */
acpi_ut_remove_reference
(
obj_desc
);
...
...
@@ -609,7 +606,6 @@ acpi_ex_create_method (
obj_desc
->
method
.
concurrency
=
(
u8
)
(((
method_flags
&
METHOD_FLAGS_SYNCH_LEVEL
)
>>
4
)
+
1
);
}
else
{
obj_desc
->
method
.
concurrency
=
INFINITE_CONCURRENCY
;
}
...
...
drivers/acpi/executer/exfldio.c
View file @
f028ebf3
...
...
@@ -139,7 +139,41 @@ acpi_ex_setup_region (
field_datum_byte_offset
,
obj_desc
->
common_field
.
access_byte_width
,
rgn_desc
->
region
.
node
->
name
.
ascii
,
rgn_desc
->
region
.
length
));
return_ACPI_STATUS
(
AE_AML_REGION_LIMIT
);
#ifdef CONFIG_ACPI_RELAXED_AML
{
/*
* Allow access to the field if it is within the region size
* rounded up to a multiple of the access byte width. This
* overcomes "off-by-one" programming errors in the AML often
* found in Toshiba laptops. These errors were allowed by
* the Microsoft ASL compiler.
*/
u32
rounded_length
=
ACPI_ROUND_UP
(
rgn_desc
->
region
.
length
,
obj_desc
->
common_field
.
access_byte_width
);
if
(
rounded_length
<
(
obj_desc
->
common_field
.
base_byte_offset
+
field_datum_byte_offset
+
obj_desc
->
common_field
.
access_byte_width
))
{
return_ACPI_STATUS
(
AE_AML_REGION_LIMIT
);
}
else
{
static
int
warn_once
=
1
;
if
(
warn_once
)
{
// Could also associate a flag with each field, and
// warn once for each field.
ACPI_REPORT_WARNING
((
"The ACPI AML in your computer contains errors, "
"please nag the manufacturer to correct it.
\n
"
));
ACPI_REPORT_WARNING
((
"Allowing relaxed access to fields; "
"turn on CONFIG_ACPI_DEBUG for details.
\n
"
));
warn_once
=
0
;
}
return_ACPI_STATUS
(
AE_OK
);
}
}
#else
return_ACPI_STATUS
(
AE_AML_REGION_LIMIT
);
#endif
}
return_ACPI_STATUS
(
AE_OK
);
...
...
drivers/acpi/namespace/nsdump.c
View file @
f028ebf3
...
...
@@ -234,7 +234,7 @@ acpi_ns_dump_one_object (
case
ACPI_TYPE_DEVICE
:
acpi_os_printf
(
"Notify
object: %p
"
,
obj_desc
);
acpi_os_printf
(
"Notify
Object: %p
\n
"
,
obj_desc
);
break
;
...
...
@@ -371,7 +371,7 @@ acpi_ns_dump_one_object (
case
ACPI_TYPE_LOCAL_BANK_FIELD
:
case
ACPI_TYPE_LOCAL_INDEX_FIELD
:
acpi_os_printf
(
"
Off %.2X Len %.2X Acc %.2hd
\n
"
,
acpi_os_printf
(
"Off %.2X Len %.2X Acc %.2hd
\n
"
,
(
obj_desc
->
common_field
.
base_byte_offset
*
8
)
+
obj_desc
->
common_field
.
start_field_bit_offset
,
obj_desc
->
common_field
.
bit_length
,
...
...
drivers/acpi/namespace/nssearch.c
View file @
f028ebf3
...
...
@@ -96,7 +96,7 @@ acpi_ns_search_node (
scope_name
=
acpi_ns_get_external_pathname
(
node
);
if
(
scope_name
)
{
ACPI_DEBUG_PRINT
((
ACPI_DB_NAMES
,
"Searching %s
[%p] For %4.4s
(%s)
\n
"
,
ACPI_DEBUG_PRINT
((
ACPI_DB_NAMES
,
"Searching %s
(%p) For [%4.4s]
(%s)
\n
"
,
scope_name
,
node
,
(
char
*
)
&
target_name
,
acpi_ut_get_type_name
(
type
)));
ACPI_MEM_FREE
(
scope_name
);
...
...
@@ -117,9 +117,9 @@ acpi_ns_search_node (
* Found matching entry.
*/
ACPI_DEBUG_PRINT
((
ACPI_DB_NAMES
,
"Name
%4.4s Type [%s]
found in scope [%4.4s] %p
\n
"
,
"Name
[%4.4s] (%s) %p
found in scope [%4.4s] %p
\n
"
,
(
char
*
)
&
target_name
,
acpi_ut_get_type_name
(
next_node
->
type
),
next_node
->
name
.
ascii
,
next_
node
));
next_node
,
node
->
name
.
ascii
,
node
));
*
return_node
=
next_node
;
return_ACPI_STATUS
(
AE_OK
);
...
...
@@ -143,7 +143,7 @@ acpi_ns_search_node (
/* Searched entire namespace level, not found */
ACPI_DEBUG_PRINT
((
ACPI_DB_NAMES
,
"Name
%4.4s Type [%s]
not found in search in scope [%4.4s] %p first child %p
\n
"
,
"Name
[%4.4s] (%s)
not found in search in scope [%4.4s] %p first child %p
\n
"
,
(
char
*
)
&
target_name
,
acpi_ut_get_type_name
(
type
),
node
->
name
.
ascii
,
node
,
node
->
child
));
...
...
drivers/acpi/namespace/nsutils.c
View file @
f028ebf3
...
...
@@ -175,6 +175,11 @@ acpi_ns_print_node_pathname (
acpi_status
status
;
if
(
!
node
)
{
acpi_os_printf
(
"[NULL NAME]"
);
return
;
}
/* Convert handle to a full pathname and print it (with supplied message) */
buffer
.
length
=
ACPI_ALLOCATE_LOCAL_BUFFER
;
...
...
@@ -470,11 +475,11 @@ acpi_ns_build_internal_name (
*
result
=
0
;
if
(
info
->
fully_qualified
)
{
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"
r
eturning [%p] (abs)
\"\\
%s
\"\n
"
,
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"
R
eturning [%p] (abs)
\"\\
%s
\"\n
"
,
internal_name
,
internal_name
));
}
else
{
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"
r
eturning [%p] (rel)
\"
%s
\"\n
"
,
ACPI_DEBUG_PRINT
((
ACPI_DB_EXEC
,
"
R
eturning [%p] (rel)
\"
%s
\"\n
"
,
internal_name
,
internal_name
));
}
...
...
drivers/acpi/parser/psparse.c
View file @
f028ebf3
...
...
@@ -437,7 +437,6 @@ acpi_ps_parse_loop (
return_ACPI_STATUS
(
AE_BAD_PARAMETER
);
}
parser_state
=
&
walk_state
->
parser_state
;
walk_state
->
arg_types
=
0
;
...
...
@@ -705,10 +704,9 @@ acpi_ps_parse_loop (
walk_state
->
arg_types
=
0
;
break
;
default:
/* Op is not a constant or string, append each argument */
/* Op is not a constant or string, append each argument
to the Op
*/
while
(
GET_CURRENT_ARG_TYPE
(
walk_state
->
arg_types
)
&&
!
walk_state
->
arg_count
)
{
...
...
@@ -727,23 +725,23 @@ acpi_ps_parse_loop (
INCREMENT_ARG_LIST
(
walk_state
->
arg_types
);
}
/* Special processing for certain opcodes */
switch
(
op
->
common
.
aml_opcode
)
{
case
AML_METHOD_OP
:
/* For a method, save the length and address of the body */
/*
* Skip parsing of control method
or opregion body,
* Skip parsing of control method
* because we don't have enough info in the first pass
* to parse them correctly.
* to parse it correctly.
*
* Save the length and address of the body
*/
op
->
named
.
data
=
parser_state
->
aml
;
op
->
named
.
length
=
(
u32
)
(
parser_state
->
pkg_end
-
parser_state
->
aml
);
/*
* Skip body of method. For op_regions, we must continue
* parsing because the opregion is not a standalone
* package (We don't know where the end is).
*/
/* Skip body of method */
parser_state
->
aml
=
parser_state
->
pkg_end
;
walk_state
->
arg_count
=
0
;
break
;
...
...
@@ -756,15 +754,15 @@ acpi_ps_parse_loop (
(
op
->
common
.
parent
->
common
.
aml_opcode
==
AML_NAME_OP
)
&&
(
walk_state
->
descending_callback
!=
acpi_ds_exec_begin_op
))
{
/*
* Skip parsing of
* Skip parsing of
Buffers and Packages
* because we don't have enough info in the first pass
* to parse them correctly.
*/
op
->
named
.
data
=
aml_op_start
;
op
->
named
.
length
=
(
u32
)
(
parser_state
->
pkg_end
-
aml_op_start
);
/*
* Skip body
*/
/* Skip body */
parser_state
->
aml
=
parser_state
->
pkg_end
;
walk_state
->
arg_count
=
0
;
}
...
...
@@ -778,6 +776,7 @@ acpi_ps_parse_loop (
break
;
default:
/* No action for all other opcodes */
break
;
}
...
...
drivers/acpi/pci_irq.c
View file @
f028ebf3
...
...
@@ -71,6 +71,9 @@ acpi_pci_irq_find_prt_entry (
ACPI_FUNCTION_TRACE
(
"acpi_pci_irq_find_prt_entry"
);
if
(
!
acpi_prt
.
count
)
return_PTR
(
NULL
);
/*
* Parse through all PRT entries looking for a match on the specified
* PCI device's segment, bus, device, and pin (don't care about func).
...
...
drivers/acpi/pci_link.c
View file @
f028ebf3
...
...
@@ -220,7 +220,6 @@ acpi_pci_link_check_current (
return
AE_CTRL_TERMINATE
;
}
static
int
acpi_pci_link_get_current
(
struct
acpi_pci_link
*
link
)
...
...
@@ -279,6 +278,28 @@ acpi_pci_link_get_current (
return_VALUE
(
result
);
}
static
int
acpi_pci_link_try_get_current
(
struct
acpi_pci_link
*
link
,
int
irq
)
{
int
result
;
ACPI_FUNCTION_TRACE
(
"acpi_pci_link_try_get_current"
);
result
=
acpi_pci_link_get_current
(
link
);
if
(
result
&&
link
->
irq
.
active
)
{
return_VALUE
(
result
);
}
if
(
!
link
->
irq
.
active
)
{
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"No active IRQ resource found
\n
"
));
printk
(
KERN_WARNING
"_CRS returns NULL! Using IRQ %d for device (%s [%s]).
\n
"
,
irq
,
acpi_device_name
(
link
->
device
),
acpi_device_bid
(
link
->
device
));
link
->
irq
.
active
=
irq
;
}
return
0
;
}
static
int
acpi_pci_link_set
(
...
...
@@ -294,6 +315,7 @@ acpi_pci_link_set (
struct
acpi_buffer
buffer
=
{
sizeof
(
resource
)
+
1
,
&
resource
};
int
i
=
0
;
int
valid
=
0
;
int
resource_type
=
0
;
ACPI_FUNCTION_TRACE
(
"acpi_pci_link_set"
);
...
...
@@ -317,20 +339,32 @@ acpi_pci_link_set (
}
}
/* If IRQ<=15, first try with a "normal" IRQ descriptor. If that fails, try with
* an extended one */
if
(
irq
<=
15
)
{
resource_type
=
ACPI_RSTYPE_IRQ
;
}
else
{
resource_type
=
ACPI_RSTYPE_EXT_IRQ
;
}
retry_programming:
memset
(
&
resource
,
0
,
sizeof
(
resource
));
/* NOTE: PCI interrupts are always level / active_low / shared. But not all
interrupts > 15 are PCI interrupts. Rely on the ACPI IRQ definition for
parameters */
if
(
irq
<=
15
)
{
switch
(
resource_type
)
{
case
ACPI_RSTYPE_IRQ
:
resource
.
res
.
id
=
ACPI_RSTYPE_IRQ
;
resource
.
res
.
length
=
sizeof
(
struct
acpi_resource
);
resource
.
res
.
data
.
irq
.
edge_level
=
link
->
irq
.
edge_level
;
resource
.
res
.
data
.
irq
.
active_high_low
=
link
->
irq
.
active_high_low
;
resource
.
res
.
data
.
irq
.
number_of_interrupts
=
1
;
resource
.
res
.
data
.
irq
.
interrupts
[
0
]
=
irq
;
}
else
{
break
;
case
ACPI_RSTYPE_EXT_IRQ
:
resource
.
res
.
id
=
ACPI_RSTYPE_EXT_IRQ
;
resource
.
res
.
length
=
sizeof
(
struct
acpi_resource
);
resource
.
res
.
data
.
extended_irq
.
producer_consumer
=
ACPI_CONSUMER
;
...
...
@@ -339,11 +373,21 @@ acpi_pci_link_set (
resource
.
res
.
data
.
extended_irq
.
number_of_interrupts
=
1
;
resource
.
res
.
data
.
extended_irq
.
interrupts
[
0
]
=
irq
;
/* ignore resource_source, it's optional */
break
;
}
resource
.
end
.
id
=
ACPI_RSTYPE_END_TAG
;
/* Attempt to set the resource */
status
=
acpi_set_current_resources
(
link
->
handle
,
&
buffer
);
/* if we failed and IRQ <= 15, try again with an extended descriptor */
if
(
ACPI_FAILURE
(
status
)
&&
(
resource_type
==
ACPI_RSTYPE_IRQ
))
{
resource_type
=
ACPI_RSTYPE_EXT_IRQ
;
printk
(
PREFIX
"Retrying with extended IRQ descriptor
\n
"
);
goto
retry_programming
;
}
/* check for total failure */
if
(
ACPI_FAILURE
(
status
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_ERROR
,
"Error evaluating _SRS
\n
"
));
return_VALUE
(
-
ENODEV
);
...
...
@@ -361,7 +405,7 @@ acpi_pci_link_set (
}
/* Make sure the active IRQ is the one we requested. */
result
=
acpi_pci_link_
get_current
(
link
);
result
=
acpi_pci_link_
try_get_current
(
link
,
irq
);
if
(
result
)
{
return_VALUE
(
result
);
}
...
...
@@ -456,16 +500,16 @@ static int acpi_pci_link_allocate(struct acpi_pci_link* link) {
irq
=
link
->
irq
.
active
;
}
else
{
irq
=
link
->
irq
.
possible
[
0
];
}
/*
* Select the best IRQ. This is done in reverse to promote
/*
* Select the best IRQ. This is done in reverse to promote
* the use of IRQs 9, 10, 11, and >15.
*/
for
(
i
=
(
link
->
irq
.
possible_count
-
1
);
i
>
0
;
i
--
)
{
if
(
acpi_irq_penalty
[
irq
]
>
acpi_irq_penalty
[
link
->
irq
.
possible
[
i
]])
irq
=
link
->
irq
.
possible
[
i
];
}
}
/* Attempt to enable the link device at this IRQ. */
if
(
acpi_pci_link_set
(
link
,
irq
))
{
...
...
@@ -574,10 +618,6 @@ acpi_pci_link_add (
else
printk
(
" %d"
,
link
->
irq
.
possible
[
i
]);
}
if
(
!
link
->
irq
.
active
)
printk
(
", disabled"
);
else
if
(
!
found
)
printk
(
", enabled at IRQ %d"
,
link
->
irq
.
active
);
printk
(
")
\n
"
);
/* TBD: Acquire/release lock */
...
...
drivers/acpi/tables.c
View file @
f028ebf3
...
...
@@ -69,7 +69,8 @@ struct acpi_table_sdt {
static
unsigned
long
sdt_pa
;
/* Physical Address */
static
unsigned
long
sdt_count
;
/* Table count */
static
struct
acpi_table_sdt
*
sdt_entry
;
static
struct
acpi_table_sdt
sdt_entry
[
ACPI_MAX_TABLES
];
void
acpi_table_print
(
...
...
@@ -418,12 +419,6 @@ acpi_table_get_sdt (
sdt_count
=
ACPI_MAX_TABLES
;
}
sdt_entry
=
alloc_bootmem
(
sdt_count
*
sizeof
(
struct
acpi_table_sdt
));
if
(
!
sdt_entry
)
{
printk
(
KERN_ERR
"ACPI: Could not allocate mem for SDT entries!
\n
"
);
return
-
ENOMEM
;
}
for
(
i
=
0
;
i
<
sdt_count
;
i
++
)
sdt_entry
[
i
].
pa
=
(
unsigned
long
)
mapped_xsdt
->
entry
[
i
];
}
...
...
@@ -470,12 +465,6 @@ acpi_table_get_sdt (
sdt_count
=
ACPI_MAX_TABLES
;
}
sdt_entry
=
alloc_bootmem
(
sdt_count
*
sizeof
(
struct
acpi_table_sdt
));
if
(
!
sdt_entry
)
{
printk
(
KERN_ERR
"ACPI: Could not allocate mem for SDT entries!
\n
"
);
return
-
ENOMEM
;
}
for
(
i
=
0
;
i
<
sdt_count
;
i
++
)
sdt_entry
[
i
].
pa
=
(
unsigned
long
)
mapped_rsdt
->
entry
[
i
];
}
...
...
include/acpi/acconfig.h
View file @
f028ebf3
...
...
@@ -64,7 +64,7 @@
/* Version string */
#define ACPI_CA_VERSION 0x20030
813
#define ACPI_CA_VERSION 0x20030
918
/* Maximum objects in the various object caches */
...
...
include/acpi/acdisasm.h
View file @
f028ebf3
...
...
@@ -152,10 +152,6 @@ void
acpi_dm_decode_internal_object
(
union
acpi_operand_object
*
obj_desc
);
void
acpi_dm_decode_node
(
struct
acpi_namespace_node
*
node
);
u32
acpi_dm_block_type
(
union
acpi_parse_object
*
op
);
...
...
include/acpi/acstruct.h
View file @
f028ebf3
...
...
@@ -91,11 +91,12 @@ struct acpi_walk_state
struct
acpi_namespace_node
arguments
[
ACPI_METHOD_NUM_ARGS
];
/* Control method arguments */
union
acpi_operand_object
**
caller_return_desc
;
union
acpi_generic_state
*
control_state
;
/* List of control states (nested IFs) */
struct
acpi_namespace_node
*
deferred_node
;
/* Used when executing deferred opcodes */
struct
acpi_namespace_node
local_variables
[
ACPI_METHOD_NUM_LOCALS
];
/* Control method locals */
struct
acpi_namespace_node
*
method_call_node
;
/* Called method Node*/
union
acpi_parse_object
*
method_call_op
;
/* method_call Op if running a method */
union
acpi_operand_object
*
method_desc
;
/* Method descriptor if running a method */
struct
acpi_namespace_node
*
method_node
;
/* Method
Node if running a method
*/
struct
acpi_namespace_node
*
method_node
;
/* Method
node if running a method.
*/
union
acpi_parse_object
*
op
;
/* Current parser op */
union
acpi_operand_object
*
operands
[
ACPI_OBJ_NUM_OPERANDS
+
1
];
/* Operands passed to the interpreter (+1 for NULL terminator) */
const
struct
acpi_opcode_info
*
op_info
;
/* Info on current opcode */
...
...
include/linux/acpi.h
View file @
f028ebf3
...
...
@@ -424,17 +424,17 @@ int ec_write(u8 addr, u8 val);
#endif
/*CONFIG_ACPI_EC*/
#ifdef CONFIG_ACPI
#ifdef CONFIG_ACPI
_INTERPRETER
int
acpi_blacklisted
(
void
);
#else
#else
/*!CONFIG_ACPI_INTERPRETER*/
static
inline
int
acpi_blacklisted
(
void
)
{
return
0
;
}
#endif
/*
CONFIG_ACPI
*/
#endif
/*
!CONFIG_ACPI_INTERPRETER
*/
#endif
/*_LINUX_ACPI_H*/
init/do_mounts.h
View file @
f028ebf3
...
...
@@ -104,4 +104,3 @@ void md_run_setup(void);
static
inline
void
md_run_setup
(
void
)
{}
#endif
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment