static void backlight_tft_late_on(struct mdss_dsi_ctrl_pdata *ctrl)
{
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);

	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return;
	}

	pr_info("%s : Backlight is on\n", __func__);
	if (!mdss_panel_attach_get(ctrl)) {
		pr_err("%s: mdss_panel_attach_get(%d) : %d\n",__func__, ctrl->ndx, mdss_panel_attach_get(ctrl));
		return;
	}

	vdd->panel_func.samsung_bl_ic_pwm_en(1);
	if(vdd->auto_brightness==6)
		vdd->panel_func.samsung_bl_ic_outdoor(1);

	if(is_first_boot){
		if (ctrl->panel_data.set_backlight)
			ctrl->panel_data.set_backlight(&ctrl->panel_data, LCD_DEFAUL_BL_LEVEL);
		is_first_boot = 0;
	}

	if(vdd->bl_level)
		mdss_samsung_brightness_tft_pwm(ctrl, vdd->bl_level);
}
static int mdss_panel_revision(struct mdss_dsi_ctrl_pdata *ctrl)
{
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);

	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return false;
	}

	if (vdd->manufacture_id_dsi[ctrl->ndx] == 0)
		mdss_panel_attach_set(ctrl, false);
	else
		mdss_panel_attach_set(ctrl, true);

	if (mdss_panel_id2_get(ctrl) == 0x13)
		vdd->panel_revision = 'D' - 'A';
	else if (mdss_panel_id2_get(ctrl) == 0x14)
		vdd->panel_revision = 'E' - 'A';
	else
		vdd->panel_revision = 'D' - 'A';

	pr_info("%s : panel_revision = %c \n", __func__,
					(unsigned char)vdd->panel_revision);

	return true;
}
static int mdss_manufacture_date_read(struct mdss_dsi_ctrl_pdata *ctrl)
{
	unsigned char date[2];
	int year, month, day;
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);

	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return false;
	}

	/* Read mtp (C8h 41,42th) for manufacture date */
	if (vdd->dtsi_data[ctrl->ndx].manufacture_date_rx_cmds[vdd->panel_revision].cmd_cnt) {
		mdss_samsung_panel_data_read(ctrl,
			&vdd->dtsi_data[ctrl->ndx].manufacture_date_rx_cmds[vdd->panel_revision],
			date, PANEL_LEVE2_KEY);

		year = date[0] & 0xf0;
		year >>= 4;
		year += 2011; // 0 = 2011 year
		month = date[0] & 0x0f;
		day = date[1] & 0x1f;

		pr_info("%s DSI%d manufacture_date = %d", __func__, ctrl->ndx, year * 10000 + month * 100 + day);

		vdd->manufacture_date_dsi[ctrl->ndx]  =   year * 10000 + month * 100 + day;
	} else {
static int mdss_manufacture_date_read(struct mdss_dsi_ctrl_pdata *ctrl)
{
	unsigned char date[4];
	int year, month, day;
	int hour, min;
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);

	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return false;
	}

	/* Read mtp (C8h 41,42th) for manufacture date */
	if (vdd->dtsi_data[ctrl->ndx].manufacture_date_rx_cmds[vdd->panel_revision].cmd_cnt) {
		mdss_samsung_panel_data_read(ctrl,
			&vdd->dtsi_data[ctrl->ndx].manufacture_date_rx_cmds[vdd->panel_revision],
			date, PANEL_LEVE2_KEY);

		year = date[0] & 0xf0;
		year >>= 4;
		year += 2011; // 0 = 2011 year
		month = date[0] & 0x0f;
		day = date[1] & 0x1f;
		hour = date[2]& 0x0f;
		min = date[3] & 0x1f;

		vdd->manufacture_date_dsi[ctrl->ndx] = year * 10000 + month * 100 + day;
		vdd->manufacture_time_dsi[ctrl->ndx] = hour * 100 + min;

		pr_err("manufacture_date DSI%d = (%d%04d) - year(%d) month(%d) day(%d) hour(%d) min(%d)\n",
			ctrl->ndx, vdd->manufacture_date_dsi[ctrl->ndx], vdd->manufacture_time_dsi[ctrl->ndx],
			year, month, day, hour, min);

	} else {
static int mdss_panel_on_post(struct mdss_dsi_ctrl_pdata *ctrl)
{
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);

	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return false;
	}

	pr_info("%s+: ndx=%d %d %d \n", __func__, ctrl->ndx,alpm_status_func(CHECK_PREVIOUS_STATUS),alpm_status_func(CHECK_CURRENT_STATUS));

	/* ALPM Mode Change */
	if (!alpm_status_func(CHECK_PREVIOUS_STATUS)\
		&& alpm_status_func(CHECK_CURRENT_STATUS)) {
			/* Turn On ALPM Mode */
			mdss_samsung_send_cmd(ctrl, PANEL_ALPM_ON);
			alpm_status_func(STORE_CURRENT_STATUS);
			pr_info("[ALPM_DEBUG] %s: Send ALPM mode on cmds\n", __func__);
	} else if (!alpm_status_func(CHECK_CURRENT_STATUS)\
		&& alpm_status_func(CHECK_PREVIOUS_STATUS)) {
			/* Turn Off ALPM Mode */
			mdss_samsung_send_cmd(ctrl, PANEL_ALPM_OFF);
			alpm_status_func(CLEAR_MODE_STATUS);
			pr_info("[ALPM_DEBUG] %s: Send ALPM off cmds\n", __func__);
	}

	pr_info("%s-: ndx=%d \n", __func__, ctrl->ndx);

	return true;
}
static int mdss_panel_on_post(struct mdss_dsi_ctrl_pdata *ctrl)
{
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);

	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return false;
	}

	pr_info("%s %d\n", __func__, ctrl->ndx);

	if(ctrl->bklt_ctrl == BL_DCS_CMD)
		ktd3102_set_led_current(5,ctrl);	/* set max current to "6"/19.8mA, only when CABC is enabled */

	if(vdd->support_cabc)
		mdss_samsung_cabc_update();

	if(ctrl->bklt_ctrl == BL_DCS_CMD && is_first_boot){
		mdss_samsung_brightness_dcs(ctrl, LCD_DEFAUL_BL_LEVEL);
		is_first_boot = 0;
	}


	return true;
}
static void backlight_tft_late_on(struct mdss_dsi_ctrl_pdata *ctrl)
{
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);

	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return;
	}

	if (!mdss_panel_attach_get(ctrl)) {
		pr_err("%s: mdss_panel_attach_get(%d) : %d\n",__func__, ctrl->ndx, mdss_panel_attach_get(ctrl));
		return;
	}

	if (gpio_is_valid(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[0])) {
		gpio_set_value(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[0], 1);
		msleep(80);
	}

	if(ctrl->bklt_ctrl == BL_SS_PWM && is_first_boot){
		if (vdd->panel_func.samsung_brightness_tft_pwm)
			vdd->panel_func.samsung_brightness_tft_pwm(ctrl,LCD_DEFAUL_BL_LEVEL);
		is_first_boot = 0;
	}

	pr_info("%s : Backlight is on\n", __func__);

	if(vdd->support_cabc)
		mdss_samsung_cabc_update();

}
static void mdss_panel_tft_outdoormode_update(struct mdss_dsi_ctrl_pdata *ctrl)
{
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);
	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return;
	}
	pr_info("%s: tft panel autobrightness update\n", __func__);

	switch(vdd->auto_brightness)
	{
	case 0: mdss_samsung_cabc_update();
			if(vdd->prev_auto_brightness == 6)
				vdd->panel_func.samsung_bl_ic_outdoor(0);
			break;
	case 1:
	case 2:
	case 3:
	case 4: mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_ON);
			if(vdd->prev_auto_brightness == 6)
				vdd->panel_func.samsung_bl_ic_outdoor(0);
			break;
	case 5: mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF);
			if(vdd->prev_auto_brightness == 6)
				vdd->panel_func.samsung_bl_ic_outdoor(0);
			break;
	case 6: mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF);
			vdd->panel_func.samsung_bl_ic_outdoor(1);
			break;
	}
	vdd->prev_auto_brightness =	vdd->auto_brightness;
}
static int mdss_panel_revision(struct mdss_dsi_ctrl_pdata *ctrl)
{
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);

	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return false;
	}

	if (vdd->manufacture_id_dsi[ctrl->ndx] == 0)
		mdss_panel_attach_set(ctrl, false);
	else
		mdss_panel_attach_set(ctrl, true);
/*temp_joann*/
	if (mdss_panel_id2_get(ctrl) == 0x5)
		vdd->panel_revision = 'F';
	else if (mdss_panel_id2_get(ctrl) == 0x6)
		vdd->panel_revision = 'G';
	else if (mdss_panel_id2_get(ctrl) == 0x7)
		vdd->panel_revision = 'H';
	else if (mdss_panel_id2_get(ctrl) == 0x8)       // For use 0x08 Rev to 0x09 Rev
		vdd->panel_revision = 'J';
	else if (mdss_panel_id2_get(ctrl) == 0x9)
		vdd->panel_revision = 'J';
	else
		vdd->panel_revision = 'J';

	vdd->panel_revision -= 'A';

	pr_info("%s : panel_revision = %c %d \n", __func__,
					vdd->panel_revision + 'A', vdd->panel_revision);

	return true;
}
static void mdss_panel_tft_outdoormode_update(struct mdss_dsi_ctrl_pdata *ctrl)
{
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);
	struct mdss_panel_info *pinfo = NULL;
	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return;
	}

	pinfo = &(ctrl->panel_data.panel_info);
	if (pinfo->blank_state == MDSS_PANEL_BLANK_BLANK) {
		pr_info("%s: skip mdss_panel_tft_outdoormode_update %d\n", __func__, __LINE__);
		return;
	}

	pr_info("%s: tft panel autobrightness update\n", __func__);

	if(vdd->prev_auto_brightness == vdd->auto_brightness)
		return;

	switch(vdd->auto_brightness)
	{
	case 0: mdss_samsung_cabc_update();
			if(vdd->prev_auto_brightness == 6)
				vdd->panel_func.samsung_bl_ic_outdoor(0);
			break;
	case 1:
	case 2:
	case 3:
	case 4:
			if(vdd->prev_auto_brightness && vdd->prev_auto_brightness < 5) {
				vdd->prev_auto_brightness = vdd->auto_brightness;
				return;
			}
			if(vdd->prev_auto_brightness == 6)
				vdd->panel_func.samsung_bl_ic_outdoor(0);
			vdd->prev_auto_brightness = vdd->auto_brightness;
			mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF_DUTY);
			mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_ON);
			if(vdd->dtsi_data[ctrl->ndx].cabc_delay && !vdd->display_ststus_dsi[ctrl->ndx].disp_on_pre)
				usleep(vdd->dtsi_data[ctrl->ndx].cabc_delay);
			mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_ON_DUTY);
			break;
	case 5:
			mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF_DUTY);
			mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF);
			if(vdd->prev_auto_brightness == 6)
				vdd->panel_func.samsung_bl_ic_outdoor(0);
			break;
	case 6:
			mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF_DUTY);
			mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF);
			vdd->panel_func.samsung_bl_ic_outdoor(1);
			break;
	}
	vdd->prev_auto_brightness = vdd->auto_brightness;
}
static void ktd3102_set_brightness(int level, struct mdss_dsi_ctrl_pdata *ctrl)
{
	int pulse;
	int tune_level = 0;
	unsigned long irq_flags;
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);
	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return;
	}

	tune_level = level;

	if(level == 0){
		gpio_set_value((vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[1]), 0);
		lcd_brightness = tune_level;
		pr_info("level = %d pulling low\n",level);
		return;
	}

	if (unlikely(lcd_brightness < 0)) {
		int val = gpio_get_value(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[1]);
		if (val) {
			lcd_brightness = 0;
			gpio_set_value(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[1], 0);
			mdelay(3);
			pr_info("LCD Baklight init in boot time on kernel\n");
		}
	}
	if (!lcd_brightness) {
		gpio_set_value(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[1], 1);
		udelay(3);
		lcd_brightness = 1;
		pr_info("level = %d !lcd_brightness\n",level);
	}

	pulse = (tune_level - lcd_brightness + MAX_BRIGHTNESS_IN_BLU)
					% MAX_BRIGHTNESS_IN_BLU;

	pr_info("lcd_brightness = %d, tune_level = %d,  pulse = %d\n", lcd_brightness,tune_level,pulse);

	spin_lock_irqsave(&bg_gpio_lock, irq_flags);
	for (; pulse > 0; pulse--) {

		gpio_set_value(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[1], 0);
		udelay(3);
		gpio_set_value(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[1], 1);
		udelay(3);
	}
	spin_unlock_irqrestore(&bg_gpio_lock, irq_flags);

	lcd_brightness = tune_level;

	mdelay(1);

}
static void mdss_panel_tft_pwm_control(struct mdss_dsi_ctrl_pdata *ctrl, int bl_lvl)
{
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);

	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return;
	}
	if(ctrl->panel_data.panel_info.blank_state == MDSS_PANEL_BLANK_UNBLANK) {
		vdd->panel_func.samsung_bl_ic_pwm_en(1);
		vdd->panel_func.samsung_bl_ic_i2c_ctrl(bl_lvl);
	}
}
static int mdss_panel_revision(struct mdss_dsi_ctrl_pdata *ctrl)
{
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);

	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return false;
	}

	vdd->panel_revision = 0;

	return true;
}
static int mdss_panel_off_pre(struct mdss_dsi_ctrl_pdata *ctrl)
{
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);

	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return false;
	}

	pr_info("%s %d\n", __func__, ctrl->ndx);

	vdd->panel_func.samsung_bl_ic_pwm_en(0);
	return true;
}
static int mdss_panel_on_post(struct mdss_dsi_ctrl_pdata *ctrl)
{
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);

	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return false;
	}

	pr_info("%s %d\n", __func__, ctrl->ndx);

	mdss_samsung_cabc_update();

	return true;
}
static void mdss_panel_tft_pwm_control(struct mdss_dsi_ctrl_pdata *ctrl, int level)
{
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);
	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return;
	}

	vdd->bl_level = level;
	vdd->scaled_level = get_scaled_level(vdd, ctrl->ndx);
	ktd3102_set_brightness(vdd->scaled_level, ctrl);

	pr_info("%s bl_level : %d scaled_level : %d\n", __func__, level, vdd->scaled_level);

	return;
}
static int mdss_panel_on_pre(struct mdss_dsi_ctrl_pdata *ctrl)
{
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);

	printk("%s:%d --by sean\n",__func__,__LINE__);
	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return false;
	}

	pr_info("%s %d\n", __func__, ctrl->ndx);

	mdss_panel_attach_set(ctrl, true);

	return true;
}
static struct dsi_panel_cmds * mdss_brightness_tft_pwm(struct mdss_dsi_ctrl_pdata *ctrl, int *level_key)
{
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);

	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return NULL;
	}

	vdd->scaled_level = get_scaled_level(vdd, ctrl->ndx);

	pr_info("%s bl_level : %d scaled_level : %d\n", __func__, vdd->bl_level, vdd->scaled_level);

	vdd->dtsi_data[ctrl->ndx].tft_pwm_tx_cmds->cmds->payload[1] = vdd->scaled_level ;

	return &vdd->dtsi_data[ctrl->ndx].tft_pwm_tx_cmds[vdd->panel_revision];
}
void mdss_samsung_cabc_update_tft(struct mdss_dsi_ctrl_pdata *ctrl, int val)
{
	static int prev_val;
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);

	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s vdd is error", __func__);
		return;
	}

	if(prev_val == val)
		return;

	if(val){
		mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF_DUTY);
		mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF);
	} else {
		switch(vdd->auto_brightness) {

		case 1:
		case 2:
		case 3:
		case 4:
				if(vdd->prev_auto_brightness == 6)
					vdd->panel_func.samsung_bl_ic_outdoor(0);
				prev_val = val;
				mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF_DUTY);
				mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_ON);
				if(vdd->dtsi_data[ctrl->ndx].cabc_delay && !vdd->display_ststus_dsi[ctrl->ndx].disp_on_pre)
					usleep(vdd->dtsi_data[ctrl->ndx].cabc_delay);
				mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_ON_DUTY);
				break;
		case 5:
				mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF_DUTY);
				mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF);
				if(vdd->prev_auto_brightness == 6)
				vdd->panel_func.samsung_bl_ic_outdoor(0);
				break;
		case 6:
				mdss_samsung_send_cmd(vdd->ctrl_dsi[DISPLAY_1], PANEL_CABC_OFF_DUTY);
				vdd->panel_func.samsung_bl_ic_outdoor(1);
				break;
		}
	}
	prev_val = val;
}
static int mdss_panel_on_post(struct mdss_dsi_ctrl_pdata *ctrl)
{
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);

	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return false;
	}

	pr_info("%s+: ndx=%d \n", __func__, ctrl->ndx);

	if((mdss_panel_id1_get(ctrl) == 0x20) || (mdss_panel_id1_get(ctrl) == 0x40))
		mdss_samsung_send_cmd(ctrl, PANEL_HSYNC_ON);

	pr_info("%s-: ndx=%d \n", __func__, ctrl->ndx);

	return true;
}
static void update_mdnie_tft_cmds(struct mdss_dsi_ctrl_pdata *ctrl)
{
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);

	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return;
	}

	if (!mdss_panel_attach_get(ctrl)) {
		pr_err("%s: mdss_panel_attach_get(%d) : %d\n",__func__, ctrl->ndx, mdss_panel_attach_get(ctrl));
		return;
	}

	if (vdd->support_mdnie_lite)
		update_dsi_tcon_mdnie_register(vdd);

}
static int mdss_panel_on_post(struct mdss_dsi_ctrl_pdata *ctrl)
{
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);

	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return false;
	}

	pr_info("%s %d\n", __func__, ctrl->ndx);

	mdss_samsung_cabc_update();

	if(is_first_boot){
		if (ctrl->panel_data.set_backlight)
			ctrl->panel_data.set_backlight(&ctrl->panel_data, LCD_DEFAUL_BL_LEVEL);
		is_first_boot = 0;
	}

	return true;
}
static int mdss_panel_off_post(struct mdss_dsi_ctrl_pdata *ctrl)
{
	struct samsung_display_driver_data *vdd = check_valid_ctrl(ctrl);

	if (IS_ERR_OR_NULL(vdd)) {
		pr_err("%s: Invalid data ctrl : 0x%zx vdd : 0x%zx", __func__, (size_t)ctrl, (size_t)vdd);
		return false;
	}

	if(is_first_boot) {
		mdss_backlight_tft_request_gpios(ctrl);
		if (ctrl->bklt_ctrl == BL_DCS_CMD && vdd->panel_func.samsung_brightness_tft_pwm)
			vdd->panel_func.samsung_brightness_tft_pwm(ctrl, 0);
	}

	if (gpio_is_valid(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[0]))
		gpio_set_value(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[0], 0);
	if (gpio_is_valid(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[1]))
		gpio_set_value(vdd->dtsi_data[ctrl->ndx].backlight_tft_gpio[1], 0);

	return true;
}
int mdss_dsi_on(struct mdss_panel_data *pdata)
{
	int ret = 0;
	struct mdss_panel_info *pinfo;
	struct mipi_panel_info *mipi;
	struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
	int cur_power_state;
#if defined(CONFIG_FB_MSM_MDSS_SAMSUNG)
	struct samsung_display_driver_data *vdd = NULL;
	u32 reg_backup;
#endif

	if (pdata == NULL) {
		pr_err("%s: Invalid input data\n", __func__);
		return -EINVAL;
	}

	ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
				panel_data);

	cur_power_state = pdata->panel_info.panel_power_state;

	pr_info("%s+: ctrl=%p ndx=%d cur_power_state=%d\n", __func__,
		ctrl_pdata, ctrl_pdata->ndx, cur_power_state);

	pinfo = &pdata->panel_info;
	mipi = &pdata->panel_info.mipi;

#if defined(CONFIG_FB_MSM_MDSS_SAMSUNG)
	if (pinfo->esd_recovery.esd_irq_enable)
		pinfo->esd_recovery.esd_irq_enable(true, false, (void *)pinfo);
#endif

	if (mdss_dsi_is_panel_on_interactive(pdata)) {
		pr_err("%s: panel already on\n", __func__);
		goto end;
	}

	ret = mdss_dsi_panel_power_ctrl(pdata, MDSS_PANEL_POWER_ON);
	if (ret) {
		pr_err("%s:Panel power on failed. rc=%d\n", __func__, ret);
		return ret;
	}

	if (cur_power_state != MDSS_PANEL_POWER_OFF) {
		pr_debug("%s: dsi_on from panel low power state\n", __func__);
		goto end;
	}

	/*
	 * Enable DSI clocks.
	 * This is also enable the DSI core power block and reset/setup
	 * DSI phy
	 */
	mdss_dsi_clk_ctrl(ctrl_pdata, DSI_ALL_CLKS, 1);
	mdss_dsi_sw_reset(ctrl_pdata, true);

	/*
	 * Issue hardware reset line after enabling the DSI clocks and data
	 * data lanes for LP11 init
	 */
	if (mipi->lp11_init) {
#if defined(CONFIG_FB_MSM_MDSS_SAMSUNG)
		vdd = check_valid_ctrl(ctrl_pdata);
		if (!IS_ERR_OR_NULL(vdd) && vdd->dtsi_data[ctrl_pdata->ndx].samsung_lp11_init) {
			/* LP11 */
			reg_backup = MIPI_INP((ctrl_pdata->ctrl_base) + 0xac);
			MIPI_OUTP((ctrl_pdata->ctrl_base) + 0xac, 0x1F << 16);
			wmb();

			if (mipi->init_delay)
				usleep(mipi->init_delay);
		}
#endif
		mdss_dsi_panel_reset(pdata, 1);

#if defined(CONFIG_FB_MSM_MDSS_SAMSUNG)
		/* LP11 Restore */
		if (!IS_ERR_OR_NULL(vdd) && vdd->dtsi_data[ctrl_pdata->ndx].samsung_lp11_init)
			MIPI_OUTP((ctrl_pdata->ctrl_base) + 0xac,
					reg_backup);
#endif
	}

	if (mipi->init_delay)
		usleep(mipi->init_delay);

	if (mipi->force_clk_lane_hs) {
		u32 tmp;

		tmp = MIPI_INP((ctrl_pdata->ctrl_base) + 0xac);
		tmp |= (1<<28);
		MIPI_OUTP((ctrl_pdata->ctrl_base) + 0xac, tmp);
		wmb();
	}

	if (pdata->panel_info.type == MIPI_CMD_PANEL)
		mdss_dsi_clk_ctrl(ctrl_pdata, DSI_ALL_CLKS, 0);

	pinfo->dsi_on_status = true;

end:
	pr_err("%s-:\n", __func__);
	return 0;
}