blob: 571d078f896b1f5240403ffe465af462ae91e5e7 [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
Mike Frysinger882b7d72010-10-20 03:41:17 -040041int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
TsiChung Liewbf9a5212009-06-12 11:29:00 +000042{
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
John Rigby29565322010-12-20 18:27:51 -070077 wdt->sr = 0x5555; /* reset watchdog counter */
TsiChung Liewbf9a5212009-06-12 11:29:00 +000078 wdt->sr = 0xAAAA;
79 wdt->cr = 0; /* disable watchdog timer */
80
81 puts("WATCHDOG:disabled\n");
82 return (0);
83}
84
85int watchdog_init(void)
86{
87 volatile wdog_t *wdt = (volatile wdog_t *)(MMAP_WDOG);
88
89 wdt->cr = 0; /* disable watchdog */
90
91 /* set timeout and enable watchdog */
92 wdt->mr =
93 ((CONFIG_WATCHDOG_TIMEOUT * CONFIG_SYS_HZ) / (32768 * 1000)) - 1;
94 wdt->sr = 0x5555; /* reset watchdog counter */
95 wdt->sr = 0xAAAA;
96
97 puts("WATCHDOG:enabled\n");
98 return (0);
99}
100#endif /* #ifdef CONFIG_WATCHDOG */
101#endif /* #ifdef CONFIG_M5208 */
102
Zachary P. Landaueacbd312006-01-26 17:35:56 -0500103#ifdef CONFIG_M5271
Bartlomiej Sieka363d1d82007-01-23 13:25:22 +0100104/*
105 * Both MCF5270 and MCF5271 are members of the MPC5271 family. Try to
106 * determine which one we are running on, based on the Chip Identification
107 * Register (CIR).
108 */
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500109int checkcpu(void)
Zachary P. Landaueacbd312006-01-26 17:35:56 -0500110{
Marian Balakowiczb75ef852006-05-09 11:45:31 +0200111 char buf[32];
Bartlomiej Sieka363d1d82007-01-23 13:25:22 +0100112 unsigned short cir; /* Chip Identification Register */
113 unsigned short pin; /* Part identification number */
114 unsigned char prn; /* Part revision number */
115 char *cpu_model;
Marian Balakowiczb75ef852006-05-09 11:45:31 +0200116
Bartlomiej Sieka363d1d82007-01-23 13:25:22 +0100117 cir = mbar_readShort(MCF_CCM_CIR);
118 pin = cir >> MCF_CCM_CIR_PIN_LEN;
119 prn = cir & MCF_CCM_CIR_PRN_MASK;
120
121 switch (pin) {
122 case MCF_CCM_CIR_PIN_MCF5270:
123 cpu_model = "5270";
124 break;
125 case MCF_CCM_CIR_PIN_MCF5271:
126 cpu_model = "5271";
127 break;
128 default:
129 cpu_model = NULL;
130 break;
131 }
132
133 if (cpu_model)
134 printf("CPU: Freescale ColdFire MCF%s rev. %hu, at %s MHz\n",
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200135 cpu_model, prn, strmhz(buf, CONFIG_SYS_CLK));
Bartlomiej Sieka363d1d82007-01-23 13:25:22 +0100136 else
137 printf("CPU: Unknown - Freescale ColdFire MCF5271 family"
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500138 " (PIN: 0x%x) rev. %hu, at %s MHz\n",
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200139 pin, prn, strmhz(buf, CONFIG_SYS_CLK));
Bartlomiej Sieka363d1d82007-01-23 13:25:22 +0100140
Zachary P. Landaueacbd312006-01-26 17:35:56 -0500141 return 0;
142}
143
Mike Frysinger882b7d72010-10-20 03:41:17 -0400144int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500145{
Richard Retanubunbb907ab2009-10-26 14:19:17 -0400146 /* Call the board specific reset actions first. */
147 if(board_reset) {
148 board_reset();
149 }
150
Zachary P. Landaueacbd312006-01-26 17:35:56 -0500151 mbar_writeByte(MCF_RCM_RCR,
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500152 MCF_RCM_RCR_SOFTRST | MCF_RCM_RCR_FRCRSTOUT);
Zachary P. Landaueacbd312006-01-26 17:35:56 -0500153 return 0;
154};
155
156#if defined(CONFIG_WATCHDOG)
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500157void watchdog_reset(void)
Zachary P. Landaueacbd312006-01-26 17:35:56 -0500158{
159 mbar_writeShort(MCF_WTM_WSR, 0x5555);
160 mbar_writeShort(MCF_WTM_WSR, 0xAAAA);
161}
162
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500163int watchdog_disable(void)
Zachary P. Landaueacbd312006-01-26 17:35:56 -0500164{
165 mbar_writeShort(MCF_WTM_WCR, 0);
166 return (0);
167}
168
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500169int watchdog_init(void)
Zachary P. Landaueacbd312006-01-26 17:35:56 -0500170{
Zachary P. Landaueacbd312006-01-26 17:35:56 -0500171 mbar_writeShort(MCF_WTM_WCR, MCF_WTM_WCR_EN);
172 return (0);
173}
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500174#endif /* #ifdef CONFIG_WATCHDOG */
Zachary P. Landaueacbd312006-01-26 17:35:56 -0500175
176#endif
wdenkbf9e3b32004-02-12 00:47:09 +0000177
178#ifdef CONFIG_M5272
Mike Frysinger882b7d72010-10-20 03:41:17 -0400179int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500180{
181 volatile wdog_t *wdp = (wdog_t *) (MMAP_WDOG);
wdenkbf9e3b32004-02-12 00:47:09 +0000182
183 wdp->wdog_wrrr = 0;
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500184 udelay(1000);
wdenkbf9e3b32004-02-12 00:47:09 +0000185
186 /* enable watchdog, set timeout to 0 and wait */
187 wdp->wdog_wrrr = 1;
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500188 while (1) ;
wdenkbf9e3b32004-02-12 00:47:09 +0000189
190 /* we don't return! */
191 return 0;
192};
193
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500194int checkcpu(void)
195{
196 volatile sysctrl_t *sysctrl = (sysctrl_t *) (MMAP_CFG);
wdenkbf9e3b32004-02-12 00:47:09 +0000197 uchar msk;
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500198 char *suf;
wdenkbf9e3b32004-02-12 00:47:09 +0000199
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500200 puts("CPU: ");
201 msk = (sysctrl->sc_dir > 28) & 0xf;
wdenkbf9e3b32004-02-12 00:47:09 +0000202 switch (msk) {
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500203 case 0x2:
204 suf = "1K75N";
205 break;
206 case 0x4:
207 suf = "3K75N";
208 break;
209 default:
210 suf = NULL;
211 printf("Freescale MCF5272 (Mask:%01x)\n", msk);
212 break;
213 }
wdenkbf9e3b32004-02-12 00:47:09 +0000214
215 if (suf)
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500216 printf("Freescale MCF5272 %s\n", suf);
wdenkbf9e3b32004-02-12 00:47:09 +0000217 return 0;
218};
219
wdenkbf9e3b32004-02-12 00:47:09 +0000220#if defined(CONFIG_WATCHDOG)
221/* Called by macro WATCHDOG_RESET */
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500222void watchdog_reset(void)
wdenkbf9e3b32004-02-12 00:47:09 +0000223{
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500224 volatile wdog_t *wdt = (volatile wdog_t *)(MMAP_WDOG);
225 wdt->wdog_wcr = 0;
wdenkbf9e3b32004-02-12 00:47:09 +0000226}
227
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500228int watchdog_disable(void)
wdenkbf9e3b32004-02-12 00:47:09 +0000229{
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500230 volatile wdog_t *wdt = (volatile wdog_t *)(MMAP_WDOG);
wdenkbf9e3b32004-02-12 00:47:09 +0000231
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500232 wdt->wdog_wcr = 0; /* reset watchdog counter */
233 wdt->wdog_wirr = 0; /* disable watchdog interrupt */
234 wdt->wdog_wrrr = 0; /* disable watchdog timer */
wdenkbf9e3b32004-02-12 00:47:09 +0000235
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500236 puts("WATCHDOG:disabled\n");
wdenkbf9e3b32004-02-12 00:47:09 +0000237 return (0);
238}
239
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500240int watchdog_init(void)
wdenkbf9e3b32004-02-12 00:47:09 +0000241{
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500242 volatile wdog_t *wdt = (volatile wdog_t *)(MMAP_WDOG);
wdenkbf9e3b32004-02-12 00:47:09 +0000243
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500244 wdt->wdog_wirr = 0; /* disable watchdog interrupt */
wdenkbf9e3b32004-02-12 00:47:09 +0000245
246 /* set timeout and enable watchdog */
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500247 wdt->wdog_wrrr =
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200248 ((CONFIG_WATCHDOG_TIMEOUT * CONFIG_SYS_HZ) / (32768 * 1000)) - 1;
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500249 wdt->wdog_wcr = 0; /* reset watchdog counter */
wdenkbf9e3b32004-02-12 00:47:09 +0000250
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500251 puts("WATCHDOG:enabled\n");
wdenkbf9e3b32004-02-12 00:47:09 +0000252 return (0);
253}
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500254#endif /* #ifdef CONFIG_WATCHDOG */
wdenkbf9e3b32004-02-12 00:47:09 +0000255
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500256#endif /* #ifdef CONFIG_M5272 */
wdenkbf9e3b32004-02-12 00:47:09 +0000257
Matthew Fettkef71d9d92008-02-04 15:38:20 -0600258#ifdef CONFIG_M5275
Mike Frysinger882b7d72010-10-20 03:41:17 -0400259int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
Matthew Fettkef71d9d92008-02-04 15:38:20 -0600260{
261 volatile rcm_t *rcm = (rcm_t *)(MMAP_RCM);
262
263 udelay(1000);
264
265 rcm->rcr = RCM_RCR_SOFTRST;
266
267 /* we don't return! */
268 return 0;
269};
270
271int checkcpu(void)
272{
273 char buf[32];
274
275 printf("CPU: Freescale Coldfire MCF5275 at %s MHz\n",
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200276 strmhz(buf, CONFIG_SYS_CLK));
Matthew Fettkef71d9d92008-02-04 15:38:20 -0600277 return 0;
278};
279
280
281#if defined(CONFIG_WATCHDOG)
282/* Called by macro WATCHDOG_RESET */
283void watchdog_reset(void)
284{
285 volatile wdog_t *wdt = (volatile wdog_t *)(MMAP_WDOG);
286 wdt->wsr = 0x5555;
287 wdt->wsr = 0xAAAA;
288}
289
290int watchdog_disable(void)
291{
292 volatile wdog_t *wdt = (volatile wdog_t *)(MMAP_WDOG);
293
294 wdt->wsr = 0x5555; /* reset watchdog counter */
295 wdt->wsr = 0xAAAA;
296 wdt->wcr = 0; /* disable watchdog timer */
297
298 puts("WATCHDOG:disabled\n");
299 return (0);
300}
301
302int watchdog_init(void)
303{
304 volatile wdog_t *wdt = (volatile wdog_t *)(MMAP_WDOG);
305
306 wdt->wcr = 0; /* disable watchdog */
307
308 /* set timeout and enable watchdog */
309 wdt->wmr =
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200310 ((CONFIG_WATCHDOG_TIMEOUT * CONFIG_SYS_HZ) / (32768 * 1000)) - 1;
Matthew Fettkef71d9d92008-02-04 15:38:20 -0600311 wdt->wsr = 0x5555; /* reset watchdog counter */
312 wdt->wsr = 0xAAAA;
313
314 puts("WATCHDOG:enabled\n");
315 return (0);
316}
317#endif /* #ifdef CONFIG_WATCHDOG */
318
319#endif /* #ifdef CONFIG_M5275 */
320
wdenkbf9e3b32004-02-12 00:47:09 +0000321#ifdef CONFIG_M5282
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500322int checkcpu(void)
wdenkbf9e3b32004-02-12 00:47:09 +0000323{
Wolfgang Denk4176c792006-06-10 19:27:47 +0200324 unsigned char resetsource = MCFRESET_RSR;
Heiko Schocher9acb6262006-04-20 08:42:42 +0200325
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500326 printf("CPU: Freescale Coldfire MCF5282 (PIN: %2.2x REV: %2.2x)\n",
327 MCFCCM_CIR >> 8, MCFCCM_CIR & MCFCCM_CIR_PRN_MASK);
328 printf("Reset:%s%s%s%s%s%s%s\n",
329 (resetsource & MCFRESET_RSR_LOL) ? " Loss of Lock" : "",
330 (resetsource & MCFRESET_RSR_LOC) ? " Loss of Clock" : "",
331 (resetsource & MCFRESET_RSR_EXT) ? " External" : "",
332 (resetsource & MCFRESET_RSR_POR) ? " Power On" : "",
333 (resetsource & MCFRESET_RSR_WDR) ? " Watchdog" : "",
334 (resetsource & MCFRESET_RSR_SOFT) ? " Software" : "",
335 (resetsource & MCFRESET_RSR_LVD) ? " Low Voltage" : "");
wdenkbf9e3b32004-02-12 00:47:09 +0000336 return 0;
337}
338
Mike Frysinger882b7d72010-10-20 03:41:17 -0400339int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
Heiko Schocher9acb6262006-04-20 08:42:42 +0200340{
341 MCFRESET_RCR = MCFRESET_RCR_SOFTRST;
wdenkbf9e3b32004-02-12 00:47:09 +0000342 return 0;
343};
344#endif
stroese8c725b92004-12-16 18:09:49 +0000345
TsiChungLiewa1436a82007-08-16 13:20:50 -0500346#ifdef CONFIG_M5249
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500347int checkcpu(void)
stroese8c725b92004-12-16 18:09:49 +0000348{
349 char buf[32];
350
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500351 printf("CPU: Freescale Coldfire MCF5249 at %s MHz\n",
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200352 strmhz(buf, CONFIG_SYS_CLK));
stroese8c725b92004-12-16 18:09:49 +0000353 return 0;
354}
355
Mike Frysinger882b7d72010-10-20 03:41:17 -0400356int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500357{
stroese8c725b92004-12-16 18:09:49 +0000358 /* enable watchdog, set timeout to 0 and wait */
359 mbar_writeByte(MCFSIM_SYPCR, 0xc0);
TsiChungLiew83ec20b2007-08-15 19:21:21 -0500360 while (1) ;
stroese8c725b92004-12-16 18:09:49 +0000361
362 /* we don't return! */
363 return 0;
364};
365#endif
TsiChungLiewa1436a82007-08-16 13:20:50 -0500366
367#ifdef CONFIG_M5253
368int checkcpu(void)
369{
370 char buf[32];
371
372 unsigned char resetsource = mbar_readLong(SIM_RSR);
373 printf("CPU: Freescale Coldfire MCF5253 at %s MHz\n",
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200374 strmhz(buf, CONFIG_SYS_CLK));
TsiChungLiewa1436a82007-08-16 13:20:50 -0500375
376 if ((resetsource & SIM_RSR_HRST) || (resetsource & SIM_RSR_SWTR)) {
377 printf("Reset:%s%s\n",
378 (resetsource & SIM_RSR_HRST) ? " Hardware/ System Reset"
379 : "",
380 (resetsource & SIM_RSR_SWTR) ? " Software Watchdog" :
381 "");
382 }
383 return 0;
384}
385
Mike Frysinger882b7d72010-10-20 03:41:17 -0400386int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
TsiChungLiewa1436a82007-08-16 13:20:50 -0500387{
388 /* enable watchdog, set timeout to 0 and wait */
389 mbar_writeByte(SIM_SYPCR, 0xc0);
390 while (1) ;
391
392 /* we don't return! */
393 return 0;
394};
395#endif
Ben Warren86882b82008-08-26 22:16:25 -0700396
397#if defined(CONFIG_MCFFEC)
398/* Default initializations for MCFFEC controllers. To override,
399 * create a board-specific function called:
400 * int board_eth_init(bd_t *bis)
401 */
402
Ben Warren86882b82008-08-26 22:16:25 -0700403int cpu_eth_init(bd_t *bis)
404{
405 return mcffec_initialize(bis);
406}
407#endif