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