1/* linux/arch/arm/mach-s3c2410/mach-amlm5900.c
2 *
3 * linux/arch/arm/mach-s3c2410/mach-amlm5900.c
4 *
5 * Copyright (c) 2006 American Microsystems Limited
6 *	David Anders <danders@amltd.com>
7
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21 * MA 02111-1307 USA
22 *
23 * @History:
24 * derived from linux/arch/arm/mach-s3c2410/mach-bast.c, written by
25 * Ben Dooks <ben@simtec.co.uk>
26 *
27 ***********************************************************************/
28
29#include <linux/kernel.h>
30#include <linux/types.h>
31#include <linux/interrupt.h>
32#include <linux/list.h>
33#include <linux/timer.h>
34#include <linux/init.h>
35#include <linux/gpio.h>
36#include <linux/device.h>
37#include <linux/platform_device.h>
38#include <linux/proc_fs.h>
39#include <linux/serial_core.h>
40#include <linux/serial_s3c.h>
41#include <linux/io.h>
42
43#include <asm/mach/arch.h>
44#include <asm/mach/map.h>
45#include <asm/mach/irq.h>
46#include <asm/mach/flash.h>
47
48#include <mach/hardware.h>
49#include <asm/irq.h>
50#include <asm/mach-types.h>
51#include <mach/fb.h>
52
53#include <mach/regs-lcd.h>
54#include <mach/regs-gpio.h>
55#include <mach/gpio-samsung.h>
56
57#include <linux/platform_data/i2c-s3c2410.h>
58#include <plat/devs.h>
59#include <plat/cpu.h>
60#include <plat/gpio-cfg.h>
61
62#include <linux/mtd/mtd.h>
63#include <linux/mtd/partitions.h>
64#include <linux/mtd/map.h>
65#include <linux/mtd/physmap.h>
66
67#include <plat/samsung-time.h>
68
69#include "common.h"
70
71static struct resource amlm5900_nor_resource =
72			DEFINE_RES_MEM(0x00000000, SZ_16M);
73
74static struct mtd_partition amlm5900_mtd_partitions[] = {
75	{
76		.name		= "System",
77		.size		= 0x240000,
78		.offset		= 0,
79		.mask_flags 	= MTD_WRITEABLE,  /* force read-only */
80	}, {
81		.name		= "Kernel",
82		.size		= 0x100000,
83		.offset		= MTDPART_OFS_APPEND,
84	}, {
85		.name		= "Ramdisk",
86		.size		= 0x300000,
87		.offset		= MTDPART_OFS_APPEND,
88	}, {
89		.name		= "JFFS2",
90		.size		= 0x9A0000,
91		.offset		= MTDPART_OFS_APPEND,
92	}, {
93		.name		= "Settings",
94		.size		= MTDPART_SIZ_FULL,
95		.offset		= MTDPART_OFS_APPEND,
96	}
97};
98
99static struct physmap_flash_data amlm5900_flash_data = {
100	.width		= 2,
101	.parts		= amlm5900_mtd_partitions,
102	.nr_parts	= ARRAY_SIZE(amlm5900_mtd_partitions),
103};
104
105static struct platform_device amlm5900_device_nor = {
106	.name		= "physmap-flash",
107	.id		= 0,
108	.dev = {
109			.platform_data = &amlm5900_flash_data,
110		},
111	.num_resources	= 1,
112	.resource	= &amlm5900_nor_resource,
113};
114
115static struct map_desc amlm5900_iodesc[] __initdata = {
116};
117
118#define UCON S3C2410_UCON_DEFAULT
119#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
120#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
121
122static struct s3c2410_uartcfg amlm5900_uartcfgs[] = {
123	[0] = {
124		.hwport	     = 0,
125		.flags	     = 0,
126		.ucon	     = UCON,
127		.ulcon	     = ULCON,
128		.ufcon	     = UFCON,
129	},
130	[1] = {
131		.hwport	     = 1,
132		.flags	     = 0,
133		.ucon	     = UCON,
134		.ulcon	     = ULCON,
135		.ufcon	     = UFCON,
136	},
137	[2] = {
138		.hwport	     = 2,
139		.flags	     = 0,
140		.ucon	     = UCON,
141		.ulcon	     = ULCON,
142		.ufcon	     = UFCON,
143	}
144};
145
146
147static struct platform_device *amlm5900_devices[] __initdata = {
148#ifdef CONFIG_FB_S3C2410
149	&s3c_device_lcd,
150#endif
151	&s3c_device_adc,
152	&s3c_device_wdt,
153	&s3c_device_i2c0,
154	&s3c_device_ohci,
155 	&s3c_device_rtc,
156	&s3c_device_usbgadget,
157        &s3c_device_sdi,
158	&amlm5900_device_nor,
159};
160
161static void __init amlm5900_map_io(void)
162{
163	s3c24xx_init_io(amlm5900_iodesc, ARRAY_SIZE(amlm5900_iodesc));
164	s3c24xx_init_uarts(amlm5900_uartcfgs, ARRAY_SIZE(amlm5900_uartcfgs));
165	samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4);
166}
167
168static void __init amlm5900_init_time(void)
169{
170	s3c2410_init_clocks(12000000);
171	samsung_timer_init();
172}
173
174#ifdef CONFIG_FB_S3C2410
175static struct s3c2410fb_display __initdata amlm5900_lcd_info = {
176	.width		= 160,
177	.height		= 160,
178
179	.type		= S3C2410_LCDCON1_STN4,
180
181	.pixclock	= 680000, /* HCLK = 100MHz */
182	.xres		= 160,
183	.yres		= 160,
184	.bpp		= 4,
185	.left_margin	= 1 << (4 + 3),
186	.right_margin	= 8 << 3,
187	.hsync_len	= 48,
188	.upper_margin	= 0,
189	.lower_margin	= 0,
190
191	.lcdcon5	= 0x00000001,
192};
193
194static struct s3c2410fb_mach_info __initdata amlm5900_fb_info = {
195
196	.displays = &amlm5900_lcd_info,
197	.num_displays = 1,
198	.default_display = 0,
199
200	.gpccon =	0xaaaaaaaa,
201	.gpccon_mask =	0xffffffff,
202	.gpcup =	0x0000ffff,
203	.gpcup_mask =	0xffffffff,
204
205	.gpdcon =	0xaaaaaaaa,
206	.gpdcon_mask =	0xffffffff,
207	.gpdup =	0x0000ffff,
208	.gpdup_mask =	0xffffffff,
209};
210#endif
211
212static irqreturn_t
213amlm5900_wake_interrupt(int irq, void *ignored)
214{
215	return IRQ_HANDLED;
216}
217
218static void amlm5900_init_pm(void)
219{
220	int ret = 0;
221
222	ret = request_irq(IRQ_EINT9, &amlm5900_wake_interrupt,
223				IRQF_TRIGGER_RISING | IRQF_SHARED,
224				"amlm5900_wakeup", &amlm5900_wake_interrupt);
225	if (ret != 0) {
226		printk(KERN_ERR "AML-M5900: no wakeup irq, %d?\n", ret);
227	} else {
228		enable_irq_wake(IRQ_EINT9);
229		/* configure the suspend/resume status pin */
230		s3c_gpio_cfgpin(S3C2410_GPF(2), S3C2410_GPIO_OUTPUT);
231		s3c_gpio_setpull(S3C2410_GPF(2), S3C_GPIO_PULL_UP);
232	}
233}
234static void __init amlm5900_init(void)
235{
236	amlm5900_init_pm();
237#ifdef CONFIG_FB_S3C2410
238	s3c24xx_fb_set_platdata(&amlm5900_fb_info);
239#endif
240	s3c_i2c0_set_platdata(NULL);
241	platform_add_devices(amlm5900_devices, ARRAY_SIZE(amlm5900_devices));
242}
243
244MACHINE_START(AML_M5900, "AML_M5900")
245	.atag_offset	= 0x100,
246	.map_io		= amlm5900_map_io,
247	.init_irq	= s3c2410_init_irq,
248	.init_machine	= amlm5900_init,
249	.init_time	= amlm5900_init_time,
250MACHINE_END
251