Commit f028ebf3 authored by Linus Torvalds's avatar Linus Torvalds

Merge http://linux-acpi.bkbits.net/linux-acpi-release-2.6.0

into home.osdl.org:/home/torvalds/v2.5/linux
parents ef4604f8 9d363b8d
......@@ -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
......
......@@ -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*/
#ifdef 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
......
......@@ -231,7 +231,7 @@ acpi_processor_set_performance (
int state)
{
u16 port = 0;
u8 value = 0;
u16 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%02x to port 0x%04x\n", value, port));
"Writing 0x%04x to port 0x%04x\n", value, port));
outb(value, port);
outw(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%02x from port 0x%04x\n",
(u8) perf->states[state].status, port));
"Looking for 0x%04x from port 0x%04x\n",
(u16) perf->states[state].status, port));
for (i=0; i<100; i++) {
value = inb(port);
if (value == (u8) perf->states[state].status)
value = inw(port);
if (value == (u16) 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;
......
......@@ -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, }
......
......@@ -830,7 +830,7 @@ void __init mp_register_lapic (
MP_processor_info(&processor);
}
#ifdef 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) {
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.
*/
if (entry->bus_irq != entry->global_irq) {
flags = entry->flags;
acpi_fadt.sci_int = entry->global_irq;
irq = entry->global_irq;
break;
}
else
return;
}
entry = (struct acpi_table_int_src_ovr *)
((unsigned long) entry + entry->header.length);
}
}
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*/
......@@ -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);
......
......@@ -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)
......
......@@ -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
......@@ -171,6 +161,9 @@ config ACPI_ASUS
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
parameters.
......@@ -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
......@@ -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)
......
......@@ -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.24a"
#define ASUS_ACPI_VERSION "0.26"
#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"},
{"L3D", "MLED", "\\MALD", "WLED", NULL, "\\Q10", "\\BKLG",
"\\Q0E", "\\Q0F", "SPLV", "GPLV", "\\BLVL", "SDSP", "\\INFB"},
{"L5X", "MLED", NULL, "WLED", "WRED", "\\Q0D", "\\BAOF",
"\\Q0C","\\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",
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 identification : %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 revision : 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 revision : 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->mled_status,
if (read_acpi_int(NULL, hotk->methods->wled_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 (asus_info) {
if (strncmp(asus_info->oem_table_id, "L1", 2) == 0)
hotk->model = L1X;
else
} 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");
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_NOTICE " Error changing brightness\n");
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);
}
......
......@@ -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);
......
......@@ -105,6 +105,11 @@ acpi_ds_create_buffer_field (
return_ACPI_STATUS (AE_AML_NO_OPERAND);
}
if (walk_state->deferred_node) {
node = walk_state->deferred_node;
status = AE_OK;
}
else {
/*
* 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
......@@ -127,6 +132,7 @@ acpi_ds_create_buffer_field (
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
* for now, we will put it in the "op" object that the parser uses, so we
......
......@@ -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 simple re-parse the method
* Delete the parse tree. We simply re-parse the method
* for every execution since there isn't much overhead
*/
acpi_ns_delete_namespace_subtree (obj_handle);
......
......@@ -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;
}
......
......@@ -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,6 +388,23 @@ acpi_ds_create_operand (
* in name_string
*/
/*
* 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.
*/
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.
......@@ -405,7 +421,6 @@ acpi_ds_create_operand (
interpreter_mode = ACPI_IMODE_LOAD_PASS2;
}
else {
/* Return a failure if name not found */
......@@ -432,7 +447,6 @@ acpi_ds_create_operand (
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
......@@ -445,6 +459,7 @@ acpi_ds_create_operand (
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;
}
......
......@@ -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;
......
......@@ -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] (%10s)",
"[%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,
"[\\___] (%10s)", "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] (%10s), 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);
}
......
......@@ -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
*
......@@ -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;
}
......
......@@ -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,6 +412,9 @@ acpi_ec_space_setup (
* The EC object is in the handler context and is needed
* when calling the acpi_ec_space_handler.
*/
if(function == ACPI_REGION_DEACTIVATE)
*return_context = NULL;
else
*return_context = handler_context;
return AE_OK;
......
......@@ -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 */
......
......@@ -286,7 +286,7 @@ acpi_ex_create_region (
ACPI_FUNCTION_TRACE ("ex_create_region");
/* Get the Node from the object stack */
/* Get the Namespace 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;
}
......
......@@ -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));
#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);
......
......@@ -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,
......
......@@ -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));
......
......@@ -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, "returning [%p] (abs) \"\\%s\"\n",
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Returning [%p] (abs) \"\\%s\"\n",
internal_name, internal_name));
}
else {
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "returning [%p] (rel) \"%s\"\n",
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Returning [%p] (rel) \"%s\"\n",
internal_name, internal_name));
}
......
......@@ -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;
}
......
......@@ -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).
......
......@@ -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,7 +500,6 @@ 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
......@@ -466,6 +509,7 @@ static int acpi_pci_link_allocate(struct acpi_pci_link* link) {
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 */
......
......@@ -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];
}
......
......@@ -64,7 +64,7 @@
/* Version string */
#define ACPI_CA_VERSION 0x20030813
#define ACPI_CA_VERSION 0x20030918
/* Maximum objects in the various object caches */
......
......@@ -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);
......
......@@ -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 */
......
......@@ -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*/
......@@ -104,4 +104,3 @@ void md_run_setup(void);
static inline void md_run_setup(void) {}
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment