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/s5k6aa.h>
32 #include <media/s5p_fimc.h>
33 #include <media/v4l2-mediabus.h>
35 #include <asm/mach/arch.h>
36 #include <asm/hardware/gic.h>
37 #include <asm/mach-types.h>
40 #include <plat/regs-fb-v4.h>
41 #include <plat/regs-serial.h>
43 #include <plat/devs.h>
45 #include <plat/sdhci.h>
46 #include <plat/ehci.h>
47 #include <plat/clock.h>
48 #include <plat/gpio-cfg.h>
52 #include <plat/fimc-core.h>
53 #include <plat/camport.h>
54 #include <plat/mipi_csis.h>
60 /* Following are default values for UCON, ULCON and UFCON UART registers */
61 #define NURI_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \
62 S3C2410_UCON_RXILEVEL | \
63 S3C2410_UCON_TXIRQMODE | \
64 S3C2410_UCON_RXIRQMODE | \
65 S3C2410_UCON_RXFIFO_TOI | \
66 S3C2443_UCON_RXERR_IRQEN)
68 #define NURI_ULCON_DEFAULT S3C2410_LCON_CS8
70 #define NURI_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE | \
71 S5PV210_UFCON_TXTRIG256 | \
72 S5PV210_UFCON_RXTRIG256)
74 enum fixed_regulator_id {
77 FIXED_REG_ID_CAM_A28V,
79 FIXED_REG_ID_CAM_VT_15V,
82 static struct s3c2410_uartcfg nuri_uartcfgs[] __initdata = {
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,
97 .ucon = NURI_UCON_DEFAULT,
98 .ulcon = NURI_ULCON_DEFAULT,
99 .ufcon = NURI_UFCON_DEFAULT,
103 .ucon = NURI_UCON_DEFAULT,
104 .ulcon = NURI_ULCON_DEFAULT,
105 .ufcon = NURI_UFCON_DEFAULT,
110 static struct s3c_sdhci_platdata nuri_hsmmc0_data __initdata = {
112 .host_caps = (MMC_CAP_8_BIT_DATA | MMC_CAP_4_BIT_DATA |
113 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
115 .cd_type = S3C_SDHCI_CD_PERMANENT,
116 .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
119 static struct regulator_consumer_supply emmc_supplies[] = {
120 REGULATOR_SUPPLY("vmmc", "exynos4-sdhci.0"),
121 REGULATOR_SUPPLY("vmmc", "dw_mmc"),
124 static struct regulator_init_data emmc_fixed_voltage_init_data = {
126 .name = "VMEM_VDD_2.8V",
127 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
129 .num_consumer_supplies = ARRAY_SIZE(emmc_supplies),
130 .consumer_supplies = emmc_supplies,
133 static struct fixed_voltage_config emmc_fixed_voltage_config = {
134 .supply_name = "MASSMEMORY_EN (inverted)",
135 .microvolts = 2800000,
136 .gpio = EXYNOS4_GPL1(1),
137 .enable_high = false,
138 .init_data = &emmc_fixed_voltage_init_data,
141 static struct platform_device emmc_fixed_voltage = {
142 .name = "reg-fixed-voltage",
143 .id = FIXED_REG_ID_MMC,
145 .platform_data = &emmc_fixed_voltage_config,
150 static struct s3c_sdhci_platdata nuri_hsmmc2_data __initdata = {
152 .host_caps = MMC_CAP_4_BIT_DATA |
153 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
154 .ext_cd_gpio = EXYNOS4_GPX3(3), /* XEINT_27 */
155 .ext_cd_gpio_invert = 1,
156 .cd_type = S3C_SDHCI_CD_GPIO,
157 .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
161 static struct s3c_sdhci_platdata nuri_hsmmc3_data __initdata = {
163 .host_caps = MMC_CAP_4_BIT_DATA |
164 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
165 .cd_type = S3C_SDHCI_CD_EXTERNAL,
166 .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
169 static void __init nuri_sdhci_init(void)
171 s3c_sdhci0_set_platdata(&nuri_hsmmc0_data);
172 s3c_sdhci2_set_platdata(&nuri_hsmmc2_data);
173 s3c_sdhci3_set_platdata(&nuri_hsmmc3_data);
177 static struct gpio_keys_button nuri_gpio_keys_tables[] = {
179 .code = KEY_VOLUMEUP,
180 .gpio = EXYNOS4_GPX2(0), /* XEINT16 */
181 .desc = "gpio-keys: KEY_VOLUMEUP",
184 .debounce_interval = 1,
186 .code = KEY_VOLUMEDOWN,
187 .gpio = EXYNOS4_GPX2(1), /* XEINT17 */
188 .desc = "gpio-keys: KEY_VOLUMEDOWN",
191 .debounce_interval = 1,
194 .gpio = EXYNOS4_GPX2(7), /* XEINT23 */
195 .desc = "gpio-keys: KEY_POWER",
199 .debounce_interval = 1,
203 static struct gpio_keys_platform_data nuri_gpio_keys_data = {
204 .buttons = nuri_gpio_keys_tables,
205 .nbuttons = ARRAY_SIZE(nuri_gpio_keys_tables),
208 static struct platform_device nuri_gpio_keys = {
211 .platform_data = &nuri_gpio_keys_data,
216 static struct s3c_fb_pd_win nuri_fb_win0 = {
231 .virtual_y = 2 * 600,
234 static struct s3c_fb_platdata nuri_fb_pdata __initdata = {
235 .win[0] = &nuri_fb_win0,
236 .vidcon0 = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB |
238 .vidcon1 = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
239 .setup_gpio = exynos4_fimd0_gpio_setup_24bpp,
242 static void nuri_lcd_power_on(struct plat_lcd_data *pd, unsigned int power)
244 int gpio = EXYNOS4_GPE1(5);
246 gpio_request(gpio, "LVDS_nSHDN");
247 gpio_direction_output(gpio, power);
251 static int nuri_bl_init(struct device *dev)
253 return gpio_request_one(EXYNOS4_GPE2(3), GPIOF_OUT_INIT_LOW,
257 static int nuri_bl_notify(struct device *dev, int brightness)
262 gpio_set_value(EXYNOS4_GPE2(3), 1);
267 static void nuri_bl_exit(struct device *dev)
269 gpio_free(EXYNOS4_GPE2(3));
272 /* nuri pwm backlight */
273 static struct platform_pwm_backlight_data nuri_backlight_data = {
275 .pwm_period_ns = 30000,
276 .max_brightness = 100,
277 .dft_brightness = 50,
278 .init = nuri_bl_init,
279 .notify = nuri_bl_notify,
280 .exit = nuri_bl_exit,
283 static struct platform_device nuri_backlight_device = {
284 .name = "pwm-backlight",
287 .parent = &s3c_device_timer[0].dev,
288 .platform_data = &nuri_backlight_data,
292 static struct plat_lcd_data nuri_lcd_platform_data = {
293 .set_power = nuri_lcd_power_on,
296 static struct platform_device nuri_lcd_device = {
297 .name = "platform-lcd",
300 .platform_data = &nuri_lcd_platform_data,
305 static struct i2c_board_info i2c1_devs[] __initdata = {
306 /* Gyro, To be updated */
310 static u8 mxt_init_vals[] = {
311 /* MXT_GEN_COMMAND(6) */
312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
313 /* MXT_GEN_POWER(7) */
315 /* MXT_GEN_ACQUIRE(8) */
316 0x0a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x23,
317 /* MXT_TOUCH_MULTI(9) */
318 0x00, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00,
319 0x00, 0x01, 0x01, 0x0e, 0x0a, 0x0a, 0x0a, 0x0a, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 /* MXT_TOUCH_KEYARRAY(15) */
323 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
325 /* MXT_SPT_GPIOPWM(19) */
326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
327 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
328 /* MXT_PROCI_GRIPFACE(20) */
329 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x28, 0x04,
331 /* MXT_PROCG_NOISE(22) */
332 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x23, 0x00,
333 0x00, 0x05, 0x0f, 0x19, 0x23, 0x2d, 0x03,
334 /* MXT_TOUCH_PROXIMITY(23) */
335 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
336 0x00, 0x00, 0x00, 0x00, 0x00,
337 /* MXT_PROCI_ONETOUCH(24) */
338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
340 /* MXT_SPT_SELFTEST(25) */
341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
342 0x00, 0x00, 0x00, 0x00,
343 /* MXT_PROCI_TWOTOUCH(27) */
344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 /* MXT_SPT_CTECONFIG(28) */
346 0x00, 0x00, 0x02, 0x08, 0x10, 0x00,
349 static struct mxt_platform_data mxt_platform_data = {
350 .config = mxt_init_vals,
351 .config_length = ARRAY_SIZE(mxt_init_vals),
359 .voltage = 2800000, /* 2.8V */
360 .orient = MXT_DIAGONAL_COUNTER,
361 .irqflags = IRQF_TRIGGER_FALLING,
364 static struct s3c2410_platform_i2c i2c3_data __initdata = {
368 .frequency = 400 * 1000,
372 static struct i2c_board_info i2c3_devs[] __initdata = {
374 I2C_BOARD_INFO("atmel_mxt_ts", 0x4a),
375 .platform_data = &mxt_platform_data,
380 static void __init nuri_tsp_init(void)
384 /* TOUCH_INT: XEINT_4 */
385 gpio = EXYNOS4_GPX0(4);
386 gpio_request(gpio, "TOUCH_INT");
387 s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf));
388 s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
391 static struct regulator_consumer_supply __initdata max8997_ldo1_[] = {
392 REGULATOR_SUPPLY("vdd", "s5p-adc"), /* Used by CPU's ADC drv */
394 static struct regulator_consumer_supply __initdata max8997_ldo3_[] = {
395 REGULATOR_SUPPLY("vdd11", "s5p-mipi-csis.0"), /* MIPI */
397 static struct regulator_consumer_supply __initdata max8997_ldo4_[] = {
398 REGULATOR_SUPPLY("vdd18", "s5p-mipi-csis.0"), /* MIPI */
400 static struct regulator_consumer_supply __initdata max8997_ldo5_[] = {
401 REGULATOR_SUPPLY("vhsic", "modemctl"), /* MODEM */
403 static struct regulator_consumer_supply nuri_max8997_ldo6_consumer[] = {
404 REGULATOR_SUPPLY("vdd_reg", "6-003c"), /* S5K6AA camera */
406 static struct regulator_consumer_supply __initdata max8997_ldo7_[] = {
407 REGULATOR_SUPPLY("dig_18", "0-001f"), /* HCD803 */
409 static struct regulator_consumer_supply __initdata max8997_ldo8_[] = {
410 REGULATOR_SUPPLY("vusb_d", NULL), /* Used by CPU */
411 REGULATOR_SUPPLY("vdac", NULL), /* Used by CPU */
413 static struct regulator_consumer_supply __initdata max8997_ldo11_[] = {
414 REGULATOR_SUPPLY("vcc", "platform-lcd"), /* U804 LVDS */
416 static struct regulator_consumer_supply __initdata max8997_ldo12_[] = {
417 REGULATOR_SUPPLY("vddio", "6-003c"), /* HDC802 */
419 static struct regulator_consumer_supply __initdata max8997_ldo13_[] = {
420 REGULATOR_SUPPLY("vmmc", "exynos4-sdhci.2"), /* TFLASH */
422 static struct regulator_consumer_supply __initdata max8997_ldo14_[] = {
423 REGULATOR_SUPPLY("inmotor", "max8997-haptic"),
425 static struct regulator_consumer_supply __initdata max8997_ldo15_[] = {
426 REGULATOR_SUPPLY("avdd", "3-004a"), /* Touch Screen */
428 static struct regulator_consumer_supply __initdata max8997_ldo16_[] = {
429 REGULATOR_SUPPLY("d_sensor", "0-001f"), /* HDC803 */
431 static struct regulator_consumer_supply __initdata max8997_ldo18_[] = {
432 REGULATOR_SUPPLY("vdd", "3-004a"), /* Touch Screen */
434 static struct regulator_consumer_supply __initdata max8997_buck1_[] = {
435 REGULATOR_SUPPLY("vdd_arm", NULL), /* CPUFREQ */
437 static struct regulator_consumer_supply __initdata max8997_buck2_[] = {
438 REGULATOR_SUPPLY("vdd_int", "exynos4210-busfreq.0"), /* CPUFREQ */
440 static struct regulator_consumer_supply __initdata max8997_buck3_[] = {
441 REGULATOR_SUPPLY("vdd", "mali_dev.0"), /* G3D of Exynos 4 */
443 static struct regulator_consumer_supply __initdata max8997_buck4_[] = {
444 REGULATOR_SUPPLY("core", "0-001f"), /* HDC803 */
446 static struct regulator_consumer_supply __initdata max8997_buck6_[] = {
447 REGULATOR_SUPPLY("dig_28", "0-001f"), /* pin "7" of HDC803 */
449 static struct regulator_consumer_supply __initdata max8997_esafeout1_[] = {
450 REGULATOR_SUPPLY("usb_vbus", NULL), /* CPU's USB OTG */
452 static struct regulator_consumer_supply __initdata max8997_esafeout2_[] = {
453 REGULATOR_SUPPLY("usb_vbus", "modemctl"), /* VBUS of Modem */
456 static struct regulator_consumer_supply __initdata max8997_charger_[] = {
457 REGULATOR_SUPPLY("vinchg1", "charger-manager.0"),
459 static struct regulator_consumer_supply __initdata max8997_chg_toff_[] = {
460 REGULATOR_SUPPLY("vinchg_stop", NULL), /* for jack interrupt handlers */
463 static struct regulator_consumer_supply __initdata max8997_32khz_ap_[] = {
464 REGULATOR_SUPPLY("gps_clk", "bcm4751"),
465 REGULATOR_SUPPLY("bt_clk", "bcm4330-b1"),
466 REGULATOR_SUPPLY("wifi_clk", "bcm433-b1"),
469 static struct regulator_init_data __initdata max8997_ldo1_data = {
471 .name = "VADC_3.3V_C210",
474 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
480 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo1_),
481 .consumer_supplies = max8997_ldo1_,
484 static struct regulator_init_data __initdata max8997_ldo2_data = {
486 .name = "VALIVE_1.1V_C210",
497 static struct regulator_init_data __initdata max8997_ldo3_data = {
499 .name = "VUSB_1.1V_C210",
502 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
508 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo3_),
509 .consumer_supplies = max8997_ldo3_,
512 static struct regulator_init_data __initdata max8997_ldo4_data = {
514 .name = "VMIPI_1.8V",
517 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
523 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo4_),
524 .consumer_supplies = max8997_ldo4_,
527 static struct regulator_init_data __initdata max8997_ldo5_data = {
529 .name = "VHSIC_1.2V_C210",
532 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
538 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo5_),
539 .consumer_supplies = max8997_ldo5_,
542 static struct regulator_init_data __initdata max8997_ldo6_data = {
544 .name = "VCC_1.8V_PDA",
553 .num_consumer_supplies = ARRAY_SIZE(nuri_max8997_ldo6_consumer),
554 .consumer_supplies = nuri_max8997_ldo6_consumer,
557 static struct regulator_init_data __initdata max8997_ldo7_data = {
559 .name = "CAM_ISP_1.8V",
562 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
568 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo7_),
569 .consumer_supplies = max8997_ldo7_,
572 static struct regulator_init_data __initdata max8997_ldo8_data = {
574 .name = "VUSB/VDAC_3.3V_C210",
577 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
583 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo8_),
584 .consumer_supplies = max8997_ldo8_,
587 static struct regulator_init_data __initdata max8997_ldo9_data = {
589 .name = "VCC_2.8V_PDA",
600 static struct regulator_init_data __initdata max8997_ldo10_data = {
602 .name = "VPLL_1.1V_C210",
613 static struct regulator_init_data __initdata max8997_ldo11_data = {
615 .name = "LVDS_VDD3.3V",
618 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
625 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo11_),
626 .consumer_supplies = max8997_ldo11_,
629 static struct regulator_init_data __initdata max8997_ldo12_data = {
631 .name = "VT_CAM_1.8V",
634 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
640 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo12_),
641 .consumer_supplies = max8997_ldo12_,
644 static struct regulator_init_data __initdata max8997_ldo13_data = {
649 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
655 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo13_),
656 .consumer_supplies = max8997_ldo13_,
659 static struct regulator_init_data __initdata max8997_ldo14_data = {
661 .name = "VCC_3.0V_MOTOR",
664 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
670 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo14_),
671 .consumer_supplies = max8997_ldo14_,
674 static struct regulator_init_data __initdata max8997_ldo15_data = {
676 .name = "VTOUCH_ADVV2.8V",
680 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
685 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo15_),
686 .consumer_supplies = max8997_ldo15_,
689 static struct regulator_init_data __initdata max8997_ldo16_data = {
691 .name = "CAM_SENSOR_IO_1.8V",
694 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
700 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo16_),
701 .consumer_supplies = max8997_ldo16_,
704 static struct regulator_init_data __initdata max8997_ldo18_data = {
706 .name = "VTOUCH_VDD2.8V",
709 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
715 .num_consumer_supplies = ARRAY_SIZE(max8997_ldo18_),
716 .consumer_supplies = max8997_ldo18_,
719 static struct regulator_init_data __initdata max8997_ldo21_data = {
721 .name = "VDDQ_M1M2_1.2V",
732 static struct regulator_init_data __initdata max8997_buck1_data = {
734 .name = "VARM_1.2V_C210",
737 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
743 .num_consumer_supplies = ARRAY_SIZE(max8997_buck1_),
744 .consumer_supplies = max8997_buck1_,
747 static struct regulator_init_data __initdata max8997_buck2_data = {
749 .name = "VINT_1.1V_C210",
752 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
758 .num_consumer_supplies = ARRAY_SIZE(max8997_buck2_),
759 .consumer_supplies = max8997_buck2_,
762 static struct regulator_init_data __initdata max8997_buck3_data = {
764 .name = "VG3D_1.1V_C210",
767 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
768 REGULATOR_CHANGE_STATUS,
773 .num_consumer_supplies = ARRAY_SIZE(max8997_buck3_),
774 .consumer_supplies = max8997_buck3_,
777 static struct regulator_init_data __initdata max8997_buck4_data = {
779 .name = "CAM_ISP_CORE_1.2V",
783 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
788 .num_consumer_supplies = ARRAY_SIZE(max8997_buck4_),
789 .consumer_supplies = max8997_buck4_,
792 static struct regulator_init_data __initdata max8997_buck5_data = {
794 .name = "VMEM_1.2V_C210",
805 static struct regulator_init_data __initdata max8997_buck6_data = {
807 .name = "CAM_AF_2.8V",
810 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
815 .num_consumer_supplies = ARRAY_SIZE(max8997_buck6_),
816 .consumer_supplies = max8997_buck6_,
819 static struct regulator_init_data __initdata max8997_buck7_data = {
821 .name = "VCC_SUB_2.0V",
832 static struct regulator_init_data __initdata max8997_32khz_ap_data = {
840 .num_consumer_supplies = ARRAY_SIZE(max8997_32khz_ap_),
841 .consumer_supplies = max8997_32khz_ap_,
844 static struct regulator_init_data __initdata max8997_32khz_cp_data = {
853 static struct regulator_init_data __initdata max8997_vichg_data = {
862 static struct regulator_init_data __initdata max8997_esafeout1_data = {
865 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
870 .num_consumer_supplies = ARRAY_SIZE(max8997_esafeout1_),
871 .consumer_supplies = max8997_esafeout1_,
874 static struct regulator_init_data __initdata max8997_esafeout2_data = {
877 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
882 .num_consumer_supplies = ARRAY_SIZE(max8997_esafeout2_),
883 .consumer_supplies = max8997_esafeout2_,
886 static struct regulator_init_data __initdata max8997_charger_cv_data = {
888 .name = "CHARGER_CV",
895 static struct regulator_init_data __initdata max8997_charger_data = {
901 .valid_ops_mask = REGULATOR_CHANGE_STATUS |
902 REGULATOR_CHANGE_CURRENT,
904 .num_consumer_supplies = ARRAY_SIZE(max8997_charger_),
905 .consumer_supplies = max8997_charger_,
908 static struct regulator_init_data __initdata max8997_charger_topoff_data = {
910 .name = "CHARGER TOPOFF",
913 .valid_ops_mask = REGULATOR_CHANGE_CURRENT,
915 .num_consumer_supplies = ARRAY_SIZE(max8997_chg_toff_),
916 .consumer_supplies = max8997_chg_toff_,
919 static struct max8997_regulator_data __initdata nuri_max8997_regulators[] = {
920 { MAX8997_LDO1, &max8997_ldo1_data },
921 { MAX8997_LDO2, &max8997_ldo2_data },
922 { MAX8997_LDO3, &max8997_ldo3_data },
923 { MAX8997_LDO4, &max8997_ldo4_data },
924 { MAX8997_LDO5, &max8997_ldo5_data },
925 { MAX8997_LDO6, &max8997_ldo6_data },
926 { MAX8997_LDO7, &max8997_ldo7_data },
927 { MAX8997_LDO8, &max8997_ldo8_data },
928 { MAX8997_LDO9, &max8997_ldo9_data },
929 { MAX8997_LDO10, &max8997_ldo10_data },
930 { MAX8997_LDO11, &max8997_ldo11_data },
931 { MAX8997_LDO12, &max8997_ldo12_data },
932 { MAX8997_LDO13, &max8997_ldo13_data },
933 { MAX8997_LDO14, &max8997_ldo14_data },
934 { MAX8997_LDO15, &max8997_ldo15_data },
935 { MAX8997_LDO16, &max8997_ldo16_data },
937 { MAX8997_LDO18, &max8997_ldo18_data },
938 { MAX8997_LDO21, &max8997_ldo21_data },
940 { MAX8997_BUCK1, &max8997_buck1_data },
941 { MAX8997_BUCK2, &max8997_buck2_data },
942 { MAX8997_BUCK3, &max8997_buck3_data },
943 { MAX8997_BUCK4, &max8997_buck4_data },
944 { MAX8997_BUCK5, &max8997_buck5_data },
945 { MAX8997_BUCK6, &max8997_buck6_data },
946 { MAX8997_BUCK7, &max8997_buck7_data },
948 { MAX8997_EN32KHZ_AP, &max8997_32khz_ap_data },
949 { MAX8997_EN32KHZ_CP, &max8997_32khz_cp_data },
951 { MAX8997_ENVICHG, &max8997_vichg_data },
952 { MAX8997_ESAFEOUT1, &max8997_esafeout1_data },
953 { MAX8997_ESAFEOUT2, &max8997_esafeout2_data },
954 { MAX8997_CHARGER_CV, &max8997_charger_cv_data },
955 { MAX8997_CHARGER, &max8997_charger_data },
956 { MAX8997_CHARGER_TOPOFF, &max8997_charger_topoff_data },
959 static struct max8997_platform_data __initdata nuri_max8997_pdata = {
962 .num_regulators = ARRAY_SIZE(nuri_max8997_regulators),
963 .regulators = nuri_max8997_regulators,
965 .buck125_gpios = { EXYNOS4_GPX0(5), EXYNOS4_GPX0(6), EXYNOS4_GPL0(0) },
967 .buck1_voltage[0] = 1350000, /* 1.35V */
968 .buck1_voltage[1] = 1300000, /* 1.3V */
969 .buck1_voltage[2] = 1250000, /* 1.25V */
970 .buck1_voltage[3] = 1200000, /* 1.2V */
971 .buck1_voltage[4] = 1150000, /* 1.15V */
972 .buck1_voltage[5] = 1100000, /* 1.1V */
973 .buck1_voltage[6] = 1000000, /* 1.0V */
974 .buck1_voltage[7] = 950000, /* 0.95V */
976 .buck2_voltage[0] = 1100000, /* 1.1V */
977 .buck2_voltage[1] = 1000000, /* 1.0V */
978 .buck2_voltage[2] = 950000, /* 0.95V */
979 .buck2_voltage[3] = 900000, /* 0.9V */
980 .buck2_voltage[4] = 1100000, /* 1.1V */
981 .buck2_voltage[5] = 1000000, /* 1.0V */
982 .buck2_voltage[6] = 950000, /* 0.95V */
983 .buck2_voltage[7] = 900000, /* 0.9V */
985 .buck5_voltage[0] = 1200000, /* 1.2V */
986 .buck5_voltage[1] = 1200000, /* 1.2V */
987 .buck5_voltage[2] = 1200000, /* 1.2V */
988 .buck5_voltage[3] = 1200000, /* 1.2V */
989 .buck5_voltage[4] = 1200000, /* 1.2V */
990 .buck5_voltage[5] = 1200000, /* 1.2V */
991 .buck5_voltage[6] = 1200000, /* 1.2V */
992 .buck5_voltage[7] = 1200000, /* 1.2V */
995 /* GPIO I2C 5 (PMIC) */
996 enum { I2C5_MAX8997 };
997 static struct i2c_board_info i2c5_devs[] __initdata = {
999 I2C_BOARD_INFO("max8997", 0xCC >> 1),
1000 .platform_data = &nuri_max8997_pdata,
1004 static struct max17042_platform_data nuri_battery_platform_data = {
1007 /* GPIO I2C 9 (Fuel Gauge) */
1008 static struct i2c_gpio_platform_data i2c9_gpio_data = {
1009 .sda_pin = EXYNOS4_GPY4(0), /* XM0ADDR_8 */
1010 .scl_pin = EXYNOS4_GPY4(1), /* XM0ADDR_9 */
1012 static struct platform_device i2c9_gpio = {
1016 .platform_data = &i2c9_gpio_data,
1019 enum { I2C9_MAX17042};
1020 static struct i2c_board_info i2c9_devs[] __initdata = {
1022 I2C_BOARD_INFO("max17042", 0x36),
1023 .platform_data = &nuri_battery_platform_data,
1027 /* MAX8903 Secondary Charger */
1028 static struct regulator_consumer_supply supplies_max8903[] = {
1029 REGULATOR_SUPPLY("vinchg2", "charger-manager.0"),
1032 static struct regulator_init_data max8903_charger_en_data = {
1034 .name = "VOUT_CHARGER",
1035 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
1038 .num_consumer_supplies = ARRAY_SIZE(supplies_max8903),
1039 .consumer_supplies = supplies_max8903,
1042 static struct fixed_voltage_config max8903_charger_en = {
1043 .supply_name = "VOUT_CHARGER",
1044 .microvolts = 5000000, /* Assume 5VDC */
1045 .gpio = EXYNOS4_GPY4(5), /* TA_EN negaged */
1046 .enable_high = 0, /* Enable = Low */
1047 .enabled_at_boot = 1,
1048 .init_data = &max8903_charger_en_data,
1051 static struct platform_device max8903_fixed_reg_dev = {
1052 .name = "reg-fixed-voltage",
1053 .id = FIXED_REG_ID_MAX8903,
1054 .dev = { .platform_data = &max8903_charger_en },
1057 static struct max8903_pdata nuri_max8903 = {
1059 * cen: don't control with the driver, let it be
1060 * controlled by regulator above
1062 .dok = EXYNOS4_GPX1(4), /* TA_nCONNECTED */
1063 /* uok, usus: not connected */
1064 .chg = EXYNOS4_GPE2(0), /* TA_nCHG */
1065 /* flt: vcc_1.8V_pda */
1066 .dcm = EXYNOS4_GPL0(1), /* CURR_ADJ */
1069 .usb_valid = false, /* USB is not wired to MAX8903 */
1072 static struct platform_device nuri_max8903_device = {
1073 .name = "max8903-charger",
1075 .platform_data = &nuri_max8903,
1079 static void __init nuri_power_init(void)
1082 int irq_base = IRQ_GPIO_END + 1;
1085 nuri_max8997_pdata.irq_base = irq_base;
1086 irq_base += MAX8997_IRQ_NR;
1088 gpio = EXYNOS4_GPX0(7);
1089 gpio_request(gpio, "AP_PMIC_IRQ");
1090 s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf));
1091 s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
1093 gpio = EXYNOS4_GPX2(3);
1094 gpio_request(gpio, "FUEL_ALERT");
1095 s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf));
1096 s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
1098 gpio = nuri_max8903.dok;
1099 gpio_request(gpio, "TA_nCONNECTED");
1100 s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf));
1101 s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
1102 ta_en = gpio_get_value(gpio) ? 0 : 1;
1104 gpio = nuri_max8903.chg;
1105 gpio_request(gpio, "TA_nCHG");
1106 gpio_direction_input(gpio);
1108 gpio = nuri_max8903.dcm;
1109 gpio_request(gpio, "CURR_ADJ");
1110 gpio_direction_output(gpio, ta_en);
1114 static struct s5p_ehci_platdata nuri_ehci_pdata;
1116 static void __init nuri_ehci_init(void)
1118 struct s5p_ehci_platdata *pdata = &nuri_ehci_pdata;
1120 s5p_ehci_set_platdata(pdata);
1124 static struct regulator_consumer_supply cam_vt_cam15_supply =
1125 REGULATOR_SUPPLY("vdd_core", "6-003c");
1127 static struct regulator_init_data cam_vt_cam15_reg_init_data = {
1128 .constraints = { .valid_ops_mask = REGULATOR_CHANGE_STATUS },
1129 .num_consumer_supplies = 1,
1130 .consumer_supplies = &cam_vt_cam15_supply,
1133 static struct fixed_voltage_config cam_vt_cam15_fixed_voltage_cfg = {
1134 .supply_name = "VT_CAM_1.5V",
1135 .microvolts = 1500000,
1136 .gpio = EXYNOS4_GPE2(2), /* VT_CAM_1.5V_EN */
1138 .init_data = &cam_vt_cam15_reg_init_data,
1141 static struct platform_device cam_vt_cam15_fixed_rdev = {
1142 .name = "reg-fixed-voltage", .id = FIXED_REG_ID_CAM_VT_15V,
1143 .dev = { .platform_data = &cam_vt_cam15_fixed_voltage_cfg },
1146 static struct regulator_consumer_supply cam_vdda_supply[] = {
1147 REGULATOR_SUPPLY("vdda", "6-003c"),
1148 REGULATOR_SUPPLY("a_sensor", "0-001f"),
1151 static struct regulator_init_data cam_vdda_reg_init_data = {
1152 .constraints = { .valid_ops_mask = REGULATOR_CHANGE_STATUS },
1153 .num_consumer_supplies = ARRAY_SIZE(cam_vdda_supply),
1154 .consumer_supplies = cam_vdda_supply,
1157 static struct fixed_voltage_config cam_vdda_fixed_voltage_cfg = {
1158 .supply_name = "CAM_IO_EN",
1159 .microvolts = 2800000,
1160 .gpio = EXYNOS4_GPE2(1), /* CAM_IO_EN */
1162 .init_data = &cam_vdda_reg_init_data,
1165 static struct platform_device cam_vdda_fixed_rdev = {
1166 .name = "reg-fixed-voltage", .id = FIXED_REG_ID_CAM_A28V,
1167 .dev = { .platform_data = &cam_vdda_fixed_voltage_cfg },
1170 static struct regulator_consumer_supply camera_8m_12v_supply =
1171 REGULATOR_SUPPLY("dig_12", "0-001f");
1173 static struct regulator_init_data cam_8m_12v_reg_init_data = {
1174 .num_consumer_supplies = 1,
1175 .consumer_supplies = &camera_8m_12v_supply,
1177 .valid_ops_mask = REGULATOR_CHANGE_STATUS
1181 static struct fixed_voltage_config cam_8m_12v_fixed_voltage_cfg = {
1182 .supply_name = "8M_1.2V",
1183 .microvolts = 1200000,
1184 .gpio = EXYNOS4_GPE2(5), /* 8M_1.2V_EN */
1186 .init_data = &cam_8m_12v_reg_init_data,
1189 static struct platform_device cam_8m_12v_fixed_rdev = {
1190 .name = "reg-fixed-voltage", .id = FIXED_REG_ID_CAM_12V,
1191 .dev = { .platform_data = &cam_8m_12v_fixed_voltage_cfg },
1194 static struct s5p_platform_mipi_csis mipi_csis_platdata = {
1195 .clk_rate = 166000000UL,
1199 .phy_enable = s5p_csis_phy_enable,
1202 #define GPIO_CAM_MEGA_RST EXYNOS4_GPY3(7) /* ISP_RESET */
1203 #define GPIO_CAM_8M_ISP_INT EXYNOS4_GPL2(5)
1204 #define GPIO_CAM_VT_NSTBY EXYNOS4_GPL2(0)
1205 #define GPIO_CAM_VT_NRST EXYNOS4_GPL2(1)
1207 static struct s5k6aa_platform_data s5k6aa_pldata = {
1208 .mclk_frequency = 24000000UL,
1209 .gpio_reset = { GPIO_CAM_VT_NRST, 0 },
1210 .gpio_stby = { GPIO_CAM_VT_NSTBY, 0 },
1211 .bus_type = V4L2_MBUS_PARALLEL,
1215 static struct i2c_board_info s5k6aa_board_info = {
1216 I2C_BOARD_INFO("S5K6AA", 0x3c),
1217 .platform_data = &s5k6aa_pldata,
1220 static struct m5mols_platform_data m5mols_platdata = {
1221 .gpio_reset = GPIO_CAM_MEGA_RST,
1224 static struct i2c_board_info m5mols_board_info = {
1225 I2C_BOARD_INFO("M5MOLS", 0x1F),
1226 .platform_data = &m5mols_platdata,
1229 static struct s5p_fimc_isp_info nuri_camera_sensors[] = {
1231 .flags = V4L2_MBUS_PCLK_SAMPLE_RISING |
1232 V4L2_MBUS_VSYNC_ACTIVE_LOW,
1233 .bus_type = FIMC_ITU_601,
1234 .board_info = &s5k6aa_board_info,
1235 .clk_frequency = 24000000UL,
1238 .flags = V4L2_MBUS_PCLK_SAMPLE_FALLING |
1239 V4L2_MBUS_VSYNC_ACTIVE_LOW,
1240 .bus_type = FIMC_MIPI_CSI2,
1241 .board_info = &m5mols_board_info,
1242 .clk_frequency = 24000000UL,
1243 .csi_data_align = 32,
1247 static struct s5p_platform_fimc fimc_md_platdata = {
1248 .isp_info = nuri_camera_sensors,
1249 .num_clients = ARRAY_SIZE(nuri_camera_sensors),
1252 static struct gpio nuri_camera_gpios[] = {
1253 { GPIO_CAM_VT_NSTBY, GPIOF_OUT_INIT_LOW, "CAM_VGA_NSTBY" },
1254 { GPIO_CAM_VT_NRST, GPIOF_OUT_INIT_LOW, "CAM_VGA_NRST" },
1255 { GPIO_CAM_8M_ISP_INT, GPIOF_IN, "8M_ISP_INT" },
1256 { GPIO_CAM_MEGA_RST, GPIOF_OUT_INIT_LOW, "CAM_8M_NRST" },
1259 static void __init nuri_camera_init(void)
1261 s3c_set_platdata(&mipi_csis_platdata, sizeof(mipi_csis_platdata),
1262 &s5p_device_mipi_csis0);
1263 s3c_set_platdata(&fimc_md_platdata, sizeof(fimc_md_platdata),
1264 &s5p_device_fimc_md);
1266 if (gpio_request_array(nuri_camera_gpios,
1267 ARRAY_SIZE(nuri_camera_gpios))) {
1268 pr_err("%s: GPIO request failed\n", __func__);
1272 m5mols_board_info.irq = s5p_register_gpio_interrupt(GPIO_CAM_8M_ISP_INT);
1273 if (!IS_ERR_VALUE(m5mols_board_info.irq))
1274 s3c_gpio_cfgpin(GPIO_CAM_8M_ISP_INT, S3C_GPIO_SFN(0xF));
1276 pr_err("%s: Failed to configure 8M_ISP_INT GPIO\n", __func__);
1278 /* Free GPIOs controlled directly by the sensor drivers. */
1279 gpio_free(GPIO_CAM_VT_NRST);
1280 gpio_free(GPIO_CAM_VT_NSTBY);
1281 gpio_free(GPIO_CAM_MEGA_RST);
1283 if (exynos4_fimc_setup_gpio(S5P_CAMPORT_A)) {
1284 pr_err("%s: Camera port A setup failed\n", __func__);
1287 /* Increase drive strength of the sensor clock output */
1288 s5p_gpio_set_drvstr(EXYNOS4_GPJ1(3), S5P_GPIO_DRVSTR_LV4);
1291 static struct s3c2410_platform_i2c nuri_i2c6_platdata __initdata = {
1292 .frequency = 400000U,
1297 static struct s3c2410_platform_i2c nuri_i2c0_platdata __initdata = {
1298 .frequency = 400000U,
1302 /* DEVFREQ controlling memory/bus */
1303 static struct platform_device exynos4_bus_devfreq = {
1304 .name = "exynos4210-busfreq",
1307 static struct platform_device *nuri_devices[] __initdata = {
1308 /* Samsung Platform Devices */
1309 &s3c_device_i2c5, /* PMIC should initialize first */
1312 &emmc_fixed_voltage,
1313 &s5p_device_mipi_csis0,
1323 &s3c_device_timer[0],
1334 &s5p_device_fimc_md,
1339 &nuri_backlight_device,
1340 &max8903_fixed_reg_dev,
1341 &nuri_max8903_device,
1342 &cam_vt_cam15_fixed_rdev,
1343 &cam_vdda_fixed_rdev,
1344 &cam_8m_12v_fixed_rdev,
1345 &exynos4_bus_devfreq,
1348 static void __init nuri_map_io(void)
1350 exynos_init_io(NULL, 0);
1351 s3c24xx_init_clocks(24000000);
1352 s3c24xx_init_uarts(nuri_uartcfgs, ARRAY_SIZE(nuri_uartcfgs));
1355 static void __init nuri_reserve(void)
1357 s5p_mfc_reserve_mem(0x43000000, 8 << 20, 0x51000000, 8 << 20);
1360 static void __init nuri_machine_init(void)
1366 s3c_i2c0_set_platdata(&nuri_i2c0_platdata);
1367 i2c_register_board_info(1, i2c1_devs, ARRAY_SIZE(i2c1_devs));
1368 s3c_i2c3_set_platdata(&i2c3_data);
1369 i2c_register_board_info(3, i2c3_devs, ARRAY_SIZE(i2c3_devs));
1370 s3c_i2c5_set_platdata(NULL);
1371 i2c5_devs[I2C5_MAX8997].irq = gpio_to_irq(EXYNOS4_GPX0(7));
1372 i2c_register_board_info(5, i2c5_devs, ARRAY_SIZE(i2c5_devs));
1373 i2c9_devs[I2C9_MAX17042].irq = gpio_to_irq(EXYNOS4_GPX2(3));
1374 i2c_register_board_info(9, i2c9_devs, ARRAY_SIZE(i2c9_devs));
1375 s3c_i2c6_set_platdata(&nuri_i2c6_platdata);
1377 s5p_fimd0_set_platdata(&nuri_fb_pdata);
1382 clk_xusbxti.rate = 24000000;
1385 platform_add_devices(nuri_devices, ARRAY_SIZE(nuri_devices));
1388 MACHINE_START(NURI, "NURI")
1389 /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */
1390 .atag_offset = 0x100,
1391 .init_irq = exynos4_init_irq,
1392 .map_io = nuri_map_io,
1393 .handle_irq = gic_handle_irq,
1394 .init_machine = nuri_machine_init,
1395 .timer = &exynos4_timer,
1396 .reserve = &nuri_reserve,
1397 .restart = exynos4_restart,