1ff4a7481SKuninori Morimoto // SPDX-License-Identifier: GPL-2.0
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * arch/sh/drivers/pci/fixups-rts7751r2d.c
41da177e4SLinus Torvalds  *
537c8ac36SPaul Mundt  * RTS7751R2D / LBOXRE2 PCI fixups
61da177e4SLinus Torvalds  *
71da177e4SLinus Torvalds  * Copyright (C) 2003  Lineo uSolutions, Inc.
81da177e4SLinus Torvalds  * Copyright (C) 2004  Paul Mundt
937c8ac36SPaul Mundt  * Copyright (C) 2007  Nobuhiro Iwamatsu
101da177e4SLinus Torvalds  */
11b8b47bfbSMagnus Damm #include <linux/pci.h>
1237c8ac36SPaul Mundt #include <mach/lboxre2.h>
1337c8ac36SPaul Mundt #include <mach/r2d.h>
14959f85f8SPaul Mundt #include "pci-sh4.h"
153252b11fSSam Ravnborg #include <generated/machtypes.h>
161da177e4SLinus Torvalds 
171da177e4SLinus Torvalds #define PCIMCR_MRSET_OFF	0xBFFFFFFF
181da177e4SLinus Torvalds #define PCIMCR_RFSH_OFF		0xFFFFFFFB
191da177e4SLinus Torvalds 
202b8ff9f2SMatthew Minter static u8 rts7751r2d_irq_tab[] = {
2137c8ac36SPaul Mundt 	IRQ_PCI_INTA,
2237c8ac36SPaul Mundt 	IRQ_PCI_INTB,
2337c8ac36SPaul Mundt 	IRQ_PCI_INTC,
2437c8ac36SPaul Mundt 	IRQ_PCI_INTD,
2537c8ac36SPaul Mundt };
2637c8ac36SPaul Mundt 
272b8ff9f2SMatthew Minter static char lboxre2_irq_tab[] = {
2837c8ac36SPaul Mundt 	IRQ_ETH0, IRQ_ETH1, IRQ_INTA, IRQ_INTD,
2937c8ac36SPaul Mundt };
3037c8ac36SPaul Mundt 
pcibios_map_platform_irq(const struct pci_dev * pdev,u8 slot,u8 pin)312b8ff9f2SMatthew Minter int pcibios_map_platform_irq(const struct pci_dev *pdev, u8 slot, u8 pin)
3237c8ac36SPaul Mundt {
3337c8ac36SPaul Mundt 	if (mach_is_lboxre2())
3437c8ac36SPaul Mundt 		return lboxre2_irq_tab[slot];
3537c8ac36SPaul Mundt 	else
3637c8ac36SPaul Mundt 		return rts7751r2d_irq_tab[slot];
3737c8ac36SPaul Mundt }
3837c8ac36SPaul Mundt 
pci_fixup_pcic(struct pci_channel * chan)39b8b47bfbSMagnus Damm int pci_fixup_pcic(struct pci_channel *chan)
401da177e4SLinus Torvalds {
411da177e4SLinus Torvalds 	unsigned long bcr1, mcr;
421da177e4SLinus Torvalds 
439d56dd3bSPaul Mundt 	bcr1 = __raw_readl(SH7751_BCR1);
441da177e4SLinus Torvalds 	bcr1 |= 0x40080000;	/* Enable Bit 19 BREQEN, set PCIC to slave */
45b8b47bfbSMagnus Damm 	pci_write_reg(chan, bcr1, SH4_PCIBCR1);
461da177e4SLinus Torvalds 
471da177e4SLinus Torvalds 	/* Enable all interrupts, so we known what to fix */
48b8b47bfbSMagnus Damm 	pci_write_reg(chan, 0x0000c3ff, SH4_PCIINTM);
49b8b47bfbSMagnus Damm 	pci_write_reg(chan, 0x0000380f, SH4_PCIAINTM);
501da177e4SLinus Torvalds 
51b8b47bfbSMagnus Damm 	pci_write_reg(chan, 0xfb900047, SH7751_PCICONF1);
52b8b47bfbSMagnus Damm 	pci_write_reg(chan, 0xab000001, SH7751_PCICONF4);
531da177e4SLinus Torvalds 
549d56dd3bSPaul Mundt 	mcr = __raw_readl(SH7751_MCR);
551da177e4SLinus Torvalds 	mcr = (mcr & PCIMCR_MRSET_OFF) & PCIMCR_RFSH_OFF;
56b8b47bfbSMagnus Damm 	pci_write_reg(chan, mcr, SH4_PCIMCR);
571da177e4SLinus Torvalds 
58b8b47bfbSMagnus Damm 	pci_write_reg(chan, 0x0c000000, SH7751_PCICONF5);
59b8b47bfbSMagnus Damm 	pci_write_reg(chan, 0xd0000000, SH7751_PCICONF6);
60b8b47bfbSMagnus Damm 	pci_write_reg(chan, 0x0c000000, SH4_PCILAR0);
61b8b47bfbSMagnus Damm 	pci_write_reg(chan, 0x00000000, SH4_PCILAR1);
62959f85f8SPaul Mundt 
631da177e4SLinus Torvalds 	return 0;
641da177e4SLinus Torvalds }
65