static int ls04x_drv_ic_init(struct mdfld_dsi_config *dsi_config)
{
	int r = 0;
	u8 data[16];
	struct mdfld_dsi_pkg_sender *sender
				= mdfld_dsi_get_pkg_sender(dsi_config);

	PSB_DEBUG_ENTRY("\n");

	if (!sender)
		return -EINVAL;
	sender->status = MDFLD_DSI_PKG_SENDER_FREE;
	memset(data, 0, sizeof(data));
	mdfld_dsi_send_gen_short_hs(sender,
			ls04x_mcap[0],
			ls04x_mcap[1], 2,
			MDFLD_DSI_SEND_PACKAGE);

	r = mdfld_dsi_read_gen_hs(sender,
			ls04x_device_code_read[0], 0, 1, data, 5);
	PSB_DEBUG_GENERAL("device code read: %d %02x %02x %02x %02x %02x\n",
			  r, data[0], data[1], data[2], data[3], data[4]);

	if ((data[2] == 0x14) && (data[3] == 0x13))
		r = ls04x_igzo_drv_ic_init(dsi_config);
	else if ((data[2] == 0x34) && (data[3] == 0x15))
		r = ls04x_cgs_drv_ic_init(dsi_config);
	else if ((data[2] == 0x94) && (data[3] == 0x31))
		r = ls04x_igzo_g8_drv_ic_init(dsi_config);
	else
		DRM_INFO("unknown device code: %02x %02x\n", data[2], data[3]);

	return r;
}
static int handle_dsi_init_commands(struct mdfld_dsi_pkg_sender *sender,
				struct dsi_init_command *command)
{
	int r = 0;

	if (!sender)
		return -EINVAL;

	while (command->type != DONE_CMD && r == 0) {
		switch (command->type) {
		case GEN_LONG_LP_CMD:
			r = mdfld_dsi_send_gen_long_lp(sender, command->param,
				command->count, MDFLD_DSI_SEND_PACKAGE);
			break;
		case GEN_SHORT_LP_CMD:
			r = mdfld_dsi_send_gen_short_lp(sender,
				command->param[0],
				command->count > 1 ? command->param[1] : 0,
				command->count, MDFLD_DSI_SEND_PACKAGE);
			break;
		case MCS_LONG_LP_CMD:
			r = mdfld_dsi_send_mcs_long_lp(sender, command->param,
				command->count, MDFLD_DSI_SEND_PACKAGE);
			break;
		case MCS_SHORT_LP_CMD:
			r = mdfld_dsi_send_mcs_short_lp(sender,
				command->param[0],
				command->count > 1 ? command->param[1] : 0,
				command->count - 1, MDFLD_DSI_SEND_PACKAGE);
			break;
		case GEN_LONG_HS_CMD:
			r = mdfld_dsi_send_gen_long_hs(sender, command->param,
				command->count, MDFLD_DSI_SEND_PACKAGE);
			break;
		case GEN_SHORT_HS_CMD:
			r = mdfld_dsi_send_gen_short_hs(sender,
				command->param[0],
				command->count > 1 ? command->param[1] : 0,
				command->count, MDFLD_DSI_SEND_PACKAGE);
			break;
		case MCS_LONG_HS_CMD:
			r = mdfld_dsi_send_mcs_long_hs(sender, command->param,
				command->count, MDFLD_DSI_SEND_PACKAGE);
			break;
		case MCS_SHORT_HS_CMD:
			r = mdfld_dsi_send_mcs_short_hs(sender,
				command->param[0],
				command->count > 1 ? command->param[1] : 0,
				command->count - 1, MDFLD_DSI_SEND_PACKAGE);
			break;
		case DELAY_CMD:
			usleep_range(command->count, command->count * 3 / 2);
			break;
		case DONE_CMD:
			break;
		}
		command++;
	}
	return r;
}
Beispiel #3
0
static int jdi25x16_cmd_power_off(
		struct mdfld_dsi_config *dsi_config)
{
	struct mdfld_dsi_pkg_sender *sender =
		mdfld_dsi_get_pkg_sender(dsi_config);
	int err;
	int i;

	PSB_DEBUG_ENTRY("\n");

	if (!sender) {
		DRM_ERROR("Failed to get DSI packet sender\n");
		return -EINVAL;
	}
	for (i = 0; i < 2; i++) {
		if (i == 0)
			sender->work_for_slave_panel = false;
		else
			sender->work_for_slave_panel = true;
		mdelay(20);
		err = mdfld_dsi_send_gen_short_hs(sender,
			access_protect, 0, 2,
			MDFLD_DSI_SEND_PACKAGE);
		if (err) {
			DRM_ERROR("%s: %d: Set MCAP\n",
			__func__, __LINE__);
			goto power_off_err;
		}
		err = mdfld_dsi_send_gen_long_hs(sender, jdi25x16_set_normal_mode,
				2,
				MDFLD_DSI_SEND_PACKAGE);
		if (err) {
			DRM_ERROR("%s: %d: Set Mode\n", __func__, __LINE__);
			goto power_off_err;
		}
		err = mdfld_dsi_send_gen_short_hs(sender,
			access_protect, 3, 2,
			MDFLD_DSI_SEND_PACKAGE);
		if (err) {
			DRM_ERROR("%s: %d: Set MCAP\n",
			__func__, __LINE__);
			goto power_off_err;
		}
	}
	for (i = 0; i < 2; i++) {
		if (i == 0)
			sender->work_for_slave_panel = false;
		else
			sender->work_for_slave_panel = true;
		/* Set Display off */
		err = mdfld_dsi_send_mcs_short_hs(sender, set_display_off, 0, 0,
				MDFLD_DSI_SEND_PACKAGE);
		if (err) {
			DRM_ERROR("%s: %d: Set Display On\n", __func__, __LINE__);
			goto power_off_err;
		}
		msleep(20);
		/* Sleep In */
		err = mdfld_dsi_send_mcs_short_hs(sender, enter_sleep_mode, 0, 0,
				MDFLD_DSI_SEND_PACKAGE);
		if (err) {
			DRM_ERROR("%s: %d: Exit Sleep Mode\n", __func__, __LINE__);
			goto power_off_err;
		}
		msleep(80);
	}
	gpio_set_value_cansleep(bias_en_gpio, 0);
	msleep(10);

	for (i = 0; i < 2; i++) {
		if (i == 0)
			sender->work_for_slave_panel = false;
		else
			sender->work_for_slave_panel = true;
		err = mdfld_dsi_send_gen_short_hs(sender,
				access_protect, 0, 2,
				MDFLD_DSI_SEND_PACKAGE);
			if (err) {
				DRM_ERROR("%s: %d: Set MCAP\n",
				__func__, __LINE__);
				goto power_off_err;
			}
		err = mdfld_dsi_send_gen_short_hs(sender,
				low_power_mode, 1, 2,
				MDFLD_DSI_SEND_PACKAGE);
			if (err) {
				DRM_ERROR("%s: %d: Set MCAP\n",
				__func__, __LINE__);
				goto power_off_err;
			}
	}
	sender->work_for_slave_panel = false;
	return 0;
power_off_err:
	sender->work_for_slave_panel = false;
	err = -EIO;
	return err;
}
Beispiel #4
0
int jdi25x16_cmd_set_mode(struct mdfld_dsi_config *dsi_config)
{

	struct mdfld_dsi_pkg_sender *sender =
		mdfld_dsi_get_pkg_sender(dsi_config);
	int err;
	int i = 0;

	PSB_DEBUG_ENTRY("\n");

	if (!sender) {
		DRM_ERROR("Failed to get DSI packet sender\n");
		return -EINVAL;
	}
	for (i = 0; i < 2; i++) {
		if (i == 0)
			sender->work_for_slave_panel = false;
		else
			sender->work_for_slave_panel = true;
		mdelay(20);
		err = mdfld_dsi_send_gen_short_hs(sender,
			access_protect, 0, 2,
			MDFLD_DSI_SEND_PACKAGE);
		if (err) {
			DRM_ERROR("%s: %d: Set MCAP\n",
			__func__, __LINE__);
			goto set_mode_err;
		}

		err = mdfld_dsi_send_gen_long_hs(sender, jdi25x16_set_vid_mode,
				2,
				MDFLD_DSI_SEND_PACKAGE);
		if (err) {
			DRM_ERROR("%s: %d: Set Mode\n", __func__, __LINE__);
			goto set_mode_err;
		}
		err = mdfld_dsi_send_gen_short_hs(sender,
			access_protect, 3, 2,
			MDFLD_DSI_SEND_PACKAGE);
		if (err) {
			DRM_ERROR("%s: %d: Set MCAP\n",
			__func__, __LINE__);
			goto set_mode_err;
		}
		/* Set Display on 0x29 */
		err = mdfld_dsi_send_mcs_short_hs(sender, set_display_on, 0, 0,
				MDFLD_DSI_SEND_PACKAGE);
		if (err) {
			DRM_ERROR("%s: %d: Set Display On\n", __func__, __LINE__);
			goto set_mode_err;
		}
	}

	for (i = 0; i < 2; i++) {
		if (i == 0)
			sender->work_for_slave_panel = false;
		else
			sender->work_for_slave_panel = true;
		mdelay(20);
		err = mdfld_dsi_send_gen_short_hs(sender,
			access_protect, 0, 2,
			MDFLD_DSI_SEND_PACKAGE);
		if (err) {
			DRM_ERROR("%s: %d: Set MCAP\n",
			__func__, __LINE__);
			goto set_mode_err;
		}
		err = mdfld_dsi_send_gen_long_hs(sender, jdi25x16_set_cmd_mode,
				2,
				MDFLD_DSI_SEND_PACKAGE);
		if (err) {
			DRM_ERROR("%s: %d: Set Mode\n", __func__, __LINE__);
			goto set_mode_err;
		}
		err = mdfld_dsi_send_gen_short_hs(sender,
			access_protect, 3, 2,
			MDFLD_DSI_SEND_PACKAGE);
		if (err) {
			DRM_ERROR("%s: %d: Set MCAP\n",
			__func__, __LINE__);
			goto set_mode_err;
		}
	}
	sender->work_for_slave_panel = false;
	return 0;

set_mode_err:
	sender->work_for_slave_panel = false;
	err = -EIO;
	return err;
}
static int sharp5_cmd_power_off(struct mdfld_dsi_config *dsi_config)
{
	struct mdfld_dsi_pkg_sender *sender =
		mdfld_dsi_get_pkg_sender(dsi_config);
	int err;

	PSB_DEBUG_ENTRY("\n");

	if (!sender) {
		DRM_ERROR("Failed to get DSI packet sender\n");
		return -EINVAL;
	}

	err = mdfld_dsi_send_mcs_short_hs(sender,
			set_display_off, 0, 0,
			MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Set Display Off\n", __func__, __LINE__);
		goto power_off_err;
	}
	usleep_range(20000, 20100);

	err = mdfld_dsi_send_mcs_short_hs(sender,
			set_tear_off, 0, 0,
			MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Set Tear Off\n", __func__, __LINE__);
		goto power_off_err;
	}

	err = mdfld_dsi_send_mcs_short_hs(sender,
			enter_sleep_mode, 0, 0,
			MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Enter Sleep Mode\n", __func__, __LINE__);
		goto power_off_err;
	}

	msleep(60);

	err = mdfld_dsi_send_gen_short_hs(sender,
		access_protect, 4, 2,
		MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Set Access Protect\n", __func__, __LINE__);
		goto power_off_err;
	}

	err = mdfld_dsi_send_gen_short_hs(sender, low_power_mode, 1, 2,
					  MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Set Low Power Mode\n", __func__, __LINE__);
		goto power_off_err;
	}
	if (bias_en_gpio)
		gpio_set_value_cansleep(bias_en_gpio, 0);
	usleep_range(1000, 1500);

	return 0;
power_off_err:
	err = -EIO;
	return err;
}
Beispiel #6
0
static
int jdi_cmd_drv_ic_init(struct mdfld_dsi_config *dsi_config)
{
	struct mdfld_dsi_pkg_sender *sender
		= mdfld_dsi_get_pkg_sender(dsi_config);
	int err = 0;

	PSB_DEBUG_ENTRY("\n");

	if (!sender) {
		DRM_ERROR("Cannot get sender\n");
		return -EINVAL;
	}
	err = mdfld_dsi_send_mcs_short_hs(sender,
			exit_sleep_mode, 0, 0,
			MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Exit Sleep Mode\n",
		__func__, __LINE__);
		goto ic_init_err;
	}

	msleep(120);
	err = mdfld_dsi_send_mcs_short_hs(sender,
			write_display_brightness, 0x0, 1,
			MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Set Brightness\n",
		__func__, __LINE__);
		goto ic_init_err;
	}

	err = mdfld_dsi_send_mcs_short_hs(sender,
			write_ctrl_display, 0x24, 1,
			MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Write Control Display\n",
		__func__, __LINE__);
		goto ic_init_err;
	}

	err = mdfld_dsi_send_mcs_short_hs(sender,
			write_ctrl_cabc, STILL_IMAGE, 1,
			MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Write Control CABC\n",
		__func__, __LINE__);
		goto ic_init_err;
	}

	if (!IS_ANN(dev)) {
		err = mdfld_dsi_send_mcs_short_hs(sender,
				write_cabc_min_bright, 51, 1,
				MDFLD_DSI_SEND_PACKAGE);
		if (err) {
			DRM_ERROR("%s: %d: Write CABC minimum brightness\n",
					__func__, __LINE__);
			goto ic_init_err;
		}
	}

	err = mdfld_dsi_send_gen_short_hs(sender,
			access_protect, 4, 2,
			MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Manufacture command protect on\n",
				__func__, __LINE__);
		goto ic_init_err;
	}

	err = mdfld_dsi_send_gen_long_lp(sender,
			jdi_timing_control,
			21, MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Set panel timing\n",
				__func__, __LINE__);
		goto ic_init_err;
	}
	msleep(20);

	err = mdfld_dsi_send_mcs_short_hs(sender,
			set_tear_on, 0x00, 1,
			MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Set Tear On\n",
		__func__, __LINE__);
		goto ic_init_err;
	}

	err = mdfld_dsi_send_mcs_long_hs(sender,
			jdi_mcs_clumn_addr,
			5, MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Set Clumn Address\n",
		__func__, __LINE__);
		goto ic_init_err;
	}

	err = mdfld_dsi_send_mcs_long_hs(sender,
			jdi_mcs_page_addr,
			5, MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Set Page Address\n",
		__func__, __LINE__);
		goto ic_init_err;
	}

	return 0;

ic_init_err:
	err = -EIO;
	return err;
}
static int mdfld_dsi_jdi_power_on(struct mdfld_dsi_config *dsi_config)
{
	struct mdfld_dsi_pkg_sender *sender =
		mdfld_dsi_get_pkg_sender(dsi_config);
	int err;

	PSB_DEBUG_ENTRY("\n");

	if (!sender) {
		DRM_ERROR("Failed to get DSI packet sender\n");
		return -EINVAL;
	}

	/* Sleep Out */
	err = mdfld_dsi_send_mcs_short_hs(sender, exit_sleep_mode, 0, 0,
			MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Exit Sleep Mode\n", __func__, __LINE__);
		goto power_on_err;
	}
	/* Wait for 6 frames after exit_sleep_mode. */
	msleep(100);

	err = mdfld_dsi_send_gen_short_hs(sender,access_protect, 0x4, 2,
                        MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Set MCAP\n",__func__, __LINE__);
		goto power_on_err;
	}

	err = mdfld_dsi_send_gen_long_hs(sender, jdi_set_mode,2,
			MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Set Mode\n", __func__, __LINE__);
		goto power_on_err;
	}

	err = mdfld_dsi_send_gen_short_hs(sender,access_protect, 0x3, 2,
                        MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Set MCAP\n",__func__, __LINE__);
		goto power_on_err;
	}

	/* Set Display on */
	err = mdfld_dsi_send_mcs_short_hs(sender, set_display_on, 0, 0,
			MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Set Display On\n", __func__, __LINE__);
		goto power_on_err;
	}
	/* Wait for 1 frame after set_display_on. */
	msleep(20);

	/* Send TURN_ON packet */
	err = mdfld_dsi_send_dpi_spk_pkg_hs(sender, MDFLD_DSI_DPI_SPK_TURN_ON);
	if (err) {
		DRM_ERROR("Failed to send turn on packet\n");
		goto power_on_err;
	}

	/* Write control display */
	err = mdfld_dsi_send_mcs_short_hs(sender, write_ctrl_display, 0x24, 1,
			MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Write Control Display\n", __func__,
				__LINE__);
		goto power_on_err;
	}

	return 0;

power_on_err:
	err = -EIO;
	return err;
}
static int mdfld_dsi_sharp10x19_power_off(
			struct mdfld_dsi_config *dsi_config)
{

	struct mdfld_dsi_pkg_sender *sender =
		mdfld_dsi_get_pkg_sender(dsi_config);
	int err;

	PSB_DEBUG_ENTRY("Turn off video mode TMD panel...\n");
	if (!sender) {
		DRM_ERROR("Failed to get DSI packet sender\n");
		return -EINVAL;
	}
	/*send SHUT_DOWN packet*/
	err = mdfld_dsi_send_dpi_spk_pkg_hs(sender,
				MDFLD_DSI_DPI_SPK_SHUT_DOWN);
	if (err) {
		DRM_ERROR("Failed to send turn off packet\n");
		goto power_off_err;
	}
	msleep(100);

	/* Set Display off */
	err = mdfld_dsi_send_mcs_short_hs(sender, set_display_off, 0, 0,
			MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Set Display Off\n", __func__, __LINE__);
		goto power_off_err;
	}
	/* Wait for 1 frame after set_display_on. */
	msleep(20);

	/* Sleep In */
	err = mdfld_dsi_send_mcs_short_hs(sender, enter_sleep_mode, 0, 0,
			MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Enter Sleep Mode\n", __func__, __LINE__);
		goto power_off_err;
	}
	msleep(60);
	err = mdfld_dsi_send_gen_short_hs(sender,
		access_protect, 4, 2,
		MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Set Access Protect\n", __func__, __LINE__);
		goto power_off_err;
	}
	err = mdfld_dsi_send_gen_short_hs(sender, low_power_mode, 1, 2,
					  MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Set Low Power Mode\n", __func__, __LINE__);
		goto power_off_err;
	}
	if (bias_en_gpio)
		gpio_set_value_cansleep(bias_en_gpio, 0);
	if (mipi_reset_gpio)
		gpio_set_value_cansleep(mipi_reset_gpio, 0);
	usleep_range(1000, 1500);
	return 0;

power_off_err:
	return -EIO;
}
static int mdfld_dsi_sharp10x19_power_on(
		struct mdfld_dsi_config *dsi_config)
{

	struct mdfld_dsi_pkg_sender *sender =
		mdfld_dsi_get_pkg_sender(dsi_config);
	int err;

	PSB_DEBUG_ENTRY("Turn on video mode TMD panel...\n");

	if (!sender) {
		DRM_ERROR("Failed to get DSI packet sender\n");
		return -EINVAL;
	}
	err = mdfld_dsi_send_mcs_short_hs(sender,
						  exit_sleep_mode, 0, 0, MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: exit_sleep_mode\n", __func__, __LINE__);
		goto power_on_err;
	}
	msleep(120);

	/* Set Display on 0x29 */
	err = mdfld_dsi_send_mcs_short_hs(sender, set_display_on, 0, 0,
			MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Set Display On\n", __func__, __LINE__);
		goto power_on_err;
	}

	/*send TURN_ON packet*/
	err = mdfld_dsi_send_dpi_spk_pkg_hs(sender,
				MDFLD_DSI_DPI_SPK_TURN_ON);
	if (err) {
		DRM_ERROR("Failed to send turn on packet\n");
		return err;
	}

	err = mdfld_dsi_send_gen_short_hs(sender,access_protect, 0x4, 2,
                        MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Set MCAP\n",__func__, __LINE__);
		goto power_on_err;
	}

	err = mdfld_dsi_send_gen_long_hs(sender, sharp10x19_set_mode, 2,
			MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Set Mode\n", __func__, __LINE__);
		goto power_on_err;
	}

	msleep(20);

	err = mdfld_dsi_send_mcs_short_hs(sender,
			write_display_brightness, 0x10, 1, MDFLD_DSI_SEND_PACKAGE);
	if (err) {
		DRM_ERROR("%s: %d: Set Brightness\n", __func__, __LINE__);
		goto power_on_err;
	}

	return 0;
power_on_err:
	err = -EIO;
	return err;
}
Beispiel #10
0
static int sharp10x19_cmd_power_off(struct mdfld_dsi_config *dsi_config)
{
	struct mdfld_dsi_pkg_sender *sender =
		mdfld_dsi_get_pkg_sender(dsi_config);
	struct drm_device *dev = dsi_config->dev;
	int err;
	int i;
	int loop = 1;

	PSB_DEBUG_ENTRY("\n");

	if (!sender) {
		DRM_ERROR("Failed to get DSI packet sender\n");
		return -EINVAL;
	}
	if (is_dual_panel(dev))
		loop = 2;

	for(i = 0; i < loop; i++) {
		if (i == 0)
			sender->work_for_slave_panel = false;
		else
			sender->work_for_slave_panel = true;

		err = mdfld_dsi_send_mcs_short_hs(sender,
				set_display_off, 0, 0,
				MDFLD_DSI_SEND_PACKAGE);
		if (err) {
			DRM_ERROR("%s: %d: Set Display Off\n", __func__, __LINE__);
			goto power_off_err;
		}
		usleep_range(20000, 20100);

		err = mdfld_dsi_send_mcs_short_hs(sender,
				set_tear_off, 0, 0,
				MDFLD_DSI_SEND_PACKAGE);
		if (err) {
			DRM_ERROR("%s: %d: Set Tear Off\n", __func__, __LINE__);
			goto power_off_err;
		}

		err = mdfld_dsi_send_mcs_short_hs(sender,
				enter_sleep_mode, 0, 0,
				MDFLD_DSI_SEND_PACKAGE);
		if (err) {
			DRM_ERROR("%s: %d: Enter Sleep Mode\n", __func__, __LINE__);
			goto power_off_err;
		}

		msleep(60);

		err = mdfld_dsi_send_gen_short_hs(sender,
			access_protect, 4, 2,
			MDFLD_DSI_SEND_PACKAGE);
		if (err) {
			DRM_ERROR("%s: %d: Set Access Protect\n", __func__, __LINE__);
			goto power_off_err;
		}

		err = mdfld_dsi_send_gen_short_hs(sender, low_power_mode, 1, 2,
						  MDFLD_DSI_SEND_PACKAGE);
		if (err) {
			DRM_ERROR("%s: %d: Set Low Power Mode\n", __func__, __LINE__);
			goto power_off_err;
		}
		if (bias_en_gpio)
			gpio_set_value_cansleep(bias_en_gpio, 0);
		usleep_range(1000, 1500);
	}
	sender->work_for_slave_panel = false;
	return 0;
power_off_err:
	sender->work_for_slave_panel = false;
	err = -EIO;
	return err;
}