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>
31 #include <asm/mach/arch.h>
32 #include <asm/mach-types.h>
35 #include <plat/regs-serial.h>
36 #include <plat/exynos4.h>
38 #include <plat/devs.h>
39 #include <plat/sdhci.h>
40 #include <plat/ehci.h>
41 #include <plat/clock.h>
42 #include <plat/gpio-cfg.h>
47 /* Following are default values for UCON, ULCON and UFCON UART registers */
48 #define NURI_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \
49 S3C2410_UCON_RXILEVEL | \
50 S3C2410_UCON_TXIRQMODE | \
51 S3C2410_UCON_RXIRQMODE | \
52 S3C2410_UCON_RXFIFO_TOI | \
53 S3C2443_UCON_RXERR_IRQEN)
55 #define NURI_ULCON_DEFAULT S3C2410_LCON_CS8
57 #define NURI_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE | \
58 S5PV210_UFCON_TXTRIG256 | \
59 S5PV210_UFCON_RXTRIG256)
61 enum fixed_regulator_id {
66 static struct s3c2410_uartcfg nuri_uartcfgs[] __initdata = {
69 .ucon = NURI_UCON_DEFAULT,
70 .ulcon = NURI_ULCON_DEFAULT,
71 .ufcon = NURI_UFCON_DEFAULT,
75 .ucon = NURI_UCON_DEFAULT,
76 .ulcon = NURI_ULCON_DEFAULT,
77 .ufcon = NURI_UFCON_DEFAULT,
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,
94 static struct s3c_sdhci_platdata nuri_hsmmc0_data __initdata = {
96 .host_caps = (MMC_CAP_8_BIT_DATA | MMC_CAP_4_BIT_DATA |
97 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
98 MMC_CAP_DISABLE | MMC_CAP_ERASE),
99 .cd_type = S3C_SDHCI_CD_PERMANENT,
100 .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
103 static struct regulator_consumer_supply emmc_supplies[] = {
104 REGULATOR_SUPPLY("vmmc", "s3c-sdhci.0"),
105 REGULATOR_SUPPLY("vmmc", "dw_mmc"),
108 static struct regulator_init_data emmc_fixed_voltage_init_data = {
110 .name = "VMEM_VDD_2.8V",
111 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
113 .num_consumer_supplies = ARRAY_SIZE(emmc_supplies),
114 .consumer_supplies = emmc_supplies,
117 static struct fixed_voltage_config emmc_fixed_voltage_config = {
118 .supply_name = "MASSMEMORY_EN (inverted)",
119 .microvolts = 2800000,
120 .gpio = EXYNOS4_GPL1(1),
121 .enable_high = false,
122 .init_data = &emmc_fixed_voltage_init_data,
125 static struct platform_device emmc_fixed_voltage = {
126 .name = "reg-fixed-voltage",
127 .id = FIXED_REG_ID_MMC,
129 .platform_data = &emmc_fixed_voltage_config,
134 static struct s3c_sdhci_platdata nuri_hsmmc2_data __initdata = {
136 .host_caps = MMC_CAP_4_BIT_DATA |
137 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
139 .ext_cd_gpio = EXYNOS4_GPX3(3), /* XEINT_27 */
140 .ext_cd_gpio_invert = 1,
141 .cd_type = S3C_SDHCI_CD_GPIO,
142 .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
146 static struct s3c_sdhci_platdata nuri_hsmmc3_data __initdata = {
148 .host_caps = MMC_CAP_4_BIT_DATA |
149 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
150 .cd_type = S3C_SDHCI_CD_EXTERNAL,
151 .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
154 static void __init nuri_sdhci_init(void)
156 s3c_sdhci0_set_platdata(&nuri_hsmmc0_data);
157 s3c_sdhci2_set_platdata(&nuri_hsmmc2_data);
158 s3c_sdhci3_set_platdata(&nuri_hsmmc3_data);
162 static struct gpio_keys_button nuri_gpio_keys_tables[] = {
164 .code = KEY_VOLUMEUP,
165 .gpio = EXYNOS4_GPX2(0), /* XEINT16 */
166 .desc = "gpio-keys: KEY_VOLUMEUP",
169 .debounce_interval = 1,
171 .code = KEY_VOLUMEDOWN,
172 .gpio = EXYNOS4_GPX2(1), /* XEINT17 */
173 .desc = "gpio-keys: KEY_VOLUMEDOWN",
176 .debounce_interval = 1,
179 .gpio = EXYNOS4_GPX2(7), /* XEINT23 */
180 .desc = "gpio-keys: KEY_POWER",
184 .debounce_interval = 1,
188 static struct gpio_keys_platform_data nuri_gpio_keys_data = {
189 .buttons = nuri_gpio_keys_tables,
190 .nbuttons = ARRAY_SIZE(nuri_gpio_keys_tables),
193 static struct platform_device nuri_gpio_keys = {
196 .platform_data = &nuri_gpio_keys_data,
200 static void nuri_lcd_power_on(struct plat_lcd_data *pd, unsigned int power)
202 int gpio = EXYNOS4_GPE1(5);
204 gpio_request(gpio, "LVDS_nSHDN");
205 gpio_direction_output(gpio, power);
209 static int nuri_bl_init(struct device *dev)
211 int ret, gpio = EXYNOS4_GPE2(3);
213 ret = gpio_request(gpio, "LCD_LDO_EN");
215 gpio_direction_output(gpio, 0);
220 static int nuri_bl_notify(struct device *dev, int brightness)
225 gpio_set_value(EXYNOS4_GPE2(3), 1);
230 static void nuri_bl_exit(struct device *dev)
232 gpio_free(EXYNOS4_GPE2(3));
235 /* nuri pwm backlight */
236 static struct platform_pwm_backlight_data nuri_backlight_data = {
238 .pwm_period_ns = 30000,
239 .max_brightness = 100,
240 .dft_brightness = 50,
241 .init = nuri_bl_init,
242 .notify = nuri_bl_notify,
243 .exit = nuri_bl_exit,
246 static struct platform_device nuri_backlight_device = {
247 .name = "pwm-backlight",
250 .parent = &s3c_device_timer[0].dev,
251 .platform_data = &nuri_backlight_data,
255 static struct plat_lcd_data nuri_lcd_platform_data = {
256 .set_power = nuri_lcd_power_on,
259 static struct platform_device nuri_lcd_device = {
260 .name = "platform-lcd",
263 .platform_data = &nuri_lcd_platform_data,
268 static struct i2c_board_info i2c1_devs[] __initdata = {
269 /* Gyro, To be updated */
273 static u8 mxt_init_vals[] = {
274 /* MXT_GEN_COMMAND(6) */
275 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
276 /* MXT_GEN_POWER(7) */
278 /* MXT_GEN_ACQUIRE(8) */
279 0x0a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x23,
280 /* MXT_TOUCH_MULTI(9) */
281 0x00, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00,
282 0x00, 0x01, 0x01, 0x0e, 0x0a, 0x0a, 0x0a, 0x0a, 0x00, 0x00,
283 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
285 /* MXT_TOUCH_KEYARRAY(15) */
286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
288 /* MXT_SPT_GPIOPWM(19) */
289 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
290 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
291 /* MXT_PROCI_GRIPFACE(20) */
292 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x28, 0x04,
294 /* MXT_PROCG_NOISE(22) */
295 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x23, 0x00,
296 0x00, 0x05, 0x0f, 0x19, 0x23, 0x2d, 0x03,
297 /* MXT_TOUCH_PROXIMITY(23) */
298 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
299 0x00, 0x00, 0x00, 0x00, 0x00,
300 /* MXT_PROCI_ONETOUCH(24) */
301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
302 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
303 /* MXT_SPT_SELFTEST(25) */
304 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
305 0x00, 0x00, 0x00, 0x00,
306 /* MXT_PROCI_TWOTOUCH(27) */
307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308 /* MXT_SPT_CTECONFIG(28) */
309 0x00, 0x00, 0x02, 0x08, 0x10, 0x00,
312 static struct mxt_platform_data mxt_platform_data = {
313 .config = mxt_init_vals,
314 .config_length = ARRAY_SIZE(mxt_init_vals),
322 .voltage = 2800000, /* 2.8V */
323 .orient = MXT_DIAGONAL_COUNTER,
324 .irqflags = IRQF_TRIGGER_FALLING,
327 static struct s3c2410_platform_i2c i2c3_data __initdata = {
331 .frequency = 400 * 1000,
335 static struct i2c_board_info i2c3_devs[] __initdata = {
337 I2C_BOARD_INFO("atmel_mxt_ts", 0x4a),
338 .platform_data = &mxt_platform_data,
343 static void __init nuri_tsp_init(void)
347 /* TOUCH_INT: XEINT_4 */
348 gpio = EXYNOS4_GPX0(4);
349 gpio_request(gpio, "TOUCH_INT");
350 s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf));
351 s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
354 static struct regulator_consumer_supply __initdata max8997_ldo1_[] = {
355 REGULATOR_SUPPLY("vdd", "s5p-adc"), /* Used by CPU's ADC drv */
357 static struct regulator_consumer_supply __initdata max8997_ldo3_[] = {
358 REGULATOR_SUPPLY("vdd11", "s5p-mipi-csis.0"), /* MIPI */
360 static struct regulator_consumer_supply __initdata max8997_ldo4_[] = {
361 REGULATOR_SUPPLY("vdd18", "s5p-mipi-csis.0"), /* MIPI */
363 static struct regulator_consumer_supply __initdata max8997_ldo5_[] = {
364 REGULATOR_SUPPLY("vhsic", "modemctl"), /* MODEM */
366 static struct regulator_consumer_supply __initdata max8997_ldo7_[] = {
367 REGULATOR_SUPPLY("dig_18", "0-001f"), /* HCD803 */
369 static struct regulator_consumer_supply __initdata max8997_ldo8_[] = {
370 REGULATOR_SUPPLY("vusb_d", NULL), /* Used by CPU */
371 REGULATOR_SUPPLY("vdac", NULL), /* Used by CPU */
373 static struct regulator_consumer_supply __initdata max8997_ldo11_[] = {
374 REGULATOR_SUPPLY("vcc", "platform-lcd"), /* U804 LVDS */
376 static struct regulator_consumer_supply __initdata max8997_ldo12_[] = {
377 REGULATOR_SUPPLY("vddio", "6-003c"), /* HDC802 */
379 static struct regulator_consumer_supply __initdata max8997_ldo13_[] = {
380 REGULATOR_SUPPLY("vmmc", "s3c-sdhci.2"), /* TFLASH */
382 static struct regulator_consumer_supply __initdata max8997_ldo14_[] = {
383 REGULATOR_SUPPLY("inmotor", "max8997-haptic"),
385 static struct regulator_consumer_supply __initdata max8997_ldo15_[] = {
386 REGULATOR_SUPPLY("avdd", "3-004a"), /* Touch Screen */
388 static struct regulator_consumer_supply __initdata max8997_ldo16_[] = {
389 REGULATOR_SUPPLY("d_sensor", "0-001f"), /* HDC803 */
391 static struct regulator_consumer_supply __initdata max8997_ldo18_[] = {
392 REGULATOR_SUPPLY("vdd", "3-004a"), /* Touch Screen */
394 static struct regulator_consumer_supply __initdata max8997_buck1_[] = {
395 REGULATOR_SUPPLY("vdd_arm", NULL), /* CPUFREQ */
397 static struct regulator_consumer_supply __initdata max8997_buck2_[] = {
398 REGULATOR_SUPPLY("vdd_int", NULL), /* CPUFREQ */
400 static struct regulator_consumer_supply __initdata max8997_buck3_[] = {
401 REGULATOR_SUPPLY("vdd", "mali_dev.0"), /* G3D of Exynos 4 */
403 static struct regulator_consumer_supply __initdata max8997_buck4_[] = {
404 REGULATOR_SUPPLY("core", "0-001f"), /* HDC803 */
406 static struct regulator_consumer_supply __initdata max8997_buck6_[] = {
407 REGULATOR_SUPPLY("dig_28", "0-001f"), /* pin "7" of HDC803 */
409 static struct regulator_consumer_supply __initdata max8997_esafeout1_[] = {
410 REGULATOR_SUPPLY("usb_vbus", NULL), /* CPU's USB OTG */
412 static struct regulator_consumer_supply __initdata max8997_esafeout2_[] = {
413 REGULATOR_SUPPLY("usb_vbus", "modemctl"), /* VBUS of Modem */
416 static struct regulator_consumer_supply __initdata max8997_charger_[] = {
417 REGULATOR_SUPPLY("vinchg1", "charger-manager.0"),
419 static struct regulator_consumer_supply __initdata max8997_chg_toff_[] = {
420 REGULATOR_SUPPLY("vinchg_stop", NULL), /* for jack interrupt handlers */
423 static struct regulator_consumer_supply __initdata max8997_32khz_ap_[] = {
424 REGULATOR_SUPPLY("gps_clk", "bcm4751"),
425 REGULATOR_SUPPLY("bt_clk", "bcm4330-b1"),
426 REGULATOR_SUPPLY("wifi_clk", "bcm433-b1"),
429 static struct regulator_init_data __initdata max8997_ldo1_data = {
431 .name = "VADC_3.3V_C210",
434 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
440 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo1_),
441 .consumer_supplies = max8997_ldo1_,
444 static struct regulator_init_data __initdata max8997_ldo2_data = {
446 .name = "VALIVE_1.1V_C210",
457 static struct regulator_init_data __initdata max8997_ldo3_data = {
459 .name = "VUSB_1.1V_C210",
462 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
468 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo3_),
469 .consumer_supplies = max8997_ldo3_,
472 static struct regulator_init_data __initdata max8997_ldo4_data = {
474 .name = "VMIPI_1.8V",
477 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
483 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo4_),
484 .consumer_supplies = max8997_ldo4_,
487 static struct regulator_init_data __initdata max8997_ldo5_data = {
489 .name = "VHSIC_1.2V_C210",
492 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
498 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo5_),
499 .consumer_supplies = max8997_ldo5_,
502 static struct regulator_init_data __initdata max8997_ldo6_data = {
504 .name = "VCC_1.8V_PDA",
515 static struct regulator_init_data __initdata max8997_ldo7_data = {
517 .name = "CAM_ISP_1.8V",
520 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
526 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo7_),
527 .consumer_supplies = max8997_ldo7_,
530 static struct regulator_init_data __initdata max8997_ldo8_data = {
532 .name = "VUSB/VDAC_3.3V_C210",
535 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
541 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo8_),
542 .consumer_supplies = max8997_ldo8_,
545 static struct regulator_init_data __initdata max8997_ldo9_data = {
547 .name = "VCC_2.8V_PDA",
558 static struct regulator_init_data __initdata max8997_ldo10_data = {
560 .name = "VPLL_1.1V_C210",
571 static struct regulator_init_data __initdata max8997_ldo11_data = {
573 .name = "LVDS_VDD3.3V",
576 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
583 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo11_),
584 .consumer_supplies = max8997_ldo11_,
587 static struct regulator_init_data __initdata max8997_ldo12_data = {
589 .name = "VT_CAM_1.8V",
592 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
598 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo12_),
599 .consumer_supplies = max8997_ldo12_,
602 static struct regulator_init_data __initdata max8997_ldo13_data = {
607 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
613 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo13_),
614 .consumer_supplies = max8997_ldo13_,
617 static struct regulator_init_data __initdata max8997_ldo14_data = {
619 .name = "VCC_3.0V_MOTOR",
622 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
628 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo14_),
629 .consumer_supplies = max8997_ldo14_,
632 static struct regulator_init_data __initdata max8997_ldo15_data = {
634 .name = "VTOUCH_ADVV2.8V",
638 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
643 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo15_),
644 .consumer_supplies = max8997_ldo15_,
647 static struct regulator_init_data __initdata max8997_ldo16_data = {
649 .name = "CAM_SENSOR_IO_1.8V",
652 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
658 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo16_),
659 .consumer_supplies = max8997_ldo16_,
662 static struct regulator_init_data __initdata max8997_ldo18_data = {
664 .name = "VTOUCH_VDD2.8V",
667 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
673 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo18_),
674 .consumer_supplies = max8997_ldo18_,
677 static struct regulator_init_data __initdata max8997_ldo21_data = {
679 .name = "VDDQ_M1M2_1.2V",
690 static struct regulator_init_data __initdata max8997_buck1_data = {
692 .name = "VARM_1.2V_C210",
695 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
701 .num_consumer_supplies = ARRAY_SIZE(max8997_buck1_),
702 .consumer_supplies = max8997_buck1_,
705 static struct regulator_init_data __initdata max8997_buck2_data = {
707 .name = "VINT_1.1V_C210",
710 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
716 .num_consumer_supplies = ARRAY_SIZE(max8997_buck2_),
717 .consumer_supplies = max8997_buck2_,
720 static struct regulator_init_data __initdata max8997_buck3_data = {
722 .name = "VG3D_1.1V_C210",
725 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
726 REGULATOR_CHANGE_STATUS,
731 .num_consumer_supplies = ARRAY_SIZE(max8997_buck3_),
732 .consumer_supplies = max8997_buck3_,
735 static struct regulator_init_data __initdata max8997_buck4_data = {
737 .name = "CAM_ISP_CORE_1.2V",
741 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
746 .num_consumer_supplies = ARRAY_SIZE(max8997_buck4_),
747 .consumer_supplies = max8997_buck4_,
750 static struct regulator_init_data __initdata max8997_buck5_data = {
752 .name = "VMEM_1.2V_C210",
763 static struct regulator_init_data __initdata max8997_buck6_data = {
765 .name = "CAM_AF_2.8V",
768 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
773 .num_consumer_supplies = ARRAY_SIZE(max8997_buck6_),
774 .consumer_supplies = max8997_buck6_,
777 static struct regulator_init_data __initdata max8997_buck7_data = {
779 .name = "VCC_SUB_2.0V",
790 static struct regulator_init_data __initdata max8997_32khz_ap_data = {
798 .num_consumer_supplies = ARRAY_SIZE(max8997_32khz_ap_),
799 .consumer_supplies = max8997_32khz_ap_,
802 static struct regulator_init_data __initdata max8997_32khz_cp_data = {
811 static struct regulator_init_data __initdata max8997_vichg_data = {
820 static struct regulator_init_data __initdata max8997_esafeout1_data = {
823 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
828 .num_consumer_supplies = ARRAY_SIZE(max8997_esafeout1_),
829 .consumer_supplies = max8997_esafeout1_,
832 static struct regulator_init_data __initdata max8997_esafeout2_data = {
835 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
840 .num_consumer_supplies = ARRAY_SIZE(max8997_esafeout2_),
841 .consumer_supplies = max8997_esafeout2_,
844 static struct regulator_init_data __initdata max8997_charger_cv_data = {
846 .name = "CHARGER_CV",
853 static struct regulator_init_data __initdata max8997_charger_data = {
859 .valid_ops_mask = REGULATOR_CHANGE_STATUS |
860 REGULATOR_CHANGE_CURRENT,
862 .num_consumer_supplies = ARRAY_SIZE(max8997_charger_),
863 .consumer_supplies = max8997_charger_,
866 static struct regulator_init_data __initdata max8997_charger_topoff_data = {
868 .name = "CHARGER TOPOFF",
871 .valid_ops_mask = REGULATOR_CHANGE_CURRENT,
873 .num_consumer_supplies = ARRAY_SIZE(max8997_chg_toff_),
874 .consumer_supplies = max8997_chg_toff_,
877 static struct max8997_regulator_data __initdata nuri_max8997_regulators[] = {
878 { MAX8997_LDO1, &max8997_ldo1_data },
879 { MAX8997_LDO2, &max8997_ldo2_data },
880 { MAX8997_LDO3, &max8997_ldo3_data },
881 { MAX8997_LDO4, &max8997_ldo4_data },
882 { MAX8997_LDO5, &max8997_ldo5_data },
883 { MAX8997_LDO6, &max8997_ldo6_data },
884 { MAX8997_LDO7, &max8997_ldo7_data },
885 { MAX8997_LDO8, &max8997_ldo8_data },
886 { MAX8997_LDO9, &max8997_ldo9_data },
887 { MAX8997_LDO10, &max8997_ldo10_data },
888 { MAX8997_LDO11, &max8997_ldo11_data },
889 { MAX8997_LDO12, &max8997_ldo12_data },
890 { MAX8997_LDO13, &max8997_ldo13_data },
891 { MAX8997_LDO14, &max8997_ldo14_data },
892 { MAX8997_LDO15, &max8997_ldo15_data },
893 { MAX8997_LDO16, &max8997_ldo16_data },
895 { MAX8997_LDO18, &max8997_ldo18_data },
896 { MAX8997_LDO21, &max8997_ldo21_data },
898 { MAX8997_BUCK1, &max8997_buck1_data },
899 { MAX8997_BUCK2, &max8997_buck2_data },
900 { MAX8997_BUCK3, &max8997_buck3_data },
901 { MAX8997_BUCK4, &max8997_buck4_data },
902 { MAX8997_BUCK5, &max8997_buck5_data },
903 { MAX8997_BUCK6, &max8997_buck6_data },
904 { MAX8997_BUCK7, &max8997_buck7_data },
906 { MAX8997_EN32KHZ_AP, &max8997_32khz_ap_data },
907 { MAX8997_EN32KHZ_CP, &max8997_32khz_cp_data },
909 { MAX8997_ENVICHG, &max8997_vichg_data },
910 { MAX8997_ESAFEOUT1, &max8997_esafeout1_data },
911 { MAX8997_ESAFEOUT2, &max8997_esafeout2_data },
912 { MAX8997_CHARGER_CV, &max8997_charger_cv_data },
913 { MAX8997_CHARGER, &max8997_charger_data },
914 { MAX8997_CHARGER_TOPOFF, &max8997_charger_topoff_data },
917 static struct max8997_platform_data __initdata nuri_max8997_pdata = {
920 .num_regulators = ARRAY_SIZE(nuri_max8997_regulators),
921 .regulators = nuri_max8997_regulators,
923 .buck125_gpios = { EXYNOS4_GPX0(5), EXYNOS4_GPX0(6), EXYNOS4_GPL0(0) },
924 .buck2_gpiodvs = true,
926 .buck1_voltage[0] = 1350000, /* 1.35V */
927 .buck1_voltage[1] = 1300000, /* 1.3V */
928 .buck1_voltage[2] = 1250000, /* 1.25V */
929 .buck1_voltage[3] = 1200000, /* 1.2V */
930 .buck1_voltage[4] = 1150000, /* 1.15V */
931 .buck1_voltage[5] = 1100000, /* 1.1V */
932 .buck1_voltage[6] = 1000000, /* 1.0V */
933 .buck1_voltage[7] = 950000, /* 0.95V */
935 .buck2_voltage[0] = 1100000, /* 1.1V */
936 .buck2_voltage[1] = 1000000, /* 1.0V */
937 .buck2_voltage[2] = 950000, /* 0.95V */
938 .buck2_voltage[3] = 900000, /* 0.9V */
939 .buck2_voltage[4] = 1100000, /* 1.1V */
940 .buck2_voltage[5] = 1000000, /* 1.0V */
941 .buck2_voltage[6] = 950000, /* 0.95V */
942 .buck2_voltage[7] = 900000, /* 0.9V */
944 .buck5_voltage[0] = 1200000, /* 1.2V */
945 .buck5_voltage[1] = 1200000, /* 1.2V */
946 .buck5_voltage[2] = 1200000, /* 1.2V */
947 .buck5_voltage[3] = 1200000, /* 1.2V */
948 .buck5_voltage[4] = 1200000, /* 1.2V */
949 .buck5_voltage[5] = 1200000, /* 1.2V */
950 .buck5_voltage[6] = 1200000, /* 1.2V */
951 .buck5_voltage[7] = 1200000, /* 1.2V */
954 /* GPIO I2C 5 (PMIC) */
955 enum { I2C5_MAX8997 };
956 static struct i2c_board_info i2c5_devs[] __initdata = {
958 I2C_BOARD_INFO("max8997", 0xCC >> 1),
959 .platform_data = &nuri_max8997_pdata,
963 static struct max17042_platform_data nuri_battery_platform_data = {
966 /* GPIO I2C 9 (Fuel Gauge) */
967 static struct i2c_gpio_platform_data i2c9_gpio_data = {
968 .sda_pin = EXYNOS4_GPY4(0), /* XM0ADDR_8 */
969 .scl_pin = EXYNOS4_GPY4(1), /* XM0ADDR_9 */
971 static struct platform_device i2c9_gpio = {
975 .platform_data = &i2c9_gpio_data,
978 enum { I2C9_MAX17042};
979 static struct i2c_board_info i2c9_devs[] __initdata = {
981 I2C_BOARD_INFO("max17042", 0x36),
982 .platform_data = &nuri_battery_platform_data,
986 /* MAX8903 Secondary Charger */
987 static struct regulator_consumer_supply supplies_max8903[] = {
988 REGULATOR_SUPPLY("vinchg2", "charger-manager.0"),
991 static struct regulator_init_data max8903_charger_en_data = {
993 .name = "VOUT_CHARGER",
994 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
997 .num_consumer_supplies = ARRAY_SIZE(supplies_max8903),
998 .consumer_supplies = supplies_max8903,
1001 static struct fixed_voltage_config max8903_charger_en = {
1002 .supply_name = "VOUT_CHARGER",
1003 .microvolts = 5000000, /* Assume 5VDC */
1004 .gpio = EXYNOS4_GPY4(5), /* TA_EN negaged */
1005 .enable_high = 0, /* Enable = Low */
1006 .enabled_at_boot = 1,
1007 .init_data = &max8903_charger_en_data,
1010 static struct platform_device max8903_fixed_reg_dev = {
1011 .name = "reg-fixed-voltage",
1012 .id = FIXED_REG_ID_MAX8903,
1013 .dev = { .platform_data = &max8903_charger_en },
1016 static struct max8903_pdata nuri_max8903 = {
1018 * cen: don't control with the driver, let it be
1019 * controlled by regulator above
1021 .dok = EXYNOS4_GPX1(4), /* TA_nCONNECTED */
1022 /* uok, usus: not connected */
1023 .chg = EXYNOS4_GPE2(0), /* TA_nCHG */
1024 /* flt: vcc_1.8V_pda */
1025 .dcm = EXYNOS4_GPL0(1), /* CURR_ADJ */
1028 .usb_valid = false, /* USB is not wired to MAX8903 */
1031 static struct platform_device nuri_max8903_device = {
1032 .name = "max8903-charger",
1034 .platform_data = &nuri_max8903,
1038 static struct device *nuri_cm_devices[] = {
1039 &s3c_device_i2c5.dev,
1040 &s3c_device_adc.dev,
1041 NULL, /* Reserved for UART */
1045 static void __init nuri_power_init(void)
1048 int irq_base = IRQ_GPIO_END + 1;
1051 nuri_max8997_pdata.irq_base = irq_base;
1052 irq_base += MAX8997_IRQ_NR;
1054 gpio = EXYNOS4_GPX0(7);
1055 gpio_request(gpio, "AP_PMIC_IRQ");
1056 s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf));
1057 s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
1059 gpio = EXYNOS4_GPX2(3);
1060 gpio_request(gpio, "FUEL_ALERT");
1061 s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf));
1062 s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
1064 gpio = nuri_max8903.dok;
1065 gpio_request(gpio, "TA_nCONNECTED");
1066 s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf));
1067 s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
1068 ta_en = gpio_get_value(gpio) ? 0 : 1;
1070 gpio = nuri_max8903.chg;
1071 gpio_request(gpio, "TA_nCHG");
1072 gpio_direction_input(gpio);
1074 gpio = nuri_max8903.dcm;
1075 gpio_request(gpio, "CURR_ADJ");
1076 gpio_direction_output(gpio, ta_en);
1080 static struct s5p_ehci_platdata nuri_ehci_pdata;
1082 static void __init nuri_ehci_init(void)
1084 struct s5p_ehci_platdata *pdata = &nuri_ehci_pdata;
1086 s5p_ehci_set_platdata(pdata);
1089 static struct platform_device *nuri_devices[] __initdata = {
1090 /* Samsung Platform Devices */
1091 &s3c_device_i2c5, /* PMIC should initialize first */
1092 &emmc_fixed_voltage,
1097 &s3c_device_timer[0],
1106 &nuri_backlight_device,
1107 &max8903_fixed_reg_dev,
1108 &nuri_max8903_device,
1111 static void __init nuri_map_io(void)
1113 s5p_init_io(NULL, 0, S5P_VA_CHIPID);
1114 s3c24xx_init_clocks(24000000);
1115 s3c24xx_init_uarts(nuri_uartcfgs, ARRAY_SIZE(nuri_uartcfgs));
1118 static void __init nuri_machine_init(void)
1124 i2c_register_board_info(1, i2c1_devs, ARRAY_SIZE(i2c1_devs));
1125 s3c_i2c3_set_platdata(&i2c3_data);
1126 i2c_register_board_info(3, i2c3_devs, ARRAY_SIZE(i2c3_devs));
1127 s3c_i2c5_set_platdata(NULL);
1128 i2c5_devs[I2C5_MAX8997].irq = gpio_to_irq(EXYNOS4_GPX0(7));
1129 i2c_register_board_info(5, i2c5_devs, ARRAY_SIZE(i2c5_devs));
1130 i2c9_devs[I2C9_MAX17042].irq = gpio_to_irq(EXYNOS4_GPX2(3));
1131 i2c_register_board_info(9, i2c9_devs, ARRAY_SIZE(i2c9_devs));
1134 clk_xusbxti.rate = 24000000;
1137 platform_add_devices(nuri_devices, ARRAY_SIZE(nuri_devices));
1140 MACHINE_START(NURI, "NURI")
1141 /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */
1142 .boot_params = S5P_PA_SDRAM + 0x100,
1143 .init_irq = exynos4_init_irq,
1144 .map_io = nuri_map_io,
1145 .init_machine = nuri_machine_init,
1146 .timer = &exynos4_timer,