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