xref: /openbmc/u-boot/arch/m68k/cpu/mcf52x2/cpu.c (revision a65b25d1)
1 /*
2  * (C) Copyright 2003
3  * Josef Baumgartner <josef.baumgartner@telex.de>
4  *
5  * MCF5282 additionals
6  * (C) Copyright 2005
7  * BuS Elektronik GmbH & Co. KG <esw@bus-elektronik.de>
8  *
9  * MCF5275 additions
10  * Copyright (C) 2008 Arthur Shipkowski (art@videon-central.com)
11  *
12  * Copyright (C) 2012 Freescale Semiconductor, Inc. All Rights Reserved.
13  *
14  * SPDX-License-Identifier:	GPL-2.0+
15  */
16 
17 #include <common.h>
18 #include <watchdog.h>
19 #include <command.h>
20 #include <asm/immap.h>
21 #include <asm/io.h>
22 #include <netdev.h>
23 #include "cpu.h"
24 
25 DECLARE_GLOBAL_DATA_PTR;
26 
27 #ifdef	CONFIG_M5208
28 int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
29 {
30 	rcm_t *rcm = (rcm_t *)(MMAP_RCM);
31 
32 	udelay(1000);
33 
34 	out_8(&rcm->rcr, RCM_RCR_SOFTRST);
35 
36 	/* we don't return! */
37 	return 0;
38 };
39 
40 int checkcpu(void)
41 {
42 	char buf1[32], buf2[32];
43 
44 	printf("CPU:   Freescale Coldfire MCF5208\n"
45 	       "       CPU CLK %s MHz BUS CLK %s MHz\n",
46 	       strmhz(buf1, gd->cpu_clk),
47 	       strmhz(buf2, gd->bus_clk));
48 	return 0;
49 };
50 
51 #if defined(CONFIG_WATCHDOG)
52 /* Called by macro WATCHDOG_RESET */
53 void watchdog_reset(void)
54 {
55 	wdog_t *wdt = (wdog_t *)(MMAP_WDOG);
56 
57 	out_be16(&wdt->sr, 0x5555);
58 	out_be16(&wdt->sr, 0xaaaa);
59 }
60 
61 int watchdog_disable(void)
62 {
63 	wdog_t *wdt = (wdog_t *)(MMAP_WDOG);
64 
65 	/* reset watchdog counter */
66 	out_be16(&wdt->sr, 0x5555);
67 	out_be16(&wdt->sr, 0xaaaa);
68 	/* disable watchdog timer */
69 	out_be16(&wdt->cr, 0);
70 
71 	puts("WATCHDOG:disabled\n");
72 	return (0);
73 }
74 
75 int watchdog_init(void)
76 {
77 	wdog_t *wdt = (wdog_t *)(MMAP_WDOG);
78 
79 	/* disable watchdog */
80 	out_be16(&wdt->cr, 0);
81 
82 	/* set timeout and enable watchdog */
83 	out_be16(&wdt->mr,
84 		(CONFIG_WATCHDOG_TIMEOUT * CONFIG_SYS_HZ) / (32768 * 1000) - 1);
85 
86 	/* reset watchdog counter */
87 	out_be16(&wdt->sr, 0x5555);
88 	out_be16(&wdt->sr, 0xaaaa);
89 
90 	puts("WATCHDOG:enabled\n");
91 	return (0);
92 }
93 #endif				/* #ifdef CONFIG_WATCHDOG */
94 #endif				/* #ifdef CONFIG_M5208 */
95 
96 #ifdef  CONFIG_M5271
97 /*
98  * Both MCF5270 and MCF5271 are members of the MPC5271 family. Try to
99  * determine which one we are running on, based on the Chip Identification
100  * Register (CIR).
101  */
102 int checkcpu(void)
103 {
104 	char buf[32];
105 	unsigned short cir;	/* Chip Identification Register */
106 	unsigned short pin;	/* Part identification number */
107 	unsigned char prn;	/* Part revision number */
108 	char *cpu_model;
109 
110 	cir = mbar_readShort(MCF_CCM_CIR);
111 	pin = cir >> MCF_CCM_CIR_PIN_LEN;
112 	prn = cir & MCF_CCM_CIR_PRN_MASK;
113 
114 	switch (pin) {
115 	case MCF_CCM_CIR_PIN_MCF5270:
116 		cpu_model = "5270";
117 		break;
118 	case MCF_CCM_CIR_PIN_MCF5271:
119 		cpu_model = "5271";
120 		break;
121 	default:
122 		cpu_model = NULL;
123 		break;
124 	}
125 
126 	if (cpu_model)
127 		printf("CPU:   Freescale ColdFire MCF%s rev. %hu, at %s MHz\n",
128 		       cpu_model, prn, strmhz(buf, CONFIG_SYS_CLK));
129 	else
130 		printf("CPU:   Unknown - Freescale ColdFire MCF5271 family"
131 		       " (PIN: 0x%x) rev. %hu, at %s MHz\n",
132 		       pin, prn, strmhz(buf, CONFIG_SYS_CLK));
133 
134 	return 0;
135 }
136 
137 int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
138 {
139 	/* Call the board specific reset actions first. */
140 	if(board_reset) {
141 		board_reset();
142 	}
143 
144 	mbar_writeByte(MCF_RCM_RCR,
145 		       MCF_RCM_RCR_SOFTRST | MCF_RCM_RCR_FRCRSTOUT);
146 	return 0;
147 };
148 
149 #if defined(CONFIG_WATCHDOG)
150 void watchdog_reset(void)
151 {
152 	mbar_writeShort(MCF_WTM_WSR, 0x5555);
153 	mbar_writeShort(MCF_WTM_WSR, 0xAAAA);
154 }
155 
156 int watchdog_disable(void)
157 {
158 	mbar_writeShort(MCF_WTM_WCR, 0);
159 	return (0);
160 }
161 
162 int watchdog_init(void)
163 {
164 	mbar_writeShort(MCF_WTM_WCR, MCF_WTM_WCR_EN);
165 	return (0);
166 }
167 #endif				/* #ifdef CONFIG_WATCHDOG */
168 
169 #endif
170 
171 #ifdef	CONFIG_M5272
172 int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
173 {
174 	wdog_t *wdp = (wdog_t *) (MMAP_WDOG);
175 
176 	out_be16(&wdp->wdog_wrrr, 0);
177 	udelay(1000);
178 
179 	/* enable watchdog, set timeout to 0 and wait */
180 	out_be16(&wdp->wdog_wrrr, 1);
181 	while (1) ;
182 
183 	/* we don't return! */
184 	return 0;
185 };
186 
187 int checkcpu(void)
188 {
189 	sysctrl_t *sysctrl = (sysctrl_t *) (MMAP_CFG);
190 	uchar msk;
191 	char *suf;
192 
193 	puts("CPU:   ");
194 	msk = (in_be32(&sysctrl->sc_dir) > 28) & 0xf;
195 	switch (msk) {
196 	case 0x2:
197 		suf = "1K75N";
198 		break;
199 	case 0x4:
200 		suf = "3K75N";
201 		break;
202 	default:
203 		suf = NULL;
204 		printf("Freescale MCF5272 (Mask:%01x)\n", msk);
205 		break;
206 	}
207 
208 	if (suf)
209 		printf("Freescale MCF5272 %s\n", suf);
210 	return 0;
211 };
212 
213 #if defined(CONFIG_WATCHDOG)
214 /* Called by macro WATCHDOG_RESET */
215 void watchdog_reset(void)
216 {
217 	wdog_t *wdt = (wdog_t *)(MMAP_WDOG);
218 
219 	out_be16(&wdt->wdog_wcr, 0);
220 }
221 
222 int watchdog_disable(void)
223 {
224 	wdog_t *wdt = (wdog_t *)(MMAP_WDOG);
225 
226 	/* reset watchdog counter */
227 	out_be16(&wdt->wdog_wcr, 0);
228 	/* disable watchdog interrupt */
229 	out_be16(&wdt->wdog_wirr, 0);
230 	/* disable watchdog timer */
231 	out_be16(&wdt->wdog_wrrr, 0);
232 
233 	puts("WATCHDOG:disabled\n");
234 	return (0);
235 }
236 
237 int watchdog_init(void)
238 {
239 	wdog_t *wdt = (wdog_t *)(MMAP_WDOG);
240 
241 	/* disable watchdog interrupt */
242 	out_be16(&wdt->wdog_wirr, 0);
243 
244 	/* set timeout and enable watchdog */
245 	out_be16(&wdt->wdog_wrrr,
246 		(CONFIG_WATCHDOG_TIMEOUT * CONFIG_SYS_HZ) / (32768 * 1000) - 1);
247 
248 	/* reset watchdog counter */
249 	out_be16(&wdt->wdog_wcr, 0);
250 
251 	puts("WATCHDOG:enabled\n");
252 	return (0);
253 }
254 #endif				/* #ifdef CONFIG_WATCHDOG */
255 
256 #endif				/* #ifdef CONFIG_M5272 */
257 
258 #ifdef	CONFIG_M5275
259 int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
260 {
261 	rcm_t *rcm = (rcm_t *)(MMAP_RCM);
262 
263 	udelay(1000);
264 
265 	out_8(&rcm->rcr, RCM_RCR_SOFTRST);
266 
267 	/* we don't return! */
268 	return 0;
269 };
270 
271 int checkcpu(void)
272 {
273 	char buf[32];
274 
275 	printf("CPU:   Freescale Coldfire MCF5275 at %s MHz\n",
276 			strmhz(buf, CONFIG_SYS_CLK));
277 	return 0;
278 };
279 
280 
281 #if defined(CONFIG_WATCHDOG)
282 /* Called by macro WATCHDOG_RESET */
283 void watchdog_reset(void)
284 {
285 	wdog_t *wdt = (wdog_t *)(MMAP_WDOG);
286 
287 	out_be16(&wdt->wsr, 0x5555);
288 	out_be16(&wdt->wsr, 0xaaaa);
289 }
290 
291 int watchdog_disable(void)
292 {
293 	wdog_t *wdt = (wdog_t *)(MMAP_WDOG);
294 
295 	/* reset watchdog counter */
296 	out_be16(&wdt->wsr, 0x5555);
297 	out_be16(&wdt->wsr, 0xaaaa);
298 
299 	/* disable watchdog timer */
300 	out_be16(&wdt->wcr, 0);
301 
302 	puts("WATCHDOG:disabled\n");
303 	return (0);
304 }
305 
306 int watchdog_init(void)
307 {
308 	wdog_t *wdt = (wdog_t *)(MMAP_WDOG);
309 
310 	/* disable watchdog */
311 	out_be16(&wdt->wcr, 0);
312 
313 	/* set timeout and enable watchdog */
314 	out_be16(&wdt->wmr,
315 		(CONFIG_WATCHDOG_TIMEOUT * CONFIG_SYS_HZ) / (32768 * 1000) - 1);
316 
317 	/* reset watchdog counter */
318 	out_be16(&wdt->wsr, 0x5555);
319 	out_be16(&wdt->wsr, 0xaaaa);
320 
321 	puts("WATCHDOG:enabled\n");
322 	return (0);
323 }
324 #endif				/* #ifdef CONFIG_WATCHDOG */
325 
326 #endif				/* #ifdef CONFIG_M5275 */
327 
328 #ifdef	CONFIG_M5282
329 int checkcpu(void)
330 {
331 	unsigned char resetsource = MCFRESET_RSR;
332 
333 	printf("CPU:   Freescale Coldfire MCF5282 (PIN: %2.2x REV: %2.2x)\n",
334 	       MCFCCM_CIR >> 8, MCFCCM_CIR & MCFCCM_CIR_PRN_MASK);
335 	printf("Reset:%s%s%s%s%s%s%s\n",
336 	       (resetsource & MCFRESET_RSR_LOL) ? " Loss of Lock" : "",
337 	       (resetsource & MCFRESET_RSR_LOC) ? " Loss of Clock" : "",
338 	       (resetsource & MCFRESET_RSR_EXT) ? " External" : "",
339 	       (resetsource & MCFRESET_RSR_POR) ? " Power On" : "",
340 	       (resetsource & MCFRESET_RSR_WDR) ? " Watchdog" : "",
341 	       (resetsource & MCFRESET_RSR_SOFT) ? " Software" : "",
342 	       (resetsource & MCFRESET_RSR_LVD) ? " Low Voltage" : "");
343 	return 0;
344 }
345 
346 int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
347 {
348 	MCFRESET_RCR = MCFRESET_RCR_SOFTRST;
349 	return 0;
350 };
351 #endif
352 
353 #ifdef CONFIG_M5249
354 int checkcpu(void)
355 {
356 	char buf[32];
357 
358 	printf("CPU:   Freescale Coldfire MCF5249 at %s MHz\n",
359 	       strmhz(buf, CONFIG_SYS_CLK));
360 	return 0;
361 }
362 
363 int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
364 {
365 	/* enable watchdog, set timeout to 0 and wait */
366 	mbar_writeByte(MCFSIM_SYPCR, 0xc0);
367 	while (1) ;
368 
369 	/* we don't return! */
370 	return 0;
371 };
372 #endif
373 
374 #ifdef CONFIG_M5253
375 int checkcpu(void)
376 {
377 	char buf[32];
378 
379 	unsigned char resetsource = mbar_readLong(SIM_RSR);
380 	printf("CPU:   Freescale Coldfire MCF5253 at %s MHz\n",
381 	       strmhz(buf, CONFIG_SYS_CLK));
382 
383 	if ((resetsource & SIM_RSR_HRST) || (resetsource & SIM_RSR_SWTR)) {
384 		printf("Reset:%s%s\n",
385 		       (resetsource & SIM_RSR_HRST) ? " Hardware/ System Reset"
386 		       : "",
387 		       (resetsource & SIM_RSR_SWTR) ? " Software Watchdog" :
388 		       "");
389 	}
390 	return 0;
391 }
392 
393 int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
394 {
395 	/* enable watchdog, set timeout to 0 and wait */
396 	mbar_writeByte(SIM_SYPCR, 0xc0);
397 	while (1) ;
398 
399 	/* we don't return! */
400 	return 0;
401 };
402 #endif
403 
404 #if defined(CONFIG_MCFFEC)
405 /* Default initializations for MCFFEC controllers.  To override,
406  * create a board-specific function called:
407  * 	int board_eth_init(bd_t *bis)
408  */
409 
410 int cpu_eth_init(bd_t *bis)
411 {
412 	return mcffec_initialize(bis);
413 }
414 #endif
415