Blame view

arch/arm/mach-s3c2410/mach-vr1000.c 8.84 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
  /* linux/arch/arm/mach-s3c2410/mach-vr1000.c
   *
ccae941ee   Ben Dooks   ARM: S3C: Update ...
3
   * Copyright (c) 2003-2008 Simtec Electronics
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4
5
6
7
8
9
10
11
12
   *   Ben Dooks <ben@simtec.co.uk>
   *
   * Machine support for Thorcom VR1000 board. Designed for Thorcom by
   * Simtec Electronics, http://www.simtec.co.uk/
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
14
15
16
17
18
19
20
  */
  
  #include <linux/kernel.h>
  #include <linux/types.h>
  #include <linux/interrupt.h>
  #include <linux/list.h>
  #include <linux/timer.h>
  #include <linux/init.h>
ec976d6eb   Ben Dooks   [ARM] S3C24XX: GP...
21
  #include <linux/gpio.h>
d97a666f3   Ben Dooks   [PATCH] ARM: 2729...
22
  #include <linux/dm9000.h>
60d6698bb   Ben Dooks   [ARM] VR1000: Add...
23
  #include <linux/i2c.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
26
27
28
  
  #include <linux/serial.h>
  #include <linux/tty.h>
  #include <linux/serial_8250.h>
  #include <linux/serial_reg.h>
fced80c73   Russell King   [ARM] Convert asm...
29
  #include <linux/io.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
31
32
33
  
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
  #include <asm/mach/irq.h>
a09e64fbc   Russell King   [ARM] Move includ...
34
35
36
37
  #include <mach/bast-map.h>
  #include <mach/vr1000-map.h>
  #include <mach/vr1000-irq.h>
  #include <mach/vr1000-cpld.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38

a09e64fbc   Russell King   [ARM] Move includ...
39
  #include <mach/hardware.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
41
  #include <asm/irq.h>
  #include <asm/mach-types.h>
a2b7ba9ca   Ben Dooks   [ARM] S3C24XX: Mo...
42
  #include <plat/regs-serial.h>
a09e64fbc   Russell King   [ARM] Move includ...
43
44
  #include <mach/regs-gpio.h>
  #include <mach/leds-gpio.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45

d5120ae72   Ben Dooks   [ARM] S3C24XX: Ad...
46
  #include <plat/clock.h>
a2b7ba9ca   Ben Dooks   [ARM] S3C24XX: Mo...
47
48
  #include <plat/devs.h>
  #include <plat/cpu.h>
3e1b776c2   Ben Dooks   [ARM] S3C: Make i...
49
  #include <plat/iic.h>
4d3a3469d   Ben Dooks   ARM: S3C24XX: mac...
50
  #include <plat/audio-simtec.h>
9d529c6e7   Ben Dooks   [ARM] S3C24XX: Ad...
51

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
  #include "usb-simtec.h"
9d529c6e7   Ben Dooks   [ARM] S3C24XX: Ad...
53
  #include "nor-simtec.h"
b27b07279   Kukjin Kim   ARM: 7265/1: rest...
54
  #include "common.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55
56
57
58
59
60
61
62
  
  /* macros for virtual address mods for the io space entries */
  #define VA_C5(item) ((unsigned long)(item) + BAST_VAM_CS5)
  #define VA_C4(item) ((unsigned long)(item) + BAST_VAM_CS4)
  #define VA_C3(item) ((unsigned long)(item) + BAST_VAM_CS3)
  #define VA_C2(item) ((unsigned long)(item) + BAST_VAM_CS2)
  
  /* macros to modify the physical addresses for io space */
df1ec6dee   Ben Dooks   [ARM] 3125/2: VR1...
63
64
65
66
  #define PA_CS2(item) (__phys_to_pfn((item) + S3C2410_CS2))
  #define PA_CS3(item) (__phys_to_pfn((item) + S3C2410_CS3))
  #define PA_CS4(item) (__phys_to_pfn((item) + S3C2410_CS4))
  #define PA_CS5(item) (__phys_to_pfn((item) + S3C2410_CS5))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
67
68
69
  
  static struct map_desc vr1000_iodesc[] __initdata = {
    /* ISA IO areas */
df1ec6dee   Ben Dooks   [ARM] 3125/2: VR1...
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
    {
  	  .virtual	= (u32)S3C24XX_VA_ISA_BYTE,
  	  .pfn		= PA_CS2(BAST_PA_ISAIO),
  	  .length	= SZ_16M,
  	  .type		= MT_DEVICE,
    }, {
  	  .virtual	= (u32)S3C24XX_VA_ISA_WORD,
  	  .pfn		= PA_CS3(BAST_PA_ISAIO),
  	  .length	= SZ_16M,
  	  .type		= MT_DEVICE,
    },
  
    /*  CPLD control registers, and external interrupt controls */
    {
  	  .virtual	= (u32)VR1000_VA_CTRL1,
  	  .pfn		= __phys_to_pfn(VR1000_PA_CTRL1),
  	  .length	= SZ_1M,
  	  .type		= MT_DEVICE,
    }, {
  	  .virtual	= (u32)VR1000_VA_CTRL2,
  	  .pfn		= __phys_to_pfn(VR1000_PA_CTRL2),
  	  .length	= SZ_1M,
  	  .type		= MT_DEVICE,
    }, {
  	  .virtual	= (u32)VR1000_VA_CTRL3,
  	  .pfn		= __phys_to_pfn(VR1000_PA_CTRL3),
  	  .length	= SZ_1M,
  	  .type		= MT_DEVICE,
    }, {
  	  .virtual	= (u32)VR1000_VA_CTRL4,
  	  .pfn		= __phys_to_pfn(VR1000_PA_CTRL4),
  	  .length	= SZ_1M,
  	  .type		= MT_DEVICE,
    },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
104
105
106
107
108
  };
  
  #define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK
  #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
  #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
66a9b49a3   Ben Dooks   [ARM] 3557/1: S3C...
109
  static struct s3c2410_uartcfg vr1000_uartcfgs[] __initdata = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
111
112
113
114
115
  	[0] = {
  		.hwport	     = 0,
  		.flags	     = 0,
  		.ucon	     = UCON,
  		.ulcon	     = ULCON,
  		.ufcon	     = UFCON,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
116
117
118
119
120
121
122
  	},
  	[1] = {
  		.hwport	     = 1,
  		.flags	     = 0,
  		.ucon	     = UCON,
  		.ulcon	     = ULCON,
  		.ufcon	     = UFCON,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
123
124
125
126
127
128
129
130
  	},
  	/* port 2 is not actually used */
  	[2] = {
  		.hwport	     = 2,
  		.flags	     = 0,
  		.ucon	     = UCON,
  		.ulcon	     = ULCON,
  		.ufcon	     = UFCON,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
  	}
  };
  
  /* definitions for the vr1000 extra 16550 serial ports */
  
  #define VR1000_BAUDBASE (3692307)
  
  #define VR1000_SERIAL_MAPBASE(x) (VR1000_PA_SERIAL + 0x80 + ((x) << 5))
  
  static struct plat_serial8250_port serial_platform_data[] = {
  	[0] = {
  		.mapbase	= VR1000_SERIAL_MAPBASE(0),
  		.irq		= IRQ_VR1000_SERIAL + 0,
  		.flags		= UPF_BOOT_AUTOCONF | UPF_IOREMAP,
  		.iotype		= UPIO_MEM,
  		.regshift	= 0,
  		.uartclk	= VR1000_BAUDBASE,
  	},
  	[1] = {
  		.mapbase	= VR1000_SERIAL_MAPBASE(1),
  		.irq		= IRQ_VR1000_SERIAL + 1,
  		.flags		= UPF_BOOT_AUTOCONF | UPF_IOREMAP,
  		.iotype		= UPIO_MEM,
  		.regshift	= 0,
  		.uartclk	= VR1000_BAUDBASE,
  	},
  	[2] = {
  		.mapbase	= VR1000_SERIAL_MAPBASE(2),
  		.irq		= IRQ_VR1000_SERIAL + 2,
  		.flags		= UPF_BOOT_AUTOCONF | UPF_IOREMAP,
  		.iotype		= UPIO_MEM,
  		.regshift	= 0,
  		.uartclk	= VR1000_BAUDBASE,
  	},
  	[3] = {
  		.mapbase	= VR1000_SERIAL_MAPBASE(3),
  		.irq		= IRQ_VR1000_SERIAL + 3,
  		.flags		= UPF_BOOT_AUTOCONF | UPF_IOREMAP,
  		.iotype		= UPIO_MEM,
  		.regshift	= 0,
  		.uartclk	= VR1000_BAUDBASE,
  	},
  	{ },
  };
  
  static struct platform_device serial_device = {
  	.name			= "serial8250",
6df29debb   Russell King   [SERIAL] Use an e...
178
  	.id			= PLAT8250_DEV_PLATFORM,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
179
180
181
182
  	.dev			= {
  		.platform_data	= serial_platform_data,
  	},
  };
d97a666f3   Ben Dooks   [PATCH] ARM: 2729...
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
  /* DM9000 ethernet devices */
  
  static struct resource vr1000_dm9k0_resource[] = {
  	[0] = {
  		.start = S3C2410_CS5 + VR1000_PA_DM9000,
  		.end   = S3C2410_CS5 + VR1000_PA_DM9000 + 3,
  		.flags = IORESOURCE_MEM
  	},
  	[1] = {
  		.start = S3C2410_CS5 + VR1000_PA_DM9000 + 0x40,
  		.end   = S3C2410_CS5 + VR1000_PA_DM9000 + 0x7f,
  		.flags = IORESOURCE_MEM
  	},
  	[2] = {
  		.start = IRQ_VR1000_DM9000A,
  		.end   = IRQ_VR1000_DM9000A,
9cf345e39   Ben Dooks   [ARM] S3C2410: Fi...
199
  		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
d97a666f3   Ben Dooks   [PATCH] ARM: 2729...
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
  	}
  
  };
  
  static struct resource vr1000_dm9k1_resource[] = {
  	[0] = {
  		.start = S3C2410_CS5 + VR1000_PA_DM9000 + 0x80,
  		.end   = S3C2410_CS5 + VR1000_PA_DM9000 + 0x83,
  		.flags = IORESOURCE_MEM
  	},
  	[1] = {
  		.start = S3C2410_CS5 + VR1000_PA_DM9000 + 0xC0,
  		.end   = S3C2410_CS5 + VR1000_PA_DM9000 + 0xFF,
  		.flags = IORESOURCE_MEM
  	},
  	[2] = {
  		.start = IRQ_VR1000_DM9000N,
  		.end   = IRQ_VR1000_DM9000N,
9cf345e39   Ben Dooks   [ARM] S3C2410: Fi...
218
  		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
d97a666f3   Ben Dooks   [PATCH] ARM: 2729...
219
220
221
222
223
224
  	}
  };
  
  /* for the moment we limit ourselves to 16bit IO until some
   * better IO routines can be written and tested
  */
9f693d7b1   Ben Dooks   [ARM] 2979/2: S3C...
225
  static struct dm9000_plat_data vr1000_dm9k_platdata = {
d97a666f3   Ben Dooks   [PATCH] ARM: 2729...
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
  	.flags		= DM9000_PLATF_16BITONLY,
  };
  
  static struct platform_device vr1000_dm9k0 = {
  	.name		= "dm9000",
  	.id		= 0,
  	.num_resources	= ARRAY_SIZE(vr1000_dm9k0_resource),
  	.resource	= vr1000_dm9k0_resource,
  	.dev		= {
  		.platform_data = &vr1000_dm9k_platdata,
  	}
  };
  
  static struct platform_device vr1000_dm9k1 = {
  	.name		= "dm9000",
  	.id		= 1,
  	.num_resources	= ARRAY_SIZE(vr1000_dm9k1_resource),
  	.resource	= vr1000_dm9k1_resource,
  	.dev		= {
  		.platform_data = &vr1000_dm9k_platdata,
  	}
  };
b2eba6bb4   Ben Dooks   [ARM] 3998/1: VR1...
248
249
250
251
  /* LEDS */
  
  static struct s3c24xx_led_platdata vr1000_led1_pdata = {
  	.name		= "led1",
070276d5d   Ben Dooks   [ARM] S3C24XX: GP...
252
  	.gpio		= S3C2410_GPB(0),
b2eba6bb4   Ben Dooks   [ARM] 3998/1: VR1...
253
254
255
256
257
  	.def_trigger	= "",
  };
  
  static struct s3c24xx_led_platdata vr1000_led2_pdata = {
  	.name		= "led2",
070276d5d   Ben Dooks   [ARM] S3C24XX: GP...
258
  	.gpio		= S3C2410_GPB(1),
b2eba6bb4   Ben Dooks   [ARM] 3998/1: VR1...
259
260
261
262
263
  	.def_trigger	= "",
  };
  
  static struct s3c24xx_led_platdata vr1000_led3_pdata = {
  	.name		= "led3",
070276d5d   Ben Dooks   [ARM] S3C24XX: GP...
264
  	.gpio		= S3C2410_GPB(2),
b2eba6bb4   Ben Dooks   [ARM] 3998/1: VR1...
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
  	.def_trigger	= "",
  };
  
  static struct platform_device vr1000_led1 = {
  	.name		= "s3c24xx_led",
  	.id		= 1,
  	.dev		= {
  		.platform_data	= &vr1000_led1_pdata,
  	},
  };
  
  static struct platform_device vr1000_led2 = {
  	.name		= "s3c24xx_led",
  	.id		= 2,
  	.dev		= {
  		.platform_data	= &vr1000_led2_pdata,
  	},
  };
  
  static struct platform_device vr1000_led3 = {
  	.name		= "s3c24xx_led",
abac08d73   Ben Dooks   [ARM] 4059/1: VR1...
286
  	.id		= 3,
b2eba6bb4   Ben Dooks   [ARM] 3998/1: VR1...
287
288
289
290
  	.dev		= {
  		.platform_data	= &vr1000_led3_pdata,
  	},
  };
60d6698bb   Ben Dooks   [ARM] VR1000: Add...
291
292
293
294
295
296
  /* I2C devices. */
  
  static struct i2c_board_info vr1000_i2c_devs[] __initdata = {
  	{
  		I2C_BOARD_INFO("tlv320aic23", 0x1a),
  	}, {
9c3871ca5   Ben Dooks   [ARM] VR1000: Add...
297
298
  		I2C_BOARD_INFO("tmp101", 0x48),
  	}, {
60d6698bb   Ben Dooks   [ARM] VR1000: Add...
299
300
301
  		I2C_BOARD_INFO("m41st87", 0x68),
  	},
  };
d97a666f3   Ben Dooks   [PATCH] ARM: 2729...
302
  /* devices for this board */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
303
304
  
  static struct platform_device *vr1000_devices[] __initdata = {
b813248c6   Ben Dooks   ARM: S3C: Rename ...
305
  	&s3c_device_ohci,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
306
307
  	&s3c_device_lcd,
  	&s3c_device_wdt,
3e1b776c2   Ben Dooks   [ARM] S3C: Make i...
308
  	&s3c_device_i2c0,
d97a666f3   Ben Dooks   [PATCH] ARM: 2729...
309
  	&s3c_device_adc,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
310
  	&serial_device,
d97a666f3   Ben Dooks   [PATCH] ARM: 2729...
311
  	&vr1000_dm9k0,
b2eba6bb4   Ben Dooks   [ARM] 3998/1: VR1...
312
313
314
315
  	&vr1000_dm9k1,
  	&vr1000_led1,
  	&vr1000_led2,
  	&vr1000_led3,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
316
  };
2bc7509f6   Ben Dooks   [ARM] S3C24XX: s3...
317
  static struct clk *vr1000_clocks[] __initdata = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
318
319
320
321
322
323
  	&s3c24xx_dclk0,
  	&s3c24xx_dclk1,
  	&s3c24xx_clkout0,
  	&s3c24xx_clkout1,
  	&s3c24xx_uclk,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
324
325
  static void vr1000_power_off(void)
  {
7614e1d9b   Ben Dooks   ARM: VR1000: Upda...
326
  	gpio_direction_output(S3C2410_GPB(9), 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
327
  }
5fe10ab19   Ben Dooks   [ARM] 2928/1: S3C...
328
  static void __init vr1000_map_io(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
329
330
  {
  	/* initialise clock sources */
d96a98044   Ben Dooks   [ARM] 4986/1: S3C...
331
  	s3c24xx_dclk0.parent = &clk_upll;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
332
333
334
335
336
337
338
339
340
  	s3c24xx_dclk0.rate   = 12*1000*1000;
  
  	s3c24xx_dclk1.parent = NULL;
  	s3c24xx_dclk1.rate   = 3692307;
  
  	s3c24xx_clkout0.parent  = &s3c24xx_dclk0;
  	s3c24xx_clkout1.parent  = &s3c24xx_dclk1;
  
  	s3c24xx_uclk.parent  = &s3c24xx_clkout1;
ce89c206a   Ben Dooks   [ARM] 4324/1: S3C...
341
  	s3c24xx_register_clocks(vr1000_clocks, ARRAY_SIZE(vr1000_clocks));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
342
343
344
345
346
  	pm_power_off = vr1000_power_off;
  
  	s3c24xx_init_io(vr1000_iodesc, ARRAY_SIZE(vr1000_iodesc));
  	s3c24xx_init_clocks(0);
  	s3c24xx_init_uarts(vr1000_uartcfgs, ARRAY_SIZE(vr1000_uartcfgs));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
347
  }
57e5171c9   Ben Dooks   [ARM] 4325/1: S3C...
348
349
  static void __init vr1000_init(void)
  {
3e1b776c2   Ben Dooks   [ARM] S3C: Make i...
350
  	s3c_i2c0_set_platdata(NULL);
57e5171c9   Ben Dooks   [ARM] 4325/1: S3C...
351
  	platform_add_devices(vr1000_devices, ARRAY_SIZE(vr1000_devices));
9d529c6e7   Ben Dooks   [ARM] S3C24XX: Ad...
352

60d6698bb   Ben Dooks   [ARM] VR1000: Add...
353
354
  	i2c_register_board_info(0, vr1000_i2c_devs,
  				ARRAY_SIZE(vr1000_i2c_devs));
9d529c6e7   Ben Dooks   [ARM] S3C24XX: Ad...
355
  	nor_simtec_init();
4d3a3469d   Ben Dooks   ARM: S3C24XX: mac...
356
  	simtec_audio_add(NULL, true, NULL);
7614e1d9b   Ben Dooks   ARM: VR1000: Upda...
357
358
  
  	WARN_ON(gpio_request(S3C2410_GPB(9), "power off"));
57e5171c9   Ben Dooks   [ARM] 4325/1: S3C...
359
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
360
361
  
  MACHINE_START(VR1000, "Thorcom-VR1000")
e9dea0c65   Russell King   [PATCH] ARM: Remo...
362
  	/* Maintainer: Ben Dooks <ben@simtec.co.uk> */
69d50710c   Nicolas Pitre   ARM: mach-s3c24*:...
363
  	.atag_offset	= 0x100,
6904b2465   Ben Dooks   [PATCH] ARM: 2765...
364
  	.map_io		= vr1000_map_io,
57e5171c9   Ben Dooks   [ARM] 4325/1: S3C...
365
  	.init_machine	= vr1000_init,
6904b2465   Ben Dooks   [PATCH] ARM: 2765...
366
  	.init_irq	= s3c24xx_init_irq,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
367
  	.timer		= &s3c24xx_timer,
b27b07279   Kukjin Kim   ARM: 7265/1: rest...
368
  	.restart	= s3c2410_restart,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
369
  MACHINE_END