Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 80bb82af authored by Aleksey Gorelov's avatar Aleksey Gorelov Committed by Linus Torvalds
Browse files

[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: default avatarKarsten Keil <kkeil@suse.de>
Signed-off-by: default avatarAleksey Gorelov <aleksey_gorelov@phoenix.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent c434b7a6
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -226,6 +226,24 @@ static int pirq_via_set(struct pci_dev *router, struct pci_dev *dev, int pirq, i
	return 1;
}

/*
 * The VIA pirq rules are nibble-based, like ALI,
 * but without the ugly irq number munging.
 * However, for 82C586, nibble map is different .
 */
static int pirq_via586_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
{
	static unsigned int pirqmap[4] = { 3, 2, 5, 1 };
	return read_config_nybble(router, 0x55, pirqmap[pirq-1]);
}

static int pirq_via586_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
{
	static unsigned int pirqmap[4] = { 3, 2, 5, 1 };
	write_config_nybble(router, 0x55, pirqmap[pirq-1], irq);
	return 1;
}

/*
 * ITE 8330G pirq rules are nibble-based
 * FIXME: pirqmap may be { 1, 0, 3, 2 },
@@ -512,6 +530,10 @@ static __init int via_router_probe(struct irq_router *r, struct pci_dev *router,
	switch(device)
	{
		case PCI_DEVICE_ID_VIA_82C586_0:
			r->name = "VIA";
			r->get = pirq_via586_get;
			r->set = pirq_via586_set;
			return 1;
		case PCI_DEVICE_ID_VIA_82C596:
		case PCI_DEVICE_ID_VIA_82C686:
		case PCI_DEVICE_ID_VIA_8231: