diff options
Diffstat (limited to 'arch/arm/mach-exynos4/mach-nuri.c')
-rw-r--r-- | arch/arm/mach-exynos4/mach-nuri.c | 305 |
1 files changed, 305 insertions, 0 deletions
diff --git a/arch/arm/mach-exynos4/mach-nuri.c b/arch/arm/mach-exynos4/mach-nuri.c new file mode 100644 index 000000000000..b79ad010d194 --- /dev/null +++ b/arch/arm/mach-exynos4/mach-nuri.c | |||
@@ -0,0 +1,305 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-exynos4/mach-nuri.c | ||
3 | * | ||
4 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/platform_device.h> | ||
12 | #include <linux/serial_core.h> | ||
13 | #include <linux/input.h> | ||
14 | #include <linux/i2c.h> | ||
15 | #include <linux/gpio_keys.h> | ||
16 | #include <linux/gpio.h> | ||
17 | #include <linux/regulator/machine.h> | ||
18 | #include <linux/regulator/fixed.h> | ||
19 | #include <linux/mmc/host.h> | ||
20 | #include <linux/fb.h> | ||
21 | #include <linux/pwm_backlight.h> | ||
22 | |||
23 | #include <video/platform_lcd.h> | ||
24 | |||
25 | #include <asm/mach/arch.h> | ||
26 | #include <asm/mach-types.h> | ||
27 | |||
28 | #include <plat/regs-serial.h> | ||
29 | #include <plat/exynos4.h> | ||
30 | #include <plat/cpu.h> | ||
31 | #include <plat/devs.h> | ||
32 | #include <plat/sdhci.h> | ||
33 | |||
34 | #include <mach/map.h> | ||
35 | |||
36 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | ||
37 | #define NURI_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | ||
38 | S3C2410_UCON_RXILEVEL | \ | ||
39 | S3C2410_UCON_TXIRQMODE | \ | ||
40 | S3C2410_UCON_RXIRQMODE | \ | ||
41 | S3C2410_UCON_RXFIFO_TOI | \ | ||
42 | S3C2443_UCON_RXERR_IRQEN) | ||
43 | |||
44 | #define NURI_ULCON_DEFAULT S3C2410_LCON_CS8 | ||
45 | |||
46 | #define NURI_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE | \ | ||
47 | S5PV210_UFCON_TXTRIG256 | \ | ||
48 | S5PV210_UFCON_RXTRIG256) | ||
49 | |||
50 | enum fixed_regulator_id { | ||
51 | FIXED_REG_ID_MMC = 0, | ||
52 | }; | ||
53 | |||
54 | static struct s3c2410_uartcfg nuri_uartcfgs[] __initdata = { | ||
55 | { | ||
56 | .hwport = 0, | ||
57 | .ucon = NURI_UCON_DEFAULT, | ||
58 | .ulcon = NURI_ULCON_DEFAULT, | ||
59 | .ufcon = NURI_UFCON_DEFAULT, | ||
60 | }, | ||
61 | { | ||
62 | .hwport = 1, | ||
63 | .ucon = NURI_UCON_DEFAULT, | ||
64 | .ulcon = NURI_ULCON_DEFAULT, | ||
65 | .ufcon = NURI_UFCON_DEFAULT, | ||
66 | }, | ||
67 | { | ||
68 | .hwport = 2, | ||
69 | .ucon = NURI_UCON_DEFAULT, | ||
70 | .ulcon = NURI_ULCON_DEFAULT, | ||
71 | .ufcon = NURI_UFCON_DEFAULT, | ||
72 | }, | ||
73 | { | ||
74 | .hwport = 3, | ||
75 | .ucon = NURI_UCON_DEFAULT, | ||
76 | .ulcon = NURI_ULCON_DEFAULT, | ||
77 | .ufcon = NURI_UFCON_DEFAULT, | ||
78 | }, | ||
79 | }; | ||
80 | |||
81 | /* eMMC */ | ||
82 | static struct s3c_sdhci_platdata nuri_hsmmc0_data __initdata = { | ||
83 | .max_width = 8, | ||
84 | .host_caps = (MMC_CAP_8_BIT_DATA | MMC_CAP_4_BIT_DATA | | ||
85 | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED | | ||
86 | MMC_CAP_DISABLE | MMC_CAP_ERASE), | ||
87 | .cd_type = S3C_SDHCI_CD_PERMANENT, | ||
88 | .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL, | ||
89 | }; | ||
90 | |||
91 | static struct regulator_consumer_supply emmc_supplies[] = { | ||
92 | REGULATOR_SUPPLY("vmmc", "s3c-sdhci.0"), | ||
93 | REGULATOR_SUPPLY("vmmc", "dw_mmc"), | ||
94 | }; | ||
95 | |||
96 | static struct regulator_init_data emmc_fixed_voltage_init_data = { | ||
97 | .constraints = { | ||
98 | .name = "VMEM_VDD_2.8V", | ||
99 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
100 | }, | ||
101 | .num_consumer_supplies = ARRAY_SIZE(emmc_supplies), | ||
102 | .consumer_supplies = emmc_supplies, | ||
103 | }; | ||
104 | |||
105 | static struct fixed_voltage_config emmc_fixed_voltage_config = { | ||
106 | .supply_name = "MASSMEMORY_EN (inverted)", | ||
107 | .microvolts = 2800000, | ||
108 | .gpio = EXYNOS4_GPL1(1), | ||
109 | .enable_high = false, | ||
110 | .init_data = &emmc_fixed_voltage_init_data, | ||
111 | }; | ||
112 | |||
113 | static struct platform_device emmc_fixed_voltage = { | ||
114 | .name = "reg-fixed-voltage", | ||
115 | .id = FIXED_REG_ID_MMC, | ||
116 | .dev = { | ||
117 | .platform_data = &emmc_fixed_voltage_config, | ||
118 | }, | ||
119 | }; | ||
120 | |||
121 | /* SD */ | ||
122 | static struct s3c_sdhci_platdata nuri_hsmmc2_data __initdata = { | ||
123 | .max_width = 4, | ||
124 | .host_caps = MMC_CAP_4_BIT_DATA | | ||
125 | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED | | ||
126 | MMC_CAP_DISABLE, | ||
127 | .ext_cd_gpio = EXYNOS4_GPX3(3), /* XEINT_27 */ | ||
128 | .ext_cd_gpio_invert = 1, | ||
129 | .cd_type = S3C_SDHCI_CD_GPIO, | ||
130 | .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL, | ||
131 | }; | ||
132 | |||
133 | /* WLAN */ | ||
134 | static struct s3c_sdhci_platdata nuri_hsmmc3_data __initdata = { | ||
135 | .max_width = 4, | ||
136 | .host_caps = MMC_CAP_4_BIT_DATA | | ||
137 | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED, | ||
138 | .cd_type = S3C_SDHCI_CD_EXTERNAL, | ||
139 | .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL, | ||
140 | }; | ||
141 | |||
142 | static void __init nuri_sdhci_init(void) | ||
143 | { | ||
144 | s3c_sdhci0_set_platdata(&nuri_hsmmc0_data); | ||
145 | s3c_sdhci2_set_platdata(&nuri_hsmmc2_data); | ||
146 | s3c_sdhci3_set_platdata(&nuri_hsmmc3_data); | ||
147 | } | ||
148 | |||
149 | /* GPIO KEYS */ | ||
150 | static struct gpio_keys_button nuri_gpio_keys_tables[] = { | ||
151 | { | ||
152 | .code = KEY_VOLUMEUP, | ||
153 | .gpio = EXYNOS4_GPX2(0), /* XEINT16 */ | ||
154 | .desc = "gpio-keys: KEY_VOLUMEUP", | ||
155 | .type = EV_KEY, | ||
156 | .active_low = 1, | ||
157 | .debounce_interval = 1, | ||
158 | }, { | ||
159 | .code = KEY_VOLUMEDOWN, | ||
160 | .gpio = EXYNOS4_GPX2(1), /* XEINT17 */ | ||
161 | .desc = "gpio-keys: KEY_VOLUMEDOWN", | ||
162 | .type = EV_KEY, | ||
163 | .active_low = 1, | ||
164 | .debounce_interval = 1, | ||
165 | }, { | ||
166 | .code = KEY_POWER, | ||
167 | .gpio = EXYNOS4_GPX2(7), /* XEINT23 */ | ||
168 | .desc = "gpio-keys: KEY_POWER", | ||
169 | .type = EV_KEY, | ||
170 | .active_low = 1, | ||
171 | .wakeup = 1, | ||
172 | .debounce_interval = 1, | ||
173 | }, | ||
174 | }; | ||
175 | |||
176 | static struct gpio_keys_platform_data nuri_gpio_keys_data = { | ||
177 | .buttons = nuri_gpio_keys_tables, | ||
178 | .nbuttons = ARRAY_SIZE(nuri_gpio_keys_tables), | ||
179 | }; | ||
180 | |||
181 | static struct platform_device nuri_gpio_keys = { | ||
182 | .name = "gpio-keys", | ||
183 | .dev = { | ||
184 | .platform_data = &nuri_gpio_keys_data, | ||
185 | }, | ||
186 | }; | ||
187 | |||
188 | static void nuri_lcd_power_on(struct plat_lcd_data *pd, unsigned int power) | ||
189 | { | ||
190 | int gpio = EXYNOS4_GPE1(5); | ||
191 | |||
192 | gpio_request(gpio, "LVDS_nSHDN"); | ||
193 | gpio_direction_output(gpio, power); | ||
194 | gpio_free(gpio); | ||
195 | } | ||
196 | |||
197 | static int nuri_bl_init(struct device *dev) | ||
198 | { | ||
199 | int ret, gpio = EXYNOS4_GPE2(3); | ||
200 | |||
201 | ret = gpio_request(gpio, "LCD_LDO_EN"); | ||
202 | if (!ret) | ||
203 | gpio_direction_output(gpio, 0); | ||
204 | |||
205 | return ret; | ||
206 | } | ||
207 | |||
208 | static int nuri_bl_notify(struct device *dev, int brightness) | ||
209 | { | ||
210 | if (brightness < 1) | ||
211 | brightness = 0; | ||
212 | |||
213 | gpio_set_value(EXYNOS4_GPE2(3), 1); | ||
214 | |||
215 | return brightness; | ||
216 | } | ||
217 | |||
218 | static void nuri_bl_exit(struct device *dev) | ||
219 | { | ||
220 | gpio_free(EXYNOS4_GPE2(3)); | ||
221 | } | ||
222 | |||
223 | /* nuri pwm backlight */ | ||
224 | static struct platform_pwm_backlight_data nuri_backlight_data = { | ||
225 | .pwm_id = 0, | ||
226 | .pwm_period_ns = 30000, | ||
227 | .max_brightness = 100, | ||
228 | .dft_brightness = 50, | ||
229 | .init = nuri_bl_init, | ||
230 | .notify = nuri_bl_notify, | ||
231 | .exit = nuri_bl_exit, | ||
232 | }; | ||
233 | |||
234 | static struct platform_device nuri_backlight_device = { | ||
235 | .name = "pwm-backlight", | ||
236 | .id = -1, | ||
237 | .dev = { | ||
238 | .parent = &s3c_device_timer[0].dev, | ||
239 | .platform_data = &nuri_backlight_data, | ||
240 | }, | ||
241 | }; | ||
242 | |||
243 | static struct plat_lcd_data nuri_lcd_platform_data = { | ||
244 | .set_power = nuri_lcd_power_on, | ||
245 | }; | ||
246 | |||
247 | static struct platform_device nuri_lcd_device = { | ||
248 | .name = "platform-lcd", | ||
249 | .id = -1, | ||
250 | .dev = { | ||
251 | .platform_data = &nuri_lcd_platform_data, | ||
252 | }, | ||
253 | }; | ||
254 | |||
255 | /* I2C1 */ | ||
256 | static struct i2c_board_info i2c1_devs[] __initdata = { | ||
257 | /* Gyro, To be updated */ | ||
258 | }; | ||
259 | |||
260 | /* GPIO I2C 5 (PMIC) */ | ||
261 | static struct i2c_board_info i2c5_devs[] __initdata = { | ||
262 | /* max8997, To be updated */ | ||
263 | }; | ||
264 | |||
265 | static struct platform_device *nuri_devices[] __initdata = { | ||
266 | /* Samsung Platform Devices */ | ||
267 | &emmc_fixed_voltage, | ||
268 | &s3c_device_hsmmc0, | ||
269 | &s3c_device_hsmmc2, | ||
270 | &s3c_device_hsmmc3, | ||
271 | &s3c_device_wdt, | ||
272 | &s3c_device_timer[0], | ||
273 | |||
274 | /* NURI Devices */ | ||
275 | &nuri_gpio_keys, | ||
276 | &nuri_lcd_device, | ||
277 | &nuri_backlight_device, | ||
278 | }; | ||
279 | |||
280 | static void __init nuri_map_io(void) | ||
281 | { | ||
282 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | ||
283 | s3c24xx_init_clocks(24000000); | ||
284 | s3c24xx_init_uarts(nuri_uartcfgs, ARRAY_SIZE(nuri_uartcfgs)); | ||
285 | } | ||
286 | |||
287 | static void __init nuri_machine_init(void) | ||
288 | { | ||
289 | nuri_sdhci_init(); | ||
290 | |||
291 | i2c_register_board_info(1, i2c1_devs, ARRAY_SIZE(i2c1_devs)); | ||
292 | i2c_register_board_info(5, i2c5_devs, ARRAY_SIZE(i2c5_devs)); | ||
293 | |||
294 | /* Last */ | ||
295 | platform_add_devices(nuri_devices, ARRAY_SIZE(nuri_devices)); | ||
296 | } | ||
297 | |||
298 | MACHINE_START(NURI, "NURI") | ||
299 | /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */ | ||
300 | .boot_params = S5P_PA_SDRAM + 0x100, | ||
301 | .init_irq = exynos4_init_irq, | ||
302 | .map_io = nuri_map_io, | ||
303 | .init_machine = nuri_machine_init, | ||
304 | .timer = &exynos4_timer, | ||
305 | MACHINE_END | ||