mmc: sdhci-s3c: add platform data for the second capability
[linux-block.git] / arch / arm / mach-exynos / mach-nuri.c
CommitLineData
caf8b1f2
MK
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>
3260ecd8 15#include <linux/i2c/atmel_mxt_ts.h>
a140b92e 16#include <linux/i2c-gpio.h>
caf8b1f2
MK
17#include <linux/gpio_keys.h>
18#include <linux/gpio.h>
605baf67 19#include <linux/power/max8903_charger.h>
a140b92e 20#include <linux/power/max17042_battery.h>
caf8b1f2
MK
21#include <linux/regulator/machine.h>
22#include <linux/regulator/fixed.h>
29dee863
MH
23#include <linux/mfd/max8997.h>
24#include <linux/mfd/max8997-private.h>
caf8b1f2 25#include <linux/mmc/host.h>
cc7df872
DL
26#include <linux/fb.h>
27#include <linux/pwm_backlight.h>
28
29#include <video/platform_lcd.h>
716e84d1
SN
30#include <media/m5mols.h>
31#include <media/s5p_fimc.h>
32#include <media/v4l2-mediabus.h>
caf8b1f2
MK
33
34#include <asm/mach/arch.h>
4e44d2cb 35#include <asm/hardware/gic.h>
caf8b1f2
MK
36#include <asm/mach-types.h>
37
ed9ba31f 38#include <plat/adc.h>
0d88f946 39#include <plat/regs-fb-v4.h>
caf8b1f2 40#include <plat/regs-serial.h>
caf8b1f2
MK
41#include <plat/cpu.h>
42#include <plat/devs.h>
0d88f946 43#include <plat/fb.h>
caf8b1f2 44#include <plat/sdhci.h>
01da92f7
JS
45#include <plat/ehci.h>
46#include <plat/clock.h>
3260ecd8
JS
47#include <plat/gpio-cfg.h>
48#include <plat/iic.h>
4c0f0a3e
MS
49#include <plat/mfc.h>
50#include <plat/pd.h>
716e84d1
SN
51#include <plat/fimc-core.h>
52#include <plat/camport.h>
53#include <plat/mipi_csis.h>
caf8b1f2
MK
54
55#include <mach/map.h>
56
cc511b8d
KK
57#include "common.h"
58
caf8b1f2
MK
59/* Following are default values for UCON, ULCON and UFCON UART registers */
60#define NURI_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \
61 S3C2410_UCON_RXILEVEL | \
62 S3C2410_UCON_TXIRQMODE | \
63 S3C2410_UCON_RXIRQMODE | \
64 S3C2410_UCON_RXFIFO_TOI | \
65 S3C2443_UCON_RXERR_IRQEN)
66
67#define NURI_ULCON_DEFAULT S3C2410_LCON_CS8
68
69#define NURI_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE | \
70 S5PV210_UFCON_TXTRIG256 | \
71 S5PV210_UFCON_RXTRIG256)
72
73enum fixed_regulator_id {
74 FIXED_REG_ID_MMC = 0,
605baf67 75 FIXED_REG_ID_MAX8903,
716e84d1
SN
76 FIXED_REG_ID_CAM_A28V,
77 FIXED_REG_ID_CAM_12V,
caf8b1f2
MK
78};
79
80static struct s3c2410_uartcfg nuri_uartcfgs[] __initdata = {
81 {
82 .hwport = 0,
83 .ucon = NURI_UCON_DEFAULT,
84 .ulcon = NURI_ULCON_DEFAULT,
85 .ufcon = NURI_UFCON_DEFAULT,
86 },
87 {
88 .hwport = 1,
89 .ucon = NURI_UCON_DEFAULT,
90 .ulcon = NURI_ULCON_DEFAULT,
91 .ufcon = NURI_UFCON_DEFAULT,
92 },
93 {
94 .hwport = 2,
95 .ucon = NURI_UCON_DEFAULT,
96 .ulcon = NURI_ULCON_DEFAULT,
97 .ufcon = NURI_UFCON_DEFAULT,
98 },
99 {
100 .hwport = 3,
101 .ucon = NURI_UCON_DEFAULT,
102 .ulcon = NURI_ULCON_DEFAULT,
103 .ufcon = NURI_UFCON_DEFAULT,
104 },
105};
106
107/* eMMC */
108static struct s3c_sdhci_platdata nuri_hsmmc0_data __initdata = {
109 .max_width = 8,
110 .host_caps = (MMC_CAP_8_BIT_DATA | MMC_CAP_4_BIT_DATA |
111 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
112 MMC_CAP_DISABLE | MMC_CAP_ERASE),
113 .cd_type = S3C_SDHCI_CD_PERMANENT,
114 .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
115};
116
117static struct regulator_consumer_supply emmc_supplies[] = {
118 REGULATOR_SUPPLY("vmmc", "s3c-sdhci.0"),
119 REGULATOR_SUPPLY("vmmc", "dw_mmc"),
120};
121
122static struct regulator_init_data emmc_fixed_voltage_init_data = {
123 .constraints = {
124 .name = "VMEM_VDD_2.8V",
125 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
126 },
127 .num_consumer_supplies = ARRAY_SIZE(emmc_supplies),
128 .consumer_supplies = emmc_supplies,
129};
130
131static struct fixed_voltage_config emmc_fixed_voltage_config = {
132 .supply_name = "MASSMEMORY_EN (inverted)",
133 .microvolts = 2800000,
134 .gpio = EXYNOS4_GPL1(1),
135 .enable_high = false,
136 .init_data = &emmc_fixed_voltage_init_data,
137};
138
139static struct platform_device emmc_fixed_voltage = {
140 .name = "reg-fixed-voltage",
141 .id = FIXED_REG_ID_MMC,
142 .dev = {
143 .platform_data = &emmc_fixed_voltage_config,
144 },
145};
146
147/* SD */
148static struct s3c_sdhci_platdata nuri_hsmmc2_data __initdata = {
149 .max_width = 4,
150 .host_caps = MMC_CAP_4_BIT_DATA |
151 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
152 MMC_CAP_DISABLE,
153 .ext_cd_gpio = EXYNOS4_GPX3(3), /* XEINT_27 */
154 .ext_cd_gpio_invert = 1,
155 .cd_type = S3C_SDHCI_CD_GPIO,
156 .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
157};
158
159/* WLAN */
160static struct s3c_sdhci_platdata nuri_hsmmc3_data __initdata = {
161 .max_width = 4,
162 .host_caps = MMC_CAP_4_BIT_DATA |
163 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
164 .cd_type = S3C_SDHCI_CD_EXTERNAL,
165 .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
166};
167
168static void __init nuri_sdhci_init(void)
169{
170 s3c_sdhci0_set_platdata(&nuri_hsmmc0_data);
171 s3c_sdhci2_set_platdata(&nuri_hsmmc2_data);
172 s3c_sdhci3_set_platdata(&nuri_hsmmc3_data);
173}
174
175/* GPIO KEYS */
176static struct gpio_keys_button nuri_gpio_keys_tables[] = {
177 {
178 .code = KEY_VOLUMEUP,
179 .gpio = EXYNOS4_GPX2(0), /* XEINT16 */
180 .desc = "gpio-keys: KEY_VOLUMEUP",
181 .type = EV_KEY,
182 .active_low = 1,
183 .debounce_interval = 1,
184 }, {
185 .code = KEY_VOLUMEDOWN,
186 .gpio = EXYNOS4_GPX2(1), /* XEINT17 */
187 .desc = "gpio-keys: KEY_VOLUMEDOWN",
188 .type = EV_KEY,
189 .active_low = 1,
190 .debounce_interval = 1,
191 }, {
192 .code = KEY_POWER,
193 .gpio = EXYNOS4_GPX2(7), /* XEINT23 */
194 .desc = "gpio-keys: KEY_POWER",
195 .type = EV_KEY,
196 .active_low = 1,
197 .wakeup = 1,
198 .debounce_interval = 1,
199 },
200};
201
202static struct gpio_keys_platform_data nuri_gpio_keys_data = {
203 .buttons = nuri_gpio_keys_tables,
204 .nbuttons = ARRAY_SIZE(nuri_gpio_keys_tables),
205};
206
207static struct platform_device nuri_gpio_keys = {
208 .name = "gpio-keys",
209 .dev = {
210 .platform_data = &nuri_gpio_keys_data,
211 },
212};
213
0d88f946
MS
214/* Frame Buffer */
215static struct s3c_fb_pd_win nuri_fb_win0 = {
216 .win_mode = {
217 .left_margin = 64,
218 .right_margin = 16,
219 .upper_margin = 64,
220 .lower_margin = 1,
221 .hsync_len = 48,
222 .vsync_len = 3,
7cc98aae
SN
223 .xres = 1024,
224 .yres = 600,
0d88f946
MS
225 .refresh = 60,
226 },
227 .max_bpp = 24,
228 .default_bpp = 16,
7cc98aae
SN
229 .virtual_x = 1024,
230 .virtual_y = 2 * 600,
0d88f946
MS
231};
232
233static struct s3c_fb_platdata nuri_fb_pdata __initdata = {
234 .win[0] = &nuri_fb_win0,
235 .vidcon0 = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB |
236 VIDCON0_CLKSEL_LCD,
237 .vidcon1 = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
238 .setup_gpio = exynos4_fimd0_gpio_setup_24bpp,
239};
240
cc7df872
DL
241static void nuri_lcd_power_on(struct plat_lcd_data *pd, unsigned int power)
242{
243 int gpio = EXYNOS4_GPE1(5);
244
245 gpio_request(gpio, "LVDS_nSHDN");
246 gpio_direction_output(gpio, power);
247 gpio_free(gpio);
248}
249
250static int nuri_bl_init(struct device *dev)
251{
321655ef
JH
252 return gpio_request_one(EXYNOS4_GPE2(3), GPIOF_OUT_INIT_LOW,
253 "LCD_LD0_EN");
cc7df872
DL
254}
255
256static int nuri_bl_notify(struct device *dev, int brightness)
257{
258 if (brightness < 1)
259 brightness = 0;
260
261 gpio_set_value(EXYNOS4_GPE2(3), 1);
262
263 return brightness;
264}
265
266static void nuri_bl_exit(struct device *dev)
267{
268 gpio_free(EXYNOS4_GPE2(3));
269}
270
271/* nuri pwm backlight */
272static struct platform_pwm_backlight_data nuri_backlight_data = {
273 .pwm_id = 0,
274 .pwm_period_ns = 30000,
275 .max_brightness = 100,
276 .dft_brightness = 50,
277 .init = nuri_bl_init,
278 .notify = nuri_bl_notify,
279 .exit = nuri_bl_exit,
280};
281
282static struct platform_device nuri_backlight_device = {
283 .name = "pwm-backlight",
284 .id = -1,
285 .dev = {
286 .parent = &s3c_device_timer[0].dev,
287 .platform_data = &nuri_backlight_data,
288 },
289};
290
291static struct plat_lcd_data nuri_lcd_platform_data = {
292 .set_power = nuri_lcd_power_on,
293};
294
295static struct platform_device nuri_lcd_device = {
296 .name = "platform-lcd",
297 .id = -1,
298 .dev = {
299 .platform_data = &nuri_lcd_platform_data,
300 },
301};
302
caf8b1f2
MK
303/* I2C1 */
304static struct i2c_board_info i2c1_devs[] __initdata = {
305 /* Gyro, To be updated */
306};
307
3260ecd8
JS
308/* TSP */
309static u8 mxt_init_vals[] = {
310 /* MXT_GEN_COMMAND(6) */
311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
312 /* MXT_GEN_POWER(7) */
313 0x20, 0xff, 0x32,
314 /* MXT_GEN_ACQUIRE(8) */
315 0x0a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x23,
316 /* MXT_TOUCH_MULTI(9) */
317 0x00, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00,
318 0x00, 0x01, 0x01, 0x0e, 0x0a, 0x0a, 0x0a, 0x0a, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320 0x00,
321 /* MXT_TOUCH_KEYARRAY(15) */
322 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
323 0x00,
324 /* MXT_SPT_GPIOPWM(19) */
325 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
327 /* MXT_PROCI_GRIPFACE(20) */
328 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x28, 0x04,
329 0x0f, 0x0a,
330 /* MXT_PROCG_NOISE(22) */
331 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x23, 0x00,
332 0x00, 0x05, 0x0f, 0x19, 0x23, 0x2d, 0x03,
333 /* MXT_TOUCH_PROXIMITY(23) */
334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
335 0x00, 0x00, 0x00, 0x00, 0x00,
336 /* MXT_PROCI_ONETOUCH(24) */
337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
339 /* MXT_SPT_SELFTEST(25) */
340 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
341 0x00, 0x00, 0x00, 0x00,
342 /* MXT_PROCI_TWOTOUCH(27) */
343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
344 /* MXT_SPT_CTECONFIG(28) */
345 0x00, 0x00, 0x02, 0x08, 0x10, 0x00,
346};
347
348static struct mxt_platform_data mxt_platform_data = {
349 .config = mxt_init_vals,
350 .config_length = ARRAY_SIZE(mxt_init_vals),
351
352 .x_line = 18,
353 .y_line = 11,
354 .x_size = 1024,
355 .y_size = 600,
356 .blen = 0x1,
357 .threshold = 0x28,
358 .voltage = 2800000, /* 2.8V */
359 .orient = MXT_DIAGONAL_COUNTER,
360 .irqflags = IRQF_TRIGGER_FALLING,
361};
362
363static struct s3c2410_platform_i2c i2c3_data __initdata = {
364 .flags = 0,
365 .bus_num = 3,
366 .slave_addr = 0x10,
367 .frequency = 400 * 1000,
368 .sda_delay = 100,
369};
370
371static struct i2c_board_info i2c3_devs[] __initdata = {
372 {
373 I2C_BOARD_INFO("atmel_mxt_ts", 0x4a),
374 .platform_data = &mxt_platform_data,
375 .irq = IRQ_EINT(4),
376 },
377};
378
379static void __init nuri_tsp_init(void)
380{
381 int gpio;
382
383 /* TOUCH_INT: XEINT_4 */
384 gpio = EXYNOS4_GPX0(4);
385 gpio_request(gpio, "TOUCH_INT");
386 s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf));
387 s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
388}
389
29dee863
MH
390static struct regulator_consumer_supply __initdata max8997_ldo1_[] = {
391 REGULATOR_SUPPLY("vdd", "s5p-adc"), /* Used by CPU's ADC drv */
392};
393static struct regulator_consumer_supply __initdata max8997_ldo3_[] = {
394 REGULATOR_SUPPLY("vdd11", "s5p-mipi-csis.0"), /* MIPI */
395};
396static struct regulator_consumer_supply __initdata max8997_ldo4_[] = {
397 REGULATOR_SUPPLY("vdd18", "s5p-mipi-csis.0"), /* MIPI */
398};
399static struct regulator_consumer_supply __initdata max8997_ldo5_[] = {
400 REGULATOR_SUPPLY("vhsic", "modemctl"), /* MODEM */
401};
402static struct regulator_consumer_supply __initdata max8997_ldo7_[] = {
403 REGULATOR_SUPPLY("dig_18", "0-001f"), /* HCD803 */
404};
405static struct regulator_consumer_supply __initdata max8997_ldo8_[] = {
406 REGULATOR_SUPPLY("vusb_d", NULL), /* Used by CPU */
407 REGULATOR_SUPPLY("vdac", NULL), /* Used by CPU */
408};
409static struct regulator_consumer_supply __initdata max8997_ldo11_[] = {
410 REGULATOR_SUPPLY("vcc", "platform-lcd"), /* U804 LVDS */
411};
412static struct regulator_consumer_supply __initdata max8997_ldo12_[] = {
413 REGULATOR_SUPPLY("vddio", "6-003c"), /* HDC802 */
414};
415static struct regulator_consumer_supply __initdata max8997_ldo13_[] = {
416 REGULATOR_SUPPLY("vmmc", "s3c-sdhci.2"), /* TFLASH */
417};
418static struct regulator_consumer_supply __initdata max8997_ldo14_[] = {
419 REGULATOR_SUPPLY("inmotor", "max8997-haptic"),
420};
421static struct regulator_consumer_supply __initdata max8997_ldo15_[] = {
422 REGULATOR_SUPPLY("avdd", "3-004a"), /* Touch Screen */
423};
424static struct regulator_consumer_supply __initdata max8997_ldo16_[] = {
425 REGULATOR_SUPPLY("d_sensor", "0-001f"), /* HDC803 */
426};
427static struct regulator_consumer_supply __initdata max8997_ldo18_[] = {
428 REGULATOR_SUPPLY("vdd", "3-004a"), /* Touch Screen */
429};
430static struct regulator_consumer_supply __initdata max8997_buck1_[] = {
431 REGULATOR_SUPPLY("vdd_arm", NULL), /* CPUFREQ */
432};
433static struct regulator_consumer_supply __initdata max8997_buck2_[] = {
434 REGULATOR_SUPPLY("vdd_int", NULL), /* CPUFREQ */
435};
436static struct regulator_consumer_supply __initdata max8997_buck3_[] = {
437 REGULATOR_SUPPLY("vdd", "mali_dev.0"), /* G3D of Exynos 4 */
438};
439static struct regulator_consumer_supply __initdata max8997_buck4_[] = {
440 REGULATOR_SUPPLY("core", "0-001f"), /* HDC803 */
441};
442static struct regulator_consumer_supply __initdata max8997_buck6_[] = {
443 REGULATOR_SUPPLY("dig_28", "0-001f"), /* pin "7" of HDC803 */
444};
445static struct regulator_consumer_supply __initdata max8997_esafeout1_[] = {
446 REGULATOR_SUPPLY("usb_vbus", NULL), /* CPU's USB OTG */
447};
448static struct regulator_consumer_supply __initdata max8997_esafeout2_[] = {
449 REGULATOR_SUPPLY("usb_vbus", "modemctl"), /* VBUS of Modem */
450};
451
452static struct regulator_consumer_supply __initdata max8997_charger_[] = {
453 REGULATOR_SUPPLY("vinchg1", "charger-manager.0"),
454};
455static struct regulator_consumer_supply __initdata max8997_chg_toff_[] = {
456 REGULATOR_SUPPLY("vinchg_stop", NULL), /* for jack interrupt handlers */
457};
458
459static struct regulator_consumer_supply __initdata max8997_32khz_ap_[] = {
460 REGULATOR_SUPPLY("gps_clk", "bcm4751"),
461 REGULATOR_SUPPLY("bt_clk", "bcm4330-b1"),
462 REGULATOR_SUPPLY("wifi_clk", "bcm433-b1"),
463};
464
465static struct regulator_init_data __initdata max8997_ldo1_data = {
466 .constraints = {
467 .name = "VADC_3.3V_C210",
468 .min_uV = 3300000,
469 .max_uV = 3300000,
470 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
471 .apply_uV = 1,
472 .state_mem = {
473 .disabled = 1,
474 },
475 },
476 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo1_),
477 .consumer_supplies = max8997_ldo1_,
478};
479
480static struct regulator_init_data __initdata max8997_ldo2_data = {
481 .constraints = {
482 .name = "VALIVE_1.1V_C210",
483 .min_uV = 1100000,
484 .max_uV = 1100000,
485 .apply_uV = 1,
486 .always_on = 1,
487 .state_mem = {
488 .enabled = 1,
489 },
490 },
491};
492
493static struct regulator_init_data __initdata max8997_ldo3_data = {
494 .constraints = {
495 .name = "VUSB_1.1V_C210",
496 .min_uV = 1100000,
497 .max_uV = 1100000,
498 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
499 .apply_uV = 1,
500 .state_mem = {
501 .disabled = 1,
502 },
503 },
504 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo3_),
505 .consumer_supplies = max8997_ldo3_,
506};
507
508static struct regulator_init_data __initdata max8997_ldo4_data = {
509 .constraints = {
510 .name = "VMIPI_1.8V",
511 .min_uV = 1800000,
512 .max_uV = 1800000,
513 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
514 .apply_uV = 1,
515 .state_mem = {
516 .disabled = 1,
517 },
518 },
519 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo4_),
520 .consumer_supplies = max8997_ldo4_,
521};
522
523static struct regulator_init_data __initdata max8997_ldo5_data = {
524 .constraints = {
525 .name = "VHSIC_1.2V_C210",
526 .min_uV = 1200000,
527 .max_uV = 1200000,
528 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
529 .apply_uV = 1,
530 .state_mem = {
531 .disabled = 1,
532 },
533 },
534 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo5_),
535 .consumer_supplies = max8997_ldo5_,
536};
537
538static struct regulator_init_data __initdata max8997_ldo6_data = {
539 .constraints = {
540 .name = "VCC_1.8V_PDA",
541 .min_uV = 1800000,
542 .max_uV = 1800000,
543 .apply_uV = 1,
544 .always_on = 1,
545 .state_mem = {
546 .enabled = 1,
547 },
548 },
549};
550
551static struct regulator_init_data __initdata max8997_ldo7_data = {
552 .constraints = {
553 .name = "CAM_ISP_1.8V",
554 .min_uV = 1800000,
555 .max_uV = 1800000,
556 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
557 .apply_uV = 1,
558 .state_mem = {
559 .disabled = 1,
560 },
561 },
562 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo7_),
563 .consumer_supplies = max8997_ldo7_,
564};
565
566static struct regulator_init_data __initdata max8997_ldo8_data = {
567 .constraints = {
568 .name = "VUSB/VDAC_3.3V_C210",
569 .min_uV = 3300000,
570 .max_uV = 3300000,
571 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
572 .apply_uV = 1,
573 .state_mem = {
574 .disabled = 1,
575 },
576 },
577 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo8_),
578 .consumer_supplies = max8997_ldo8_,
579};
580
581static struct regulator_init_data __initdata max8997_ldo9_data = {
582 .constraints = {
583 .name = "VCC_2.8V_PDA",
584 .min_uV = 2800000,
585 .max_uV = 2800000,
586 .apply_uV = 1,
587 .always_on = 1,
588 .state_mem = {
589 .enabled = 1,
590 },
591 },
592};
593
594static struct regulator_init_data __initdata max8997_ldo10_data = {
595 .constraints = {
596 .name = "VPLL_1.1V_C210",
597 .min_uV = 1100000,
598 .max_uV = 1100000,
599 .apply_uV = 1,
600 .always_on = 1,
601 .state_mem = {
602 .disabled = 1,
603 },
604 },
605};
606
607static struct regulator_init_data __initdata max8997_ldo11_data = {
608 .constraints = {
609 .name = "LVDS_VDD3.3V",
610 .min_uV = 3300000,
611 .max_uV = 3300000,
612 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
613 .apply_uV = 1,
614 .boot_on = 1,
615 .state_mem = {
616 .disabled = 1,
617 },
618 },
619 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo11_),
620 .consumer_supplies = max8997_ldo11_,
621};
622
623static struct regulator_init_data __initdata max8997_ldo12_data = {
624 .constraints = {
625 .name = "VT_CAM_1.8V",
626 .min_uV = 1800000,
627 .max_uV = 1800000,
628 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
629 .apply_uV = 1,
630 .state_mem = {
631 .disabled = 1,
632 },
633 },
634 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo12_),
635 .consumer_supplies = max8997_ldo12_,
636};
637
638static struct regulator_init_data __initdata max8997_ldo13_data = {
639 .constraints = {
640 .name = "VTF_2.8V",
641 .min_uV = 2800000,
642 .max_uV = 2800000,
643 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
644 .apply_uV = 1,
645 .state_mem = {
646 .disabled = 1,
647 },
648 },
649 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo13_),
650 .consumer_supplies = max8997_ldo13_,
651};
652
653static struct regulator_init_data __initdata max8997_ldo14_data = {
654 .constraints = {
655 .name = "VCC_3.0V_MOTOR",
656 .min_uV = 3000000,
657 .max_uV = 3000000,
658 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
659 .apply_uV = 1,
660 .state_mem = {
661 .disabled = 1,
662 },
663 },
664 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo14_),
665 .consumer_supplies = max8997_ldo14_,
666};
667
668static struct regulator_init_data __initdata max8997_ldo15_data = {
669 .constraints = {
670 .name = "VTOUCH_ADVV2.8V",
671 .min_uV = 2800000,
672 .max_uV = 2800000,
673 .apply_uV = 1,
674 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
675 .state_mem = {
676 .disabled = 1,
677 },
678 },
679 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo15_),
680 .consumer_supplies = max8997_ldo15_,
681};
682
683static struct regulator_init_data __initdata max8997_ldo16_data = {
684 .constraints = {
685 .name = "CAM_SENSOR_IO_1.8V",
686 .min_uV = 1800000,
687 .max_uV = 1800000,
688 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
689 .apply_uV = 1,
690 .state_mem = {
691 .disabled = 1,
692 },
693 },
694 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo16_),
695 .consumer_supplies = max8997_ldo16_,
696};
697
698static struct regulator_init_data __initdata max8997_ldo18_data = {
699 .constraints = {
700 .name = "VTOUCH_VDD2.8V",
701 .min_uV = 2800000,
702 .max_uV = 2800000,
703 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
704 .apply_uV = 1,
705 .state_mem = {
706 .disabled = 1,
707 },
708 },
709 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo18_),
710 .consumer_supplies = max8997_ldo18_,
711};
712
713static struct regulator_init_data __initdata max8997_ldo21_data = {
714 .constraints = {
715 .name = "VDDQ_M1M2_1.2V",
716 .min_uV = 1200000,
717 .max_uV = 1200000,
718 .apply_uV = 1,
719 .always_on = 1,
720 .state_mem = {
721 .disabled = 1,
722 },
723 },
724};
725
726static struct regulator_init_data __initdata max8997_buck1_data = {
727 .constraints = {
728 .name = "VARM_1.2V_C210",
729 .min_uV = 900000,
730 .max_uV = 1350000,
731 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
732 .always_on = 1,
733 .state_mem = {
734 .disabled = 1,
735 },
736 },
737 .num_consumer_supplies = ARRAY_SIZE(max8997_buck1_),
738 .consumer_supplies = max8997_buck1_,
739};
740
741static struct regulator_init_data __initdata max8997_buck2_data = {
742 .constraints = {
743 .name = "VINT_1.1V_C210",
744 .min_uV = 900000,
745 .max_uV = 1100000,
746 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
747 .always_on = 1,
748 .state_mem = {
749 .disabled = 1,
750 },
751 },
752 .num_consumer_supplies = ARRAY_SIZE(max8997_buck2_),
753 .consumer_supplies = max8997_buck2_,
754};
755
756static struct regulator_init_data __initdata max8997_buck3_data = {
757 .constraints = {
758 .name = "VG3D_1.1V_C210",
759 .min_uV = 900000,
760 .max_uV = 1100000,
761 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
762 REGULATOR_CHANGE_STATUS,
763 .state_mem = {
764 .disabled = 1,
765 },
766 },
767 .num_consumer_supplies = ARRAY_SIZE(max8997_buck3_),
768 .consumer_supplies = max8997_buck3_,
769};
770
771static struct regulator_init_data __initdata max8997_buck4_data = {
772 .constraints = {
773 .name = "CAM_ISP_CORE_1.2V",
774 .min_uV = 1200000,
775 .max_uV = 1200000,
776 .apply_uV = 1,
777 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
778 .state_mem = {
779 .disabled = 1,
780 },
781 },
782 .num_consumer_supplies = ARRAY_SIZE(max8997_buck4_),
783 .consumer_supplies = max8997_buck4_,
784};
785
786static struct regulator_init_data __initdata max8997_buck5_data = {
787 .constraints = {
788 .name = "VMEM_1.2V_C210",
789 .min_uV = 1200000,
790 .max_uV = 1200000,
791 .apply_uV = 1,
792 .always_on = 1,
793 .state_mem = {
794 .enabled = 1,
795 },
796 },
797};
798
799static struct regulator_init_data __initdata max8997_buck6_data = {
800 .constraints = {
801 .name = "CAM_AF_2.8V",
802 .min_uV = 2800000,
803 .max_uV = 2800000,
804 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
805 .state_mem = {
806 .disabled = 1,
807 },
808 },
809 .num_consumer_supplies = ARRAY_SIZE(max8997_buck6_),
810 .consumer_supplies = max8997_buck6_,
811};
812
813static struct regulator_init_data __initdata max8997_buck7_data = {
814 .constraints = {
815 .name = "VCC_SUB_2.0V",
816 .min_uV = 2000000,
817 .max_uV = 2000000,
818 .apply_uV = 1,
819 .always_on = 1,
820 .state_mem = {
821 .enabled = 1,
822 },
823 },
824};
825
826static struct regulator_init_data __initdata max8997_32khz_ap_data = {
827 .constraints = {
828 .name = "32KHz AP",
829 .always_on = 1,
830 .state_mem = {
831 .enabled = 1,
832 },
833 },
834 .num_consumer_supplies = ARRAY_SIZE(max8997_32khz_ap_),
835 .consumer_supplies = max8997_32khz_ap_,
836};
837
838static struct regulator_init_data __initdata max8997_32khz_cp_data = {
839 .constraints = {
840 .name = "32KHz CP",
841 .state_mem = {
842 .disabled = 1,
843 },
844 },
845};
846
847static struct regulator_init_data __initdata max8997_vichg_data = {
848 .constraints = {
849 .name = "VICHG",
850 .state_mem = {
851 .disabled = 1,
852 },
853 },
854};
855
856static struct regulator_init_data __initdata max8997_esafeout1_data = {
857 .constraints = {
858 .name = "SAFEOUT1",
859 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
860 .state_mem = {
861 .disabled = 1,
862 },
863 },
864 .num_consumer_supplies = ARRAY_SIZE(max8997_esafeout1_),
865 .consumer_supplies = max8997_esafeout1_,
866};
867
868static struct regulator_init_data __initdata max8997_esafeout2_data = {
869 .constraints = {
870 .name = "SAFEOUT2",
871 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
872 .state_mem = {
873 .disabled = 1,
874 },
875 },
876 .num_consumer_supplies = ARRAY_SIZE(max8997_esafeout2_),
877 .consumer_supplies = max8997_esafeout2_,
878};
879
880static struct regulator_init_data __initdata max8997_charger_cv_data = {
881 .constraints = {
882 .name = "CHARGER_CV",
883 .min_uV = 4200000,
884 .max_uV = 4200000,
885 .apply_uV = 1,
886 },
887};
888
889static struct regulator_init_data __initdata max8997_charger_data = {
890 .constraints = {
891 .name = "CHARGER",
892 .min_uA = 200000,
893 .max_uA = 950000,
894 .boot_on = 1,
895 .valid_ops_mask = REGULATOR_CHANGE_STATUS |
896 REGULATOR_CHANGE_CURRENT,
897 },
898 .num_consumer_supplies = ARRAY_SIZE(max8997_charger_),
899 .consumer_supplies = max8997_charger_,
900};
901
902static struct regulator_init_data __initdata max8997_charger_topoff_data = {
903 .constraints = {
904 .name = "CHARGER TOPOFF",
905 .min_uA = 50000,
906 .max_uA = 200000,
907 .valid_ops_mask = REGULATOR_CHANGE_CURRENT,
908 },
909 .num_consumer_supplies = ARRAY_SIZE(max8997_chg_toff_),
910 .consumer_supplies = max8997_chg_toff_,
911};
912
913static struct max8997_regulator_data __initdata nuri_max8997_regulators[] = {
914 { MAX8997_LDO1, &max8997_ldo1_data },
915 { MAX8997_LDO2, &max8997_ldo2_data },
916 { MAX8997_LDO3, &max8997_ldo3_data },
917 { MAX8997_LDO4, &max8997_ldo4_data },
918 { MAX8997_LDO5, &max8997_ldo5_data },
919 { MAX8997_LDO6, &max8997_ldo6_data },
920 { MAX8997_LDO7, &max8997_ldo7_data },
921 { MAX8997_LDO8, &max8997_ldo8_data },
922 { MAX8997_LDO9, &max8997_ldo9_data },
923 { MAX8997_LDO10, &max8997_ldo10_data },
924 { MAX8997_LDO11, &max8997_ldo11_data },
925 { MAX8997_LDO12, &max8997_ldo12_data },
926 { MAX8997_LDO13, &max8997_ldo13_data },
927 { MAX8997_LDO14, &max8997_ldo14_data },
928 { MAX8997_LDO15, &max8997_ldo15_data },
929 { MAX8997_LDO16, &max8997_ldo16_data },
930
931 { MAX8997_LDO18, &max8997_ldo18_data },
932 { MAX8997_LDO21, &max8997_ldo21_data },
933
934 { MAX8997_BUCK1, &max8997_buck1_data },
935 { MAX8997_BUCK2, &max8997_buck2_data },
936 { MAX8997_BUCK3, &max8997_buck3_data },
937 { MAX8997_BUCK4, &max8997_buck4_data },
938 { MAX8997_BUCK5, &max8997_buck5_data },
939 { MAX8997_BUCK6, &max8997_buck6_data },
940 { MAX8997_BUCK7, &max8997_buck7_data },
941
942 { MAX8997_EN32KHZ_AP, &max8997_32khz_ap_data },
943 { MAX8997_EN32KHZ_CP, &max8997_32khz_cp_data },
944
945 { MAX8997_ENVICHG, &max8997_vichg_data },
946 { MAX8997_ESAFEOUT1, &max8997_esafeout1_data },
947 { MAX8997_ESAFEOUT2, &max8997_esafeout2_data },
948 { MAX8997_CHARGER_CV, &max8997_charger_cv_data },
949 { MAX8997_CHARGER, &max8997_charger_data },
950 { MAX8997_CHARGER_TOPOFF, &max8997_charger_topoff_data },
951};
952
953static struct max8997_platform_data __initdata nuri_max8997_pdata = {
954 .wakeup = 1,
955
956 .num_regulators = ARRAY_SIZE(nuri_max8997_regulators),
957 .regulators = nuri_max8997_regulators,
958
959 .buck125_gpios = { EXYNOS4_GPX0(5), EXYNOS4_GPX0(6), EXYNOS4_GPL0(0) },
960 .buck2_gpiodvs = true,
961
962 .buck1_voltage[0] = 1350000, /* 1.35V */
963 .buck1_voltage[1] = 1300000, /* 1.3V */
964 .buck1_voltage[2] = 1250000, /* 1.25V */
965 .buck1_voltage[3] = 1200000, /* 1.2V */
966 .buck1_voltage[4] = 1150000, /* 1.15V */
967 .buck1_voltage[5] = 1100000, /* 1.1V */
968 .buck1_voltage[6] = 1000000, /* 1.0V */
969 .buck1_voltage[7] = 950000, /* 0.95V */
970
971 .buck2_voltage[0] = 1100000, /* 1.1V */
972 .buck2_voltage[1] = 1000000, /* 1.0V */
973 .buck2_voltage[2] = 950000, /* 0.95V */
974 .buck2_voltage[3] = 900000, /* 0.9V */
975 .buck2_voltage[4] = 1100000, /* 1.1V */
976 .buck2_voltage[5] = 1000000, /* 1.0V */
977 .buck2_voltage[6] = 950000, /* 0.95V */
978 .buck2_voltage[7] = 900000, /* 0.9V */
979
980 .buck5_voltage[0] = 1200000, /* 1.2V */
981 .buck5_voltage[1] = 1200000, /* 1.2V */
982 .buck5_voltage[2] = 1200000, /* 1.2V */
983 .buck5_voltage[3] = 1200000, /* 1.2V */
984 .buck5_voltage[4] = 1200000, /* 1.2V */
985 .buck5_voltage[5] = 1200000, /* 1.2V */
986 .buck5_voltage[6] = 1200000, /* 1.2V */
987 .buck5_voltage[7] = 1200000, /* 1.2V */
988};
989
caf8b1f2 990/* GPIO I2C 5 (PMIC) */
29dee863 991enum { I2C5_MAX8997 };
caf8b1f2 992static struct i2c_board_info i2c5_devs[] __initdata = {
29dee863
MH
993 [I2C5_MAX8997] = {
994 I2C_BOARD_INFO("max8997", 0xCC >> 1),
995 .platform_data = &nuri_max8997_pdata,
996 },
caf8b1f2
MK
997};
998
a140b92e
MH
999static struct max17042_platform_data nuri_battery_platform_data = {
1000};
1001
1002/* GPIO I2C 9 (Fuel Gauge) */
1003static struct i2c_gpio_platform_data i2c9_gpio_data = {
1004 .sda_pin = EXYNOS4_GPY4(0), /* XM0ADDR_8 */
1005 .scl_pin = EXYNOS4_GPY4(1), /* XM0ADDR_9 */
1006};
1007static struct platform_device i2c9_gpio = {
1008 .name = "i2c-gpio",
1009 .id = 9,
1010 .dev = {
1011 .platform_data = &i2c9_gpio_data,
1012 },
1013};
1014enum { I2C9_MAX17042};
1015static struct i2c_board_info i2c9_devs[] __initdata = {
1016 [I2C9_MAX17042] = {
1017 I2C_BOARD_INFO("max17042", 0x36),
1018 .platform_data = &nuri_battery_platform_data,
1019 },
1020};
1021
605baf67
MH
1022/* MAX8903 Secondary Charger */
1023static struct regulator_consumer_supply supplies_max8903[] = {
1024 REGULATOR_SUPPLY("vinchg2", "charger-manager.0"),
1025};
1026
1027static struct regulator_init_data max8903_charger_en_data = {
1028 .constraints = {
1029 .name = "VOUT_CHARGER",
1030 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
1031 .boot_on = 1,
1032 },
1033 .num_consumer_supplies = ARRAY_SIZE(supplies_max8903),
1034 .consumer_supplies = supplies_max8903,
1035};
1036
1037static struct fixed_voltage_config max8903_charger_en = {
1038 .supply_name = "VOUT_CHARGER",
1039 .microvolts = 5000000, /* Assume 5VDC */
1040 .gpio = EXYNOS4_GPY4(5), /* TA_EN negaged */
1041 .enable_high = 0, /* Enable = Low */
1042 .enabled_at_boot = 1,
1043 .init_data = &max8903_charger_en_data,
1044};
1045
1046static struct platform_device max8903_fixed_reg_dev = {
1047 .name = "reg-fixed-voltage",
1048 .id = FIXED_REG_ID_MAX8903,
1049 .dev = { .platform_data = &max8903_charger_en },
1050};
1051
1052static struct max8903_pdata nuri_max8903 = {
1053 /*
1054 * cen: don't control with the driver, let it be
1055 * controlled by regulator above
1056 */
1057 .dok = EXYNOS4_GPX1(4), /* TA_nCONNECTED */
1058 /* uok, usus: not connected */
1059 .chg = EXYNOS4_GPE2(0), /* TA_nCHG */
1060 /* flt: vcc_1.8V_pda */
1061 .dcm = EXYNOS4_GPL0(1), /* CURR_ADJ */
1062
1063 .dc_valid = true,
1064 .usb_valid = false, /* USB is not wired to MAX8903 */
1065};
1066
1067static struct platform_device nuri_max8903_device = {
1068 .name = "max8903-charger",
1069 .dev = {
1070 .platform_data = &nuri_max8903,
1071 },
1072};
1073
29dee863
MH
1074static void __init nuri_power_init(void)
1075{
1076 int gpio;
1077 int irq_base = IRQ_GPIO_END + 1;
605baf67 1078 int ta_en = 0;
29dee863
MH
1079
1080 nuri_max8997_pdata.irq_base = irq_base;
1081 irq_base += MAX8997_IRQ_NR;
1082
1083 gpio = EXYNOS4_GPX0(7);
1084 gpio_request(gpio, "AP_PMIC_IRQ");
1085 s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf));
1086 s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
a140b92e
MH
1087
1088 gpio = EXYNOS4_GPX2(3);
1089 gpio_request(gpio, "FUEL_ALERT");
1090 s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf));
1091 s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
605baf67
MH
1092
1093 gpio = nuri_max8903.dok;
1094 gpio_request(gpio, "TA_nCONNECTED");
1095 s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf));
1096 s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
1097 ta_en = gpio_get_value(gpio) ? 0 : 1;
1098
1099 gpio = nuri_max8903.chg;
1100 gpio_request(gpio, "TA_nCHG");
1101 gpio_direction_input(gpio);
1102
1103 gpio = nuri_max8903.dcm;
1104 gpio_request(gpio, "CURR_ADJ");
1105 gpio_direction_output(gpio, ta_en);
29dee863
MH
1106}
1107
01da92f7
JS
1108/* USB EHCI */
1109static struct s5p_ehci_platdata nuri_ehci_pdata;
1110
1111static void __init nuri_ehci_init(void)
1112{
1113 struct s5p_ehci_platdata *pdata = &nuri_ehci_pdata;
1114
1115 s5p_ehci_set_platdata(pdata);
1116}
1117
716e84d1
SN
1118/* CAMERA */
1119static struct regulator_consumer_supply cam_vdda_supply[] = {
1120 REGULATOR_SUPPLY("a_sensor", "0-001f"),
1121};
1122
1123static struct regulator_init_data cam_vdda_reg_init_data = {
1124 .constraints = { .valid_ops_mask = REGULATOR_CHANGE_STATUS },
1125 .num_consumer_supplies = ARRAY_SIZE(cam_vdda_supply),
1126 .consumer_supplies = cam_vdda_supply,
1127};
1128
1129static struct fixed_voltage_config cam_vdda_fixed_voltage_cfg = {
1130 .supply_name = "CAM_IO_EN",
1131 .microvolts = 2800000,
1132 .gpio = EXYNOS4_GPE2(1), /* CAM_IO_EN */
1133 .enable_high = 1,
1134 .init_data = &cam_vdda_reg_init_data,
1135};
1136
1137static struct platform_device cam_vdda_fixed_rdev = {
1138 .name = "reg-fixed-voltage", .id = FIXED_REG_ID_CAM_A28V,
1139 .dev = { .platform_data = &cam_vdda_fixed_voltage_cfg },
1140};
1141
1142static struct regulator_consumer_supply camera_8m_12v_supply =
1143 REGULATOR_SUPPLY("dig_12", "0-001f");
1144
1145static struct regulator_init_data cam_8m_12v_reg_init_data = {
1146 .num_consumer_supplies = 1,
1147 .consumer_supplies = &camera_8m_12v_supply,
1148 .constraints = {
1149 .valid_ops_mask = REGULATOR_CHANGE_STATUS
1150 },
1151};
1152
1153static struct fixed_voltage_config cam_8m_12v_fixed_voltage_cfg = {
1154 .supply_name = "8M_1.2V",
1155 .microvolts = 1200000,
1156 .gpio = EXYNOS4_GPE2(5), /* 8M_1.2V_EN */
1157 .enable_high = 1,
1158 .init_data = &cam_8m_12v_reg_init_data,
1159};
1160
1161static struct platform_device cam_8m_12v_fixed_rdev = {
1162 .name = "reg-fixed-voltage", .id = FIXED_REG_ID_CAM_12V,
1163 .dev = { .platform_data = &cam_8m_12v_fixed_voltage_cfg },
1164};
1165
1166static struct s5p_platform_mipi_csis mipi_csis_platdata = {
1167 .clk_rate = 166000000UL,
1168 .lanes = 2,
1169 .alignment = 32,
1170 .hs_settle = 12,
1171 .phy_enable = s5p_csis_phy_enable,
1172};
1173
1174#define GPIO_CAM_MEGA_RST EXYNOS4_GPY3(7) /* ISP_RESET */
1175#define GPIO_CAM_8M_ISP_INT EXYNOS4_GPL2(5)
1176
1177static struct m5mols_platform_data m5mols_platdata = {
1178 .gpio_reset = GPIO_CAM_MEGA_RST,
1179};
1180
1181static struct i2c_board_info m5mols_board_info = {
1182 I2C_BOARD_INFO("M5MOLS", 0x1F),
1183 .platform_data = &m5mols_platdata,
1184};
1185
1186static struct s5p_fimc_isp_info nuri_camera_sensors[] = {
1187 {
1188 .flags = V4L2_MBUS_PCLK_SAMPLE_FALLING |
1189 V4L2_MBUS_VSYNC_ACTIVE_LOW,
1190 .bus_type = FIMC_MIPI_CSI2,
1191 .board_info = &m5mols_board_info,
1192 .clk_frequency = 24000000UL,
1193 .csi_data_align = 32,
1194 },
1195};
1196
1197static struct s5p_platform_fimc fimc_md_platdata = {
1198 .isp_info = nuri_camera_sensors,
1199 .num_clients = ARRAY_SIZE(nuri_camera_sensors),
1200};
1201
1202static struct gpio nuri_camera_gpios[] = {
1203 { GPIO_CAM_8M_ISP_INT, GPIOF_IN, "8M_ISP_INT" },
1204 { GPIO_CAM_MEGA_RST, GPIOF_OUT_INIT_LOW, "CAM_8M_NRST" },
1205};
1206
1207static void nuri_camera_init(void)
1208{
1209 s3c_set_platdata(&mipi_csis_platdata, sizeof(mipi_csis_platdata),
1210 &s5p_device_mipi_csis0);
1211 s3c_set_platdata(&fimc_md_platdata, sizeof(fimc_md_platdata),
1212 &s5p_device_fimc_md);
1213
1214 if (gpio_request_array(nuri_camera_gpios,
1215 ARRAY_SIZE(nuri_camera_gpios))) {
1216 pr_err("%s: GPIO request failed\n", __func__);
1217 return;
1218 }
1219
1220 m5mols_board_info.irq = s5p_register_gpio_interrupt(GPIO_CAM_8M_ISP_INT);
1221 if (!IS_ERR_VALUE(m5mols_board_info.irq))
1222 s3c_gpio_cfgpin(GPIO_CAM_8M_ISP_INT, S3C_GPIO_SFN(0xF));
1223 else
1224 pr_err("%s: Failed to configure 8M_ISP_INT GPIO\n", __func__);
1225
1226 /* Free GPIOs controlled directly by the sensor drivers. */
1227 gpio_free(GPIO_CAM_MEGA_RST);
1228
1229 if (exynos4_fimc_setup_gpio(S5P_CAMPORT_A)) {
1230 pr_err("%s: Camera port A setup failed\n", __func__);
1231 return;
1232 }
1233 /* Increase drive strength of the sensor clock output */
1234 s5p_gpio_set_drvstr(EXYNOS4_GPJ1(3), S5P_GPIO_DRVSTR_LV4);
1235}
1236
1237static struct s3c2410_platform_i2c nuri_i2c0_platdata __initdata = {
1238 .frequency = 400000U,
1239 .sda_delay = 200,
1240};
1241
caf8b1f2
MK
1242static struct platform_device *nuri_devices[] __initdata = {
1243 /* Samsung Platform Devices */
29dee863 1244 &s3c_device_i2c5, /* PMIC should initialize first */
716e84d1 1245 &s3c_device_i2c0,
caf8b1f2 1246 &emmc_fixed_voltage,
716e84d1
SN
1247 &s5p_device_mipi_csis0,
1248 &s5p_device_fimc0,
1249 &s5p_device_fimc1,
1250 &s5p_device_fimc2,
1251 &s5p_device_fimc3,
0d88f946 1252 &s5p_device_fimd0,
caf8b1f2
MK
1253 &s3c_device_hsmmc0,
1254 &s3c_device_hsmmc2,
1255 &s3c_device_hsmmc3,
1256 &s3c_device_wdt,
cc7df872 1257 &s3c_device_timer[0],
01da92f7 1258 &s5p_device_ehci,
3260ecd8 1259 &s3c_device_i2c3,
a140b92e 1260 &i2c9_gpio,
ed9ba31f 1261 &s3c_device_adc,
3a1a2b9e 1262 &s3c_device_rtc,
4c0f0a3e
MS
1263 &s5p_device_mfc,
1264 &s5p_device_mfc_l,
1265 &s5p_device_mfc_r,
1266 &exynos4_device_pd[PD_MFC],
0d88f946 1267 &exynos4_device_pd[PD_LCD0],
716e84d1
SN
1268 &exynos4_device_pd[PD_CAM],
1269 &s5p_device_fimc_md,
caf8b1f2
MK
1270
1271 /* NURI Devices */
1272 &nuri_gpio_keys,
cc7df872
DL
1273 &nuri_lcd_device,
1274 &nuri_backlight_device,
605baf67
MH
1275 &max8903_fixed_reg_dev,
1276 &nuri_max8903_device,
716e84d1
SN
1277 &cam_vdda_fixed_rdev,
1278 &cam_8m_12v_fixed_rdev,
caf8b1f2
MK
1279};
1280
1281static void __init nuri_map_io(void)
1282{
cc511b8d 1283 exynos_init_io(NULL, 0);
caf8b1f2
MK
1284 s3c24xx_init_clocks(24000000);
1285 s3c24xx_init_uarts(nuri_uartcfgs, ARRAY_SIZE(nuri_uartcfgs));
1286}
1287
4c0f0a3e
MS
1288static void __init nuri_reserve(void)
1289{
1290 s5p_mfc_reserve_mem(0x43000000, 8 << 20, 0x51000000, 8 << 20);
1291}
1292
caf8b1f2
MK
1293static void __init nuri_machine_init(void)
1294{
1295 nuri_sdhci_init();
3260ecd8 1296 nuri_tsp_init();
29dee863 1297 nuri_power_init();
caf8b1f2 1298
716e84d1 1299 s3c_i2c0_set_platdata(&nuri_i2c0_platdata);
caf8b1f2 1300 i2c_register_board_info(1, i2c1_devs, ARRAY_SIZE(i2c1_devs));
3260ecd8
JS
1301 s3c_i2c3_set_platdata(&i2c3_data);
1302 i2c_register_board_info(3, i2c3_devs, ARRAY_SIZE(i2c3_devs));
29dee863
MH
1303 s3c_i2c5_set_platdata(NULL);
1304 i2c5_devs[I2C5_MAX8997].irq = gpio_to_irq(EXYNOS4_GPX0(7));
caf8b1f2 1305 i2c_register_board_info(5, i2c5_devs, ARRAY_SIZE(i2c5_devs));
a140b92e
MH
1306 i2c9_devs[I2C9_MAX17042].irq = gpio_to_irq(EXYNOS4_GPX2(3));
1307 i2c_register_board_info(9, i2c9_devs, ARRAY_SIZE(i2c9_devs));
caf8b1f2 1308
0d88f946
MS
1309 s5p_fimd0_set_platdata(&nuri_fb_pdata);
1310
716e84d1
SN
1311 nuri_camera_init();
1312
01da92f7
JS
1313 nuri_ehci_init();
1314 clk_xusbxti.rate = 24000000;
1315
caf8b1f2
MK
1316 /* Last */
1317 platform_add_devices(nuri_devices, ARRAY_SIZE(nuri_devices));
4c0f0a3e 1318 s5p_device_mfc.dev.parent = &exynos4_device_pd[PD_MFC].dev;
0d88f946 1319 s5p_device_fimd0.dev.parent = &exynos4_device_pd[PD_LCD0].dev;
716e84d1
SN
1320
1321 s5p_device_fimc0.dev.parent = &exynos4_device_pd[PD_CAM].dev;
1322 s5p_device_fimc1.dev.parent = &exynos4_device_pd[PD_CAM].dev;
1323 s5p_device_fimc2.dev.parent = &exynos4_device_pd[PD_CAM].dev;
1324 s5p_device_fimc3.dev.parent = &exynos4_device_pd[PD_CAM].dev;
1325 s5p_device_mipi_csis0.dev.parent = &exynos4_device_pd[PD_CAM].dev;
caf8b1f2
MK
1326}
1327
1328MACHINE_START(NURI, "NURI")
1329 /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */
2be5a4a7 1330 .atag_offset = 0x100,
caf8b1f2
MK
1331 .init_irq = exynos4_init_irq,
1332 .map_io = nuri_map_io,
4e44d2cb 1333 .handle_irq = gic_handle_irq,
caf8b1f2
MK
1334 .init_machine = nuri_machine_init,
1335 .timer = &exynos4_timer,
4c0f0a3e 1336 .reserve = &nuri_reserve,
9eb48595 1337 .restart = exynos4_restart,
caf8b1f2 1338MACHINE_END