1a4145534SPeter Tyser /* 2a4145534SPeter Tyser * 3a4145534SPeter Tyser * (C) Copyright 2000-2003 4a4145534SPeter Tyser * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 5a4145534SPeter Tyser * 6*aa0d99fcSAlison Wang * Copyright (C) 2004-2008, 2012 Freescale Semiconductor, Inc. 7a4145534SPeter Tyser * TsiChung Liew (Tsi-Chung.Liew@freescale.com) 8a4145534SPeter Tyser * 9a4145534SPeter Tyser * See file CREDITS for list of people who contributed to this 10a4145534SPeter Tyser * project. 11a4145534SPeter Tyser * 12a4145534SPeter Tyser * This program is free software; you can redistribute it and/or 13a4145534SPeter Tyser * modify it under the terms of the GNU General Public License as 14a4145534SPeter Tyser * published by the Free Software Foundation; either version 2 of 15a4145534SPeter Tyser * the License, or (at your option) any later version. 16a4145534SPeter Tyser * 17a4145534SPeter Tyser * This program is distributed in the hope that it will be useful, 18a4145534SPeter Tyser * but WITHOUT ANY WARRANTY; without even the implied warranty of 19a4145534SPeter Tyser * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20a4145534SPeter Tyser * GNU General Public License for more details. 21a4145534SPeter Tyser * 22a4145534SPeter Tyser * You should have received a copy of the GNU General Public License 23a4145534SPeter Tyser * along with this program; if not, write to the Free Software 24a4145534SPeter Tyser * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 25a4145534SPeter Tyser * MA 02111-1307 USA 26a4145534SPeter Tyser */ 27a4145534SPeter Tyser 28a4145534SPeter Tyser #include <common.h> 29a4145534SPeter Tyser #include <watchdog.h> 30a4145534SPeter Tyser #include <command.h> 31a4145534SPeter Tyser #include <netdev.h> 32a4145534SPeter Tyser 33a4145534SPeter Tyser #include <asm/immap.h> 34*aa0d99fcSAlison Wang #include <asm/io.h> 35a4145534SPeter Tyser 36a4145534SPeter Tyser DECLARE_GLOBAL_DATA_PTR; 37a4145534SPeter Tyser 38882b7d72SMike Frysinger int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 39a4145534SPeter Tyser { 40*aa0d99fcSAlison Wang rcm_t *rcm = (rcm_t *) (MMAP_RCM); 41a4145534SPeter Tyser 42a4145534SPeter Tyser udelay(1000); 43*aa0d99fcSAlison Wang setbits_8(&rcm->rcr, RCM_RCR_SOFTRST); 44a4145534SPeter Tyser 45a4145534SPeter Tyser /* we don't return! */ 46a4145534SPeter Tyser return 0; 47a4145534SPeter Tyser }; 48a4145534SPeter Tyser 49a4145534SPeter Tyser int checkcpu(void) 50a4145534SPeter Tyser { 51*aa0d99fcSAlison Wang ccm_t *ccm = (ccm_t *) MMAP_CCM; 52a4145534SPeter Tyser u16 msk; 53a4145534SPeter Tyser u16 id = 0; 54a4145534SPeter Tyser u8 ver; 55a4145534SPeter Tyser 56a4145534SPeter Tyser puts("CPU: "); 57*aa0d99fcSAlison Wang msk = (in_be16(&ccm->cir) >> 6); 58*aa0d99fcSAlison Wang ver = (in_be16(&ccm->cir) & 0x003f); 59a4145534SPeter Tyser switch (msk) { 60a4145534SPeter Tyser #ifdef CONFIG_MCF5301x 61a4145534SPeter Tyser case 0x78: 62a4145534SPeter Tyser id = 53010; 63a4145534SPeter Tyser break; 64a4145534SPeter Tyser case 0x77: 65a4145534SPeter Tyser id = 53012; 66a4145534SPeter Tyser break; 67a4145534SPeter Tyser case 0x76: 68a4145534SPeter Tyser id = 53015; 69a4145534SPeter Tyser break; 70a4145534SPeter Tyser case 0x74: 71a4145534SPeter Tyser id = 53011; 72a4145534SPeter Tyser break; 73a4145534SPeter Tyser case 0x73: 74a4145534SPeter Tyser id = 53013; 75a4145534SPeter Tyser break; 76a4145534SPeter Tyser #endif 77a4145534SPeter Tyser #ifdef CONFIG_MCF532x 78a4145534SPeter Tyser case 0x54: 79a4145534SPeter Tyser id = 5329; 80a4145534SPeter Tyser break; 81a4145534SPeter Tyser case 0x59: 82a4145534SPeter Tyser id = 5328; 83a4145534SPeter Tyser break; 84a4145534SPeter Tyser case 0x61: 85a4145534SPeter Tyser id = 5327; 86a4145534SPeter Tyser break; 87a4145534SPeter Tyser case 0x65: 88a4145534SPeter Tyser id = 5373; 89a4145534SPeter Tyser break; 90a4145534SPeter Tyser case 0x68: 91a4145534SPeter Tyser id = 53721; 92a4145534SPeter Tyser break; 93a4145534SPeter Tyser case 0x69: 94a4145534SPeter Tyser id = 5372; 95a4145534SPeter Tyser break; 96a4145534SPeter Tyser case 0x6B: 97a4145534SPeter Tyser id = 5372; 98a4145534SPeter Tyser break; 99a4145534SPeter Tyser #endif 100a4145534SPeter Tyser } 101a4145534SPeter Tyser 102a4145534SPeter Tyser if (id) { 103a4145534SPeter Tyser char buf1[32], buf2[32]; 104a4145534SPeter Tyser 105a4145534SPeter Tyser printf("Freescale MCF%d (Mask:%01x Version:%x)\n", id, msk, 106a4145534SPeter Tyser ver); 107a4145534SPeter Tyser printf(" CPU CLK %s MHz BUS CLK %s MHz\n", 108a4145534SPeter Tyser strmhz(buf1, gd->cpu_clk), 109a4145534SPeter Tyser strmhz(buf2, gd->bus_clk)); 110a4145534SPeter Tyser } 111a4145534SPeter Tyser 112a4145534SPeter Tyser return 0; 113a4145534SPeter Tyser }; 114a4145534SPeter Tyser 115a4145534SPeter Tyser #if defined(CONFIG_WATCHDOG) 116a4145534SPeter Tyser /* Called by macro WATCHDOG_RESET */ 117a4145534SPeter Tyser void watchdog_reset(void) 118a4145534SPeter Tyser { 119*aa0d99fcSAlison Wang wdog_t *wdp = (wdog_t *) (MMAP_WDOG); 120a4145534SPeter Tyser 121*aa0d99fcSAlison Wang /* Count register */ 122*aa0d99fcSAlison Wang out_be16(&wdp->sr, 0x5555); 123*aa0d99fcSAlison Wang out_be16(&wdp->sr, 0xaaaa); 124a4145534SPeter Tyser } 125a4145534SPeter Tyser 126a4145534SPeter Tyser int watchdog_disable(void) 127a4145534SPeter Tyser { 128*aa0d99fcSAlison Wang wdog_t *wdp = (wdog_t *) (MMAP_WDOG); 129a4145534SPeter Tyser 130a4145534SPeter Tyser /* UserManual, once the wdog is disabled, wdog cannot be re-enabled */ 131*aa0d99fcSAlison Wang /* halted watchdog timer */ 132*aa0d99fcSAlison Wang setbits_be16(&wdp->cr, WTM_WCR_HALTED); 133a4145534SPeter Tyser 134a4145534SPeter Tyser puts("WATCHDOG:disabled\n"); 135a4145534SPeter Tyser return (0); 136a4145534SPeter Tyser } 137a4145534SPeter Tyser 138a4145534SPeter Tyser int watchdog_init(void) 139a4145534SPeter Tyser { 140*aa0d99fcSAlison Wang wdog_t *wdp = (wdog_t *) (MMAP_WDOG); 141a4145534SPeter Tyser u32 wdog_module = 0; 142a4145534SPeter Tyser 143a4145534SPeter Tyser /* set timeout and enable watchdog */ 144a4145534SPeter Tyser wdog_module = ((CONFIG_SYS_CLK / 1000) * CONFIG_WATCHDOG_TIMEOUT); 145a4145534SPeter Tyser #ifdef CONFIG_M5329 146*aa0d99fcSAlison Wang out_be16(&wdp->mr, wdog_module / 8192); 147a4145534SPeter Tyser #else 148*aa0d99fcSAlison Wang out_be16(&wdp->mr, wdog_module / 4096); 149a4145534SPeter Tyser #endif 150a4145534SPeter Tyser 151*aa0d99fcSAlison Wang out_be16(&wdp->cr, WTM_WCR_EN); 152a4145534SPeter Tyser puts("WATCHDOG:enabled\n"); 153a4145534SPeter Tyser 154a4145534SPeter Tyser return (0); 155a4145534SPeter Tyser } 156a4145534SPeter Tyser #endif /* CONFIG_WATCHDOG */ 157a4145534SPeter Tyser 158a4145534SPeter Tyser #if defined(CONFIG_MCFFEC) 159a4145534SPeter Tyser /* Default initializations for MCFFEC controllers. To override, 160a4145534SPeter Tyser * create a board-specific function called: 161a4145534SPeter Tyser * int board_eth_init(bd_t *bis) 162a4145534SPeter Tyser */ 163a4145534SPeter Tyser 164a4145534SPeter Tyser int cpu_eth_init(bd_t *bis) 165a4145534SPeter Tyser { 166a4145534SPeter Tyser return mcffec_initialize(bis); 167a4145534SPeter Tyser } 168a4145534SPeter Tyser #endif 169