static int32_t msm_camera_8960_ext_power_ctrl(int enable)
{
	int rc = 0;
	if (enable) {
		rc = pm8xxx_mpp_config(PM8921_MPP_PM_TO_SYS(12),
			&privacy_light_on_config);
	} else {
		rc = pm8xxx_mpp_config(PM8921_MPP_PM_TO_SYS(12),
			&privacy_light_off_config);
	}
	return rc;
}
void active_reset(int high)
{
	if (high) {
		pm8xxx_mpp_config(
			PM8921_MPP_PM_TO_SYS(MLCD_RST_MPP2),
			&MLCD_RESET_HIGH_CONFIG);
	} else {
		pm8xxx_mpp_config(
			PM8921_MPP_PM_TO_SYS(MLCD_RST_MPP2),
			&MLCD_RESET_LOW_CONFIG);
	}
}
void power_on_flash(void)
{
	int temp = 0;
	int ret = 0;

	if(!isFlashCntlEn) {
		temp = gpio_get_value(GPIO_MSM_FLASH_NOW);
		if (isFlashCntlEn == 0 && temp == 0) {
			/* FLASH_LED_UNLOCK*/
			gpio_set_value_cansleep(PM8921_MPP_PM_TO_SYS
				(PMIC_MPP_FLASH_LED_UNLOCK), 1);
			/* GPIO_CAM_FLASH_SW : tourch */
			gpio_set_value_cansleep(gpio_cam_flash_sw, 1);
			temp = gpio_get_value(gpio_cam_flash_sw);
			printk("[s5c73m3] check GPIO_CAM_FLASH_SW : %d\n", temp);
			usleep(1*1000);
		}

		/* flash power 1.8V */
		l28 = regulator_get(NULL, "8921_lvs4");
		ret = regulator_enable(l28);

		if (ret)
			printk("error enabling regulator\n");

		usleep(1*1000);
		isFlashCntlEn = true;
	}
}
static int mipi_dsi_power_octa_request(void)
{
	int rc = 0;

	reg_L30 = regulator_get(&msm_mipi_dsi1_device.dev,
				"3000mV_LCD");
	if (IS_ERR_OR_NULL(reg_L30)) {
		pr_err("could not get 8917_L30, rc = %ld\n",
				PTR_ERR(reg_L30));
		return -ENODEV;
	}

	rc = regulator_set_voltage(reg_L30, 3000000, 3000000);
	if (rc) {
		pr_err("set_voltage L30 failed, rc=%d\n", rc);
		return -EINVAL;
	}

	pm8xxx_mpp_config(PM8921_MPP_PM_TO_SYS(MLCD_RST_MPP2),
			&MLCD_RESET_LOW_CONFIG);

	msleep(100);

	return rc;
}
static bool sec_fg_gpio_init(void)
{
	struct pm_gpio param = {
		.direction     = PM_GPIO_DIR_IN,
		.pull          = PM_GPIO_PULL_NO,
		.vin_sel       = PM_GPIO_VIN_S4,
		.function      = PM_GPIO_FUNC_NORMAL,
	};

	/* FUEL_ALERT Setting */
	if (system_rev == 0x0) {
		sec_battery_pdata.fg_irq = PM8921_GPIO_IRQ(PM8921_IRQ_BASE,
				GPIO_FUEL_INT_04A);
		pm8xxx_gpio_config(PM8921_GPIO_PM_TO_SYS(GPIO_FUEL_INT_04A),
						&param);
#if defined(CONFIG_MACH_JF_ATT) || defined(CONFIG_MACH_JF_TMO)
	} else if (system_rev >= 8) {
#else
	} else if (system_rev >= 9) {
#endif
		/* FUEL_ALERT Registration */
		struct pm8xxx_mpp_config_data fuel_alert_mppcfg = {
			.type = PM8XXX_MPP_TYPE_D_INPUT,
			.level = PM8921_MPP_DIG_LEVEL_S4,
			.control = PM8XXX_MPP_DOUT_CTRL_LOW,
		};

		sec_battery_pdata.fg_irq = PM8921_MPP_IRQ(PM8921_IRQ_BASE, 6);
		pm8xxx_mpp_config(PM8921_MPP_PM_TO_SYS(6),
				&fuel_alert_mppcfg);
	}
	else
static int aat1290a_freeGpio(void)
{
	int ret;

	printk(KERN_DEBUG "[%s : %d]!!\n", __func__, __LINE__);

	if (pmic_gpio_msm_flash_cntl_en)
		gpio_set_value_cansleep(pmic_gpio_msm_flash_cntl_en, 0);
	else
		gpio_set_value_cansleep(GPIO_MSM_FLASH_CNTL_EN, 0);
	isFlashCntlEn = false;
	usleep(1*1000);
	gpio_set_value_cansleep(GPIO_MSM_FLASH_NOW, 0);
	usleep(1*1000);

	/* flash power 1.8V */
	if (l28) {
		ret = regulator_disable(l28);
		if (ret)
			cam_err("error disabling regulator\n");
	}
	usleep(1*1000);

	/* GPIO_CAM_FLASH_SW : tourch */
	gpio_set_value_cansleep(gpio_cam_flash_sw, 0);
	usleep(1*1000);

#if defined(CONFIG_S5C73M3) && defined(CONFIG_S5K6A3YX) /* D2 */
	/* FLASH_LED_LOCK*/
	gpio_set_value_cansleep(PM8921_MPP_PM_TO_SYS
		(PMIC_MPP_FLASH_LED_UNLOCK), 0);
#endif
	return 0;
}
static void m7wl_audio_pmic_mpp_config(void)
{
	unsigned ret;

	struct pm8xxx_mpp_config_data m7wl_audio_pmic_mpp = {
		.type	= PM8XXX_MPP_TYPE_D_OUTPUT,
		.level	= PM8921_MPP_DIG_LEVEL_S4,
		.control = PM8XXX_MPP_DOUT_CTRL_LOW,
	};

	ret = pm8xxx_mpp_config(PM8921_MPP_PM_TO_SYS(9),
		&m7wl_audio_pmic_mpp);
	if (ret < 0)
		pr_err("%s:MPP_9 configuration failed\n", __func__);
}
static int aat1290a_setGpio(void)
{
	int ret;
	int temp = 0;

	printk(KERN_DEBUG "[%s : %d]!!\n", __func__, __LINE__);

#if defined(CONFIG_S5C73M3) && defined(CONFIG_S5K6A3YX) /* D2 */
	/* FLASH_LED_UNLOCK*/
	gpio_set_value_cansleep(PM8921_MPP_PM_TO_SYS
		(PMIC_MPP_FLASH_LED_UNLOCK), 1);
#endif

	/* GPIO_CAM_FLASH_SW : tourch */
	gpio_set_value_cansleep(gpio_cam_flash_sw, 0);
	temp = gpio_get_value(gpio_cam_flash_sw);
	printk(KERN_DEBUG "[s5c73m3] check GPIO_CAM_FLASH_SW : %d\n", temp);
	usleep(1*1000);

	/* flash power 1.8V */
	l28 = regulator_get(NULL, "8921_lvs4");
	ret = regulator_enable(l28);
	if (ret)
		cam_err("error enabling regulator\n");
	usleep(1*1000);

	if (pmic_gpio_msm_flash_cntl_en) {
		gpio_set_value_cansleep(pmic_gpio_msm_flash_cntl_en, 1);
	} else {
		gpio_set_value_cansleep(GPIO_MSM_FLASH_CNTL_EN, 1);
		temp = gpio_get_value(GPIO_MSM_FLASH_CNTL_EN);
		printk(KERN_DEBUG "[s5c73m3] check Flash set GPIO : %d\n",
			temp);
	}
	isFlashCntlEn = true;
	usleep(1*1000);

	gpio_set_value_cansleep(GPIO_MSM_FLASH_NOW, 1);
	temp = gpio_get_value(GPIO_MSM_FLASH_NOW);
	printk(KERN_DEBUG "[s5c73m3] check Flash enable GPIO : %d\n", temp);
	usleep(1*1000);

	return 0;
}
			.consumer_supplies	= vreg_consumers_##_id##_PC, \
			.supply_regulator	= _supply_regulator, \
		}, \
		.id	  = RPM_VREG_ID_PM8921_##_id##_PC, \
		.pin_fn	  = RPM_VREG_PIN_FN_8960_##_pin_fn, \
		.pin_ctrl = _pin_ctrl, \
	}

/* GPIO regulator constraints.
 * Must be in sync with corresponding platform_device structures in
 * board_sony_fusion3.c
 */
struct gpio_regulator_platform_data
apq8064_gpio_regulator_pdata[] __devinitdata = {
	/*        ID      vreg_name gpio_label   gpio  supply active_low*/
	GPIO_VREG(EXT_5V, "ext_5v", "ext_5v_en", PM8921_MPP_PM_TO_SYS(7),
		NULL, 0),
	GPIO_VREG(EXT_SD_PWR, "ext_sd_pwr", "ext_sd_pwr_en",
		PM8921_MPP_PM_TO_SYS(4), "8921_l6", 0),
	GPIO_VREG(EXT_OTG_SW, "ext_otg_sw", "ext_otg_sw_en",
		PM8921_GPIO_PM_TO_SYS(42), NULL, 1),
};

/* SAW regulator constraints */
struct regulator_init_data msm8064_saw_regulator_pdata_8921_s5 =
	/*	      ID  vreg_name	       min_uV   max_uV */
	SAW_VREG_INIT(S5, "8921_s5",	       850000, 1300000);
struct regulator_init_data msm8064_saw_regulator_pdata_8921_s6 =
	SAW_VREG_INIT(S6, "8921_s6",	       850000, 1300000);

struct regulator_init_data msm8064_saw_regulator_pdata_8821_s0 =
Example #10
0
		.settings = {
			[GPIOMUX_SUSPENDED] = &gpio_spi_cs2_config,
		},
	},
	{
		.gpio      = 54,		/* GSBI5 QUP SPI_CLK */
		.settings = {
			[GPIOMUX_SUSPENDED] = &gpio_spi_config,
		},
	},
#endif
};

static struct pm8xxx_mpp_platform_data
apq8064_pm8921_mpp_pdata __devinitdata = {
	.mpp_base	= PM8921_MPP_PM_TO_SYS(1),
};

static struct pm8xxx_gpio_platform_data
apq8064_pm8921_gpio_pdata __devinitdata = {
	.gpio_base	= PM8921_GPIO_PM_TO_SYS(1),
};

static struct pm8xxx_irq_platform_data
apq8064_pm8921_irq_pdata __devinitdata = {
	.irq_base		= PM8921_IRQ_BASE,
	.devirq			= PM8921_USR_IRQ_N,
	.irq_trigger_flag	= IRQF_TRIGGER_HIGH,
	.dev_id			= 0,
};
Example #11
0
				.valid_ops_mask	= REGULATOR_CHANGE_STATUS, \
				.always_on	= _always_on, \
			}, \
			.num_consumer_supplies	= \
					ARRAY_SIZE(vreg_consumers_##_id##_PC), \
			.consumer_supplies	= vreg_consumers_##_id##_PC, \
			.supply_regulator	= _supply_regulator, \
		}, \
		.id	  = RPM_VREG_ID_PM8921_##_id##_PC, \
		.pin_fn	  = RPM_VREG_PIN_FN_8960_##_pin_fn, \
		.pin_ctrl = _pin_ctrl, \
	}

/* GPIO regulator constraints */
struct gpio_regulator_platform_data msm_gpio_regulator_pdata[] __devinitdata = {
	GPIO_VREG_INIT(EXT_5V, "ext_5v", "ext_5v_en", PM8921_MPP_PM_TO_SYS(7)),
	GPIO_VREG_INIT(EXT_L2, "ext_l2", "ext_l2_en", 91),
};

struct platform_device msm8960_device_ext_5v_vreg __devinitdata = {
	.name	= GPIO_REGULATOR_DEV_NAME,
	.id	= PM8921_MPP_PM_TO_SYS(7),
	.dev	= {
		.platform_data = &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_5V],
	},
};

struct platform_device msm8960_device_ext_l2_vreg __devinitdata = {
	.name	= GPIO_REGULATOR_DEV_NAME,
	.id	= 91,
	.dev	= {
static int lvds_panel_power(int on)
{
	static struct regulator *reg_lvs7, *reg_l2, *reg_ext_3p3v;
	static int gpio36, gpio26, mpp3;
	int rc;

	pr_debug("%s: on=%d\n", __func__, on);

	if (!lvds_power_on) {
		reg_lvs7 = regulator_get(&msm_lvds_device.dev,
				"lvds_vdda");
		if (IS_ERR_OR_NULL(reg_lvs7)) {
			pr_err("could not get 8921_lvs7, rc = %ld\n",
				PTR_ERR(reg_lvs7));
			return -ENODEV;
		}

		reg_l2 = regulator_get(&msm_lvds_device.dev,
				"lvds_pll_vdda");
		if (IS_ERR_OR_NULL(reg_l2)) {
			pr_err("could not get 8921_l2, rc = %ld\n",
				PTR_ERR(reg_l2));
			return -ENODEV;
		}

		rc = regulator_set_voltage(reg_l2, 1200000, 1200000);
		if (rc) {
			pr_err("set_voltage l2 failed, rc=%d\n", rc);
			return -EINVAL;
		}

		reg_ext_3p3v = regulator_get(&msm_lvds_device.dev,
			"lvds_vccs_3p3v");
		if (IS_ERR_OR_NULL(reg_ext_3p3v)) {
			pr_err("could not get reg_ext_3p3v, rc = %ld\n",
			       PTR_ERR(reg_ext_3p3v));
		    return -ENODEV;
		}

		gpio26 = PM8921_GPIO_PM_TO_SYS(26);
		rc = gpio_request(gpio26, "pwm_backlight_ctrl");
		if (rc) {
			pr_err("request gpio 26 failed, rc=%d\n", rc);
			return -ENODEV;
		}

		gpio36 = PM8921_GPIO_PM_TO_SYS(36); /* lcd1_pwr_en_n */
		rc = gpio_request(gpio36, "lcd1_pwr_en_n");
		if (rc) {
			pr_err("request gpio 36 failed, rc=%d\n", rc);
			return -ENODEV;
		}

		mpp3 = PM8921_MPP_PM_TO_SYS(3);
		rc = gpio_request(mpp3, "backlight_en");
		if (rc) {
			pr_err("request mpp3 failed, rc=%d\n", rc);
			return -ENODEV;
		}

		lvds_power_on = true;
	}

	if (on) {
		rc = regulator_enable(reg_lvs7);
		if (rc) {
			pr_err("enable lvs7 failed, rc=%d\n", rc);
			return -ENODEV;
		}

		rc = regulator_set_optimum_mode(reg_l2, 100000);
		if (rc < 0) {
			pr_err("set_optimum_mode l2 failed, rc=%d\n", rc);
			return -EINVAL;
		}
		rc = regulator_enable(reg_l2);
		if (rc) {
			pr_err("enable l2 failed, rc=%d\n", rc);
			return -ENODEV;
		}

		rc = regulator_enable(reg_ext_3p3v);
		if (rc) {
			pr_err("enable reg_ext_3p3v failed, rc=%d\n", rc);
			return -ENODEV;
		}

		gpio_set_value_cansleep(gpio36, 0);
		gpio_set_value_cansleep(mpp3, 1);
	} else {
		gpio_set_value_cansleep(mpp3, 0);
		gpio_set_value_cansleep(gpio36, 1);

		rc = regulator_disable(reg_lvs7);
		if (rc) {
			pr_err("disable reg_lvs7 failed, rc=%d\n", rc);
			return -ENODEV;
		}
		rc = regulator_disable(reg_l2);
		if (rc) {
			pr_err("disable reg_l2 failed, rc=%d\n", rc);
			return -ENODEV;
		}
		rc = regulator_disable(reg_ext_3p3v);
		if (rc) {
			pr_err("disable reg_ext_3p3v failed, rc=%d\n", rc);
			return -ENODEV;
		}
	}

	return 0;
}
/* OPPO 2013-07-4 Neal Modify begin for LCD */
int mipi_dsi_panel_power(int on)
{
/* OPPO 2012-08-31 zhengzk Modify begin for LCD */
	static struct regulator *reg_lvs7, *reg_l2, *reg_l11, *reg_ext_3p3v;
	static int gpio36, gpio25, mpp3;
#ifdef CONFIG_VENDOR_EDIT
	static struct regulator *reg_l22;
#else
	static int gpio26;
#endif
/* OPPO 2013-07-4 Neal Modify end*/
	int rc;

	pr_debug("%s: on=%d\n", __func__, on);

	if (!dsi_power_on) {
		reg_lvs7 = regulator_get(&msm_mipi_dsi1_device.dev,
				"dsi1_vddio");
		if (IS_ERR_OR_NULL(reg_lvs7)) {
			pr_err("could not get 8921_lvs7, rc = %ld\n",
				PTR_ERR(reg_lvs7));
			return -ENODEV;
		}

		reg_l2 = regulator_get(&msm_mipi_dsi1_device.dev,
				"dsi1_pll_vdda");
		if (IS_ERR_OR_NULL(reg_l2)) {
			pr_err("could not get 8921_l2, rc = %ld\n",
				PTR_ERR(reg_l2));
			return -ENODEV;
		}

		rc = regulator_set_voltage(reg_l2, 1200000, 1200000);
		if (rc) {
			pr_err("set_voltage l2 failed, rc=%d\n", rc);
			return -EINVAL;
		}
		reg_l11 = regulator_get(&msm_mipi_dsi1_device.dev,
						"dsi1_avdd");
		if (IS_ERR(reg_l11)) {
				pr_err("could not get 8921_l11, rc = %ld\n",
						PTR_ERR(reg_l11));
				return -ENODEV;
		}
/* OPPO 2012-08-31 zhengzk Modify begin for LCD */
#ifndef CONFIG_VENDOR_EDIT
		rc = regulator_set_voltage(reg_l11, 3000000, 3000000);
#else
		rc = regulator_set_voltage(reg_l11, 3100000, 3100000);
#endif
/* OPPO 2012-08-31 zhengzk Modify end */
		if (rc) {
				pr_err("set_voltage l11 failed, rc=%d\n", rc);
				return -EINVAL;
		}

/* OPPO 2012-08-31 zhengzk Add begin for LCD */
#ifdef CONFIG_VENDOR_EDIT	
		reg_l22 = regulator_get(NULL, "8921_l22");
		if (IS_ERR(reg_l22)) {
				pr_err("could not get 8921_l22, rc = %ld\n",
						PTR_ERR(reg_l22));
				return -ENODEV;
		}

		rc = regulator_set_voltage(reg_l22, 1800000, 1800000);
		if (rc) {
				pr_err("set_voltage l22 failed, rc=%d\n", rc);
				return -EINVAL;
		}
#endif
/* OPPO 2012-08-31 zhengzk Modify end */

		if (machine_is_apq8064_liquid()) {
			reg_ext_3p3v = regulator_get(&msm_mipi_dsi1_device.dev,
				"dsi1_vccs_3p3v");
			if (IS_ERR_OR_NULL(reg_ext_3p3v)) {
				pr_err("could not get reg_ext_3p3v, rc = %ld\n",
					PTR_ERR(reg_ext_3p3v));
				reg_ext_3p3v = NULL;
				return -ENODEV;
			}
			mpp3 = PM8921_MPP_PM_TO_SYS(3);
			rc = gpio_request(mpp3, "backlight_en");
			if (rc) {
				pr_err("request mpp3 failed, rc=%d\n", rc);
				return -ENODEV;
			}
		}

		gpio25 = PM8921_GPIO_PM_TO_SYS(25);
		rc = gpio_request(gpio25, "disp_rst_n");
		if (rc) {
			pr_err("request gpio 25 failed, rc=%d\n", rc);
			return -ENODEV;
		}

#ifndef CONFIG_VENDOR_EDIT
		gpio26 = PM8921_GPIO_PM_TO_SYS(26);
		rc = gpio_request(gpio26, "pwm_backlight_ctrl");
		if (rc) {
			pr_err("request gpio 26 failed, rc=%d\n", rc);
			return -ENODEV;
		}
#endif
		gpio36 = PM8921_GPIO_PM_TO_SYS(36); /* lcd1_pwr_en_n */
		rc = gpio_request(gpio36, "lcd1_pwr_en_n");
		if (rc) {
			pr_err("request gpio 36 failed, rc=%d\n", rc);
			return -ENODEV;
		}

#ifdef CONFIG_VENDOR_EDIT
		rc = gpio_request(LCD_5V_EN_DVT, "lcd_5v_en");

		if (rc) {
			pr_err("request gpio 86 failed, rc=%d\n", rc);
			return -ENODEV;
		}
#endif
		dsi_power_on = true;
	}

	if (on) {
		rc = regulator_enable(reg_lvs7);
		if (rc) {
			pr_err("enable lvs7 failed, rc=%d\n", rc);
			return -ENODEV;
		}
/* OPPO 2012-08-31 zhengzk Add begin for LCD */
#ifdef CONFIG_VENDOR_EDIT
		rc = regulator_enable(reg_l22); //1.8v
		if (rc) {
			pr_err("enable l22 failed, rc=%d\n", rc);
			return -ENODEV;
		}
		mdelay(5);
/* OPPO 2012-08-31 zhengzk Modify end */


		rc = gpio_direction_output(LCD_5V_EN_DVT, 1);//5v

		if (rc) {
			pr_err("%s: unable to enable LCD_5V_EN!!!!!!!!!!!!\n", __func__);
			return -ENODEV;
		}
        mdelay(5);

		gpio_set_value_cansleep(gpio36, 0);
		gpio_set_value_cansleep(gpio25, 1);
		mdelay(10);
#endif
		rc = regulator_set_optimum_mode(reg_l11, 110000);
		if (rc < 0) {
			pr_err("set_optimum_mode l11 failed, rc=%d\n", rc);
			return -EINVAL;
		}
		rc = regulator_enable(reg_l11);
		if (rc) {
			pr_err("enable l11 failed, rc=%d\n", rc);
			return -ENODEV;
		}

		rc = regulator_set_optimum_mode(reg_l2, 100000);
		if (rc < 0) {
			pr_err("set_optimum_mode l2 failed, rc=%d\n", rc);
			return -EINVAL;
		}
		rc = regulator_enable(reg_l2);
		if (rc) {
			pr_err("enable l2 failed, rc=%d\n", rc);
			return -ENODEV;
		}

		if (machine_is_apq8064_liquid()) {
			rc = regulator_enable(reg_ext_3p3v);
			if (rc) {
				pr_err("enable reg_ext_3p3v failed, rc=%d\n",
					rc);
				return -ENODEV;
			}
			gpio_set_value_cansleep(mpp3, 1);
		}

		gpio_set_value_cansleep(gpio36, 0);
		gpio_set_value_cansleep(gpio25, 1);
#ifndef CONFIG_VENDOR_EDIT
		if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917)
			gpio_set_value_cansleep(gpio26, 1);
#endif
	} else {
#ifndef CONFIG_VENDOR_EDIT
		if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917)
			gpio_set_value_cansleep(gpio26, 0);
#endif
		gpio_set_value_cansleep(gpio25, 0);
		gpio_set_value_cansleep(gpio36, 1);

		if (machine_is_apq8064_liquid()) {
			gpio_set_value_cansleep(mpp3, 0);

			rc = regulator_disable(reg_ext_3p3v);
			if (rc) {
				pr_err("disable reg_ext_3p3v failed, rc=%d\n",
					rc);
				return -ENODEV;
			}
		}

		rc = regulator_disable(reg_l11);
		if (rc) {
			pr_err("disable reg_l1 failed, rc=%d\n", rc);
			return -ENODEV;
		}

#ifdef CONFIG_VENDOR_EDIT
		rc = gpio_direction_output(LCD_5V_EN_DVT, 0);

		if (rc) {
			pr_err("%s: unable to enable LCD_5V_EN!!!!!!!!!!!!\n", __func__);
			return -ENODEV;
		}
		/* OPPO 2012-08-31 zhengzk Add begin for LCD */
		mdelay(10);
		rc = regulator_disable(reg_l22);
		if (rc) {
			pr_err("disable reg_l22 failed, rc=%d\n", rc);
			return -ENODEV;
		}
		/* OPPO 2012-08-31 zhengzk Modify end */
#endif
		rc = regulator_disable(reg_lvs7);
		if (rc) {
			pr_err("disable reg_lvs7 failed, rc=%d\n", rc);
			return -ENODEV;
		}

		rc = regulator_disable(reg_l2);
		if (rc) {
			pr_err("disable reg_l2 failed, rc=%d\n", rc);
			return -ENODEV;
		}
	}

	return 0;
}
			.num_consumer_supplies	= \
					ARRAY_SIZE(vreg_consumers_##_id##_PC), \
			.consumer_supplies	= vreg_consumers_##_id##_PC, \
			.supply_regulator	= _supply_regulator, \
		}, \
		.id	  = RPM_VREG_ID_PM8921_##_id##_PC, \
		.pin_fn	  = RPM_VREG_PIN_FN_8960_##_pin_fn, \
		.pin_ctrl = _pin_ctrl, \
	}

/* GPIO regulator constraints */
struct gpio_regulator_platform_data
apq8064_gpio_regulator_pdata[] __devinitdata = {
	/*        ID      vreg_name gpio_label   gpio   supply   active_low */
	GPIO_VREG(EXT_5V, "ext_5v", "ext_5v_en",
			PM8921_MPP_PM_TO_SYS(7), NULL, 0),
	GPIO_VREG(EXT_3P3V, "ext_3p3v", "ext_3p3v_en",
		  APQ8064_EXT_3P3V_REG_EN_GPIO, NULL, 0),
	GPIO_VREG(EXT_TS_SW, "ext_ts_sw", "ext_ts_sw_en",
		  PM8921_GPIO_PM_TO_SYS(23), "ext_3p3v", 0),
	GPIO_VREG(EXT_MPP8, "ext_mpp8", "ext_mpp8_en",
			PM8921_MPP_PM_TO_SYS(8), NULL, 0),
	GPIO_VREG(EXT_SATA_PWR, "ext_sata_pwr", "ext_sata_pwr_en",
			PM8921_MPP_PM_TO_SYS(4), "ext_3p3v", 1),
};

struct gpio_regulator_platform_data
mpq8064_gpio_regulator_pdata[] __devinitdata = {
	GPIO_VREG(AVC_1P2V, "avc_1p2v", "avc_1p2v_en",
			SX150X_GPIO(4, 2), NULL, 0),
	GPIO_VREG(AVC_1P8V, "avc_1p8v", "avc_1p8v_en",
static int mipi_panel_power_tft(int enable)
{
	int rc = 0;
#if defined(CONFIG_MACH_JACTIVE_ATT) 
     if(first_boot < 2) { 
        first_boot++; 
        printk("<0> First init Occurred ..... Finished Successfully \n"); 
        return 0; 
     } 
#endif 

	pr_info("%s %d", __func__, enable);
	if (enable) {
#if defined(CONFIG_MACH_JACTIVE_EUR)
		rc = regulator_set_optimum_mode(reg_LVS1, 100000); /*IOVDD */
		if (rc < 0) {
			pr_err("set_optimum_mode LVS1 failed, rc=%d\n", rc);
			return -EINVAL;
		}
		rc = regulator_enable(reg_LVS1);
		if (rc) {
			pr_err("enable LVS1 failed, rc=%d\n", rc);
			return -ENODEV;
		}
#elif defined(CONFIG_MACH_JACTIVE)
		if (system_rev >= 11) {
			rc = regulator_set_optimum_mode(reg_LVS1, 100000); /*IOVDD */
			if (rc < 0) {
				pr_err("set_optimum_mode LVS1 failed, rc=%d\n", rc);
				return -EINVAL;
			}
			rc = regulator_enable(reg_LVS1);
			if (rc) {
				pr_err("enable LVS1 failed, rc=%d\n", rc);
				return -ENODEV;
			}
		}
#endif

		rc = regulator_set_optimum_mode(reg_L15, 100000); /*IOVDD */
		if (rc < 0) {
			pr_err("set_optimum_mode L15 failed, rc=%d\n", rc);
			return -EINVAL;
		}
		rc = regulator_enable(reg_L15);
		if (rc) {
			pr_err("enable L15 failed, rc=%d\n", rc);
			return -ENODEV;
		}

#if defined(CONFIG_MACH_JACTIVE_ATT)
	if(system_rev < 10)
		gpio_direction_output(gpio33, 1);
	else
		gpio_direction_output(LCD_22V_EN, 1);
#else
		gpio_direction_output(LCD_22V_EN, 1);
#if defined(CONFIG_FB_MSM_ENABLE_LCD_EN2)
		if( system_rev >= 16 ) // rev0.6 + 10
		{
			mdelay(10);
			gpio_direction_output(LCD_22V_EN_2, 1);
		}
#endif
#endif

#if !defined(CONFIG_MACH_JACTIVE_ATT) && !defined(CONFIG_MACH_JACTIVE_EUR)
		/*active_reset_ldi(gpio43);*/
		if (system_rev == 0)
			gpio_direction_output(gpio43, 1);
		else
			pm8xxx_mpp_config(
				PM8921_MPP_PM_TO_SYS(MLCD_RST_MPP2),
				&MLCD_RESET_HIGH_CONFIG);

		msleep(20);
#endif
#if defined(CONFIG_MACH_JACTIVE_EUR)
		if( system_rev >= 15 ) // rev0.5 + 10
		{
			rc = regulator_set_optimum_mode(reg_L16, 100000); /*IOVDD */
			if (rc < 0) {
				pr_err("set_optimum_mode L16 failed, rc=%d\n", rc);
				return -EINVAL;
			}
			rc = regulator_enable(reg_L16);
			if (rc) {
				pr_err("enable L16 failed, rc=%d\n", rc);
				return -ENODEV;
			}
			
			msleep ( 10 );
		}
#elif defined(CONFIG_MACH_JACTIVE_ATT)
		if( system_rev >= 11 ) // rev0.3 + 8
		{
			rc = regulator_set_optimum_mode(reg_L16, 100000); /*IOVDD */
			if (rc < 0) {
				pr_err("set_optimum_mode L16 failed, rc=%d\n", rc);
				return -EINVAL;
			}
			rc = regulator_enable(reg_L16);
			if (rc) {
				pr_err("enable L16 failed, rc=%d\n", rc);
				return -ENODEV;
			}
			
			msleep ( 10 );
		}
#endif
		gpio_direction_output(gpio27, 1);/*LED_DRIVER(gpio27);*/
	} else {
		if (system_rev == 0)
			gpio_direction_output(gpio43, 0);
		else
			pm8xxx_mpp_config(
				PM8921_MPP_PM_TO_SYS(MLCD_RST_MPP2),
				&MLCD_RESET_LOW_CONFIG);
#if defined(CONFIG_MACH_JACTIVE_ATT)
		if(system_rev < 10)
			gpio_direction_output(gpio33, 0);
		else
			gpio_direction_output(LCD_22V_EN, 0);	
#else
#if defined(CONFIG_FB_MSM_ENABLE_LCD_EN2)
		if( system_rev >= 16 ) // rev0.6 + 10
		{
			gpio_direction_output(LCD_22V_EN_2, 0);
			mdelay(10);
		}
#endif
		gpio_direction_output(LCD_22V_EN, 0);
#endif
		usleep(2000); /*1ms delay(minimum) required between VDD off and AVDD off*/

		rc = regulator_set_optimum_mode(reg_L15, 100);
		if (rc < 0) {
			pr_err("set_optimum_mode L15 failed, rc=%d\n", rc);
			return -EINVAL;
		}

		rc = regulator_disable(reg_L15);
		if (rc) {
			pr_err("disable reg_L15 failed, rc=%d\n", rc);
			return -ENODEV;
		}

		gpio_direction_output(gpio27, 0);/*LED_DRIVER(gpio27);*/

#if defined(CONFIG_MACH_JACTIVE_EUR)
		if( system_rev >= 15 ) // rev0.5 + 10
		{
			msleep ( 10 );
			rc = regulator_set_optimum_mode(reg_L16, 100);
			if (rc < 0) {
				pr_err("set_optimum_mode L16 failed, rc=%d\n", rc);
				return -EINVAL;
			}
			
			rc = regulator_disable(reg_L16);
			if (rc) {
				pr_err("disable reg_L16 failed, rc=%d\n", rc);
				return -ENODEV;
			}
		}
#elif defined(CONFIG_MACH_JACTIVE_ATT)
		if( system_rev >= 11 ) // rev0.3 + 8
		{
			msleep ( 10 );
			rc = regulator_set_optimum_mode(reg_L16, 100);
			if (rc < 0) {
				pr_err("set_optimum_mode L16 failed, rc=%d\n", rc);
				return -EINVAL;
			}
			
			rc = regulator_disable(reg_L16);
			if (rc) {
				pr_err("disable reg_L16 failed, rc=%d\n", rc);
				return -ENODEV;
			}
		}
#endif

#if defined(CONFIG_MACH_JACTIVE_EUR)
		rc = regulator_set_optimum_mode(reg_LVS1, 100);
		if (rc < 0) {
			pr_err("set_optimum_mode LVS1 failed, rc=%d\n", rc);
			return -EINVAL;
		}
		rc = regulator_disable(reg_LVS1);
		if (rc) {
			pr_err("disable reg_LVS1 failed, rc=%d\n", rc);
			return -ENODEV;
		}
#elif defined(CONFIG_MACH_JACTIVE)
		if (system_rev >= 11) {
			rc = regulator_set_optimum_mode(reg_LVS1, 100);
			if (rc < 0) {
				pr_err("set_optimum_mode LVS1 failed, rc=%d\n", rc);
				return -EINVAL;
			}
			rc = regulator_disable(reg_LVS1);
			if (rc) {
				pr_err("disable reg_LVS1 failed, rc=%d\n", rc);
				return -ENODEV;
			}
		}
#endif
		msleep(20);
	}

	return rc;
}
static int mipi_dsi_power_tft_request(void)
{
	int rc = 0;
#if defined(CONFIG_MACH_JACTIVE_ATT) 
	if (system_rev < 10){
		gpio33 = PM8921_GPIO_PM_TO_SYS(LCD_22V_EN);
		rc = gpio_request(gpio33, "led_dirver");
		if (rc) {
			pr_err("request gpio lcd_22v_en failed, rc=%d\n", rc);
			return -ENODEV;
		}
		rc = pm8xxx_gpio_config(gpio33, &gpio43_param);
		if (rc) {
			pr_err("gpio_config lcd_22v_en failed (3), rc=%d\n", rc);
			return -EINVAL;
		}
	}
	else{
		pr_info("[lcd] request gpio lcd_22v_en\n");
		rc = gpio_request(LCD_22V_EN, "lcd_22v_en");

		if (rc) {
			gpio_free(LCD_22V_EN);
			rc = gpio_request(LCD_22V_EN, "lcd_22v_en");
			if(rc){
				pr_err("request gpio lcd_22v_en failed, rc=%d\n", rc);
				return -ENODEV;
			}
		}

		pr_info("[lcd] configure LCD_22V_EN\n");
		gpio_tlmm_config(GPIO_CFG(LCD_22V_EN,  0, GPIO_CFG_OUTPUT,
		GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);
	}
#else
	pr_info("[lcd] request gpio lcd_22v_en\n");
	rc = gpio_request(LCD_22V_EN, "lcd_22v_en");

	if (rc) {
		pr_err("request gpio lcd_22v_en failed, rc=%d\n", rc);
		return -ENODEV;
	}

	pr_info("[lcd] configure LCD_22V_EN\n");
	gpio_tlmm_config(GPIO_CFG(LCD_22V_EN,  0, GPIO_CFG_OUTPUT,
		GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);

#if defined(CONFIG_FB_MSM_ENABLE_LCD_EN2)
	if( system_rev >= 16 ) // rev0.6 + 10
	{
		pr_info("[lcd] request gpio lcd_22v_en_2\n");
		rc = gpio_request(LCD_22V_EN_2, "lcd_22v_en_2");
		if (rc) {
			pr_err("request gpio lcd_22v_en_2 failed, rc=%d\n", rc);
			return -ENODEV;
		}
		pr_info("[lcd] configure LCD_22V_EN_2\n");
		gpio_tlmm_config(GPIO_CFG(LCD_22V_EN_2,  0, GPIO_CFG_OUTPUT,
			GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);
	}
#endif
#endif

	if (system_rev == 0) {
		gpio43 = PM8921_GPIO_PM_TO_SYS(
						PMIC_GPIO_LCD_RST);

		rc = gpio_request(gpio43, "mlcd_rst");
		if (rc) {
			pr_err("request gpio mlcd_rst failed, rc=%d\n", rc);
			return -ENODEV;
		}

		rc = pm8xxx_gpio_config(gpio43, &gpio43_param);
		if (rc) {
			pr_err("gpio_config mlcd_rst failed (3), rc=%d\n", rc);
			return -EINVAL;
		}
	}
#if defined(CONFIG_MACH_JACTIVE_ATT)
	if (system_rev < 10)
		gpio27 = PM8921_GPIO_PM_TO_SYS(PMIC_GPIO_LED_DRIVER_REV00);
	else
		gpio27 = PM8921_GPIO_PM_TO_SYS(PMIC_GPIO_LED_DRIVER_REV10);
#else
	gpio27 = PM8921_GPIO_PM_TO_SYS(PMIC_GPIO_LED_DRIVER);
#endif
		

	rc = gpio_request(gpio27, "led_dirver");
	if (rc) {
		pr_err("request gpio led_dirver failed, rc=%d\n", rc);
		return -ENODEV;
	}

	rc = pm8xxx_gpio_config(gpio27, &gpio43_param);
	if (rc) {
		pr_err("gpio_config led_dirver failed (3), rc=%d\n", rc);
		return -EINVAL;
	}
#if !defined(CONFIG_MACH_JACTIVE_ATT) && !defined(CONFIG_MACH_JACTIVE_EUR)
#if defined(CONFIG_MACH_JACTIVE_ATT)
	if(system_rev < 10)
		gpio_direction_output(gpio33, 0);
	else
		gpio_direction_output(LCD_22V_EN, 0);	
#else
	gpio_direction_output(LCD_22V_EN, 0);
#endif
	if (system_rev == 0)
		gpio_direction_output(gpio43, 0);
	else
		pm8xxx_mpp_config(
			PM8921_MPP_PM_TO_SYS(MLCD_RST_MPP2),
			&MLCD_RESET_LOW_CONFIG);

	msleep(1000);
#endif
	gpio_direction_output(gpio27, 0);

	return rc;
}
static int mipi_dsi_panel_power(int on)
{
	static struct regulator *reg_lvs7, *reg_l2, *reg_l11, *reg_ext_3p3v;
	static int gpio36, gpio25, gpio26, mpp3;
	int rc;

	pr_debug("%s: on=%d\n", __func__, on);

	if (!dsi_power_on) {
		reg_lvs7 = regulator_get(&msm_mipi_dsi1_device.dev,
				"dsi1_vddio");
		if (IS_ERR_OR_NULL(reg_lvs7)) {
			pr_err("could not get 8921_lvs7, rc = %ld\n",
				PTR_ERR(reg_lvs7));
			return -ENODEV;
		}

		reg_l2 = regulator_get(&msm_mipi_dsi1_device.dev,
				"dsi1_pll_vdda");
		if (IS_ERR_OR_NULL(reg_l2)) {
			pr_err("could not get 8921_l2, rc = %ld\n",
				PTR_ERR(reg_l2));
			return -ENODEV;
		}

		rc = regulator_set_voltage(reg_l2, 1200000, 1200000);
		if (rc) {
			pr_err("set_voltage l2 failed, rc=%d\n", rc);
			return -EINVAL;
		}
		reg_l11 = regulator_get(&msm_mipi_dsi1_device.dev,
						"dsi1_avdd");
		if (IS_ERR(reg_l11)) {
				pr_err("could not get 8921_l11, rc = %ld\n",
						PTR_ERR(reg_l11));
				return -ENODEV;
		}
		rc = regulator_set_voltage(reg_l11, 3000000, 3000000);
		if (rc) {
				pr_err("set_voltage l11 failed, rc=%d\n", rc);
				return -EINVAL;
		}

		if (machine_is_apq8064_liquid()) {
			reg_ext_3p3v = regulator_get(&msm_mipi_dsi1_device.dev,
				"dsi1_vccs_3p3v");
			if (IS_ERR_OR_NULL(reg_ext_3p3v)) {
				pr_err("could not get reg_ext_3p3v, rc = %ld\n",
					PTR_ERR(reg_ext_3p3v));
				reg_ext_3p3v = NULL;
				return -ENODEV;
			}
			mpp3 = PM8921_MPP_PM_TO_SYS(3);
			rc = gpio_request(mpp3, "backlight_en");
			if (rc) {
				pr_err("request mpp3 failed, rc=%d\n", rc);
				return -ENODEV;
			}
		}

		gpio25 = PM8921_GPIO_PM_TO_SYS(25);
		rc = gpio_request(gpio25, "disp_rst_n");
		if (rc) {
			pr_err("request gpio 25 failed, rc=%d\n", rc);
			return -ENODEV;
		}

		gpio26 = PM8921_GPIO_PM_TO_SYS(26);
		rc = gpio_request(gpio26, "pwm_backlight_ctrl");
		if (rc) {
			pr_err("request gpio 26 failed, rc=%d\n", rc);
			return -ENODEV;
		}

		gpio36 = PM8921_GPIO_PM_TO_SYS(36); /* lcd1_pwr_en_n */
		rc = gpio_request(gpio36, "lcd1_pwr_en_n");
		if (rc) {
			pr_err("request gpio 36 failed, rc=%d\n", rc);
			return -ENODEV;
		}

		dsi_power_on = true;
	}

	if (on) {
		rc = regulator_enable(reg_lvs7);
		if (rc) {
			pr_err("enable lvs7 failed, rc=%d\n", rc);
			return -ENODEV;
		}

		rc = regulator_set_optimum_mode(reg_l11, 110000);
		if (rc < 0) {
			pr_err("set_optimum_mode l11 failed, rc=%d\n", rc);
			return -EINVAL;
		}
		rc = regulator_enable(reg_l11);
		if (rc) {
			pr_err("enable l11 failed, rc=%d\n", rc);
			return -ENODEV;
		}

		rc = regulator_set_optimum_mode(reg_l2, 100000);
		if (rc < 0) {
			pr_err("set_optimum_mode l2 failed, rc=%d\n", rc);
			return -EINVAL;
		}
		rc = regulator_enable(reg_l2);
		if (rc) {
			pr_err("enable l2 failed, rc=%d\n", rc);
			return -ENODEV;
		}

		if (machine_is_apq8064_liquid()) {
			rc = regulator_enable(reg_ext_3p3v);
			if (rc) {
				pr_err("enable reg_ext_3p3v failed, rc=%d\n",
					rc);
				return -ENODEV;
			}
			gpio_set_value_cansleep(mpp3, 1);
		}

		gpio_set_value_cansleep(gpio36, 0);
		gpio_set_value_cansleep(gpio25, 1);
		if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917)
			gpio_set_value_cansleep(gpio26, 1);
	} else {
		if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917)
			gpio_set_value_cansleep(gpio26, 0);
		gpio_set_value_cansleep(gpio25, 0);
		gpio_set_value_cansleep(gpio36, 1);

		if (machine_is_apq8064_liquid()) {
			gpio_set_value_cansleep(mpp3, 0);

			rc = regulator_disable(reg_ext_3p3v);
			if (rc) {
				pr_err("disable reg_ext_3p3v failed, rc=%d\n",
					rc);
				return -ENODEV;
			}
		}

		rc = regulator_disable(reg_l11);
		if (rc) {
			pr_err("disable reg_l1 failed, rc=%d\n", rc);
			return -ENODEV;
		}

		rc = regulator_disable(reg_lvs7);
		if (rc) {
			pr_err("disable reg_lvs7 failed, rc=%d\n", rc);
			return -ENODEV;
		}

		rc = regulator_disable(reg_l2);
		if (rc) {
			pr_err("disable reg_l2 failed, rc=%d\n", rc);
			return -ENODEV;
		}
	}

	return 0;
}
	.id = -1,
};

static struct persistent_ram_descriptor ram_console_pram_desc[] = {
	{
		.name = "ram_console",
		.size = MSM_RAM_CONSOLE_SIZE,
	}
};

struct persistent_ram mmi_ram_console_pram = {
	.start = MSM_RAM_CONSOLE_START,
	.size = MSM_RAM_CONSOLE_SIZE,
	.num_descs = ARRAY_SIZE(ram_console_pram_desc),
	.descs = ram_console_pram_desc,
};

#endif

struct platform_device mmi_device_ext_5v_vreg __devinitdata = {
	.name	= GPIO_REGULATOR_DEV_NAME,
	.id	= PM8921_MPP_PM_TO_SYS(7),
	.dev	= {
		.platform_data = &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_5V],
	},
};

struct platform_device mmi_alsa_to_h2w_hs_device = {
	.name	= "alsa-to-h2w",
};
			.num_consumer_supplies	= \
					ARRAY_SIZE(vreg_consumers_##_id##_PC), \
			.consumer_supplies	= vreg_consumers_##_id##_PC, \
			.supply_regulator	= _supply_regulator, \
		}, \
		.id	  = RPM_VREG_ID_PM8921_##_id##_PC, \
		.pin_fn	  = RPM_VREG_PIN_FN_8960_##_pin_fn, \
		.pin_ctrl = _pin_ctrl, \
	}

/* GPIO regulator constraints */
struct gpio_regulator_platform_data
monarudo_gpio_regulator_pdata[] __devinitdata = {
	/*        ID      vreg_name gpio_label   gpio                  supply */
	GPIO_VREG(EXT_5V, "ext_5v", "ext_5v_en",
			PM8921_MPP_PM_TO_SYS(7), NULL),
	GPIO_VREG(EXT_3P3V, "ext_3p3v", "ext_3p3v_en",
			monarudo_EXT_3P3V_REG_EN_GPIO, NULL),
	//GPIO_VREG(EXT_TS_SW, "ext_ts_sw", "ext_ts_sw_en",
	//		PM8921_GPIO_PM_TO_SYS(23), "ext_3p3v"),
	GPIO_VREG(EXT_MPP8, "ext_mpp8", "ext_mpp8_en",
			PM8921_MPP_PM_TO_SYS(8), NULL),
};

/* SAW regulator constraints */
struct regulator_init_data monarudo_saw_regulator_pdata_8921_s5 =
	/*	      ID  vreg_name	       min_uV   max_uV */
#ifdef CONFIG_CPU_OVERCLOCK
	SAW_VREG_INIT(S5, "8921_s5",	       850000, 1450000);
#else
	SAW_VREG_INIT(S5, "8921_s5",	       850000, 1300000);
static void cam_ldo_power_off(int mode)
{
	int ret = 0;
	int temp = 0;

	printk(KERN_DEBUG "[%s : %d] %s CAMERA POWER OFF!!\n",
	       __func__, __LINE__, mode ? "FRONT" : "REAR");

	if (mode) {		/* front camera */
		/* VT_RESET */
#if defined(CONFIG_MACH_M2_DCM) || defined(CONFIG_MACH_K2_KDI)
		gpio_set_value_cansleep(gpio_rev(CAM2_RST_N), 0);
		usleep(1*1000);
#else
		gpio_set_value_cansleep(CAM2_RST_N, 0);
		usleep(1*1000);
#endif
		/* ISP 8M MIPI 1.2V */
	  /* delete for unnecessary power */


		/* ISP 8M HOST 1.8V */
		if (l29) {
			ret = regulator_disable(l29);
			if (ret)
				cam_err("error disabling regulator\n");
		}
		usleep(1*1000);

		/* MCLK 24MHz*/

		/* 8M AVDD 2.8V */
		gpio_set_value_cansleep(GPIO_CAM_A_EN, 0);
		usleep(1*1000);
		/* ISP CORE 1.2V */
	  /* delete for unnecessary power */
	} else {		/* rear camera */
		/* ISP_STANDBY */
		gpio_set_value_cansleep(PM8921_GPIO_PM_TO_SYS(24), 0);
		usleep(1*1000);

		/* ISP_RESET */
		gpio_set_value_cansleep(ISP_RESET, 0);
		usleep(1*1000);

		/* AF 2.8V */
		gpio_set_value_cansleep(gpio_rev(CAM_AF_EN), 0);
		usleep(1*1000);

		/* ISP 8M MIPI 1.2V */
		gpio_set_value_cansleep(CAM_MIPI_EN, 0);
		usleep(1*1000);

		/* ISP 8M HOST 1.8V */
		if (l29) {
			ret = regulator_disable(l29);
			if (ret)
				cam_err("error disabling regulator\n");
		}
		usleep(1*1000);

		/* 8M DVDD 1.2V */
		gpio_set_value_cansleep(GPIO_CAM_SENSOR_EN, 0);
		usleep(1*1000);

		/* 8M AVDD 2.8V */
		gpio_set_value_cansleep(GPIO_CAM_A_EN, 0);
		usleep(1*1000);

		/* ISP CORE 1.2V */
#if defined(CONFIG_MACH_M2)
		if (system_rev >= BOARD_REV08)
			ret = regulator_disable(isp_core);
		if (ret)
			cam_err("error disabling regulator");
		regulator_put(isp_core);
#elif defined(CONFIG_MACH_M2_DCM) || defined(CONFIG_MACH_K2_KDI)
		gpio_set_value_cansleep(gpio_rev(CAM_CORE_EN), 0);
#else
		gpio_set_value_cansleep(CAM_CORE_EN, 0);
#endif
		usleep(1*1000);

		/* flash power 1.8V */
		if (l28) {
			ret = regulator_disable(l28);
			if (ret)
				cam_err("error disabling regulator\n");
		}
		usleep(1*1000);

		/* GPIO_CAM_FLASH_SW : tourch */
		temp = gpio_get_value(GPIO_MSM_FLASH_NOW);

		if (isFlashCntlEn == 0 && temp == 0) {
			/* GPIO_CAM_FLASH_SW : tourch */
			gpio_set_value_cansleep(gpio_cam_flash_sw, 0);
			temp = gpio_get_value(gpio_cam_flash_sw);
			printk(KERN_DEBUG "[s5c73m3] check"
				" GPIO_CAM_FLASH_SW : %d\n", temp);
			/* FLASH_LED_LOCK*/
			gpio_set_value_cansleep(PM8921_MPP_PM_TO_SYS
				(PMIC_MPP_FLASH_LED_UNLOCK), 0);
			usleep(1*1000);
		}
	}
}
static void cam_ldo_power_on(int mode, int num)
{
	int ret = 0;
	int temp = 0;

	printk(KERN_DEBUG "[%s : %d] %s CAMERA POWER ON!!\n",
	       __func__, __LINE__, mode ? "FRONT" : "REAR");

	if (mode) {		/* front camera */
		if (num == 0) {
			/* ISP CORE 1.2V */
			/* delete for unnecessary power */
			/* 8M AVDD 2.8V */
			gpio_set_value_cansleep(GPIO_CAM_A_EN, 1);
			temp = gpio_get_value(GPIO_CAM_A_EN);
			printk(KERN_DEBUG "[s5k6a3yx] check GPIO_CAM_A_EN : %d\n",
				temp);
			usleep(1*1000);
		}	else	{
			/* VT_RESET */
		#if defined(CONFIG_MACH_M2_DCM) || defined(CONFIG_MACH_K2_KDI)
			gpio_set_value_cansleep(gpio_rev(CAM2_RST_N), 1);
			temp = gpio_get_value(gpio_rev(CAM2_RST_N));
		#else
			gpio_set_value_cansleep(CAM2_RST_N, 1);
			temp = gpio_get_value(CAM2_RST_N);
		#endif
			printk(KERN_DEBUG "[s5k6a3yx] check CAM2_RST_N : %d\n",
				temp);
			usleep(1*1000);

			/* ISP 8M HOST 1.8V */
			l29 = regulator_get(NULL, "8921_lvs5");
			ret = regulator_enable(l29);
			if (ret)
				cam_err("error enabling regulator\n");
			usleep(1*1000);

			/* ISP 8M MIPI 1.2V */
			/* delete for unnecessary power */
		}
	} else {		/* rear camera */
		if (num == 0) {
			printk(KERN_DEBUG "[s5c73m3] rear camera on 1\n");

			temp = gpio_get_value(GPIO_MSM_FLASH_NOW);

			if (isFlashCntlEn == 0 && temp == 0) {
				/* FLASH_LED_UNLOCK*/
				gpio_set_value_cansleep(PM8921_MPP_PM_TO_SYS
					(PMIC_MPP_FLASH_LED_UNLOCK), 1);
				/* GPIO_CAM_FLASH_SW : tourch */
				gpio_set_value_cansleep(gpio_cam_flash_sw, 1);
				temp = gpio_get_value(gpio_cam_flash_sw);
				printk(KERN_DEBUG "[s5c73m3] check"
					" GPIO_CAM_FLASH_SW : %d\n", temp);
				usleep(1*1000);
			}

			/* flash power 1.8V */
			l28 = regulator_get(NULL, "8921_lvs4");
			ret = regulator_enable(l28);
			if (ret)
				cam_err("error enabling regulator\n");
			usleep(1*1000);

			/* ISP CORE 1.2V */
#if defined(CONFIG_MACH_M2)
			if (system_rev >= BOARD_REV08) {
				printk(KERN_DEBUG "[s5c73m3] m2 check vddCore : %d\n",
					vddCore);

				isp_core = regulator_get(NULL, "cam_isp_core");
				ret = regulator_set_voltage(isp_core,
					vddCore, vddCore);
				if (ret)
					cam_err("error setting voltage\n");

				ret = regulator_enable(isp_core);
				if (ret)
					cam_err("error enabling regulator.");
			} else
				gpio_set_value_cansleep(CAM_CORE_EN, 1);
#elif defined(CONFIG_MACH_M2_DCM) || defined(CONFIG_MACH_K2_KDI)
			gpio_set_value_cansleep(gpio_rev(CAM_CORE_EN), 1);
#else
			gpio_set_value_cansleep(CAM_CORE_EN, 1);
#endif
			usleep(1200);

			/* 8M AVDD 2.8V */
			gpio_set_value_cansleep(GPIO_CAM_A_EN, 1);
			temp = gpio_get_value(GPIO_CAM_A_EN);
			printk(KERN_DEBUG "[s5c73m3] check GPIO_CAM_A_EN : %d\n",
				temp);
			usleep(1*1000);

			/* 8M DVDD 1.2V */
			gpio_set_value_cansleep(GPIO_CAM_SENSOR_EN, 1);
			temp = gpio_get_value(GPIO_CAM_SENSOR_EN);
			printk(KERN_DEBUG "[s5c73m3] check GPIO_CAM_SENSOR_EN : %d\n",
			       temp);
			usleep(1*1000);
		} else {
			printk(KERN_DEBUG "[s5c73m3] rear camera on 2\n");
			/* AF 2.8V */
			gpio_set_value_cansleep(gpio_rev(CAM_AF_EN), 1);
			temp = gpio_get_value(gpio_rev(CAM_AF_EN));
			printk(KERN_DEBUG "[s5c73m3] check CAM_AF_EN : %d\n",
			       temp);
			usleep(3*1000);

			/* ISP 8M HOST 1.8V */
			l29 = regulator_get(NULL, "8921_lvs5");
			ret = regulator_enable(l29);
			if (ret)
				cam_err("error enabling regulator\n");

			/* ISP 8M MIPI 1.2V */
			gpio_set_value_cansleep(CAM_MIPI_EN, 1);
			temp = gpio_get_value(CAM_MIPI_EN);
			printk(KERN_DEBUG "[s5c73m3] check CAM_MIPI_EN : %d\n",
				temp);
			usleep(1*1000);

			/* ISP_STANDBY */
			gpio_set_value_cansleep(PM8921_GPIO_PM_TO_SYS(24), 1);
			usleep(1*1000);

			/* ISP_RESET */
			gpio_set_value_cansleep(ISP_RESET, 1);
			temp = gpio_get_value(ISP_RESET);
			printk(KERN_DEBUG "[s5c73m3] check ISP_RESET : %d\n",
				temp);
			usleep(1*1000);
		}
	}

}
				.always_on	= _always_on, \
			}, \
			.num_consumer_supplies	= \
					ARRAY_SIZE(vreg_consumers_##_id##_PC), \
			.consumer_supplies	= vreg_consumers_##_id##_PC, \
			.supply_regulator	= _supply_regulator, \
		}, \
		.id	  = RPM_VREG_ID_PM8921_##_id##_PC, \
		.pin_fn	  = RPM_VREG_PIN_FN_8960_##_pin_fn, \
		.pin_ctrl = _pin_ctrl, \
	}

/* GPIO regulator constraints */
struct gpio_regulator_platform_data msm_gpio_regulator_pdata[] __devinitdata = {
	/*        ID      vreg_name gpio_label   gpio                  supply */
	GPIO_VREG(EXT_5V, "ext_5v", "ext_5v_en", PM8921_MPP_PM_TO_SYS(7), NULL),
	GPIO_VREG(EXT_L2, "ext_l2", "ext_l2_en", 91, NULL),
	GPIO_VREG(EXT_3P3V, "ext_3p3v", "ext_3p3v_en",
		PM8921_GPIO_PM_TO_SYS(17), NULL),
	GPIO_VREG(EXT_OTG_SW, "ext_otg_sw", "ext_otg_sw_en",
		PM8921_GPIO_PM_TO_SYS(42), "8921_usb_otg"),
};

/* SAW regulator constraints */
struct regulator_init_data msm_saw_regulator_pdata_s5 =
	/*	      ID  vreg_name	       min_uV   max_uV */
	SAW_VREG_INIT(S5, "8921_s5",	       850000, 1300000);
struct regulator_init_data msm_saw_regulator_pdata_s6 =
	SAW_VREG_INIT(S6, "8921_s6",	       850000, 1300000);

/* PM8921 regulator constraints */
Example #23
0
static long ncdiagd_power_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
    int ret = 0;
    void __user *pArg = (void __user *)arg;
    printk(KERN_INFO "[%s] cmd:%d",__func__, cmd);

    switch(cmd)
    {































































































































































        


        
        case IOCTL_PW_RG_LP_CTL:
            {
                unsigned char enable;
                unsigned char vreg_id;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                enable  = buf.req_buf[0];
                vreg_id = buf.req_buf[1];

                printk(KERN_INFO "DIAG_PW_RG_LP_CTL enable:%x vreg_id:%x", enable, vreg_id);
                ret = nc_pm8xxx_lp_mode_control(PM8XXX_VERSION_8921, vreg_id, enable);  
            }
            break;
        
        case IOCTL_PW_RG_CTL:
            {
                unsigned char enable;
                unsigned char vreg_id;
                unsigned int min_volt, max_volt;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                enable  = buf.req_buf[0];
                vreg_id = buf.req_buf[1];
                min_volt  = cvt_val(buf.req_buf[3]);
                min_volt += cvt_val(buf.req_buf[2]) * 100;
                min_volt *= 1000; 
                max_volt  = cvt_val(buf.req_buf[5]);
                max_volt += cvt_val(buf.req_buf[4]) * 100;
                max_volt *= 1000; 
                
                printk(KERN_INFO "DIAG_PW_RG_CTL enable  :%x vreg_id :%x", enable, vreg_id);
                printk(KERN_INFO "               min_volt:%x max_volt:%x", min_volt, max_volt);
                ret = nc_pm8xxx_vreg_control(PM8XXX_VERSION_8921, enable, vreg_id, min_volt, max_volt);  
            }
            break;
        
        case IOCTL_PW_RG_SET_LVL:
            {
                unsigned char  vreg_id;
                unsigned int min_volt, max_volt;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                vreg_id   = buf.req_buf[0];
                min_volt  = cvt_val(buf.req_buf[2]);
                min_volt += cvt_val(buf.req_buf[1]) * 100;
                min_volt *= 1000; 
                max_volt  = cvt_val(buf.req_buf[4]);
                max_volt += cvt_val(buf.req_buf[3]) * 100;
                max_volt *= 1000; 
                
                printk(KERN_INFO "DIAG_PW_RG_SET_LVL vreg_id:%x min_volt:%d max_volt:%d", vreg_id, min_volt, max_volt);
                ret = nc_pm8xxx_vreg_set_level(PM8XXX_VERSION_8921, vreg_id, min_volt, max_volt);  
            }
            break;





































































































































        
        case IOCTL_PW_VT_PLDWN_SW:
            {
                unsigned char enable;
                unsigned char vreg_id;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                enable  = buf.req_buf[0];
                vreg_id = buf.req_buf[1];
                
                printk(KERN_INFO "DIAG_PW_RG_SMPS_PSK enable:%x vreg_id:%x", enable, vreg_id);
                ret = nc_pm8xxx_vreg_pull_down_switch(PM8XXX_VERSION_8921, vreg_id, enable);  
            }
            break;

        





















































































































































        
        case IOCTL_PW_CHG_COIN_SW:
            {
                struct pm8xxx_coincell_chg param;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                param.state = buf.req_buf[0];
                param.voltage = PM8XXX_COINCELL_VOLTAGE_3p2V;
                param.resistor = PM8XXX_COINCELL_RESISTOR_800_OHMS;
                
                ret = pm8xxx_coincell_chg_config(&param);
                printk(KERN_INFO "DIAG_PW_CHG_COIN_SW enable:%x", param.state);
            }
            break;































































































        
        case IOCTL_PW_CHG_BAT_EBL:
            {
                bool enable;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }
                enable = (buf.req_buf[0]&0x01);
                
                ret = nc_pm8921_charger_enable(enable);
                printk(KERN_INFO "DIAG_PW_CHG_BAT_EBL enable:%x", enable);
            }
            break;
























        case IOCTL_PW_CHG_DSBL:
            {
                unsigned char enable;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                enable = buf.req_buf[0];
                
                enable = enable ? 0x00 : 0x01;
                ret = pm8921_disable_source_current(enable);  
                printk(KERN_INFO "DIAG_PW_CHG_DSBL enable:%x", enable);
            }
            break;



        
        case IOCTL_PW_CHG_WCG_GET_STATE:
            {
                unsigned int  rt_id = 0x00;
                unsigned int  rt_status = 0x00;
                ioctl_pw_value_type buf;

                rt_id = PM8921_IRQ_BASE + PM8921_CABLE_IRQ;
                ret = nc_pm8921_get_rt_status(rt_id, &rt_status);
                
                if (ret != 0) {
                    printk(KERN_ERR "nc_pm8921_get_rt_status failed \n");
                    return PM_ERR_FLAG__SBI_OPT_ERR;
                }
                
                
                buf.rsp_buf[0] = (u8)rt_status;  

                if(copy_to_user((void *)pArg, &buf, sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_to_user failed");
                    return PM_ERR_FLAG__SBI_OPT_ERR; 
                }

                printk(KERN_INFO "IOCTL_PW_CHG_WCG_GET_STATE rt_id:%x rt_status:%x", rt_id, rt_status);
            }
            break;
        
        case IOCTL_PW_CHG_WCG_SW:
            {
                ioctl_pw_value_type buf;
                struct pm_gpio param;
                int gpio_port;
                unsigned char enable = 0x00;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__SBI_OPT_ERR; 
                }

                gpio_port             = PM8921_GPIO_PM_TO_SYS(PM_DIAG_GPIO_32);  
                param.direction       = PM_GPIO_DIR_OUT;
                param.output_buffer   = PM_GPIO_OUT_BUF_CMOS;
                param.output_value    = 0;
                param.pull            = PM_GPIO_PULL_NO;
                param.vin_sel         = PM_GPIO_VIN_S4;
                param.out_strength    = PM_GPIO_STRENGTH_LOW;
                param.function        = PM_GPIO_FUNC_NORMAL;
                param.inv_int_pol     = 0;
                param.disable_pin     = 0;

                enable = buf.req_buf[0];
                
                param.output_value = enable ? 0 : 1;
                
                ret = pm8xxx_gpio_config(gpio_port, &param);
		
		if (ret != 0) {
                    printk(KERN_ERR "pm8xxx_gpio_config failed");
                    return PM_ERR_FLAG__SBI_OPT_ERR;
		}
		
                printk(KERN_INFO "IOCTL_PW_CHG_WCG_SW enable:%x param.output_value:%x ", enable, param.output_value);
            }
            break;














































































































































































































        
        case IOCTL_PW_CHG_VMAX_SET:
            {
                unsigned short voltage;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                voltage  = buf.req_buf[1];
                voltage += buf.req_buf[0] * 0x100;

                ret = nc_pm8921_chg_vmaxsel_set(voltage);
                printk(KERN_INFO "DIAG_PW_CHG_VMAX_SET voltage:%x", voltage);
            }
            break;


        
        case IOCTL_PW_CHG_IMAX_SET:
            {
                unsigned short cur_val;
                ioctl_pw_value_type buf;
                
                
                int ibat = 0;
                unsigned int iusb = 0;
                const int ibat_min = 325;
                const int ibat_max = 2000;
                

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                cur_val  = buf.req_buf[1];
                cur_val += buf.req_buf[0] * 0x100;
                
                
                if (cur_val < ibat_min) {
                    ibat = ibat_min;
                } else if (cur_val > ibat_max) {
                    ibat = ibat_max;
                } else {
                    ibat = (int)cur_val;
                }
                
                iusb = (unsigned int)(cur_val | PM8921_DIAG_IUSB_SET);
                
                pm8921_set_max_battery_charge_current(ibat);
                pm8921_charger_vbus_draw(iusb);
                
                printk(KERN_INFO "DIAG_PW_CHG_IMAX_SET cur_val:0x%04x", cur_val);
                
            }
            break;


































































































        
        case IOCTL_PW_CHG_STATE_GET:
            {
                unsigned char chg_state = 0x00;
                ioctl_pw_value_type buf;
                
                ret = nc_pm8921_get_fsm_status((u64 *)&chg_state);
                
                buf.rsp_buf[0] = chg_state;
                
                if(copy_to_user((void *)pArg, &buf, sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_to_user failed");
                    return PM_ERR_FLAG__INVALID;
                }
                
                printk(KERN_INFO "DIAG_PW_CHG_STATE_GET chg_state:%x", chg_state);
            }
            break;
























        
        case IOCTL_PW_CHG_USB_DSBL:
            {
                unsigned char enable;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                enable = buf.req_buf[0];

                enable = enable ? 0x00 : 0x01;
                ret = nc_pm8921_chg_usb_suspend_enable(enable);

                printk(KERN_INFO "DIAG_PW_CHG_USB_DSBL enable:%x", enable);
            }
            break;














































































































































































































































        
        case IOCTL_PW_ADC_RD_CHANNEL:
            {
                unsigned char analog_chnl, mpp_chnl;
                struct pm8xxx_adc_chan_result result;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }
                
                analog_chnl = buf.req_buf[0];
                
                 
                if (analog_chnl == CHANNEL_BATT_THERM) {
                    analog_chnl = CHANNEL_BATT_THERM_UV;
                    ret = pm8xxx_adc_read(analog_chnl, &result);
                } else if ((analog_chnl <  PM8XXX_CHANNEL_MPP_SCALE1_IDX) ||
                           (analog_chnl == ADC_MPP_1_AMUX8 )              ||
                           (analog_chnl == ADC_MPP_1_AMUX3 )              ||
                           (analog_chnl == ADC_MPP_1_AMUX3_UV))
                {
                    ret = pm8xxx_adc_read(analog_chnl, &result);
                } else if ((analog_chnl >= PM8XXX_CHANNEL_MPP_SCALE1_IDX) && 
                           (analog_chnl <= ADC_MPP_1_ATEST_7       ) )
                {
                    mpp_chnl = analog_chnl - PM8XXX_CHANNEL_MPP_SCALE1_IDX;
                    ret = pm8xxx_adc_mpp_config_read(mpp_chnl, CHANNEL_MPP_1, &result);

                } else if ((analog_chnl >= PM8XXX_CHANNEL_MPP_SCALE3_IDX) && 
                           (analog_chnl <= ADC_MPP_2_ATEST_7       ) )
                {
                    mpp_chnl = analog_chnl - PM8XXX_CHANNEL_MPP_SCALE3_IDX;
                    ret = pm8xxx_adc_mpp_config_read(mpp_chnl, CHANNEL_MPP_2, &result);
                    
                } else 
                {
                    printk(KERN_ERR "ADC_channel failed");
                    return PM_ERR_FLAG__FEATURE_NOT_SUPPORTED;
                }
                 
                
                if(ret == PM_ERR_FLAG__SUCCESS)
                {
 
                    if ((analog_chnl != CHANNEL_BATT_THERM) &&             
                        (analog_chnl != ADC_MPP_1_AMUX8   ) &&             
                        (analog_chnl != CHANNEL_MUXOFF    ) &&             
                        (analog_chnl != ADC_MPP_1_AMUX3   ))               
                    {
                        if (result.physical != 0)
                        {
                            result.physical = div_u64(result.physical, 1000);
                        }
                        
                        if (result.physical >= 0xFFFF)
                        {
                            result.physical = 0xFFFF;
                        }
                    }
 
                    buf.rsp_buf[0] = (result.physical >> 8) & 0xff;
                    buf.rsp_buf[1] = result.physical & 0xff;
                }

                if(copy_to_user((void *)pArg, &buf, sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_to_user failed");
                    return PM_ERR_FLAG__INVALID;
                }
                
                printk(KERN_INFO "DIAG_PW_ADC_RD_CHANNEL analog_chnl :%x", analog_chnl);
                printk(KERN_INFO "                       adc_read_val[0]:%x", (int)((result.physical >> 8) & 0xff));
                printk(KERN_INFO "                       adc_read_val[1]:%x", (int)(result.physical & 0xff));
            }
            break;







































































































































































        


        
        case IOCTL_PW_SP_SMPLD_SW:
            {
                unsigned char enable;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                enable = buf.req_buf[0];

                ret = pm8xxx_smpl_control(enable);  
                printk(KERN_INFO "DIAG_PW_SP_SMPLD_SW enable:%x", enable);
            }
            break;
        
        case IOCTL_PW_SP_SMPLD_TM_SET:
            {
                unsigned char timer_set;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                timer_set = buf.req_buf[0];
                
                ret = pm8xxx_smpl_set_delay(timer_set);  
                printk(KERN_INFO "DIAG_PW_SP_SMPLD_TM_SET timer_set:%x", timer_set);
            }
            break;

        


        
        case IOCTL_PW_MPP_CNFDG_IPUT:
            {
                unsigned char mpp_port;
                unsigned char logi_level;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                mpp_port   = buf.req_buf[0];
                logi_level = buf.req_buf[1];
                
                ret = nc_pm8xxx_mpp_config_digital_in(PM8921_MPP_PM_TO_SYS(mpp_port), logi_level, PM8XXX_MPP_DIN_TO_INT);  
                printk(KERN_INFO "DIAG_PW_MPP_CNFDG_IPUT mpp_port:%x logi_level:%x", mpp_port +1, logi_level);
            }
            break;
        
        case IOCTL_PW_MPP_CNFDG_OPUT:
            {
                unsigned char mpp_port;
                unsigned char logi_level;
                unsigned char out_ctl;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                mpp_port   = buf.req_buf[0];
                logi_level = buf.req_buf[1];
                out_ctl    = buf.req_buf[2];
                
                ret = nc_pm8xxx_mpp_config_digital_out(PM8921_MPP_PM_TO_SYS(mpp_port), logi_level, out_ctl);  
                printk(KERN_INFO "DIAG_PW_MPP_CNFDG_OPUT mpp_port:%x logi_level:%x out_ctl:%x", mpp_port +1, logi_level, out_ctl);
            }
            break;
        
        case IOCTL_PW_MPP_CNFDG_IOPUT:
            {
                unsigned char mpp_port;
                unsigned char logi_level;
                unsigned char pull_set;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                mpp_port   = buf.req_buf[0];
                logi_level = buf.req_buf[1];
                pull_set   = buf.req_buf[2];
                
                ret = nc_pm8xxx_mpp_config_bi_dir(PM8921_MPP_PM_TO_SYS(mpp_port), logi_level, pull_set);  
                printk(KERN_INFO "DIAG_PW_MPP_CNFDG_IOPUT mpp_port:%x logi_level:%x pull_set:%x", mpp_port +1, logi_level, pull_set);
            }
            break;
        
        case IOCTL_PW_MPP_CNFAN_IPUT:
            {
                unsigned char mpp_port;
                unsigned char ain_chn;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                mpp_port = buf.req_buf[0];
                ain_chn  = buf.req_buf[1];
                
                ret = nc_pm8xxx_mpp_config_analog_input(PM8921_MPP_PM_TO_SYS(mpp_port), ain_chn, PM8XXX_MPP_AOUT_CTRL_DISABLE);  
                printk(KERN_INFO "DIAG_PW_MPP_CNFAN_IPUT mpp_port:%x ain_chn:%x", mpp_port + 1, ain_chn);
            }
            break;
        
        case IOCTL_PW_MPP_CNFAN_OPUT:
            {
                unsigned char mpp_port;
                unsigned char aout_level;
                unsigned char pm_onoff;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                mpp_port   = buf.req_buf[0];
                aout_level = buf.req_buf[1];
                pm_onoff   = buf.req_buf[2];
                
                ret = nc_pm8xxx_mpp_config_analog_output(PM8921_MPP_PM_TO_SYS(mpp_port), aout_level, pm_onoff);  
                printk(KERN_INFO "DIAG_PW_MPP_CNFAN_OPUT mpp_port:%x aout_level:%x pm_onoff:%x", mpp_port +1 , aout_level, pm_onoff);
            }
            break;
        
        case IOCTL_PW_MPP_CNF_I_SINK:
            {
                unsigned char mpp_port;
                unsigned char sink_level;
                unsigned char pm_onoff;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                mpp_port   = buf.req_buf[0];
                sink_level = buf.req_buf[1];
                pm_onoff   = buf.req_buf[2];
                
                ret = nc_pm8xxx_mpp_config_current_sink(PM8921_MPP_PM_TO_SYS(mpp_port), sink_level, pm_onoff);  
                printk(KERN_INFO "DIAG_PW_MPP_CNF_I_SINK mpp_port:%x sink_level:%x pm_onoff:%x", mpp_port + 1, sink_level, pm_onoff);
            }
            break;
























































































































        


        
        case IOCTL_PW_GPIO_CONFIG_SET:
            {
                ioctl_pw_value_type buf;
                struct pm_gpio param ;
                int gpio_port;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                gpio_port             = PM8921_GPIO_PM_TO_SYS(buf.req_buf[0]);
                param.direction       = buf.req_buf[1];
                param.output_buffer   = buf.req_buf[2];
                param.output_value    = buf.req_buf[3];
                param.pull            = buf.req_buf[4];
                param.vin_sel         = buf.req_buf[5];
                param.out_strength    = buf.req_buf[6];
                param.function        = buf.req_buf[7];
                param.inv_int_pol     = buf.req_buf[8];
                param.disable_pin     = buf.req_buf[9];
                
                ret = pm8xxx_gpio_config(gpio_port, &param);
                
                printk(KERN_INFO "IOCTL_PW_GPIO_CONFIG_SET gpio_port   :%x direction:%x output_buffer:%x", gpio_port, param.direction, param.output_buffer);
                printk(KERN_INFO "                         output_value:%x pull     :%x vin_sel      :%x", param.output_value, param.pull, param.vin_sel);
                printk(KERN_INFO "                         out_strength:%x function :%x inv_int_pol  :%x", param.out_strength, param.function, param.inv_int_pol);
                printk(KERN_INFO "                         pin_disable :%x                              ", param.disable_pin);
            }
            break;


        
        case IOCTL_PW_GPIO_GET_STATE:
            {
                unsigned int gpio_id = 0x00;
                unsigned int gpio_state = 0x00;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }
                
                gpio_id = (unsigned int)buf.req_buf[0];
                ret = nc_pm8921_gpio_get_state(gpio_id, &gpio_state);
                
                buf.rsp_buf[0] = (u8)gpio_state;
                
                if(copy_to_user((void *)pArg, &buf, sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_to_user failed");
                    return PM_ERR_FLAG__INVALID;
                }
                
                printk(KERN_INFO "DIAG_PW_GPIO_GET_STATE GPIO :%d value :%d", gpio_id+1, gpio_state);
            }
            break;



























































































































































































































        
        case IOCTL_PW_PCT_OTP_STAGE_GET:
            {
                unsigned char itemp_stage = 0x00;
                ioctl_pw_value_type buf;
                
                ret = nc_pm8921_itemp_get_stage(&itemp_stage);  

                buf.rsp_buf[0] = itemp_stage;
                
                if(copy_to_user((void *)pArg, &buf, sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_to_user failed");
                    return PM_ERR_FLAG__INVALID;
                }
                
                printk(KERN_INFO "DIAG_PW_PCT_OTP_STAGE_GET itemp_stage:%x", itemp_stage);
            }
            break;
        
        case IOCTL_PW_PCT_OTP_STG_OVD:
            {
                unsigned char enable;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                enable = buf.req_buf[0];
                
                ret = nc_pm8921_itemp_stage_override(enable);  

                printk(KERN_INFO "DIAG_PW_PCT_OTP_STG_OVD enable:%x", enable);
            }
            break;

        


        
        case IOCTL_PW_IR_RT_STATUS_GET:
            {
                
                unsigned int  rt_id = 0x00;
                unsigned int  rt_status = 0x00;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                
                rt_id = (unsigned int)buf.req_buf[0];
                rt_id += PM8921_IRQ_BASE;
                nc_pm8921_get_rt_status(rt_id, &rt_status);
                
                
                buf.rsp_buf[0] = (u8)rt_status;

                if(copy_to_user((void *)pArg, &buf, sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_to_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                printk(KERN_INFO "DIAG_PW_IR_RT_STATUS_GET rt_id:%x rt_status:%x", rt_id, rt_status);
                
            }
            break;










































































        


        
        case IOCTL_PW8821_RG_LP_CTL:
            {
                unsigned char enable;
                unsigned char vreg_id;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                enable  = buf.req_buf[0];
                vreg_id = buf.req_buf[1];

                printk(KERN_INFO "DIAG_PW8821_RG_LP_CTL enable:%x vreg_id:%x", enable, vreg_id);
                ret = nc_pm8xxx_lp_mode_control(PM8XXX_VERSION_8821, vreg_id, enable);
            }
            break;
        
        case IOCTL_PW8821_RG_CTL:
            {
                unsigned char enable;
                unsigned char vreg_id;
                unsigned int min_volt, max_volt;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                enable  = buf.req_buf[0];
                vreg_id = buf.req_buf[1];
                min_volt  = cvt_val(buf.req_buf[3]);
                min_volt += cvt_val(buf.req_buf[2]) * 100;
                min_volt *= 1000; 
                max_volt  = cvt_val(buf.req_buf[5]);
                max_volt += cvt_val(buf.req_buf[4]) * 100;
                max_volt *= 1000; 

                printk(KERN_INFO "DIAG_PW8821_RG_CTL enable  :%x vreg_id :%x", enable, vreg_id);
                printk(KERN_INFO "               min_volt:%x max_volt:%x", min_volt, max_volt);
                ret = nc_pm8xxx_vreg_control(PM8XXX_VERSION_8821, enable, vreg_id, min_volt, max_volt);
            }
            break;
        
        case IOCTL_PW8821_RG_SET_LVL:
            {
                unsigned char  vreg_id;
                unsigned int min_volt, max_volt;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                vreg_id   = buf.req_buf[0];
                min_volt  = cvt_val(buf.req_buf[2]);
                min_volt += cvt_val(buf.req_buf[1]) * 100;
                min_volt *= 1000; 
                max_volt  = cvt_val(buf.req_buf[4]);
                max_volt += cvt_val(buf.req_buf[3]) * 100;
                max_volt *= 1000; 

                printk(KERN_INFO "DIAG_PW8821_RG_SET_LVL vreg_id:%x min_volt:%x max_volt:%x", vreg_id, min_volt, max_volt);
                ret = nc_pm8xxx_vreg_set_level(PM8XXX_VERSION_8821, vreg_id, min_volt, max_volt);
            }
            break;





































































































































        
        case IOCTL_PW8821_VT_PLDWN_SW:
            {
                unsigned char enable;
                unsigned char vreg_id;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                enable  = buf.req_buf[0];
                vreg_id = buf.req_buf[1];
                
                

                printk(KERN_INFO "DIAG_PW8821_RG_SMPS_PSK enable:%x vreg_id:%x", enable, vreg_id);
                ret = nc_pm8xxx_vreg_pull_down_switch(PM8XXX_VERSION_8821, vreg_id, enable);
            }
            break;

        


        
        case IOCTL_PW8821_MPP_CNFDG_IPUT:
            {
                unsigned char mpp_port;
                unsigned char logi_level;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                mpp_port   = buf.req_buf[0];
                logi_level = buf.req_buf[1];
                
                ret = nc_pm8xxx_mpp_config_digital_in(PM8821_MPP_PM_TO_SYS(mpp_port), logi_level, PM8XXX_MPP_DIN_TO_INT);
                printk(KERN_INFO "DIAG_PW8821_MPP_CNFDG_IPUT mpp_port:%x logi_level:%x", mpp_port, logi_level);
            }
            break;
        
        case IOCTL_PW8821_MPP_CNFDG_OPUT:
            {
                unsigned char mpp_port;
                unsigned char logi_level;
                unsigned char out_ctl;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                mpp_port   = buf.req_buf[0];
                logi_level = buf.req_buf[1];
                out_ctl    = buf.req_buf[2];
                
               ret = nc_pm8xxx_mpp_config_digital_out(PM8821_MPP_PM_TO_SYS(mpp_port), logi_level, out_ctl);
                printk(KERN_INFO "DIAG_PW8821_MPP_CNFDG_OPUT mpp_port:%x logi_level:%x out_ctl:%x", mpp_port, logi_level, out_ctl);
            }
            break;
        
        case IOCTL_PW8821_MPP_CNFDG_IOPUT:
            {
                unsigned char mpp_port;
                unsigned char logi_level;
                unsigned char pull_set;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                mpp_port   = buf.req_buf[0];
                logi_level = buf.req_buf[1];
                pull_set   = buf.req_buf[2];
                
                ret = nc_pm8xxx_mpp_config_bi_dir(PM8821_MPP_PM_TO_SYS(mpp_port), logi_level, pull_set);
                printk(KERN_INFO "DIAG_PW8821_MPP_CNFDG_IOPUT mpp_port:%x logi_level:%x pull_set:%x", mpp_port, logi_level, pull_set);
            }
            break;
        
        case IOCTL_PW8821_MPP_CNFAN_IPUT:
            {
                unsigned char mpp_port;
                unsigned char ain_chn;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                mpp_port = buf.req_buf[0];
                ain_chn  = buf.req_buf[1];
                
                ret = nc_pm8xxx_mpp_config_analog_input(PM8821_MPP_PM_TO_SYS(mpp_port), ain_chn, PM8XXX_MPP_AOUT_CTRL_DISABLE);
                printk(KERN_INFO "DIAG_PW8821_MPP_CNFAN_IPUT mpp_port:%x ain_chn:%x", mpp_port, ain_chn);
            }
            break;
        
        case IOCTL_PW8821_MPP_CNFAN_OPUT:
            {
                unsigned char mpp_port;
                unsigned char aout_level;
                unsigned char pm_onoff;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                mpp_port   = buf.req_buf[0];
                aout_level = buf.req_buf[1];
                pm_onoff   = buf.req_buf[2];
                
                ret = nc_pm8xxx_mpp_config_analog_output(PM8821_MPP_PM_TO_SYS(mpp_port), aout_level, pm_onoff);
                printk(KERN_INFO "DIAG_PW8821_MPP_CNFAN_OPUT mpp_port:%x aout_level:%x pm_onoff:%x", mpp_port, aout_level, pm_onoff);
            }
            break;
        
        case IOCTL_PW8821_MPP_CNF_I_SINK:
            {
                unsigned char mpp_port;
                unsigned char sink_level;
                unsigned char pm_onoff;
                ioctl_pw_value_type buf;

                if(copy_from_user(&buf,pArg,sizeof(ioctl_pw_value_type)))
                {
                    printk(KERN_ERR "copy_from_user failed");
                    return PM_ERR_FLAG__INVALID;
                }

                mpp_port   = buf.req_buf[0];
                sink_level = buf.req_buf[1];
                pm_onoff   = buf.req_buf[2];
                
                ret = nc_pm8xxx_mpp_config_current_sink(PM8821_MPP_PM_TO_SYS(mpp_port), sink_level, pm_onoff);
                printk(KERN_INFO "DIAG_PW8821_MPP_CNF_I_SINK mpp_port:%x sink_level:%x pm_onoff:%x", mpp_port, sink_level, pm_onoff);
            }
            break;















































































































































































        
        case IOCTL_PW_HW_RESET:
            printk(KERN_INFO "DVE005_FACTORY_DIAG_FTM_ONLINE_RESET_MODE");



            printk(KERN_DEBUG "[ncdiagd_power.c]%s: Goto arm_pm_restart() in \n", __func__ );
            arm_pm_restart(0, NULL);

            break;





























































































        default:
            printk(KERN_ERR "Invalid Parameter");
            return PM_ERR_FLAG__INVALID;
    }

    return ret;
}