2 * linux/arch/arm/mach-exynos4/mach-nuri.c
4 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
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.
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/i2c/atmel_mxt_ts.h>
16 #include <linux/i2c-gpio.h>
17 #include <linux/gpio_keys.h>
18 #include <linux/gpio.h>
19 #include <linux/power/max8903_charger.h>
20 #include <linux/power/max17042_battery.h>
21 #include <linux/regulator/machine.h>
22 #include <linux/regulator/fixed.h>
23 #include <linux/mfd/max8997.h>
24 #include <linux/mfd/max8997-private.h>
25 #include <linux/mmc/host.h>
27 #include <linux/pwm_backlight.h>
29 #include <video/platform_lcd.h>
30 #include <media/m5mols.h>
31 #include <media/s5p_fimc.h>
32 #include <media/v4l2-mediabus.h>
34 #include <asm/mach/arch.h>
35 #include <asm/hardware/gic.h>
36 #include <asm/mach-types.h>
39 #include <plat/regs-fb-v4.h>
40 #include <plat/regs-serial.h>
42 #include <plat/devs.h>
44 #include <plat/sdhci.h>
45 #include <plat/ehci.h>
46 #include <plat/clock.h>
47 #include <plat/gpio-cfg.h>
51 #include <plat/fimc-core.h>
52 #include <plat/camport.h>
53 #include <plat/mipi_csis.h>
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)
67 #define NURI_ULCON_DEFAULT S3C2410_LCON_CS8
69 #define NURI_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE | \
70 S5PV210_UFCON_TXTRIG256 | \
71 S5PV210_UFCON_RXTRIG256)
73 enum fixed_regulator_id
{
76 FIXED_REG_ID_CAM_A28V
,
80 static struct s3c2410_uartcfg nuri_uartcfgs
[] __initdata
= {
83 .ucon
= NURI_UCON_DEFAULT
,
84 .ulcon
= NURI_ULCON_DEFAULT
,
85 .ufcon
= NURI_UFCON_DEFAULT
,
89 .ucon
= NURI_UCON_DEFAULT
,
90 .ulcon
= NURI_ULCON_DEFAULT
,
91 .ufcon
= NURI_UFCON_DEFAULT
,
95 .ucon
= NURI_UCON_DEFAULT
,
96 .ulcon
= NURI_ULCON_DEFAULT
,
97 .ufcon
= NURI_UFCON_DEFAULT
,
101 .ucon
= NURI_UCON_DEFAULT
,
102 .ulcon
= NURI_ULCON_DEFAULT
,
103 .ufcon
= NURI_UFCON_DEFAULT
,
108 static struct s3c_sdhci_platdata nuri_hsmmc0_data __initdata
= {
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
,
117 static struct regulator_consumer_supply emmc_supplies
[] = {
118 REGULATOR_SUPPLY("vmmc", "s3c-sdhci.0"),
119 REGULATOR_SUPPLY("vmmc", "dw_mmc"),
122 static struct regulator_init_data emmc_fixed_voltage_init_data
= {
124 .name
= "VMEM_VDD_2.8V",
125 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
127 .num_consumer_supplies
= ARRAY_SIZE(emmc_supplies
),
128 .consumer_supplies
= emmc_supplies
,
131 static 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
,
139 static struct platform_device emmc_fixed_voltage
= {
140 .name
= "reg-fixed-voltage",
141 .id
= FIXED_REG_ID_MMC
,
143 .platform_data
= &emmc_fixed_voltage_config
,
148 static struct s3c_sdhci_platdata nuri_hsmmc2_data __initdata
= {
150 .host_caps
= MMC_CAP_4_BIT_DATA
|
151 MMC_CAP_MMC_HIGHSPEED
| MMC_CAP_SD_HIGHSPEED
|
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
,
160 static struct s3c_sdhci_platdata nuri_hsmmc3_data __initdata
= {
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
,
168 static void __init
nuri_sdhci_init(void)
170 s3c_sdhci0_set_platdata(&nuri_hsmmc0_data
);
171 s3c_sdhci2_set_platdata(&nuri_hsmmc2_data
);
172 s3c_sdhci3_set_platdata(&nuri_hsmmc3_data
);
176 static struct gpio_keys_button nuri_gpio_keys_tables
[] = {
178 .code
= KEY_VOLUMEUP
,
179 .gpio
= EXYNOS4_GPX2(0), /* XEINT16 */
180 .desc
= "gpio-keys: KEY_VOLUMEUP",
183 .debounce_interval
= 1,
185 .code
= KEY_VOLUMEDOWN
,
186 .gpio
= EXYNOS4_GPX2(1), /* XEINT17 */
187 .desc
= "gpio-keys: KEY_VOLUMEDOWN",
190 .debounce_interval
= 1,
193 .gpio
= EXYNOS4_GPX2(7), /* XEINT23 */
194 .desc
= "gpio-keys: KEY_POWER",
198 .debounce_interval
= 1,
202 static struct gpio_keys_platform_data nuri_gpio_keys_data
= {
203 .buttons
= nuri_gpio_keys_tables
,
204 .nbuttons
= ARRAY_SIZE(nuri_gpio_keys_tables
),
207 static struct platform_device nuri_gpio_keys
= {
210 .platform_data
= &nuri_gpio_keys_data
,
215 static struct s3c_fb_pd_win nuri_fb_win0
= {
230 .virtual_y
= 2 * 600,
233 static struct s3c_fb_platdata nuri_fb_pdata __initdata
= {
234 .win
[0] = &nuri_fb_win0
,
235 .vidcon0
= VIDCON0_VIDOUT_RGB
| VIDCON0_PNRMODE_RGB
|
237 .vidcon1
= VIDCON1_INV_HSYNC
| VIDCON1_INV_VSYNC
,
238 .setup_gpio
= exynos4_fimd0_gpio_setup_24bpp
,
241 static void nuri_lcd_power_on(struct plat_lcd_data
*pd
, unsigned int power
)
243 int gpio
= EXYNOS4_GPE1(5);
245 gpio_request(gpio
, "LVDS_nSHDN");
246 gpio_direction_output(gpio
, power
);
250 static int nuri_bl_init(struct device
*dev
)
252 return gpio_request_one(EXYNOS4_GPE2(3), GPIOF_OUT_INIT_LOW
,
256 static int nuri_bl_notify(struct device
*dev
, int brightness
)
261 gpio_set_value(EXYNOS4_GPE2(3), 1);
266 static void nuri_bl_exit(struct device
*dev
)
268 gpio_free(EXYNOS4_GPE2(3));
271 /* nuri pwm backlight */
272 static struct platform_pwm_backlight_data nuri_backlight_data
= {
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
,
282 static struct platform_device nuri_backlight_device
= {
283 .name
= "pwm-backlight",
286 .parent
= &s3c_device_timer
[0].dev
,
287 .platform_data
= &nuri_backlight_data
,
291 static struct plat_lcd_data nuri_lcd_platform_data
= {
292 .set_power
= nuri_lcd_power_on
,
295 static struct platform_device nuri_lcd_device
= {
296 .name
= "platform-lcd",
299 .platform_data
= &nuri_lcd_platform_data
,
304 static struct i2c_board_info i2c1_devs
[] __initdata
= {
305 /* Gyro, To be updated */
309 static u8 mxt_init_vals
[] = {
310 /* MXT_GEN_COMMAND(6) */
311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
312 /* MXT_GEN_POWER(7) */
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,
321 /* MXT_TOUCH_KEYARRAY(15) */
322 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 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,
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,
348 static struct mxt_platform_data mxt_platform_data
= {
349 .config
= mxt_init_vals
,
350 .config_length
= ARRAY_SIZE(mxt_init_vals
),
358 .voltage
= 2800000, /* 2.8V */
359 .orient
= MXT_DIAGONAL_COUNTER
,
360 .irqflags
= IRQF_TRIGGER_FALLING
,
363 static struct s3c2410_platform_i2c i2c3_data __initdata
= {
367 .frequency
= 400 * 1000,
371 static struct i2c_board_info i2c3_devs
[] __initdata
= {
373 I2C_BOARD_INFO("atmel_mxt_ts", 0x4a),
374 .platform_data
= &mxt_platform_data
,
379 static void __init
nuri_tsp_init(void)
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
);
390 static struct regulator_consumer_supply __initdata max8997_ldo1_
[] = {
391 REGULATOR_SUPPLY("vdd", "s5p-adc"), /* Used by CPU's ADC drv */
393 static struct regulator_consumer_supply __initdata max8997_ldo3_
[] = {
394 REGULATOR_SUPPLY("vdd11", "s5p-mipi-csis.0"), /* MIPI */
396 static struct regulator_consumer_supply __initdata max8997_ldo4_
[] = {
397 REGULATOR_SUPPLY("vdd18", "s5p-mipi-csis.0"), /* MIPI */
399 static struct regulator_consumer_supply __initdata max8997_ldo5_
[] = {
400 REGULATOR_SUPPLY("vhsic", "modemctl"), /* MODEM */
402 static struct regulator_consumer_supply __initdata max8997_ldo7_
[] = {
403 REGULATOR_SUPPLY("dig_18", "0-001f"), /* HCD803 */
405 static struct regulator_consumer_supply __initdata max8997_ldo8_
[] = {
406 REGULATOR_SUPPLY("vusb_d", NULL
), /* Used by CPU */
407 REGULATOR_SUPPLY("vdac", NULL
), /* Used by CPU */
409 static struct regulator_consumer_supply __initdata max8997_ldo11_
[] = {
410 REGULATOR_SUPPLY("vcc", "platform-lcd"), /* U804 LVDS */
412 static struct regulator_consumer_supply __initdata max8997_ldo12_
[] = {
413 REGULATOR_SUPPLY("vddio", "6-003c"), /* HDC802 */
415 static struct regulator_consumer_supply __initdata max8997_ldo13_
[] = {
416 REGULATOR_SUPPLY("vmmc", "s3c-sdhci.2"), /* TFLASH */
418 static struct regulator_consumer_supply __initdata max8997_ldo14_
[] = {
419 REGULATOR_SUPPLY("inmotor", "max8997-haptic"),
421 static struct regulator_consumer_supply __initdata max8997_ldo15_
[] = {
422 REGULATOR_SUPPLY("avdd", "3-004a"), /* Touch Screen */
424 static struct regulator_consumer_supply __initdata max8997_ldo16_
[] = {
425 REGULATOR_SUPPLY("d_sensor", "0-001f"), /* HDC803 */
427 static struct regulator_consumer_supply __initdata max8997_ldo18_
[] = {
428 REGULATOR_SUPPLY("vdd", "3-004a"), /* Touch Screen */
430 static struct regulator_consumer_supply __initdata max8997_buck1_
[] = {
431 REGULATOR_SUPPLY("vdd_arm", NULL
), /* CPUFREQ */
433 static struct regulator_consumer_supply __initdata max8997_buck2_
[] = {
434 REGULATOR_SUPPLY("vdd_int", NULL
), /* CPUFREQ */
436 static struct regulator_consumer_supply __initdata max8997_buck3_
[] = {
437 REGULATOR_SUPPLY("vdd", "mali_dev.0"), /* G3D of Exynos 4 */
439 static struct regulator_consumer_supply __initdata max8997_buck4_
[] = {
440 REGULATOR_SUPPLY("core", "0-001f"), /* HDC803 */
442 static struct regulator_consumer_supply __initdata max8997_buck6_
[] = {
443 REGULATOR_SUPPLY("dig_28", "0-001f"), /* pin "7" of HDC803 */
445 static struct regulator_consumer_supply __initdata max8997_esafeout1_
[] = {
446 REGULATOR_SUPPLY("usb_vbus", NULL
), /* CPU's USB OTG */
448 static struct regulator_consumer_supply __initdata max8997_esafeout2_
[] = {
449 REGULATOR_SUPPLY("usb_vbus", "modemctl"), /* VBUS of Modem */
452 static struct regulator_consumer_supply __initdata max8997_charger_
[] = {
453 REGULATOR_SUPPLY("vinchg1", "charger-manager.0"),
455 static struct regulator_consumer_supply __initdata max8997_chg_toff_
[] = {
456 REGULATOR_SUPPLY("vinchg_stop", NULL
), /* for jack interrupt handlers */
459 static 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"),
465 static struct regulator_init_data __initdata max8997_ldo1_data
= {
467 .name
= "VADC_3.3V_C210",
470 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
476 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo1_
),
477 .consumer_supplies
= max8997_ldo1_
,
480 static struct regulator_init_data __initdata max8997_ldo2_data
= {
482 .name
= "VALIVE_1.1V_C210",
493 static struct regulator_init_data __initdata max8997_ldo3_data
= {
495 .name
= "VUSB_1.1V_C210",
498 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
504 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo3_
),
505 .consumer_supplies
= max8997_ldo3_
,
508 static struct regulator_init_data __initdata max8997_ldo4_data
= {
510 .name
= "VMIPI_1.8V",
513 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
519 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo4_
),
520 .consumer_supplies
= max8997_ldo4_
,
523 static struct regulator_init_data __initdata max8997_ldo5_data
= {
525 .name
= "VHSIC_1.2V_C210",
528 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
534 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo5_
),
535 .consumer_supplies
= max8997_ldo5_
,
538 static struct regulator_init_data __initdata max8997_ldo6_data
= {
540 .name
= "VCC_1.8V_PDA",
551 static struct regulator_init_data __initdata max8997_ldo7_data
= {
553 .name
= "CAM_ISP_1.8V",
556 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
562 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo7_
),
563 .consumer_supplies
= max8997_ldo7_
,
566 static struct regulator_init_data __initdata max8997_ldo8_data
= {
568 .name
= "VUSB/VDAC_3.3V_C210",
571 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
577 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo8_
),
578 .consumer_supplies
= max8997_ldo8_
,
581 static struct regulator_init_data __initdata max8997_ldo9_data
= {
583 .name
= "VCC_2.8V_PDA",
594 static struct regulator_init_data __initdata max8997_ldo10_data
= {
596 .name
= "VPLL_1.1V_C210",
607 static struct regulator_init_data __initdata max8997_ldo11_data
= {
609 .name
= "LVDS_VDD3.3V",
612 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
619 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo11_
),
620 .consumer_supplies
= max8997_ldo11_
,
623 static struct regulator_init_data __initdata max8997_ldo12_data
= {
625 .name
= "VT_CAM_1.8V",
628 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
634 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo12_
),
635 .consumer_supplies
= max8997_ldo12_
,
638 static struct regulator_init_data __initdata max8997_ldo13_data
= {
643 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
649 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo13_
),
650 .consumer_supplies
= max8997_ldo13_
,
653 static struct regulator_init_data __initdata max8997_ldo14_data
= {
655 .name
= "VCC_3.0V_MOTOR",
658 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
664 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo14_
),
665 .consumer_supplies
= max8997_ldo14_
,
668 static struct regulator_init_data __initdata max8997_ldo15_data
= {
670 .name
= "VTOUCH_ADVV2.8V",
674 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
679 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo15_
),
680 .consumer_supplies
= max8997_ldo15_
,
683 static struct regulator_init_data __initdata max8997_ldo16_data
= {
685 .name
= "CAM_SENSOR_IO_1.8V",
688 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
694 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo16_
),
695 .consumer_supplies
= max8997_ldo16_
,
698 static struct regulator_init_data __initdata max8997_ldo18_data
= {
700 .name
= "VTOUCH_VDD2.8V",
703 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
709 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo18_
),
710 .consumer_supplies
= max8997_ldo18_
,
713 static struct regulator_init_data __initdata max8997_ldo21_data
= {
715 .name
= "VDDQ_M1M2_1.2V",
726 static struct regulator_init_data __initdata max8997_buck1_data
= {
728 .name
= "VARM_1.2V_C210",
731 .valid_ops_mask
= REGULATOR_CHANGE_VOLTAGE
,
737 .num_consumer_supplies
= ARRAY_SIZE(max8997_buck1_
),
738 .consumer_supplies
= max8997_buck1_
,
741 static struct regulator_init_data __initdata max8997_buck2_data
= {
743 .name
= "VINT_1.1V_C210",
746 .valid_ops_mask
= REGULATOR_CHANGE_VOLTAGE
,
752 .num_consumer_supplies
= ARRAY_SIZE(max8997_buck2_
),
753 .consumer_supplies
= max8997_buck2_
,
756 static struct regulator_init_data __initdata max8997_buck3_data
= {
758 .name
= "VG3D_1.1V_C210",
761 .valid_ops_mask
= REGULATOR_CHANGE_VOLTAGE
|
762 REGULATOR_CHANGE_STATUS
,
767 .num_consumer_supplies
= ARRAY_SIZE(max8997_buck3_
),
768 .consumer_supplies
= max8997_buck3_
,
771 static struct regulator_init_data __initdata max8997_buck4_data
= {
773 .name
= "CAM_ISP_CORE_1.2V",
777 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
782 .num_consumer_supplies
= ARRAY_SIZE(max8997_buck4_
),
783 .consumer_supplies
= max8997_buck4_
,
786 static struct regulator_init_data __initdata max8997_buck5_data
= {
788 .name
= "VMEM_1.2V_C210",
799 static struct regulator_init_data __initdata max8997_buck6_data
= {
801 .name
= "CAM_AF_2.8V",
804 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
809 .num_consumer_supplies
= ARRAY_SIZE(max8997_buck6_
),
810 .consumer_supplies
= max8997_buck6_
,
813 static struct regulator_init_data __initdata max8997_buck7_data
= {
815 .name
= "VCC_SUB_2.0V",
826 static struct regulator_init_data __initdata max8997_32khz_ap_data
= {
834 .num_consumer_supplies
= ARRAY_SIZE(max8997_32khz_ap_
),
835 .consumer_supplies
= max8997_32khz_ap_
,
838 static struct regulator_init_data __initdata max8997_32khz_cp_data
= {
847 static struct regulator_init_data __initdata max8997_vichg_data
= {
856 static struct regulator_init_data __initdata max8997_esafeout1_data
= {
859 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
864 .num_consumer_supplies
= ARRAY_SIZE(max8997_esafeout1_
),
865 .consumer_supplies
= max8997_esafeout1_
,
868 static struct regulator_init_data __initdata max8997_esafeout2_data
= {
871 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
876 .num_consumer_supplies
= ARRAY_SIZE(max8997_esafeout2_
),
877 .consumer_supplies
= max8997_esafeout2_
,
880 static struct regulator_init_data __initdata max8997_charger_cv_data
= {
882 .name
= "CHARGER_CV",
889 static struct regulator_init_data __initdata max8997_charger_data
= {
895 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
|
896 REGULATOR_CHANGE_CURRENT
,
898 .num_consumer_supplies
= ARRAY_SIZE(max8997_charger_
),
899 .consumer_supplies
= max8997_charger_
,
902 static struct regulator_init_data __initdata max8997_charger_topoff_data
= {
904 .name
= "CHARGER TOPOFF",
907 .valid_ops_mask
= REGULATOR_CHANGE_CURRENT
,
909 .num_consumer_supplies
= ARRAY_SIZE(max8997_chg_toff_
),
910 .consumer_supplies
= max8997_chg_toff_
,
913 static 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
},
931 { MAX8997_LDO18
, &max8997_ldo18_data
},
932 { MAX8997_LDO21
, &max8997_ldo21_data
},
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
},
942 { MAX8997_EN32KHZ_AP
, &max8997_32khz_ap_data
},
943 { MAX8997_EN32KHZ_CP
, &max8997_32khz_cp_data
},
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
},
953 static struct max8997_platform_data __initdata nuri_max8997_pdata
= {
956 .num_regulators
= ARRAY_SIZE(nuri_max8997_regulators
),
957 .regulators
= nuri_max8997_regulators
,
959 .buck125_gpios
= { EXYNOS4_GPX0(5), EXYNOS4_GPX0(6), EXYNOS4_GPL0(0) },
960 .buck2_gpiodvs
= true,
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 */
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 */
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 */
990 /* GPIO I2C 5 (PMIC) */
991 enum { I2C5_MAX8997
};
992 static struct i2c_board_info i2c5_devs
[] __initdata
= {
994 I2C_BOARD_INFO("max8997", 0xCC >> 1),
995 .platform_data
= &nuri_max8997_pdata
,
999 static struct max17042_platform_data nuri_battery_platform_data
= {
1002 /* GPIO I2C 9 (Fuel Gauge) */
1003 static struct i2c_gpio_platform_data i2c9_gpio_data
= {
1004 .sda_pin
= EXYNOS4_GPY4(0), /* XM0ADDR_8 */
1005 .scl_pin
= EXYNOS4_GPY4(1), /* XM0ADDR_9 */
1007 static struct platform_device i2c9_gpio
= {
1011 .platform_data
= &i2c9_gpio_data
,
1014 enum { I2C9_MAX17042
};
1015 static struct i2c_board_info i2c9_devs
[] __initdata
= {
1017 I2C_BOARD_INFO("max17042", 0x36),
1018 .platform_data
= &nuri_battery_platform_data
,
1022 /* MAX8903 Secondary Charger */
1023 static struct regulator_consumer_supply supplies_max8903
[] = {
1024 REGULATOR_SUPPLY("vinchg2", "charger-manager.0"),
1027 static struct regulator_init_data max8903_charger_en_data
= {
1029 .name
= "VOUT_CHARGER",
1030 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
1033 .num_consumer_supplies
= ARRAY_SIZE(supplies_max8903
),
1034 .consumer_supplies
= supplies_max8903
,
1037 static 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
,
1046 static 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
},
1052 static struct max8903_pdata nuri_max8903
= {
1054 * cen: don't control with the driver, let it be
1055 * controlled by regulator above
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 */
1064 .usb_valid
= false, /* USB is not wired to MAX8903 */
1067 static struct platform_device nuri_max8903_device
= {
1068 .name
= "max8903-charger",
1070 .platform_data
= &nuri_max8903
,
1074 static void __init
nuri_power_init(void)
1077 int irq_base
= IRQ_GPIO_END
+ 1;
1080 nuri_max8997_pdata
.irq_base
= irq_base
;
1081 irq_base
+= MAX8997_IRQ_NR
;
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
);
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
);
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;
1099 gpio
= nuri_max8903
.chg
;
1100 gpio_request(gpio
, "TA_nCHG");
1101 gpio_direction_input(gpio
);
1103 gpio
= nuri_max8903
.dcm
;
1104 gpio_request(gpio
, "CURR_ADJ");
1105 gpio_direction_output(gpio
, ta_en
);
1109 static struct s5p_ehci_platdata nuri_ehci_pdata
;
1111 static void __init
nuri_ehci_init(void)
1113 struct s5p_ehci_platdata
*pdata
= &nuri_ehci_pdata
;
1115 s5p_ehci_set_platdata(pdata
);
1119 static struct regulator_consumer_supply cam_vdda_supply
[] = {
1120 REGULATOR_SUPPLY("a_sensor", "0-001f"),
1123 static 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
,
1129 static 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 */
1134 .init_data
= &cam_vdda_reg_init_data
,
1137 static 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
},
1142 static struct regulator_consumer_supply camera_8m_12v_supply
=
1143 REGULATOR_SUPPLY("dig_12", "0-001f");
1145 static struct regulator_init_data cam_8m_12v_reg_init_data
= {
1146 .num_consumer_supplies
= 1,
1147 .consumer_supplies
= &camera_8m_12v_supply
,
1149 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
1153 static 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 */
1158 .init_data
= &cam_8m_12v_reg_init_data
,
1161 static 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
},
1166 static struct s5p_platform_mipi_csis mipi_csis_platdata
= {
1167 .clk_rate
= 166000000UL,
1171 .phy_enable
= s5p_csis_phy_enable
,
1174 #define GPIO_CAM_MEGA_RST EXYNOS4_GPY3(7) /* ISP_RESET */
1175 #define GPIO_CAM_8M_ISP_INT EXYNOS4_GPL2(5)
1177 static struct m5mols_platform_data m5mols_platdata
= {
1178 .gpio_reset
= GPIO_CAM_MEGA_RST
,
1181 static struct i2c_board_info m5mols_board_info
= {
1182 I2C_BOARD_INFO("M5MOLS", 0x1F),
1183 .platform_data
= &m5mols_platdata
,
1186 static struct s5p_fimc_isp_info nuri_camera_sensors
[] = {
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,
1197 static struct s5p_platform_fimc fimc_md_platdata
= {
1198 .isp_info
= nuri_camera_sensors
,
1199 .num_clients
= ARRAY_SIZE(nuri_camera_sensors
),
1202 static 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" },
1207 static void nuri_camera_init(void)
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
);
1214 if (gpio_request_array(nuri_camera_gpios
,
1215 ARRAY_SIZE(nuri_camera_gpios
))) {
1216 pr_err("%s: GPIO request failed\n", __func__
);
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));
1224 pr_err("%s: Failed to configure 8M_ISP_INT GPIO\n", __func__
);
1226 /* Free GPIOs controlled directly by the sensor drivers. */
1227 gpio_free(GPIO_CAM_MEGA_RST
);
1229 if (exynos4_fimc_setup_gpio(S5P_CAMPORT_A
)) {
1230 pr_err("%s: Camera port A setup failed\n", __func__
);
1233 /* Increase drive strength of the sensor clock output */
1234 s5p_gpio_set_drvstr(EXYNOS4_GPJ1(3), S5P_GPIO_DRVSTR_LV4
);
1237 static struct s3c2410_platform_i2c nuri_i2c0_platdata __initdata
= {
1238 .frequency
= 400000U,
1242 static struct platform_device
*nuri_devices
[] __initdata
= {
1243 /* Samsung Platform Devices */
1244 &s3c_device_i2c5
, /* PMIC should initialize first */
1246 &emmc_fixed_voltage
,
1247 &s5p_device_mipi_csis0
,
1257 &s3c_device_timer
[0],
1266 &exynos4_device_pd
[PD_MFC
],
1267 &exynos4_device_pd
[PD_LCD0
],
1268 &exynos4_device_pd
[PD_CAM
],
1269 &s5p_device_fimc_md
,
1274 &nuri_backlight_device
,
1275 &max8903_fixed_reg_dev
,
1276 &nuri_max8903_device
,
1277 &cam_vdda_fixed_rdev
,
1278 &cam_8m_12v_fixed_rdev
,
1281 static void __init
nuri_map_io(void)
1283 exynos_init_io(NULL
, 0);
1284 s3c24xx_init_clocks(24000000);
1285 s3c24xx_init_uarts(nuri_uartcfgs
, ARRAY_SIZE(nuri_uartcfgs
));
1288 static void __init
nuri_reserve(void)
1290 s5p_mfc_reserve_mem(0x43000000, 8 << 20, 0x51000000, 8 << 20);
1293 static void __init
nuri_machine_init(void)
1299 s3c_i2c0_set_platdata(&nuri_i2c0_platdata
);
1300 i2c_register_board_info(1, i2c1_devs
, ARRAY_SIZE(i2c1_devs
));
1301 s3c_i2c3_set_platdata(&i2c3_data
);
1302 i2c_register_board_info(3, i2c3_devs
, ARRAY_SIZE(i2c3_devs
));
1303 s3c_i2c5_set_platdata(NULL
);
1304 i2c5_devs
[I2C5_MAX8997
].irq
= gpio_to_irq(EXYNOS4_GPX0(7));
1305 i2c_register_board_info(5, i2c5_devs
, ARRAY_SIZE(i2c5_devs
));
1306 i2c9_devs
[I2C9_MAX17042
].irq
= gpio_to_irq(EXYNOS4_GPX2(3));
1307 i2c_register_board_info(9, i2c9_devs
, ARRAY_SIZE(i2c9_devs
));
1309 s5p_fimd0_set_platdata(&nuri_fb_pdata
);
1314 clk_xusbxti
.rate
= 24000000;
1317 platform_add_devices(nuri_devices
, ARRAY_SIZE(nuri_devices
));
1318 s5p_device_mfc
.dev
.parent
= &exynos4_device_pd
[PD_MFC
].dev
;
1319 s5p_device_fimd0
.dev
.parent
= &exynos4_device_pd
[PD_LCD0
].dev
;
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
;
1328 MACHINE_START(NURI
, "NURI")
1329 /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */
1330 .atag_offset
= 0x100,
1331 .init_irq
= exynos4_init_irq
,
1332 .map_io
= nuri_map_io
,
1333 .handle_irq
= gic_handle_irq
,
1334 .init_machine
= nuri_machine_init
,
1335 .timer
= &exynos4_timer
,
1336 .reserve
= &nuri_reserve
,
1337 .restart
= exynos4_restart
,