]> git.sur5r.net Git - u-boot/blob - cpu/mpc83xx/cpu.c
Merge with rsync://git-user@source.denx.net/git/u-boot.git
[u-boot] / cpu / mpc83xx / cpu.c
1 /*
2  * Copyright 2004 Freescale Semiconductor, Inc.
3  *
4  * See file CREDITS for list of people who contributed to this
5  * project.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License as
9  * published by the Free Software Foundation; either version 2 of
10  * the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
20  * MA 02111-1307 USA
21  *
22  * Change log:
23  *
24  * 20050101: Eran Liberty (liberty@freescale.com)
25  *           Initial file creating (porting from 85XX & 8260)
26  */
27
28 /*
29  * CPU specific code for the MPC83xx family.
30  *
31  * Derived from the MPC8260 and MPC85xx.
32  */
33
34 #include <common.h>
35 #include <watchdog.h>
36 #include <command.h>
37 #include <mpc83xx.h>
38 #include <asm/processor.h>
39
40
41 int checkcpu(void)
42 {
43         DECLARE_GLOBAL_DATA_PTR;
44         ulong clock = gd->cpu_clk;
45         u32 pvr = get_pvr();
46         char buf[32];
47
48         if ((pvr & 0xFFFF0000) != PVR_83xx) {
49                 puts("Not MPC83xx Family!!!\n");
50                 return -1;
51         }
52
53         puts("CPU: MPC83xx, ");
54         switch(pvr) {
55         case PVR_8349_REV10:
56                 break;
57         case PVR_8349_REV11:
58                 break;
59         default:
60                 puts("Rev: Unknown\n");
61                 return -1;      /* Not sure what this is */
62         }
63         printf("Rev: %02x at %s MHz\n",pvr & 0x0000FFFF, strmhz(buf, clock));
64         return 0;
65 }
66
67
68 void upmconfig (uint upm, uint *table, uint size)
69 {
70         hang();         /* FIXME: upconfig() needed? */
71 }
72
73
74 int
75 do_reset (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
76 {
77         ulong msr, addr;
78
79         volatile immap_t *immap = (immap_t *) CFG_IMMRBAR;
80
81 #ifdef MPC83xx_RESET
82         /* Interrupts and MMU off */
83         __asm__ __volatile__ ("mfmsr    %0":"=r" (msr):);
84
85         msr &= ~( MSR_EE | MSR_IR | MSR_DR);
86         __asm__ __volatile__ ("mtmsr    %0"::"r" (msr));
87
88         /* enable Reset Control Reg */
89         immap->reset.rpr = 0x52535445;
90
91         /* confirm Reset Control Reg is enabled */
92         while(!((immap->reset.rcer) & RCER_CRE));
93
94         printf("Resetting the board.");
95         printf("\n");
96
97         udelay(200);
98
99         /* perform reset, only one bit */
100        immap->reset.rcr = RCR_SWHR;
101 #else
102        immap->reset.rmr = RMR_CSRE;    /* Checkstop Reset enable */
103
104        /* Interrupts and MMU off */
105        __asm__ __volatile__ ("mfmsr    %0":"=r" (msr):);
106
107         msr &= ~(MSR_ME | MSR_EE | MSR_IR | MSR_DR);
108         __asm__ __volatile__ ("mtmsr    %0"::"r" (msr));
109
110         /*
111          * Trying to execute the next instruction at a non-existing address
112          * should cause a machine check, resulting in reset
113          */
114         addr = CFG_RESET_ADDRESS;
115
116         printf("resetting the board.");
117         printf("\n");
118         ((void (*)(void)) addr) ();
119 #endif
120         return 1;
121 }
122
123
124 /*
125  * Get timebase clock frequency (like cpu_clk in Hz)
126  */
127
128 unsigned long get_tbclk(void)
129 {
130         DECLARE_GLOBAL_DATA_PTR;
131
132         ulong tbclk;
133
134         tbclk = (gd->bus_clk + 3L) / 4L;
135
136         return tbclk;
137 }
138
139
140 #if defined(CONFIG_WATCHDOG)
141 void watchdog_reset (void)
142 {
143         hang();         /* FIXME: implement watchdog_reset()? */
144 }
145 #endif /* CONFIG_WATCHDOG */