blob: a3f568403cd6b39cc0e4a773f87e939873d75d57 [file] [log] [blame]
TsiChungLiewb859ef12007-08-16 19:23:50 -05001/*
2 *
3 * (C) Copyright 2000-2003
4 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
5 *
Alison Wangd132fe62012-03-26 21:49:06 +00006 * Copyright (C) 2004-2007, 2012 Freescale Semiconductor, Inc.
TsiChungLiewb859ef12007-08-16 19:23:50 -05007 * TsiChung Liew (Tsi-Chung.Liew@freescale.com)
8 *
9 * See file CREDITS for list of people who contributed to this
10 * project.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License as
14 * published by the Free Software Foundation; either version 2 of
15 * the License, or (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
25 * MA 02111-1307 USA
26 */
27
28#include <common.h>
29#include <watchdog.h>
30#include <command.h>
Ben Warren2f2b6b62008-08-31 22:22:04 -070031#include <netdev.h>
TsiChungLiewb859ef12007-08-16 19:23:50 -050032
33#include <asm/immap.h>
Alison Wangd132fe62012-03-26 21:49:06 +000034#include <asm/io.h>
TsiChungLiewb859ef12007-08-16 19:23:50 -050035
36DECLARE_GLOBAL_DATA_PTR;
37
Mike Frysinger6d1f6982010-10-20 03:41:17 -040038int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
TsiChungLiewb859ef12007-08-16 19:23:50 -050039{
Alison Wangd132fe62012-03-26 21:49:06 +000040 ccm_t *ccm = (ccm_t *) MMAP_CCM;
TsiChungLiewb859ef12007-08-16 19:23:50 -050041
Alison Wangd132fe62012-03-26 21:49:06 +000042 out_8(&ccm->rcr, CCM_RCR_SOFTRST);
TsiChungLiewb859ef12007-08-16 19:23:50 -050043 /* we don't return! */
44 return 0;
Alison Wangd132fe62012-03-26 21:49:06 +000045}
TsiChungLiewb859ef12007-08-16 19:23:50 -050046
47int checkcpu(void)
48{
Alison Wangd132fe62012-03-26 21:49:06 +000049 ccm_t *ccm = (ccm_t *) MMAP_CCM;
TsiChungLiewb859ef12007-08-16 19:23:50 -050050 u16 msk;
51 u16 id = 0;
52 u8 ver;
53
54 puts("CPU: ");
Alison Wangd132fe62012-03-26 21:49:06 +000055 msk = (in_be16(&ccm->cir) >> 6);
56 ver = (in_be16(&ccm->cir) & 0x003f);
TsiChungLiewb859ef12007-08-16 19:23:50 -050057 switch (msk) {
58 case 0x31:
59 id = 5235;
60 break;
61 }
62
63 if (id) {
Wolfgang Denk20591042008-10-19 02:35:49 +020064 char buf1[32], buf2[32];
65
TsiChungLiewb859ef12007-08-16 19:23:50 -050066 printf("Freescale MCF%d (Mask:%01x Version:%x)\n", id, msk,
67 ver);
Wolfgang Denk20591042008-10-19 02:35:49 +020068 printf(" CPU CLK %s MHz BUS CLK %s MHz\n",
TsiChung Liew10e9a6e2008-10-22 11:55:30 +000069 strmhz(buf1, gd->cpu_clk),
70 strmhz(buf2, gd->bus_clk));
TsiChungLiewb859ef12007-08-16 19:23:50 -050071 }
72
73 return 0;
74};
75
76#if defined(CONFIG_WATCHDOG)
77/* Called by macro WATCHDOG_RESET */
78void watchdog_reset(void)
79{
Alison Wangd132fe62012-03-26 21:49:06 +000080 wdog_t *wdp = (wdog_t *) (MMAP_WDOG);
TsiChungLiewb859ef12007-08-16 19:23:50 -050081
Alison Wangd132fe62012-03-26 21:49:06 +000082 /* Count register */
83 out_be16(&wdp->sr, 0x5555);
TsiChungLiewb859ef12007-08-16 19:23:50 -050084 asm("nop");
Alison Wangd132fe62012-03-26 21:49:06 +000085 out_be16(&wdp->sr, 0xaaaa);
TsiChungLiewb859ef12007-08-16 19:23:50 -050086}
87
88int watchdog_disable(void)
89{
Alison Wangd132fe62012-03-26 21:49:06 +000090 wdog_t *wdp = (wdog_t *) (MMAP_WDOG);
TsiChungLiewb859ef12007-08-16 19:23:50 -050091
92 /* UserManual, once the wdog is disabled, wdog cannot be re-enabled */
Alison Wangd132fe62012-03-26 21:49:06 +000093 /* halted watchdog timer */
94 setbits_be16(&wdp->cr, WTM_WCR_HALTED);
TsiChungLiewb859ef12007-08-16 19:23:50 -050095
96 puts("WATCHDOG:disabled\n");
97 return (0);
98}
99
100int watchdog_init(void)
101{
Alison Wangd132fe62012-03-26 21:49:06 +0000102 wdog_t *wdp = (wdog_t *) (MMAP_WDOG);
TsiChungLiewb859ef12007-08-16 19:23:50 -0500103 u32 wdog_module = 0;
104
105 /* set timeout and enable watchdog */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200106 wdog_module = ((CONFIG_SYS_CLK / CONFIG_SYS_HZ) * CONFIG_WATCHDOG_TIMEOUT);
TsiChungLiewb859ef12007-08-16 19:23:50 -0500107 wdog_module |= (wdog_module / 8192);
Alison Wangd132fe62012-03-26 21:49:06 +0000108 out_be16(&wdp->mr, wdog_module);
TsiChungLiewb859ef12007-08-16 19:23:50 -0500109
Alison Wangd132fe62012-03-26 21:49:06 +0000110 out_be16(&wdp->cr, WTM_WCR_EN);
TsiChungLiewb859ef12007-08-16 19:23:50 -0500111 puts("WATCHDOG:enabled\n");
112
113 return (0);
114}
115#endif /* CONFIG_WATCHDOG */
Ben Warren90c96db2008-08-26 22:16:25 -0700116
117#if defined(CONFIG_MCFFEC)
118/* Default initializations for MCFFEC controllers. To override,
119 * create a board-specific function called:
120 * int board_eth_init(bd_t *bis)
121 */
122
Ben Warren90c96db2008-08-26 22:16:25 -0700123int cpu_eth_init(bd_t *bis)
124{
125 return mcffec_initialize(bis);
126}
127#endif