static void mdfld_dsi_dpi_save(struct drm_encoder *encoder) { struct mdfld_dsi_encoder *dsi_encoder; struct mdfld_dsi_config *dsi_config; struct drm_device *dev; int pipe; if (!encoder) return; PSB_DEBUG_ENTRY("\n"); dsi_encoder = MDFLD_DSI_ENCODER(encoder); dsi_config = mdfld_dsi_encoder_get_config(dsi_encoder); dev = dsi_config->dev; pipe = mdfld_dsi_encoder_get_pipe(dsi_encoder); DCLockMutex(); __mdfld_dsi_dpi_set_power(encoder, false); drm_handle_vblank(dev, pipe); /* Turn off vsync interrupt. */ drm_vblank_off(dev, pipe); /* Make the pending flip request as completed. */ DCUnAttachPipe(pipe); DC_MRFLD_onPowerOff(pipe); DCUnLockMutex(); }
static void mdfld_dsi_dpi_restore(struct drm_encoder *encoder) { struct mdfld_dsi_encoder *dsi_encoder; struct mdfld_dsi_config *dsi_config; struct drm_device *dev; int pipe; if (!encoder) return; PSB_DEBUG_ENTRY("\n"); dsi_encoder = MDFLD_DSI_ENCODER(encoder); dsi_config = mdfld_dsi_encoder_get_config(dsi_encoder); dev = dsi_config->dev; pipe = mdfld_dsi_encoder_get_pipe(dsi_encoder); DCLockMutex(); __mdfld_dsi_dpi_set_power(encoder, true); DCAttachPipe(pipe); DC_MRFLD_onPowerOn(pipe); DCUnLockMutex(); }
static void mdfld_dsi_dpi_commit(struct drm_encoder *encoder) { struct mdfld_dsi_encoder *dsi_encoder; struct mdfld_dsi_dpi_output *dpi_output; struct mdfld_dsi_hw_context *ctx; struct mdfld_dsi_config *dsi_config; struct drm_device *dev; u32 temp_val = 0; PSB_DEBUG_ENTRY("\n"); dsi_encoder = MDFLD_DSI_ENCODER(encoder); dpi_output = MDFLD_DSI_DPI_OUTPUT(dsi_encoder); dsi_config = mdfld_dsi_encoder_get_config(dsi_encoder); dev = dsi_config->dev; ctx = &dsi_config->dsi_hw_context; if (!ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND, OSPM_UHB_FORCE_POWER_ON)) return; temp_val = REG_READ(PIPEACONF); temp_val &= ~(BIT27 | BIT28); /* Setup pipe configuration for different panels*/ REG_WRITE(PIPEACONF, temp_val | (ctx->pipeconf & (BIT27 | BIT28))); ospm_power_using_hw_end(OSPM_DISPLAY_ISLAND); /*Everything is ready, commit DSI hw context to HW*/ __mdfld_dsi_dpi_set_power(encoder, true); dpi_output->first_boot = 0; }
static void mdfld_dsi_dpi_restore(struct drm_encoder *encoder) { if (!encoder) return; PSB_DEBUG_ENTRY("\n"); __mdfld_dsi_dpi_set_power(encoder, true); }
static void mdfld_dsi_dpi_commit(struct drm_encoder *encoder) { struct mdfld_dsi_encoder *dsi_encoder; struct mdfld_dsi_dpi_output *dpi_output; PSB_DEBUG_ENTRY("\n"); dsi_encoder = MDFLD_DSI_ENCODER(encoder); dpi_output = MDFLD_DSI_DPI_OUTPUT(dsi_encoder); /*Everything is ready, commit DSI hw context to HW*/ __mdfld_dsi_dpi_set_power(encoder, true); dpi_output->first_boot = 0; }
void mdfld_dsi_dpi_set_power(struct drm_encoder *encoder, bool on) { struct mdfld_dsi_encoder *dsi_encoder = MDFLD_DSI_ENCODER(encoder); struct mdfld_dsi_config *dsi_config = mdfld_dsi_encoder_get_config(dsi_encoder); struct drm_device *dev; struct drm_psb_private *dev_priv; struct mdfld_dsi_dpi_output *dpi_output = NULL; u32 mipi_reg = MIPI; u32 pipeconf_reg = PIPEACONF; int pipe; if (!dsi_config) { DRM_ERROR("dsi_config is NULL\n"); return; } pipe = mdfld_dsi_encoder_get_pipe(dsi_encoder); dev = dsi_config->dev; dev_priv = dev->dev_private; PSB_DEBUG_ENTRY("set power %s on pipe %d\n", on ? "On" : "Off", pipe); dpi_output = MDFLD_DSI_DPI_OUTPUT(dsi_encoder); if (pipe) if (!(dev_priv->panel_desc & DISPLAY_B) || !(dev_priv->panel_desc & DISPLAY_C)) return; if (pipe) { mipi_reg = MIPI_C; pipeconf_reg = PIPECCONF; } /** * if TMD panel call new power on/off sequences instead. * NOTE: refine TOSHIBA panel code later */ __mdfld_dsi_dpi_set_power(encoder, on); }
void mdfld_dsi_dpi_set_power(struct drm_encoder *encoder, bool on) { struct mdfld_dsi_encoder *dsi_encoder = MDFLD_DSI_ENCODER(encoder); struct mdfld_dsi_config *dsi_config = mdfld_dsi_encoder_get_config(dsi_encoder); int pipe = mdfld_dsi_encoder_get_pipe(dsi_encoder); struct drm_device *dev = dsi_config->dev; struct drm_psb_private *dev_priv = dev->dev_private; struct mdfld_dsi_dpi_output *dpi_output = NULL; u32 mipi_reg = MIPI; u32 pipeconf_reg = PIPEACONF; PSB_DEBUG_ENTRY("set power %s on pipe %d\n", on ? "On" : "Off", pipe); dpi_output = MDFLD_DSI_DPI_OUTPUT(dsi_encoder); if (pipe) if (!(dev_priv->panel_desc & DISPLAY_B) || !(dev_priv->panel_desc & DISPLAY_C)) return; if (pipe) { mipi_reg = MIPI_C; pipeconf_reg = PIPECCONF; } /*start up display island if it was shutdown*/ if (!ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND, OSPM_UHB_FORCE_POWER_ON)) return; /** * if TMD panel call new power on/off sequences instead. * NOTE: refine TOSHIBA panel code later */ __mdfld_dsi_dpi_set_power(encoder, on); ospm_power_using_hw_end(OSPM_DISPLAY_ISLAND); }
static void mdfld_dsi_dpi_save(struct drm_encoder *encoder) { struct mdfld_dsi_encoder *dsi_encoder; struct mdfld_dsi_config *dsi_config; struct drm_device *dev; int pipe; if (!encoder) return; PSB_DEBUG_ENTRY("\n"); dsi_encoder = MDFLD_DSI_ENCODER(encoder); dsi_config = mdfld_dsi_encoder_get_config(dsi_encoder); dev = dsi_config->dev; pipe = mdfld_dsi_encoder_get_pipe(dsi_encoder); DCLockMutex(); /* give time to the last flip to take effective, * if we disable hardware too quickly, overlay hardware may crash, * causing pipe hang next time when we try to use overlay */ msleep(50); DC_MRFLD_onPowerOff(pipe); msleep(50); __mdfld_dsi_dpi_set_power(encoder, false); drm_handle_vblank(dev, pipe); /* Turn off vsync interrupt. */ drm_vblank_off(dev, pipe); /* Make the pending flip request as completed. */ DCUnAttachPipe(pipe); DCUnLockMutex(); }