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-fb-v4.h>
36 #include <plat/regs-serial.h>
37 #include <plat/exynos4.h>
39 #include <plat/devs.h>
41 #include <plat/sdhci.h>
42 #include <plat/ehci.h>
43 #include <plat/clock.h>
44 #include <plat/gpio-cfg.h>
51 /* Following are default values for UCON, ULCON and UFCON UART registers */
52 #define NURI_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \
53 S3C2410_UCON_RXILEVEL | \
54 S3C2410_UCON_TXIRQMODE | \
55 S3C2410_UCON_RXIRQMODE | \
56 S3C2410_UCON_RXFIFO_TOI | \
57 S3C2443_UCON_RXERR_IRQEN)
59 #define NURI_ULCON_DEFAULT S3C2410_LCON_CS8
61 #define NURI_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE | \
62 S5PV210_UFCON_TXTRIG256 | \
63 S5PV210_UFCON_RXTRIG256)
65 enum fixed_regulator_id
{
70 static struct s3c2410_uartcfg nuri_uartcfgs
[] __initdata
= {
73 .ucon
= NURI_UCON_DEFAULT
,
74 .ulcon
= NURI_ULCON_DEFAULT
,
75 .ufcon
= NURI_UFCON_DEFAULT
,
79 .ucon
= NURI_UCON_DEFAULT
,
80 .ulcon
= NURI_ULCON_DEFAULT
,
81 .ufcon
= NURI_UFCON_DEFAULT
,
85 .ucon
= NURI_UCON_DEFAULT
,
86 .ulcon
= NURI_ULCON_DEFAULT
,
87 .ufcon
= NURI_UFCON_DEFAULT
,
91 .ucon
= NURI_UCON_DEFAULT
,
92 .ulcon
= NURI_ULCON_DEFAULT
,
93 .ufcon
= NURI_UFCON_DEFAULT
,
98 static struct s3c_sdhci_platdata nuri_hsmmc0_data __initdata
= {
100 .host_caps
= (MMC_CAP_8_BIT_DATA
| MMC_CAP_4_BIT_DATA
|
101 MMC_CAP_MMC_HIGHSPEED
| MMC_CAP_SD_HIGHSPEED
|
102 MMC_CAP_DISABLE
| MMC_CAP_ERASE
),
103 .cd_type
= S3C_SDHCI_CD_PERMANENT
,
104 .clk_type
= S3C_SDHCI_CLK_DIV_EXTERNAL
,
107 static struct regulator_consumer_supply emmc_supplies
[] = {
108 REGULATOR_SUPPLY("vmmc", "s3c-sdhci.0"),
109 REGULATOR_SUPPLY("vmmc", "dw_mmc"),
112 static struct regulator_init_data emmc_fixed_voltage_init_data
= {
114 .name
= "VMEM_VDD_2.8V",
115 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
117 .num_consumer_supplies
= ARRAY_SIZE(emmc_supplies
),
118 .consumer_supplies
= emmc_supplies
,
121 static struct fixed_voltage_config emmc_fixed_voltage_config
= {
122 .supply_name
= "MASSMEMORY_EN (inverted)",
123 .microvolts
= 2800000,
124 .gpio
= EXYNOS4_GPL1(1),
125 .enable_high
= false,
126 .init_data
= &emmc_fixed_voltage_init_data
,
129 static struct platform_device emmc_fixed_voltage
= {
130 .name
= "reg-fixed-voltage",
131 .id
= FIXED_REG_ID_MMC
,
133 .platform_data
= &emmc_fixed_voltage_config
,
138 static struct s3c_sdhci_platdata nuri_hsmmc2_data __initdata
= {
140 .host_caps
= MMC_CAP_4_BIT_DATA
|
141 MMC_CAP_MMC_HIGHSPEED
| MMC_CAP_SD_HIGHSPEED
|
143 .ext_cd_gpio
= EXYNOS4_GPX3(3), /* XEINT_27 */
144 .ext_cd_gpio_invert
= 1,
145 .cd_type
= S3C_SDHCI_CD_GPIO
,
146 .clk_type
= S3C_SDHCI_CLK_DIV_EXTERNAL
,
150 static struct s3c_sdhci_platdata nuri_hsmmc3_data __initdata
= {
152 .host_caps
= MMC_CAP_4_BIT_DATA
|
153 MMC_CAP_MMC_HIGHSPEED
| MMC_CAP_SD_HIGHSPEED
,
154 .cd_type
= S3C_SDHCI_CD_EXTERNAL
,
155 .clk_type
= S3C_SDHCI_CLK_DIV_EXTERNAL
,
158 static void __init
nuri_sdhci_init(void)
160 s3c_sdhci0_set_platdata(&nuri_hsmmc0_data
);
161 s3c_sdhci2_set_platdata(&nuri_hsmmc2_data
);
162 s3c_sdhci3_set_platdata(&nuri_hsmmc3_data
);
166 static struct gpio_keys_button nuri_gpio_keys_tables
[] = {
168 .code
= KEY_VOLUMEUP
,
169 .gpio
= EXYNOS4_GPX2(0), /* XEINT16 */
170 .desc
= "gpio-keys: KEY_VOLUMEUP",
173 .debounce_interval
= 1,
175 .code
= KEY_VOLUMEDOWN
,
176 .gpio
= EXYNOS4_GPX2(1), /* XEINT17 */
177 .desc
= "gpio-keys: KEY_VOLUMEDOWN",
180 .debounce_interval
= 1,
183 .gpio
= EXYNOS4_GPX2(7), /* XEINT23 */
184 .desc
= "gpio-keys: KEY_POWER",
188 .debounce_interval
= 1,
192 static struct gpio_keys_platform_data nuri_gpio_keys_data
= {
193 .buttons
= nuri_gpio_keys_tables
,
194 .nbuttons
= ARRAY_SIZE(nuri_gpio_keys_tables
),
197 static struct platform_device nuri_gpio_keys
= {
200 .platform_data
= &nuri_gpio_keys_data
,
205 static struct s3c_fb_pd_win nuri_fb_win0
= {
223 static struct s3c_fb_platdata nuri_fb_pdata __initdata
= {
224 .win
[0] = &nuri_fb_win0
,
225 .vidcon0
= VIDCON0_VIDOUT_RGB
| VIDCON0_PNRMODE_RGB
|
227 .vidcon1
= VIDCON1_INV_HSYNC
| VIDCON1_INV_VSYNC
,
228 .setup_gpio
= exynos4_fimd0_gpio_setup_24bpp
,
231 static void nuri_lcd_power_on(struct plat_lcd_data
*pd
, unsigned int power
)
233 int gpio
= EXYNOS4_GPE1(5);
235 gpio_request(gpio
, "LVDS_nSHDN");
236 gpio_direction_output(gpio
, power
);
240 static int nuri_bl_init(struct device
*dev
)
242 int ret
, gpio
= EXYNOS4_GPE2(3);
244 ret
= gpio_request(gpio
, "LCD_LDO_EN");
246 gpio_direction_output(gpio
, 0);
251 static int nuri_bl_notify(struct device
*dev
, int brightness
)
256 gpio_set_value(EXYNOS4_GPE2(3), 1);
261 static void nuri_bl_exit(struct device
*dev
)
263 gpio_free(EXYNOS4_GPE2(3));
266 /* nuri pwm backlight */
267 static struct platform_pwm_backlight_data nuri_backlight_data
= {
269 .pwm_period_ns
= 30000,
270 .max_brightness
= 100,
271 .dft_brightness
= 50,
272 .init
= nuri_bl_init
,
273 .notify
= nuri_bl_notify
,
274 .exit
= nuri_bl_exit
,
277 static struct platform_device nuri_backlight_device
= {
278 .name
= "pwm-backlight",
281 .parent
= &s3c_device_timer
[0].dev
,
282 .platform_data
= &nuri_backlight_data
,
286 static struct plat_lcd_data nuri_lcd_platform_data
= {
287 .set_power
= nuri_lcd_power_on
,
290 static struct platform_device nuri_lcd_device
= {
291 .name
= "platform-lcd",
294 .platform_data
= &nuri_lcd_platform_data
,
299 static struct i2c_board_info i2c1_devs
[] __initdata
= {
300 /* Gyro, To be updated */
304 static u8 mxt_init_vals
[] = {
305 /* MXT_GEN_COMMAND(6) */
306 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 /* MXT_GEN_POWER(7) */
309 /* MXT_GEN_ACQUIRE(8) */
310 0x0a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x23,
311 /* MXT_TOUCH_MULTI(9) */
312 0x00, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00,
313 0x00, 0x01, 0x01, 0x0e, 0x0a, 0x0a, 0x0a, 0x0a, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316 /* MXT_TOUCH_KEYARRAY(15) */
317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
319 /* MXT_SPT_GPIOPWM(19) */
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 /* MXT_PROCI_GRIPFACE(20) */
323 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x28, 0x04,
325 /* MXT_PROCG_NOISE(22) */
326 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x23, 0x00,
327 0x00, 0x05, 0x0f, 0x19, 0x23, 0x2d, 0x03,
328 /* MXT_TOUCH_PROXIMITY(23) */
329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
330 0x00, 0x00, 0x00, 0x00, 0x00,
331 /* MXT_PROCI_ONETOUCH(24) */
332 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
334 /* MXT_SPT_SELFTEST(25) */
335 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
336 0x00, 0x00, 0x00, 0x00,
337 /* MXT_PROCI_TWOTOUCH(27) */
338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
339 /* MXT_SPT_CTECONFIG(28) */
340 0x00, 0x00, 0x02, 0x08, 0x10, 0x00,
343 static struct mxt_platform_data mxt_platform_data
= {
344 .config
= mxt_init_vals
,
345 .config_length
= ARRAY_SIZE(mxt_init_vals
),
353 .voltage
= 2800000, /* 2.8V */
354 .orient
= MXT_DIAGONAL_COUNTER
,
355 .irqflags
= IRQF_TRIGGER_FALLING
,
358 static struct s3c2410_platform_i2c i2c3_data __initdata
= {
362 .frequency
= 400 * 1000,
366 static struct i2c_board_info i2c3_devs
[] __initdata
= {
368 I2C_BOARD_INFO("atmel_mxt_ts", 0x4a),
369 .platform_data
= &mxt_platform_data
,
374 static void __init
nuri_tsp_init(void)
378 /* TOUCH_INT: XEINT_4 */
379 gpio
= EXYNOS4_GPX0(4);
380 gpio_request(gpio
, "TOUCH_INT");
381 s3c_gpio_cfgpin(gpio
, S3C_GPIO_SFN(0xf));
382 s3c_gpio_setpull(gpio
, S3C_GPIO_PULL_UP
);
385 static struct regulator_consumer_supply __initdata max8997_ldo1_
[] = {
386 REGULATOR_SUPPLY("vdd", "s5p-adc"), /* Used by CPU's ADC drv */
388 static struct regulator_consumer_supply __initdata max8997_ldo3_
[] = {
389 REGULATOR_SUPPLY("vdd11", "s5p-mipi-csis.0"), /* MIPI */
391 static struct regulator_consumer_supply __initdata max8997_ldo4_
[] = {
392 REGULATOR_SUPPLY("vdd18", "s5p-mipi-csis.0"), /* MIPI */
394 static struct regulator_consumer_supply __initdata max8997_ldo5_
[] = {
395 REGULATOR_SUPPLY("vhsic", "modemctl"), /* MODEM */
397 static struct regulator_consumer_supply __initdata max8997_ldo7_
[] = {
398 REGULATOR_SUPPLY("dig_18", "0-001f"), /* HCD803 */
400 static struct regulator_consumer_supply __initdata max8997_ldo8_
[] = {
401 REGULATOR_SUPPLY("vusb_d", NULL
), /* Used by CPU */
402 REGULATOR_SUPPLY("vdac", NULL
), /* Used by CPU */
404 static struct regulator_consumer_supply __initdata max8997_ldo11_
[] = {
405 REGULATOR_SUPPLY("vcc", "platform-lcd"), /* U804 LVDS */
407 static struct regulator_consumer_supply __initdata max8997_ldo12_
[] = {
408 REGULATOR_SUPPLY("vddio", "6-003c"), /* HDC802 */
410 static struct regulator_consumer_supply __initdata max8997_ldo13_
[] = {
411 REGULATOR_SUPPLY("vmmc", "s3c-sdhci.2"), /* TFLASH */
413 static struct regulator_consumer_supply __initdata max8997_ldo14_
[] = {
414 REGULATOR_SUPPLY("inmotor", "max8997-haptic"),
416 static struct regulator_consumer_supply __initdata max8997_ldo15_
[] = {
417 REGULATOR_SUPPLY("avdd", "3-004a"), /* Touch Screen */
419 static struct regulator_consumer_supply __initdata max8997_ldo16_
[] = {
420 REGULATOR_SUPPLY("d_sensor", "0-001f"), /* HDC803 */
422 static struct regulator_consumer_supply __initdata max8997_ldo18_
[] = {
423 REGULATOR_SUPPLY("vdd", "3-004a"), /* Touch Screen */
425 static struct regulator_consumer_supply __initdata max8997_buck1_
[] = {
426 REGULATOR_SUPPLY("vdd_arm", NULL
), /* CPUFREQ */
428 static struct regulator_consumer_supply __initdata max8997_buck2_
[] = {
429 REGULATOR_SUPPLY("vdd_int", NULL
), /* CPUFREQ */
431 static struct regulator_consumer_supply __initdata max8997_buck3_
[] = {
432 REGULATOR_SUPPLY("vdd", "mali_dev.0"), /* G3D of Exynos 4 */
434 static struct regulator_consumer_supply __initdata max8997_buck4_
[] = {
435 REGULATOR_SUPPLY("core", "0-001f"), /* HDC803 */
437 static struct regulator_consumer_supply __initdata max8997_buck6_
[] = {
438 REGULATOR_SUPPLY("dig_28", "0-001f"), /* pin "7" of HDC803 */
440 static struct regulator_consumer_supply __initdata max8997_esafeout1_
[] = {
441 REGULATOR_SUPPLY("usb_vbus", NULL
), /* CPU's USB OTG */
443 static struct regulator_consumer_supply __initdata max8997_esafeout2_
[] = {
444 REGULATOR_SUPPLY("usb_vbus", "modemctl"), /* VBUS of Modem */
447 static struct regulator_consumer_supply __initdata max8997_charger_
[] = {
448 REGULATOR_SUPPLY("vinchg1", "charger-manager.0"),
450 static struct regulator_consumer_supply __initdata max8997_chg_toff_
[] = {
451 REGULATOR_SUPPLY("vinchg_stop", NULL
), /* for jack interrupt handlers */
454 static struct regulator_consumer_supply __initdata max8997_32khz_ap_
[] = {
455 REGULATOR_SUPPLY("gps_clk", "bcm4751"),
456 REGULATOR_SUPPLY("bt_clk", "bcm4330-b1"),
457 REGULATOR_SUPPLY("wifi_clk", "bcm433-b1"),
460 static struct regulator_init_data __initdata max8997_ldo1_data
= {
462 .name
= "VADC_3.3V_C210",
465 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
471 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo1_
),
472 .consumer_supplies
= max8997_ldo1_
,
475 static struct regulator_init_data __initdata max8997_ldo2_data
= {
477 .name
= "VALIVE_1.1V_C210",
488 static struct regulator_init_data __initdata max8997_ldo3_data
= {
490 .name
= "VUSB_1.1V_C210",
493 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
499 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo3_
),
500 .consumer_supplies
= max8997_ldo3_
,
503 static struct regulator_init_data __initdata max8997_ldo4_data
= {
505 .name
= "VMIPI_1.8V",
508 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
514 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo4_
),
515 .consumer_supplies
= max8997_ldo4_
,
518 static struct regulator_init_data __initdata max8997_ldo5_data
= {
520 .name
= "VHSIC_1.2V_C210",
523 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
529 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo5_
),
530 .consumer_supplies
= max8997_ldo5_
,
533 static struct regulator_init_data __initdata max8997_ldo6_data
= {
535 .name
= "VCC_1.8V_PDA",
546 static struct regulator_init_data __initdata max8997_ldo7_data
= {
548 .name
= "CAM_ISP_1.8V",
551 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
557 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo7_
),
558 .consumer_supplies
= max8997_ldo7_
,
561 static struct regulator_init_data __initdata max8997_ldo8_data
= {
563 .name
= "VUSB/VDAC_3.3V_C210",
566 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
572 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo8_
),
573 .consumer_supplies
= max8997_ldo8_
,
576 static struct regulator_init_data __initdata max8997_ldo9_data
= {
578 .name
= "VCC_2.8V_PDA",
589 static struct regulator_init_data __initdata max8997_ldo10_data
= {
591 .name
= "VPLL_1.1V_C210",
602 static struct regulator_init_data __initdata max8997_ldo11_data
= {
604 .name
= "LVDS_VDD3.3V",
607 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
614 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo11_
),
615 .consumer_supplies
= max8997_ldo11_
,
618 static struct regulator_init_data __initdata max8997_ldo12_data
= {
620 .name
= "VT_CAM_1.8V",
623 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
629 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo12_
),
630 .consumer_supplies
= max8997_ldo12_
,
633 static struct regulator_init_data __initdata max8997_ldo13_data
= {
638 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
644 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo13_
),
645 .consumer_supplies
= max8997_ldo13_
,
648 static struct regulator_init_data __initdata max8997_ldo14_data
= {
650 .name
= "VCC_3.0V_MOTOR",
653 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
659 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo14_
),
660 .consumer_supplies
= max8997_ldo14_
,
663 static struct regulator_init_data __initdata max8997_ldo15_data
= {
665 .name
= "VTOUCH_ADVV2.8V",
669 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
674 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo15_
),
675 .consumer_supplies
= max8997_ldo15_
,
678 static struct regulator_init_data __initdata max8997_ldo16_data
= {
680 .name
= "CAM_SENSOR_IO_1.8V",
683 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
689 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo16_
),
690 .consumer_supplies
= max8997_ldo16_
,
693 static struct regulator_init_data __initdata max8997_ldo18_data
= {
695 .name
= "VTOUCH_VDD2.8V",
698 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
704 .num_consumer_supplies
= ARRAY_SIZE(max8997_ldo18_
),
705 .consumer_supplies
= max8997_ldo18_
,
708 static struct regulator_init_data __initdata max8997_ldo21_data
= {
710 .name
= "VDDQ_M1M2_1.2V",
721 static struct regulator_init_data __initdata max8997_buck1_data
= {
723 .name
= "VARM_1.2V_C210",
726 .valid_ops_mask
= REGULATOR_CHANGE_VOLTAGE
,
732 .num_consumer_supplies
= ARRAY_SIZE(max8997_buck1_
),
733 .consumer_supplies
= max8997_buck1_
,
736 static struct regulator_init_data __initdata max8997_buck2_data
= {
738 .name
= "VINT_1.1V_C210",
741 .valid_ops_mask
= REGULATOR_CHANGE_VOLTAGE
,
747 .num_consumer_supplies
= ARRAY_SIZE(max8997_buck2_
),
748 .consumer_supplies
= max8997_buck2_
,
751 static struct regulator_init_data __initdata max8997_buck3_data
= {
753 .name
= "VG3D_1.1V_C210",
756 .valid_ops_mask
= REGULATOR_CHANGE_VOLTAGE
|
757 REGULATOR_CHANGE_STATUS
,
762 .num_consumer_supplies
= ARRAY_SIZE(max8997_buck3_
),
763 .consumer_supplies
= max8997_buck3_
,
766 static struct regulator_init_data __initdata max8997_buck4_data
= {
768 .name
= "CAM_ISP_CORE_1.2V",
772 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
777 .num_consumer_supplies
= ARRAY_SIZE(max8997_buck4_
),
778 .consumer_supplies
= max8997_buck4_
,
781 static struct regulator_init_data __initdata max8997_buck5_data
= {
783 .name
= "VMEM_1.2V_C210",
794 static struct regulator_init_data __initdata max8997_buck6_data
= {
796 .name
= "CAM_AF_2.8V",
799 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
804 .num_consumer_supplies
= ARRAY_SIZE(max8997_buck6_
),
805 .consumer_supplies
= max8997_buck6_
,
808 static struct regulator_init_data __initdata max8997_buck7_data
= {
810 .name
= "VCC_SUB_2.0V",
821 static struct regulator_init_data __initdata max8997_32khz_ap_data
= {
829 .num_consumer_supplies
= ARRAY_SIZE(max8997_32khz_ap_
),
830 .consumer_supplies
= max8997_32khz_ap_
,
833 static struct regulator_init_data __initdata max8997_32khz_cp_data
= {
842 static struct regulator_init_data __initdata max8997_vichg_data
= {
851 static struct regulator_init_data __initdata max8997_esafeout1_data
= {
854 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
859 .num_consumer_supplies
= ARRAY_SIZE(max8997_esafeout1_
),
860 .consumer_supplies
= max8997_esafeout1_
,
863 static struct regulator_init_data __initdata max8997_esafeout2_data
= {
866 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
871 .num_consumer_supplies
= ARRAY_SIZE(max8997_esafeout2_
),
872 .consumer_supplies
= max8997_esafeout2_
,
875 static struct regulator_init_data __initdata max8997_charger_cv_data
= {
877 .name
= "CHARGER_CV",
884 static struct regulator_init_data __initdata max8997_charger_data
= {
890 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
|
891 REGULATOR_CHANGE_CURRENT
,
893 .num_consumer_supplies
= ARRAY_SIZE(max8997_charger_
),
894 .consumer_supplies
= max8997_charger_
,
897 static struct regulator_init_data __initdata max8997_charger_topoff_data
= {
899 .name
= "CHARGER TOPOFF",
902 .valid_ops_mask
= REGULATOR_CHANGE_CURRENT
,
904 .num_consumer_supplies
= ARRAY_SIZE(max8997_chg_toff_
),
905 .consumer_supplies
= max8997_chg_toff_
,
908 static struct max8997_regulator_data __initdata nuri_max8997_regulators
[] = {
909 { MAX8997_LDO1
, &max8997_ldo1_data
},
910 { MAX8997_LDO2
, &max8997_ldo2_data
},
911 { MAX8997_LDO3
, &max8997_ldo3_data
},
912 { MAX8997_LDO4
, &max8997_ldo4_data
},
913 { MAX8997_LDO5
, &max8997_ldo5_data
},
914 { MAX8997_LDO6
, &max8997_ldo6_data
},
915 { MAX8997_LDO7
, &max8997_ldo7_data
},
916 { MAX8997_LDO8
, &max8997_ldo8_data
},
917 { MAX8997_LDO9
, &max8997_ldo9_data
},
918 { MAX8997_LDO10
, &max8997_ldo10_data
},
919 { MAX8997_LDO11
, &max8997_ldo11_data
},
920 { MAX8997_LDO12
, &max8997_ldo12_data
},
921 { MAX8997_LDO13
, &max8997_ldo13_data
},
922 { MAX8997_LDO14
, &max8997_ldo14_data
},
923 { MAX8997_LDO15
, &max8997_ldo15_data
},
924 { MAX8997_LDO16
, &max8997_ldo16_data
},
926 { MAX8997_LDO18
, &max8997_ldo18_data
},
927 { MAX8997_LDO21
, &max8997_ldo21_data
},
929 { MAX8997_BUCK1
, &max8997_buck1_data
},
930 { MAX8997_BUCK2
, &max8997_buck2_data
},
931 { MAX8997_BUCK3
, &max8997_buck3_data
},
932 { MAX8997_BUCK4
, &max8997_buck4_data
},
933 { MAX8997_BUCK5
, &max8997_buck5_data
},
934 { MAX8997_BUCK6
, &max8997_buck6_data
},
935 { MAX8997_BUCK7
, &max8997_buck7_data
},
937 { MAX8997_EN32KHZ_AP
, &max8997_32khz_ap_data
},
938 { MAX8997_EN32KHZ_CP
, &max8997_32khz_cp_data
},
940 { MAX8997_ENVICHG
, &max8997_vichg_data
},
941 { MAX8997_ESAFEOUT1
, &max8997_esafeout1_data
},
942 { MAX8997_ESAFEOUT2
, &max8997_esafeout2_data
},
943 { MAX8997_CHARGER_CV
, &max8997_charger_cv_data
},
944 { MAX8997_CHARGER
, &max8997_charger_data
},
945 { MAX8997_CHARGER_TOPOFF
, &max8997_charger_topoff_data
},
948 static struct max8997_platform_data __initdata nuri_max8997_pdata
= {
951 .num_regulators
= ARRAY_SIZE(nuri_max8997_regulators
),
952 .regulators
= nuri_max8997_regulators
,
954 .buck125_gpios
= { EXYNOS4_GPX0(5), EXYNOS4_GPX0(6), EXYNOS4_GPL0(0) },
955 .buck2_gpiodvs
= true,
957 .buck1_voltage
[0] = 1350000, /* 1.35V */
958 .buck1_voltage
[1] = 1300000, /* 1.3V */
959 .buck1_voltage
[2] = 1250000, /* 1.25V */
960 .buck1_voltage
[3] = 1200000, /* 1.2V */
961 .buck1_voltage
[4] = 1150000, /* 1.15V */
962 .buck1_voltage
[5] = 1100000, /* 1.1V */
963 .buck1_voltage
[6] = 1000000, /* 1.0V */
964 .buck1_voltage
[7] = 950000, /* 0.95V */
966 .buck2_voltage
[0] = 1100000, /* 1.1V */
967 .buck2_voltage
[1] = 1000000, /* 1.0V */
968 .buck2_voltage
[2] = 950000, /* 0.95V */
969 .buck2_voltage
[3] = 900000, /* 0.9V */
970 .buck2_voltage
[4] = 1100000, /* 1.1V */
971 .buck2_voltage
[5] = 1000000, /* 1.0V */
972 .buck2_voltage
[6] = 950000, /* 0.95V */
973 .buck2_voltage
[7] = 900000, /* 0.9V */
975 .buck5_voltage
[0] = 1200000, /* 1.2V */
976 .buck5_voltage
[1] = 1200000, /* 1.2V */
977 .buck5_voltage
[2] = 1200000, /* 1.2V */
978 .buck5_voltage
[3] = 1200000, /* 1.2V */
979 .buck5_voltage
[4] = 1200000, /* 1.2V */
980 .buck5_voltage
[5] = 1200000, /* 1.2V */
981 .buck5_voltage
[6] = 1200000, /* 1.2V */
982 .buck5_voltage
[7] = 1200000, /* 1.2V */
985 /* GPIO I2C 5 (PMIC) */
986 enum { I2C5_MAX8997
};
987 static struct i2c_board_info i2c5_devs
[] __initdata
= {
989 I2C_BOARD_INFO("max8997", 0xCC >> 1),
990 .platform_data
= &nuri_max8997_pdata
,
994 static struct max17042_platform_data nuri_battery_platform_data
= {
997 /* GPIO I2C 9 (Fuel Gauge) */
998 static struct i2c_gpio_platform_data i2c9_gpio_data
= {
999 .sda_pin
= EXYNOS4_GPY4(0), /* XM0ADDR_8 */
1000 .scl_pin
= EXYNOS4_GPY4(1), /* XM0ADDR_9 */
1002 static struct platform_device i2c9_gpio
= {
1006 .platform_data
= &i2c9_gpio_data
,
1009 enum { I2C9_MAX17042
};
1010 static struct i2c_board_info i2c9_devs
[] __initdata
= {
1012 I2C_BOARD_INFO("max17042", 0x36),
1013 .platform_data
= &nuri_battery_platform_data
,
1017 /* MAX8903 Secondary Charger */
1018 static struct regulator_consumer_supply supplies_max8903
[] = {
1019 REGULATOR_SUPPLY("vinchg2", "charger-manager.0"),
1022 static struct regulator_init_data max8903_charger_en_data
= {
1024 .name
= "VOUT_CHARGER",
1025 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
1028 .num_consumer_supplies
= ARRAY_SIZE(supplies_max8903
),
1029 .consumer_supplies
= supplies_max8903
,
1032 static struct fixed_voltage_config max8903_charger_en
= {
1033 .supply_name
= "VOUT_CHARGER",
1034 .microvolts
= 5000000, /* Assume 5VDC */
1035 .gpio
= EXYNOS4_GPY4(5), /* TA_EN negaged */
1036 .enable_high
= 0, /* Enable = Low */
1037 .enabled_at_boot
= 1,
1038 .init_data
= &max8903_charger_en_data
,
1041 static struct platform_device max8903_fixed_reg_dev
= {
1042 .name
= "reg-fixed-voltage",
1043 .id
= FIXED_REG_ID_MAX8903
,
1044 .dev
= { .platform_data
= &max8903_charger_en
},
1047 static struct max8903_pdata nuri_max8903
= {
1049 * cen: don't control with the driver, let it be
1050 * controlled by regulator above
1052 .dok
= EXYNOS4_GPX1(4), /* TA_nCONNECTED */
1053 /* uok, usus: not connected */
1054 .chg
= EXYNOS4_GPE2(0), /* TA_nCHG */
1055 /* flt: vcc_1.8V_pda */
1056 .dcm
= EXYNOS4_GPL0(1), /* CURR_ADJ */
1059 .usb_valid
= false, /* USB is not wired to MAX8903 */
1062 static struct platform_device nuri_max8903_device
= {
1063 .name
= "max8903-charger",
1065 .platform_data
= &nuri_max8903
,
1069 static struct device
*nuri_cm_devices
[] = {
1070 &s3c_device_i2c5
.dev
,
1071 &s3c_device_adc
.dev
,
1072 NULL
, /* Reserved for UART */
1076 static void __init
nuri_power_init(void)
1079 int irq_base
= IRQ_GPIO_END
+ 1;
1082 nuri_max8997_pdata
.irq_base
= irq_base
;
1083 irq_base
+= MAX8997_IRQ_NR
;
1085 gpio
= EXYNOS4_GPX0(7);
1086 gpio_request(gpio
, "AP_PMIC_IRQ");
1087 s3c_gpio_cfgpin(gpio
, S3C_GPIO_SFN(0xf));
1088 s3c_gpio_setpull(gpio
, S3C_GPIO_PULL_NONE
);
1090 gpio
= EXYNOS4_GPX2(3);
1091 gpio_request(gpio
, "FUEL_ALERT");
1092 s3c_gpio_cfgpin(gpio
, S3C_GPIO_SFN(0xf));
1093 s3c_gpio_setpull(gpio
, S3C_GPIO_PULL_NONE
);
1095 gpio
= nuri_max8903
.dok
;
1096 gpio_request(gpio
, "TA_nCONNECTED");
1097 s3c_gpio_cfgpin(gpio
, S3C_GPIO_SFN(0xf));
1098 s3c_gpio_setpull(gpio
, S3C_GPIO_PULL_NONE
);
1099 ta_en
= gpio_get_value(gpio
) ? 0 : 1;
1101 gpio
= nuri_max8903
.chg
;
1102 gpio_request(gpio
, "TA_nCHG");
1103 gpio_direction_input(gpio
);
1105 gpio
= nuri_max8903
.dcm
;
1106 gpio_request(gpio
, "CURR_ADJ");
1107 gpio_direction_output(gpio
, ta_en
);
1111 static struct s5p_ehci_platdata nuri_ehci_pdata
;
1113 static void __init
nuri_ehci_init(void)
1115 struct s5p_ehci_platdata
*pdata
= &nuri_ehci_pdata
;
1117 s5p_ehci_set_platdata(pdata
);
1120 static struct platform_device
*nuri_devices
[] __initdata
= {
1121 /* Samsung Platform Devices */
1122 &s3c_device_i2c5
, /* PMIC should initialize first */
1123 &emmc_fixed_voltage
,
1129 &s3c_device_timer
[0],
1138 &exynos4_device_pd
[PD_MFC
],
1139 &exynos4_device_pd
[PD_LCD0
],
1144 &nuri_backlight_device
,
1145 &max8903_fixed_reg_dev
,
1146 &nuri_max8903_device
,
1149 static void __init
nuri_map_io(void)
1151 s5p_init_io(NULL
, 0, S5P_VA_CHIPID
);
1152 s3c24xx_init_clocks(24000000);
1153 s3c24xx_init_uarts(nuri_uartcfgs
, ARRAY_SIZE(nuri_uartcfgs
));
1156 static void __init
nuri_reserve(void)
1158 s5p_mfc_reserve_mem(0x43000000, 8 << 20, 0x51000000, 8 << 20);
1161 static void __init
nuri_machine_init(void)
1167 i2c_register_board_info(1, i2c1_devs
, ARRAY_SIZE(i2c1_devs
));
1168 s3c_i2c3_set_platdata(&i2c3_data
);
1169 i2c_register_board_info(3, i2c3_devs
, ARRAY_SIZE(i2c3_devs
));
1170 s3c_i2c5_set_platdata(NULL
);
1171 i2c5_devs
[I2C5_MAX8997
].irq
= gpio_to_irq(EXYNOS4_GPX0(7));
1172 i2c_register_board_info(5, i2c5_devs
, ARRAY_SIZE(i2c5_devs
));
1173 i2c9_devs
[I2C9_MAX17042
].irq
= gpio_to_irq(EXYNOS4_GPX2(3));
1174 i2c_register_board_info(9, i2c9_devs
, ARRAY_SIZE(i2c9_devs
));
1176 s5p_fimd0_set_platdata(&nuri_fb_pdata
);
1179 clk_xusbxti
.rate
= 24000000;
1182 platform_add_devices(nuri_devices
, ARRAY_SIZE(nuri_devices
));
1183 s5p_device_mfc
.dev
.parent
= &exynos4_device_pd
[PD_MFC
].dev
;
1184 s5p_device_fimd0
.dev
.parent
= &exynos4_device_pd
[PD_LCD0
].dev
;
1187 MACHINE_START(NURI
, "NURI")
1188 /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */
1189 .atag_offset
= 0x100,
1190 .init_irq
= exynos4_init_irq
,
1191 .map_io
= nuri_map_io
,
1192 .init_machine
= nuri_machine_init
,
1193 .timer
= &exynos4_timer
,
1194 .reserve
= &nuri_reserve
,