Commit 4774cf7a authored by Len Brown's avatar Len Brown

Merge intel.com:/home/lenb/bk/linux-2.6.6

into intel.com:/home/lenb/src/linux-acpi-test-2.6.6
parents 9f7a3b76 357f6536
...@@ -102,13 +102,14 @@ running once the system is up. ...@@ -102,13 +102,14 @@ running once the system is up.
acpi= [HW,ACPI] Advanced Configuration and Power Interface acpi= [HW,ACPI] Advanced Configuration and Power Interface
Format: { force | off | ht | strict } Format: { force | off | ht | strict }
force -- enables ACPI for systems with default off force -- enable ACPI if default was off
off -- disabled ACPI for systems with default on off -- disable ACPI if default was on
noirq -- do not use ACPI for IRQ routing
ht -- run only enough ACPI to enable Hyper Threading ht -- run only enough ACPI to enable Hyper Threading
strict -- Be less tolerant of platforms that are not strict -- Be less tolerant of platforms that are not
strictly ACPI specification compliant. strictly ACPI specification compliant.
See also Documentation/pm.txt. See also Documentation/pm.txt, pci=noacpi
acpi_sleep= [HW,ACPI] Sleep options acpi_sleep= [HW,ACPI] Sleep options
Format: { s3_bios, s3_mode } Format: { s3_bios, s3_mode }
...@@ -133,6 +134,10 @@ running once the system is up. ...@@ -133,6 +134,10 @@ running once the system is up.
acpi_serialize [HW,ACPI] force serialization of AML methods acpi_serialize [HW,ACPI] force serialization of AML methods
acpi_skip_timer_override [HW,ACPI]
Recognize and ignore IRQ0/pin2 Interrupt Override.
For broken nForce2 BIOS resulting in XT-PIC timer.
ad1816= [HW,OSS] ad1816= [HW,OSS]
Format: <io>,<irq>,<dma>,<dma2> Format: <io>,<irq>,<dma>,<dma2>
See also Documentation/sound/oss/AD1816. See also Documentation/sound/oss/AD1816.
...@@ -842,7 +847,8 @@ running once the system is up. ...@@ -842,7 +847,8 @@ running once the system is up.
and Omnibook XE3 notebooks. This will and Omnibook XE3 notebooks. This will
have no effect if ACPI IRQ routing is have no effect if ACPI IRQ routing is
enabled. enabled.
noacpi [IA-32] Do not use ACPI for IRQ routing. noacpi [IA-32] Do not use ACPI for IRQ routing
or for PCI scanning.
pcmv= [HW,PCMCIA] BadgePAD 4 pcmv= [HW,PCMCIA] BadgePAD 4
......
...@@ -53,7 +53,13 @@ static inline int ioapic_setup_disabled(void) { return 0; } ...@@ -53,7 +53,13 @@ static inline int ioapic_setup_disabled(void) { return 0; }
#define PREFIX "ACPI: " #define PREFIX "ACPI: "
#ifdef CONFIG_ACPI_PCI
int acpi_noirq __initdata; /* skip ACPI IRQ initialization */ int acpi_noirq __initdata; /* skip ACPI IRQ initialization */
int acpi_pci_disabled __initdata; /* skip ACPI PCI scan and IRQ initialization */
#else
int acpi_noirq __initdata = 1;
int acpi_pci_disabled __initdata = 1;
#endif
int acpi_ht __initdata = 1; /* enable HT */ int acpi_ht __initdata = 1; /* enable HT */
int acpi_lapic; int acpi_lapic;
...@@ -62,6 +68,7 @@ int acpi_strict; ...@@ -62,6 +68,7 @@ int acpi_strict;
acpi_interrupt_flags acpi_sci_flags __initdata; acpi_interrupt_flags acpi_sci_flags __initdata;
int acpi_sci_override_gsi __initdata; int acpi_sci_override_gsi __initdata;
int acpi_skip_timer_override __initdata;
#ifdef CONFIG_X86_LOCAL_APIC #ifdef CONFIG_X86_LOCAL_APIC
static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
...@@ -329,6 +336,12 @@ acpi_parse_int_src_ovr ( ...@@ -329,6 +336,12 @@ acpi_parse_int_src_ovr (
return 0; return 0;
} }
if (acpi_skip_timer_override &&
intsrc->bus_irq == 0 && intsrc->global_irq == 2) {
printk(PREFIX "BIOS IRQ0 pin2 override ignored.\n");
return 0;
}
mp_override_legacy_irq ( mp_override_legacy_irq (
intsrc->bus_irq, intsrc->bus_irq,
intsrc->flags.polarity, intsrc->flags.polarity,
...@@ -653,9 +666,6 @@ acpi_parse_madt_ioapic_entries(void) ...@@ -653,9 +666,6 @@ acpi_parse_madt_ioapic_entries(void)
return count; return count;
} }
/* Build a default routing table for legacy (ISA) interrupts. */
mp_config_acpi_legacy_irqs();
count = acpi_table_parse_madt(ACPI_MADT_INT_SRC_OVR, acpi_parse_int_src_ovr, NR_IRQ_VECTORS); count = acpi_table_parse_madt(ACPI_MADT_INT_SRC_OVR, acpi_parse_int_src_ovr, NR_IRQ_VECTORS);
if (count < 0) { if (count < 0) {
printk(KERN_ERR PREFIX "Error parsing interrupt source overrides entry\n"); printk(KERN_ERR PREFIX "Error parsing interrupt source overrides entry\n");
...@@ -670,6 +680,9 @@ acpi_parse_madt_ioapic_entries(void) ...@@ -670,6 +680,9 @@ acpi_parse_madt_ioapic_entries(void)
if (!acpi_sci_override_gsi) if (!acpi_sci_override_gsi)
acpi_sci_ioapic_setup(acpi_fadt.sci_int, 0, 0); acpi_sci_ioapic_setup(acpi_fadt.sci_int, 0, 0);
/* Fill in identity legacy mapings where no override */
mp_config_acpi_legacy_irqs();
count = acpi_table_parse_madt(ACPI_MADT_NMI_SRC, acpi_parse_nmi_src, NR_IRQ_VECTORS); count = acpi_table_parse_madt(ACPI_MADT_NMI_SRC, acpi_parse_nmi_src, NR_IRQ_VECTORS);
if (count < 0) { if (count < 0) {
printk(KERN_ERR PREFIX "Error parsing NMI SRC entry\n"); printk(KERN_ERR PREFIX "Error parsing NMI SRC entry\n");
......
...@@ -412,30 +412,6 @@ static __init int swab_apm_power_in_minutes(struct dmi_blacklist *d) ...@@ -412,30 +412,6 @@ static __init int swab_apm_power_in_minutes(struct dmi_blacklist *d)
return 0; return 0;
} }
/*
* The Intel 440GX hall of shame.
*
* On many (all we have checked) of these boxes the $PIRQ table is wrong.
* The MP1.4 table is right however and so SMP kernels tend to work.
*/
static __init int broken_pirq(struct dmi_blacklist *d)
{
printk(KERN_INFO " *** Possibly defective BIOS detected (irqtable)\n");
printk(KERN_INFO " *** Many BIOSes matching this signature have incorrect IRQ routing tables.\n");
printk(KERN_INFO " *** If you see IRQ problems, in particular SCSI resets and hangs at boot\n");
printk(KERN_INFO " *** contact your hardware vendor and ask about updates.\n");
printk(KERN_INFO " *** Building an SMP kernel may evade the bug some of the time.\n");
#ifdef CONFIG_X86_IO_APIC
{
extern int skip_ioapic_setup;
skip_ioapic_setup = 0;
}
#endif
return 0;
}
/* /*
* ASUS K7V-RM has broken ACPI table defining sleep modes * ASUS K7V-RM has broken ACPI table defining sleep modes
*/ */
...@@ -552,15 +528,35 @@ static __init __attribute__((unused)) int force_acpi_ht(struct dmi_blacklist *d) ...@@ -552,15 +528,35 @@ static __init __attribute__((unused)) int force_acpi_ht(struct dmi_blacklist *d)
} }
return 0; return 0;
} }
/*
* early nForce2 reference BIOS shipped with a
* bogus ACPI IRQ0 -> pin2 interrupt override -- ignore it
*/
static __init int ignore_timer_override(struct dmi_blacklist *d)
{
extern int acpi_skip_timer_override;
printk(KERN_NOTICE "%s detected: BIOS IRQ0 pin2 override"
" will be ignored\n", d->ident);
acpi_skip_timer_override = 1;
return 0;
}
#endif #endif
#ifdef CONFIG_ACPI_PCI #ifdef CONFIG_ACPI_PCI
static __init int disable_acpi_irq(struct dmi_blacklist *d)
{
printk(KERN_NOTICE "%s detected: force use of acpi=noirq\n", d->ident);
acpi_noirq_set();
return 0;
}
static __init int disable_acpi_pci(struct dmi_blacklist *d) static __init int disable_acpi_pci(struct dmi_blacklist *d)
{ {
printk(KERN_NOTICE "%s detected: force use of pci=noacpi\n", d->ident); printk(KERN_NOTICE "%s detected: force use of pci=noacpi\n", d->ident);
acpi_noirq_set(); acpi_disable_pci();
return 0; return 0;
} }
#endif #endif
/* /*
...@@ -815,52 +811,6 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={ ...@@ -815,52 +811,6 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
NO_MATCH, NO_MATCH NO_MATCH, NO_MATCH
} }, } },
/* Problem Intel 440GX bioses */
{ broken_pirq, "SABR1 Bios", { /* Bad $PIR */
MATCH(DMI_BIOS_VENDOR, "Intel Corporation"),
MATCH(DMI_BIOS_VERSION,"SABR1"),
NO_MATCH, NO_MATCH
} },
{ broken_pirq, "l44GX Bios", { /* Bad $PIR */
MATCH(DMI_BIOS_VENDOR, "Intel Corporation"),
MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0094.P10"),
NO_MATCH, NO_MATCH
} },
{ broken_pirq, "l44GX Bios", { /* Bad $PIR */
MATCH(DMI_BIOS_VENDOR, "Intel Corporation"),
MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0115.P12"),
NO_MATCH, NO_MATCH
} },
{ broken_pirq, "l44GX Bios", { /* Bad $PIR */
MATCH(DMI_BIOS_VENDOR, "Intel Corporation"),
MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0120.P12"),
NO_MATCH, NO_MATCH
} },
{ broken_pirq, "l44GX Bios", { /* Bad $PIR */
MATCH(DMI_BIOS_VENDOR, "Intel Corporation"),
MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0125.P13"),
NO_MATCH, NO_MATCH
} },
{ broken_pirq, "l44GX Bios", { /* Bad $PIR */
MATCH(DMI_BIOS_VENDOR, "Intel Corporation"),
MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0066.P07.9906041405"),
NO_MATCH, NO_MATCH
} },
{ broken_pirq, "IBM xseries 370", { /* Bad $PIR */
MATCH(DMI_BIOS_VENDOR, "IBM"),
MATCH(DMI_BIOS_VERSION,"MMKT33AUS"),
NO_MATCH, NO_MATCH
} },
/* Intel in disguise - In this case they can't hide and they don't run
too well either... */
{ broken_pirq, "Dell PowerEdge 8450", { /* Bad $PIR */
MATCH(DMI_PRODUCT_NAME, "Dell PowerEdge 8450"),
NO_MATCH, NO_MATCH, NO_MATCH
} },
{ broken_acpi_Sx, "ASUS K7V-RM", { /* Bad ACPI Sx table */ { broken_acpi_Sx, "ASUS K7V-RM", { /* Bad ACPI Sx table */
MATCH(DMI_BIOS_VERSION,"ASUS K7V-RM ACPI BIOS Revision 1003A"), MATCH(DMI_BIOS_VERSION,"ASUS K7V-RM ACPI BIOS Revision 1003A"),
MATCH(DMI_BOARD_NAME, "<K7V-RM>"), MATCH(DMI_BOARD_NAME, "<K7V-RM>"),
...@@ -1018,6 +968,49 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={ ...@@ -1018,6 +968,49 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
MATCH(DMI_BOARD_VENDOR, "IBM"), MATCH(DMI_BOARD_VENDOR, "IBM"),
MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"), MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"),
NO_MATCH, NO_MATCH }}, NO_MATCH, NO_MATCH }},
/*
* Systems with nForce2 BIOS timer override bug
* nVidia claims all nForce have timer on pin0,
* and applying this workaround is a NOP on fixed BIOS,
* so prospects are good for replacing these entries
* with something to key of chipset PCI-ID.
*/
{ ignore_timer_override, "Abit NF7-S v2", {
MATCH(DMI_BOARD_VENDOR, "http://www.abit.com.tw/"),
MATCH(DMI_BOARD_NAME, "NF7-S/NF7,NF7-V (nVidia-nForce2)"),
MATCH(DMI_BIOS_VERSION, "6.00 PG"),
MATCH(DMI_BIOS_DATE, "03/24/2004") }},
{ ignore_timer_override, "Asus A7N8X v2", {
MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
MATCH(DMI_BOARD_NAME, "A7N8X2.0"),
MATCH(DMI_BIOS_VERSION, "ASUS A7N8X2.0 Deluxe ACPI BIOS Rev 1007"),
MATCH(DMI_BIOS_DATE, "10/06/2003") }},
{ ignore_timer_override, "Asus A7N8X-X", {
MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
MATCH(DMI_BOARD_NAME, "A7N8X-X"),
MATCH(DMI_BIOS_VERSION, "ASUS A7N8X-X ACPI BIOS Rev 1009"),
MATCH(DMI_BIOS_DATE, "2/3/2004") }},
{ ignore_timer_override, "MSI K7N2-Delta", {
MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),
MATCH(DMI_BOARD_NAME, "MS-6570"),
MATCH(DMI_BIOS_VERSION, "6.00 PG"),
MATCH(DMI_BIOS_DATE, "03/29/2004") }},
{ ignore_timer_override, "Shuttle SN41G2", {
MATCH(DMI_BOARD_VENDOR, "Shuttle Inc"),
MATCH(DMI_BOARD_NAME, "FN41"),
MATCH(DMI_BIOS_VERSION, "6.00 PG"),
MATCH(DMI_BIOS_DATE, "01/14/2004") }},
{ ignore_timer_override, "Shuttle AN35N", {
MATCH(DMI_BOARD_VENDOR, "Shuttle Inc"),
MATCH(DMI_BOARD_NAME, "AN35"),
MATCH(DMI_BIOS_VERSION, "6.00 PG"),
MATCH(DMI_BIOS_DATE, "12/05/2003") }},
#endif // CONFIG_ACPI_BOOT #endif // CONFIG_ACPI_BOOT
#ifdef CONFIG_ACPI_PCI #ifdef CONFIG_ACPI_PCI
...@@ -1025,13 +1018,21 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={ ...@@ -1025,13 +1018,21 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
* Boxes that need ACPI PCI IRQ routing disabled * Boxes that need ACPI PCI IRQ routing disabled
*/ */
{ disable_acpi_pci, "ASUS A7V", { { disable_acpi_irq, "ASUS A7V", {
MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"), MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"),
MATCH(DMI_BOARD_NAME, "<A7V>"), MATCH(DMI_BOARD_NAME, "<A7V>"),
/* newer BIOS, Revision 1011, does work */ /* newer BIOS, Revision 1011, does work */
MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1007"), MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1007"),
NO_MATCH }}, NO_MATCH }},
/*
* Boxes that need ACPI PCI IRQ routing and PCI scan disabled
*/
{ disable_acpi_pci, "ASUS PR-DLS", { /* _BBN 0 bug */
MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
MATCH(DMI_BOARD_NAME, "PR-DLS"),
MATCH(DMI_BIOS_VERSION, "ASUS PR-DLS ACPI BIOS Revision 1010"),
MATCH(DMI_BIOS_DATE, "03/21/2003") }},
#endif #endif
{ NULL, } { NULL, }
......
...@@ -2266,18 +2266,10 @@ static inline void check_timer(void) ...@@ -2266,18 +2266,10 @@ static inline void check_timer(void)
/* /*
* *
* IRQ's that are handled by the old PIC in all cases: * IRQ's that are handled by the PIC in the MPS IOAPIC case.
* - IRQ2 is the cascade IRQ, and cannot be a io-apic IRQ. * - IRQ2 is the cascade IRQ, and cannot be a io-apic IRQ.
* Linux doesn't really care, as it's not actually used * Linux doesn't really care, as it's not actually used
* for any interrupt handling anyway. * for any interrupt handling anyway.
* - There used to be IRQ13 here as well, but all
* MPS-compliant must not use it for FPU coupling and we
* want to use exception 16 anyway. And there are
* systems who connect it to an I/O APIC for other uses.
* Thus we don't mark it special any longer.
*
* Additionally, something is definitely wrong with irq9
* on PIIX4 boards.
*/ */
#define PIC_IRQS (1 << PIC_CASCADE_IR) #define PIC_IRQS (1 << PIC_CASCADE_IR)
...@@ -2285,7 +2277,11 @@ void __init setup_IO_APIC(void) ...@@ -2285,7 +2277,11 @@ void __init setup_IO_APIC(void)
{ {
enable_IO_APIC(); enable_IO_APIC();
io_apic_irqs = ~PIC_IRQS; if (acpi_ioapic)
io_apic_irqs = ~0; /* all IRQs go through IOAPIC */
else
io_apic_irqs = ~PIC_IRQS;
printk("ENABLING IO-APIC IRQs\n"); printk("ENABLING IO-APIC IRQs\n");
/* /*
...@@ -2455,7 +2451,7 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int a ...@@ -2455,7 +2451,7 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int a
entry.vector = assign_irq_vector(irq); entry.vector = assign_irq_vector(irq);
printk(KERN_DEBUG "IOAPIC[%d]: Set PCI routing entry (%d-%d -> 0x%x -> " Dprintk(KERN_DEBUG "IOAPIC[%d]: Set PCI routing entry (%d-%d -> 0x%x -> "
"IRQ %d Mode:%i Active:%i)\n", ioapic, "IRQ %d Mode:%i Active:%i)\n", ioapic,
mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq, edge_level, active_high_low); mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq, edge_level, active_high_low);
......
...@@ -929,8 +929,6 @@ void __init mp_override_legacy_irq ( ...@@ -929,8 +929,6 @@ void __init mp_override_legacy_irq (
u32 gsi) u32 gsi)
{ {
struct mpc_config_intsrc intsrc; struct mpc_config_intsrc intsrc;
int i = 0;
int found = 0;
int ioapic = -1; int ioapic = -1;
int pin = -1; int pin = -1;
...@@ -963,23 +961,9 @@ void __init mp_override_legacy_irq ( ...@@ -963,23 +961,9 @@ void __init mp_override_legacy_irq (
(intsrc.mpc_irqflag >> 2) & 3, intsrc.mpc_srcbus, (intsrc.mpc_irqflag >> 2) & 3, intsrc.mpc_srcbus,
intsrc.mpc_srcbusirq, intsrc.mpc_dstapic, intsrc.mpc_dstirq); intsrc.mpc_srcbusirq, intsrc.mpc_dstapic, intsrc.mpc_dstirq);
/* mp_irqs[mp_irq_entries] = intsrc;
* If an existing [IOAPIC.PIN -> IRQ] routing entry exists we override it. if (++mp_irq_entries == MAX_IRQ_SOURCES)
* Otherwise create a new entry (e.g. gsi == 2). panic("Max # of irq sources exceeded!\n");
*/
for (i = 0; i < mp_irq_entries; i++) {
if ((mp_irqs[i].mpc_srcbus == intsrc.mpc_srcbus)
&& (mp_irqs[i].mpc_srcbusirq == intsrc.mpc_srcbusirq)) {
mp_irqs[i] = intsrc;
found = 1;
break;
}
}
if (!found) {
mp_irqs[mp_irq_entries] = intsrc;
if (++mp_irq_entries == MAX_IRQ_SOURCES)
panic("Max # of irq sources exceeded!\n");
}
return; return;
} }
...@@ -1010,13 +994,20 @@ void __init mp_config_acpi_legacy_irqs (void) ...@@ -1010,13 +994,20 @@ void __init mp_config_acpi_legacy_irqs (void)
intsrc.mpc_dstapic = mp_ioapics[ioapic].mpc_apicid; intsrc.mpc_dstapic = mp_ioapics[ioapic].mpc_apicid;
/* /*
* Use the default configuration for the IRQs 0-15. These may be * Use the default configuration for the IRQs 0-15. Unless
* overriden by (MADT) interrupt source override entries. * overriden by (MADT) interrupt source override entries.
*/ */
for (i = 0; i < 16; i++) { for (i = 0; i < 16; i++) {
int idx;
for (idx = 0; idx < mp_irq_entries; idx++)
if (mp_irqs[idx].mpc_srcbus == MP_ISA_BUS &&
(mp_irqs[idx].mpc_srcbusirq == i ||
mp_irqs[idx].mpc_dstirq == i))
break;
if (i == 2) if (idx != mp_irq_entries)
continue; /* Don't connect IRQ2 */ continue; /* IRQ already used */
intsrc.mpc_irqtype = mp_INT; intsrc.mpc_irqtype = mp_INT;
intsrc.mpc_srcbusirq = i; /* Identity mapped */ intsrc.mpc_srcbusirq = i; /* Identity mapped */
...@@ -1111,11 +1102,12 @@ void __init mp_parse_prt (void) ...@@ -1111,11 +1102,12 @@ void __init mp_parse_prt (void)
if (!io_apic_set_pci_routing(ioapic, ioapic_pin, gsi, edge_level, active_high_low)) { if (!io_apic_set_pci_routing(ioapic, ioapic_pin, gsi, edge_level, active_high_low)) {
acpi_gsi_to_irq(gsi, &entry->irq); acpi_gsi_to_irq(gsi, &entry->irq);
} }
printk(KERN_DEBUG "%02x:%02x:%02x[%c] -> %d-%d -> IRQ %d\n", printk(KERN_DEBUG "%02x:%02x:%02x[%c] -> %d-%d -> IRQ %d %s %s\n",
entry->id.segment, entry->id.bus, entry->id.segment, entry->id.bus,
entry->id.device, ('A' + entry->pin), entry->id.device, ('A' + entry->pin),
mp_ioapic_routing[ioapic].apic_id, ioapic_pin, mp_ioapic_routing[ioapic].apic_id, ioapic_pin,
entry->irq); entry->irq, edge_level ? "level" : "edge",
active_high_low ? "low" : "high");
} }
print_IO_APIC(); print_IO_APIC();
......
...@@ -583,9 +583,13 @@ static void __init parse_cmdline_early (char ** cmdline_p) ...@@ -583,9 +583,13 @@ static void __init parse_cmdline_early (char ** cmdline_p)
disable_acpi(); disable_acpi();
acpi_ht = 1; acpi_ht = 1;
} }
/* "pci=noacpi" disables ACPI interrupt routing */ /* "pci=noacpi" disable ACPI IRQ routing and PCI scan */
else if (!memcmp(from, "pci=noacpi", 10)) { else if (!memcmp(from, "pci=noacpi", 10)) {
acpi_disable_pci();
}
/* "acpi=noirq" disables ACPI interrupt routing */
else if (!memcmp(from, "acpi=noirq", 10)) {
acpi_noirq_set(); acpi_noirq_set();
} }
...@@ -601,6 +605,11 @@ static void __init parse_cmdline_early (char ** cmdline_p) ...@@ -601,6 +605,11 @@ static void __init parse_cmdline_early (char ** cmdline_p)
else if (!memcmp(from, "acpi_sci=low", 12)) else if (!memcmp(from, "acpi_sci=low", 12))
acpi_sci_flags.polarity = 3; acpi_sci_flags.polarity = 3;
#ifdef CONFIG_X86_IO_APIC
else if (!memcmp(from, "acpi_skip_timer_override", 24))
acpi_skip_timer_override = 1;
#endif
#ifdef CONFIG_X86_LOCAL_APIC #ifdef CONFIG_X86_LOCAL_APIC
/* disable IO-APIC */ /* disable IO-APIC */
else if (!memcmp(from, "noapic", 6)) else if (!memcmp(from, "noapic", 6))
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <asm/acpi.h>
#include <asm/arch_hooks.h> #include <asm/arch_hooks.h>
/** /**
...@@ -43,7 +44,8 @@ void __init intr_init_hook(void) ...@@ -43,7 +44,8 @@ void __init intr_init_hook(void)
apic_intr_init(); apic_intr_init();
#endif #endif
setup_irq(2, &irq2); if (!acpi_ioapic)
setup_irq(2, &irq2);
} }
/** /**
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <asm/acpi.h>
#include <asm/arch_hooks.h> #include <asm/arch_hooks.h>
/** /**
...@@ -17,8 +18,7 @@ ...@@ -17,8 +18,7 @@
* the "ordinary" interrupt call gates. For legacy reasons, the ISA * the "ordinary" interrupt call gates. For legacy reasons, the ISA
* interrupts should be initialised here if the machine emulates a PC * interrupts should be initialised here if the machine emulates a PC
* in any way. * in any way.
**/ **/void __init pre_intr_init_hook(void)
void __init pre_intr_init_hook(void)
{ {
init_ISA_irqs(); init_ISA_irqs();
} }
...@@ -43,7 +43,8 @@ void __init intr_init_hook(void) ...@@ -43,7 +43,8 @@ void __init intr_init_hook(void)
apic_intr_init(); apic_intr_init();
#endif #endif
setup_irq(2, &irq2); if (!acpi_ioapic)
setup_irq(2, &irq2);
} }
/** /**
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <asm/acpi.h>
#include <asm/arch_hooks.h> #include <asm/arch_hooks.h>
void __init pre_intr_init_hook(void) void __init pre_intr_init_hook(void)
...@@ -24,7 +25,8 @@ void __init intr_init_hook(void) ...@@ -24,7 +25,8 @@ void __init intr_init_hook(void)
smp_intr_init(); smp_intr_init();
#endif #endif
setup_irq(2, &irq2); if (!acpi_ioapic)
setup_irq(2, &irq2);
} }
void __init pre_setup_arch_hook(void) void __init pre_setup_arch_hook(void)
......
...@@ -21,7 +21,6 @@ static int __init pci_acpi_init(void) ...@@ -21,7 +21,6 @@ static int __init pci_acpi_init(void)
if (!acpi_noirq) { if (!acpi_noirq) {
if (!acpi_pci_irq_init()) { if (!acpi_pci_irq_init()) {
printk(KERN_INFO "PCI: Using ACPI for IRQ routing\n"); printk(KERN_INFO "PCI: Using ACPI for IRQ routing\n");
printk(KERN_INFO "PCI: if you experience problems, try using option 'pci=noacpi' or even 'acpi=off'\n");
pcibios_scanned++; pcibios_scanned++;
pcibios_enable_irq = acpi_pci_irq_enable; pcibios_enable_irq = acpi_pci_irq_enable;
} else } else
......
...@@ -453,15 +453,12 @@ static int pirq_bios_set(struct pci_dev *router, struct pci_dev *dev, int pirq, ...@@ -453,15 +453,12 @@ static int pirq_bios_set(struct pci_dev *router, struct pci_dev *dev, int pirq,
static __init int intel_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) static __init int intel_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
{ {
#if 0 /* Let's see what chip this is supposed to be ... */ /* 440GX has a proprietary PIRQ router -- don't use it */
/* We must not touch 440GX even if we have tables. 440GX has
different IRQ routing weirdness */
if ( pci_find_device(PCI_VENDOR_ID_INTEL, if ( pci_find_device(PCI_VENDOR_ID_INTEL,
PCI_DEVICE_ID_INTEL_82443GX_0, NULL) || PCI_DEVICE_ID_INTEL_82443GX_0, NULL) ||
pci_find_device(PCI_VENDOR_ID_INTEL, pci_find_device(PCI_VENDOR_ID_INTEL,
PCI_DEVICE_ID_INTEL_82443GX_2, NULL)) PCI_DEVICE_ID_INTEL_82443GX_2, NULL))
return 0; return 0;
#endif
switch(device) switch(device)
{ {
......
...@@ -8,7 +8,7 @@ obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o \ ...@@ -8,7 +8,7 @@ obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o \
ptrace.o i8259.o ioport.o ldt.o setup.o time.o sys_x86_64.o \ ptrace.o i8259.o ioport.o ldt.o setup.o time.o sys_x86_64.o \
x8664_ksyms.o i387.o syscall.o vsyscall.o \ x8664_ksyms.o i387.o syscall.o vsyscall.o \
setup64.o bootflag.o e820.o reboot.o warmreboot.o setup64.o bootflag.o e820.o reboot.o warmreboot.o
obj-y += mce.o acpi/ obj-y += mce.o
obj-$(CONFIG_MTRR) += ../../i386/kernel/cpu/mtrr/ obj-$(CONFIG_MTRR) += ../../i386/kernel/cpu/mtrr/
obj-$(CONFIG_ACPI_BOOT) += acpi/ obj-$(CONFIG_ACPI_BOOT) += acpi/
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/kernel_stat.h> #include <linux/kernel_stat.h>
#include <linux/sysdev.h> #include <linux/sysdev.h>
#include <asm/acpi.h>
#include <asm/atomic.h> #include <asm/atomic.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -490,5 +491,6 @@ void __init init_IRQ(void) ...@@ -490,5 +491,6 @@ void __init init_IRQ(void)
*/ */
setup_timer(); setup_timer();
setup_irq(2, &irq2); if (!acpi_ioapic)
setup_irq(2, &irq2);
} }
...@@ -1740,18 +1740,10 @@ static inline void check_timer(void) ...@@ -1740,18 +1740,10 @@ static inline void check_timer(void)
/* /*
* *
* IRQ's that are handled by the old PIC in all cases: * IRQ's that are handled by the PIC in the MPS IOAPIC case.
* - IRQ2 is the cascade IRQ, and cannot be a io-apic IRQ. * - IRQ2 is the cascade IRQ, and cannot be a io-apic IRQ.
* Linux doesn't really care, as it's not actually used * Linux doesn't really care, as it's not actually used
* for any interrupt handling anyway. * for any interrupt handling anyway.
* - There used to be IRQ13 here as well, but all
* MPS-compliant must not use it for FPU coupling and we
* want to use exception 16 anyway. And there are
* systems who connect it to an I/O APIC for other uses.
* Thus we don't mark it special any longer.
*
* Additionally, something is definitely wrong with irq9
* on PIIX4 boards.
*/ */
#define PIC_IRQS (1<<2) #define PIC_IRQS (1<<2)
...@@ -1759,7 +1751,11 @@ void __init setup_IO_APIC(void) ...@@ -1759,7 +1751,11 @@ void __init setup_IO_APIC(void)
{ {
enable_IO_APIC(); enable_IO_APIC();
io_apic_irqs = ~PIC_IRQS; if (acpi_ioapic)
io_apic_irqs = ~0; /* all IRQs go through IOAPIC */
else
io_apic_irqs = ~PIC_IRQS;
printk("ENABLING IO-APIC IRQs\n"); printk("ENABLING IO-APIC IRQs\n");
/* /*
......
...@@ -784,8 +784,6 @@ void __init mp_override_legacy_irq ( ...@@ -784,8 +784,6 @@ void __init mp_override_legacy_irq (
u32 gsi) u32 gsi)
{ {
struct mpc_config_intsrc intsrc; struct mpc_config_intsrc intsrc;
int i = 0;
int found = 0;
int ioapic = -1; int ioapic = -1;
int pin = -1; int pin = -1;
...@@ -818,23 +816,9 @@ void __init mp_override_legacy_irq ( ...@@ -818,23 +816,9 @@ void __init mp_override_legacy_irq (
(intsrc.mpc_irqflag >> 2) & 3, intsrc.mpc_srcbus, (intsrc.mpc_irqflag >> 2) & 3, intsrc.mpc_srcbus,
intsrc.mpc_srcbusirq, intsrc.mpc_dstapic, intsrc.mpc_dstirq); intsrc.mpc_srcbusirq, intsrc.mpc_dstapic, intsrc.mpc_dstirq);
/* mp_irqs[mp_irq_entries] = intsrc;
* If an existing [IOAPIC.PIN -> IRQ] routing entry exists we override it. if (++mp_irq_entries == MAX_IRQ_SOURCES)
* Otherwise create a new entry (e.g. gsi == 2). panic("Max # of irq sources exceeded!\n");
*/
for (i = 0; i < mp_irq_entries; i++) {
if ((mp_irqs[i].mpc_srcbus == intsrc.mpc_srcbus)
&& (mp_irqs[i].mpc_srcbusirq == intsrc.mpc_srcbusirq)) {
mp_irqs[i] = intsrc;
found = 1;
break;
}
}
if (!found) {
mp_irqs[mp_irq_entries] = intsrc;
if (++mp_irq_entries == MAX_IRQ_SOURCES)
panic("Max # of irq sources exceeded!\n");
}
return; return;
} }
...@@ -865,13 +849,22 @@ void __init mp_config_acpi_legacy_irqs (void) ...@@ -865,13 +849,22 @@ void __init mp_config_acpi_legacy_irqs (void)
intsrc.mpc_dstapic = mp_ioapics[ioapic].mpc_apicid; intsrc.mpc_dstapic = mp_ioapics[ioapic].mpc_apicid;
/* /*
* Use the default configuration for the IRQs 0-15. These may be * Use the default configuration for the IRQs 0-15. Unless
* overridden by (MADT) interrupt source override entries. * overridden by (MADT) interrupt source override entries.
*/ */
for (i = 0; i < 16; i++) { for (i = 0; i < 16; i++) {
int idx;
for (idx = 0; idx < mp_irq_entries; idx++)
if (mp_irqs[idx].mpc_srcbus == MP_ISA_BUS &&
(mp_irqs[idx].mpc_srcbusirq == i ||
mp_irqs[idx].mpc_dstirq == i))
break;
if (i == 2) if (idx != mp_irq_entries) {
continue; /* Don't connect IRQ2 */ printk(KERN_DEBUG "ACPI: IRQ%d used by override.\n", i);
continue; /* IRQ already used */
}
intsrc.mpc_irqtype = mp_INT; intsrc.mpc_irqtype = mp_INT;
intsrc.mpc_srcbusirq = i; /* Identity mapped */ intsrc.mpc_srcbusirq = i; /* Identity mapped */
......
...@@ -65,8 +65,8 @@ struct cpuinfo_x86 boot_cpu_data; ...@@ -65,8 +65,8 @@ struct cpuinfo_x86 boot_cpu_data;
unsigned long mmu_cr4_features; unsigned long mmu_cr4_features;
EXPORT_SYMBOL_GPL(mmu_cr4_features); EXPORT_SYMBOL_GPL(mmu_cr4_features);
int acpi_disabled = 0; int acpi_disabled;
EXPORT_SYMBOL(acpi_disabled);
#ifdef CONFIG_ACPI_BOOT #ifdef CONFIG_ACPI_BOOT
extern int __initdata acpi_ht; extern int __initdata acpi_ht;
extern acpi_interrupt_flags acpi_sci_flags; extern acpi_interrupt_flags acpi_sci_flags;
...@@ -242,7 +242,7 @@ static __init void parse_cmdline_early (char ** cmdline_p) ...@@ -242,7 +242,7 @@ static __init void parse_cmdline_early (char ** cmdline_p)
#ifdef CONFIG_ACPI_BOOT #ifdef CONFIG_ACPI_BOOT
/* "acpi=off" disables both ACPI table parsing and interpreter init */ /* "acpi=off" disables both ACPI table parsing and interpreter init */
if (!memcmp(from, "acpi=off", 8)) if (!memcmp(from, "acpi=off", 8))
acpi_disabled = 1; disable_acpi();
if (!memcmp(from, "acpi=force", 10)) { if (!memcmp(from, "acpi=force", 10)) {
/* add later when we do DMI horrors: */ /* add later when we do DMI horrors: */
...@@ -256,7 +256,9 @@ static __init void parse_cmdline_early (char ** cmdline_p) ...@@ -256,7 +256,9 @@ static __init void parse_cmdline_early (char ** cmdline_p)
acpi_ht = 1; acpi_ht = 1;
} }
else if (!memcmp(from, "pci=noacpi", 10)) else if (!memcmp(from, "pci=noacpi", 10))
acpi_noirq_set(); acpi_disable_pci();
else if (!memcmp(from, "acpi=noirq", 10))
acpi_noirq_set();
else if (!memcmp(from, "acpi_sci=edge", 13)) else if (!memcmp(from, "acpi_sci=edge", 13))
acpi_sci_flags.trigger = 1; acpi_sci_flags.trigger = 1;
......
...@@ -158,6 +158,7 @@ acpi_ac_add_fs ( ...@@ -158,6 +158,7 @@ acpi_ac_add_fs (
acpi_ac_dir); acpi_ac_dir);
if (!acpi_device_dir(device)) if (!acpi_device_dir(device))
return_VALUE(-ENODEV); return_VALUE(-ENODEV);
acpi_device_dir(device)->owner = THIS_MODULE;
} }
/* 'state' [R] */ /* 'state' [R] */
...@@ -170,6 +171,7 @@ acpi_ac_add_fs ( ...@@ -170,6 +171,7 @@ acpi_ac_add_fs (
else { else {
entry->proc_fops = &acpi_ac_fops; entry->proc_fops = &acpi_ac_fops;
entry->data = acpi_driver_data(device); entry->data = acpi_driver_data(device);
entry->owner = THIS_MODULE;
} }
return_VALUE(0); return_VALUE(0);
...@@ -320,6 +322,7 @@ acpi_ac_init (void) ...@@ -320,6 +322,7 @@ acpi_ac_init (void)
acpi_ac_dir = proc_mkdir(ACPI_AC_CLASS, acpi_root_dir); acpi_ac_dir = proc_mkdir(ACPI_AC_CLASS, acpi_root_dir);
if (!acpi_ac_dir) if (!acpi_ac_dir)
return_VALUE(-ENODEV); return_VALUE(-ENODEV);
acpi_ac_dir->owner = THIS_MODULE;
result = acpi_bus_register_driver(&acpi_ac_driver); result = acpi_bus_register_driver(&acpi_ac_driver);
if (result < 0) { if (result < 0) {
......
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
#include <acpi/acpi_drivers.h> #include <acpi/acpi_drivers.h>
#include <acpi/acpi_bus.h> #include <acpi/acpi_bus.h>
#define ASUS_ACPI_VERSION "0.27" #define ASUS_ACPI_VERSION "0.28"
#define PROC_ASUS "asus" //the directory #define PROC_ASUS "asus" //the directory
#define PROC_MLED "mled" #define PROC_MLED "mled"
...@@ -125,12 +125,11 @@ struct asus_hotk { ...@@ -125,12 +125,11 @@ struct asus_hotk {
L5x, //L5800C L5x, //L5800C
L8L, //L8400L L8L, //L8400L
M1A, //M1300A M1A, //M1300A
M2E, //M2400E M2E, //M2400E, L4400L
P30, //Samsung P30
S1x, //S1300A, but also L1400B and M2400A (L84F) S1x, //S1300A, but also L1400B and M2400A (L84F)
S2x, //S200 (J1 reported), Victor MP-XP7210 S2x, //S200 (J1 reported), Victor MP-XP7210
//TODO A1370D does not seem to have an ATK device xxN, //M2400N, M3700N, M6800N, S1300N, S5200N (Centrino)
// L8400 model doesn't have ATK
xxN, //M2400N, M3700N, S1300N (Centrino)
END_MODEL END_MODEL
} model; //Models currently supported } model; //Models currently supported
u16 event_count[128]; //count for each event TODO make this better u16 event_count[128]; //count for each event TODO make this better
...@@ -140,6 +139,7 @@ struct asus_hotk { ...@@ -140,6 +139,7 @@ struct asus_hotk {
#define A1x_PREFIX "\\_SB.PCI0.ISA.EC0." #define A1x_PREFIX "\\_SB.PCI0.ISA.EC0."
#define L3C_PREFIX "\\_SB.PCI0.PX40.ECD0." #define L3C_PREFIX "\\_SB.PCI0.PX40.ECD0."
#define M1A_PREFIX "\\_SB.PCI0.PX40.EC0." #define M1A_PREFIX "\\_SB.PCI0.PX40.EC0."
#define P30_PREFIX "\\_SB.PCI0.LPCB.EC0."
#define S1x_PREFIX "\\_SB.PCI0.PX40." #define S1x_PREFIX "\\_SB.PCI0.PX40."
#define S2x_PREFIX A1x_PREFIX #define S2x_PREFIX A1x_PREFIX
#define xxN_PREFIX "\\_SB.PCI0.SBRG.EC0." #define xxN_PREFIX "\\_SB.PCI0.SBRG.EC0."
...@@ -166,7 +166,7 @@ static struct model_data model_conf[END_MODEL] = { ...@@ -166,7 +166,7 @@ static struct model_data model_conf[END_MODEL] = {
.mt_lcd_switch = A1x_PREFIX "_Q10", .mt_lcd_switch = A1x_PREFIX "_Q10",
.lcd_status = "\\BKLI", .lcd_status = "\\BKLI",
.brightness_up = A1x_PREFIX "_Q0E", .brightness_up = A1x_PREFIX "_Q0E",
.brightness_down = A1x_PREFIX "_Q0F", .brightness_down = A1x_PREFIX "_Q0F"
}, },
{ {
...@@ -176,11 +176,8 @@ static struct model_data model_conf[END_MODEL] = { ...@@ -176,11 +176,8 @@ static struct model_data model_conf[END_MODEL] = {
.wled_status = "\\SG66", .wled_status = "\\SG66",
.mt_lcd_switch = "\\Q10", .mt_lcd_switch = "\\Q10",
.lcd_status = "\\BAOF", .lcd_status = "\\BAOF",
.brightness_up = "\\Q0E",
.brightness_down = "\\Q0F",
.brightness_set = "SPLV", .brightness_set = "SPLV",
.brightness_get = "GPLV", .brightness_get = "GPLV",
.brightness_status = "\\CMOD",
.display_set = "SDSP", .display_set = "SDSP",
.display_get = "\\INFB" .display_get = "\\INFB"
}, },
...@@ -217,11 +214,8 @@ static struct model_data model_conf[END_MODEL] = { ...@@ -217,11 +214,8 @@ static struct model_data model_conf[END_MODEL] = {
.mt_wled = "WLED", .mt_wled = "WLED",
.mt_lcd_switch = L3C_PREFIX "_Q10", .mt_lcd_switch = L3C_PREFIX "_Q10",
.lcd_status = "\\GL32", .lcd_status = "\\GL32",
.brightness_up = L3C_PREFIX "_Q0F",
.brightness_down = L3C_PREFIX "_Q0E",
.brightness_set = "SPLV", .brightness_set = "SPLV",
.brightness_get = "GPLV", .brightness_get = "GPLV",
.brightness_status = "\\BLVL",
.display_set = "SDSP", .display_set = "SDSP",
.display_get = "\\_SB.PCI0.PCI1.VGAC.NMAP" .display_get = "\\_SB.PCI0.PCI1.VGAC.NMAP"
}, },
...@@ -233,11 +227,8 @@ static struct model_data model_conf[END_MODEL] = { ...@@ -233,11 +227,8 @@ static struct model_data model_conf[END_MODEL] = {
.mt_wled = "WLED", .mt_wled = "WLED",
.mt_lcd_switch = "\\Q10", .mt_lcd_switch = "\\Q10",
.lcd_status = "\\BKLG", .lcd_status = "\\BKLG",
.brightness_up = "\\Q0E",
.brightness_down = "\\Q0F",
.brightness_set = "SPLV", .brightness_set = "SPLV",
.brightness_get = "GPLV", .brightness_get = "GPLV",
.brightness_status = "\\BLVL",
.display_set = "SDSP", .display_set = "SDSP",
.display_get = "\\INFB" .display_get = "\\INFB"
}, },
...@@ -257,14 +248,10 @@ static struct model_data model_conf[END_MODEL] = { ...@@ -257,14 +248,10 @@ static struct model_data model_conf[END_MODEL] = {
{ {
.name = "L5x", .name = "L5x",
.mt_mled = "MLED", .mt_mled = "MLED",
// .mt_wled = "WLED", /* WLED present, but not controlled by ACPI */
// .wled_status = "\\WRED",
/* Present, but not controlled by ACPI */
.mt_tled = "TLED", .mt_tled = "TLED",
.mt_lcd_switch = "\\Q0D", .mt_lcd_switch = "\\Q0D",
.lcd_status = "\\BAOF", .lcd_status = "\\BAOF",
.brightness_up = "\\Q0C",
.brightness_down = "\\Q0B",
.brightness_set = "SPLV", .brightness_set = "SPLV",
.brightness_get = "GPLV", .brightness_get = "GPLV",
.display_set = "SDSP", .display_set = "SDSP",
...@@ -294,14 +281,24 @@ static struct model_data model_conf[END_MODEL] = { ...@@ -294,14 +281,24 @@ static struct model_data model_conf[END_MODEL] = {
.mt_wled = "WLED", .mt_wled = "WLED",
.mt_lcd_switch = "\\Q10", .mt_lcd_switch = "\\Q10",
.lcd_status = "\\GP06", .lcd_status = "\\GP06",
.brightness_up = "\\Q0E",
.brightness_down = "\\Q0F",
.brightness_set = "SPLV", .brightness_set = "SPLV",
.brightness_get = "GPLV", .brightness_get = "GPLV",
.display_set = "SDSP", .display_set = "SDSP",
.display_get = "\\INFB" .display_get = "\\INFB"
}, },
{
.name = "P30",
.mt_wled = "WLED",
.mt_lcd_switch = P30_PREFIX "_Q0E",
.lcd_status = "\\BKLT",
.brightness_up = P30_PREFIX "_Q68",
.brightness_down = P30_PREFIX "_Q69",
.brightness_get = "GPLV",
.display_set = "SDSP",
.display_get = "\\DNXT"
},
{ {
.name = "S1x", .name = "S1x",
.mt_mled = "MLED", .mt_mled = "MLED",
...@@ -309,11 +306,8 @@ static struct model_data model_conf[END_MODEL] = { ...@@ -309,11 +306,8 @@ static struct model_data model_conf[END_MODEL] = {
.mt_wled = "WLED", .mt_wled = "WLED",
.mt_lcd_switch = S1x_PREFIX "Q10" , .mt_lcd_switch = S1x_PREFIX "Q10" ,
.lcd_status = "\\PNOF", .lcd_status = "\\PNOF",
.brightness_up = S1x_PREFIX "Q0F",
.brightness_down = S1x_PREFIX "Q0E",
.brightness_set = "SPLV", .brightness_set = "SPLV",
.brightness_get = "GPLV", .brightness_get = "GPLV"
.brightness_status = "\\BRIT",
}, },
{ {
...@@ -323,22 +317,17 @@ static struct model_data model_conf[END_MODEL] = { ...@@ -323,22 +317,17 @@ static struct model_data model_conf[END_MODEL] = {
.mt_lcd_switch = S2x_PREFIX "_Q10", .mt_lcd_switch = S2x_PREFIX "_Q10",
.lcd_status = "\\BKLI", .lcd_status = "\\BKLI",
.brightness_up = S2x_PREFIX "_Q0B", .brightness_up = S2x_PREFIX "_Q0B",
.brightness_down = S2x_PREFIX "_Q0A", .brightness_down = S2x_PREFIX "_Q0A"
}, },
{ {
.name = "xxN", .name = "xxN",
.mt_mled = "MLED", .mt_mled = "MLED",
// .mt_wled = "WLED", /* WLED present, but not controlled by ACPI */
// .wled_status = "\\PO33",
/* Present, but not controlled by ACPI */
.mt_lcd_switch = xxN_PREFIX "_Q10", .mt_lcd_switch = xxN_PREFIX "_Q10",
.lcd_status = "\\BKLT", .lcd_status = "\\BKLT",
.brightness_up = xxN_PREFIX "_Q0F",
.brightness_down = xxN_PREFIX "_Q0E",
.brightness_set = "SPLV", .brightness_set = "SPLV",
.brightness_get = "GPLV", .brightness_get = "GPLV",
.brightness_status = "\\LBTN",
.display_set = "SDSP", .display_set = "SDSP",
.display_get = "\\ADVG" .display_get = "\\ADVG"
} }
...@@ -663,6 +652,23 @@ proc_write_lcd(struct file *file, const char *buffer, ...@@ -663,6 +652,23 @@ proc_write_lcd(struct file *file, const char *buffer,
} }
static int read_brightness(struct asus_hotk *hotk)
{
int value;
if(hotk->methods->brightness_get) { /* SPLV/GPLV laptop */
if (!read_acpi_int(hotk->handle, hotk->methods->brightness_get,
&value))
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_WARNING "Asus ACPI: Error reading brightness\n");
} else /* No GPLV method */
value = hotk->brightness;
return value;
}
/* /*
* Change the brightness level * Change the brightness level
*/ */
...@@ -679,7 +685,7 @@ static void set_brightness(int value, struct asus_hotk *hotk) ...@@ -679,7 +685,7 @@ static void set_brightness(int value, struct asus_hotk *hotk)
} }
/* No SPLV method if we are here, act as appropriate */ /* No SPLV method if we are here, act as appropriate */
value -= hotk->brightness; value -= read_brightness(hotk);
while (value != 0) { while (value != 0) {
status = acpi_evaluate_object(NULL, (value > 0) ? status = acpi_evaluate_object(NULL, (value > 0) ?
hotk->methods->brightness_up : hotk->methods->brightness_up :
...@@ -692,23 +698,6 @@ static void set_brightness(int value, struct asus_hotk *hotk) ...@@ -692,23 +698,6 @@ static void set_brightness(int value, struct asus_hotk *hotk)
return; return;
} }
static int read_brightness(struct asus_hotk *hotk)
{
int value;
if(hotk->methods->brightness_get) { /* SPLV/GPLV laptop */
if (!read_acpi_int(hotk->handle, hotk->methods->brightness_get,
&value))
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_WARNING "Asus ACPI: Error reading brightness\n");
} else /* No GPLV method */
value = hotk->brightness;
return value;
}
static int static int
proc_read_brn(char *page, char **start, off_t off, int count, int *eof, proc_read_brn(char *page, char **start, off_t off, int count, int *eof,
void *data) void *data)
...@@ -929,12 +918,29 @@ static int __init asus_hotk_get_info(struct asus_hotk *hotk) ...@@ -929,12 +918,29 @@ static int __init asus_hotk_get_info(struct asus_hotk *hotk)
return -ENODEV; return -ENODEV;
} }
/* For testing purposes */ /* This needs to be called for some laptops to init properly */
if (!read_acpi_int(hotk->handle, "BSTS", &bsts_result)) if (!read_acpi_int(hotk->handle, "BSTS", &bsts_result))
printk(KERN_WARNING " Error calling BSTS\n"); printk(KERN_WARNING " Error calling BSTS\n");
else if (bsts_result) else if (bsts_result)
printk(KERN_NOTICE " BSTS called, 0x%02x returned\n", bsts_result); printk(KERN_NOTICE " BSTS called, 0x%02x returned\n", bsts_result);
/* Samsung P30 has a device with a valid _HID whose INIT does not
* return anything. Catch this one and any similar here */
if (buffer.pointer == NULL) {
if (asus_info && /* Samsung P30 */
strncmp(asus_info->oem_table_id, "ODEM", 4) == 0) {
hotk->model = P30;
printk(KERN_NOTICE " Samsung P30 detected, supported\n");
} else {
hotk->model = M2E;
printk(KERN_WARNING " no string returned by INIT\n");
printk(KERN_WARNING " trying default values, supply "
"the developers with your DSDT\n");
}
hotk->methods = &model_conf[hotk->model];
return AE_OK;
}
model = (union acpi_object *) buffer.pointer; model = (union acpi_object *) buffer.pointer;
if (model->type == ACPI_TYPE_STRING) { if (model->type == ACPI_TYPE_STRING) {
printk(KERN_NOTICE " %s model detected, ", model->string.pointer); printk(KERN_NOTICE " %s model detected, ", model->string.pointer);
...@@ -953,12 +959,14 @@ static int __init asus_hotk_get_info(struct asus_hotk *hotk) ...@@ -953,12 +959,14 @@ static int __init asus_hotk_get_info(struct asus_hotk *hotk)
hotk->model = L8L; hotk->model = L8L;
else if (strncmp(model->string.pointer, "M2N", 3) == 0 || else if (strncmp(model->string.pointer, "M2N", 3) == 0 ||
strncmp(model->string.pointer, "M3N", 3) == 0 || strncmp(model->string.pointer, "M3N", 3) == 0 ||
strncmp(model->string.pointer, "M6N", 3) == 0 ||
strncmp(model->string.pointer, "S1N", 3) == 0 || strncmp(model->string.pointer, "S1N", 3) == 0 ||
strncmp(model->string.pointer, "S5N", 3) == 0) strncmp(model->string.pointer, "S5N", 3) == 0)
hotk->model = xxN; hotk->model = xxN;
else if (strncmp(model->string.pointer, "M1", 2) == 0) else if (strncmp(model->string.pointer, "M1", 2) == 0)
hotk->model = M1A; hotk->model = M1A;
else if (strncmp(model->string.pointer, "M2", 2) == 0) else if (strncmp(model->string.pointer, "M2", 2) == 0 ||
strncmp(model->string.pointer, "L4E", 3) == 0)
hotk->model = M2E; hotk->model = M2E;
else if (strncmp(model->string.pointer, "L2", 2) == 0) else if (strncmp(model->string.pointer, "L2", 2) == 0)
hotk->model = L2D; hotk->model = L2D;
...@@ -994,6 +1002,13 @@ static int __init asus_hotk_get_info(struct asus_hotk *hotk) ...@@ -994,6 +1002,13 @@ static int __init asus_hotk_get_info(struct asus_hotk *hotk)
else if (strncmp(model->string.pointer, "S5N", 3) == 0) else if (strncmp(model->string.pointer, "S5N", 3) == 0)
hotk->methods->mt_mled = NULL; hotk->methods->mt_mled = NULL;
/* S5N has no MLED */ /* S5N has no MLED */
else if (strncmp(model->string.pointer, "M6N", 3) == 0) {
hotk->methods->display_get = NULL; //TODO
hotk->methods->lcd_status = "\\_SB.BKLT";
hotk->methods->mt_wled = "WLED";
hotk->methods->wled_status = "\\_SB.PCI0.SBRG.SG13";
/* M6N differs slightly and has a usable WLED */
}
else if (asus_info) { else if (asus_info) {
if (strncmp(asus_info->oem_table_id, "L1", 2) == 0) if (strncmp(asus_info->oem_table_id, "L1", 2) == 0)
hotk->methods->mled_status = NULL; hotk->methods->mled_status = NULL;
......
...@@ -486,14 +486,18 @@ acpi_battery_read_state ( ...@@ -486,14 +486,18 @@ acpi_battery_read_state (
else else
p += sprintf(p, "capacity state: critical\n"); p += sprintf(p, "capacity state: critical\n");
if ((bst->state & 0x01) && (bst->state & 0x02)) if ((bst->state & 0x01) && (bst->state & 0x02)){
p += sprintf(p, "charging state: charging/discharging\n"); p += sprintf(p, "charging state: charging/discharging\n");
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"Battery Charging and Discharging?\n"));
}
else if (bst->state & 0x01) else if (bst->state & 0x01)
p += sprintf(p, "charging state: discharging\n"); p += sprintf(p, "charging state: discharging\n");
else if (bst->state & 0x02) else if (bst->state & 0x02)
p += sprintf(p, "charging state: charging\n"); p += sprintf(p, "charging state: charging\n");
else else {
p += sprintf(p, "charging state: unknown\n"); p += sprintf(p, "charging state: charged\n");
}
if (bst->present_rate == ACPI_BATTERY_VALUE_UNKNOWN) if (bst->present_rate == ACPI_BATTERY_VALUE_UNKNOWN)
p += sprintf(p, "present rate: unknown\n"); p += sprintf(p, "present rate: unknown\n");
...@@ -621,6 +625,7 @@ acpi_battery_add_fs ( ...@@ -621,6 +625,7 @@ acpi_battery_add_fs (
acpi_battery_dir); acpi_battery_dir);
if (!acpi_device_dir(device)) if (!acpi_device_dir(device))
return_VALUE(-ENODEV); return_VALUE(-ENODEV);
acpi_device_dir(device)->owner = THIS_MODULE;
} }
/* 'info' [R] */ /* 'info' [R] */
...@@ -633,6 +638,7 @@ acpi_battery_add_fs ( ...@@ -633,6 +638,7 @@ acpi_battery_add_fs (
else { else {
entry->read_proc = acpi_battery_read_info; entry->read_proc = acpi_battery_read_info;
entry->data = acpi_driver_data(device); entry->data = acpi_driver_data(device);
entry->owner = THIS_MODULE;
} }
/* 'status' [R] */ /* 'status' [R] */
...@@ -645,6 +651,7 @@ acpi_battery_add_fs ( ...@@ -645,6 +651,7 @@ acpi_battery_add_fs (
else { else {
entry->read_proc = acpi_battery_read_state; entry->read_proc = acpi_battery_read_state;
entry->data = acpi_driver_data(device); entry->data = acpi_driver_data(device);
entry->owner = THIS_MODULE;
} }
/* 'alarm' [R/W] */ /* 'alarm' [R/W] */
...@@ -658,6 +665,7 @@ acpi_battery_add_fs ( ...@@ -658,6 +665,7 @@ acpi_battery_add_fs (
entry->read_proc = acpi_battery_read_alarm; entry->read_proc = acpi_battery_read_alarm;
entry->write_proc = acpi_battery_write_alarm; entry->write_proc = acpi_battery_write_alarm;
entry->data = acpi_driver_data(device); entry->data = acpi_driver_data(device);
entry->owner = THIS_MODULE;
} }
return_VALUE(0); return_VALUE(0);
...@@ -809,6 +817,7 @@ acpi_battery_init (void) ...@@ -809,6 +817,7 @@ acpi_battery_init (void)
acpi_battery_dir = proc_mkdir(ACPI_BATTERY_CLASS, acpi_root_dir); acpi_battery_dir = proc_mkdir(ACPI_BATTERY_CLASS, acpi_root_dir);
if (!acpi_battery_dir) if (!acpi_battery_dir)
return_VALUE(-ENODEV); return_VALUE(-ENODEV);
acpi_battery_dir->owner = THIS_MODULE;
result = acpi_bus_register_driver(&acpi_battery_driver); result = acpi_bus_register_driver(&acpi_battery_driver);
if (result < 0) { if (result < 0) {
......
...@@ -108,6 +108,9 @@ static struct file_operations acpi_button_state_fops = { ...@@ -108,6 +108,9 @@ static struct file_operations acpi_button_state_fops = {
-------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */
static struct proc_dir_entry *acpi_button_dir; static struct proc_dir_entry *acpi_button_dir;
extern struct acpi_device *acpi_fixed_pwr_button;
extern struct acpi_device *acpi_fixed_sleep_button;
static int acpi_button_info_seq_show(struct seq_file *seq, void *offset) static int acpi_button_info_seq_show(struct seq_file *seq, void *offset)
{ {
...@@ -187,9 +190,14 @@ acpi_button_add_fs ( ...@@ -187,9 +190,14 @@ acpi_button_add_fs (
break; break;
} }
if (!entry)
return_VALUE(-ENODEV);
entry->owner = THIS_MODULE;
acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device), entry); acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device), entry);
if (!acpi_device_dir(device)) if (!acpi_device_dir(device))
return_VALUE(-ENODEV); return_VALUE(-ENODEV);
acpi_device_dir(device)->owner = THIS_MODULE;
/* 'info' [R] */ /* 'info' [R] */
entry = create_proc_entry(ACPI_BUTTON_FILE_INFO, entry = create_proc_entry(ACPI_BUTTON_FILE_INFO,
...@@ -201,6 +209,7 @@ acpi_button_add_fs ( ...@@ -201,6 +209,7 @@ acpi_button_add_fs (
else { else {
entry->proc_fops = &acpi_button_info_fops; entry->proc_fops = &acpi_button_info_fops;
entry->data = acpi_driver_data(device); entry->data = acpi_driver_data(device);
entry->owner = THIS_MODULE;
} }
/* show lid state [R] */ /* show lid state [R] */
...@@ -214,6 +223,7 @@ acpi_button_add_fs ( ...@@ -214,6 +223,7 @@ acpi_button_add_fs (
else { else {
entry->proc_fops = &acpi_button_state_fops; entry->proc_fops = &acpi_button_state_fops;
entry->data = acpi_driver_data(device); entry->data = acpi_driver_data(device);
entry->owner = THIS_MODULE;
} }
} }
...@@ -225,10 +235,28 @@ static int ...@@ -225,10 +235,28 @@ static int
acpi_button_remove_fs ( acpi_button_remove_fs (
struct acpi_device *device) struct acpi_device *device)
{ {
struct acpi_button *button = NULL;
ACPI_FUNCTION_TRACE("acpi_button_remove_fs"); ACPI_FUNCTION_TRACE("acpi_button_remove_fs");
button = acpi_driver_data(device);
if (acpi_device_dir(device)) { if (acpi_device_dir(device)) {
remove_proc_entry(acpi_device_bid(device), acpi_button_dir); switch (button->type) {
case ACPI_BUTTON_TYPE_POWER:
case ACPI_BUTTON_TYPE_POWERF:
remove_proc_entry(ACPI_BUTTON_SUBCLASS_POWER,
acpi_button_dir);
break;
case ACPI_BUTTON_TYPE_SLEEP:
case ACPI_BUTTON_TYPE_SLEEPF:
remove_proc_entry(ACPI_BUTTON_SUBCLASS_SLEEP,
acpi_button_dir);
break;
case ACPI_BUTTON_TYPE_LID:
remove_proc_entry(ACPI_BUTTON_SUBCLASS_LID,
acpi_button_dir);
break;
}
acpi_device_dir(device) = NULL; acpi_device_dir(device) = NULL;
} }
...@@ -485,6 +513,7 @@ acpi_button_init (void) ...@@ -485,6 +513,7 @@ acpi_button_init (void)
acpi_button_dir = proc_mkdir(ACPI_BUTTON_CLASS, acpi_root_dir); acpi_button_dir = proc_mkdir(ACPI_BUTTON_CLASS, acpi_root_dir);
if (!acpi_button_dir) if (!acpi_button_dir)
return_VALUE(-ENODEV); return_VALUE(-ENODEV);
acpi_button_dir->owner = THIS_MODULE;
result = acpi_bus_register_driver(&acpi_button_driver); result = acpi_bus_register_driver(&acpi_button_driver);
if (result < 0) { if (result < 0) {
...@@ -501,6 +530,12 @@ acpi_button_exit (void) ...@@ -501,6 +530,12 @@ acpi_button_exit (void)
{ {
ACPI_FUNCTION_TRACE("acpi_button_exit"); ACPI_FUNCTION_TRACE("acpi_button_exit");
if(acpi_fixed_pwr_button)
acpi_button_remove(acpi_fixed_pwr_button, ACPI_BUS_TYPE_POWER_BUTTON);
if(acpi_fixed_sleep_button)
acpi_button_remove(acpi_fixed_sleep_button, ACPI_BUS_TYPE_SLEEP_BUTTON);
acpi_bus_unregister_driver(&acpi_button_driver); acpi_bus_unregister_driver(&acpi_button_driver);
remove_proc_entry(ACPI_BUTTON_CLASS, acpi_root_dir); remove_proc_entry(ACPI_BUTTON_CLASS, acpi_root_dir);
......
...@@ -157,6 +157,7 @@ acpi_fan_add_fs ( ...@@ -157,6 +157,7 @@ acpi_fan_add_fs (
acpi_fan_dir); acpi_fan_dir);
if (!acpi_device_dir(device)) if (!acpi_device_dir(device))
return_VALUE(-ENODEV); return_VALUE(-ENODEV);
acpi_device_dir(device)->owner = THIS_MODULE;
} }
/* 'status' [R/W] */ /* 'status' [R/W] */
...@@ -170,6 +171,7 @@ acpi_fan_add_fs ( ...@@ -170,6 +171,7 @@ acpi_fan_add_fs (
entry->read_proc = acpi_fan_read_state; entry->read_proc = acpi_fan_read_state;
entry->write_proc = acpi_fan_write_state; entry->write_proc = acpi_fan_write_state;
entry->data = acpi_driver_data(device); entry->data = acpi_driver_data(device);
entry->owner = THIS_MODULE;
} }
return_VALUE(0); return_VALUE(0);
...@@ -273,6 +275,7 @@ acpi_fan_init (void) ...@@ -273,6 +275,7 @@ acpi_fan_init (void)
acpi_fan_dir = proc_mkdir(ACPI_FAN_CLASS, acpi_root_dir); acpi_fan_dir = proc_mkdir(ACPI_FAN_CLASS, acpi_root_dir);
if (!acpi_fan_dir) if (!acpi_fan_dir)
return_VALUE(-ENODEV); return_VALUE(-ENODEV);
acpi_fan_dir->owner = THIS_MODULE;
result = acpi_bus_register_driver(&acpi_fan_driver); result = acpi_bus_register_driver(&acpi_fan_driver);
if (result < 0) { if (result < 0) {
......
...@@ -63,7 +63,7 @@ int acpi_in_debugger; ...@@ -63,7 +63,7 @@ int acpi_in_debugger;
extern char line_buf[80]; extern char line_buf[80];
#endif /*ENABLE_DEBUGGER*/ #endif /*ENABLE_DEBUGGER*/
static int acpi_irq_irq; static unsigned int acpi_irq_irq;
static OSD_HANDLER acpi_irq_handler; static OSD_HANDLER acpi_irq_handler;
static void *acpi_irq_context; static void *acpi_irq_context;
...@@ -215,7 +215,8 @@ acpi_os_predefined_override (const struct acpi_predefined_names *init_val, ...@@ -215,7 +215,8 @@ acpi_os_predefined_override (const struct acpi_predefined_names *init_val,
*new_val = NULL; *new_val = NULL;
if (!memcmp (init_val->name, "_OS_", 4) && strlen(acpi_os_name)) { if (!memcmp (init_val->name, "_OS_", 4) && strlen(acpi_os_name)) {
printk(KERN_INFO PREFIX "Overriding _OS definition\n"); printk(KERN_INFO PREFIX "Overriding _OS definition %s\n",
acpi_os_name);
*new_val = acpi_os_name; *new_val = acpi_os_name;
} }
...@@ -240,23 +241,22 @@ acpi_irq(int irq, void *dev_id, struct pt_regs *regs) ...@@ -240,23 +241,22 @@ acpi_irq(int irq, void *dev_id, struct pt_regs *regs)
} }
acpi_status acpi_status
acpi_os_install_interrupt_handler(u32 irq, OSD_HANDLER handler, void *context) acpi_os_install_interrupt_handler(u32 gsi, OSD_HANDLER handler, void *context)
{ {
unsigned int irq;
/* /*
* Ignore the irq from the core, and use the value in our copy of the * Ignore the GSI from the core, and use the value in our copy of the
* FADT. It may not be the same if an interrupt source override exists * FADT. It may not be the same if an interrupt source override exists
* for the SCI. * for the SCI.
*/ */
irq = acpi_fadt.sci_int; gsi = acpi_fadt.sci_int;
if (acpi_gsi_to_irq(gsi, &irq) < 0) {
#if defined(CONFIG_IA64) || defined(CONFIG_PCI_USE_VECTOR) printk(KERN_ERR PREFIX "SCI (ACPI GSI %d) not registered\n",
irq = acpi_irq_to_vector(irq); gsi);
if (irq < 0) {
printk(KERN_ERR PREFIX "SCI (ACPI interrupt %d) not registered\n",
acpi_fadt.sci_int);
return AE_OK; return AE_OK;
} }
#endif
acpi_irq_handler = handler; acpi_irq_handler = handler;
acpi_irq_context = context; acpi_irq_context = context;
if (request_irq(irq, acpi_irq, SA_SHIRQ, "acpi", acpi_irq)) { if (request_irq(irq, acpi_irq, SA_SHIRQ, "acpi", acpi_irq)) {
...@@ -272,9 +272,6 @@ acpi_status ...@@ -272,9 +272,6 @@ acpi_status
acpi_os_remove_interrupt_handler(u32 irq, OSD_HANDLER handler) acpi_os_remove_interrupt_handler(u32 irq, OSD_HANDLER handler)
{ {
if (irq) { if (irq) {
#if defined(CONFIG_IA64) || defined(CONFIG_PCI_USE_VECTOR)
irq = acpi_irq_to_vector(irq);
#endif
free_irq(irq, acpi_irq); free_irq(irq, acpi_irq);
acpi_irq_handler = NULL; acpi_irq_handler = NULL;
acpi_irq_irq = 0; acpi_irq_irq = 0;
......
...@@ -368,7 +368,7 @@ acpi_pci_irq_enable ( ...@@ -368,7 +368,7 @@ acpi_pci_irq_enable (
if (!irq) { if (!irq) {
printk(KERN_WARNING PREFIX "No IRQ known for interrupt pin %c of device %s", ('A' + pin), pci_name(dev)); printk(KERN_WARNING PREFIX "No IRQ known for interrupt pin %c of device %s", ('A' + pin), pci_name(dev));
/* Interrupt Line values above 0xF are forbidden */ /* Interrupt Line values above 0xF are forbidden */
if (dev->irq && dev->irq >= 0xF) { if (dev->irq && (dev->irq <= 0xF)) {
printk(" - using IRQ %d\n", dev->irq); printk(" - using IRQ %d\n", dev->irq);
return_VALUE(dev->irq); return_VALUE(dev->irq);
} }
......
This diff is collapsed.
...@@ -119,6 +119,7 @@ acpi_pci_root_add ( ...@@ -119,6 +119,7 @@ acpi_pci_root_add (
{ {
int result = 0; int result = 0;
struct acpi_pci_root *root = NULL; struct acpi_pci_root *root = NULL;
struct acpi_pci_root *tmp;
acpi_status status = AE_OK; acpi_status status = AE_OK;
unsigned long value = 0; unsigned long value = 0;
acpi_handle handle = NULL; acpi_handle handle = NULL;
...@@ -186,6 +187,13 @@ acpi_pci_root_add ( ...@@ -186,6 +187,13 @@ acpi_pci_root_add (
goto end; goto end;
} }
/* Some systems have wrong _BBN */
list_for_each_entry(tmp, &acpi_pci_roots, node) {
if ((tmp->id.segment == root->id.segment)
&& (tmp->id.bus == root->id.bus))
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
"Wrong _BBN value, please reboot and using option 'pci=noacpi'\n"));
}
/* /*
* Device & Function * Device & Function
* ----------------- * -----------------
...@@ -272,7 +280,7 @@ static int __init acpi_pci_root_init (void) ...@@ -272,7 +280,7 @@ static int __init acpi_pci_root_init (void)
{ {
ACPI_FUNCTION_TRACE("acpi_pci_root_init"); ACPI_FUNCTION_TRACE("acpi_pci_root_init");
if (acpi_disabled) if (acpi_pci_disabled)
return_VALUE(0); return_VALUE(0);
/* DEBUG: /* DEBUG:
......
...@@ -1190,6 +1190,7 @@ acpi_cpufreq_add_file ( ...@@ -1190,6 +1190,7 @@ acpi_cpufreq_add_file (
entry->proc_fops = &acpi_processor_perf_fops; entry->proc_fops = &acpi_processor_perf_fops;
entry->proc_fops->write = acpi_processor_write_performance; entry->proc_fops->write = acpi_processor_write_performance;
entry->data = acpi_driver_data(device); entry->data = acpi_driver_data(device);
entry->owner = THIS_MODULE;
} }
return_VOID; return_VOID;
} }
...@@ -2066,6 +2067,7 @@ acpi_processor_add_fs ( ...@@ -2066,6 +2067,7 @@ acpi_processor_add_fs (
if (!acpi_device_dir(device)) if (!acpi_device_dir(device))
return_VALUE(-ENODEV); return_VALUE(-ENODEV);
} }
acpi_device_dir(device)->owner = THIS_MODULE;
/* 'info' [R] */ /* 'info' [R] */
entry = create_proc_entry(ACPI_PROCESSOR_FILE_INFO, entry = create_proc_entry(ACPI_PROCESSOR_FILE_INFO,
...@@ -2077,6 +2079,7 @@ acpi_processor_add_fs ( ...@@ -2077,6 +2079,7 @@ acpi_processor_add_fs (
else { else {
entry->proc_fops = &acpi_processor_info_fops; entry->proc_fops = &acpi_processor_info_fops;
entry->data = acpi_driver_data(device); entry->data = acpi_driver_data(device);
entry->owner = THIS_MODULE;
} }
/* 'power' [R] */ /* 'power' [R] */
...@@ -2089,6 +2092,7 @@ acpi_processor_add_fs ( ...@@ -2089,6 +2092,7 @@ acpi_processor_add_fs (
else { else {
entry->proc_fops = &acpi_processor_power_fops; entry->proc_fops = &acpi_processor_power_fops;
entry->data = acpi_driver_data(device); entry->data = acpi_driver_data(device);
entry->owner = THIS_MODULE;
} }
/* 'throttling' [R/W] */ /* 'throttling' [R/W] */
...@@ -2102,6 +2106,7 @@ acpi_processor_add_fs ( ...@@ -2102,6 +2106,7 @@ acpi_processor_add_fs (
entry->proc_fops = &acpi_processor_throttling_fops; entry->proc_fops = &acpi_processor_throttling_fops;
entry->proc_fops->write = acpi_processor_write_throttling; entry->proc_fops->write = acpi_processor_write_throttling;
entry->data = acpi_driver_data(device); entry->data = acpi_driver_data(device);
entry->owner = THIS_MODULE;
} }
/* 'limit' [R/W] */ /* 'limit' [R/W] */
...@@ -2115,6 +2120,7 @@ acpi_processor_add_fs ( ...@@ -2115,6 +2120,7 @@ acpi_processor_add_fs (
entry->proc_fops = &acpi_processor_limit_fops; entry->proc_fops = &acpi_processor_limit_fops;
entry->proc_fops->write = acpi_processor_write_limit; entry->proc_fops->write = acpi_processor_write_limit;
entry->data = acpi_driver_data(device); entry->data = acpi_driver_data(device);
entry->owner = THIS_MODULE;
} }
return_VALUE(0); return_VALUE(0);
...@@ -2128,6 +2134,11 @@ acpi_processor_remove_fs ( ...@@ -2128,6 +2134,11 @@ acpi_processor_remove_fs (
ACPI_FUNCTION_TRACE("acpi_processor_remove_fs"); ACPI_FUNCTION_TRACE("acpi_processor_remove_fs");
if (acpi_device_dir(device)) { if (acpi_device_dir(device)) {
remove_proc_entry(ACPI_PROCESSOR_FILE_INFO,acpi_device_dir(device));
remove_proc_entry(ACPI_PROCESSOR_FILE_POWER,acpi_device_dir(device));
remove_proc_entry(ACPI_PROCESSOR_FILE_THROTTLING,
acpi_device_dir(device));
remove_proc_entry(ACPI_PROCESSOR_FILE_LIMIT,acpi_device_dir(device));
remove_proc_entry(acpi_device_bid(device), acpi_processor_dir); remove_proc_entry(acpi_device_bid(device), acpi_processor_dir);
acpi_device_dir(device) = NULL; acpi_device_dir(device) = NULL;
} }
...@@ -2385,6 +2396,7 @@ acpi_processor_init (void) ...@@ -2385,6 +2396,7 @@ acpi_processor_init (void)
acpi_processor_dir = proc_mkdir(ACPI_PROCESSOR_CLASS, acpi_root_dir); acpi_processor_dir = proc_mkdir(ACPI_PROCESSOR_CLASS, acpi_root_dir);
if (!acpi_processor_dir) if (!acpi_processor_dir)
return_VALUE(-ENODEV); return_VALUE(-ENODEV);
acpi_processor_dir->owner = THIS_MODULE;
result = acpi_bus_register_driver(&acpi_processor_driver); result = acpi_bus_register_driver(&acpi_processor_driver);
if (result < 0) { if (result < 0) {
......
...@@ -15,6 +15,8 @@ ACPI_MODULE_NAME ("scan") ...@@ -15,6 +15,8 @@ ACPI_MODULE_NAME ("scan")
#define STRUCT_TO_INT(s) (*((int*)&s)) #define STRUCT_TO_INT(s) (*((int*)&s))
extern struct acpi_device *acpi_root; extern struct acpi_device *acpi_root;
struct acpi_device *acpi_fixed_pwr_button;
struct acpi_device *acpi_fixed_sleep_button;
#define ACPI_BUS_CLASS "system_bus" #define ACPI_BUS_CLASS "system_bus"
...@@ -900,10 +902,13 @@ acpi_bus_scan_fixed ( ...@@ -900,10 +902,13 @@ acpi_bus_scan_fixed (
struct acpi_device *root) struct acpi_device *root)
{ {
int result = 0; int result = 0;
struct acpi_device *device = NULL;
ACPI_FUNCTION_TRACE("acpi_bus_scan_fixed"); ACPI_FUNCTION_TRACE("acpi_bus_scan_fixed");
acpi_fixed_pwr_button = NULL;
acpi_fixed_sleep_button = NULL;
if (!root) if (!root)
return_VALUE(-ENODEV); return_VALUE(-ENODEV);
...@@ -911,11 +916,11 @@ acpi_bus_scan_fixed ( ...@@ -911,11 +916,11 @@ acpi_bus_scan_fixed (
* Enumerate all fixed-feature devices. * Enumerate all fixed-feature devices.
*/ */
if (acpi_fadt.pwr_button == 0) if (acpi_fadt.pwr_button == 0)
result = acpi_bus_add(&device, acpi_root, result = acpi_bus_add(&acpi_fixed_pwr_button, acpi_root,
NULL, ACPI_BUS_TYPE_POWER_BUTTON); NULL, ACPI_BUS_TYPE_POWER_BUTTON);
if (acpi_fadt.sleep_button == 0) if (acpi_fadt.sleep_button == 0)
result = acpi_bus_add(&device, acpi_root, result = acpi_bus_add(&acpi_fixed_sleep_button, acpi_root,
NULL, ACPI_BUS_TYPE_SLEEP_BUTTON); NULL, ACPI_BUS_TYPE_SLEEP_BUTTON);
return_VALUE(result); return_VALUE(result);
......
...@@ -1060,6 +1060,7 @@ acpi_thermal_add_fs ( ...@@ -1060,6 +1060,7 @@ acpi_thermal_add_fs (
acpi_thermal_dir); acpi_thermal_dir);
if (!acpi_device_dir(device)) if (!acpi_device_dir(device))
return_VALUE(-ENODEV); return_VALUE(-ENODEV);
acpi_device_dir(device)->owner = THIS_MODULE;
} }
/* 'state' [R] */ /* 'state' [R] */
...@@ -1072,6 +1073,7 @@ acpi_thermal_add_fs ( ...@@ -1072,6 +1073,7 @@ acpi_thermal_add_fs (
else { else {
entry->proc_fops = &acpi_thermal_state_fops; entry->proc_fops = &acpi_thermal_state_fops;
entry->data = acpi_driver_data(device); entry->data = acpi_driver_data(device);
entry->owner = THIS_MODULE;
} }
/* 'temperature' [R] */ /* 'temperature' [R] */
...@@ -1084,6 +1086,7 @@ acpi_thermal_add_fs ( ...@@ -1084,6 +1086,7 @@ acpi_thermal_add_fs (
else { else {
entry->proc_fops = &acpi_thermal_temp_fops; entry->proc_fops = &acpi_thermal_temp_fops;
entry->data = acpi_driver_data(device); entry->data = acpi_driver_data(device);
entry->owner = THIS_MODULE;
} }
/* 'trip_points' [R/W] */ /* 'trip_points' [R/W] */
...@@ -1096,6 +1099,7 @@ acpi_thermal_add_fs ( ...@@ -1096,6 +1099,7 @@ acpi_thermal_add_fs (
else { else {
entry->proc_fops = &acpi_thermal_trip_fops; entry->proc_fops = &acpi_thermal_trip_fops;
entry->data = acpi_driver_data(device); entry->data = acpi_driver_data(device);
entry->owner = THIS_MODULE;
} }
/* 'cooling_mode' [R/W] */ /* 'cooling_mode' [R/W] */
...@@ -1108,6 +1112,7 @@ acpi_thermal_add_fs ( ...@@ -1108,6 +1112,7 @@ acpi_thermal_add_fs (
else { else {
entry->proc_fops = &acpi_thermal_cooling_fops; entry->proc_fops = &acpi_thermal_cooling_fops;
entry->data = acpi_driver_data(device); entry->data = acpi_driver_data(device);
entry->owner = THIS_MODULE;
} }
/* 'polling_frequency' [R/W] */ /* 'polling_frequency' [R/W] */
...@@ -1120,6 +1125,7 @@ acpi_thermal_add_fs ( ...@@ -1120,6 +1125,7 @@ acpi_thermal_add_fs (
else { else {
entry->proc_fops = &acpi_thermal_polling_fops; entry->proc_fops = &acpi_thermal_polling_fops;
entry->data = acpi_driver_data(device); entry->data = acpi_driver_data(device);
entry->owner = THIS_MODULE;
} }
return_VALUE(0); return_VALUE(0);
...@@ -1338,6 +1344,7 @@ acpi_thermal_init (void) ...@@ -1338,6 +1344,7 @@ acpi_thermal_init (void)
acpi_thermal_dir = proc_mkdir(ACPI_THERMAL_CLASS, acpi_root_dir); acpi_thermal_dir = proc_mkdir(ACPI_THERMAL_CLASS, acpi_root_dir);
if (!acpi_thermal_dir) if (!acpi_thermal_dir)
return_VALUE(-ENODEV); return_VALUE(-ENODEV);
acpi_thermal_dir->owner = THIS_MODULE;
result = acpi_bus_register_driver(&acpi_thermal_driver); result = acpi_bus_register_driver(&acpi_thermal_driver);
if (result < 0) { if (result < 0) {
......
...@@ -502,6 +502,8 @@ add_device(void) ...@@ -502,6 +502,8 @@ add_device(void)
proc = create_proc_read_entry(item->name, proc = create_proc_read_entry(item->name,
S_IFREG | S_IRUGO | S_IWUSR, S_IFREG | S_IRUGO | S_IWUSR,
toshiba_proc_dir, (read_proc_t*)dispatch_read, item); toshiba_proc_dir, (read_proc_t*)dispatch_read, item);
if (proc)
proc->owner = THIS_MODULE;
if (proc && item->write_func) if (proc && item->write_func)
proc->write_proc = (write_proc_t*)dispatch_write; proc->write_proc = (write_proc_t*)dispatch_write;
} }
...@@ -525,6 +527,8 @@ toshiba_acpi_init(void) ...@@ -525,6 +527,8 @@ toshiba_acpi_init(void)
acpi_status status = AE_OK; acpi_status status = AE_OK;
u32 hci_result; u32 hci_result;
if (acpi_disabled)
return -ENODEV;
/* simple device detection: look for HCI method */ /* simple device detection: look for HCI method */
if (is_valid_acpi_path(METHOD_HCI_1)) if (is_valid_acpi_path(METHOD_HCI_1))
method_hci = METHOD_HCI_1; method_hci = METHOD_HCI_1;
...@@ -547,6 +551,7 @@ toshiba_acpi_init(void) ...@@ -547,6 +551,7 @@ toshiba_acpi_init(void)
if (!toshiba_proc_dir) { if (!toshiba_proc_dir) {
status = AE_ERROR; status = AE_ERROR;
} else { } else {
toshiba_proc_dir->owner = THIS_MODULE;
status = add_device(); status = add_device();
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
remove_proc_entry(PROC_TOSHIBA, acpi_root_dir); remove_proc_entry(PROC_TOSHIBA, acpi_root_dir);
......
...@@ -188,14 +188,14 @@ acpi_os_get_physical_address ( ...@@ -188,14 +188,14 @@ acpi_os_get_physical_address (
acpi_status acpi_status
acpi_os_install_interrupt_handler ( acpi_os_install_interrupt_handler (
u32 interrupt_number, u32 gsi,
OSD_HANDLER service_routine, OSD_HANDLER service_routine,
void *context); void *context);
acpi_status acpi_status
acpi_os_remove_interrupt_handler ( acpi_os_remove_interrupt_handler (
u32 interrupt_number, u32 interrupt_number,
OSD_HANDLER service_routine); OSD_HANDLER service_routine);
/* /*
......
...@@ -109,7 +109,14 @@ extern int acpi_noirq; ...@@ -109,7 +109,14 @@ extern int acpi_noirq;
extern int acpi_strict; extern int acpi_strict;
extern int acpi_disabled; extern int acpi_disabled;
extern int acpi_ht; extern int acpi_ht;
static inline void disable_acpi(void) { acpi_disabled = 1; acpi_ht = 0; } extern int acpi_pci_disabled;
static inline void disable_acpi(void)
{
acpi_disabled = 1;
acpi_ht = 0;
acpi_pci_disabled = 1;
acpi_noirq = 1;
}
/* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */ /* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */
#define FIX_ACPI_PAGES 4 #define FIX_ACPI_PAGES 4
...@@ -118,6 +125,7 @@ extern int acpi_gsi_to_irq(u32 gsi, unsigned int *irq); ...@@ -118,6 +125,7 @@ extern int acpi_gsi_to_irq(u32 gsi, unsigned int *irq);
#ifdef CONFIG_X86_IO_APIC #ifdef CONFIG_X86_IO_APIC
extern int skip_ioapic_setup; extern int skip_ioapic_setup;
extern int acpi_irq_to_vector(u32 irq); /* deprecated in favor of acpi_gsi_to_irq */ extern int acpi_irq_to_vector(u32 irq); /* deprecated in favor of acpi_gsi_to_irq */
extern int acpi_skip_timer_override;
static inline void disable_ioapic_setup(void) static inline void disable_ioapic_setup(void)
{ {
...@@ -143,9 +151,15 @@ static inline void disable_ioapic_setup(void) ...@@ -143,9 +151,15 @@ static inline void disable_ioapic_setup(void)
#ifdef CONFIG_ACPI_PCI #ifdef CONFIG_ACPI_PCI
static inline void acpi_noirq_set(void) { acpi_noirq = 1; } static inline void acpi_noirq_set(void) { acpi_noirq = 1; }
static inline void acpi_disable_pci(void)
{
acpi_pci_disabled = 1;
acpi_noirq_set();
}
extern int acpi_irq_balance_set(char *str); extern int acpi_irq_balance_set(char *str);
#else #else
static inline void acpi_noirq_set(void) { } static inline void acpi_noirq_set(void) { }
static inline void acpi_disable_pci(void) { }
static inline int acpi_irq_balance_set(char *str) { return 0; } static inline int acpi_irq_balance_set(char *str) { return 0; }
#endif #endif
......
...@@ -89,6 +89,7 @@ ia64_acpi_release_global_lock (unsigned int *lock) ...@@ -89,6 +89,7 @@ ia64_acpi_release_global_lock (unsigned int *lock)
((Acq) = ia64_acpi_release_global_lock((unsigned int *) GLptr)) ((Acq) = ia64_acpi_release_global_lock((unsigned int *) GLptr))
#define acpi_disabled 0 /* ACPI always enabled on IA64 */ #define acpi_disabled 0 /* ACPI always enabled on IA64 */
#define acpi_pci_disabled 0 /* ACPI PCI always enabled on IA64 */
#define acpi_strict 1 /* no ACPI spec workarounds on IA64 */ #define acpi_strict 1 /* no ACPI spec workarounds on IA64 */
static inline void disable_acpi(void) { } static inline void disable_acpi(void) { }
......
...@@ -106,8 +106,15 @@ extern int acpi_ioapic; ...@@ -106,8 +106,15 @@ extern int acpi_ioapic;
extern int acpi_noirq; extern int acpi_noirq;
extern int acpi_strict; extern int acpi_strict;
extern int acpi_disabled; extern int acpi_disabled;
extern int acpi_pci_disabled;
extern int acpi_ht; extern int acpi_ht;
static inline void disable_acpi(void) { acpi_disabled = 1; acpi_ht = 0; } static inline void disable_acpi(void)
{
acpi_disabled = 1;
acpi_ht = 0;
acpi_pci_disabled = 1;
acpi_noirq = 1;
}
/* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */ /* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */
#define FIX_ACPI_PAGES 4 #define FIX_ACPI_PAGES 4
...@@ -121,9 +128,15 @@ extern int acpi_gsi_to_irq(u32 gsi, unsigned int *irq); ...@@ -121,9 +128,15 @@ extern int acpi_gsi_to_irq(u32 gsi, unsigned int *irq);
#ifdef CONFIG_ACPI_PCI #ifdef CONFIG_ACPI_PCI
static inline void acpi_noirq_set(void) { acpi_noirq = 1; } static inline void acpi_noirq_set(void) { acpi_noirq = 1; }
static inline void acpi_disable_pci(void)
{
acpi_pci_disabled = 1;
acpi_noirq_set();
}
extern int acpi_irq_balance_set(char *str); extern int acpi_irq_balance_set(char *str);
#else #else
static inline void acpi_noirq_set(void) { } static inline void acpi_noirq_set(void) { }
static inline void acpi_disable_pci(void) { }
static inline int acpi_irq_balance_set(char *str) { return 0; } static inline int acpi_irq_balance_set(char *str) { return 0; }
#endif #endif
...@@ -144,6 +157,7 @@ extern void acpi_reserve_bootmem(void); ...@@ -144,6 +157,7 @@ extern void acpi_reserve_bootmem(void);
#define boot_cpu_physical_apicid boot_cpu_id #define boot_cpu_physical_apicid boot_cpu_id
extern int acpi_disabled; extern int acpi_disabled;
extern int acpi_pci_disabled;
#define dmi_broken (0) #define dmi_broken (0)
#define BROKEN_ACPI_Sx 0x0001 #define BROKEN_ACPI_Sx 0x0001
......
...@@ -438,6 +438,7 @@ struct pci_dev; ...@@ -438,6 +438,7 @@ struct pci_dev;
int acpi_pci_irq_enable (struct pci_dev *dev); int acpi_pci_irq_enable (struct pci_dev *dev);
int acpi_pci_irq_init (void); int acpi_pci_irq_init (void);
int acpi_gsi_to_irq (u32 gsi, unsigned int *irq);
struct acpi_pci_driver { struct acpi_pci_driver {
struct acpi_pci_driver *next; struct acpi_pci_driver *next;
......
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