Blame view
arch/arm/plat-s3c24xx/cpu.c
5.28 KB
a21765a70 [ARM] 4157/2: S3C... |
1 |
/* linux/arch/arm/plat-s3c24xx/cpu.c |
1da177e4c Linux-2.6.12-rc2 |
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
* * Copyright (c) 2004-2005 Simtec Electronics * http://www.simtec.co.uk/products/SWLINUX/ * Ben Dooks <ben@simtec.co.uk> * * S3C24XX CPU Support * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include <linux/init.h> #include <linux/module.h> #include <linux/interrupt.h> #include <linux/ioport.h> |
b6d1f542e [ARM] 4049/1: S3C... |
29 |
#include <linux/serial_core.h> |
d052d1bef Create platform_d... |
30 |
#include <linux/platform_device.h> |
3c7d9c81e [ARM] 4987/1: S3C... |
31 |
#include <linux/delay.h> |
fced80c73 [ARM] Convert asm... |
32 |
#include <linux/io.h> |
1da177e4c Linux-2.6.12-rc2 |
33 |
|
a09e64fbc [ARM] Move includ... |
34 |
#include <mach/hardware.h> |
1da177e4c Linux-2.6.12-rc2 |
35 |
#include <asm/irq.h> |
3c7d9c81e [ARM] 4987/1: S3C... |
36 |
#include <asm/cacheflush.h> |
1da177e4c Linux-2.6.12-rc2 |
37 38 39 |
#include <asm/mach/arch.h> #include <asm/mach/map.h> |
a09e64fbc [ARM] Move includ... |
40 |
#include <mach/regs-gpio.h> |
a2b7ba9ca [ARM] S3C24XX: Mo... |
41 |
#include <plat/regs-serial.h> |
1da177e4c Linux-2.6.12-rc2 |
42 |
|
a2b7ba9ca [ARM] S3C24XX: Mo... |
43 44 |
#include <plat/cpu.h> #include <plat/devs.h> |
d5120ae72 [ARM] S3C24XX: Ad... |
45 |
#include <plat/clock.h> |
a2b7ba9ca [ARM] S3C24XX: Mo... |
46 |
#include <plat/s3c2410.h> |
d5120ae72 [ARM] S3C24XX: Ad... |
47 |
#include <plat/s3c2412.h> |
f1290a49c ARM: S3C2416: Add... |
48 |
#include <plat/s3c2416.h> |
58bac7b8d ARM: S3C24XX: Mov... |
49 |
#include <plat/s3c244x.h> |
a2b7ba9ca [ARM] S3C24XX: Mo... |
50 |
#include <plat/s3c2443.h> |
1da177e4c Linux-2.6.12-rc2 |
51 |
|
1da177e4c Linux-2.6.12-rc2 |
52 53 54 |
/* table of supported CPUs */ static const char name_s3c2410[] = "S3C2410"; |
68d9ab394 [ARM] 3635/1: S3C... |
55 |
static const char name_s3c2412[] = "S3C2412"; |
63b1f51b2 ARM: SAMSUNG: Upd... |
56 |
static const char name_s3c2416[] = "S3C2416/S3C2450"; |
1da177e4c Linux-2.6.12-rc2 |
57 |
static const char name_s3c2440[] = "S3C2440"; |
96ce2385d [ARM] 3559/1: S3C... |
58 |
static const char name_s3c2442[] = "S3C2442"; |
f5fb9b1a1 ARM: S3C24XX: Int... |
59 |
static const char name_s3c2442b[] = "S3C2442B"; |
e4d06e395 [ARM] 4198/2: S3C... |
60 |
static const char name_s3c2443[] = "S3C2443"; |
1da177e4c Linux-2.6.12-rc2 |
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
static const char name_s3c2410a[] = "S3C2410A"; static const char name_s3c2440a[] = "S3C2440A"; static struct cpu_table cpu_ids[] __initdata = { { .idcode = 0x32410000, .idmask = 0xffffffff, .map_io = s3c2410_map_io, .init_clocks = s3c2410_init_clocks, .init_uarts = s3c2410_init_uarts, .init = s3c2410_init, .name = name_s3c2410 }, { .idcode = 0x32410002, .idmask = 0xffffffff, .map_io = s3c2410_map_io, .init_clocks = s3c2410_init_clocks, .init_uarts = s3c2410_init_uarts, |
f0176794b ARM: S3C2410: Add... |
80 |
.init = s3c2410a_init, |
1da177e4c Linux-2.6.12-rc2 |
81 82 83 84 85 |
.name = name_s3c2410a }, { .idcode = 0x32440000, .idmask = 0xffffffff, |
812c4e40c ARM: S3C24XX: Fix... |
86 |
.map_io = s3c2440_map_io, |
96ce2385d [ARM] 3559/1: S3C... |
87 88 |
.init_clocks = s3c244x_init_clocks, .init_uarts = s3c244x_init_uarts, |
1da177e4c Linux-2.6.12-rc2 |
89 90 91 92 93 94 |
.init = s3c2440_init, .name = name_s3c2440 }, { .idcode = 0x32440001, .idmask = 0xffffffff, |
812c4e40c ARM: S3C24XX: Fix... |
95 |
.map_io = s3c2440_map_io, |
96ce2385d [ARM] 3559/1: S3C... |
96 97 |
.init_clocks = s3c244x_init_clocks, .init_uarts = s3c244x_init_uarts, |
1da177e4c Linux-2.6.12-rc2 |
98 99 |
.init = s3c2440_init, .name = name_s3c2440a |
83f755f5a [ARM] 3286/2: S3C... |
100 101 |
}, { |
96ce2385d [ARM] 3559/1: S3C... |
102 103 |
.idcode = 0x32440aaa, .idmask = 0xffffffff, |
812c4e40c ARM: S3C24XX: Fix... |
104 |
.map_io = s3c2442_map_io, |
96ce2385d [ARM] 3559/1: S3C... |
105 106 107 108 109 110 |
.init_clocks = s3c244x_init_clocks, .init_uarts = s3c244x_init_uarts, .init = s3c2442_init, .name = name_s3c2442 }, { |
f5fb9b1a1 ARM: S3C24XX: Int... |
111 112 |
.idcode = 0x32440aab, .idmask = 0xffffffff, |
812c4e40c ARM: S3C24XX: Fix... |
113 |
.map_io = s3c2442_map_io, |
f5fb9b1a1 ARM: S3C24XX: Int... |
114 115 116 117 118 119 |
.init_clocks = s3c244x_init_clocks, .init_uarts = s3c244x_init_uarts, .init = s3c2442_init, .name = name_s3c2442b }, { |
68d9ab394 [ARM] 3635/1: S3C... |
120 121 122 123 124 125 126 127 |
.idcode = 0x32412001, .idmask = 0xffffffff, .map_io = s3c2412_map_io, .init_clocks = s3c2412_init_clocks, .init_uarts = s3c2412_init_uarts, .init = s3c2412_init, .name = name_s3c2412, }, |
d9bc55faf [ARM] 3841/1: S3C... |
128 129 130 131 132 133 134 135 136 |
{ /* a newer version of the s3c2412 */ .idcode = 0x32412003, .idmask = 0xffffffff, .map_io = s3c2412_map_io, .init_clocks = s3c2412_init_clocks, .init_uarts = s3c2412_init_uarts, .init = s3c2412_init, .name = name_s3c2412, }, |
f1290a49c ARM: S3C2416: Add... |
137 138 139 140 141 142 143 144 145 |
{ /* a strange version of the s3c2416 */ .idcode = 0x32450003, .idmask = 0xffffffff, .map_io = s3c2416_map_io, .init_clocks = s3c2416_init_clocks, .init_uarts = s3c2416_init_uarts, .init = s3c2416_init, .name = name_s3c2416, }, |
68d9ab394 [ARM] 3635/1: S3C... |
146 |
{ |
e4d06e395 [ARM] 4198/2: S3C... |
147 148 149 150 151 152 153 154 |
.idcode = 0x32443001, .idmask = 0xffffffff, .map_io = s3c2443_map_io, .init_clocks = s3c2443_init_clocks, .init_uarts = s3c2443_init_uarts, .init = s3c2443_init, .name = name_s3c2443, }, |
1da177e4c Linux-2.6.12-rc2 |
155 156 157 158 159 160 161 162 163 164 |
}; /* minimal IO mapping */ static struct map_desc s3c_iodesc[] __initdata = { IODESC_ENT(GPIO), IODESC_ENT(IRQ), IODESC_ENT(MEMCTRL), IODESC_ENT(UART) }; |
74b265d4e [ARM] S3C24XX: Mo... |
165 |
/* read cpu identificaiton code */ |
1da177e4c Linux-2.6.12-rc2 |
166 |
|
68d9ab394 [ARM] 3635/1: S3C... |
167 168 |
static unsigned long s3c24xx_read_idcode_v5(void) { |
d11a7d710 ARM: S3C24XX: Ide... |
169 170 171 172 173 174 175 176 177 |
#if defined(CONFIG_CPU_S3C2416) /* s3c2416 is v5, with S3C24XX_GSTATUS1 instead of S3C2412_GSTATUS1 */ u32 gs = __raw_readl(S3C24XX_GSTATUS1); /* test for s3c2416 or similar device */ if ((gs >> 16) == 0x3245) return gs; #endif |
68d9ab394 [ARM] 3635/1: S3C... |
178 179 180 181 182 183 184 185 186 |
#if defined(CONFIG_CPU_S3C2412) || defined(CONFIG_CPU_S3C2413) return __raw_readl(S3C2412_GSTATUS1); #else return 1UL; /* don't look like an 2400 */ #endif } static unsigned long s3c24xx_read_idcode_v4(void) { |
68d9ab394 [ARM] 3635/1: S3C... |
187 |
return __raw_readl(S3C2410_GSTATUS1); |
68d9ab394 [ARM] 3635/1: S3C... |
188 |
} |
1da177e4c Linux-2.6.12-rc2 |
189 190 |
void __init s3c24xx_init_io(struct map_desc *mach_desc, int size) { |
1da177e4c Linux-2.6.12-rc2 |
191 |
/* initialise the io descriptors we need for initialisation */ |
74b265d4e [ARM] S3C24XX: Mo... |
192 |
iotable_init(mach_desc, size); |
1da177e4c Linux-2.6.12-rc2 |
193 |
iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc)); |
68d9ab394 [ARM] 3635/1: S3C... |
194 |
if (cpu_architecture() >= CPU_ARCH_ARMv5) { |
c06af3cc6 ARM: SAMSUNG: Add... |
195 |
samsung_cpu_id = s3c24xx_read_idcode_v5(); |
68d9ab394 [ARM] 3635/1: S3C... |
196 |
} else { |
c06af3cc6 ARM: SAMSUNG: Add... |
197 |
samsung_cpu_id = s3c24xx_read_idcode_v4(); |
68d9ab394 [ARM] 3635/1: S3C... |
198 |
} |
e6d1cb9f1 ARM: SAMSUNG: Add... |
199 |
s3c24xx_init_cpu(); |
83f755f5a [ARM] 3286/2: S3C... |
200 |
|
c06af3cc6 ARM: SAMSUNG: Add... |
201 |
s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); |
66a9b49a3 [ARM] 3557/1: S3C... |
202 |
} |