Blame view

arch/arm/mach-s3c2410/mach-vr1000.c 9.31 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"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
55
56
57
58
59
60
61
  
  /* 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...
62
63
64
65
  #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
66
67
68
  
  static struct map_desc vr1000_iodesc[] __initdata = {
    /* ISA IO areas */
df1ec6dee   Ben Dooks   [ARM] 3125/2: VR1...
69
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
    {
  	  .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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
  };
  
  #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
  
  /* uart clock source(s) */
  
  static struct s3c24xx_uart_clksrc vr1000_serial_clocks[] = {
  	[0] = {
  		.name		= "uclk",
  		.divisor	= 1,
  		.min_baud	= 0,
  		.max_baud	= 0,
  	},
  	[1] = {
  		.name		= "pclk",
  		.divisor	= 1,
  		.min_baud	= 0,
  		.max_baud	= 0.
  	}
  };
66a9b49a3   Ben Dooks   [ARM] 3557/1: S3C...
125
  static struct s3c2410_uartcfg vr1000_uartcfgs[] __initdata = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
126
127
128
129
130
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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
  	[0] = {
  		.hwport	     = 0,
  		.flags	     = 0,
  		.ucon	     = UCON,
  		.ulcon	     = ULCON,
  		.ufcon	     = UFCON,
  		.clocks	     = vr1000_serial_clocks,
  		.clocks_size = ARRAY_SIZE(vr1000_serial_clocks),
  	},
  	[1] = {
  		.hwport	     = 1,
  		.flags	     = 0,
  		.ucon	     = UCON,
  		.ulcon	     = ULCON,
  		.ufcon	     = UFCON,
  		.clocks	     = vr1000_serial_clocks,
  		.clocks_size = ARRAY_SIZE(vr1000_serial_clocks),
  	},
  	/* port 2 is not actually used */
  	[2] = {
  		.hwport	     = 2,
  		.flags	     = 0,
  		.ucon	     = UCON,
  		.ulcon	     = ULCON,
  		.ufcon	     = UFCON,
  		.clocks	     = vr1000_serial_clocks,
  		.clocks_size = ARRAY_SIZE(vr1000_serial_clocks),
  
  	}
  };
  
  /* 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...
201
  	.id			= PLAT8250_DEV_PLATFORM,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
202
203
204
205
  	.dev			= {
  		.platform_data	= serial_platform_data,
  	},
  };
d97a666f3   Ben Dooks   [PATCH] ARM: 2729...
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
  /* 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...
222
  		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
d97a666f3   Ben Dooks   [PATCH] ARM: 2729...
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
  	}
  
  };
  
  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...
241
  		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
d97a666f3   Ben Dooks   [PATCH] ARM: 2729...
242
243
244
245
246
247
  	}
  };
  
  /* 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...
248
  static struct dm9000_plat_data vr1000_dm9k_platdata = {
d97a666f3   Ben Dooks   [PATCH] ARM: 2729...
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
  	.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...
271
272
273
274
  /* LEDS */
  
  static struct s3c24xx_led_platdata vr1000_led1_pdata = {
  	.name		= "led1",
070276d5d   Ben Dooks   [ARM] S3C24XX: GP...
275
  	.gpio		= S3C2410_GPB(0),
b2eba6bb4   Ben Dooks   [ARM] 3998/1: VR1...
276
277
278
279
280
  	.def_trigger	= "",
  };
  
  static struct s3c24xx_led_platdata vr1000_led2_pdata = {
  	.name		= "led2",
070276d5d   Ben Dooks   [ARM] S3C24XX: GP...
281
  	.gpio		= S3C2410_GPB(1),
b2eba6bb4   Ben Dooks   [ARM] 3998/1: VR1...
282
283
284
285
286
  	.def_trigger	= "",
  };
  
  static struct s3c24xx_led_platdata vr1000_led3_pdata = {
  	.name		= "led3",
070276d5d   Ben Dooks   [ARM] S3C24XX: GP...
287
  	.gpio		= S3C2410_GPB(2),
b2eba6bb4   Ben Dooks   [ARM] 3998/1: VR1...
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
  	.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...
309
  	.id		= 3,
b2eba6bb4   Ben Dooks   [ARM] 3998/1: VR1...
310
311
312
313
  	.dev		= {
  		.platform_data	= &vr1000_led3_pdata,
  	},
  };
60d6698bb   Ben Dooks   [ARM] VR1000: Add...
314
315
316
317
318
319
  /* I2C devices. */
  
  static struct i2c_board_info vr1000_i2c_devs[] __initdata = {
  	{
  		I2C_BOARD_INFO("tlv320aic23", 0x1a),
  	}, {
9c3871ca5   Ben Dooks   [ARM] VR1000: Add...
320
321
  		I2C_BOARD_INFO("tmp101", 0x48),
  	}, {
60d6698bb   Ben Dooks   [ARM] VR1000: Add...
322
323
324
  		I2C_BOARD_INFO("m41st87", 0x68),
  	},
  };
d97a666f3   Ben Dooks   [PATCH] ARM: 2729...
325
  /* devices for this board */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
326
327
  
  static struct platform_device *vr1000_devices[] __initdata = {
b813248c6   Ben Dooks   ARM: S3C: Rename ...
328
  	&s3c_device_ohci,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
329
330
  	&s3c_device_lcd,
  	&s3c_device_wdt,
3e1b776c2   Ben Dooks   [ARM] S3C: Make i...
331
  	&s3c_device_i2c0,
d97a666f3   Ben Dooks   [PATCH] ARM: 2729...
332
  	&s3c_device_adc,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
333
  	&serial_device,
d97a666f3   Ben Dooks   [PATCH] ARM: 2729...
334
  	&vr1000_dm9k0,
b2eba6bb4   Ben Dooks   [ARM] 3998/1: VR1...
335
336
337
338
  	&vr1000_dm9k1,
  	&vr1000_led1,
  	&vr1000_led2,
  	&vr1000_led3,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
339
  };
2bc7509f6   Ben Dooks   [ARM] S3C24XX: s3...
340
  static struct clk *vr1000_clocks[] __initdata = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
341
342
343
344
345
346
  	&s3c24xx_dclk0,
  	&s3c24xx_dclk1,
  	&s3c24xx_clkout0,
  	&s3c24xx_clkout1,
  	&s3c24xx_uclk,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
347
348
  static void vr1000_power_off(void)
  {
7614e1d9b   Ben Dooks   ARM: VR1000: Upda...
349
  	gpio_direction_output(S3C2410_GPB(9), 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
350
  }
5fe10ab19   Ben Dooks   [ARM] 2928/1: S3C...
351
  static void __init vr1000_map_io(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
352
353
  {
  	/* initialise clock sources */
d96a98044   Ben Dooks   [ARM] 4986/1: S3C...
354
  	s3c24xx_dclk0.parent = &clk_upll;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
355
356
357
358
359
360
361
362
363
  	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...
364
  	s3c24xx_register_clocks(vr1000_clocks, ARRAY_SIZE(vr1000_clocks));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
365
366
367
368
369
  	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
370
  }
57e5171c9   Ben Dooks   [ARM] 4325/1: S3C...
371
372
  static void __init vr1000_init(void)
  {
3e1b776c2   Ben Dooks   [ARM] S3C: Make i...
373
  	s3c_i2c0_set_platdata(NULL);
57e5171c9   Ben Dooks   [ARM] 4325/1: S3C...
374
  	platform_add_devices(vr1000_devices, ARRAY_SIZE(vr1000_devices));
9d529c6e7   Ben Dooks   [ARM] S3C24XX: Ad...
375

60d6698bb   Ben Dooks   [ARM] VR1000: Add...
376
377
  	i2c_register_board_info(0, vr1000_i2c_devs,
  				ARRAY_SIZE(vr1000_i2c_devs));
9d529c6e7   Ben Dooks   [ARM] S3C24XX: Ad...
378
  	nor_simtec_init();
4d3a3469d   Ben Dooks   ARM: S3C24XX: mac...
379
  	simtec_audio_add(NULL, true, NULL);
7614e1d9b   Ben Dooks   ARM: VR1000: Upda...
380
381
  
  	WARN_ON(gpio_request(S3C2410_GPB(9), "power off"));
57e5171c9   Ben Dooks   [ARM] 4325/1: S3C...
382
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
383
384
  
  MACHINE_START(VR1000, "Thorcom-VR1000")
e9dea0c65   Russell King   [PATCH] ARM: Remo...
385
  	/* Maintainer: Ben Dooks <ben@simtec.co.uk> */
69d50710c   Nicolas Pitre   ARM: mach-s3c24*:...
386
  	.atag_offset	= 0x100,
6904b2465   Ben Dooks   [PATCH] ARM: 2765...
387
  	.map_io		= vr1000_map_io,
57e5171c9   Ben Dooks   [ARM] 4325/1: S3C...
388
  	.init_machine	= vr1000_init,
6904b2465   Ben Dooks   [PATCH] ARM: 2765...
389
  	.init_irq	= s3c24xx_init_irq,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
390
391
  	.timer		= &s3c24xx_timer,
  MACHINE_END