11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * BRIEF MODULE DESCRIPTION
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	Board specific pci fixups.
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright 2001 MontaVista Software Inc.
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Author: MontaVista Software, Inc.
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *         	ppopov@mvista.com or source@mvista.com
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  This program is free software; you can redistribute  it and/or modify it
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  under  the terms of  the GNU General  Public License as published by the
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Free Software Foundation;  either version 2 of the  License, or (at your
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  option) any later version.
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  You should have received a copy of the  GNU General Public License along
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  with this program; if not, write  to the Free Software Foundation, Inc.,
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  675 Mass Ave, Cambridge, MA 02139, USA.
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/types.h>
3189d63fe179520b11f54de1f26755b7444c79e73aAtsushi Nemoto#include <asm/txx9/pci.h>
3222b1d707ffc99faebd86257ad19d5bb9fc624734Atsushi Nemoto#include <asm/txx9/jmr3927.h>
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34edcaf1a6a77315562e9781245cc8e028c9a921dcAtsushi Nemotoint __init jmr3927_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char irq = pin;
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* IRQ rotation (PICMG) */
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	irq--;			/* 0-3 */
4089d63fe179520b11f54de1f26755b7444c79e73aAtsushi Nemoto	if (slot == TX3927_PCIC_IDSEL_AD_TO_SLOT(23)) {
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* PCI CardSlot (IDSEL=A23, DevNu=12) */
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* PCIA => PCIC (IDSEL=A23) */
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* NOTE: JMR3927 JP1 must be set to OPEN */
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		irq = (irq + 2) % 4;
4589d63fe179520b11f54de1f26755b7444c79e73aAtsushi Nemoto	} else if (slot == TX3927_PCIC_IDSEL_AD_TO_SLOT(22)) {
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* PCI CardSlot (IDSEL=A22, DevNu=11) */
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* PCIA => PCIA (IDSEL=A22) */
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* NOTE: JMR3927 JP1 must be set to OPEN */
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		irq = (irq + 0) % 4;
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* PCI Backplane */
5289d63fe179520b11f54de1f26755b7444c79e73aAtsushi Nemoto		if (txx9_pci_option & TXX9_PCI_OPT_PICMG)
5389d63fe179520b11f54de1f26755b7444c79e73aAtsushi Nemoto			irq = (irq + 33 - slot) % 4;
5489d63fe179520b11f54de1f26755b7444c79e73aAtsushi Nemoto		else
5589d63fe179520b11f54de1f26755b7444c79e73aAtsushi Nemoto			irq = (irq + 3 + slot) % 4;
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	irq++;			/* 1-4 */
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (irq) {
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 1:
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		irq = JMR3927_IRQ_IOC_PCIA;
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 2:
6489d63fe179520b11f54de1f26755b7444c79e73aAtsushi Nemoto		irq = JMR3927_IRQ_IOC_PCIB;
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 3:
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		irq = JMR3927_IRQ_IOC_PCIC;
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 4:
7089d63fe179520b11f54de1f26755b7444c79e73aAtsushi Nemoto		irq = JMR3927_IRQ_IOC_PCID;
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Check OnBoard Ethernet (IDSEL=A24, DevNu=13) */
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (dev->bus->parent == NULL &&
762127435e57a15f1fea8d6969e264eeb05b28ba4bAtsushi Nemoto	    slot == TX3927_PCIC_IDSEL_AD_TO_SLOT(24))
772127435e57a15f1fea8d6969e264eeb05b28ba4bAtsushi Nemoto		irq = JMR3927_IRQ_ETHER0;
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return irq;
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
80