/* generic dbi function */ static int mdfld_generic_dsi_dbi_set_power(struct drm_encoder *encoder, bool on) { struct mdfld_dsi_encoder *dsi_encoder; struct mdfld_dsi_dbi_output *dbi_output; struct mdfld_dsi_connector *dsi_connector; struct mdfld_dsi_config *dsi_config; struct panel_funcs *p_funcs; struct drm_device *dev; struct drm_psb_private *dev_priv; int pipe = 0; if (!encoder) { DRM_ERROR("Invalid encoder\n"); return -EINVAL; } PSB_DEBUG_ENTRY("%s\n", (on ? "on" : "off")); dsi_encoder = MDFLD_DSI_ENCODER(encoder); dbi_output = MDFLD_DSI_DBI_OUTPUT(dsi_encoder); dsi_config = mdfld_dsi_encoder_get_config(dsi_encoder); dsi_connector = mdfld_dsi_encoder_get_connector(dsi_encoder); if (!dsi_connector) { DRM_ERROR("dsi_connector is NULL\n"); return -EINVAL; } p_funcs = dbi_output->p_funcs; dev = encoder->dev; dev_priv = dev->dev_private; pipe = dsi_config->pipe; mutex_lock(&dsi_config->context_lock); if (dsi_connector->status != connector_status_connected) goto set_power_err; if (dbi_output->first_boot && dsi_config->dsi_hw_context.panel_on) { if (on) { /* When using smooth transition, * wake up ESD detection thread. */ mdfld_dsi_error_detector_wakeup(dsi_connector); } DRM_INFO("skip panle power setting for first boot! " \ "panel is already powered on\n"); goto fun_exit; } switch (on) { case true: /* panel is already on */ if (dsi_config->dsi_hw_context.panel_on) goto fun_exit; if (__dbi_panel_power_on(dsi_config, p_funcs)) { DRM_ERROR("Faild to turn on panel\n"); goto set_power_err; } dsi_config->dsi_hw_context.panel_on = 1; dbi_output->dbi_panel_on = 1; mdfld_dsi_error_detector_wakeup(dsi_connector); break; case false: if (!dsi_config->dsi_hw_context.panel_on && !dbi_output->first_boot) goto fun_exit; if (__dbi_panel_power_off(dsi_config, p_funcs)) { DRM_ERROR("Faild to turn off panel\n"); goto set_power_err; } dsi_config->dsi_hw_context.panel_on = 0; dbi_output->dbi_panel_on = 0; break; default: break; } fun_exit: mutex_unlock(&dsi_config->context_lock); PSB_DEBUG_ENTRY("successfully\n"); return 0; set_power_err: mutex_unlock(&dsi_config->context_lock); PSB_DEBUG_ENTRY("unsuccessfully!\n"); return -EAGAIN; }
int mdfld_panel_generic_dsi_dbi_set_power(struct drm_encoder *encoder, bool on) { int ret = 0; struct mdfld_dsi_encoder *dsi_encoder = MDFLD_DSI_ENCODER(encoder); struct mdfld_dsi_dbi_output *dbi_output = MDFLD_DSI_DBI_OUTPUT(dsi_encoder); struct panel_funcs *p_funcs = dbi_output->p_funcs; struct mdfld_dsi_connector *dsi_connector = mdfld_dsi_encoder_get_connector(dsi_encoder); struct mdfld_dsi_config *dsi_config = mdfld_dsi_encoder_get_config(dsi_encoder); struct drm_device *dev = encoder->dev; struct drm_psb_private *dev_priv = dev->dev_private; u32 reg_offset = 0; int pipe = (dbi_output->channel_num == 0) ? 0 : 2; PSB_DEBUG_ENTRY("pipe %d : %s, panel on: %s\n", pipe, on ? "On" : "Off", dbi_output->dbi_panel_on ? "True" : "False"); if (pipe == 2) { if (on) dev_priv->dual_mipi = true; else dev_priv->dual_mipi = false; reg_offset = MIPIC_REG_OFFSET; } else { if (!on) dev_priv->dual_mipi = false; } if (!ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND, OSPM_UHB_FORCE_POWER_ON)) { DRM_ERROR("hw begin failed\n"); return -EAGAIN; } mutex_lock(&dsi_config->context_lock); if (on) { if (dbi_output->dbi_panel_on) goto out_err; ret = mdfld_panel_generic_dsi_dbi_power_on(encoder); if (ret) { DRM_ERROR("power on error\n"); goto out_err; } dbi_output->dbi_panel_on = true; if (pipe == 2) dev_priv->dbi_panel_on2 = true; else dev_priv->dbi_panel_on = true; if (dev_priv->platform_rev_id != MDFLD_PNW_A0) mdfld_enable_te(dev, pipe); /* wake up error detector if ESD enabled */ if (p_funcs->esd_detection) mdfld_dsi_error_detector_wakeup(dsi_connector); else PSB_DEBUG_ENTRY("ESD detection disabled\n"); dsi_config->dsi_hw_context.panel_on = 1; } else { if (!dbi_output->dbi_panel_on && !dbi_output->first_boot) goto out_err; dbi_output->dbi_panel_on = false; dbi_output->first_boot = false; if (pipe == 2) dev_priv->dbi_panel_on2 = false; else dev_priv->dbi_panel_on = false; if (dev_priv->platform_rev_id != MDFLD_PNW_A0) mdfld_disable_te(dev, pipe); ret = mdfld_panel_generic_dsi_dbi_power_off(encoder); if (ret) { DRM_ERROR("power on error\n"); goto out_err; } dsi_config->dsi_hw_context.panel_on = 0; } out_err: mutex_unlock(&dsi_config->context_lock); ospm_power_using_hw_end(OSPM_DISPLAY_ISLAND); if (ret) DRM_ERROR("failed\n"); else PSB_DEBUG_ENTRY("successfully\n"); return ret; }