xref: /openbmc/u-boot/arch/m68k/cpu/mcf547x_8x/cpu.c (revision a4145534)
1*a4145534SPeter Tyser /*
2*a4145534SPeter Tyser  *
3*a4145534SPeter Tyser  * (C) Copyright 2000-2003
4*a4145534SPeter Tyser  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
5*a4145534SPeter Tyser  *
6*a4145534SPeter Tyser  * Copyright (C) 2004-2007 Freescale Semiconductor, Inc.
7*a4145534SPeter Tyser  * TsiChung Liew (Tsi-Chung.Liew@freescale.com)
8*a4145534SPeter Tyser  *
9*a4145534SPeter Tyser  * See file CREDITS for list of people who contributed to this
10*a4145534SPeter Tyser  * project.
11*a4145534SPeter Tyser  *
12*a4145534SPeter Tyser  * This program is free software; you can redistribute it and/or
13*a4145534SPeter Tyser  * modify it under the terms of the GNU General Public License as
14*a4145534SPeter Tyser  * published by the Free Software Foundation; either version 2 of
15*a4145534SPeter Tyser  * the License, or (at your option) any later version.
16*a4145534SPeter Tyser  *
17*a4145534SPeter Tyser  * This program is distributed in the hope that it will be useful,
18*a4145534SPeter Tyser  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19*a4145534SPeter Tyser  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20*a4145534SPeter Tyser  * GNU General Public License for more details.
21*a4145534SPeter Tyser  *
22*a4145534SPeter Tyser  * You should have received a copy of the GNU General Public License
23*a4145534SPeter Tyser  * along with this program; if not, write to the Free Software
24*a4145534SPeter Tyser  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
25*a4145534SPeter Tyser  * MA 02111-1307 USA
26*a4145534SPeter Tyser  */
27*a4145534SPeter Tyser 
28*a4145534SPeter Tyser #include <common.h>
29*a4145534SPeter Tyser #include <watchdog.h>
30*a4145534SPeter Tyser #include <command.h>
31*a4145534SPeter Tyser #include <netdev.h>
32*a4145534SPeter Tyser 
33*a4145534SPeter Tyser #include <asm/immap.h>
34*a4145534SPeter Tyser 
35*a4145534SPeter Tyser DECLARE_GLOBAL_DATA_PTR;
36*a4145534SPeter Tyser 
37*a4145534SPeter Tyser int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char *argv[])
38*a4145534SPeter Tyser {
39*a4145534SPeter Tyser 	volatile gptmr_t *gptmr = (gptmr_t *) (MMAP_GPTMR);
40*a4145534SPeter Tyser 
41*a4145534SPeter Tyser 	gptmr->pre = 10;
42*a4145534SPeter Tyser 	gptmr->cnt = 1;
43*a4145534SPeter Tyser 
44*a4145534SPeter Tyser 	/* enable watchdog, set timeout to 0 and wait */
45*a4145534SPeter Tyser 	gptmr->mode = GPT_TMS_SGPIO;
46*a4145534SPeter Tyser 	gptmr->ctrl = GPT_CTRL_WDEN | GPT_CTRL_CE;
47*a4145534SPeter Tyser 
48*a4145534SPeter Tyser 	/* we don't return! */
49*a4145534SPeter Tyser 	return 1;
50*a4145534SPeter Tyser };
51*a4145534SPeter Tyser 
52*a4145534SPeter Tyser int checkcpu(void)
53*a4145534SPeter Tyser {
54*a4145534SPeter Tyser 	volatile siu_t *siu = (siu_t *) MMAP_SIU;
55*a4145534SPeter Tyser 	u16 id = 0;
56*a4145534SPeter Tyser 
57*a4145534SPeter Tyser 	puts("CPU:   ");
58*a4145534SPeter Tyser 
59*a4145534SPeter Tyser 	switch ((siu->jtagid & 0x000FF000) >> 12) {
60*a4145534SPeter Tyser 	case 0x0C:
61*a4145534SPeter Tyser 		id = 5485;
62*a4145534SPeter Tyser 		break;
63*a4145534SPeter Tyser 	case 0x0D:
64*a4145534SPeter Tyser 		id = 5484;
65*a4145534SPeter Tyser 		break;
66*a4145534SPeter Tyser 	case 0x0E:
67*a4145534SPeter Tyser 		id = 5483;
68*a4145534SPeter Tyser 		break;
69*a4145534SPeter Tyser 	case 0x0F:
70*a4145534SPeter Tyser 		id = 5482;
71*a4145534SPeter Tyser 		break;
72*a4145534SPeter Tyser 	case 0x10:
73*a4145534SPeter Tyser 		id = 5481;
74*a4145534SPeter Tyser 		break;
75*a4145534SPeter Tyser 	case 0x11:
76*a4145534SPeter Tyser 		id = 5480;
77*a4145534SPeter Tyser 		break;
78*a4145534SPeter Tyser 	case 0x12:
79*a4145534SPeter Tyser 		id = 5475;
80*a4145534SPeter Tyser 		break;
81*a4145534SPeter Tyser 	case 0x13:
82*a4145534SPeter Tyser 		id = 5474;
83*a4145534SPeter Tyser 		break;
84*a4145534SPeter Tyser 	case 0x14:
85*a4145534SPeter Tyser 		id = 5473;
86*a4145534SPeter Tyser 		break;
87*a4145534SPeter Tyser 	case 0x15:
88*a4145534SPeter Tyser 		id = 5472;
89*a4145534SPeter Tyser 		break;
90*a4145534SPeter Tyser 	case 0x16:
91*a4145534SPeter Tyser 		id = 5471;
92*a4145534SPeter Tyser 		break;
93*a4145534SPeter Tyser 	case 0x17:
94*a4145534SPeter Tyser 		id = 5470;
95*a4145534SPeter Tyser 		break;
96*a4145534SPeter Tyser 	}
97*a4145534SPeter Tyser 
98*a4145534SPeter Tyser 	if (id) {
99*a4145534SPeter Tyser 		char buf1[32], buf2[32];
100*a4145534SPeter Tyser 
101*a4145534SPeter Tyser 		printf("Freescale MCF%d\n", id);
102*a4145534SPeter Tyser 		printf("       CPU CLK %s MHz BUS CLK %s MHz\n",
103*a4145534SPeter Tyser 		       strmhz(buf1, gd->cpu_clk),
104*a4145534SPeter Tyser 		       strmhz(buf2, gd->bus_clk));
105*a4145534SPeter Tyser 	}
106*a4145534SPeter Tyser 
107*a4145534SPeter Tyser 	return 0;
108*a4145534SPeter Tyser };
109*a4145534SPeter Tyser 
110*a4145534SPeter Tyser #if defined(CONFIG_HW_WATCHDOG)
111*a4145534SPeter Tyser /* Called by macro WATCHDOG_RESET */
112*a4145534SPeter Tyser void hw_watchdog_reset(void)
113*a4145534SPeter Tyser {
114*a4145534SPeter Tyser 	volatile gptmr_t *gptmr = (gptmr_t *) (MMAP_GPTMR);
115*a4145534SPeter Tyser 
116*a4145534SPeter Tyser 	gptmr->ocpw = 0xa5;
117*a4145534SPeter Tyser }
118*a4145534SPeter Tyser 
119*a4145534SPeter Tyser int watchdog_disable(void)
120*a4145534SPeter Tyser {
121*a4145534SPeter Tyser 	volatile gptmr_t *gptmr = (gptmr_t *) (MMAP_GPTMR);
122*a4145534SPeter Tyser 
123*a4145534SPeter Tyser 	/* UserManual, once the wdog is disabled, wdog cannot be re-enabled */
124*a4145534SPeter Tyser 	gptmr->mode = 0;
125*a4145534SPeter Tyser 	gptmr->ctrl = 0;
126*a4145534SPeter Tyser 
127*a4145534SPeter Tyser 	puts("WATCHDOG:disabled\n");
128*a4145534SPeter Tyser 
129*a4145534SPeter Tyser 	return (0);
130*a4145534SPeter Tyser }
131*a4145534SPeter Tyser 
132*a4145534SPeter Tyser int watchdog_init(void)
133*a4145534SPeter Tyser {
134*a4145534SPeter Tyser 
135*a4145534SPeter Tyser 	volatile gptmr_t *gptmr = (gptmr_t *) (MMAP_GPTMR);
136*a4145534SPeter Tyser 
137*a4145534SPeter Tyser 	gptmr->pre = CONFIG_WATCHDOG_TIMEOUT;
138*a4145534SPeter Tyser 	gptmr->cnt = CONFIG_SYS_TIMER_PRESCALER * 1000;
139*a4145534SPeter Tyser 
140*a4145534SPeter Tyser 	gptmr->mode = GPT_TMS_SGPIO;
141*a4145534SPeter Tyser 	gptmr->ctrl = GPT_CTRL_CE | GPT_CTRL_WDEN;
142*a4145534SPeter Tyser 	puts("WATCHDOG:enabled\n");
143*a4145534SPeter Tyser 
144*a4145534SPeter Tyser 	return (0);
145*a4145534SPeter Tyser }
146*a4145534SPeter Tyser #endif				/* CONFIG_HW_WATCHDOG */
147*a4145534SPeter Tyser 
148*a4145534SPeter Tyser #if defined(CONFIG_FSLDMAFEC) || defined(CONFIG_MCFFEC)
149*a4145534SPeter Tyser /* Default initializations for MCFFEC controllers.  To override,
150*a4145534SPeter Tyser  * create a board-specific function called:
151*a4145534SPeter Tyser  * 	int board_eth_init(bd_t *bis)
152*a4145534SPeter Tyser  */
153*a4145534SPeter Tyser 
154*a4145534SPeter Tyser int cpu_eth_init(bd_t *bis)
155*a4145534SPeter Tyser {
156*a4145534SPeter Tyser #if defined(CONFIG_FSLDMAFEC)
157*a4145534SPeter Tyser 	mcdmafec_initialize(bis);
158*a4145534SPeter Tyser #endif
159*a4145534SPeter Tyser #if defined(CONFIG_MCFFEC)
160*a4145534SPeter Tyser 	mcffec_initialize(bis);
161*a4145534SPeter Tyser #endif
162*a4145534SPeter Tyser 	return 0;
163*a4145534SPeter Tyser }
164*a4145534SPeter Tyser #endif
165