1*bc8f8c26SIlya Yanok /* 2*bc8f8c26SIlya Yanok * Copyright (C) 2010 Freescale Semiconductor, Inc. 3*bc8f8c26SIlya Yanok * Copyright (C) 2010 Ilya Yanok, Emcraft Systems, yanok@emcraft.com 4*bc8f8c26SIlya Yanok * 5*bc8f8c26SIlya Yanok * See file CREDITS for list of people who contributed to this 6*bc8f8c26SIlya Yanok * project. 7*bc8f8c26SIlya Yanok * 8*bc8f8c26SIlya Yanok * This program is free software; you can redistribute it and/or 9*bc8f8c26SIlya Yanok * modify it under the terms of the GNU General Public License as 10*bc8f8c26SIlya Yanok * published by the Free Software Foundation; either version 2 of 11*bc8f8c26SIlya Yanok * the License, or (at your option) any later version. 12*bc8f8c26SIlya Yanok * 13*bc8f8c26SIlya Yanok * This program is distributed in the hope that it will be useful, 14*bc8f8c26SIlya Yanok * but WITHOUT ANY WARRANTY; without even the implied warranty of 15*bc8f8c26SIlya Yanok * MERCHANTABILITY or FITNESS for A PARTICULAR PURPOSE. See the 16*bc8f8c26SIlya Yanok * GNU General Public License for more details. 17*bc8f8c26SIlya Yanok * 18*bc8f8c26SIlya Yanok * You should have received a copy of the GNU General Public License 19*bc8f8c26SIlya Yanok * along with this program; if not, write to the Free Software 20*bc8f8c26SIlya Yanok * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 21*bc8f8c26SIlya Yanok * MA 02111-1307 USA 22*bc8f8c26SIlya Yanok */ 23*bc8f8c26SIlya Yanok 24*bc8f8c26SIlya Yanok #include <common.h> 25*bc8f8c26SIlya Yanok #include <i2c.h> 26*bc8f8c26SIlya Yanok #include <libfdt.h> 27*bc8f8c26SIlya Yanok #include <fdt_support.h> 28*bc8f8c26SIlya Yanok #include <pci.h> 29*bc8f8c26SIlya Yanok #include <mpc83xx.h> 30*bc8f8c26SIlya Yanok #include <netdev.h> 31*bc8f8c26SIlya Yanok #include <asm/io.h> 32*bc8f8c26SIlya Yanok #include <asm/fsl_serdes.h> 33*bc8f8c26SIlya Yanok #include <asm/fsl_mpc83xx_serdes.h> 34*bc8f8c26SIlya Yanok 35*bc8f8c26SIlya Yanok DECLARE_GLOBAL_DATA_PTR; 36*bc8f8c26SIlya Yanok 37*bc8f8c26SIlya Yanok int checkboard(void) 38*bc8f8c26SIlya Yanok { 39*bc8f8c26SIlya Yanok printf("Board: MPC8308 P1M\n"); 40*bc8f8c26SIlya Yanok 41*bc8f8c26SIlya Yanok return 0; 42*bc8f8c26SIlya Yanok } 43*bc8f8c26SIlya Yanok 44*bc8f8c26SIlya Yanok static struct pci_region pcie_regions_0[] = { 45*bc8f8c26SIlya Yanok { 46*bc8f8c26SIlya Yanok .bus_start = CONFIG_SYS_PCIE1_MEM_BASE, 47*bc8f8c26SIlya Yanok .phys_start = CONFIG_SYS_PCIE1_MEM_PHYS, 48*bc8f8c26SIlya Yanok .size = CONFIG_SYS_PCIE1_MEM_SIZE, 49*bc8f8c26SIlya Yanok .flags = PCI_REGION_MEM, 50*bc8f8c26SIlya Yanok }, 51*bc8f8c26SIlya Yanok { 52*bc8f8c26SIlya Yanok .bus_start = CONFIG_SYS_PCIE1_IO_BASE, 53*bc8f8c26SIlya Yanok .phys_start = CONFIG_SYS_PCIE1_IO_PHYS, 54*bc8f8c26SIlya Yanok .size = CONFIG_SYS_PCIE1_IO_SIZE, 55*bc8f8c26SIlya Yanok .flags = PCI_REGION_IO, 56*bc8f8c26SIlya Yanok }, 57*bc8f8c26SIlya Yanok }; 58*bc8f8c26SIlya Yanok 59*bc8f8c26SIlya Yanok void pci_init_board(void) 60*bc8f8c26SIlya Yanok { 61*bc8f8c26SIlya Yanok immap_t *immr = (immap_t *)CONFIG_SYS_IMMR; 62*bc8f8c26SIlya Yanok sysconf83xx_t *sysconf = &immr->sysconf; 63*bc8f8c26SIlya Yanok law83xx_t *pcie_law = sysconf->pcielaw; 64*bc8f8c26SIlya Yanok struct pci_region *pcie_reg[] = { pcie_regions_0 }; 65*bc8f8c26SIlya Yanok 66*bc8f8c26SIlya Yanok fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_PEX, 67*bc8f8c26SIlya Yanok FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 68*bc8f8c26SIlya Yanok 69*bc8f8c26SIlya Yanok /* Deassert the resets in the control register */ 70*bc8f8c26SIlya Yanok out_be32(&sysconf->pecr1, 0xE0008000); 71*bc8f8c26SIlya Yanok udelay(2000); 72*bc8f8c26SIlya Yanok 73*bc8f8c26SIlya Yanok /* Configure PCI Express Local Access Windows */ 74*bc8f8c26SIlya Yanok out_be32(&pcie_law[0].bar, CONFIG_SYS_PCIE1_BASE & LAWBAR_BAR); 75*bc8f8c26SIlya Yanok out_be32(&pcie_law[0].ar, LBLAWAR_EN | LBLAWAR_512MB); 76*bc8f8c26SIlya Yanok 77*bc8f8c26SIlya Yanok mpc83xx_pcie_init(1, pcie_reg, 0); 78*bc8f8c26SIlya Yanok } 79*bc8f8c26SIlya Yanok 80*bc8f8c26SIlya Yanok #if defined(CONFIG_OF_BOARD_SETUP) 81*bc8f8c26SIlya Yanok void ft_board_setup(void *blob, bd_t *bd) 82*bc8f8c26SIlya Yanok { 83*bc8f8c26SIlya Yanok ft_cpu_setup(blob, bd); 84*bc8f8c26SIlya Yanok fdt_fixup_dr_usb(blob, bd); 85*bc8f8c26SIlya Yanok } 86*bc8f8c26SIlya Yanok #endif 87*bc8f8c26SIlya Yanok 88*bc8f8c26SIlya Yanok int board_eth_init(bd_t *bis) 89*bc8f8c26SIlya Yanok { 90*bc8f8c26SIlya Yanok int rv, num_if = 0; 91*bc8f8c26SIlya Yanok 92*bc8f8c26SIlya Yanok /* Initialize TSECs first */ 93*bc8f8c26SIlya Yanok rv = cpu_eth_init(bis); 94*bc8f8c26SIlya Yanok if (rv >= 0) 95*bc8f8c26SIlya Yanok num_if += rv; 96*bc8f8c26SIlya Yanok else 97*bc8f8c26SIlya Yanok printf("ERROR: failed to initialize TSECs.\n"); 98*bc8f8c26SIlya Yanok 99*bc8f8c26SIlya Yanok rv = pci_eth_init(bis); 100*bc8f8c26SIlya Yanok if (rv >= 0) 101*bc8f8c26SIlya Yanok num_if += rv; 102*bc8f8c26SIlya Yanok else 103*bc8f8c26SIlya Yanok printf("ERROR: failed to initialize PCI Ethernet.\n"); 104*bc8f8c26SIlya Yanok 105*bc8f8c26SIlya Yanok return num_if; 106*bc8f8c26SIlya Yanok } 107