1/* linux/arch/arm/plat-s3c24xx/common-smdk.c 2 * 3 * Copyright (c) 2006 Simtec Electronics 4 * Ben Dooks <ben@simtec.co.uk> 5 * 6 * Common code for SMDK2410 and SMDK2440 boards 7 * 8 * http://www.fluff.org/ben/smdk2440/ 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License version 2 as 12 * published by the Free Software Foundation. 13*/ 14 15#include <linux/kernel.h> 16#include <linux/types.h> 17#include <linux/interrupt.h> 18#include <linux/list.h> 19#include <linux/timer.h> 20#include <linux/init.h> 21#include <linux/gpio.h> 22#include <linux/sysdev.h> 23#include <linux/platform_device.h> 24 25#include <linux/mtd/mtd.h> 26#include <linux/mtd/nand.h> 27#include <linux/mtd/nand_ecc.h> 28#include <linux/mtd/partitions.h> 29#include <linux/io.h> 30 31#include <asm/mach/arch.h> 32#include <asm/mach/map.h> 33#include <asm/mach/irq.h> 34 35#include <asm/mach-types.h> 36#include <mach/hardware.h> 37#include <asm/irq.h> 38 39#include <mach/regs-gpio.h> 40#include <mach/leds-gpio.h> 41 42#include <plat/nand.h> 43 44#include <plat/common-smdk.h> 45#include <plat/gpio-cfg.h> 46#include <plat/devs.h> 47#include <plat/pm.h> 48 49/* LED devices */ 50 51static struct s3c24xx_led_platdata smdk_pdata_led4 = { 52 .gpio = S3C2410_GPF(4), 53 .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE, 54 .name = "led4", 55 .def_trigger = "timer", 56}; 57 58static struct s3c24xx_led_platdata smdk_pdata_led5 = { 59 .gpio = S3C2410_GPF(5), 60 .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE, 61 .name = "led5", 62 .def_trigger = "nand-disk", 63}; 64 65static struct s3c24xx_led_platdata smdk_pdata_led6 = { 66 .gpio = S3C2410_GPF(6), 67 .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE, 68 .name = "led6", 69}; 70 71static struct s3c24xx_led_platdata smdk_pdata_led7 = { 72 .gpio = S3C2410_GPF(7), 73 .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE, 74 .name = "led7", 75}; 76 77static struct platform_device smdk_led4 = { 78 .name = "s3c24xx_led", 79 .id = 0, 80 .dev = { 81 .platform_data = &smdk_pdata_led4, 82 }, 83}; 84 85static struct platform_device smdk_led5 = { 86 .name = "s3c24xx_led", 87 .id = 1, 88 .dev = { 89 .platform_data = &smdk_pdata_led5, 90 }, 91}; 92 93static struct platform_device smdk_led6 = { 94 .name = "s3c24xx_led", 95 .id = 2, 96 .dev = { 97 .platform_data = &smdk_pdata_led6, 98 }, 99}; 100 101static struct platform_device smdk_led7 = { 102 .name = "s3c24xx_led", 103 .id = 3, 104 .dev = { 105 .platform_data = &smdk_pdata_led7, 106 }, 107}; 108 109/* NAND parititon from 2.4.18-swl5 */ 110 111static struct mtd_partition smdk_default_nand_part[] = { 112 [0] = { 113 .name = "Boot Agent", 114 .size = SZ_16K, 115 .offset = 0, 116 }, 117 [1] = { 118 .name = "S3C2410 flash partition 1", 119 .offset = 0, 120 .size = SZ_2M, 121 }, 122 [2] = { 123 .name = "S3C2410 flash partition 2", 124 .offset = SZ_4M, 125 .size = SZ_4M, 126 }, 127 [3] = { 128 .name = "S3C2410 flash partition 3", 129 .offset = SZ_8M, 130 .size = SZ_2M, 131 }, 132 [4] = { 133 .name = "S3C2410 flash partition 4", 134 .offset = SZ_1M * 10, 135 .size = SZ_4M, 136 }, 137 [5] = { 138 .name = "S3C2410 flash partition 5", 139 .offset = SZ_1M * 14, 140 .size = SZ_1M * 10, 141 }, 142 [6] = { 143 .name = "S3C2410 flash partition 6", 144 .offset = SZ_1M * 24, 145 .size = SZ_1M * 24, 146 }, 147 [7] = { 148 .name = "S3C2410 flash partition 7", 149 .offset = SZ_1M * 48, 150 .size = SZ_16M, 151 } 152}; 153 154static struct s3c2410_nand_set smdk_nand_sets[] = { 155 [0] = { 156 .name = "NAND", 157 .nr_chips = 1, 158 .nr_partitions = ARRAY_SIZE(smdk_default_nand_part), 159 .partitions = smdk_default_nand_part, 160 }, 161}; 162 163/* choose a set of timings which should suit most 512Mbit 164 * chips and beyond. 165*/ 166 167static struct s3c2410_platform_nand smdk_nand_info = { 168 .tacls = 20, 169 .twrph0 = 60, 170 .twrph1 = 20, 171 .nr_sets = ARRAY_SIZE(smdk_nand_sets), 172 .sets = smdk_nand_sets, 173}; 174 175/* devices we initialise */ 176 177static struct platform_device __initdata *smdk_devs[] = { 178 &s3c_device_nand, 179 &smdk_led4, 180 &smdk_led5, 181 &smdk_led6, 182 &smdk_led7, 183}; 184 185void __init smdk_machine_init(void) 186{ 187 /* Configure the LEDs (even if we have no LED support)*/ 188 189 s3c_gpio_cfgpin(S3C2410_GPF(4), S3C2410_GPIO_OUTPUT); 190 s3c_gpio_cfgpin(S3C2410_GPF(5), S3C2410_GPIO_OUTPUT); 191 s3c_gpio_cfgpin(S3C2410_GPF(6), S3C2410_GPIO_OUTPUT); 192 s3c_gpio_cfgpin(S3C2410_GPF(7), S3C2410_GPIO_OUTPUT); 193 194 s3c2410_gpio_setpin(S3C2410_GPF(4), 1); 195 s3c2410_gpio_setpin(S3C2410_GPF(5), 1); 196 s3c2410_gpio_setpin(S3C2410_GPF(6), 1); 197 s3c2410_gpio_setpin(S3C2410_GPF(7), 1); 198 199 if (machine_is_smdk2443()) 200 smdk_nand_info.twrph0 = 50; 201 202 s3c_nand_set_platdata(&smdk_nand_info); 203 204 platform_add_devices(smdk_devs, ARRAY_SIZE(smdk_devs)); 205 206 s3c_pm_init(); 207} 208