]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - cpu/s3c44b0/cpu.c
s3c44b0: move i2c driver to drivers/i2c
[karo-tx-uboot.git] / cpu / s3c44b0 / cpu.c
1 /*
2  * (C) Copyright 2004
3  * DAVE Srl
4  * http://www.dave-tech.it
5  * http://www.wawnet.biz
6  * mailto:info@wawnet.biz
7  *
8  * See file CREDITS for list of people who contributed to this
9  * project.
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License as
13  * published by the Free Software Foundation; either version 2 of
14  * the License, or (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
24  * MA 02111-1307 USA
25  */
26
27 /*
28  * S3C44B0 CPU specific code
29  */
30
31 #include <common.h>
32 #include <command.h>
33 #include <asm/hardware.h>
34
35 static void s3c44b0_flush_cache(void)
36 {
37         volatile int i;
38         /* flush cycle */
39         for(i=0x10002000;i<0x10004800;i+=16)
40         {
41                 *((int *)i)=0x0;
42         }
43 }
44
45
46 int cpu_init (void)
47 {
48         icache_enable();
49
50         return 0;
51 }
52
53 int cleanup_before_linux (void)
54 {
55         /*
56                 cache memory should be enabled before calling
57                 Linux to make the kernel uncompression faster
58         */
59         icache_enable();
60
61         disable_interrupts ();
62
63         return 0;
64 }
65
66 void reset_cpu (ulong addr)
67 {
68         /*
69                 reset the cpu using watchdog
70         */
71
72         /* Disable the watchdog.*/
73         WTCON&=~(1<<5);
74
75         /* set the timeout value to a short time... */
76         WTCNT = 0x1;
77
78         /* Enable the watchdog. */
79         WTCON|=1;
80         WTCON|=(1<<5);
81
82         while(1) {
83                 /*NOP*/
84         }
85 }
86
87 int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
88 {
89         disable_interrupts ();
90         reset_cpu (0);
91
92         /*NOTREACHED*/
93         return (0);
94 }
95
96 void icache_enable (void)
97 {
98         ulong reg;
99
100         s3c44b0_flush_cache();
101
102         /*
103                 Init cache
104                 Non-cacheable area (everything outside RAM)
105                 0x0000:0000 - 0x0C00:0000
106          */
107         NCACHBE0 = 0xC0000000;
108         NCACHBE1 = 0x00000000;
109
110         /*
111                 Enable chache
112         */
113         reg = SYSCFG;
114         reg |= 0x00000006; /* 8kB */
115         SYSCFG = reg;
116 }
117
118 void icache_disable (void)
119 {
120         ulong reg;
121
122         reg = SYSCFG;
123         reg &= ~0x00000006; /* 8kB */
124         SYSCFG = reg;
125 }
126
127 int icache_status (void)
128 {
129         return 0;
130 }
131
132 void dcache_enable (void)
133 {
134         icache_enable();
135 }
136
137 void dcache_disable (void)
138 {
139         icache_disable();
140 }
141
142 int dcache_status (void)
143 {
144         return dcache_status();
145 }
146
147 /*
148         RTC stuff
149 */
150 #include <rtc.h>
151 #ifndef BCD2HEX
152         #define BCD2HEX(n)  ((n>>4)*10+(n&0x0f))
153 #endif
154 #ifndef HEX2BCD
155         #define HEX2BCD(x) ((((x) / 10) << 4) + (x) % 10)
156 #endif
157
158 int rtc_get (struct rtc_time* tm)
159 {
160         RTCCON |= 1;
161         tm->tm_year  = BCD2HEX(BCDYEAR);
162         tm->tm_mon   = BCD2HEX(BCDMON);
163         tm->tm_wday   = BCD2HEX(BCDDATE);
164         tm->tm_mday   = BCD2HEX(BCDDAY);
165         tm->tm_hour  = BCD2HEX(BCDHOUR);
166         tm->tm_min  = BCD2HEX(BCDMIN);
167         tm->tm_sec  = BCD2HEX(BCDSEC);
168
169         if (tm->tm_sec==0) {
170                 /* we have to re-read the rtc data because of the "one second deviation" problem */
171                 /* see RTC datasheet for more info about it */
172                 tm->tm_year  = BCD2HEX(BCDYEAR);
173                 tm->tm_mon   = BCD2HEX(BCDMON);
174                 tm->tm_mday   = BCD2HEX(BCDDAY);
175                 tm->tm_wday   = BCD2HEX(BCDDATE);
176                 tm->tm_hour  = BCD2HEX(BCDHOUR);
177                 tm->tm_min  = BCD2HEX(BCDMIN);
178                 tm->tm_sec  = BCD2HEX(BCDSEC);
179         }
180
181         RTCCON &= ~1;
182
183         if(tm->tm_year >= 70)
184                 tm->tm_year += 1900;
185         else
186                 tm->tm_year += 2000;
187
188         return 0;
189 }
190
191 int rtc_set (struct rtc_time* tm)
192 {
193         if(tm->tm_year < 2000)
194                 tm->tm_year -= 1900;
195         else
196                 tm->tm_year -= 2000;
197
198         RTCCON |= 1;
199         BCDYEAR = HEX2BCD(tm->tm_year);
200         BCDMON = HEX2BCD(tm->tm_mon);
201         BCDDAY = HEX2BCD(tm->tm_mday);
202         BCDDATE = HEX2BCD(tm->tm_wday);
203         BCDHOUR = HEX2BCD(tm->tm_hour);
204         BCDMIN = HEX2BCD(tm->tm_min);
205         BCDSEC = HEX2BCD(tm->tm_sec);
206         RTCCON &= 1;
207
208         return 0;
209 }
210
211 void rtc_reset (void)
212 {
213         RTCCON |= 1;
214         BCDYEAR = 0;
215         BCDMON = 0;
216         BCDDAY = 0;
217         BCDDATE = 0;
218         BCDHOUR = 0;
219         BCDMIN = 0;
220         BCDSEC = 0;
221         RTCCON &= 1;
222 }