static int mecha_sharp_panel_unblank(struct msm_lcdc_panel_ops *ops)
{
	struct spi_msg set_brightness = {
                .cmd = 0x51,
                .len = 1,
                .data = (unsigned char *)&last_val,
	};

        LCMDBG("\n");
	if (color_enhancement == 0) {
		mecha_mdp_color_enhancement(mdp_pdata.mdp_dev);
		color_enhancement = 1;
	}
        mutex_lock(&panel_lock);
	qspi_send_9bit(&set_brightness);
	lcm_sharp_write_seq(sharp_turn_on_backlight,
	ARRAY_SIZE(sharp_turn_on_backlight));
        mutex_unlock(&panel_lock);
        return 0;
}

static int mecha_sharp_panel_blank(struct msm_lcdc_panel_ops *ops)
{
	LCMDBG("\n");
	mutex_lock(&panel_lock);
	lcm_sharp_write_seq(sharp_blank_seq, ARRAY_SIZE(sharp_blank_seq));
	hr_msleep(100);
	mutex_unlock(&panel_lock);
	return 0;
}
/*----------------------------------------------------------------------------*/
int __init mecha_init_panel(void)
{
	int ret;

        vreg_lcm_1v8 = vreg_get(0, "gp13");
        if (IS_ERR(vreg_lcm_1v8))
                return PTR_ERR(vreg_lcm_1v8);
        vreg_lcm_2v8 = vreg_get(0, "wlan2");
        if (IS_ERR(vreg_lcm_2v8))
                return PTR_ERR(vreg_lcm_2v8);


	LCMDBG("panel_type=%d\n", panel_type);
	if (panel_type & 0x8) {
		panel_rev = 1;
		panel_type &= 0x7;
	}
	switch (panel_type) {
	case PANEL_AUO:
#ifdef CONFIG_PANEL_SELF_REFRESH
		mdp_pdata.overrides |= MSM_MDP_RGB_PANEL_SELE_REFRESH;
		LCMDBG("MECHA AUO Panel:RGB_PANEL_SELE_REFRESH \n");
		mecha_auo_panel_ops.refresh_enable = mecha_auo_panel_refresh_enable;
		mecha_auo_panel_ops.refresh_disable = mecha_auo_panel_refresh_disable;
		msm_device_mdp.dev.platform_data = &mdp_pdata;
#endif
		mecha_lcdc_platform_data.timing = &mecha_auo_timing;
		mecha_lcdc_platform_data.panel_ops = &mecha_auo_panel_ops;
		break;
	case PANEL_SHARP:
	case PANEL_SHARP565:
		if (panel_type == PANEL_SHARP565)
			mdp_pdata.overrides |= MSM_MDP_DMA_PACK_ALIGN_LSB;
		msm_device_mdp.dev.platform_data = &mdp_pdata;
		mecha_lcdc_platform_data.timing = &mecha_sharp_timing;
		mecha_lcdc_platform_data.panel_ops = &mecha_sharp_panel_ops;
		break;
	default:
		return -EINVAL;
	}

	ret = platform_device_register(&msm_device_mdp);
	if (ret != 0)
		return ret;

	ret = platform_device_register(&mecha_lcdc_device);
	if (ret != 0)
		return ret;

	ret = platform_device_register(&mecha_backlight_pdev);
        if (ret)
                return ret;

	return 0;
}
int __init spade_init_panel(void)
{
	int ret;

        vreg_lcm_1v8 = vreg_get(0, "gp13");
        if (IS_ERR(vreg_lcm_1v8))
                return PTR_ERR(vreg_lcm_1v8);
        vreg_lcm_2v8 = vreg_get(0, "wlan2");
        if (IS_ERR(vreg_lcm_2v8))
                return PTR_ERR(vreg_lcm_2v8);

	LCMDBG("panel_type=%d\n", panel_type);
	switch (panel_type) {
	case PANEL_AUO:
#ifdef CONFIG_PANEL_SELF_REFRESH
		mdp_pdata.overrides = MSM_MDP_RGB_PANEL_SELE_REFRESH,
		LCMDBG("ACE AUO Panel:RGB_PANEL_SELE_REFRESH \n");
		spade_auo_panel_ops.refresh_enable = spade_auo_panel_refresh_enable;
		spade_auo_panel_ops.refresh_disable = spade_auo_panel_refresh_disable;
#endif
		spade_lcdc_platform_data.timing = &spade_auo_timing;
		spade_lcdc_platform_data.panel_ops = &spade_auo_panel_ops;

		break;
	case PANEL_ID_SPADE_AUO_N90:
		spade_lcdc_platform_data.timing = &spade_auo_n90_timing;
		spade_lcdc_platform_data.panel_ops = &spade_auo_n90_panel_ops;
		break;
	case PANEL_SHARP:
	case PANEL_ID_SPADE_SHA_N90:
		spade_lcdc_platform_data.timing = &spade_sharp_timing;
		spade_lcdc_platform_data.panel_ops = &spade_sharp_panel_ops;
		break;
	default:
		return -EINVAL;
	}
	msm_device_mdp.dev.platform_data = &mdp_pdata;
	ret = platform_device_register(&msm_device_mdp);
	if (ret != 0)
		return ret;

	ret = platform_device_register(&spade_lcdc_device);
	if (ret != 0)
		return ret;

	ret = platform_device_register(&spade_backlight_pdev);
        if (ret)
                return ret;

	return 0;
}
static int mecha_backlight_probe(struct platform_device *pdev)
{
	int rc;

	rc = led_classdev_register(&pdev->dev, &mecha_backlight_led);
	if (rc)
		LCMDBG("backlight: failure on register led_classdev\n");

	rc = device_create_file(mecha_backlight_led.dev, &auto_attr);
	if (rc)
		LCMDBG("backlight: failure on create attr\n");

	return 0;
}
static int amoled_panel_unblank(struct msm_lcdc_panel_ops *panel_data)
{
	LCMDBG("%s\n", __func__);

	wake_lock(&panel_idle_lock);
	mutex_lock(&panel_lock);
	amoled_set_gamma_val(last_level);
	/* Display on */
	qspi_send_9bit(&unblank_msg);
	mutex_unlock(&panel_lock);
	wake_unlock(&panel_idle_lock);

	LCMDBG("%s: last_level = %d\n", __func__, last_level);
	led_trigger_event(amoled_lcd_backlight, LED_FULL);
	return 0;
}
static int spade_sharp_panel_blank(struct msm_lcdc_panel_ops *ops)
{
	LCMDBG("\n");
	spade_adjust_backlight(0);
	atomic_set(&lcm_init_done, 0);
        return 0;
}
static void flyer_panel_power(bool on_off)
{
	int gpio_lcm_en, gpio_lvds_on;

	if (panel_type != PANEL_ID_FLR_SMD_XB) {
		gpio_lcm_en = FLYER_LCM_3V3_EN_XC;
		gpio_lvds_on = FLYER_LVDS_ON_XC;
	} else {
		gpio_lcm_en = FLYER_LCM_3V3_EN;
		gpio_lvds_on = FLYER_LVDS_ON;
	}

	if (!!on_off) {
		LCMDBG("%s(%d):\n", __func__, on_off);
		vreg_enable(vreg_lcm_1v8);
		gpio_set_value(gpio_lcm_en, 1);
		if(panel_type == PANEL_ID_FLR_LG_XC || panel_type == PANEL_ID_FLR_LG_WS2)
			hr_msleep(50);
		else
			hr_msleep(90);
		gpio_set_value(gpio_lvds_on, 1);
	} else {
		gpio_set_value(gpio_lcm_en, 0);
		if(panel_type == PANEL_ID_FLR_LG_XC || panel_type == PANEL_ID_FLR_LG_WS2)
			hr_msleep(50);
		else
			hr_msleep(60);
		gpio_set_value(gpio_lvds_on, 0);
		vreg_disable(vreg_lcm_1v8);
	}

}
static int sonywvga_panel_blank(struct msm_lcdc_panel_ops *panel_data)
{
	uint8_t data[4] = {0, 0, 0, 0};
	LCMDBG("%s\n", __func__);

	mutex_lock(&panel_lock);

	blank_msg.cmd = 0x28;
	qspi_send_9bit(&blank_msg);
	blank_msg.cmd = 0x10;
	qspi_send_9bit(&blank_msg);
	hr_msleep(40);
	g_unblank_stage = 0;
	mutex_unlock(&panel_lock);
	sonywvga_panel_power(0);

	if (!is_sony_spi()) {
		data[0] = 5;
		data[1] = 0;
		data[3] = 1;
		microp_i2c_write(0x25, data, 4);
	}

	return 0;
}
static int samsung_oled_panel_init(struct msm_lcdc_panel_ops *ops)
{
	LCMDBG("%s()\n", __func__);

	amoled_panel_power(1);

	wake_lock(&panel_idle_lock);
	mutex_lock(&panel_lock);
	if (machine_is_passionc()) {
		/* FIXME: display team will clean up the below codes */
		if (system_rev == 0xC0 || system_rev == 0) /* for Passion#C EVT1 */
			lcm_write_tb(lcm_init_seq, ARRAY_SIZE(lcm_init_seq));
		else
			lcm_write_tb(lcm_init_seq, ARRAY_SIZE(lcm_init_666seq));
	} else {
		if (system_rev < 1)
			lcm_write_tb(lcm_init_seq, ARRAY_SIZE(lcm_init_seq));
		else
			lcm_write_tb(lcm_init_seq, ARRAY_SIZE(lcm_init_666seq));
	}
	gamma_table_bank_select();
	mutex_unlock(&panel_lock);
	wake_unlock(&panel_idle_lock);
	return 0;
}
static int spade_adjust_backlight(enum led_brightness val)
{
        uint8_t data[4] = {     /* PWM setting of microp, see p.8 */
                0x05,           /* Fading time; suggested: 5/10/15/20/25 */
                val,            /* Duty Cycle */
                0x00,           /* Channel H byte */
                0x20,           /* Channel L byte */
                };
	uint8_t shrink_br;

        mutex_lock(&panel_lock);
        if (val == 0)
                shrink_br = 0;
        else if (val <= 30)
                shrink_br = 7;
        else if ((val > 30) && (val <= 143))
                shrink_br = (91 - 7) * (val - 30) / (143 - 30) + 7;
        else
                shrink_br = (217 - 91) * (val - 143) / (255 - 143) + 91;
        data[1] = shrink_br;

        LCMDBG("(%d), shrink_br=%d\n", val, shrink_br);
        microp_i2c_write(0x25, data, sizeof(data));
        last_val = shrink_br ? shrink_br: last_val;
        mutex_unlock(&panel_lock);

	return shrink_br;
}
/*----------------------------------------------------------------------------*/
int spade_panel_sleep_in(void)
{
	int ret;

	LCMDBG(", screen=%s\n", screen_on ? "on" : "off");
	if (screen_on)
		return 0;

	mutex_lock(&panel_lock);
	switch (panel_type) {
		case PANEL_AUO:
			spade_auo_panel_power(1);
			lcm_auo_write_seq(auo_sleep_in_seq,
				ARRAY_SIZE(auo_sleep_in_seq));
			ret = 0;
			break;
		case PANEL_SHARP:
			spade_sharp_panel_power(1);
			lcm_sharp_write_seq(sharp_uninit_seq,
				ARRAY_SIZE(sharp_uninit_seq));
			ret = 0;
			break;
		default:
			ret = -EINVAL;
			break;
	}
	mutex_unlock(&panel_lock);
	return ret;
}
static int spade_auo_n90_panel_uninit(struct msm_lcdc_panel_ops *ops)
{
	LCMDBG("\n");
	mutex_lock(&panel_lock);
	spade_auo_panel_power(0);
	mutex_unlock(&panel_lock);
	return 0;
}
static int mecha_sharp_panel_uninit(struct msm_lcdc_panel_ops *ops)
{
        LCMDBG("\n");
        mutex_lock(&panel_lock);
        mecha_sharp_panel_power(0);
        mutex_unlock(&panel_lock);
        return 0;
}
static int mecha_auo_panel_blank(struct msm_lcdc_panel_ops *ops)
{
	LCMDBG("\n");
	mutex_lock(&panel_lock);
	lcm_auo_write_seq(auo_blank_seq, ARRAY_SIZE(auo_blank_seq));
	mutex_unlock(&panel_lock);
	return 0;
}
static int spade_auo_panel_unblank(struct msm_lcdc_panel_ops *ops)
{
	LCMDBG("\n");
	atomic_set(&lcm_init_done, 1);
	spade_adjust_backlight(last_val);

	return 0;
}
static void mecha_auo_panel_power(bool on_off)
{
	if (!!on_off) {
		LCMDBG("%s(%d):\n", __func__, on_off);
		gpio_set_value(MECHA_LCD_RSTz, 1);
		udelay(500);
		gpio_set_value(MECHA_LCD_RSTz, 0);
		udelay(500);
		gpio_set_value(MECHA_LCD_RSTz, 1);
		hr_msleep(20);
		panel_gpio_switch(on_off);
	} else {
		LCMDBG("%s(%d):\n", __func__, on_off);
		gpio_set_value(MECHA_LCD_RSTz, 1);
		hr_msleep(70);
		panel_gpio_switch(on_off);
	}
}
static int amoled_backlight_probe(struct platform_device *pdev)
{
	int rc;
	amoled_backlight_led.brightness_set = samsung_brightness_set;
	rc = led_classdev_register(&pdev->dev, &amoled_backlight_led);
	if (rc)
		LCMDBG("backlight: failure on register led_classdev\n");
	return 0;
}
static int spade_backlight_probe(struct platform_device *pdev)
{
	int rc;

	rc = led_classdev_register(&pdev->dev, &spade_backlight_led);
	if (rc)
		LCMDBG("backlight: failure on register led_classdev\n");
	return 0;
}
static void spade_brightness_set(struct led_classdev *led_cdev,
		enum led_brightness val)
{
	if (atomic_read(&lcm_init_done) == 0) {
		last_val = val ? val : last_val;
		LCMDBG(":lcm not ready, val=%d\n", val);
		return;
	}
	led_cdev->brightness = spade_adjust_backlight(val);
}
static int spade_auo_n90_panel_init(struct msm_lcdc_panel_ops *ops)
{
	LCMDBG("\n");

	mutex_lock(&panel_lock);
	spade_auo_panel_power(1);
	lcm_auo_write_seq(auo_n90_init_seq, ARRAY_SIZE(auo_n90_init_seq));
	mutex_unlock(&panel_lock);
	return 0;
}
static int amoled_panel_unblank(struct platform_device *pdev)
{
	LCMDBG("%s\n", __func__);

        if (samsung_oled_panel_init())
          printk(KERN_ERR "samsung_oled_panel_init failed\n");

	wake_lock(&panel_idle_lock);
	mutex_lock(&panel_lock);
	amoled_set_gamma_val(last_level);
	/* Display on */
	qspi_send_9bit(&unblank_msg);
	mutex_unlock(&panel_lock);
	wake_unlock(&panel_idle_lock);

	LCMDBG("%s: last_level = %d\n", __func__, last_level);
	led_trigger_event(amoled_lcd_backlight, LED_FULL);
	return 0;
}
static int amoled_panel_blank(struct msm_lcdc_panel_ops *panel_data)
{
	LCMDBG("%s\n", __func__);
	mutex_lock(&panel_lock);
	lcm_write_tb(lcm_standby_seq, ARRAY_SIZE(lcm_standby_seq));
	mutex_unlock(&panel_lock);
	amoled_panel_power(0);
	led_trigger_event(amoled_lcd_backlight, LED_OFF);
	return 0;
}
static void spade_auo_panel_power(bool on_off)
{
	if (!!on_off) {
		LCMDBG("(%d):\n", on_off);
		gpio_set_value(SPADE_LCD_RSTz, 1);
		udelay(500);
		gpio_set_value(SPADE_LCD_RSTz, 0);
		udelay(500);
		gpio_set_value(SPADE_LCD_RSTz, 1);
		hr_msleep(20);
		config_gpio_table( display_on_gpio_table,
				ARRAY_SIZE(display_on_gpio_table));
	} else {
		LCMDBG("%s(%d):\n", __func__, on_off);
		gpio_set_value(SPADE_LCD_RSTz, 1);
		hr_msleep(70);
		config_gpio_table( display_off_gpio_table,
				ARRAY_SIZE(display_off_gpio_table));
	}
}
static int express_smd_panel_uninit(struct msm_lcdc_panel_ops *ops)
{
    LCMDBG("\n");

    mutex_lock(&panel_lock);
    express_panel_power(0);
    panel_gpio_switch(0);
    mutex_unlock(&panel_lock);

    return 0;
}
static int spade_sharp_panel_uninit(struct msm_lcdc_panel_ops *ops)
{
        LCMDBG("\n");

        mutex_lock(&panel_lock);
        lcm_sharp_write_seq(sharp_uninit_seq, ARRAY_SIZE(sharp_uninit_seq));
        spade_sharp_panel_power(0);
	screen_on = false;
        mutex_unlock(&panel_lock);
        return 0;
}
static int amoled_panel_blank(struct msm_lcdc_panel_ops *panel_data)
{
	LCMDBG("%s\n", __func__);
	mutex_lock(&panel_lock);
	qspi_send_9bit(&blank_cmd);
	hr_msleep(120);
	mutex_unlock(&panel_lock);
	amoled_panel_power(0);
	led_trigger_event(amoled_lcd_backlight, LED_OFF);
	return 0;
}
static int spade_auo_n90_panel_blank(struct msm_lcdc_panel_ops *ops)
{
	LCMDBG("\n");
	spade_adjust_backlight(0);
	atomic_set(&lcm_init_done, 0);
	mutex_lock(&panel_lock);
	lcm_auo_write_seq(auo_n90_uninit_seq, ARRAY_SIZE(auo_n90_uninit_seq));
	mutex_unlock(&panel_lock);

	return 0;
}
static int spade_auo_n90_panel_unblank(struct msm_lcdc_panel_ops *ops)
{
	LCMDBG("\n");
	if (color_enhancement == 0) {
		spade_mdp_color_enhancement(mdp_pdata.mdp_dev);
		color_enhancement = 1;
	}
	atomic_set(&lcm_init_done, 1);
	spade_adjust_backlight(last_val);

	return 0;
}
static int amoled_panel_unblank(struct msm_lcdc_panel_ops *panel_data)
{
	LCMDBG("%s\n", __func__);

	wake_lock(&panel_idle_lock);

	table_sel_idx = 0;
	mutex_lock(&panel_lock);
	gamma_table_bank_select();
	amoled_set_gamma_val(last_val);
	qspi_send(0, 0xef);
	qspi_send(1, 0xd0);
	qspi_send(1, 0xe8);
	lcm_write_cmd(0x14, 0x03);
	mutex_unlock(&panel_lock);
	wake_unlock(&panel_idle_lock);

	LCMDBG("%s: last_val = %d\n", __func__,last_val);
	led_trigger_event(amoled_lcd_backlight, LED_FULL);
	return 0;
}
static int mecha_auo_panel_init(struct msm_lcdc_panel_ops *ops)
{
	LCMDBG("\n");

	mutex_lock(&panel_lock);
	mecha_auo_panel_power(1);
	lcm_auo_write_seq(auo_init_seq, ARRAY_SIZE(auo_init_seq));
	lcm_auo_write_seq(auo_gamma_normal_seq, ARRAY_SIZE(auo_gamma_normal_seq));

	mutex_unlock(&panel_lock);
	return 0;
}