Blame view

arch/arm/plat-s3c24xx/cpu.c 5.28 KB
a21765a70   Ben Dooks   [ARM] 4157/2: S3C...
1
  /* linux/arch/arm/plat-s3c24xx/cpu.c
1da177e4c   Linus Torvalds   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   Ben Dooks   [ARM] 4049/1: S3C...
29
  #include <linux/serial_core.h>
d052d1bef   Russell King   Create platform_d...
30
  #include <linux/platform_device.h>
3c7d9c81e   Ben Dooks   [ARM] 4987/1: S3C...
31
  #include <linux/delay.h>
fced80c73   Russell King   [ARM] Convert asm...
32
  #include <linux/io.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33

a09e64fbc   Russell King   [ARM] Move includ...
34
  #include <mach/hardware.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
  #include <asm/irq.h>
3c7d9c81e   Ben Dooks   [ARM] 4987/1: S3C...
36
  #include <asm/cacheflush.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
38
39
  
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
a09e64fbc   Russell King   [ARM] Move includ...
40
  #include <mach/regs-gpio.h>
a2b7ba9ca   Ben Dooks   [ARM] S3C24XX: Mo...
41
  #include <plat/regs-serial.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42

a2b7ba9ca   Ben Dooks   [ARM] S3C24XX: Mo...
43
44
  #include <plat/cpu.h>
  #include <plat/devs.h>
d5120ae72   Ben Dooks   [ARM] S3C24XX: Ad...
45
  #include <plat/clock.h>
a2b7ba9ca   Ben Dooks   [ARM] S3C24XX: Mo...
46
  #include <plat/s3c2410.h>
d5120ae72   Ben Dooks   [ARM] S3C24XX: Ad...
47
  #include <plat/s3c2412.h>
f1290a49c   Yauhen Kharuzhy   ARM: S3C2416: Add...
48
  #include <plat/s3c2416.h>
58bac7b8d   Ben Dooks   ARM: S3C24XX: Mov...
49
  #include <plat/s3c244x.h>
a2b7ba9ca   Ben Dooks   [ARM] S3C24XX: Mo...
50
  #include <plat/s3c2443.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
53
54
  /* table of supported CPUs */
  
  static const char name_s3c2410[]  = "S3C2410";
68d9ab394   Ben Dooks   [ARM] 3635/1: S3C...
55
  static const char name_s3c2412[]  = "S3C2412";
63b1f51b2   Ben Dooks   ARM: SAMSUNG: Upd...
56
  static const char name_s3c2416[]  = "S3C2416/S3C2450";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
57
  static const char name_s3c2440[]  = "S3C2440";
96ce2385d   Ben Dooks   [ARM] 3559/1: S3C...
58
  static const char name_s3c2442[]  = "S3C2442";
f5fb9b1a1   Harald Welte   ARM: S3C24XX: Int...
59
  static const char name_s3c2442b[]  = "S3C2442B";
e4d06e395   Ben Dooks   [ARM] 4198/2: S3C...
60
  static const char name_s3c2443[]  = "S3C2443";
1da177e4c   Linus Torvalds   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   Ben Dooks   ARM: S3C2410: Add...
80
  		.init		= s3c2410a_init,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
82
83
84
85
  		.name		= name_s3c2410a
  	},
  	{
  		.idcode		= 0x32440000,
  		.idmask		= 0xffffffff,
812c4e40c   Vasily Khoruzhick   ARM: S3C24XX: Fix...
86
  		.map_io		= s3c2440_map_io,
96ce2385d   Ben Dooks   [ARM] 3559/1: S3C...
87
88
  		.init_clocks	= s3c244x_init_clocks,
  		.init_uarts	= s3c244x_init_uarts,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
89
90
91
92
93
94
  		.init		= s3c2440_init,
  		.name		= name_s3c2440
  	},
  	{
  		.idcode		= 0x32440001,
  		.idmask		= 0xffffffff,
812c4e40c   Vasily Khoruzhick   ARM: S3C24XX: Fix...
95
  		.map_io		= s3c2440_map_io,
96ce2385d   Ben Dooks   [ARM] 3559/1: S3C...
96
97
  		.init_clocks	= s3c244x_init_clocks,
  		.init_uarts	= s3c244x_init_uarts,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
98
99
  		.init		= s3c2440_init,
  		.name		= name_s3c2440a
83f755f5a   Lucas Correia Villa Real   [ARM] 3286/2: S3C...
100
101
  	},
  	{
96ce2385d   Ben Dooks   [ARM] 3559/1: S3C...
102
103
  		.idcode		= 0x32440aaa,
  		.idmask		= 0xffffffff,
812c4e40c   Vasily Khoruzhick   ARM: S3C24XX: Fix...
104
  		.map_io		= s3c2442_map_io,
96ce2385d   Ben Dooks   [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   Harald Welte   ARM: S3C24XX: Int...
111
112
  		.idcode		= 0x32440aab,
  		.idmask		= 0xffffffff,
812c4e40c   Vasily Khoruzhick   ARM: S3C24XX: Fix...
113
  		.map_io		= s3c2442_map_io,
f5fb9b1a1   Harald Welte   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   Ben Dooks   [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   Ben Dooks   [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   Yauhen Kharuzhy   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   Ben Dooks   [ARM] 3635/1: S3C...
146
  	{
e4d06e395   Ben Dooks   [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   Linus Torvalds   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   Ben Dooks   [ARM] S3C24XX: Mo...
165
  /* read cpu identificaiton code */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
166

68d9ab394   Ben Dooks   [ARM] 3635/1: S3C...
167
168
  static unsigned long s3c24xx_read_idcode_v5(void)
  {
d11a7d710   Ben Dooks   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   Ben Dooks   [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   Ben Dooks   [ARM] 3635/1: S3C...
187
  	return __raw_readl(S3C2410_GSTATUS1);
68d9ab394   Ben Dooks   [ARM] 3635/1: S3C...
188
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
189
190
  void __init s3c24xx_init_io(struct map_desc *mach_desc, int size)
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
191
  	/* initialise the io descriptors we need for initialisation */
74b265d4e   Ben Dooks   [ARM] S3C24XX: Mo...
192
  	iotable_init(mach_desc, size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
193
  	iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc));
68d9ab394   Ben Dooks   [ARM] 3635/1: S3C...
194
  	if (cpu_architecture() >= CPU_ARCH_ARMv5) {
c06af3cc6   Kukjin Kim   ARM: SAMSUNG: Add...
195
  		samsung_cpu_id = s3c24xx_read_idcode_v5();
68d9ab394   Ben Dooks   [ARM] 3635/1: S3C...
196
  	} else {
c06af3cc6   Kukjin Kim   ARM: SAMSUNG: Add...
197
  		samsung_cpu_id = s3c24xx_read_idcode_v4();
68d9ab394   Ben Dooks   [ARM] 3635/1: S3C...
198
  	}
e6d1cb9f1   Kukjin Kim   ARM: SAMSUNG: Add...
199
  	s3c24xx_init_cpu();
83f755f5a   Lucas Correia Villa Real   [ARM] 3286/2: S3C...
200

c06af3cc6   Kukjin Kim   ARM: SAMSUNG: Add...
201
  	s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));
66a9b49a3   Ben Dooks   [ARM] 3557/1: S3C...
202
  }