static void mdfld_generic_dsi_dbi_restore(struct drm_encoder *encoder) { struct mdfld_dsi_encoder *dsi_encoder; struct mdfld_dsi_config *dsi_config; struct drm_device *dev; int pipe; PSB_DEBUG_ENTRY("\n"); if (!encoder) return; 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_generic_dsi_dbi_set_power(encoder, true); DCAttachPipe(pipe); DC_MRFLD_onPowerOn(pipe); DCUnLockMutex(); }
static void mdfld_generic_dsi_dbi_save(struct drm_encoder *encoder) { struct mdfld_dsi_encoder *dsi_encoder; struct mdfld_dsi_config *dsi_config; struct drm_device *dev; int pipe; PSB_DEBUG_ENTRY("\n"); if (!encoder) return; 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_generic_dsi_dbi_set_power(encoder, false); drm_handle_vblank(dev, pipe); /* Turn off vsync (TE) interrupt. */ drm_vblank_off(dev, pipe); /* Make the pending flip request as completed. */ DCUnAttachPipe(pipe); DC_MRFLD_onPowerOff(pipe); DCUnLockMutex(); }
static void mdfld_generic_dsi_dbi_dpms(struct drm_encoder *encoder, int mode) { struct mdfld_dsi_encoder *dsi_encoder; struct mdfld_dsi_dbi_output *dbi_output; struct drm_device *dev; struct mdfld_dsi_config *dsi_config; struct drm_psb_private *dev_priv; dsi_encoder = MDFLD_DSI_ENCODER(encoder); dsi_config = mdfld_dsi_encoder_get_config(dsi_encoder); if (!dsi_config) { DRM_ERROR("dsi_config is NULL\n"); return; } dbi_output = MDFLD_DSI_DBI_OUTPUT(dsi_encoder); dev = dsi_config->dev; dev_priv = dev->dev_private; PSB_DEBUG_ENTRY("%s\n", (mode == DRM_MODE_DPMS_ON ? "on" : "off")); mutex_lock(&dev_priv->dpms_mutex); DCLockMutex(); if (mode == DRM_MODE_DPMS_ON) { mdfld_generic_dsi_dbi_set_power(encoder, true); DCAttachPipe(dsi_config->pipe); DC_MRFLD_onPowerOn(dsi_config->pipe); } else { mdfld_generic_dsi_dbi_set_power(encoder, false); drm_handle_vblank(dev, dsi_config->pipe); /* Turn off TE interrupt. */ drm_vblank_off(dev, dsi_config->pipe); /* Make the pending flip request as completed. */ DCUnAttachPipe(dsi_config->pipe); DC_MRFLD_onPowerOff(dsi_config->pipe); } DCUnLockMutex(); mutex_unlock(&dev_priv->dpms_mutex); }
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(); }
static void mdfld_dsi_dpi_dpms(struct drm_encoder *encoder, int mode) { struct mdfld_dsi_encoder *dsi_encoder; struct mdfld_dsi_config *dsi_config; struct drm_device *dev; struct drm_psb_private *dev_priv; struct mdfld_dsi_dpi_output *dpi_output; struct panel_funcs *p_funcs; dsi_encoder = MDFLD_DSI_ENCODER(encoder); dsi_config = mdfld_dsi_encoder_get_config(dsi_encoder); if (!dsi_config) { DRM_ERROR("dsi_config is NULL\n"); return; } dev = dsi_config->dev; dev_priv = dev->dev_private; dpi_output = MDFLD_DSI_DPI_OUTPUT(dsi_encoder); p_funcs = dpi_output->p_funcs; PSB_DEBUG_ENTRY("%s\n", (mode == DRM_MODE_DPMS_ON ? "on" : DRM_MODE_DPMS_STANDBY == mode ? "standby" : "off")); mutex_lock(&dev_priv->dpms_mutex); DCLockMutex(); if (mode == DRM_MODE_DPMS_ON) { mdfld_dsi_dpi_set_power(encoder, true); DCAttachPipe(dsi_config->pipe); DC_MRFLD_onPowerOn(dsi_config->pipe); #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE { struct mdfld_dsi_hw_context *ctx = &dsi_config->dsi_hw_context; struct backlight_device bd; bd.props.brightness = ctx->lastbrightnesslevel; psb_set_brightness(&bd); } #endif } else if (mode == DRM_MODE_DPMS_STANDBY) { #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE struct mdfld_dsi_hw_context *ctx = &dsi_config->dsi_hw_context; struct backlight_device bd; ctx->lastbrightnesslevel = psb_get_brightness(&bd); bd.props.brightness = 0; psb_set_brightness(&bd); #endif /* Make the pending flip request as completed. */ DCUnAttachPipe(dsi_config->pipe); msleep(50); DC_MRFLD_onPowerOff(dsi_config->pipe); msleep(50); } else { mdfld_dsi_dpi_set_power(encoder, false); drm_handle_vblank(dev, dsi_config->pipe); /* Turn off TE interrupt. */ drm_vblank_off(dev, dsi_config->pipe); /* Make the pending flip request as completed. */ DCUnAttachPipe(dsi_config->pipe); DC_MRFLD_onPowerOff(dsi_config->pipe); } DCUnLockMutex(); mutex_unlock(&dev_priv->dpms_mutex); }