blob: 32c477a5fd4d057603c1b34b83411e4dacbea73b [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
TsiChung Liewf6afe722007-06-18 13:50:13 -05002/*
3 *
4 * (C) Copyright 2000-2003
5 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
6 *
Alison Wang35d23df2012-03-26 21:49:05 +00007 * Copyright (C) 2004-2008, 2012 Freescale Semiconductor, Inc.
TsiChung Liewf6afe722007-06-18 13:50:13 -05008 * TsiChung Liew (Tsi-Chung.Liew@freescale.com)
TsiChung Liewf6afe722007-06-18 13:50:13 -05009 */
10
11#include <common.h>
Simon Glass274e0b02020-05-10 11:39:56 -060012#include <net.h>
Simon Glassf5c208d2019-11-14 12:57:20 -070013#include <vsprintf.h>
TsiChung Liewf6afe722007-06-18 13:50:13 -050014#include <watchdog.h>
15#include <command.h>
Ben Warren2f2b6b62008-08-31 22:22:04 -070016#include <netdev.h>
TsiChung Liewf6afe722007-06-18 13:50:13 -050017
TsiChungLiewfb661742007-07-05 23:01:22 -050018#include <asm/immap.h>
Alison Wang35d23df2012-03-26 21:49:05 +000019#include <asm/io.h>
TsiChung Liewf6afe722007-06-18 13:50:13 -050020
Wolfgang Denkd112a2c2007-09-15 20:48:41 +020021DECLARE_GLOBAL_DATA_PTR;
22
Mike Frysinger6d1f6982010-10-20 03:41:17 -040023int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
TsiChung Liewf6afe722007-06-18 13:50:13 -050024{
Alison Wang35d23df2012-03-26 21:49:05 +000025 rcm_t *rcm = (rcm_t *) (MMAP_RCM);
TsiChung Liewf6afe722007-06-18 13:50:13 -050026
TsiChung Liewf6afe722007-06-18 13:50:13 -050027 udelay(1000);
Alison Wang35d23df2012-03-26 21:49:05 +000028 setbits_8(&rcm->rcr, RCM_RCR_SOFTRST);
TsiChung Liewf6afe722007-06-18 13:50:13 -050029
30 /* we don't return! */
31 return 0;
32};
33
Angelo Dureghello3146b4d2017-08-20 00:01:55 +020034#if defined(CONFIG_DISPLAY_CPUINFO)
35int print_cpuinfo(void)
TsiChung Liewf6afe722007-06-18 13:50:13 -050036{
Alison Wang35d23df2012-03-26 21:49:05 +000037 ccm_t *ccm = (ccm_t *) MMAP_CCM;
TsiChung Liewf6afe722007-06-18 13:50:13 -050038 u16 msk;
39 u16 id = 0;
40 u8 ver;
41
42 puts("CPU: ");
Alison Wang35d23df2012-03-26 21:49:05 +000043 msk = (in_be16(&ccm->cir) >> 6);
44 ver = (in_be16(&ccm->cir) & 0x003f);
TsiChung Liewf6afe722007-06-18 13:50:13 -050045 switch (msk) {
TsiChung Liewe7e4fc82008-10-22 11:38:21 +000046#ifdef CONFIG_MCF5301x
47 case 0x78:
48 id = 53010;
49 break;
50 case 0x77:
51 id = 53012;
52 break;
53 case 0x76:
54 id = 53015;
55 break;
56 case 0x74:
57 id = 53011;
58 break;
59 case 0x73:
60 id = 53013;
61 break;
62#endif
63#ifdef CONFIG_MCF532x
TsiChung Liewf6afe722007-06-18 13:50:13 -050064 case 0x54:
65 id = 5329;
66 break;
67 case 0x59:
68 id = 5328;
69 break;
70 case 0x61:
71 id = 5327;
72 break;
TsiChungLiew6f8a0a32008-01-14 17:23:08 -060073 case 0x65:
74 id = 5373;
75 break;
76 case 0x68:
77 id = 53721;
78 break;
79 case 0x69:
80 id = 5372;
81 break;
82 case 0x6B:
83 id = 5372;
84 break;
TsiChung Liewe7e4fc82008-10-22 11:38:21 +000085#endif
TsiChung Liewf6afe722007-06-18 13:50:13 -050086 }
87
88 if (id) {
Wolfgang Denk20591042008-10-19 02:35:49 +020089 char buf1[32], buf2[32];
90
TsiChung Liewf6afe722007-06-18 13:50:13 -050091 printf("Freescale MCF%d (Mask:%01x Version:%x)\n", id, msk,
92 ver);
Wolfgang Denk20591042008-10-19 02:35:49 +020093 printf(" CPU CLK %s MHz BUS CLK %s MHz\n",
TsiChung Liew10e9a6e2008-10-22 11:55:30 +000094 strmhz(buf1, gd->cpu_clk),
95 strmhz(buf2, gd->bus_clk));
TsiChung Liewf6afe722007-06-18 13:50:13 -050096 }
97
98 return 0;
99};
Angelo Dureghello3146b4d2017-08-20 00:01:55 +0200100#endif /* CONFIG_DISPLAY_CPUINFO */
TsiChung Liewf6afe722007-06-18 13:50:13 -0500101
102#if defined(CONFIG_WATCHDOG)
103/* Called by macro WATCHDOG_RESET */
104void watchdog_reset(void)
105{
Alison Wang35d23df2012-03-26 21:49:05 +0000106 wdog_t *wdp = (wdog_t *) (MMAP_WDOG);
TsiChung Liewf6afe722007-06-18 13:50:13 -0500107
Alison Wang35d23df2012-03-26 21:49:05 +0000108 /* Count register */
109 out_be16(&wdp->sr, 0x5555);
110 out_be16(&wdp->sr, 0xaaaa);
TsiChung Liewf6afe722007-06-18 13:50:13 -0500111}
112
113int watchdog_disable(void)
114{
Alison Wang35d23df2012-03-26 21:49:05 +0000115 wdog_t *wdp = (wdog_t *) (MMAP_WDOG);
TsiChung Liewf6afe722007-06-18 13:50:13 -0500116
117 /* UserManual, once the wdog is disabled, wdog cannot be re-enabled */
Alison Wang35d23df2012-03-26 21:49:05 +0000118 /* halted watchdog timer */
119 setbits_be16(&wdp->cr, WTM_WCR_HALTED);
TsiChung Liewf6afe722007-06-18 13:50:13 -0500120
121 puts("WATCHDOG:disabled\n");
122 return (0);
123}
124
125int watchdog_init(void)
126{
Alison Wang35d23df2012-03-26 21:49:05 +0000127 wdog_t *wdp = (wdog_t *) (MMAP_WDOG);
TsiChung Liewf6afe722007-06-18 13:50:13 -0500128 u32 wdog_module = 0;
129
130 /* set timeout and enable watchdog */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200131 wdog_module = ((CONFIG_SYS_CLK / 1000) * CONFIG_WATCHDOG_TIMEOUT);
TsiChungLiew6f8a0a32008-01-14 17:23:08 -0600132#ifdef CONFIG_M5329
Alison Wang35d23df2012-03-26 21:49:05 +0000133 out_be16(&wdp->mr, wdog_module / 8192);
TsiChungLiew6f8a0a32008-01-14 17:23:08 -0600134#else
Alison Wang35d23df2012-03-26 21:49:05 +0000135 out_be16(&wdp->mr, wdog_module / 4096);
TsiChungLiew6f8a0a32008-01-14 17:23:08 -0600136#endif
TsiChung Liewf6afe722007-06-18 13:50:13 -0500137
Alison Wang35d23df2012-03-26 21:49:05 +0000138 out_be16(&wdp->cr, WTM_WCR_EN);
TsiChung Liewf6afe722007-06-18 13:50:13 -0500139 puts("WATCHDOG:enabled\n");
140
141 return (0);
142}
TsiChungLiewfb661742007-07-05 23:01:22 -0500143#endif /* CONFIG_WATCHDOG */
Ben Warren90c96db2008-08-26 22:16:25 -0700144
145#if defined(CONFIG_MCFFEC)
146/* Default initializations for MCFFEC controllers. To override,
147 * create a board-specific function called:
148 * int board_eth_init(bd_t *bis)
149 */
Ben Warren90c96db2008-08-26 22:16:25 -0700150int cpu_eth_init(bd_t *bis)
151{
152 return mcffec_initialize(bis);
153}
154#endif