xref: /OK3568_Linux_fs/kernel/arch/mips/pci/fixup-rbtx4938.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Toshiba rbtx4938 pci routines
3*4882a593Smuzhiyun  * Copyright (C) 2000-2001 Toshiba Corporation
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * 2003-2005 (c) MontaVista Software, Inc. This file is licensed under the
6*4882a593Smuzhiyun  * terms of the GNU General Public License version 2. This program is
7*4882a593Smuzhiyun  * licensed "as is" without any warranty of any kind, whether express
8*4882a593Smuzhiyun  * or implied.
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Support for TX4938 in 2.6 - Manish Lachwani (mlachwani@mvista.com)
11*4882a593Smuzhiyun  */
12*4882a593Smuzhiyun #include <linux/types.h>
13*4882a593Smuzhiyun #include <asm/txx9/pci.h>
14*4882a593Smuzhiyun #include <asm/txx9/rbtx4938.h>
15*4882a593Smuzhiyun 
rbtx4938_pci_map_irq(const struct pci_dev * dev,u8 slot,u8 pin)16*4882a593Smuzhiyun int rbtx4938_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
17*4882a593Smuzhiyun {
18*4882a593Smuzhiyun 	int irq = tx4938_pcic1_map_irq(dev, slot);
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun 	if (irq >= 0)
21*4882a593Smuzhiyun 		return irq;
22*4882a593Smuzhiyun 	irq = pin;
23*4882a593Smuzhiyun 	/* IRQ rotation */
24*4882a593Smuzhiyun 	irq--;	/* 0-3 */
25*4882a593Smuzhiyun 	if (slot == TX4927_PCIC_IDSEL_AD_TO_SLOT(23)) {
26*4882a593Smuzhiyun 		/* PCI CardSlot (IDSEL=A23) */
27*4882a593Smuzhiyun 		/* PCIA => PCIA (IDSEL=A23) */
28*4882a593Smuzhiyun 		irq = (irq + 0 + slot) % 4;
29*4882a593Smuzhiyun 	} else {
30*4882a593Smuzhiyun 		/* PCI Backplane */
31*4882a593Smuzhiyun 		if (txx9_pci_option & TXX9_PCI_OPT_PICMG)
32*4882a593Smuzhiyun 			irq = (irq + 33 - slot) % 4;
33*4882a593Smuzhiyun 		else
34*4882a593Smuzhiyun 			irq = (irq + 3 + slot) % 4;
35*4882a593Smuzhiyun 	}
36*4882a593Smuzhiyun 	irq++;	/* 1-4 */
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun 	switch (irq) {
39*4882a593Smuzhiyun 	case 1:
40*4882a593Smuzhiyun 		irq = RBTX4938_IRQ_IOC_PCIA;
41*4882a593Smuzhiyun 		break;
42*4882a593Smuzhiyun 	case 2:
43*4882a593Smuzhiyun 		irq = RBTX4938_IRQ_IOC_PCIB;
44*4882a593Smuzhiyun 		break;
45*4882a593Smuzhiyun 	case 3:
46*4882a593Smuzhiyun 		irq = RBTX4938_IRQ_IOC_PCIC;
47*4882a593Smuzhiyun 		break;
48*4882a593Smuzhiyun 	case 4:
49*4882a593Smuzhiyun 		irq = RBTX4938_IRQ_IOC_PCID;
50*4882a593Smuzhiyun 		break;
51*4882a593Smuzhiyun 	}
52*4882a593Smuzhiyun 	return irq;
53*4882a593Smuzhiyun }
54