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 * 141a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 15c1393bb3SVeli-Pekka Peltola */ 16c1393bb3SVeli-Pekka Peltola 17c1393bb3SVeli-Pekka Peltola #include <common.h> 18c1393bb3SVeli-Pekka Peltola #include <asm/gpio.h> 19c1393bb3SVeli-Pekka Peltola #include <asm/io.h> 20*5d982856SSimon Glass #include <asm/setup.h> 21c1393bb3SVeli-Pekka Peltola #include <asm/arch/imx-regs.h> 22c1393bb3SVeli-Pekka Peltola #include <asm/arch/iomux-mx28.h> 23c1393bb3SVeli-Pekka Peltola #include <asm/arch/clock.h> 24c1393bb3SVeli-Pekka Peltola #include <asm/arch/sys_proto.h> 25c1393bb3SVeli-Pekka Peltola #include <linux/mii.h> 26c1393bb3SVeli-Pekka Peltola #include <miiphy.h> 27c1393bb3SVeli-Pekka Peltola #include <netdev.h> 28c1393bb3SVeli-Pekka Peltola #include <errno.h> 29c1393bb3SVeli-Pekka Peltola 30c1393bb3SVeli-Pekka Peltola DECLARE_GLOBAL_DATA_PTR; 31c1393bb3SVeli-Pekka Peltola 32c1393bb3SVeli-Pekka Peltola /* Functions */ 33c1393bb3SVeli-Pekka Peltola int board_early_init_f(void) 34c1393bb3SVeli-Pekka Peltola { 35c1393bb3SVeli-Pekka Peltola /* IO0 clock at 480MHz */ 36bf48fcb6SOtavio Salvador mxs_set_ioclk(MXC_IOCLK0, 480000); 37c1393bb3SVeli-Pekka Peltola /* IO1 clock at 480MHz */ 38bf48fcb6SOtavio Salvador mxs_set_ioclk(MXC_IOCLK1, 480000); 39c1393bb3SVeli-Pekka Peltola 40c1393bb3SVeli-Pekka Peltola /* SSP0 clock at 96MHz */ 41bf48fcb6SOtavio Salvador mxs_set_sspclk(MXC_SSPCLK0, 96000, 0); 42c1393bb3SVeli-Pekka Peltola 43c1393bb3SVeli-Pekka Peltola return 0; 44c1393bb3SVeli-Pekka Peltola } 45c1393bb3SVeli-Pekka Peltola 46c1393bb3SVeli-Pekka Peltola int dram_init(void) 47c1393bb3SVeli-Pekka Peltola { 4872f8ebf1SOtavio Salvador return mxs_dram_init(); 49c1393bb3SVeli-Pekka Peltola } 50c1393bb3SVeli-Pekka Peltola 51c1393bb3SVeli-Pekka Peltola int board_init(void) 52c1393bb3SVeli-Pekka Peltola { 53c1393bb3SVeli-Pekka Peltola /* Adress of boot parameters */ 54c1393bb3SVeli-Pekka Peltola gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; 55c1393bb3SVeli-Pekka Peltola 56c1393bb3SVeli-Pekka Peltola return 0; 57c1393bb3SVeli-Pekka Peltola } 58c1393bb3SVeli-Pekka Peltola 59c1393bb3SVeli-Pekka Peltola #ifdef CONFIG_CMD_MMC 60c1393bb3SVeli-Pekka Peltola int board_mmc_init(bd_t *bis) 61c1393bb3SVeli-Pekka Peltola { 6290bc2bf2SMarek Vasut return mxsmmc_initialize(bis, 0, NULL, NULL); 63c1393bb3SVeli-Pekka Peltola } 64c1393bb3SVeli-Pekka Peltola #endif 65c1393bb3SVeli-Pekka Peltola 66c1393bb3SVeli-Pekka Peltola 67c1393bb3SVeli-Pekka Peltola #ifdef CONFIG_CMD_NET 68c1393bb3SVeli-Pekka Peltola 69c1393bb3SVeli-Pekka Peltola #define MII_PHY_CTRL2 0x1f 70c1393bb3SVeli-Pekka Peltola int fecmxc_mii_postcall(int phy) 71c1393bb3SVeli-Pekka Peltola { 72c1393bb3SVeli-Pekka Peltola /* change PHY RMII clock to 50MHz */ 73c1393bb3SVeli-Pekka Peltola miiphy_write("FEC", 0, MII_PHY_CTRL2, 0x8180); 74c1393bb3SVeli-Pekka Peltola 75c1393bb3SVeli-Pekka Peltola return 0; 76c1393bb3SVeli-Pekka Peltola } 77c1393bb3SVeli-Pekka Peltola 78c1393bb3SVeli-Pekka Peltola int board_eth_init(bd_t *bis) 79c1393bb3SVeli-Pekka Peltola { 80c1393bb3SVeli-Pekka Peltola int ret; 81c1393bb3SVeli-Pekka Peltola struct eth_device *dev; 82c1393bb3SVeli-Pekka Peltola 83c1393bb3SVeli-Pekka Peltola ret = cpu_eth_init(bis); 84c1393bb3SVeli-Pekka Peltola if (ret) { 85c1393bb3SVeli-Pekka Peltola printf("FEC MXS: Unable to init FEC clocks\n"); 86c1393bb3SVeli-Pekka Peltola return ret; 87c1393bb3SVeli-Pekka Peltola } 88c1393bb3SVeli-Pekka Peltola 89c1393bb3SVeli-Pekka Peltola ret = fecmxc_initialize(bis); 90c1393bb3SVeli-Pekka Peltola if (ret) { 91c1393bb3SVeli-Pekka Peltola printf("FEC MXS: Unable to init FEC\n"); 92c1393bb3SVeli-Pekka Peltola return ret; 93c1393bb3SVeli-Pekka Peltola } 94c1393bb3SVeli-Pekka Peltola 95c1393bb3SVeli-Pekka Peltola dev = eth_get_dev_by_name("FEC"); 96c1393bb3SVeli-Pekka Peltola if (!dev) { 97c1393bb3SVeli-Pekka Peltola printf("FEC MXS: Unable to get FEC device entry\n"); 98c1393bb3SVeli-Pekka Peltola return -EINVAL; 99c1393bb3SVeli-Pekka Peltola } 100c1393bb3SVeli-Pekka Peltola 101c1393bb3SVeli-Pekka Peltola ret = fecmxc_register_mii_postcall(dev, fecmxc_mii_postcall); 102c1393bb3SVeli-Pekka Peltola if (ret) { 103c1393bb3SVeli-Pekka Peltola printf("FEC MXS: Unable to register FEC MII postcall\n"); 104c1393bb3SVeli-Pekka Peltola return ret; 105c1393bb3SVeli-Pekka Peltola } 106c1393bb3SVeli-Pekka Peltola 107c1393bb3SVeli-Pekka Peltola return ret; 108c1393bb3SVeli-Pekka Peltola } 109c1393bb3SVeli-Pekka Peltola #endif 110c1393bb3SVeli-Pekka Peltola 111c1393bb3SVeli-Pekka Peltola #ifdef CONFIG_SERIAL_TAG 112c1393bb3SVeli-Pekka Peltola #define MXS_OCOTP_MAX_TIMEOUT 1000000 113c1393bb3SVeli-Pekka Peltola void get_board_serial(struct tag_serialnr *serialnr) 114c1393bb3SVeli-Pekka Peltola { 1159c471142SOtavio Salvador struct mxs_ocotp_regs *ocotp_regs = 1169c471142SOtavio Salvador (struct mxs_ocotp_regs *)MXS_OCOTP_BASE; 117c1393bb3SVeli-Pekka Peltola 118c1393bb3SVeli-Pekka Peltola serialnr->high = 0; 119c1393bb3SVeli-Pekka Peltola serialnr->low = 0; 120c1393bb3SVeli-Pekka Peltola 121c1393bb3SVeli-Pekka Peltola writel(OCOTP_CTRL_RD_BANK_OPEN, &ocotp_regs->hw_ocotp_ctrl_set); 122c1393bb3SVeli-Pekka Peltola 123fa7a51cbSOtavio Salvador if (mxs_wait_mask_clr(&ocotp_regs->hw_ocotp_ctrl_reg, OCOTP_CTRL_BUSY, 124c1393bb3SVeli-Pekka Peltola MXS_OCOTP_MAX_TIMEOUT)) { 125c1393bb3SVeli-Pekka Peltola printf("MXS: Can't get serial number from OCOTP\n"); 126c1393bb3SVeli-Pekka Peltola return; 127c1393bb3SVeli-Pekka Peltola } 128c1393bb3SVeli-Pekka Peltola 129c1393bb3SVeli-Pekka Peltola serialnr->low = readl(&ocotp_regs->hw_ocotp_cust3); 130c1393bb3SVeli-Pekka Peltola } 131c1393bb3SVeli-Pekka Peltola #endif 132c1393bb3SVeli-Pekka Peltola 133c1393bb3SVeli-Pekka Peltola #ifdef CONFIG_REVISION_TAG 134c1393bb3SVeli-Pekka Peltola u32 get_board_rev(void) 135c1393bb3SVeli-Pekka Peltola { 136c1393bb3SVeli-Pekka Peltola if (getenv("revision#") != NULL) 137c1393bb3SVeli-Pekka Peltola return simple_strtoul(getenv("revision#"), NULL, 10); 138c1393bb3SVeli-Pekka Peltola return 0; 139c1393bb3SVeli-Pekka Peltola } 140c1393bb3SVeli-Pekka Peltola #endif 141