1bc8f8c26SIlya Yanok /* 2bc8f8c26SIlya Yanok * Copyright (C) 2010 Freescale Semiconductor, Inc. 3bc8f8c26SIlya Yanok * Copyright (C) 2010 Ilya Yanok, Emcraft Systems, yanok@emcraft.com 4bc8f8c26SIlya Yanok * 51a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 6bc8f8c26SIlya Yanok */ 7bc8f8c26SIlya Yanok 8bc8f8c26SIlya Yanok #include <common.h> 9bc8f8c26SIlya Yanok #include <i2c.h> 10*b08c8c48SMasahiro Yamada #include <linux/libfdt.h> 11bc8f8c26SIlya Yanok #include <fdt_support.h> 12bc8f8c26SIlya Yanok #include <pci.h> 13bc8f8c26SIlya Yanok #include <mpc83xx.h> 14bc8f8c26SIlya Yanok #include <netdev.h> 15bc8f8c26SIlya Yanok #include <asm/io.h> 16bc8f8c26SIlya Yanok #include <asm/fsl_serdes.h> 17bc8f8c26SIlya Yanok #include <asm/fsl_mpc83xx_serdes.h> 18bc8f8c26SIlya Yanok 19bc8f8c26SIlya Yanok DECLARE_GLOBAL_DATA_PTR; 20bc8f8c26SIlya Yanok 21bc8f8c26SIlya Yanok int checkboard(void) 22bc8f8c26SIlya Yanok { 23bc8f8c26SIlya Yanok printf("Board: MPC8308 P1M\n"); 24bc8f8c26SIlya Yanok 25bc8f8c26SIlya Yanok return 0; 26bc8f8c26SIlya Yanok } 27bc8f8c26SIlya Yanok 28bc8f8c26SIlya Yanok static struct pci_region pcie_regions_0[] = { 29bc8f8c26SIlya Yanok { 30bc8f8c26SIlya Yanok .bus_start = CONFIG_SYS_PCIE1_MEM_BASE, 31bc8f8c26SIlya Yanok .phys_start = CONFIG_SYS_PCIE1_MEM_PHYS, 32bc8f8c26SIlya Yanok .size = CONFIG_SYS_PCIE1_MEM_SIZE, 33bc8f8c26SIlya Yanok .flags = PCI_REGION_MEM, 34bc8f8c26SIlya Yanok }, 35bc8f8c26SIlya Yanok { 36bc8f8c26SIlya Yanok .bus_start = CONFIG_SYS_PCIE1_IO_BASE, 37bc8f8c26SIlya Yanok .phys_start = CONFIG_SYS_PCIE1_IO_PHYS, 38bc8f8c26SIlya Yanok .size = CONFIG_SYS_PCIE1_IO_SIZE, 39bc8f8c26SIlya Yanok .flags = PCI_REGION_IO, 40bc8f8c26SIlya Yanok }, 41bc8f8c26SIlya Yanok }; 42bc8f8c26SIlya Yanok 43bc8f8c26SIlya Yanok void pci_init_board(void) 44bc8f8c26SIlya Yanok { 45bc8f8c26SIlya Yanok immap_t *immr = (immap_t *)CONFIG_SYS_IMMR; 46bc8f8c26SIlya Yanok sysconf83xx_t *sysconf = &immr->sysconf; 47bc8f8c26SIlya Yanok law83xx_t *pcie_law = sysconf->pcielaw; 48bc8f8c26SIlya Yanok struct pci_region *pcie_reg[] = { pcie_regions_0 }; 49bc8f8c26SIlya Yanok 50bc8f8c26SIlya Yanok fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_PEX, 51bc8f8c26SIlya Yanok FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V); 52bc8f8c26SIlya Yanok 53bc8f8c26SIlya Yanok /* Deassert the resets in the control register */ 54bc8f8c26SIlya Yanok out_be32(&sysconf->pecr1, 0xE0008000); 55bc8f8c26SIlya Yanok udelay(2000); 56bc8f8c26SIlya Yanok 57bc8f8c26SIlya Yanok /* Configure PCI Express Local Access Windows */ 58bc8f8c26SIlya Yanok out_be32(&pcie_law[0].bar, CONFIG_SYS_PCIE1_BASE & LAWBAR_BAR); 59bc8f8c26SIlya Yanok out_be32(&pcie_law[0].ar, LBLAWAR_EN | LBLAWAR_512MB); 60bc8f8c26SIlya Yanok 616aa3d3bfSPeter Tyser mpc83xx_pcie_init(1, pcie_reg); 62bc8f8c26SIlya Yanok } 63bc8f8c26SIlya Yanok 64bc8f8c26SIlya Yanok #if defined(CONFIG_OF_BOARD_SETUP) 65e895a4b0SSimon Glass int ft_board_setup(void *blob, bd_t *bd) 66bc8f8c26SIlya Yanok { 67bc8f8c26SIlya Yanok ft_cpu_setup(blob, bd); 68a5c289b9SSriram Dash fsl_fdt_fixup_dr_usb(blob, bd); 69e895a4b0SSimon Glass 70e895a4b0SSimon Glass return 0; 71bc8f8c26SIlya Yanok } 72bc8f8c26SIlya Yanok #endif 73bc8f8c26SIlya Yanok 74bc8f8c26SIlya Yanok int board_eth_init(bd_t *bis) 75bc8f8c26SIlya Yanok { 76bc8f8c26SIlya Yanok int rv, num_if = 0; 77bc8f8c26SIlya Yanok 78bc8f8c26SIlya Yanok /* Initialize TSECs first */ 79bc8f8c26SIlya Yanok rv = cpu_eth_init(bis); 80bc8f8c26SIlya Yanok if (rv >= 0) 81bc8f8c26SIlya Yanok num_if += rv; 82bc8f8c26SIlya Yanok else 83bc8f8c26SIlya Yanok printf("ERROR: failed to initialize TSECs.\n"); 84bc8f8c26SIlya Yanok 85bc8f8c26SIlya Yanok rv = pci_eth_init(bis); 86bc8f8c26SIlya Yanok if (rv >= 0) 87bc8f8c26SIlya Yanok num_if += rv; 88bc8f8c26SIlya Yanok else 89bc8f8c26SIlya Yanok printf("ERROR: failed to initialize PCI Ethernet.\n"); 90bc8f8c26SIlya Yanok 91bc8f8c26SIlya Yanok return num_if; 92bc8f8c26SIlya Yanok } 93