1*c1393bb3SVeli-Pekka Peltola /* 2*c1393bb3SVeli-Pekka Peltola * Bluegiga APX4 Development Kit 3*c1393bb3SVeli-Pekka Peltola * 4*c1393bb3SVeli-Pekka Peltola * Copyright (C) 2012 Bluegiga Technologies Oy 5*c1393bb3SVeli-Pekka Peltola * 6*c1393bb3SVeli-Pekka Peltola * Authors: 7*c1393bb3SVeli-Pekka Peltola * Veli-Pekka Peltola <veli-pekka.peltola@bluegiga.com> 8*c1393bb3SVeli-Pekka Peltola * Lauri Hintsala <lauri.hintsala@bluegiga.com> 9*c1393bb3SVeli-Pekka Peltola * 10*c1393bb3SVeli-Pekka Peltola * Based on m28evk.c: 11*c1393bb3SVeli-Pekka Peltola * Copyright (C) 2011 Marek Vasut <marek.vasut@gmail.com> 12*c1393bb3SVeli-Pekka Peltola * on behalf of DENX Software Engineering GmbH 13*c1393bb3SVeli-Pekka Peltola * 14*c1393bb3SVeli-Pekka Peltola * See file CREDITS for list of people who contributed to this 15*c1393bb3SVeli-Pekka Peltola * project. 16*c1393bb3SVeli-Pekka Peltola * 17*c1393bb3SVeli-Pekka Peltola * This program is free software; you can redistribute it and/or 18*c1393bb3SVeli-Pekka Peltola * modify it under the terms of the GNU General Public License as 19*c1393bb3SVeli-Pekka Peltola * published by the Free Software Foundation; either version 2 of 20*c1393bb3SVeli-Pekka Peltola * the License, or (at your option) any later version. 21*c1393bb3SVeli-Pekka Peltola * 22*c1393bb3SVeli-Pekka Peltola * This program is distributed in the hope that it will be useful, 23*c1393bb3SVeli-Pekka Peltola * but WITHOUT ANY WARRANTY; without even the implied warranty of 24*c1393bb3SVeli-Pekka Peltola * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 25*c1393bb3SVeli-Pekka Peltola * GNU General Public License for more details. 26*c1393bb3SVeli-Pekka Peltola */ 27*c1393bb3SVeli-Pekka Peltola 28*c1393bb3SVeli-Pekka Peltola #include <common.h> 29*c1393bb3SVeli-Pekka Peltola #include <asm/gpio.h> 30*c1393bb3SVeli-Pekka Peltola #include <asm/io.h> 31*c1393bb3SVeli-Pekka Peltola #include <asm/arch/imx-regs.h> 32*c1393bb3SVeli-Pekka Peltola #include <asm/arch/iomux-mx28.h> 33*c1393bb3SVeli-Pekka Peltola #include <asm/arch/clock.h> 34*c1393bb3SVeli-Pekka Peltola #include <asm/arch/sys_proto.h> 35*c1393bb3SVeli-Pekka Peltola #include <linux/mii.h> 36*c1393bb3SVeli-Pekka Peltola #include <miiphy.h> 37*c1393bb3SVeli-Pekka Peltola #include <netdev.h> 38*c1393bb3SVeli-Pekka Peltola #include <errno.h> 39*c1393bb3SVeli-Pekka Peltola 40*c1393bb3SVeli-Pekka Peltola DECLARE_GLOBAL_DATA_PTR; 41*c1393bb3SVeli-Pekka Peltola 42*c1393bb3SVeli-Pekka Peltola /* Functions */ 43*c1393bb3SVeli-Pekka Peltola int board_early_init_f(void) 44*c1393bb3SVeli-Pekka Peltola { 45*c1393bb3SVeli-Pekka Peltola /* IO0 clock at 480MHz */ 46*c1393bb3SVeli-Pekka Peltola mx28_set_ioclk(MXC_IOCLK0, 480000); 47*c1393bb3SVeli-Pekka Peltola /* IO1 clock at 480MHz */ 48*c1393bb3SVeli-Pekka Peltola mx28_set_ioclk(MXC_IOCLK1, 480000); 49*c1393bb3SVeli-Pekka Peltola 50*c1393bb3SVeli-Pekka Peltola /* SSP0 clock at 96MHz */ 51*c1393bb3SVeli-Pekka Peltola mx28_set_sspclk(MXC_SSPCLK0, 96000, 0); 52*c1393bb3SVeli-Pekka Peltola 53*c1393bb3SVeli-Pekka Peltola return 0; 54*c1393bb3SVeli-Pekka Peltola } 55*c1393bb3SVeli-Pekka Peltola 56*c1393bb3SVeli-Pekka Peltola int dram_init(void) 57*c1393bb3SVeli-Pekka Peltola { 58*c1393bb3SVeli-Pekka Peltola return mx28_dram_init(); 59*c1393bb3SVeli-Pekka Peltola } 60*c1393bb3SVeli-Pekka Peltola 61*c1393bb3SVeli-Pekka Peltola int board_init(void) 62*c1393bb3SVeli-Pekka Peltola { 63*c1393bb3SVeli-Pekka Peltola /* Adress of boot parameters */ 64*c1393bb3SVeli-Pekka Peltola gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; 65*c1393bb3SVeli-Pekka Peltola 66*c1393bb3SVeli-Pekka Peltola return 0; 67*c1393bb3SVeli-Pekka Peltola } 68*c1393bb3SVeli-Pekka Peltola 69*c1393bb3SVeli-Pekka Peltola #ifdef CONFIG_CMD_MMC 70*c1393bb3SVeli-Pekka Peltola int board_mmc_init(bd_t *bis) 71*c1393bb3SVeli-Pekka Peltola { 72*c1393bb3SVeli-Pekka Peltola return mxsmmc_initialize(bis, 0, NULL); 73*c1393bb3SVeli-Pekka Peltola } 74*c1393bb3SVeli-Pekka Peltola #endif 75*c1393bb3SVeli-Pekka Peltola 76*c1393bb3SVeli-Pekka Peltola 77*c1393bb3SVeli-Pekka Peltola #ifdef CONFIG_CMD_NET 78*c1393bb3SVeli-Pekka Peltola 79*c1393bb3SVeli-Pekka Peltola #define MII_PHY_CTRL2 0x1f 80*c1393bb3SVeli-Pekka Peltola int fecmxc_mii_postcall(int phy) 81*c1393bb3SVeli-Pekka Peltola { 82*c1393bb3SVeli-Pekka Peltola /* change PHY RMII clock to 50MHz */ 83*c1393bb3SVeli-Pekka Peltola miiphy_write("FEC", 0, MII_PHY_CTRL2, 0x8180); 84*c1393bb3SVeli-Pekka Peltola 85*c1393bb3SVeli-Pekka Peltola return 0; 86*c1393bb3SVeli-Pekka Peltola } 87*c1393bb3SVeli-Pekka Peltola 88*c1393bb3SVeli-Pekka Peltola int board_eth_init(bd_t *bis) 89*c1393bb3SVeli-Pekka Peltola { 90*c1393bb3SVeli-Pekka Peltola int ret; 91*c1393bb3SVeli-Pekka Peltola struct eth_device *dev; 92*c1393bb3SVeli-Pekka Peltola 93*c1393bb3SVeli-Pekka Peltola ret = cpu_eth_init(bis); 94*c1393bb3SVeli-Pekka Peltola if (ret) { 95*c1393bb3SVeli-Pekka Peltola printf("FEC MXS: Unable to init FEC clocks\n"); 96*c1393bb3SVeli-Pekka Peltola return ret; 97*c1393bb3SVeli-Pekka Peltola } 98*c1393bb3SVeli-Pekka Peltola 99*c1393bb3SVeli-Pekka Peltola ret = fecmxc_initialize(bis); 100*c1393bb3SVeli-Pekka Peltola if (ret) { 101*c1393bb3SVeli-Pekka Peltola printf("FEC MXS: Unable to init FEC\n"); 102*c1393bb3SVeli-Pekka Peltola return ret; 103*c1393bb3SVeli-Pekka Peltola } 104*c1393bb3SVeli-Pekka Peltola 105*c1393bb3SVeli-Pekka Peltola dev = eth_get_dev_by_name("FEC"); 106*c1393bb3SVeli-Pekka Peltola if (!dev) { 107*c1393bb3SVeli-Pekka Peltola printf("FEC MXS: Unable to get FEC device entry\n"); 108*c1393bb3SVeli-Pekka Peltola return -EINVAL; 109*c1393bb3SVeli-Pekka Peltola } 110*c1393bb3SVeli-Pekka Peltola 111*c1393bb3SVeli-Pekka Peltola ret = fecmxc_register_mii_postcall(dev, fecmxc_mii_postcall); 112*c1393bb3SVeli-Pekka Peltola if (ret) { 113*c1393bb3SVeli-Pekka Peltola printf("FEC MXS: Unable to register FEC MII postcall\n"); 114*c1393bb3SVeli-Pekka Peltola return ret; 115*c1393bb3SVeli-Pekka Peltola } 116*c1393bb3SVeli-Pekka Peltola 117*c1393bb3SVeli-Pekka Peltola return ret; 118*c1393bb3SVeli-Pekka Peltola } 119*c1393bb3SVeli-Pekka Peltola #endif 120*c1393bb3SVeli-Pekka Peltola 121*c1393bb3SVeli-Pekka Peltola #ifdef CONFIG_SERIAL_TAG 122*c1393bb3SVeli-Pekka Peltola #define MXS_OCOTP_MAX_TIMEOUT 1000000 123*c1393bb3SVeli-Pekka Peltola void get_board_serial(struct tag_serialnr *serialnr) 124*c1393bb3SVeli-Pekka Peltola { 125*c1393bb3SVeli-Pekka Peltola struct mx28_ocotp_regs *ocotp_regs = 126*c1393bb3SVeli-Pekka Peltola (struct mx28_ocotp_regs *)MXS_OCOTP_BASE; 127*c1393bb3SVeli-Pekka Peltola 128*c1393bb3SVeli-Pekka Peltola serialnr->high = 0; 129*c1393bb3SVeli-Pekka Peltola serialnr->low = 0; 130*c1393bb3SVeli-Pekka Peltola 131*c1393bb3SVeli-Pekka Peltola writel(OCOTP_CTRL_RD_BANK_OPEN, &ocotp_regs->hw_ocotp_ctrl_set); 132*c1393bb3SVeli-Pekka Peltola 133*c1393bb3SVeli-Pekka Peltola if (mx28_wait_mask_clr(&ocotp_regs->hw_ocotp_ctrl_reg, OCOTP_CTRL_BUSY, 134*c1393bb3SVeli-Pekka Peltola MXS_OCOTP_MAX_TIMEOUT)) { 135*c1393bb3SVeli-Pekka Peltola printf("MXS: Can't get serial number from OCOTP\n"); 136*c1393bb3SVeli-Pekka Peltola return; 137*c1393bb3SVeli-Pekka Peltola } 138*c1393bb3SVeli-Pekka Peltola 139*c1393bb3SVeli-Pekka Peltola serialnr->low = readl(&ocotp_regs->hw_ocotp_cust3); 140*c1393bb3SVeli-Pekka Peltola } 141*c1393bb3SVeli-Pekka Peltola #endif 142*c1393bb3SVeli-Pekka Peltola 143*c1393bb3SVeli-Pekka Peltola #ifdef CONFIG_REVISION_TAG 144*c1393bb3SVeli-Pekka Peltola u32 get_board_rev(void) 145*c1393bb3SVeli-Pekka Peltola { 146*c1393bb3SVeli-Pekka Peltola if (getenv("revision#") != NULL) 147*c1393bb3SVeli-Pekka Peltola return simple_strtoul(getenv("revision#"), NULL, 10); 148*c1393bb3SVeli-Pekka Peltola return 0; 149*c1393bb3SVeli-Pekka Peltola } 150*c1393bb3SVeli-Pekka Peltola #endif 151