1a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere/*
2a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere * linux/arch/arm/mach-s3c64xx/mach-smartq7.c
3a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere *
4a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere * Copyright (C) 2010 Maurus Cuelenaere
5a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere *
6a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere * This program is free software; you can redistribute it and/or modify
7a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere * it under the terms of the GNU General Public License version 2 as
8a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere * published by the Free Software Foundation.
9a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere *
10a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere */
11a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere
12a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere#include <linux/fb.h>
13a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere#include <linux/gpio.h>
14a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere#include <linux/gpio_keys.h>
15a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere#include <linux/init.h>
16a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere#include <linux/input.h>
17a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere#include <linux/leds.h>
18a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere#include <linux/platform_device.h>
19a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere
20774b51f8f8269cb9a2cdbe2ac2c0a2ff62250b01Jamie Iles#include <asm/hardware/vic.h>
21a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere#include <asm/mach-types.h>
22a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere#include <asm/mach/arch.h>
23a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere
24a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere#include <mach/map.h>
25a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere#include <mach/regs-gpio.h>
26a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere
27a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere#include <plat/cpu.h>
28a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere#include <plat/devs.h>
29a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere#include <plat/fb.h>
30a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere#include <plat/gpio-cfg.h>
3149965e658674f40eb5cb72be6833eb49b1770961Ajay Kumar#include <plat/regs-fb-v4.h>
32a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere
33b024043b6d0d3feecb1de350de9762a00a79eda1Kukjin Kim#include "common.h"
34a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere#include "mach-smartq.h"
35a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere
36495c7b8e64811e8117eca472c6f90dccda039dc4Uwe Kleine-Königstatic struct gpio_led smartq7_leds[] = {
37a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	{
38a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.name			= "smartq7:red",
39a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.active_low		= 1,
40a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.gpio			= S3C64XX_GPN(8),
41a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	},
42a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	{
43a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.name			= "smartq7:green",
44a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.active_low		= 1,
45a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.gpio			= S3C64XX_GPN(9),
46a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	},
47a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere};
48a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere
49a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaerestatic struct gpio_led_platform_data smartq7_led_data = {
50a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.num_leds = ARRAY_SIZE(smartq7_leds),
51a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.leds = smartq7_leds,
52a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere};
53a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere
54a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaerestatic struct platform_device smartq7_leds_device = {
55a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.name			= "leds-gpio",
56a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.id			= -1,
57a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.dev.platform_data	= &smartq7_led_data,
58a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere};
59a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere
60a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere/* Labels according to the SmartQ manual */
61a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaerestatic struct gpio_keys_button smartq7_buttons[] = {
62a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	{
63a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.gpio			= S3C64XX_GPL(14),
64a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.code			= KEY_POWER,
65a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.desc			= "Power",
66a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.active_low		= 1,
67a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.debounce_interval	= 5,
68a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.type                   = EV_KEY,
69a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	},
70a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	{
71a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.gpio			= S3C64XX_GPN(2),
72a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.code			= KEY_FN,
73a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.desc			= "Function",
74a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.active_low		= 1,
75a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.debounce_interval	= 5,
76a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.type                   = EV_KEY,
77a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	},
78a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	{
79a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.gpio			= S3C64XX_GPN(3),
80a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.code			= KEY_KPMINUS,
81a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.desc			= "Minus",
82a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.active_low		= 1,
83a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.debounce_interval	= 5,
84a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.type                   = EV_KEY,
85a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	},
86a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	{
87a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.gpio			= S3C64XX_GPN(4),
88a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.code			= KEY_KPPLUS,
89a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.desc			= "Plus",
90a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.active_low		= 1,
91a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.debounce_interval	= 5,
92a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.type                   = EV_KEY,
93a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	},
94a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	{
95a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.gpio			= S3C64XX_GPN(12),
96a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.code			= KEY_ENTER,
97a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.desc			= "Enter",
98a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.active_low		= 1,
99a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.debounce_interval	= 5,
100a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.type                   = EV_KEY,
101a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	},
102a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	{
103a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.gpio			= S3C64XX_GPN(15),
104a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.code			= KEY_ESC,
105a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.desc			= "Cancel",
106a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.active_low		= 1,
107a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.debounce_interval	= 5,
108a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.type                   = EV_KEY,
109a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	},
110a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere};
111a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere
112a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaerestatic struct gpio_keys_platform_data smartq7_buttons_data  = {
113a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.buttons	= smartq7_buttons,
114a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.nbuttons	= ARRAY_SIZE(smartq7_buttons),
115a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere};
116a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere
117a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaerestatic struct platform_device smartq7_buttons_device  = {
118a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.name		= "gpio-keys",
119a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.id		= 0,
120a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.num_resources	= 0,
121a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.dev		= {
122a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.platform_data	= &smartq7_buttons_data,
123a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	}
124a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere};
125a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere
126a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaerestatic struct s3c_fb_pd_win smartq7_fb_win0 = {
127a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.win_mode	= {
128a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.left_margin	= 3,
129a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.right_margin	= 5,
130a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.upper_margin	= 1,
131a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.lower_margin	= 20,
132a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.hsync_len	= 10,
133a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.vsync_len	= 3,
134a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.xres		= 800,
135a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere		.yres		= 480,
136daf695fca877068d7533a1b431b09210e5ad0b6bMaurus Cuelenaere		.refresh	= 80,
137a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	},
138a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.max_bpp	= 32,
139a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.default_bpp	= 16,
140a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere};
141a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere
142a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaerestatic struct s3c_fb_platdata smartq7_lcd_pdata __initdata = {
143a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.setup_gpio	= s3c64xx_fb_gpio_setup_24bpp,
144a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.win[0]		= &smartq7_fb_win0,
145a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.vidcon0	= VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB,
146a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.vidcon1	= VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC |
147a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere			  VIDCON1_INV_VCLK,
148a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere};
149a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere
150a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaerestatic struct platform_device *smartq7_devices[] __initdata = {
151a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	&smartq7_leds_device,
152a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	&smartq7_buttons_device,
153a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere};
154a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere
155a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaerestatic void __init smartq7_machine_init(void)
156a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere{
157a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	s3c_fb_set_platdata(&smartq7_lcd_pdata);
158a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere
159a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	smartq_machine_init();
160a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere
161a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	platform_add_devices(smartq7_devices, ARRAY_SIZE(smartq7_devices));
162a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere}
163a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere
164a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus CuelenaereMACHINE_START(SMARTQ7, "SmartQ 7")
165a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	/* Maintainer: Maurus Cuelenaere <mcuelenaere AT gmail DOT com> */
166170a59080dfb8b3115ccce8f90fbceeb242d895aNicolas Pitre	.atag_offset	= 0x100,
167a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.init_irq	= s3c6410_init_irq,
168774b51f8f8269cb9a2cdbe2ac2c0a2ff62250b01Jamie Iles	.handle_irq	= vic_handle_irq,
169a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.map_io		= smartq_map_io,
170a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.init_machine	= smartq7_machine_init,
171a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus Cuelenaere	.timer		= &s3c24xx_timer,
172ff84ded26525adb4c0dcef3a4d590b0d08967293Kukjin Kim	.restart	= s3c64xx_restart,
173a2f7bffa29f18266bc7b55a2b47a5fa1274ed53fMaurus CuelenaereMACHINE_END
174