18449f287SMagnus Lilja /* 28449f287SMagnus Lilja * 38449f287SMagnus Lilja * (C) Copyright 2009 Magnus Lilja <lilja.magnus@gmail.com> 48449f287SMagnus Lilja * 58449f287SMagnus Lilja * (c) 2007 Pengutronix, Sascha Hauer <s.hauer@pengutronix.de> 68449f287SMagnus Lilja * 78449f287SMagnus Lilja * See file CREDITS for list of people who contributed to this 88449f287SMagnus Lilja * project. 98449f287SMagnus Lilja * 108449f287SMagnus Lilja * This program is free software; you can redistribute it and/or 118449f287SMagnus Lilja * modify it under the terms of the GNU General Public License as 128449f287SMagnus Lilja * published by the Free Software Foundation; either version 2 of 138449f287SMagnus Lilja * the License, or (at your option) any later version. 148449f287SMagnus Lilja * 158449f287SMagnus Lilja * This program is distributed in the hope that it will be useful, 168449f287SMagnus Lilja * but WITHOUT ANY WARRANTY; without even the implied warranty of 178449f287SMagnus Lilja * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 188449f287SMagnus Lilja * GNU General Public License for more details. 198449f287SMagnus Lilja * 208449f287SMagnus Lilja * You should have received a copy of the GNU General Public License 218449f287SMagnus Lilja * along with this program; if not, write to the Free Software 228449f287SMagnus Lilja * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 238449f287SMagnus Lilja * MA 02111-1307 USA 248449f287SMagnus Lilja */ 258449f287SMagnus Lilja 268449f287SMagnus Lilja 278449f287SMagnus Lilja #include <common.h> 28736fead8SBen Warren #include <netdev.h> 2986271115SStefano Babic #include <asm/arch/clock.h> 3086271115SStefano Babic #include <asm/arch/imx-regs.h> 3147c5455aSHelmut Raiger #include <asm/arch/sys_proto.h> 32b73850f7SFabio Estevam #include <watchdog.h> 33c7336815SŁukasz Majewski #include <power/pmic.h> 341f83d009SFabio Estevam #include <fsl_pmic.h> 35c7336815SŁukasz Majewski #include <errno.h> 368449f287SMagnus Lilja 378449f287SMagnus Lilja DECLARE_GLOBAL_DATA_PTR; 388449f287SMagnus Lilja 39da962b71SBenoît Thébaudeau #ifdef CONFIG_SPL_BUILD 40da962b71SBenoît Thébaudeau void board_init_f(ulong bootflag) 41da962b71SBenoît Thébaudeau { 42*3acb324fSAlbert ARIBAUD /* 43*3acb324fSAlbert ARIBAUD * copy ourselves from where we are running to where we were 44*3acb324fSAlbert ARIBAUD * linked at. Use ulong pointers as all addresses involved 45*3acb324fSAlbert ARIBAUD * are 4-byte-aligned. 46*3acb324fSAlbert ARIBAUD */ 47*3acb324fSAlbert ARIBAUD ulong *start_ptr, *end_ptr, *link_ptr, *run_ptr, *dst; 48*3acb324fSAlbert ARIBAUD asm volatile ("ldr %0, =_start" : "=r"(start_ptr)); 49*3acb324fSAlbert ARIBAUD asm volatile ("ldr %0, =_end" : "=r"(end_ptr)); 50*3acb324fSAlbert ARIBAUD asm volatile ("ldr %0, =board_init_f" : "=r"(link_ptr)); 51*3acb324fSAlbert ARIBAUD asm volatile ("adr %0, board_init_f" : "=r"(run_ptr)); 52*3acb324fSAlbert ARIBAUD for (dst = start_ptr; dst < end_ptr; dst++) 53*3acb324fSAlbert ARIBAUD *dst = *(dst+(run_ptr-link_ptr)); 54*3acb324fSAlbert ARIBAUD /* 55*3acb324fSAlbert ARIBAUD * branch to nand_boot's link-time address. 56*3acb324fSAlbert ARIBAUD */ 57da962b71SBenoît Thébaudeau asm volatile("ldr pc, =nand_boot"); 58da962b71SBenoît Thébaudeau } 59da962b71SBenoît Thébaudeau #endif 60da962b71SBenoît Thébaudeau 618449f287SMagnus Lilja int dram_init(void) 628449f287SMagnus Lilja { 63ed3df72dSFabio Estevam /* dram_init must store complete ramsize in gd->ram_size */ 64a55d23ccSAlbert ARIBAUD gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE, 65ed3df72dSFabio Estevam PHYS_SDRAM_1_SIZE); 66ed3df72dSFabio Estevam return 0; 67ed3df72dSFabio Estevam } 68ed3df72dSFabio Estevam 699b6442f9SFabio Estevam int board_early_init_f(void) 708449f287SMagnus Lilja { 718449f287SMagnus Lilja /* CS5: CPLD incl. network controller */ 7247c5455aSHelmut Raiger static const struct mxc_weimcs cs5 = { 7347c5455aSHelmut Raiger /* sp wp bcd bcs psz pme sync dol cnc wsc ew wws edc */ 7447c5455aSHelmut Raiger CSCR_U(0, 0, 0, 0, 0, 0, 0, 0, 3, 24, 0, 4, 3), 7547c5455aSHelmut Raiger /* oea oen ebwa ebwn csa ebc dsz csn psr cre wrap csen */ 7647c5455aSHelmut Raiger CSCR_L(2, 2, 2, 5, 2, 0, 5, 2, 0, 0, 0, 1), 7747c5455aSHelmut Raiger /* ebra ebrn rwa rwn mum lah lbn lba dww dct wwu age cnc2 fce*/ 7847c5455aSHelmut Raiger CSCR_A(2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0) 7947c5455aSHelmut Raiger }; 8047c5455aSHelmut Raiger 8147c5455aSHelmut Raiger mxc_setup_weimcs(5, &cs5); 828449f287SMagnus Lilja 838449f287SMagnus Lilja /* Setup UART1 and SPI2 pins */ 848449f287SMagnus Lilja mx31_uart1_hw_init(); 858449f287SMagnus Lilja mx31_spi2_hw_init(); 868449f287SMagnus Lilja 879b6442f9SFabio Estevam return 0; 889b6442f9SFabio Estevam } 899b6442f9SFabio Estevam 909b6442f9SFabio Estevam int board_init(void) 919b6442f9SFabio Estevam { 928449f287SMagnus Lilja /* adress of boot parameters */ 938449f287SMagnus Lilja gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; 948449f287SMagnus Lilja 958449f287SMagnus Lilja return 0; 968449f287SMagnus Lilja } 978449f287SMagnus Lilja 98b73850f7SFabio Estevam int board_late_init(void) 99b73850f7SFabio Estevam { 1001f83d009SFabio Estevam u32 val; 1011f83d009SFabio Estevam struct pmic *p; 102c7336815SŁukasz Majewski int ret; 1031f83d009SFabio Estevam 104c7336815SŁukasz Majewski ret = pmic_init(I2C_PMIC); 105c7336815SŁukasz Majewski if (ret) 106c7336815SŁukasz Majewski return ret; 1071f83d009SFabio Estevam 108c7336815SŁukasz Majewski p = pmic_get("FSL_PMIC"); 109c7336815SŁukasz Majewski if (!p) 110c7336815SŁukasz Majewski return -ENODEV; 1111f83d009SFabio Estevam /* Enable RTC battery */ 1121f83d009SFabio Estevam pmic_reg_read(p, REG_POWER_CTL0, &val); 1131f83d009SFabio Estevam pmic_reg_write(p, REG_POWER_CTL0, val | COINCHEN); 1141f83d009SFabio Estevam pmic_reg_write(p, REG_INT_STATUS1, RTCRSTI); 115b73850f7SFabio Estevam #ifdef CONFIG_HW_WATCHDOG 116abbab703STroy Kisky hw_watchdog_init(); 117b73850f7SFabio Estevam #endif 118b73850f7SFabio Estevam return 0; 119b73850f7SFabio Estevam } 120b73850f7SFabio Estevam 1218449f287SMagnus Lilja int checkboard(void) 1228449f287SMagnus Lilja { 123e9e0790cSFabio Estevam printf("Board: MX31PDK\n"); 1248449f287SMagnus Lilja return 0; 1258449f287SMagnus Lilja } 126736fead8SBen Warren 127736fead8SBen Warren int board_eth_init(bd_t *bis) 128736fead8SBen Warren { 129736fead8SBen Warren int rc = 0; 130736fead8SBen Warren #ifdef CONFIG_SMC911X 131736fead8SBen Warren rc = smc911x_initialize(0, CONFIG_SMC911X_BASE); 132736fead8SBen Warren #endif 133736fead8SBen Warren return rc; 134736fead8SBen Warren } 135