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; }
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; }
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; }
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; }
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; }