Commit f5bfafe3 authored by Daniel Ritz's avatar Daniel Ritz Committed by Greg Kroah-Hartman

[PATCH] PCI: fix irq routing on acer travelmate 360 laptop

Fixes interrupt routing on acer travelmate 360 notebooks.  it looks like
the bios assigned the wrong pirq value for the cardbus bridge.  just
assigning irq 10 to all devices with pirq 0x63 would break second usb port.
pirq 0x68 seems to be right one for cardbus.
Signed-off-by: default avatarDaniel Ritz <daniel.ritz@gmx.ch>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarGreg Kroah-Hartman <greg@kroah.com>
parent 08dfd470
...@@ -359,6 +359,21 @@ static __init int fix_broken_hp_bios_irq9(struct dmi_blacklist *d) ...@@ -359,6 +359,21 @@ static __init int fix_broken_hp_bios_irq9(struct dmi_blacklist *d)
return 0; return 0;
} }
/*
* Work around broken Acer TravelMate 360 Notebooks which assign Cardbus to
* IRQ 11 even though it is actually wired to IRQ 10
*/
static __init int fix_acer_tm360_irqrouting(struct dmi_blacklist *d)
{
#ifdef CONFIG_PCI
extern int acer_tm360_irqrouting;
if (acer_tm360_irqrouting == 0) {
acer_tm360_irqrouting = 1;
printk(KERN_INFO "%s detected - fixing broken IRQ routing\n", d->ident);
}
#endif
return 0;
}
/* /*
* Check for clue free BIOS implementations who use * Check for clue free BIOS implementations who use
* the following QA technique * the following QA technique
...@@ -844,6 +859,13 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={ ...@@ -844,6 +859,13 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook Model GE"), MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook Model GE"),
MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736") MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736")
} }, } },
{ fix_acer_tm360_irqrouting, "Acer TravelMate 36x Laptop", {
MATCH(DMI_SYS_VENDOR, "Acer"),
MATCH(DMI_PRODUCT_NAME, "TravelMate 360"),
NO_MATCH, NO_MATCH
} },
/* /*
...@@ -1033,6 +1055,13 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={ ...@@ -1033,6 +1055,13 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
MATCH(DMI_BOARD_NAME, "PR-DLS"), MATCH(DMI_BOARD_NAME, "PR-DLS"),
MATCH(DMI_BIOS_VERSION, "ASUS PR-DLS ACPI BIOS Revision 1010"), MATCH(DMI_BIOS_VERSION, "ASUS PR-DLS ACPI BIOS Revision 1010"),
MATCH(DMI_BIOS_DATE, "03/21/2003") }}, MATCH(DMI_BIOS_DATE, "03/21/2003") }},
{ disable_acpi_pci, "Acer TravelMate 36x Laptop", {
MATCH(DMI_SYS_VENDOR, "Acer"),
MATCH(DMI_PRODUCT_NAME, "TravelMate 360"),
NO_MATCH, NO_MATCH
} },
#endif #endif
{ NULL, } { NULL, }
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#define PIRQ_VERSION 0x0100 #define PIRQ_VERSION 0x0100
int broken_hp_bios_irq9; int broken_hp_bios_irq9;
int acer_tm360_irqrouting;
static struct irq_routing_table *pirq_table; static struct irq_routing_table *pirq_table;
...@@ -745,6 +746,14 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) ...@@ -745,6 +746,14 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign)
r->set(pirq_router_dev, dev, pirq, 11); r->set(pirq_router_dev, dev, pirq, 11);
} }
/* same for Acer Travelmate 360, but with CB and irq 11 -> 10 */
if (acer_tm360_irqrouting && dev->irq == 11 && dev->vendor == PCI_VENDOR_ID_O2) {
pirq = 0x68;
mask = 0x400;
dev->irq = r->get(pirq_router_dev, dev, pirq);
pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
}
/* /*
* Find the best IRQ to assign: use the one * Find the best IRQ to assign: use the one
* reported by the device if possible. * reported by the device if possible.
......
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