diff options
Diffstat (limited to 'arch/arm/mach-s3c2440/mach-anubis.c')
-rw-r--r-- | arch/arm/mach-s3c2440/mach-anubis.c | 141 |
1 files changed, 139 insertions, 2 deletions
diff --git a/arch/arm/mach-s3c2440/mach-anubis.c b/arch/arm/mach-s3c2440/mach-anubis.c index bff7ddd06a52..29c163d300d4 100644 --- a/arch/arm/mach-s3c2440/mach-anubis.c +++ b/arch/arm/mach-s3c2440/mach-anubis.c | |||
@@ -18,6 +18,9 @@ | |||
18 | #include <linux/serial_core.h> | 18 | #include <linux/serial_core.h> |
19 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
20 | 20 | ||
21 | #include <linux/sm501.h> | ||
22 | #include <linux/sm501-regs.h> | ||
23 | |||
21 | #include <asm/mach/arch.h> | 24 | #include <asm/mach/arch.h> |
22 | #include <asm/mach/map.h> | 25 | #include <asm/mach/map.h> |
23 | #include <asm/mach/irq.h> | 26 | #include <asm/mach/irq.h> |
@@ -42,6 +45,8 @@ | |||
42 | #include <linux/mtd/nand_ecc.h> | 45 | #include <linux/mtd/nand_ecc.h> |
43 | #include <linux/mtd/partitions.h> | 46 | #include <linux/mtd/partitions.h> |
44 | 47 | ||
48 | #include <net/ax88796.h> | ||
49 | |||
45 | #include <asm/plat-s3c24xx/clock.h> | 50 | #include <asm/plat-s3c24xx/clock.h> |
46 | #include <asm/plat-s3c24xx/devs.h> | 51 | #include <asm/plat-s3c24xx/devs.h> |
47 | #include <asm/plat-s3c24xx/cpu.h> | 52 | #include <asm/plat-s3c24xx/cpu.h> |
@@ -153,6 +158,29 @@ static struct mtd_partition anubis_default_nand_part[] = { | |||
153 | } | 158 | } |
154 | }; | 159 | }; |
155 | 160 | ||
161 | static struct mtd_partition anubis_default_nand_part_large[] = { | ||
162 | [0] = { | ||
163 | .name = "Boot Agent", | ||
164 | .size = SZ_128K, | ||
165 | .offset = 0, | ||
166 | }, | ||
167 | [1] = { | ||
168 | .name = "/boot", | ||
169 | .size = SZ_4M - SZ_128K, | ||
170 | .offset = SZ_128K, | ||
171 | }, | ||
172 | [2] = { | ||
173 | .name = "user1", | ||
174 | .offset = SZ_4M, | ||
175 | .size = SZ_32M - SZ_4M, | ||
176 | }, | ||
177 | [3] = { | ||
178 | .name = "user2", | ||
179 | .offset = SZ_32M, | ||
180 | .size = MTDPART_SIZ_FULL, | ||
181 | } | ||
182 | }; | ||
183 | |||
156 | /* the Anubis has 3 selectable slots for nand-flash, the two | 184 | /* the Anubis has 3 selectable slots for nand-flash, the two |
157 | * on-board chip areas, as well as the external slot. | 185 | * on-board chip areas, as well as the external slot. |
158 | * | 186 | * |
@@ -260,6 +288,104 @@ static struct platform_device anubis_device_ide1 = { | |||
260 | .resource = anubis_ide1_resource, | 288 | .resource = anubis_ide1_resource, |
261 | }; | 289 | }; |
262 | 290 | ||
291 | /* Asix AX88796 10/100 ethernet controller */ | ||
292 | |||
293 | static struct ax_plat_data anubis_asix_platdata = { | ||
294 | .flags = AXFLG_MAC_FROMDEV, | ||
295 | .wordlength = 2, | ||
296 | .dcr_val = 0x48, | ||
297 | .rcr_val = 0x40, | ||
298 | }; | ||
299 | |||
300 | static struct resource anubis_asix_resource[] = { | ||
301 | [0] = { | ||
302 | .start = S3C2410_CS5, | ||
303 | .end = S3C2410_CS5 + (0x20 * 0x20) -1, | ||
304 | .flags = IORESOURCE_MEM | ||
305 | }, | ||
306 | [1] = { | ||
307 | .start = IRQ_ASIX, | ||
308 | .end = IRQ_ASIX, | ||
309 | .flags = IORESOURCE_IRQ | ||
310 | } | ||
311 | }; | ||
312 | |||
313 | static struct platform_device anubis_device_asix = { | ||
314 | .name = "ax88796", | ||
315 | .id = 0, | ||
316 | .num_resources = ARRAY_SIZE(anubis_asix_resource), | ||
317 | .resource = anubis_asix_resource, | ||
318 | .dev = { | ||
319 | .platform_data = &anubis_asix_platdata, | ||
320 | } | ||
321 | }; | ||
322 | |||
323 | /* SM501 */ | ||
324 | |||
325 | static struct resource anubis_sm501_resource[] = { | ||
326 | [0] = { | ||
327 | .start = S3C2410_CS2, | ||
328 | .end = S3C2410_CS2 + SZ_8M, | ||
329 | .flags = IORESOURCE_MEM, | ||
330 | }, | ||
331 | [1] = { | ||
332 | .start = S3C2410_CS2 + SZ_64M - SZ_2M, | ||
333 | .end = S3C2410_CS2 + SZ_64M - 1, | ||
334 | .flags = IORESOURCE_MEM, | ||
335 | }, | ||
336 | [2] = { | ||
337 | .start = IRQ_EINT0, | ||
338 | .end = IRQ_EINT0, | ||
339 | .flags = IORESOURCE_IRQ, | ||
340 | }, | ||
341 | }; | ||
342 | |||
343 | static struct sm501_initdata anubis_sm501_initdata = { | ||
344 | .gpio_high = { | ||
345 | .set = 0x3F000000, /* 24bit panel */ | ||
346 | .mask = 0x0, | ||
347 | }, | ||
348 | .misc_timing = { | ||
349 | .set = 0x010100, /* SDRAM timing */ | ||
350 | .mask = 0x1F1F00, | ||
351 | }, | ||
352 | .misc_control = { | ||
353 | .set = SM501_MISC_PNL_24BIT, | ||
354 | .mask = 0, | ||
355 | }, | ||
356 | |||
357 | /* set the SDRAM and bus clocks */ | ||
358 | .mclk = 72 * MHZ, | ||
359 | .m1xclk = 144 * MHZ, | ||
360 | }; | ||
361 | |||
362 | static struct sm501_platdata_gpio_i2c anubis_sm501_gpio_i2c[] = { | ||
363 | [0] = { | ||
364 | .pin_scl = 44, | ||
365 | .pin_sda = 45, | ||
366 | }, | ||
367 | [1] = { | ||
368 | .pin_scl = 40, | ||
369 | .pin_sda = 41, | ||
370 | }, | ||
371 | }; | ||
372 | |||
373 | static struct sm501_platdata anubis_sm501_platdata = { | ||
374 | .init = &anubis_sm501_initdata, | ||
375 | .gpio_i2c = anubis_sm501_gpio_i2c, | ||
376 | .gpio_i2c_nr = ARRAY_SIZE(anubis_sm501_gpio_i2c), | ||
377 | }; | ||
378 | |||
379 | static struct platform_device anubis_device_sm501 = { | ||
380 | .name = "sm501", | ||
381 | .id = 0, | ||
382 | .num_resources = ARRAY_SIZE(anubis_sm501_resource), | ||
383 | .resource = anubis_sm501_resource, | ||
384 | .dev = { | ||
385 | .platform_data = &anubis_sm501_platdata, | ||
386 | }, | ||
387 | }; | ||
388 | |||
263 | /* Standard Anubis devices */ | 389 | /* Standard Anubis devices */ |
264 | 390 | ||
265 | static struct platform_device *anubis_devices[] __initdata = { | 391 | static struct platform_device *anubis_devices[] __initdata = { |
@@ -271,6 +397,8 @@ static struct platform_device *anubis_devices[] __initdata = { | |||
271 | &s3c_device_nand, | 397 | &s3c_device_nand, |
272 | &anubis_device_ide0, | 398 | &anubis_device_ide0, |
273 | &anubis_device_ide1, | 399 | &anubis_device_ide1, |
400 | &anubis_device_asix, | ||
401 | &anubis_device_sm501, | ||
274 | }; | 402 | }; |
275 | 403 | ||
276 | static struct clk *anubis_clocks[] = { | 404 | static struct clk *anubis_clocks[] = { |
@@ -304,8 +432,17 @@ static void __init anubis_map_io(void) | |||
304 | s3c24xx_init_clocks(0); | 432 | s3c24xx_init_clocks(0); |
305 | s3c24xx_init_uarts(anubis_uartcfgs, ARRAY_SIZE(anubis_uartcfgs)); | 433 | s3c24xx_init_uarts(anubis_uartcfgs, ARRAY_SIZE(anubis_uartcfgs)); |
306 | 434 | ||
307 | /* ensure that the GPIO is setup */ | 435 | /* check for the newer revision boards with large page nand */ |
308 | s3c2410_gpio_setpin(S3C2410_GPA0, 1); | 436 | |
437 | if ((__raw_readb(ANUBIS_VA_IDREG) & ANUBIS_IDREG_REVMASK) >= 4) { | ||
438 | printk(KERN_INFO "ANUBIS-B detected (revision %d)\n", | ||
439 | __raw_readb(ANUBIS_VA_IDREG) & ANUBIS_IDREG_REVMASK); | ||
440 | anubis_nand_sets[0].partitions = anubis_default_nand_part_large; | ||
441 | anubis_nand_sets[0].nr_partitions = ARRAY_SIZE(anubis_default_nand_part_large); | ||
442 | } else { | ||
443 | /* ensure that the GPIO is setup */ | ||
444 | s3c2410_gpio_setpin(S3C2410_GPA0, 1); | ||
445 | } | ||
309 | } | 446 | } |
310 | 447 | ||
311 | static void __init anubis_init(void) | 448 | static void __init anubis_init(void) |