1*d9e268edSSebastien Bourdelin /* 2*d9e268edSSebastien Bourdelin * (C) Copyright 2016 Savoir-faire Linux Inc. 3*d9e268edSSebastien Bourdelin * 4*d9e268edSSebastien Bourdelin * Author: Sebastien Bourdelin <sebastien.bourdelin@savoirfairelinux.com> 5*d9e268edSSebastien Bourdelin * 6*d9e268edSSebastien Bourdelin * Based on work from TS7680 code by: 7*d9e268edSSebastien Bourdelin * Kris Bahnsen <kris@embeddedarm.com> 8*d9e268edSSebastien Bourdelin * Mark Featherston <mark@embeddedarm.com> 9*d9e268edSSebastien Bourdelin * https://github.com/embeddedarm/u-boot/tree/master/board/technologic/ts7680 10*d9e268edSSebastien Bourdelin * 11*d9e268edSSebastien Bourdelin * Derived from MX28EVK code by 12*d9e268edSSebastien Bourdelin * Freescale Semiconductor, Inc. 13*d9e268edSSebastien Bourdelin * 14*d9e268edSSebastien Bourdelin * SPDX-License-Identifier: GPL-2.0+ 15*d9e268edSSebastien Bourdelin */ 16*d9e268edSSebastien Bourdelin 17*d9e268edSSebastien Bourdelin #include <common.h> 18*d9e268edSSebastien Bourdelin #include <asm/gpio.h> 19*d9e268edSSebastien Bourdelin #include <asm/io.h> 20*d9e268edSSebastien Bourdelin #include <asm/arch/imx-regs.h> 21*d9e268edSSebastien Bourdelin #include <asm/arch/iomux-mx28.h> 22*d9e268edSSebastien Bourdelin #include <asm/arch/clock.h> 23*d9e268edSSebastien Bourdelin #include <asm/arch/sys_proto.h> 24*d9e268edSSebastien Bourdelin #include <linux/mii.h> 25*d9e268edSSebastien Bourdelin #include <miiphy.h> 26*d9e268edSSebastien Bourdelin #include <netdev.h> 27*d9e268edSSebastien Bourdelin #include <errno.h> 28*d9e268edSSebastien Bourdelin 29*d9e268edSSebastien Bourdelin DECLARE_GLOBAL_DATA_PTR; 30*d9e268edSSebastien Bourdelin 31*d9e268edSSebastien Bourdelin int board_early_init_f(void) 32*d9e268edSSebastien Bourdelin { 33*d9e268edSSebastien Bourdelin /* IO0 clock at 480MHz */ 34*d9e268edSSebastien Bourdelin mxs_set_ioclk(MXC_IOCLK0, 480000); 35*d9e268edSSebastien Bourdelin /* IO1 clock at 480MHz */ 36*d9e268edSSebastien Bourdelin mxs_set_ioclk(MXC_IOCLK1, 480000); 37*d9e268edSSebastien Bourdelin 38*d9e268edSSebastien Bourdelin /* SSP0 clocks at 96MHz */ 39*d9e268edSSebastien Bourdelin mxs_set_sspclk(MXC_SSPCLK0, 96000, 0); 40*d9e268edSSebastien Bourdelin 41*d9e268edSSebastien Bourdelin return 0; 42*d9e268edSSebastien Bourdelin } 43*d9e268edSSebastien Bourdelin 44*d9e268edSSebastien Bourdelin int dram_init(void) 45*d9e268edSSebastien Bourdelin { 46*d9e268edSSebastien Bourdelin return mxs_dram_init(); 47*d9e268edSSebastien Bourdelin } 48*d9e268edSSebastien Bourdelin 49*d9e268edSSebastien Bourdelin int board_init(void) 50*d9e268edSSebastien Bourdelin { 51*d9e268edSSebastien Bourdelin /* Adress of boot parameters */ 52*d9e268edSSebastien Bourdelin gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; 53*d9e268edSSebastien Bourdelin 54*d9e268edSSebastien Bourdelin return 0; 55*d9e268edSSebastien Bourdelin } 56*d9e268edSSebastien Bourdelin 57*d9e268edSSebastien Bourdelin #ifdef CONFIG_CMD_MMC 58*d9e268edSSebastien Bourdelin static int ts4600_mmc_cd(int id) 59*d9e268edSSebastien Bourdelin { 60*d9e268edSSebastien Bourdelin return 1; 61*d9e268edSSebastien Bourdelin } 62*d9e268edSSebastien Bourdelin 63*d9e268edSSebastien Bourdelin int board_mmc_init(bd_t *bis) 64*d9e268edSSebastien Bourdelin { 65*d9e268edSSebastien Bourdelin int ret; 66*d9e268edSSebastien Bourdelin 67*d9e268edSSebastien Bourdelin mxs_iomux_setup_pad(MX28_PAD_PWM3__GPIO_3_28); 68*d9e268edSSebastien Bourdelin 69*d9e268edSSebastien Bourdelin /* Power-on SD */ 70*d9e268edSSebastien Bourdelin gpio_direction_output(MX28_PAD_PWM3__GPIO_3_28, 1); 71*d9e268edSSebastien Bourdelin udelay(1000); 72*d9e268edSSebastien Bourdelin gpio_direction_output(MX28_PAD_PWM3__GPIO_3_28, 0); 73*d9e268edSSebastien Bourdelin 74*d9e268edSSebastien Bourdelin /* SD card */ 75*d9e268edSSebastien Bourdelin ret = mxsmmc_initialize(bis, 0, NULL, ts4600_mmc_cd); 76*d9e268edSSebastien Bourdelin if(ret != 0) { 77*d9e268edSSebastien Bourdelin printf("SD controller initialized with %d\n", ret); 78*d9e268edSSebastien Bourdelin } 79*d9e268edSSebastien Bourdelin 80*d9e268edSSebastien Bourdelin return ret; 81*d9e268edSSebastien Bourdelin } 82*d9e268edSSebastien Bourdelin #endif 83*d9e268edSSebastien Bourdelin 84*d9e268edSSebastien Bourdelin int checkboard(void) 85*d9e268edSSebastien Bourdelin { 86*d9e268edSSebastien Bourdelin puts("Board: TS4600\n"); 87*d9e268edSSebastien Bourdelin 88*d9e268edSSebastien Bourdelin return 0; 89*d9e268edSSebastien Bourdelin } 90