1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2e58fe957SKim Phillips /*
39993e196SKim Phillips  * Copyright (C) 2006-2009 Freescale Semiconductor, Inc.
4e58fe957SKim Phillips  */
5e58fe957SKim Phillips 
6e58fe957SKim Phillips #include <common.h>
7e58fe957SKim Phillips 
8e58fe957SKim Phillips #include <asm/mmu.h>
99993e196SKim Phillips #include <asm/io.h>
109993e196SKim Phillips #include <mpc83xx.h>
11e58fe957SKim Phillips #include <pci.h>
12e58fe957SKim Phillips #include <i2c.h>
139993e196SKim Phillips #include <asm/fsl_i2c.h>
14e58fe957SKim Phillips 
159993e196SKim Phillips static struct pci_region pci1_regions[] = {
16e58fe957SKim Phillips 	{
179993e196SKim Phillips 		bus_start: CONFIG_SYS_PCI1_MEM_BASE,
189993e196SKim Phillips 		phys_start: CONFIG_SYS_PCI1_MEM_PHYS,
199993e196SKim Phillips 		size: CONFIG_SYS_PCI1_MEM_SIZE,
209993e196SKim Phillips 		flags: PCI_REGION_MEM | PCI_REGION_PREFETCH
21e58fe957SKim Phillips 	},
229993e196SKim Phillips 	{
239993e196SKim Phillips 		bus_start: CONFIG_SYS_PCI1_IO_BASE,
249993e196SKim Phillips 		phys_start: CONFIG_SYS_PCI1_IO_PHYS,
259993e196SKim Phillips 		size: CONFIG_SYS_PCI1_IO_SIZE,
269993e196SKim Phillips 		flags: PCI_REGION_IO
279993e196SKim Phillips 	},
289993e196SKim Phillips 	{
299993e196SKim Phillips 		bus_start: CONFIG_SYS_PCI1_MMIO_BASE,
309993e196SKim Phillips 		phys_start: CONFIG_SYS_PCI1_MMIO_PHYS,
319993e196SKim Phillips 		size: CONFIG_SYS_PCI1_MMIO_SIZE,
329993e196SKim Phillips 		flags: PCI_REGION_MEM
339993e196SKim Phillips 	},
349993e196SKim Phillips };
359993e196SKim Phillips 
369993e196SKim Phillips #ifdef CONFIG_MPC83XX_PCI2
379993e196SKim Phillips static struct pci_region pci2_regions[] = {
389993e196SKim Phillips 	{
399993e196SKim Phillips 		bus_start: CONFIG_SYS_PCI2_MEM_BASE,
409993e196SKim Phillips 		phys_start: CONFIG_SYS_PCI2_MEM_PHYS,
419993e196SKim Phillips 		size: CONFIG_SYS_PCI2_MEM_SIZE,
429993e196SKim Phillips 		flags: PCI_REGION_MEM | PCI_REGION_PREFETCH
439993e196SKim Phillips 	},
449993e196SKim Phillips 	{
459993e196SKim Phillips 		bus_start: CONFIG_SYS_PCI2_IO_BASE,
469993e196SKim Phillips 		phys_start: CONFIG_SYS_PCI2_IO_PHYS,
479993e196SKim Phillips 		size: CONFIG_SYS_PCI2_IO_SIZE,
489993e196SKim Phillips 		flags: PCI_REGION_IO
499993e196SKim Phillips 	},
509993e196SKim Phillips 	{
519993e196SKim Phillips 		bus_start: CONFIG_SYS_PCI2_MMIO_BASE,
529993e196SKim Phillips 		phys_start: CONFIG_SYS_PCI2_MMIO_PHYS,
539993e196SKim Phillips 		size: CONFIG_SYS_PCI2_MMIO_SIZE,
549993e196SKim Phillips 		flags: PCI_REGION_MEM
559993e196SKim Phillips 	},
56e58fe957SKim Phillips };
57e58fe957SKim Phillips #endif
58e58fe957SKim Phillips 
pci_init_board(void)59e58fe957SKim Phillips void pci_init_board(void)
60e58fe957SKim Phillips {
619993e196SKim Phillips 	volatile immap_t *immr = (volatile immap_t *)CONFIG_SYS_IMMR;
629993e196SKim Phillips 	volatile clk83xx_t *clk = (volatile clk83xx_t *)&immr->clk;
639993e196SKim Phillips 	volatile law83xx_t *pci_law = immr->sysconf.pcilaw;
649993e196SKim Phillips #ifndef CONFIG_MPC83XX_PCI2
659993e196SKim Phillips 	struct pci_region *reg[] = { pci1_regions };
669993e196SKim Phillips #else
679993e196SKim Phillips 	struct pci_region *reg[] = { pci1_regions, pci2_regions };
689993e196SKim Phillips #endif
69e58fe957SKim Phillips 	u8 reg8;
70e58fe957SKim Phillips 
7100f792e0SHeiko Schocher #if defined(CONFIG_SYS_I2C)
72e58fe957SKim Phillips 	i2c_set_bus_num(1);
73e58fe957SKim Phillips 	/* Read the PCI_M66EN jumper setting */
746d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	if ((i2c_read(CONFIG_SYS_I2C_8574_ADDR2, 0, 0, &reg8, sizeof(reg8)) == 0) ||
756d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	    (i2c_read(CONFIG_SYS_I2C_8574A_ADDR2, 0, 0, &reg8, sizeof(reg8)) == 0)) {
76e58fe957SKim Phillips 		if (reg8 & I2C_8574_PCI66)
77e58fe957SKim Phillips 			clk->occr = 0xff000000;	/* 66 MHz PCI */
78e58fe957SKim Phillips 		else
79e58fe957SKim Phillips 			clk->occr = 0xff600001;	/* 33 MHz PCI */
80e58fe957SKim Phillips 	} else {
81e58fe957SKim Phillips 		clk->occr = 0xff600001;	/* 33 MHz PCI */
82e58fe957SKim Phillips 	}
83e58fe957SKim Phillips #else
84e58fe957SKim Phillips 	clk->occr = 0xff000000;	/* 66 MHz PCI */
85e58fe957SKim Phillips #endif
86e58fe957SKim Phillips 	udelay(2000);
87e58fe957SKim Phillips 
889993e196SKim Phillips 	/* Configure PCI Local Access Windows */
896d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	pci_law[0].bar = CONFIG_SYS_PCI1_MEM_PHYS & LAWBAR_BAR;
90e58fe957SKim Phillips 	pci_law[0].ar = LAWAR_EN | LAWAR_SIZE_1G;
91e58fe957SKim Phillips 
926d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	pci_law[1].bar = CONFIG_SYS_PCI1_IO_PHYS & LAWBAR_BAR;
93e58fe957SKim Phillips 	pci_law[1].ar = LAWAR_EN | LAWAR_SIZE_32M;
94e58fe957SKim Phillips 
959993e196SKim Phillips 	udelay(2000);
96e58fe957SKim Phillips 
979993e196SKim Phillips #ifndef CONFIG_MPC83XX_PCI2
986aa3d3bfSPeter Tyser 	mpc83xx_pci_init(1, reg);
999993e196SKim Phillips #else
1006aa3d3bfSPeter Tyser 	mpc83xx_pci_init(2, reg);
101e58fe957SKim Phillips #endif
102e58fe957SKim Phillips }
103