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/device.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/gpio-samsung.h> 41#include <linux/platform_data/leds-s3c24xx.h> 42#include <linux/platform_data/mtd-nand-s3c2410.h> 43 44#include <plat/gpio-cfg.h> 45#include <plat/devs.h> 46#include <plat/pm.h> 47 48#include "common-smdk.h" 49 50/* LED devices */ 51 52static struct s3c24xx_led_platdata smdk_pdata_led4 = { 53 .gpio = S3C2410_GPF(4), 54 .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE, 55 .name = "led4", 56 .def_trigger = "timer", 57}; 58 59static struct s3c24xx_led_platdata smdk_pdata_led5 = { 60 .gpio = S3C2410_GPF(5), 61 .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE, 62 .name = "led5", 63 .def_trigger = "nand-disk", 64}; 65 66static struct s3c24xx_led_platdata smdk_pdata_led6 = { 67 .gpio = S3C2410_GPF(6), 68 .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE, 69 .name = "led6", 70}; 71 72static struct s3c24xx_led_platdata smdk_pdata_led7 = { 73 .gpio = S3C2410_GPF(7), 74 .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE, 75 .name = "led7", 76}; 77 78static struct platform_device smdk_led4 = { 79 .name = "s3c24xx_led", 80 .id = 0, 81 .dev = { 82 .platform_data = &smdk_pdata_led4, 83 }, 84}; 85 86static struct platform_device smdk_led5 = { 87 .name = "s3c24xx_led", 88 .id = 1, 89 .dev = { 90 .platform_data = &smdk_pdata_led5, 91 }, 92}; 93 94static struct platform_device smdk_led6 = { 95 .name = "s3c24xx_led", 96 .id = 2, 97 .dev = { 98 .platform_data = &smdk_pdata_led6, 99 }, 100}; 101 102static struct platform_device smdk_led7 = { 103 .name = "s3c24xx_led", 104 .id = 3, 105 .dev = { 106 .platform_data = &smdk_pdata_led7, 107 }, 108}; 109 110/* NAND parititon from 2.4.18-swl5 */ 111 112static struct mtd_partition smdk_default_nand_part[] = { 113 [0] = { 114 .name = "Boot Agent", 115 .size = SZ_16K, 116 .offset = 0, 117 }, 118 [1] = { 119 .name = "S3C2410 flash partition 1", 120 .offset = 0, 121 .size = SZ_2M, 122 }, 123 [2] = { 124 .name = "S3C2410 flash partition 2", 125 .offset = SZ_4M, 126 .size = SZ_4M, 127 }, 128 [3] = { 129 .name = "S3C2410 flash partition 3", 130 .offset = SZ_8M, 131 .size = SZ_2M, 132 }, 133 [4] = { 134 .name = "S3C2410 flash partition 4", 135 .offset = SZ_1M * 10, 136 .size = SZ_4M, 137 }, 138 [5] = { 139 .name = "S3C2410 flash partition 5", 140 .offset = SZ_1M * 14, 141 .size = SZ_1M * 10, 142 }, 143 [6] = { 144 .name = "S3C2410 flash partition 6", 145 .offset = SZ_1M * 24, 146 .size = SZ_1M * 24, 147 }, 148 [7] = { 149 .name = "S3C2410 flash partition 7", 150 .offset = SZ_1M * 48, 151 .size = MTDPART_SIZ_FULL, 152 } 153}; 154 155static struct s3c2410_nand_set smdk_nand_sets[] = { 156 [0] = { 157 .name = "NAND", 158 .nr_chips = 1, 159 .nr_partitions = ARRAY_SIZE(smdk_default_nand_part), 160 .partitions = smdk_default_nand_part, 161 }, 162}; 163 164/* choose a set of timings which should suit most 512Mbit 165 * chips and beyond. 166*/ 167 168static struct s3c2410_platform_nand smdk_nand_info = { 169 .tacls = 20, 170 .twrph0 = 60, 171 .twrph1 = 20, 172 .nr_sets = ARRAY_SIZE(smdk_nand_sets), 173 .sets = smdk_nand_sets, 174}; 175 176/* devices we initialise */ 177 178static struct platform_device __initdata *smdk_devs[] = { 179 &s3c_device_nand, 180 &smdk_led4, 181 &smdk_led5, 182 &smdk_led6, 183 &smdk_led7, 184}; 185 186static const struct gpio smdk_led_gpios[] = { 187 { S3C2410_GPF(4), GPIOF_OUT_INIT_HIGH, NULL }, 188 { S3C2410_GPF(5), GPIOF_OUT_INIT_HIGH, NULL }, 189 { S3C2410_GPF(6), GPIOF_OUT_INIT_HIGH, NULL }, 190 { S3C2410_GPF(7), GPIOF_OUT_INIT_HIGH, NULL }, 191}; 192 193void __init smdk_machine_init(void) 194{ 195 /* Configure the LEDs (even if we have no LED support)*/ 196 197 int ret = gpio_request_array(smdk_led_gpios, 198 ARRAY_SIZE(smdk_led_gpios)); 199 if (!WARN_ON(ret < 0)) 200 gpio_free_array(smdk_led_gpios, ARRAY_SIZE(smdk_led_gpios)); 201 202 if (machine_is_smdk2443()) 203 smdk_nand_info.twrph0 = 50; 204 205 s3c_nand_set_platdata(&smdk_nand_info); 206 207 platform_add_devices(smdk_devs, ARRAY_SIZE(smdk_devs)); 208 209 s3c_pm_init(); 210} 211