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/mach-types.h>
38 #include <plat/regs-fb-v4.h>
39 #include <plat/regs-serial.h>
40 #include <plat/exynos4.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>
57 /* Following are default values for UCON, ULCON and UFCON UART registers */
58 #define NURI_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \
59 S3C2410_UCON_RXILEVEL | \
60 S3C2410_UCON_TXIRQMODE | \
61 S3C2410_UCON_RXIRQMODE | \
62 S3C2410_UCON_RXFIFO_TOI | \
63 S3C2443_UCON_RXERR_IRQEN)
65 #define NURI_ULCON_DEFAULT S3C2410_LCON_CS8
67 #define NURI_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE | \
68 S5PV210_UFCON_TXTRIG256 | \
69 S5PV210_UFCON_RXTRIG256)
71 enum fixed_regulator_id
{
74 FIXED_REG_ID_CAM_A28V
,
78 static struct s3c2410_uartcfg nuri_uartcfgs
[] __initdata
= {
81 .ucon
= NURI_UCON_DEFAULT
,
82 .ulcon
= NURI_ULCON_DEFAULT
,
83 .ufcon
= NURI_UFCON_DEFAULT
,
87 .ucon
= NURI_UCON_DEFAULT
,
88 .ulcon
= NURI_ULCON_DEFAULT
,
89 .ufcon
= NURI_UFCON_DEFAULT
,
93 .ucon
= NURI_UCON_DEFAULT
,
94 .ulcon
= NURI_ULCON_DEFAULT
,
95 .ufcon
= NURI_UFCON_DEFAULT
,
99 .ucon
= NURI_UCON_DEFAULT
,
100 .ulcon
= NURI_ULCON_DEFAULT
,
101 .ufcon
= NURI_UFCON_DEFAULT
,
106 static struct s3c_sdhci_platdata nuri_hsmmc0_data __initdata
= {
108 .host_caps
= (MMC_CAP_8_BIT_DATA
| MMC_CAP_4_BIT_DATA
|
109 MMC_CAP_MMC_HIGHSPEED
| MMC_CAP_SD_HIGHSPEED
|
110 MMC_CAP_DISABLE
| MMC_CAP_ERASE
),
111 .cd_type
= S3C_SDHCI_CD_PERMANENT
,
112 .clk_type
= S3C_SDHCI_CLK_DIV_EXTERNAL
,
115 static struct regulator_consumer_supply emmc_supplies
[] = {
116 REGULATOR_SUPPLY("vmmc", "s3c-sdhci.0"),
117 REGULATOR_SUPPLY("vmmc", "dw_mmc"),
120 static struct regulator_init_data emmc_fixed_voltage_init_data
= {
122 .name
= "VMEM_VDD_2.8V",
123 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
125 .num_consumer_supplies
= ARRAY_SIZE(emmc_supplies
),
126 .consumer_supplies
= emmc_supplies
,
129 static struct fixed_voltage_config emmc_fixed_voltage_config
= {
130 .supply_name
= "MASSMEMORY_EN (inverted)",
131 .microvolts
= 2800000,
132 .gpio
= EXYNOS4_GPL1(1),
133 .enable_high
= false,
134 .init_data
= &emmc_fixed_voltage_init_data
,
137 static struct platform_device emmc_fixed_voltage
= {
138 .name
= "reg-fixed-voltage",
139 .id
= FIXED_REG_ID_MMC
,
141 .platform_data
= &emmc_fixed_voltage_config
,
146 static struct s3c_sdhci_platdata nuri_hsmmc2_data __initdata
= {
148 .host_caps
= MMC_CAP_4_BIT_DATA
|
149 MMC_CAP_MMC_HIGHSPEED
| MMC_CAP_SD_HIGHSPEED
|
151 .ext_cd_gpio
= EXYNOS4_GPX3(3), /* XEINT_27 */
152 .ext_cd_gpio_invert
= 1,
153 .cd_type
= S3C_SDHCI_CD_GPIO
,
154 .clk_type
= S3C_SDHCI_CLK_DIV_EXTERNAL
,
158 static struct s3c_sdhci_platdata nuri_hsmmc3_data __initdata
= {
160 .host_caps
= MMC_CAP_4_BIT_DATA
|
161 MMC_CAP_MMC_HIGHSPEED
| MMC_CAP_SD_HIGHSPEED
,
162 .cd_type
= S3C_SDHCI_CD_EXTERNAL
,
163 .clk_type
= S3C_SDHCI_CLK_DIV_EXTERNAL
,
166 static void __init
nuri_sdhci_init(void)
168 s3c_sdhci0_set_platdata(&nuri_hsmmc0_data
);
169 s3c_sdhci2_set_platdata(&nuri_hsmmc2_data
);
170 s3c_sdhci3_set_platdata(&nuri_hsmmc3_data
);
174 static struct gpio_keys_button nuri_gpio_keys_tables
[] = {
176 .code
= KEY_VOLUMEUP
,
177 .gpio
= EXYNOS4_GPX2(0), /* XEINT16 */
178 .desc
= "gpio-keys: KEY_VOLUMEUP",
181 .debounce_interval
= 1,
183 .code
= KEY_VOLUMEDOWN
,
184 .gpio
= EXYNOS4_GPX2(1), /* XEINT17 */
185 .desc
= "gpio-keys: KEY_VOLUMEDOWN",
188 .debounce_interval
= 1,
191 .gpio
= EXYNOS4_GPX2(7), /* XEINT23 */
192 .desc
= "gpio-keys: KEY_POWER",
196 .debounce_interval
= 1,
200 static struct gpio_keys_platform_data nuri_gpio_keys_data
= {
201 .buttons
= nuri_gpio_keys_tables
,
202 .nbuttons
= ARRAY_SIZE(nuri_gpio_keys_tables
),
205 static struct platform_device nuri_gpio_keys
= {
208 .platform_data
= &nuri_gpio_keys_data
,
213 static struct s3c_fb_pd_win nuri_fb_win0
= {
231 static struct s3c_fb_platdata nuri_fb_pdata __initdata
= {
232 .win
[0] = &nuri_fb_win0
,
233 .vidcon0
= VIDCON0_VIDOUT_RGB
| VIDCON0_PNRMODE_RGB
|
235 .vidcon1
= VIDCON1_INV_HSYNC
| VIDCON1_INV_VSYNC
,
236 .setup_gpio
= exynos4_fimd0_gpio_setup_24bpp
,
239 static void nuri_lcd_power_on(struct plat_lcd_data
*pd
, unsigned int power
)
241 int gpio
= EXYNOS4_GPE1(5);
243 gpio_request(gpio
, "LVDS_nSHDN");
244 gpio_direction_output(gpio
, power
);
248 static int nuri_bl_init(struct device
*dev
)
250 int ret
, gpio
= EXYNOS4_GPE2(3);
252 ret
= gpio_request(gpio
, "LCD_LDO_EN");
254 gpio_direction_output(gpio
, 0);
259 static int nuri_bl_notify(struct device
*dev
, int brightness
)
264 gpio_set_value(EXYNOS4_GPE2(3), 1);
269 static void nuri_bl_exit(struct device
*dev
)
271 gpio_free(EXYNOS4_GPE2(3));
274 /* nuri pwm backlight */
275 static struct platform_pwm_backlight_data nuri_backlight_data
= {
277 .pwm_period_ns
= 30000,
278 .max_brightness
= 100,
279 .dft_brightness
= 50,
280 .init
= nuri_bl_init
,
281 .notify
= nuri_bl_notify
,
282 .exit
= nuri_bl_exit
,
285 static struct platform_device nuri_backlight_device
= {
286 .name
= "pwm-backlight",
289 .parent
= &s3c_device_timer
[0].dev
,
290 .platform_data
= &nuri_backlight_data
,
294 static struct plat_lcd_data nuri_lcd_platform_data
= {
295 .set_power
= nuri_lcd_power_on
,
298 static struct platform_device nuri_lcd_device
= {
299 .name
= "platform-lcd",
302 .platform_data
= &nuri_lcd_platform_data
,
307 static struct i2c_board_info i2c1_devs
[] __initdata
= {
308 /* Gyro, To be updated */
312 static u8 mxt_init_vals
[] = {
313 /* MXT_GEN_COMMAND(6) */
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 /* MXT_GEN_POWER(7) */
317 /* MXT_GEN_ACQUIRE(8) */
318 0x0a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x23,
319 /* MXT_TOUCH_MULTI(9) */
320 0x00, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00,
321 0x00, 0x01, 0x01, 0x0e, 0x0a, 0x0a, 0x0a, 0x0a, 0x00, 0x00,
322 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
324 /* MXT_TOUCH_KEYARRAY(15) */
325 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
327 /* MXT_SPT_GPIOPWM(19) */
328 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
330 /* MXT_PROCI_GRIPFACE(20) */
331 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x28, 0x04,
333 /* MXT_PROCG_NOISE(22) */
334 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x23, 0x00,
335 0x00, 0x05, 0x0f, 0x19, 0x23, 0x2d, 0x03,
336 /* MXT_TOUCH_PROXIMITY(23) */
337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
338 0x00, 0x00, 0x00, 0x00, 0x00,
339 /* MXT_PROCI_ONETOUCH(24) */
340 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
342 /* MXT_SPT_SELFTEST(25) */
343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
344 0x00, 0x00, 0x00, 0x00,
345 /* MXT_PROCI_TWOTOUCH(27) */
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
347 /* MXT_SPT_CTECONFIG(28) */
348 0x00, 0x00, 0x02, 0x08, 0x10, 0x00,
351 static struct mxt_platform_data mxt_platform_data
= {
352 .config
= mxt_init_vals
,
353 .config_length
= ARRAY_SIZE(mxt_init_vals
),
361 .voltage
= 2800000, /* 2.8V */
362 .orient
= MXT_DIAGONAL_COUNTER
,
363 .irqflags
= IRQF_TRIGGER_FALLING
,
366 static struct s3c2410_platform_i2c i2c3_data __initdata
= {
370 .frequency
= 400 * 1000,
374 static struct i2c_board_info i2c3_devs
[] __initdata
= {
376 I2C_BOARD_INFO("atmel_mxt_ts", 0x4a),
377 .platform_data
= &mxt_platform_data
,
382 static void __init
nuri_tsp_init(void)
386 /* TOUCH_INT: XEINT_4 */
387 gpio
= EXYNOS4_GPX0(4);
388 gpio_request(gpio
, "TOUCH_INT");
389 s3c_gpio_cfgpin(gpio
, S3C_GPIO_SFN(0xf));
390 s3c_gpio_setpull(gpio
, S3C_GPIO_PULL_UP
);
393 static struct regulator_consumer_supply __initdata max8997_ldo1_
[] = {
394 REGULATOR_SUPPLY("vdd", "s5p-adc"), /* Used by CPU's ADC drv */
396 static struct regulator_consumer_supply __initdata max8997_ldo3_
[] = {
397 REGULATOR_SUPPLY("vdd11", "s5p-mipi-csis.0"), /* MIPI */
399 static struct regulator_consumer_supply __initdata max8997_ldo4_
[] = {
400 REGULATOR_SUPPLY("vdd18", "s5p-mipi-csis.0"), /* MIPI */
402 static struct regulator_consumer_supply __initdata max8997_ldo5_
[] = {
403 REGULATOR_SUPPLY("vhsic", "modemctl"), /* MODEM */
405 static struct regulator_consumer_supply __initdata max8997_ldo7_
[] = {
406 REGULATOR_SUPPLY("dig_18", "0-001f"), /* HCD803 */
408 static struct regulator_consumer_supply __initdata max8997_ldo8_
[] = {
409 REGULATOR_SUPPLY("vusb_d", NULL
), /* Used by CPU */
410 REGULATOR_SUPPLY("vdac", NULL
), /* Used by CPU */
412 static struct regulator_consumer_supply __initdata max8997_ldo11_
[] = {
413 REGULATOR_SUPPLY("vcc", "platform-lcd"), /* U804 LVDS */
415 static struct regulator_consumer_supply __initdata max8997_ldo12_
[] = {
416 REGULATOR_SUPPLY("vddio", "6-003c"), /* HDC802 */
418 static struct regulator_consumer_supply __initdata max8997_ldo13_
[] = {
419 REGULATOR_SUPPLY("vmmc", "s3c-sdhci.2"), /* TFLASH */
421 static struct regulator_consumer_supply __initdata max8997_ldo14_
[] = {
422 REGULATOR_SUPPLY("inmotor", "max8997-haptic"),
424 static struct regulator_consumer_supply __initdata max8997_ldo15_
[] = {
425 REGULATOR_SUPPLY("avdd", "3-004a"), /* Touch Screen */
427 static struct regulator_consumer_supply __initdata max8997_ldo16_
[] = {
428 REGULATOR_SUPPLY("d_sensor", "0-001f"), /* HDC803 */
430 static struct regulator_consumer_supply __initdata max8997_ldo18_
[] = {
431 REGULATOR_SUPPLY("vdd", "3-004a"), /* Touch Screen */
433 static struct regulator_consumer_supply __initdata max8997_buck1_
[] = {
434 REGULATOR_SUPPLY("vdd_arm", NULL
), /* CPUFREQ */
436 static struct regulator_consumer_supply __initdata max8997_buck2_
[] = {
437 REGULATOR_SUPPLY("vdd_int", NULL
), /* CPUFREQ */
439 static struct regulator_consumer_supply __initdata max8997_buck3_
[] = {
440 REGULATOR_SUPPLY("vdd", "mali_dev.0"), /* G3D of Exynos 4 */
442 static struct regulator_consumer_supply __initdata max8997_buck4_
[] = {
443 REGULATOR_SUPPLY("core", "0-001f"), /* HDC803 */
445 static struct regulator_consumer_supply __initdata max8997_buck6_
[] = {
446 REGULATOR_SUPPLY("dig_28", "0-001f"), /* pin "7" of HDC803 */
448 static struct regulator_consumer_supply __initdata max8997_esafeout1_
[] = {
449 REGULATOR_SUPPLY("usb_vbus", NULL
), /* CPU's USB OTG */
451 static struct regulator_consumer_supply __initdata max8997_esafeout2_
[] = {
452 REGULATOR_SUPPLY("usb_vbus", "modemctl"), /* VBUS of Modem */
455 static struct regulator_consumer_supply __initdata max8997_charger_
[] = {
456 REGULATOR_SUPPLY("vinchg1", "charger-manager.0"),
458 static struct regulator_consumer_supply __initdata max8997_chg_toff_
[] = {
459 REGULATOR_SUPPLY("vinchg_stop", NULL
), /* for jack interrupt handlers */
462 static struct regulator_consumer_supply __initdata max8997_32khz_ap_
[] = {
463 REGULATOR_SUPPLY("gps_clk", "bcm4751"),
464 REGULATOR_SUPPLY("bt_clk", "bcm4330-b1"),
465 REGULATOR_SUPPLY("wifi_clk", "bcm433-b1"),
468 static struct regulator_init_data __initdata max8997_ldo1_data
= {
470 .name
= "VADC_3.3V_C210",
473 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
479 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo1_
),
480 .consumer_supplies
= max8997_ldo1_
,
483 static struct regulator_init_data __initdata max8997_ldo2_data
= {
485 .name
= "VALIVE_1.1V_C210",
496 static struct regulator_init_data __initdata max8997_ldo3_data
= {
498 .name
= "VUSB_1.1V_C210",
501 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
507 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo3_
),
508 .consumer_supplies
= max8997_ldo3_
,
511 static struct regulator_init_data __initdata max8997_ldo4_data
= {
513 .name
= "VMIPI_1.8V",
516 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
522 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo4_
),
523 .consumer_supplies
= max8997_ldo4_
,
526 static struct regulator_init_data __initdata max8997_ldo5_data
= {
528 .name
= "VHSIC_1.2V_C210",
531 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
537 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo5_
),
538 .consumer_supplies
= max8997_ldo5_
,
541 static struct regulator_init_data __initdata max8997_ldo6_data
= {
543 .name
= "VCC_1.8V_PDA",
554 static struct regulator_init_data __initdata max8997_ldo7_data
= {
556 .name
= "CAM_ISP_1.8V",
559 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
565 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo7_
),
566 .consumer_supplies
= max8997_ldo7_
,
569 static struct regulator_init_data __initdata max8997_ldo8_data
= {
571 .name
= "VUSB/VDAC_3.3V_C210",
574 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
580 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo8_
),
581 .consumer_supplies
= max8997_ldo8_
,
584 static struct regulator_init_data __initdata max8997_ldo9_data
= {
586 .name
= "VCC_2.8V_PDA",
597 static struct regulator_init_data __initdata max8997_ldo10_data
= {
599 .name
= "VPLL_1.1V_C210",
610 static struct regulator_init_data __initdata max8997_ldo11_data
= {
612 .name
= "LVDS_VDD3.3V",
615 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
622 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo11_
),
623 .consumer_supplies
= max8997_ldo11_
,
626 static struct regulator_init_data __initdata max8997_ldo12_data
= {
628 .name
= "VT_CAM_1.8V",
631 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
637 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo12_
),
638 .consumer_supplies
= max8997_ldo12_
,
641 static struct regulator_init_data __initdata max8997_ldo13_data
= {
646 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
652 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo13_
),
653 .consumer_supplies
= max8997_ldo13_
,
656 static struct regulator_init_data __initdata max8997_ldo14_data
= {
658 .name
= "VCC_3.0V_MOTOR",
661 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
667 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo14_
),
668 .consumer_supplies
= max8997_ldo14_
,
671 static struct regulator_init_data __initdata max8997_ldo15_data
= {
673 .name
= "VTOUCH_ADVV2.8V",
677 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
682 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo15_
),
683 .consumer_supplies
= max8997_ldo15_
,
686 static struct regulator_init_data __initdata max8997_ldo16_data
= {
688 .name
= "CAM_SENSOR_IO_1.8V",
691 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
697 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo16_
),
698 .consumer_supplies
= max8997_ldo16_
,
701 static struct regulator_init_data __initdata max8997_ldo18_data
= {
703 .name
= "VTOUCH_VDD2.8V",
706 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
712 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo18_
),
713 .consumer_supplies
= max8997_ldo18_
,
716 static struct regulator_init_data __initdata max8997_ldo21_data
= {
718 .name
= "VDDQ_M1M2_1.2V",
729 static struct regulator_init_data __initdata max8997_buck1_data
= {
731 .name
= "VARM_1.2V_C210",
734 .valid_ops_mask
= REGULATOR_CHANGE_VOLTAGE
,
740 .num_consumer_supplies
= ARRAY_SIZE(max8997_buck1_
),
741 .consumer_supplies
= max8997_buck1_
,
744 static struct regulator_init_data __initdata max8997_buck2_data
= {
746 .name
= "VINT_1.1V_C210",
749 .valid_ops_mask
= REGULATOR_CHANGE_VOLTAGE
,
755 .num_consumer_supplies
= ARRAY_SIZE(max8997_buck2_
),
756 .consumer_supplies
= max8997_buck2_
,
759 static struct regulator_init_data __initdata max8997_buck3_data
= {
761 .name
= "VG3D_1.1V_C210",
764 .valid_ops_mask
= REGULATOR_CHANGE_VOLTAGE
|
765 REGULATOR_CHANGE_STATUS
,
770 .num_consumer_supplies
= ARRAY_SIZE(max8997_buck3_
),
771 .consumer_supplies
= max8997_buck3_
,
774 static struct regulator_init_data __initdata max8997_buck4_data
= {
776 .name
= "CAM_ISP_CORE_1.2V",
780 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
785 .num_consumer_supplies
= ARRAY_SIZE(max8997_buck4_
),
786 .consumer_supplies
= max8997_buck4_
,
789 static struct regulator_init_data __initdata max8997_buck5_data
= {
791 .name
= "VMEM_1.2V_C210",
802 static struct regulator_init_data __initdata max8997_buck6_data
= {
804 .name
= "CAM_AF_2.8V",
807 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
812 .num_consumer_supplies
= ARRAY_SIZE(max8997_buck6_
),
813 .consumer_supplies
= max8997_buck6_
,
816 static struct regulator_init_data __initdata max8997_buck7_data
= {
818 .name
= "VCC_SUB_2.0V",
829 static struct regulator_init_data __initdata max8997_32khz_ap_data
= {
837 .num_consumer_supplies
= ARRAY_SIZE(max8997_32khz_ap_
),
838 .consumer_supplies
= max8997_32khz_ap_
,
841 static struct regulator_init_data __initdata max8997_32khz_cp_data
= {
850 static struct regulator_init_data __initdata max8997_vichg_data
= {
859 static struct regulator_init_data __initdata max8997_esafeout1_data
= {
862 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
867 .num_consumer_supplies
= ARRAY_SIZE(max8997_esafeout1_
),
868 .consumer_supplies
= max8997_esafeout1_
,
871 static struct regulator_init_data __initdata max8997_esafeout2_data
= {
874 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
879 .num_consumer_supplies
= ARRAY_SIZE(max8997_esafeout2_
),
880 .consumer_supplies
= max8997_esafeout2_
,
883 static struct regulator_init_data __initdata max8997_charger_cv_data
= {
885 .name
= "CHARGER_CV",
892 static struct regulator_init_data __initdata max8997_charger_data
= {
898 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
|
899 REGULATOR_CHANGE_CURRENT
,
901 .num_consumer_supplies
= ARRAY_SIZE(max8997_charger_
),
902 .consumer_supplies
= max8997_charger_
,
905 static struct regulator_init_data __initdata max8997_charger_topoff_data
= {
907 .name
= "CHARGER TOPOFF",
910 .valid_ops_mask
= REGULATOR_CHANGE_CURRENT
,
912 .num_consumer_supplies
= ARRAY_SIZE(max8997_chg_toff_
),
913 .consumer_supplies
= max8997_chg_toff_
,
916 static struct max8997_regulator_data __initdata nuri_max8997_regulators
[] = {
917 { MAX8997_LDO1
, &max8997_ldo1_data
},
918 { MAX8997_LDO2
, &max8997_ldo2_data
},
919 { MAX8997_LDO3
, &max8997_ldo3_data
},
920 { MAX8997_LDO4
, &max8997_ldo4_data
},
921 { MAX8997_LDO5
, &max8997_ldo5_data
},
922 { MAX8997_LDO6
, &max8997_ldo6_data
},
923 { MAX8997_LDO7
, &max8997_ldo7_data
},
924 { MAX8997_LDO8
, &max8997_ldo8_data
},
925 { MAX8997_LDO9
, &max8997_ldo9_data
},
926 { MAX8997_LDO10
, &max8997_ldo10_data
},
927 { MAX8997_LDO11
, &max8997_ldo11_data
},
928 { MAX8997_LDO12
, &max8997_ldo12_data
},
929 { MAX8997_LDO13
, &max8997_ldo13_data
},
930 { MAX8997_LDO14
, &max8997_ldo14_data
},
931 { MAX8997_LDO15
, &max8997_ldo15_data
},
932 { MAX8997_LDO16
, &max8997_ldo16_data
},
934 { MAX8997_LDO18
, &max8997_ldo18_data
},
935 { MAX8997_LDO21
, &max8997_ldo21_data
},
937 { MAX8997_BUCK1
, &max8997_buck1_data
},
938 { MAX8997_BUCK2
, &max8997_buck2_data
},
939 { MAX8997_BUCK3
, &max8997_buck3_data
},
940 { MAX8997_BUCK4
, &max8997_buck4_data
},
941 { MAX8997_BUCK5
, &max8997_buck5_data
},
942 { MAX8997_BUCK6
, &max8997_buck6_data
},
943 { MAX8997_BUCK7
, &max8997_buck7_data
},
945 { MAX8997_EN32KHZ_AP
, &max8997_32khz_ap_data
},
946 { MAX8997_EN32KHZ_CP
, &max8997_32khz_cp_data
},
948 { MAX8997_ENVICHG
, &max8997_vichg_data
},
949 { MAX8997_ESAFEOUT1
, &max8997_esafeout1_data
},
950 { MAX8997_ESAFEOUT2
, &max8997_esafeout2_data
},
951 { MAX8997_CHARGER_CV
, &max8997_charger_cv_data
},
952 { MAX8997_CHARGER
, &max8997_charger_data
},
953 { MAX8997_CHARGER_TOPOFF
, &max8997_charger_topoff_data
},
956 static struct max8997_platform_data __initdata nuri_max8997_pdata
= {
959 .num_regulators
= ARRAY_SIZE(nuri_max8997_regulators
),
960 .regulators
= nuri_max8997_regulators
,
962 .buck125_gpios
= { EXYNOS4_GPX0(5), EXYNOS4_GPX0(6), EXYNOS4_GPL0(0) },
963 .buck2_gpiodvs
= true,
965 .buck1_voltage
[0] = 1350000, /* 1.35V */
966 .buck1_voltage
[1] = 1300000, /* 1.3V */
967 .buck1_voltage
[2] = 1250000, /* 1.25V */
968 .buck1_voltage
[3] = 1200000, /* 1.2V */
969 .buck1_voltage
[4] = 1150000, /* 1.15V */
970 .buck1_voltage
[5] = 1100000, /* 1.1V */
971 .buck1_voltage
[6] = 1000000, /* 1.0V */
972 .buck1_voltage
[7] = 950000, /* 0.95V */
974 .buck2_voltage
[0] = 1100000, /* 1.1V */
975 .buck2_voltage
[1] = 1000000, /* 1.0V */
976 .buck2_voltage
[2] = 950000, /* 0.95V */
977 .buck2_voltage
[3] = 900000, /* 0.9V */
978 .buck2_voltage
[4] = 1100000, /* 1.1V */
979 .buck2_voltage
[5] = 1000000, /* 1.0V */
980 .buck2_voltage
[6] = 950000, /* 0.95V */
981 .buck2_voltage
[7] = 900000, /* 0.9V */
983 .buck5_voltage
[0] = 1200000, /* 1.2V */
984 .buck5_voltage
[1] = 1200000, /* 1.2V */
985 .buck5_voltage
[2] = 1200000, /* 1.2V */
986 .buck5_voltage
[3] = 1200000, /* 1.2V */
987 .buck5_voltage
[4] = 1200000, /* 1.2V */
988 .buck5_voltage
[5] = 1200000, /* 1.2V */
989 .buck5_voltage
[6] = 1200000, /* 1.2V */
990 .buck5_voltage
[7] = 1200000, /* 1.2V */
993 /* GPIO I2C 5 (PMIC) */
994 enum { I2C5_MAX8997
};
995 static struct i2c_board_info i2c5_devs
[] __initdata
= {
997 I2C_BOARD_INFO("max8997", 0xCC >> 1),
998 .platform_data
= &nuri_max8997_pdata
,
1002 static struct max17042_platform_data nuri_battery_platform_data
= {
1005 /* GPIO I2C 9 (Fuel Gauge) */
1006 static struct i2c_gpio_platform_data i2c9_gpio_data
= {
1007 .sda_pin
= EXYNOS4_GPY4(0), /* XM0ADDR_8 */
1008 .scl_pin
= EXYNOS4_GPY4(1), /* XM0ADDR_9 */
1010 static struct platform_device i2c9_gpio
= {
1014 .platform_data
= &i2c9_gpio_data
,
1017 enum { I2C9_MAX17042
};
1018 static struct i2c_board_info i2c9_devs
[] __initdata
= {
1020 I2C_BOARD_INFO("max17042", 0x36),
1021 .platform_data
= &nuri_battery_platform_data
,
1025 /* MAX8903 Secondary Charger */
1026 static struct regulator_consumer_supply supplies_max8903
[] = {
1027 REGULATOR_SUPPLY("vinchg2", "charger-manager.0"),
1030 static struct regulator_init_data max8903_charger_en_data
= {
1032 .name
= "VOUT_CHARGER",
1033 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
1036 .num_consumer_supplies
= ARRAY_SIZE(supplies_max8903
),
1037 .consumer_supplies
= supplies_max8903
,
1040 static struct fixed_voltage_config max8903_charger_en
= {
1041 .supply_name
= "VOUT_CHARGER",
1042 .microvolts
= 5000000, /* Assume 5VDC */
1043 .gpio
= EXYNOS4_GPY4(5), /* TA_EN negaged */
1044 .enable_high
= 0, /* Enable = Low */
1045 .enabled_at_boot
= 1,
1046 .init_data
= &max8903_charger_en_data
,
1049 static struct platform_device max8903_fixed_reg_dev
= {
1050 .name
= "reg-fixed-voltage",
1051 .id
= FIXED_REG_ID_MAX8903
,
1052 .dev
= { .platform_data
= &max8903_charger_en
},
1055 static struct max8903_pdata nuri_max8903
= {
1057 * cen: don't control with the driver, let it be
1058 * controlled by regulator above
1060 .dok
= EXYNOS4_GPX1(4), /* TA_nCONNECTED */
1061 /* uok, usus: not connected */
1062 .chg
= EXYNOS4_GPE2(0), /* TA_nCHG */
1063 /* flt: vcc_1.8V_pda */
1064 .dcm
= EXYNOS4_GPL0(1), /* CURR_ADJ */
1067 .usb_valid
= false, /* USB is not wired to MAX8903 */
1070 static struct platform_device nuri_max8903_device
= {
1071 .name
= "max8903-charger",
1073 .platform_data
= &nuri_max8903
,
1077 static void __init
nuri_power_init(void)
1080 int irq_base
= IRQ_GPIO_END
+ 1;
1083 nuri_max8997_pdata
.irq_base
= irq_base
;
1084 irq_base
+= MAX8997_IRQ_NR
;
1086 gpio
= EXYNOS4_GPX0(7);
1087 gpio_request(gpio
, "AP_PMIC_IRQ");
1088 s3c_gpio_cfgpin(gpio
, S3C_GPIO_SFN(0xf));
1089 s3c_gpio_setpull(gpio
, S3C_GPIO_PULL_NONE
);
1091 gpio
= EXYNOS4_GPX2(3);
1092 gpio_request(gpio
, "FUEL_ALERT");
1093 s3c_gpio_cfgpin(gpio
, S3C_GPIO_SFN(0xf));
1094 s3c_gpio_setpull(gpio
, S3C_GPIO_PULL_NONE
);
1096 gpio
= nuri_max8903
.dok
;
1097 gpio_request(gpio
, "TA_nCONNECTED");
1098 s3c_gpio_cfgpin(gpio
, S3C_GPIO_SFN(0xf));
1099 s3c_gpio_setpull(gpio
, S3C_GPIO_PULL_NONE
);
1100 ta_en
= gpio_get_value(gpio
) ? 0 : 1;
1102 gpio
= nuri_max8903
.chg
;
1103 gpio_request(gpio
, "TA_nCHG");
1104 gpio_direction_input(gpio
);
1106 gpio
= nuri_max8903
.dcm
;
1107 gpio_request(gpio
, "CURR_ADJ");
1108 gpio_direction_output(gpio
, ta_en
);
1112 static struct s5p_ehci_platdata nuri_ehci_pdata
;
1114 static void __init
nuri_ehci_init(void)
1116 struct s5p_ehci_platdata
*pdata
= &nuri_ehci_pdata
;
1118 s5p_ehci_set_platdata(pdata
);
1122 static struct regulator_consumer_supply cam_vdda_supply
[] = {
1123 REGULATOR_SUPPLY("a_sensor", "0-001f"),
1126 static struct regulator_init_data cam_vdda_reg_init_data
= {
1127 .constraints
= { .valid_ops_mask
= REGULATOR_CHANGE_STATUS
},
1128 .num_consumer_supplies
= ARRAY_SIZE(cam_vdda_supply
),
1129 .consumer_supplies
= cam_vdda_supply
,
1132 static struct fixed_voltage_config cam_vdda_fixed_voltage_cfg
= {
1133 .supply_name
= "CAM_IO_EN",
1134 .microvolts
= 2800000,
1135 .gpio
= EXYNOS4_GPE2(1), /* CAM_IO_EN */
1137 .init_data
= &cam_vdda_reg_init_data
,
1140 static struct platform_device cam_vdda_fixed_rdev
= {
1141 .name
= "reg-fixed-voltage", .id
= FIXED_REG_ID_CAM_A28V
,
1142 .dev
= { .platform_data
= &cam_vdda_fixed_voltage_cfg
},
1145 static struct regulator_consumer_supply camera_8m_12v_supply
=
1146 REGULATOR_SUPPLY("dig_12", "0-001f");
1148 static struct regulator_init_data cam_8m_12v_reg_init_data
= {
1149 .num_consumer_supplies
= 1,
1150 .consumer_supplies
= &camera_8m_12v_supply
,
1152 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
1156 static struct fixed_voltage_config cam_8m_12v_fixed_voltage_cfg
= {
1157 .supply_name
= "8M_1.2V",
1158 .microvolts
= 1200000,
1159 .gpio
= EXYNOS4_GPE2(5), /* 8M_1.2V_EN */
1161 .init_data
= &cam_8m_12v_reg_init_data
,
1164 static struct platform_device cam_8m_12v_fixed_rdev
= {
1165 .name
= "reg-fixed-voltage", .id
= FIXED_REG_ID_CAM_12V
,
1166 .dev
= { .platform_data
= &cam_8m_12v_fixed_voltage_cfg
},
1169 static struct s5p_platform_mipi_csis mipi_csis_platdata
= {
1170 .clk_rate
= 166000000UL,
1174 .phy_enable
= s5p_csis_phy_enable
,
1177 #define GPIO_CAM_MEGA_RST EXYNOS4_GPY3(7) /* ISP_RESET */
1178 #define GPIO_CAM_8M_ISP_INT EXYNOS4_GPL2(5)
1180 static struct m5mols_platform_data m5mols_platdata
= {
1181 .gpio_reset
= GPIO_CAM_MEGA_RST
,
1184 static struct i2c_board_info m5mols_board_info
= {
1185 I2C_BOARD_INFO("M5MOLS", 0x1F),
1186 .platform_data
= &m5mols_platdata
,
1189 static struct s5p_fimc_isp_info nuri_camera_sensors
[] = {
1191 .flags
= V4L2_MBUS_PCLK_SAMPLE_FALLING
|
1192 V4L2_MBUS_VSYNC_ACTIVE_LOW
,
1193 .bus_type
= FIMC_MIPI_CSI2
,
1194 .board_info
= &m5mols_board_info
,
1195 .clk_frequency
= 24000000UL,
1196 .csi_data_align
= 32,
1200 static struct s5p_platform_fimc fimc_md_platdata
= {
1201 .isp_info
= nuri_camera_sensors
,
1202 .num_clients
= ARRAY_SIZE(nuri_camera_sensors
),
1205 static struct gpio nuri_camera_gpios
[] = {
1206 { GPIO_CAM_8M_ISP_INT
, GPIOF_IN
, "8M_ISP_INT" },
1207 { GPIO_CAM_MEGA_RST
, GPIOF_OUT_INIT_LOW
, "CAM_8M_NRST" },
1210 static void nuri_camera_init(void)
1212 s3c_set_platdata(&mipi_csis_platdata
, sizeof(mipi_csis_platdata
),
1213 &s5p_device_mipi_csis0
);
1214 s3c_set_platdata(&fimc_md_platdata
, sizeof(fimc_md_platdata
),
1215 &s5p_device_fimc_md
);
1217 if (gpio_request_array(nuri_camera_gpios
,
1218 ARRAY_SIZE(nuri_camera_gpios
))) {
1219 pr_err("%s: GPIO request failed\n", __func__
);
1223 m5mols_board_info
.irq
= s5p_register_gpio_interrupt(GPIO_CAM_8M_ISP_INT
);
1224 if (!IS_ERR_VALUE(m5mols_board_info
.irq
))
1225 s3c_gpio_cfgpin(GPIO_CAM_8M_ISP_INT
, S3C_GPIO_SFN(0xF));
1227 pr_err("%s: Failed to configure 8M_ISP_INT GPIO\n", __func__
);
1229 /* Free GPIOs controlled directly by the sensor drivers. */
1230 gpio_free(GPIO_CAM_MEGA_RST
);
1232 if (exynos4_fimc_setup_gpio(S5P_CAMPORT_A
)) {
1233 pr_err("%s: Camera port A setup failed\n", __func__
);
1236 /* Increase drive strength of the sensor clock output */
1237 s5p_gpio_set_drvstr(EXYNOS4_GPJ1(3), S5P_GPIO_DRVSTR_LV4
);
1240 static struct s3c2410_platform_i2c nuri_i2c0_platdata __initdata
= {
1241 .frequency
= 400000U,
1245 static struct platform_device
*nuri_devices
[] __initdata
= {
1246 /* Samsung Platform Devices */
1247 &s3c_device_i2c5
, /* PMIC should initialize first */
1249 &emmc_fixed_voltage
,
1250 &s5p_device_mipi_csis0
,
1260 &s3c_device_timer
[0],
1269 &exynos4_device_pd
[PD_MFC
],
1270 &exynos4_device_pd
[PD_LCD0
],
1271 &exynos4_device_pd
[PD_CAM
],
1272 &s5p_device_fimc_md
,
1277 &nuri_backlight_device
,
1278 &max8903_fixed_reg_dev
,
1279 &nuri_max8903_device
,
1280 &cam_vdda_fixed_rdev
,
1281 &cam_8m_12v_fixed_rdev
,
1284 static void __init
nuri_map_io(void)
1286 s5p_init_io(NULL
, 0, S5P_VA_CHIPID
);
1287 s3c24xx_init_clocks(24000000);
1288 s3c24xx_init_uarts(nuri_uartcfgs
, ARRAY_SIZE(nuri_uartcfgs
));
1291 static void __init
nuri_reserve(void)
1293 s5p_mfc_reserve_mem(0x43000000, 8 << 20, 0x51000000, 8 << 20);
1296 static void __init
nuri_machine_init(void)
1302 s3c_i2c0_set_platdata(&nuri_i2c0_platdata
);
1303 i2c_register_board_info(1, i2c1_devs
, ARRAY_SIZE(i2c1_devs
));
1304 s3c_i2c3_set_platdata(&i2c3_data
);
1305 i2c_register_board_info(3, i2c3_devs
, ARRAY_SIZE(i2c3_devs
));
1306 s3c_i2c5_set_platdata(NULL
);
1307 i2c5_devs
[I2C5_MAX8997
].irq
= gpio_to_irq(EXYNOS4_GPX0(7));
1308 i2c_register_board_info(5, i2c5_devs
, ARRAY_SIZE(i2c5_devs
));
1309 i2c9_devs
[I2C9_MAX17042
].irq
= gpio_to_irq(EXYNOS4_GPX2(3));
1310 i2c_register_board_info(9, i2c9_devs
, ARRAY_SIZE(i2c9_devs
));
1312 s5p_fimd0_set_platdata(&nuri_fb_pdata
);
1317 clk_xusbxti
.rate
= 24000000;
1320 platform_add_devices(nuri_devices
, ARRAY_SIZE(nuri_devices
));
1321 s5p_device_mfc
.dev
.parent
= &exynos4_device_pd
[PD_MFC
].dev
;
1322 s5p_device_fimd0
.dev
.parent
= &exynos4_device_pd
[PD_LCD0
].dev
;
1324 s5p_device_fimc0
.dev
.parent
= &exynos4_device_pd
[PD_CAM
].dev
;
1325 s5p_device_fimc1
.dev
.parent
= &exynos4_device_pd
[PD_CAM
].dev
;
1326 s5p_device_fimc2
.dev
.parent
= &exynos4_device_pd
[PD_CAM
].dev
;
1327 s5p_device_fimc3
.dev
.parent
= &exynos4_device_pd
[PD_CAM
].dev
;
1328 s5p_device_mipi_csis0
.dev
.parent
= &exynos4_device_pd
[PD_CAM
].dev
;
1331 MACHINE_START(NURI
, "NURI")
1332 /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */
1333 .atag_offset
= 0x100,
1334 .init_irq
= exynos4_init_irq
,
1335 .map_io
= nuri_map_io
,
1336 .init_machine
= nuri_machine_init
,
1337 .timer
= &exynos4_timer
,
1338 .reserve
= &nuri_reserve
,