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/max17042_battery.h>
20 #include <linux/regulator/machine.h>
21 #include <linux/regulator/fixed.h>
22 #include <linux/mfd/max8997.h>
23 #include <linux/mfd/max8997-private.h>
24 #include <linux/mmc/host.h>
26 #include <linux/pwm_backlight.h>
28 #include <video/platform_lcd.h>
30 #include <asm/mach/arch.h>
31 #include <asm/mach-types.h>
33 #include <plat/regs-serial.h>
34 #include <plat/exynos4.h>
36 #include <plat/devs.h>
37 #include <plat/sdhci.h>
38 #include <plat/ehci.h>
39 #include <plat/clock.h>
40 #include <plat/gpio-cfg.h>
45 /* Following are default values for UCON, ULCON and UFCON UART registers */
46 #define NURI_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \
47 S3C2410_UCON_RXILEVEL | \
48 S3C2410_UCON_TXIRQMODE | \
49 S3C2410_UCON_RXIRQMODE | \
50 S3C2410_UCON_RXFIFO_TOI | \
51 S3C2443_UCON_RXERR_IRQEN)
53 #define NURI_ULCON_DEFAULT S3C2410_LCON_CS8
55 #define NURI_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE | \
56 S5PV210_UFCON_TXTRIG256 | \
57 S5PV210_UFCON_RXTRIG256)
59 enum fixed_regulator_id {
63 static struct s3c2410_uartcfg nuri_uartcfgs[] __initdata = {
66 .ucon = NURI_UCON_DEFAULT,
67 .ulcon = NURI_ULCON_DEFAULT,
68 .ufcon = NURI_UFCON_DEFAULT,
72 .ucon = NURI_UCON_DEFAULT,
73 .ulcon = NURI_ULCON_DEFAULT,
74 .ufcon = NURI_UFCON_DEFAULT,
78 .ucon = NURI_UCON_DEFAULT,
79 .ulcon = NURI_ULCON_DEFAULT,
80 .ufcon = NURI_UFCON_DEFAULT,
84 .ucon = NURI_UCON_DEFAULT,
85 .ulcon = NURI_ULCON_DEFAULT,
86 .ufcon = NURI_UFCON_DEFAULT,
91 static struct s3c_sdhci_platdata nuri_hsmmc0_data __initdata = {
93 .host_caps = (MMC_CAP_8_BIT_DATA | MMC_CAP_4_BIT_DATA |
94 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
95 MMC_CAP_DISABLE | MMC_CAP_ERASE),
96 .cd_type = S3C_SDHCI_CD_PERMANENT,
97 .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
100 static struct regulator_consumer_supply emmc_supplies[] = {
101 REGULATOR_SUPPLY("vmmc", "s3c-sdhci.0"),
102 REGULATOR_SUPPLY("vmmc", "dw_mmc"),
105 static struct regulator_init_data emmc_fixed_voltage_init_data = {
107 .name = "VMEM_VDD_2.8V",
108 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
110 .num_consumer_supplies = ARRAY_SIZE(emmc_supplies),
111 .consumer_supplies = emmc_supplies,
114 static struct fixed_voltage_config emmc_fixed_voltage_config = {
115 .supply_name = "MASSMEMORY_EN (inverted)",
116 .microvolts = 2800000,
117 .gpio = EXYNOS4_GPL1(1),
118 .enable_high = false,
119 .init_data = &emmc_fixed_voltage_init_data,
122 static struct platform_device emmc_fixed_voltage = {
123 .name = "reg-fixed-voltage",
124 .id = FIXED_REG_ID_MMC,
126 .platform_data = &emmc_fixed_voltage_config,
131 static struct s3c_sdhci_platdata nuri_hsmmc2_data __initdata = {
133 .host_caps = MMC_CAP_4_BIT_DATA |
134 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
136 .ext_cd_gpio = EXYNOS4_GPX3(3), /* XEINT_27 */
137 .ext_cd_gpio_invert = 1,
138 .cd_type = S3C_SDHCI_CD_GPIO,
139 .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
143 static struct s3c_sdhci_platdata nuri_hsmmc3_data __initdata = {
145 .host_caps = MMC_CAP_4_BIT_DATA |
146 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
147 .cd_type = S3C_SDHCI_CD_EXTERNAL,
148 .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
151 static void __init nuri_sdhci_init(void)
153 s3c_sdhci0_set_platdata(&nuri_hsmmc0_data);
154 s3c_sdhci2_set_platdata(&nuri_hsmmc2_data);
155 s3c_sdhci3_set_platdata(&nuri_hsmmc3_data);
159 static struct gpio_keys_button nuri_gpio_keys_tables[] = {
161 .code = KEY_VOLUMEUP,
162 .gpio = EXYNOS4_GPX2(0), /* XEINT16 */
163 .desc = "gpio-keys: KEY_VOLUMEUP",
166 .debounce_interval = 1,
168 .code = KEY_VOLUMEDOWN,
169 .gpio = EXYNOS4_GPX2(1), /* XEINT17 */
170 .desc = "gpio-keys: KEY_VOLUMEDOWN",
173 .debounce_interval = 1,
176 .gpio = EXYNOS4_GPX2(7), /* XEINT23 */
177 .desc = "gpio-keys: KEY_POWER",
181 .debounce_interval = 1,
185 static struct gpio_keys_platform_data nuri_gpio_keys_data = {
186 .buttons = nuri_gpio_keys_tables,
187 .nbuttons = ARRAY_SIZE(nuri_gpio_keys_tables),
190 static struct platform_device nuri_gpio_keys = {
193 .platform_data = &nuri_gpio_keys_data,
197 static void nuri_lcd_power_on(struct plat_lcd_data *pd, unsigned int power)
199 int gpio = EXYNOS4_GPE1(5);
201 gpio_request(gpio, "LVDS_nSHDN");
202 gpio_direction_output(gpio, power);
206 static int nuri_bl_init(struct device *dev)
208 int ret, gpio = EXYNOS4_GPE2(3);
210 ret = gpio_request(gpio, "LCD_LDO_EN");
212 gpio_direction_output(gpio, 0);
217 static int nuri_bl_notify(struct device *dev, int brightness)
222 gpio_set_value(EXYNOS4_GPE2(3), 1);
227 static void nuri_bl_exit(struct device *dev)
229 gpio_free(EXYNOS4_GPE2(3));
232 /* nuri pwm backlight */
233 static struct platform_pwm_backlight_data nuri_backlight_data = {
235 .pwm_period_ns = 30000,
236 .max_brightness = 100,
237 .dft_brightness = 50,
238 .init = nuri_bl_init,
239 .notify = nuri_bl_notify,
240 .exit = nuri_bl_exit,
243 static struct platform_device nuri_backlight_device = {
244 .name = "pwm-backlight",
247 .parent = &s3c_device_timer[0].dev,
248 .platform_data = &nuri_backlight_data,
252 static struct plat_lcd_data nuri_lcd_platform_data = {
253 .set_power = nuri_lcd_power_on,
256 static struct platform_device nuri_lcd_device = {
257 .name = "platform-lcd",
260 .platform_data = &nuri_lcd_platform_data,
265 static struct i2c_board_info i2c1_devs[] __initdata = {
266 /* Gyro, To be updated */
270 static u8 mxt_init_vals[] = {
271 /* MXT_GEN_COMMAND(6) */
272 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
273 /* MXT_GEN_POWER(7) */
275 /* MXT_GEN_ACQUIRE(8) */
276 0x0a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x23,
277 /* MXT_TOUCH_MULTI(9) */
278 0x00, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00,
279 0x00, 0x01, 0x01, 0x0e, 0x0a, 0x0a, 0x0a, 0x0a, 0x00, 0x00,
280 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
282 /* MXT_TOUCH_KEYARRAY(15) */
283 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
285 /* MXT_SPT_GPIOPWM(19) */
286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
287 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
288 /* MXT_PROCI_GRIPFACE(20) */
289 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x28, 0x04,
291 /* MXT_PROCG_NOISE(22) */
292 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x23, 0x00,
293 0x00, 0x05, 0x0f, 0x19, 0x23, 0x2d, 0x03,
294 /* MXT_TOUCH_PROXIMITY(23) */
295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
296 0x00, 0x00, 0x00, 0x00, 0x00,
297 /* MXT_PROCI_ONETOUCH(24) */
298 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
300 /* MXT_SPT_SELFTEST(25) */
301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
302 0x00, 0x00, 0x00, 0x00,
303 /* MXT_PROCI_TWOTOUCH(27) */
304 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
305 /* MXT_SPT_CTECONFIG(28) */
306 0x00, 0x00, 0x02, 0x08, 0x10, 0x00,
309 static struct mxt_platform_data mxt_platform_data = {
310 .config = mxt_init_vals,
311 .config_length = ARRAY_SIZE(mxt_init_vals),
319 .voltage = 2800000, /* 2.8V */
320 .orient = MXT_DIAGONAL_COUNTER,
321 .irqflags = IRQF_TRIGGER_FALLING,
324 static struct s3c2410_platform_i2c i2c3_data __initdata = {
328 .frequency = 400 * 1000,
332 static struct i2c_board_info i2c3_devs[] __initdata = {
334 I2C_BOARD_INFO("atmel_mxt_ts", 0x4a),
335 .platform_data = &mxt_platform_data,
340 static void __init nuri_tsp_init(void)
344 /* TOUCH_INT: XEINT_4 */
345 gpio = EXYNOS4_GPX0(4);
346 gpio_request(gpio, "TOUCH_INT");
347 s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf));
348 s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
351 static struct regulator_consumer_supply __initdata max8997_ldo1_[] = {
352 REGULATOR_SUPPLY("vdd", "s5p-adc"), /* Used by CPU's ADC drv */
354 static struct regulator_consumer_supply __initdata max8997_ldo3_[] = {
355 REGULATOR_SUPPLY("vdd11", "s5p-mipi-csis.0"), /* MIPI */
357 static struct regulator_consumer_supply __initdata max8997_ldo4_[] = {
358 REGULATOR_SUPPLY("vdd18", "s5p-mipi-csis.0"), /* MIPI */
360 static struct regulator_consumer_supply __initdata max8997_ldo5_[] = {
361 REGULATOR_SUPPLY("vhsic", "modemctl"), /* MODEM */
363 static struct regulator_consumer_supply __initdata max8997_ldo7_[] = {
364 REGULATOR_SUPPLY("dig_18", "0-001f"), /* HCD803 */
366 static struct regulator_consumer_supply __initdata max8997_ldo8_[] = {
367 REGULATOR_SUPPLY("vusb_d", NULL), /* Used by CPU */
368 REGULATOR_SUPPLY("vdac", NULL), /* Used by CPU */
370 static struct regulator_consumer_supply __initdata max8997_ldo11_[] = {
371 REGULATOR_SUPPLY("vcc", "platform-lcd"), /* U804 LVDS */
373 static struct regulator_consumer_supply __initdata max8997_ldo12_[] = {
374 REGULATOR_SUPPLY("vddio", "6-003c"), /* HDC802 */
376 static struct regulator_consumer_supply __initdata max8997_ldo13_[] = {
377 REGULATOR_SUPPLY("vmmc", "s3c-sdhci.2"), /* TFLASH */
379 static struct regulator_consumer_supply __initdata max8997_ldo14_[] = {
380 REGULATOR_SUPPLY("inmotor", "max8997-haptic"),
382 static struct regulator_consumer_supply __initdata max8997_ldo15_[] = {
383 REGULATOR_SUPPLY("avdd", "3-004a"), /* Touch Screen */
385 static struct regulator_consumer_supply __initdata max8997_ldo16_[] = {
386 REGULATOR_SUPPLY("d_sensor", "0-001f"), /* HDC803 */
388 static struct regulator_consumer_supply __initdata max8997_ldo18_[] = {
389 REGULATOR_SUPPLY("vdd", "3-004a"), /* Touch Screen */
391 static struct regulator_consumer_supply __initdata max8997_buck1_[] = {
392 REGULATOR_SUPPLY("vdd_arm", NULL), /* CPUFREQ */
394 static struct regulator_consumer_supply __initdata max8997_buck2_[] = {
395 REGULATOR_SUPPLY("vdd_int", NULL), /* CPUFREQ */
397 static struct regulator_consumer_supply __initdata max8997_buck3_[] = {
398 REGULATOR_SUPPLY("vdd", "mali_dev.0"), /* G3D of Exynos 4 */
400 static struct regulator_consumer_supply __initdata max8997_buck4_[] = {
401 REGULATOR_SUPPLY("core", "0-001f"), /* HDC803 */
403 static struct regulator_consumer_supply __initdata max8997_buck6_[] = {
404 REGULATOR_SUPPLY("dig_28", "0-001f"), /* pin "7" of HDC803 */
406 static struct regulator_consumer_supply __initdata max8997_esafeout1_[] = {
407 REGULATOR_SUPPLY("usb_vbus", NULL), /* CPU's USB OTG */
409 static struct regulator_consumer_supply __initdata max8997_esafeout2_[] = {
410 REGULATOR_SUPPLY("usb_vbus", "modemctl"), /* VBUS of Modem */
413 static struct regulator_consumer_supply __initdata max8997_charger_[] = {
414 REGULATOR_SUPPLY("vinchg1", "charger-manager.0"),
416 static struct regulator_consumer_supply __initdata max8997_chg_toff_[] = {
417 REGULATOR_SUPPLY("vinchg_stop", NULL), /* for jack interrupt handlers */
420 static struct regulator_consumer_supply __initdata max8997_32khz_ap_[] = {
421 REGULATOR_SUPPLY("gps_clk", "bcm4751"),
422 REGULATOR_SUPPLY("bt_clk", "bcm4330-b1"),
423 REGULATOR_SUPPLY("wifi_clk", "bcm433-b1"),
426 static struct regulator_init_data __initdata max8997_ldo1_data = {
428 .name = "VADC_3.3V_C210",
431 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
437 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo1_),
438 .consumer_supplies = max8997_ldo1_,
441 static struct regulator_init_data __initdata max8997_ldo2_data = {
443 .name = "VALIVE_1.1V_C210",
454 static struct regulator_init_data __initdata max8997_ldo3_data = {
456 .name = "VUSB_1.1V_C210",
459 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
465 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo3_),
466 .consumer_supplies = max8997_ldo3_,
469 static struct regulator_init_data __initdata max8997_ldo4_data = {
471 .name = "VMIPI_1.8V",
474 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
480 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo4_),
481 .consumer_supplies = max8997_ldo4_,
484 static struct regulator_init_data __initdata max8997_ldo5_data = {
486 .name = "VHSIC_1.2V_C210",
489 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
495 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo5_),
496 .consumer_supplies = max8997_ldo5_,
499 static struct regulator_init_data __initdata max8997_ldo6_data = {
501 .name = "VCC_1.8V_PDA",
512 static struct regulator_init_data __initdata max8997_ldo7_data = {
514 .name = "CAM_ISP_1.8V",
517 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
523 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo7_),
524 .consumer_supplies = max8997_ldo7_,
527 static struct regulator_init_data __initdata max8997_ldo8_data = {
529 .name = "VUSB/VDAC_3.3V_C210",
532 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
538 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo8_),
539 .consumer_supplies = max8997_ldo8_,
542 static struct regulator_init_data __initdata max8997_ldo9_data = {
544 .name = "VCC_2.8V_PDA",
555 static struct regulator_init_data __initdata max8997_ldo10_data = {
557 .name = "VPLL_1.1V_C210",
568 static struct regulator_init_data __initdata max8997_ldo11_data = {
570 .name = "LVDS_VDD3.3V",
573 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
580 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo11_),
581 .consumer_supplies = max8997_ldo11_,
584 static struct regulator_init_data __initdata max8997_ldo12_data = {
586 .name = "VT_CAM_1.8V",
589 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
595 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo12_),
596 .consumer_supplies = max8997_ldo12_,
599 static struct regulator_init_data __initdata max8997_ldo13_data = {
604 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
610 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo13_),
611 .consumer_supplies = max8997_ldo13_,
614 static struct regulator_init_data __initdata max8997_ldo14_data = {
616 .name = "VCC_3.0V_MOTOR",
619 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
625 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo14_),
626 .consumer_supplies = max8997_ldo14_,
629 static struct regulator_init_data __initdata max8997_ldo15_data = {
631 .name = "VTOUCH_ADVV2.8V",
635 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
640 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo15_),
641 .consumer_supplies = max8997_ldo15_,
644 static struct regulator_init_data __initdata max8997_ldo16_data = {
646 .name = "CAM_SENSOR_IO_1.8V",
649 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
655 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo16_),
656 .consumer_supplies = max8997_ldo16_,
659 static struct regulator_init_data __initdata max8997_ldo18_data = {
661 .name = "VTOUCH_VDD2.8V",
664 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
670 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo18_),
671 .consumer_supplies = max8997_ldo18_,
674 static struct regulator_init_data __initdata max8997_ldo21_data = {
676 .name = "VDDQ_M1M2_1.2V",
687 static struct regulator_init_data __initdata max8997_buck1_data = {
689 .name = "VARM_1.2V_C210",
692 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
698 .num_consumer_supplies = ARRAY_SIZE(max8997_buck1_),
699 .consumer_supplies = max8997_buck1_,
702 static struct regulator_init_data __initdata max8997_buck2_data = {
704 .name = "VINT_1.1V_C210",
707 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
713 .num_consumer_supplies = ARRAY_SIZE(max8997_buck2_),
714 .consumer_supplies = max8997_buck2_,
717 static struct regulator_init_data __initdata max8997_buck3_data = {
719 .name = "VG3D_1.1V_C210",
722 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
723 REGULATOR_CHANGE_STATUS,
728 .num_consumer_supplies = ARRAY_SIZE(max8997_buck3_),
729 .consumer_supplies = max8997_buck3_,
732 static struct regulator_init_data __initdata max8997_buck4_data = {
734 .name = "CAM_ISP_CORE_1.2V",
738 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
743 .num_consumer_supplies = ARRAY_SIZE(max8997_buck4_),
744 .consumer_supplies = max8997_buck4_,
747 static struct regulator_init_data __initdata max8997_buck5_data = {
749 .name = "VMEM_1.2V_C210",
760 static struct regulator_init_data __initdata max8997_buck6_data = {
762 .name = "CAM_AF_2.8V",
765 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
770 .num_consumer_supplies = ARRAY_SIZE(max8997_buck6_),
771 .consumer_supplies = max8997_buck6_,
774 static struct regulator_init_data __initdata max8997_buck7_data = {
776 .name = "VCC_SUB_2.0V",
787 static struct regulator_init_data __initdata max8997_32khz_ap_data = {
795 .num_consumer_supplies = ARRAY_SIZE(max8997_32khz_ap_),
796 .consumer_supplies = max8997_32khz_ap_,
799 static struct regulator_init_data __initdata max8997_32khz_cp_data = {
808 static struct regulator_init_data __initdata max8997_vichg_data = {
817 static struct regulator_init_data __initdata max8997_esafeout1_data = {
820 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
825 .num_consumer_supplies = ARRAY_SIZE(max8997_esafeout1_),
826 .consumer_supplies = max8997_esafeout1_,
829 static struct regulator_init_data __initdata max8997_esafeout2_data = {
832 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
837 .num_consumer_supplies = ARRAY_SIZE(max8997_esafeout2_),
838 .consumer_supplies = max8997_esafeout2_,
841 static struct regulator_init_data __initdata max8997_charger_cv_data = {
843 .name = "CHARGER_CV",
850 static struct regulator_init_data __initdata max8997_charger_data = {
856 .valid_ops_mask = REGULATOR_CHANGE_STATUS |
857 REGULATOR_CHANGE_CURRENT,
859 .num_consumer_supplies = ARRAY_SIZE(max8997_charger_),
860 .consumer_supplies = max8997_charger_,
863 static struct regulator_init_data __initdata max8997_charger_topoff_data = {
865 .name = "CHARGER TOPOFF",
868 .valid_ops_mask = REGULATOR_CHANGE_CURRENT,
870 .num_consumer_supplies = ARRAY_SIZE(max8997_chg_toff_),
871 .consumer_supplies = max8997_chg_toff_,
874 static struct max8997_regulator_data __initdata nuri_max8997_regulators[] = {
875 { MAX8997_LDO1, &max8997_ldo1_data },
876 { MAX8997_LDO2, &max8997_ldo2_data },
877 { MAX8997_LDO3, &max8997_ldo3_data },
878 { MAX8997_LDO4, &max8997_ldo4_data },
879 { MAX8997_LDO5, &max8997_ldo5_data },
880 { MAX8997_LDO6, &max8997_ldo6_data },
881 { MAX8997_LDO7, &max8997_ldo7_data },
882 { MAX8997_LDO8, &max8997_ldo8_data },
883 { MAX8997_LDO9, &max8997_ldo9_data },
884 { MAX8997_LDO10, &max8997_ldo10_data },
885 { MAX8997_LDO11, &max8997_ldo11_data },
886 { MAX8997_LDO12, &max8997_ldo12_data },
887 { MAX8997_LDO13, &max8997_ldo13_data },
888 { MAX8997_LDO14, &max8997_ldo14_data },
889 { MAX8997_LDO15, &max8997_ldo15_data },
890 { MAX8997_LDO16, &max8997_ldo16_data },
892 { MAX8997_LDO18, &max8997_ldo18_data },
893 { MAX8997_LDO21, &max8997_ldo21_data },
895 { MAX8997_BUCK1, &max8997_buck1_data },
896 { MAX8997_BUCK2, &max8997_buck2_data },
897 { MAX8997_BUCK3, &max8997_buck3_data },
898 { MAX8997_BUCK4, &max8997_buck4_data },
899 { MAX8997_BUCK5, &max8997_buck5_data },
900 { MAX8997_BUCK6, &max8997_buck6_data },
901 { MAX8997_BUCK7, &max8997_buck7_data },
903 { MAX8997_EN32KHZ_AP, &max8997_32khz_ap_data },
904 { MAX8997_EN32KHZ_CP, &max8997_32khz_cp_data },
906 { MAX8997_ENVICHG, &max8997_vichg_data },
907 { MAX8997_ESAFEOUT1, &max8997_esafeout1_data },
908 { MAX8997_ESAFEOUT2, &max8997_esafeout2_data },
909 { MAX8997_CHARGER_CV, &max8997_charger_cv_data },
910 { MAX8997_CHARGER, &max8997_charger_data },
911 { MAX8997_CHARGER_TOPOFF, &max8997_charger_topoff_data },
914 static struct max8997_platform_data __initdata nuri_max8997_pdata = {
917 .num_regulators = ARRAY_SIZE(nuri_max8997_regulators),
918 .regulators = nuri_max8997_regulators,
920 .buck125_gpios = { EXYNOS4_GPX0(5), EXYNOS4_GPX0(6), EXYNOS4_GPL0(0) },
921 .buck2_gpiodvs = true,
923 .buck1_voltage[0] = 1350000, /* 1.35V */
924 .buck1_voltage[1] = 1300000, /* 1.3V */
925 .buck1_voltage[2] = 1250000, /* 1.25V */
926 .buck1_voltage[3] = 1200000, /* 1.2V */
927 .buck1_voltage[4] = 1150000, /* 1.15V */
928 .buck1_voltage[5] = 1100000, /* 1.1V */
929 .buck1_voltage[6] = 1000000, /* 1.0V */
930 .buck1_voltage[7] = 950000, /* 0.95V */
932 .buck2_voltage[0] = 1100000, /* 1.1V */
933 .buck2_voltage[1] = 1000000, /* 1.0V */
934 .buck2_voltage[2] = 950000, /* 0.95V */
935 .buck2_voltage[3] = 900000, /* 0.9V */
936 .buck2_voltage[4] = 1100000, /* 1.1V */
937 .buck2_voltage[5] = 1000000, /* 1.0V */
938 .buck2_voltage[6] = 950000, /* 0.95V */
939 .buck2_voltage[7] = 900000, /* 0.9V */
941 .buck5_voltage[0] = 1200000, /* 1.2V */
942 .buck5_voltage[1] = 1200000, /* 1.2V */
943 .buck5_voltage[2] = 1200000, /* 1.2V */
944 .buck5_voltage[3] = 1200000, /* 1.2V */
945 .buck5_voltage[4] = 1200000, /* 1.2V */
946 .buck5_voltage[5] = 1200000, /* 1.2V */
947 .buck5_voltage[6] = 1200000, /* 1.2V */
948 .buck5_voltage[7] = 1200000, /* 1.2V */
951 /* GPIO I2C 5 (PMIC) */
952 enum { I2C5_MAX8997 };
953 static struct i2c_board_info i2c5_devs[] __initdata = {
955 I2C_BOARD_INFO("max8997", 0xCC >> 1),
956 .platform_data = &nuri_max8997_pdata,
960 static struct max17042_platform_data nuri_battery_platform_data = {
963 /* GPIO I2C 9 (Fuel Gauge) */
964 static struct i2c_gpio_platform_data i2c9_gpio_data = {
965 .sda_pin = EXYNOS4_GPY4(0), /* XM0ADDR_8 */
966 .scl_pin = EXYNOS4_GPY4(1), /* XM0ADDR_9 */
968 static struct platform_device i2c9_gpio = {
972 .platform_data = &i2c9_gpio_data,
975 enum { I2C9_MAX17042};
976 static struct i2c_board_info i2c9_devs[] __initdata = {
978 I2C_BOARD_INFO("max17042", 0x36),
979 .platform_data = &nuri_battery_platform_data,
983 static void __init nuri_power_init(void)
986 int irq_base = IRQ_GPIO_END + 1;
988 nuri_max8997_pdata.irq_base = irq_base;
989 irq_base += MAX8997_IRQ_NR;
991 gpio = EXYNOS4_GPX0(7);
992 gpio_request(gpio, "AP_PMIC_IRQ");
993 s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf));
994 s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
996 gpio = EXYNOS4_GPX2(3);
997 gpio_request(gpio, "FUEL_ALERT");
998 s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf));
999 s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
1003 static struct s5p_ehci_platdata nuri_ehci_pdata;
1005 static void __init nuri_ehci_init(void)
1007 struct s5p_ehci_platdata *pdata = &nuri_ehci_pdata;
1009 s5p_ehci_set_platdata(pdata);
1012 static struct platform_device *nuri_devices[] __initdata = {
1013 /* Samsung Platform Devices */
1014 &s3c_device_i2c5, /* PMIC should initialize first */
1015 &emmc_fixed_voltage,
1020 &s3c_device_timer[0],
1028 &nuri_backlight_device,
1031 static void __init nuri_map_io(void)
1033 s5p_init_io(NULL, 0, S5P_VA_CHIPID);
1034 s3c24xx_init_clocks(24000000);
1035 s3c24xx_init_uarts(nuri_uartcfgs, ARRAY_SIZE(nuri_uartcfgs));
1038 static void __init nuri_machine_init(void)
1044 i2c_register_board_info(1, i2c1_devs, ARRAY_SIZE(i2c1_devs));
1045 s3c_i2c3_set_platdata(&i2c3_data);
1046 i2c_register_board_info(3, i2c3_devs, ARRAY_SIZE(i2c3_devs));
1047 s3c_i2c5_set_platdata(NULL);
1048 i2c5_devs[I2C5_MAX8997].irq = gpio_to_irq(EXYNOS4_GPX0(7));
1049 i2c_register_board_info(5, i2c5_devs, ARRAY_SIZE(i2c5_devs));
1050 i2c9_devs[I2C9_MAX17042].irq = gpio_to_irq(EXYNOS4_GPX2(3));
1051 i2c_register_board_info(9, i2c9_devs, ARRAY_SIZE(i2c9_devs));
1054 clk_xusbxti.rate = 24000000;
1057 platform_add_devices(nuri_devices, ARRAY_SIZE(nuri_devices));
1060 MACHINE_START(NURI, "NURI")
1061 /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */
1062 .boot_params = S5P_PA_SDRAM + 0x100,
1063 .init_irq = exynos4_init_irq,
1064 .map_io = nuri_map_io,
1065 .init_machine = nuri_machine_init,
1066 .timer = &exynos4_timer,