linux/arch/arm/mach-s3c24xx/mach-vstms.c
<<
>>
Prefs
   1/* linux/arch/arm/mach-s3c2412/mach-vstms.c
   2 *
   3 * (C) 2006 Thomas Gleixner <tglx@linutronix.de>
   4 *
   5 * Derived from mach-smdk2413.c - (C) 2006 Simtec Electronics
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License version 2 as
   9 * published by the Free Software Foundation.
  10 */
  11
  12#include <linux/kernel.h>
  13#include <linux/types.h>
  14#include <linux/interrupt.h>
  15#include <linux/list.h>
  16#include <linux/timer.h>
  17#include <linux/init.h>
  18#include <linux/serial_core.h>
  19#include <linux/serial_s3c.h>
  20#include <linux/platform_device.h>
  21#include <linux/io.h>
  22#include <linux/mtd/mtd.h>
  23#include <linux/mtd/nand.h>
  24#include <linux/mtd/nand_ecc.h>
  25#include <linux/mtd/partitions.h>
  26#include <linux/memblock.h>
  27
  28#include <asm/mach/arch.h>
  29#include <asm/mach/map.h>
  30#include <asm/mach/irq.h>
  31
  32#include <mach/hardware.h>
  33#include <asm/setup.h>
  34#include <asm/irq.h>
  35#include <asm/mach-types.h>
  36
  37#include <mach/regs-gpio.h>
  38#include <mach/regs-lcd.h>
  39
  40#include <mach/fb.h>
  41
  42#include <linux/platform_data/i2c-s3c2410.h>
  43#include <linux/platform_data/mtd-nand-s3c2410.h>
  44
  45#include <plat/devs.h>
  46#include <plat/cpu.h>
  47#include <plat/samsung-time.h>
  48
  49#include "common.h"
  50
  51static struct map_desc vstms_iodesc[] __initdata = {
  52};
  53
  54static struct s3c2410_uartcfg vstms_uartcfgs[] __initdata = {
  55        [0] = {
  56                .hwport      = 0,
  57                .flags       = 0,
  58                .ucon        = 0x3c5,
  59                .ulcon       = 0x03,
  60                .ufcon       = 0x51,
  61        },
  62        [1] = {
  63                .hwport      = 1,
  64                .flags       = 0,
  65                .ucon        = 0x3c5,
  66                .ulcon       = 0x03,
  67                .ufcon       = 0x51,
  68        },
  69        [2] = {
  70                .hwport      = 2,
  71                .flags       = 0,
  72                .ucon        = 0x3c5,
  73                .ulcon       = 0x03,
  74                .ufcon       = 0x51,
  75        }
  76};
  77
  78static struct mtd_partition __initdata vstms_nand_part[] = {
  79        [0] = {
  80                .name   = "Boot Agent",
  81                .size   = 0x7C000,
  82                .offset = 0,
  83        },
  84        [1] = {
  85                .name   = "UBoot Config",
  86                .offset = 0x7C000,
  87                .size   = 0x4000,
  88        },
  89        [2] = {
  90                .name   = "Kernel",
  91                .offset = 0x80000,
  92                .size   = 0x200000,
  93        },
  94        [3] = {
  95                .name   = "RFS",
  96                .offset = 0x280000,
  97                .size   = 0x3d80000,
  98        },
  99};
 100
 101static struct s3c2410_nand_set __initdata vstms_nand_sets[] = {
 102        [0] = {
 103                .name           = "NAND",
 104                .nr_chips       = 1,
 105                .nr_partitions  = ARRAY_SIZE(vstms_nand_part),
 106                .partitions     = vstms_nand_part,
 107        },
 108};
 109
 110/* choose a set of timings which should suit most 512Mbit
 111 * chips and beyond.
 112*/
 113
 114static struct s3c2410_platform_nand __initdata vstms_nand_info = {
 115        .tacls          = 20,
 116        .twrph0         = 60,
 117        .twrph1         = 20,
 118        .nr_sets        = ARRAY_SIZE(vstms_nand_sets),
 119        .sets           = vstms_nand_sets,
 120        .ecc_mode       = NAND_ECC_SOFT,
 121};
 122
 123static struct platform_device *vstms_devices[] __initdata = {
 124        &s3c_device_ohci,
 125        &s3c_device_wdt,
 126        &s3c_device_i2c0,
 127        &s3c_device_iis,
 128        &s3c_device_rtc,
 129        &s3c_device_nand,
 130        &s3c2412_device_dma,
 131};
 132
 133static void __init vstms_fixup(struct tag *tags, char **cmdline)
 134{
 135        if (tags != phys_to_virt(S3C2410_SDRAM_PA + 0x100)) {
 136                memblock_add(0x30000000, SZ_64M);
 137        }
 138}
 139
 140static void __init vstms_map_io(void)
 141{
 142        s3c24xx_init_io(vstms_iodesc, ARRAY_SIZE(vstms_iodesc));
 143        s3c24xx_init_uarts(vstms_uartcfgs, ARRAY_SIZE(vstms_uartcfgs));
 144        samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4);
 145}
 146
 147static void __init vstms_init_time(void)
 148{
 149        s3c2412_init_clocks(12000000);
 150        samsung_timer_init();
 151}
 152
 153static void __init vstms_init(void)
 154{
 155        s3c_i2c0_set_platdata(NULL);
 156        s3c_nand_set_platdata(&vstms_nand_info);
 157
 158        platform_add_devices(vstms_devices, ARRAY_SIZE(vstms_devices));
 159}
 160
 161MACHINE_START(VSTMS, "VSTMS")
 162        .atag_offset    = 0x100,
 163
 164        .fixup          = vstms_fixup,
 165        .init_irq       = s3c2412_init_irq,
 166        .init_machine   = vstms_init,
 167        .map_io         = vstms_map_io,
 168        .init_time      = vstms_init_time,
 169MACHINE_END
 170