blob: c4c5d5060491be58f2d3bff5db83270fbc08c578 [file] [log] [blame]
wdenkbf9e3b32004-02-12 00:47:09 +00001/*
2 * (C) Copyright 2003
3 * Josef Baumgartner <josef.baumgartner@telex.de>
4 *
Heiko Schocher9acb6262006-04-20 08:42:42 +02005 * MCF5282 additionals
6 * (C) Copyright 2005
7 * BuS Elektronik GmbH & Co. KG <esw@bus-elektronik.de>
8 *
Matthew Fettkef71d9d92008-02-04 15:38:20 -06009 * MCF5275 additions
10 * Copyright (C) 2008 Arthur Shipkowski (art@videon-central.com)
11 *
wdenkbf9e3b32004-02-12 00:47:09 +000012 * See file CREDITS for list of people who contributed to this
13 * project.
14 *
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License as
17 * published by the Free Software Foundation; either version 2 of
18 * the License, or (at your option) any later version.
19 *
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * You should have received a copy of the GNU General Public License
26 * along with this program; if not, write to the Free Software
27 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
28 * MA 02111-1307 USA
29 */
30
31#include <common.h>
32#include <watchdog.h>
33#include <command.h>
TsiChungLiew83ec20b2007-08-15 19:21:21 -050034#include <asm/immap.h>
Ben Warren89973f82008-08-31 22:22:04 -070035#include <netdev.h>
Richard Retanubunbb907ab2009-10-26 14:19:17 -040036#include "cpu.h"
wdenkbf9e3b32004-02-12 00:47:09 +000037
TsiChung Liewbf9a5212009-06-12 11:29:00 +000038DECLARE_GLOBAL_DATA_PTR;
39
40#ifdef CONFIG_M5208
41int do_reset(cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[])
42{
43 volatile rcm_t *rcm = (rcm_t *)(MMAP_RCM);
44
45 udelay(1000);
46
47 rcm->rcr = RCM_RCR_SOFTRST;
48
49 /* we don't return! */
50 return 0;
51};
52
53int checkcpu(void)
54{
55 char buf1[32], buf2[32];
56
57 printf("CPU: Freescale Coldfire MCF5208\n"
58 " CPU CLK %s MHz BUS CLK %s MHz\n",
59 strmhz(buf1, gd->cpu_clk),
60 strmhz(buf2, gd->bus_clk));
61 return 0;
62};
63
64#if defined(CONFIG_WATCHDOG)
65/* Called by macro WATCHDOG_RESET */
66void watchdog_reset(void)
67{
68 volatile wdog_t *wdt = (volatile wdog_t *)(MMAP_WDOG);
69 wdt->sr = 0x5555;
70 wdt->sr = 0xAAAA;
71}
72
73int watchdog_disable(void)
74{
75 volatile wdog_t *wdt = (volatile wdog_t *)(MMAP_WDOG);
76
77 wdt->sr = 0x5555; /* reset watchdog counteDECLARE_GLOBAL_DATA_PTR;
78r */
79 wdt->sr = 0xAAAA;
80 wdt->cr = 0; /* disable watchdog timer */
81
82 puts("WATCHDOG:disabled\n");
83 return (0);
84}
85
86int watchdog_init(void)
87{
88 volatile wdog_t *wdt = (volatile wdog_t *)(MMAP_WDOG);
89
90 wdt->cr = 0; /* disable watchdog */
91
92 /* set timeout and enable watchdog */
93 wdt->mr =
94 ((CONFIG_WATCHDOG_TIMEOUT * CONFIG_SYS_HZ) / (32768 * 1000)) - 1;
95 wdt->sr = 0x5555; /* reset watchdog counter */
96 wdt->sr = 0xAAAA;
97
98 puts("WATCHDOG:enabled\n");
99 return (0);
100}
101#endif /* #ifdef CONFIG_WATCHDOG */
102#endif /* #ifdef CONFIG_M5208 */
103
Zachary P. Landaueacbd312006-01-26 17:35:56 -0500104#ifdef CONFIG_M5271
Bartlomiej Sieka363d1d82007-01-23 13:25:22 +0100105/*
106 * Both MCF5270 and MCF5271 are members of the MPC5271 family. Try to
107 * determine which one we are running on, based on the Chip Identification
108 * Register (CIR).
109 */
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500110int checkcpu(void)
Zachary P. Landaueacbd312006-01-26 17:35:56 -0500111{
Marian Balakowiczb75ef852006-05-09 11:45:31 +0200112 char buf[32];
Bartlomiej Sieka363d1d82007-01-23 13:25:22 +0100113 unsigned short cir; /* Chip Identification Register */
114 unsigned short pin; /* Part identification number */
115 unsigned char prn; /* Part revision number */
116 char *cpu_model;
Marian Balakowiczb75ef852006-05-09 11:45:31 +0200117
Bartlomiej Sieka363d1d82007-01-23 13:25:22 +0100118 cir = mbar_readShort(MCF_CCM_CIR);
119 pin = cir >> MCF_CCM_CIR_PIN_LEN;
120 prn = cir & MCF_CCM_CIR_PRN_MASK;
121
122 switch (pin) {
123 case MCF_CCM_CIR_PIN_MCF5270:
124 cpu_model = "5270";
125 break;
126 case MCF_CCM_CIR_PIN_MCF5271:
127 cpu_model = "5271";
128 break;
129 default:
130 cpu_model = NULL;
131 break;
132 }
133
134 if (cpu_model)
135 printf("CPU: Freescale ColdFire MCF%s rev. %hu, at %s MHz\n",
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200136 cpu_model, prn, strmhz(buf, CONFIG_SYS_CLK));
Bartlomiej Sieka363d1d82007-01-23 13:25:22 +0100137 else
138 printf("CPU: Unknown - Freescale ColdFire MCF5271 family"
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500139 " (PIN: 0x%x) rev. %hu, at %s MHz\n",
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200140 pin, prn, strmhz(buf, CONFIG_SYS_CLK));
Bartlomiej Sieka363d1d82007-01-23 13:25:22 +0100141
Zachary P. Landaueacbd312006-01-26 17:35:56 -0500142 return 0;
143}
144
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500145int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char *argv[])
146{
Richard Retanubunbb907ab2009-10-26 14:19:17 -0400147 /* Call the board specific reset actions first. */
148 if(board_reset) {
149 board_reset();
150 }
151
Zachary P. Landaueacbd312006-01-26 17:35:56 -0500152 mbar_writeByte(MCF_RCM_RCR,
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500153 MCF_RCM_RCR_SOFTRST | MCF_RCM_RCR_FRCRSTOUT);
Zachary P. Landaueacbd312006-01-26 17:35:56 -0500154 return 0;
155};
156
157#if defined(CONFIG_WATCHDOG)
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500158void watchdog_reset(void)
Zachary P. Landaueacbd312006-01-26 17:35:56 -0500159{
160 mbar_writeShort(MCF_WTM_WSR, 0x5555);
161 mbar_writeShort(MCF_WTM_WSR, 0xAAAA);
162}
163
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500164int watchdog_disable(void)
Zachary P. Landaueacbd312006-01-26 17:35:56 -0500165{
166 mbar_writeShort(MCF_WTM_WCR, 0);
167 return (0);
168}
169
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500170int watchdog_init(void)
Zachary P. Landaueacbd312006-01-26 17:35:56 -0500171{
Zachary P. Landaueacbd312006-01-26 17:35:56 -0500172 mbar_writeShort(MCF_WTM_WCR, MCF_WTM_WCR_EN);
173 return (0);
174}
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500175#endif /* #ifdef CONFIG_WATCHDOG */
Zachary P. Landaueacbd312006-01-26 17:35:56 -0500176
177#endif
wdenkbf9e3b32004-02-12 00:47:09 +0000178
179#ifdef CONFIG_M5272
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500180int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char *argv[])
181{
182 volatile wdog_t *wdp = (wdog_t *) (MMAP_WDOG);
wdenkbf9e3b32004-02-12 00:47:09 +0000183
184 wdp->wdog_wrrr = 0;
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500185 udelay(1000);
wdenkbf9e3b32004-02-12 00:47:09 +0000186
187 /* enable watchdog, set timeout to 0 and wait */
188 wdp->wdog_wrrr = 1;
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500189 while (1) ;
wdenkbf9e3b32004-02-12 00:47:09 +0000190
191 /* we don't return! */
192 return 0;
193};
194
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500195int checkcpu(void)
196{
197 volatile sysctrl_t *sysctrl = (sysctrl_t *) (MMAP_CFG);
wdenkbf9e3b32004-02-12 00:47:09 +0000198 uchar msk;
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500199 char *suf;
wdenkbf9e3b32004-02-12 00:47:09 +0000200
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500201 puts("CPU: ");
202 msk = (sysctrl->sc_dir > 28) & 0xf;
wdenkbf9e3b32004-02-12 00:47:09 +0000203 switch (msk) {
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500204 case 0x2:
205 suf = "1K75N";
206 break;
207 case 0x4:
208 suf = "3K75N";
209 break;
210 default:
211 suf = NULL;
212 printf("Freescale MCF5272 (Mask:%01x)\n", msk);
213 break;
214 }
wdenkbf9e3b32004-02-12 00:47:09 +0000215
216 if (suf)
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500217 printf("Freescale MCF5272 %s\n", suf);
wdenkbf9e3b32004-02-12 00:47:09 +0000218 return 0;
219};
220
wdenkbf9e3b32004-02-12 00:47:09 +0000221#if defined(CONFIG_WATCHDOG)
222/* Called by macro WATCHDOG_RESET */
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500223void watchdog_reset(void)
wdenkbf9e3b32004-02-12 00:47:09 +0000224{
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500225 volatile wdog_t *wdt = (volatile wdog_t *)(MMAP_WDOG);
226 wdt->wdog_wcr = 0;
wdenkbf9e3b32004-02-12 00:47:09 +0000227}
228
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500229int watchdog_disable(void)
wdenkbf9e3b32004-02-12 00:47:09 +0000230{
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500231 volatile wdog_t *wdt = (volatile wdog_t *)(MMAP_WDOG);
wdenkbf9e3b32004-02-12 00:47:09 +0000232
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500233 wdt->wdog_wcr = 0; /* reset watchdog counter */
234 wdt->wdog_wirr = 0; /* disable watchdog interrupt */
235 wdt->wdog_wrrr = 0; /* disable watchdog timer */
wdenkbf9e3b32004-02-12 00:47:09 +0000236
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500237 puts("WATCHDOG:disabled\n");
wdenkbf9e3b32004-02-12 00:47:09 +0000238 return (0);
239}
240
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500241int watchdog_init(void)
wdenkbf9e3b32004-02-12 00:47:09 +0000242{
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500243 volatile wdog_t *wdt = (volatile wdog_t *)(MMAP_WDOG);
wdenkbf9e3b32004-02-12 00:47:09 +0000244
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500245 wdt->wdog_wirr = 0; /* disable watchdog interrupt */
wdenkbf9e3b32004-02-12 00:47:09 +0000246
247 /* set timeout and enable watchdog */
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500248 wdt->wdog_wrrr =
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200249 ((CONFIG_WATCHDOG_TIMEOUT * CONFIG_SYS_HZ) / (32768 * 1000)) - 1;
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500250 wdt->wdog_wcr = 0; /* reset watchdog counter */
wdenkbf9e3b32004-02-12 00:47:09 +0000251
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500252 puts("WATCHDOG:enabled\n");
wdenkbf9e3b32004-02-12 00:47:09 +0000253 return (0);
254}
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500255#endif /* #ifdef CONFIG_WATCHDOG */
wdenkbf9e3b32004-02-12 00:47:09 +0000256
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500257#endif /* #ifdef CONFIG_M5272 */
wdenkbf9e3b32004-02-12 00:47:09 +0000258
Matthew Fettkef71d9d92008-02-04 15:38:20 -0600259#ifdef CONFIG_M5275
260int do_reset(cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[])
261{
262 volatile rcm_t *rcm = (rcm_t *)(MMAP_RCM);
263
264 udelay(1000);
265
266 rcm->rcr = RCM_RCR_SOFTRST;
267
268 /* we don't return! */
269 return 0;
270};
271
272int checkcpu(void)
273{
274 char buf[32];
275
276 printf("CPU: Freescale Coldfire MCF5275 at %s MHz\n",
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200277 strmhz(buf, CONFIG_SYS_CLK));
Matthew Fettkef71d9d92008-02-04 15:38:20 -0600278 return 0;
279};
280
281
282#if defined(CONFIG_WATCHDOG)
283/* Called by macro WATCHDOG_RESET */
284void watchdog_reset(void)
285{
286 volatile wdog_t *wdt = (volatile wdog_t *)(MMAP_WDOG);
287 wdt->wsr = 0x5555;
288 wdt->wsr = 0xAAAA;
289}
290
291int watchdog_disable(void)
292{
293 volatile wdog_t *wdt = (volatile wdog_t *)(MMAP_WDOG);
294
295 wdt->wsr = 0x5555; /* reset watchdog counter */
296 wdt->wsr = 0xAAAA;
297 wdt->wcr = 0; /* disable watchdog timer */
298
299 puts("WATCHDOG:disabled\n");
300 return (0);
301}
302
303int watchdog_init(void)
304{
305 volatile wdog_t *wdt = (volatile wdog_t *)(MMAP_WDOG);
306
307 wdt->wcr = 0; /* disable watchdog */
308
309 /* set timeout and enable watchdog */
310 wdt->wmr =
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200311 ((CONFIG_WATCHDOG_TIMEOUT * CONFIG_SYS_HZ) / (32768 * 1000)) - 1;
Matthew Fettkef71d9d92008-02-04 15:38:20 -0600312 wdt->wsr = 0x5555; /* reset watchdog counter */
313 wdt->wsr = 0xAAAA;
314
315 puts("WATCHDOG:enabled\n");
316 return (0);
317}
318#endif /* #ifdef CONFIG_WATCHDOG */
319
320#endif /* #ifdef CONFIG_M5275 */
321
wdenkbf9e3b32004-02-12 00:47:09 +0000322#ifdef CONFIG_M5282
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500323int checkcpu(void)
wdenkbf9e3b32004-02-12 00:47:09 +0000324{
Wolfgang Denk4176c792006-06-10 19:27:47 +0200325 unsigned char resetsource = MCFRESET_RSR;
Heiko Schocher9acb6262006-04-20 08:42:42 +0200326
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500327 printf("CPU: Freescale Coldfire MCF5282 (PIN: %2.2x REV: %2.2x)\n",
328 MCFCCM_CIR >> 8, MCFCCM_CIR & MCFCCM_CIR_PRN_MASK);
329 printf("Reset:%s%s%s%s%s%s%s\n",
330 (resetsource & MCFRESET_RSR_LOL) ? " Loss of Lock" : "",
331 (resetsource & MCFRESET_RSR_LOC) ? " Loss of Clock" : "",
332 (resetsource & MCFRESET_RSR_EXT) ? " External" : "",
333 (resetsource & MCFRESET_RSR_POR) ? " Power On" : "",
334 (resetsource & MCFRESET_RSR_WDR) ? " Watchdog" : "",
335 (resetsource & MCFRESET_RSR_SOFT) ? " Software" : "",
336 (resetsource & MCFRESET_RSR_LVD) ? " Low Voltage" : "");
wdenkbf9e3b32004-02-12 00:47:09 +0000337 return 0;
338}
339
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500340int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char *argv[])
Heiko Schocher9acb6262006-04-20 08:42:42 +0200341{
342 MCFRESET_RCR = MCFRESET_RCR_SOFTRST;
wdenkbf9e3b32004-02-12 00:47:09 +0000343 return 0;
344};
345#endif
stroese8c725b92004-12-16 18:09:49 +0000346
TsiChungLiewa1436a82007-08-16 13:20:50 -0500347#ifdef CONFIG_M5249
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500348int checkcpu(void)
stroese8c725b92004-12-16 18:09:49 +0000349{
350 char buf[32];
351
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500352 printf("CPU: Freescale Coldfire MCF5249 at %s MHz\n",
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200353 strmhz(buf, CONFIG_SYS_CLK));
stroese8c725b92004-12-16 18:09:49 +0000354 return 0;
355}
356
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500357int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char *argv[])
358{
stroese8c725b92004-12-16 18:09:49 +0000359 /* enable watchdog, set timeout to 0 and wait */
360 mbar_writeByte(MCFSIM_SYPCR, 0xc0);
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500361 while (1) ;
stroese8c725b92004-12-16 18:09:49 +0000362
363 /* we don't return! */
364 return 0;
365};
366#endif
TsiChungLiewa1436a82007-08-16 13:20:50 -0500367
368#ifdef CONFIG_M5253
369int checkcpu(void)
370{
371 char buf[32];
372
373 unsigned char resetsource = mbar_readLong(SIM_RSR);
374 printf("CPU: Freescale Coldfire MCF5253 at %s MHz\n",
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200375 strmhz(buf, CONFIG_SYS_CLK));
TsiChungLiewa1436a82007-08-16 13:20:50 -0500376
377 if ((resetsource & SIM_RSR_HRST) || (resetsource & SIM_RSR_SWTR)) {
378 printf("Reset:%s%s\n",
379 (resetsource & SIM_RSR_HRST) ? " Hardware/ System Reset"
380 : "",
381 (resetsource & SIM_RSR_SWTR) ? " Software Watchdog" :
382 "");
383 }
384 return 0;
385}
386
387int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char *argv[])
388{
389 /* enable watchdog, set timeout to 0 and wait */
390 mbar_writeByte(SIM_SYPCR, 0xc0);
391 while (1) ;
392
393 /* we don't return! */
394 return 0;
395};
396#endif
Ben Warren86882b82008-08-26 22:16:25 -0700397
398#if defined(CONFIG_MCFFEC)
399/* Default initializations for MCFFEC controllers. To override,
400 * create a board-specific function called:
401 * int board_eth_init(bd_t *bis)
402 */
403
Ben Warren86882b82008-08-26 22:16:25 -0700404int cpu_eth_init(bd_t *bis)
405{
406 return mcffec_initialize(bis);
407}
408#endif