162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * arch/sh/drivers/pci/fixups-rts7751r2d.c
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * RTS7751R2D / LBOXRE2 PCI fixups
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (C) 2003  Lineo uSolutions, Inc.
862306a36Sopenharmony_ci * Copyright (C) 2004  Paul Mundt
962306a36Sopenharmony_ci * Copyright (C) 2007  Nobuhiro Iwamatsu
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci#include <linux/pci.h>
1262306a36Sopenharmony_ci#include <mach/lboxre2.h>
1362306a36Sopenharmony_ci#include <mach/r2d.h>
1462306a36Sopenharmony_ci#include "pci-sh4.h"
1562306a36Sopenharmony_ci#include <generated/machtypes.h>
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define PCIMCR_MRSET_OFF	0xBFFFFFFF
1862306a36Sopenharmony_ci#define PCIMCR_RFSH_OFF		0xFFFFFFFB
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistatic u8 rts7751r2d_irq_tab[] = {
2162306a36Sopenharmony_ci	IRQ_PCI_INTA,
2262306a36Sopenharmony_ci	IRQ_PCI_INTB,
2362306a36Sopenharmony_ci	IRQ_PCI_INTC,
2462306a36Sopenharmony_ci	IRQ_PCI_INTD,
2562306a36Sopenharmony_ci};
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistatic char lboxre2_irq_tab[] = {
2862306a36Sopenharmony_ci	IRQ_ETH0, IRQ_ETH1, IRQ_INTA, IRQ_INTD,
2962306a36Sopenharmony_ci};
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ciint pcibios_map_platform_irq(const struct pci_dev *pdev, u8 slot, u8 pin)
3262306a36Sopenharmony_ci{
3362306a36Sopenharmony_ci	if (mach_is_lboxre2())
3462306a36Sopenharmony_ci		return lboxre2_irq_tab[slot];
3562306a36Sopenharmony_ci	else
3662306a36Sopenharmony_ci		return rts7751r2d_irq_tab[slot];
3762306a36Sopenharmony_ci}
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ciint pci_fixup_pcic(struct pci_channel *chan)
4062306a36Sopenharmony_ci{
4162306a36Sopenharmony_ci	unsigned long bcr1, mcr;
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci	bcr1 = __raw_readl(SH7751_BCR1);
4462306a36Sopenharmony_ci	bcr1 |= 0x40080000;	/* Enable Bit 19 BREQEN, set PCIC to slave */
4562306a36Sopenharmony_ci	pci_write_reg(chan, bcr1, SH4_PCIBCR1);
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	/* Enable all interrupts, so we known what to fix */
4862306a36Sopenharmony_ci	pci_write_reg(chan, 0x0000c3ff, SH4_PCIINTM);
4962306a36Sopenharmony_ci	pci_write_reg(chan, 0x0000380f, SH4_PCIAINTM);
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	pci_write_reg(chan, 0xfb900047, SH7751_PCICONF1);
5262306a36Sopenharmony_ci	pci_write_reg(chan, 0xab000001, SH7751_PCICONF4);
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	mcr = __raw_readl(SH7751_MCR);
5562306a36Sopenharmony_ci	mcr = (mcr & PCIMCR_MRSET_OFF) & PCIMCR_RFSH_OFF;
5662306a36Sopenharmony_ci	pci_write_reg(chan, mcr, SH4_PCIMCR);
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci	pci_write_reg(chan, 0x0c000000, SH7751_PCICONF5);
5962306a36Sopenharmony_ci	pci_write_reg(chan, 0xd0000000, SH7751_PCICONF6);
6062306a36Sopenharmony_ci	pci_write_reg(chan, 0x0c000000, SH4_PCILAR0);
6162306a36Sopenharmony_ci	pci_write_reg(chan, 0x00000000, SH4_PCILAR1);
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	return 0;
6462306a36Sopenharmony_ci}
65