diff options
author | Aleksey Gorelov <Aleksey_Gorelov@Phoenix.com> | 2005-06-23 03:08:29 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-23 12:45:11 -0400 |
commit | 80bb82afea9eeb94ae3bfed418d079930da5d3b3 (patch) | |
tree | bc02d1f85c2c3c227b9cfbef51d708f988b71156 /arch/i386/pci | |
parent | c434b7a6aedfe428ad17cd61b21b125a7b7a29ce (diff) |
[PATCH] VIA 82C586B IRQ routing fix
According to the VIA 82C586B datasheet (still available from
http://gkernel.sourceforge.net/specs/via/586b.pdf.bz2) this chip need a
special PIRQ mapping.
Signed-off-by: Karsten Keil <kkeil@suse.de>
Signed-off-by: Aleksey Gorelov <aleksey_gorelov@phoenix.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/i386/pci')
-rw-r--r-- | arch/i386/pci/irq.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/arch/i386/pci/irq.c b/arch/i386/pci/irq.c index da21b1d07c15..83458f81e661 100644 --- a/arch/i386/pci/irq.c +++ b/arch/i386/pci/irq.c | |||
@@ -227,6 +227,24 @@ static int pirq_via_set(struct pci_dev *router, struct pci_dev *dev, int pirq, i | |||
227 | } | 227 | } |
228 | 228 | ||
229 | /* | 229 | /* |
230 | * The VIA pirq rules are nibble-based, like ALI, | ||
231 | * but without the ugly irq number munging. | ||
232 | * However, for 82C586, nibble map is different . | ||
233 | */ | ||
234 | static int pirq_via586_get(struct pci_dev *router, struct pci_dev *dev, int pirq) | ||
235 | { | ||
236 | static unsigned int pirqmap[4] = { 3, 2, 5, 1 }; | ||
237 | return read_config_nybble(router, 0x55, pirqmap[pirq-1]); | ||
238 | } | ||
239 | |||
240 | static int pirq_via586_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) | ||
241 | { | ||
242 | static unsigned int pirqmap[4] = { 3, 2, 5, 1 }; | ||
243 | write_config_nybble(router, 0x55, pirqmap[pirq-1], irq); | ||
244 | return 1; | ||
245 | } | ||
246 | |||
247 | /* | ||
230 | * ITE 8330G pirq rules are nibble-based | 248 | * ITE 8330G pirq rules are nibble-based |
231 | * FIXME: pirqmap may be { 1, 0, 3, 2 }, | 249 | * FIXME: pirqmap may be { 1, 0, 3, 2 }, |
232 | * 2+3 are both mapped to irq 9 on my system | 250 | * 2+3 are both mapped to irq 9 on my system |
@@ -512,6 +530,10 @@ static __init int via_router_probe(struct irq_router *r, struct pci_dev *router, | |||
512 | switch(device) | 530 | switch(device) |
513 | { | 531 | { |
514 | case PCI_DEVICE_ID_VIA_82C586_0: | 532 | case PCI_DEVICE_ID_VIA_82C586_0: |
533 | r->name = "VIA"; | ||
534 | r->get = pirq_via586_get; | ||
535 | r->set = pirq_via586_set; | ||
536 | return 1; | ||
515 | case PCI_DEVICE_ID_VIA_82C596: | 537 | case PCI_DEVICE_ID_VIA_82C596: |
516 | case PCI_DEVICE_ID_VIA_82C686: | 538 | case PCI_DEVICE_ID_VIA_82C686: |
517 | case PCI_DEVICE_ID_VIA_8231: | 539 | case PCI_DEVICE_ID_VIA_8231: |