struct workqueue_struct *hpd_detect;
pfn_screen_event_handler pvr_screen_event_handler;
struct mutex dpms_mutex;
+
+ /* fix Lock screen flip in resume issue */
+ unsigned long init_screen_start;
+ unsigned long init_screen_offset;
};
struct psb_fpriv {
drm_fb_helper_fill_fix(info, fb->pitch, fb->depth);
if (get_panel_type(dev, 0) == TMD_6X10_VID)
- drm_fb_helper_fill_var(info, &fbdev->psb_fb_helper, sizes->fb_width-200, sizes->fb_height);
+ drm_fb_helper_fill_var(info, &fbdev->psb_fb_helper, fb->width, fb->height);
else
- drm_fb_helper_fill_var(info, &fbdev->psb_fb_helper, sizes->fb_width, sizes->fb_height);
+ drm_fb_helper_fill_var(info, &fbdev->psb_fb_helper, fb->width, fb->height);
info->fix.mmio_start = pci_resource_start(dev->pdev, 0);
info->fix.mmio_len = pci_resource_len(dev->pdev, 0);
struct psb_framebuffer *mdfld_fb;
struct psb_intel_mode_device *mode_dev;
struct mdfld_dsi_hw_context *ctx;
+ struct drm_psb_private *dev_priv;
int fb_bpp;
int fb_pitch;
int fb_depth;
int hdelay;
+ static int init_flag = 1; /*bootstrap flag*/
if (!crtc || !crtc->fb) {
DRM_ERROR("Invalid CRTC\n");
fb_pitch = crtc->fb->pitch;
fb_depth = crtc->fb->depth;
dev = crtc->dev;
+ dev_priv = (struct drm_psb_private *)dev->dev_private;
mutex_lock(&dsi_config->context_lock);
ctx->dspsurf = mode_dev->bo_offset(dev, mdfld_fb);
ctx->dsplinoff = y * fb_pitch + x * (fb_bpp / 8);
+ if (init_flag == 1) {
+ printk(KERN_DEBUG"%s: ctx->dspsurf = 0x%x, ctx->dsplinoff = 0x%x\n",
+ __func__, ctx->dsplinoff, ctx->dspsurf);
+ dev_priv->init_screen_start = ctx->dspsurf;
+ dev_priv->init_screen_offset = ctx->dsplinoff;
+ init_flag = 0;
+ }
+
switch (fb_bpp) {
case 8:
ctx->dspcntr = DISPPLANE_8BPP;
};
mdfld_hdmi_timing_t mdfld_hdmi_video_mode_table[] = {
- {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
- {2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
- {3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
- {4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* 640*480/60 */
+ {640, 480, 60, 25200, 800, 640, 800, 656, 752, 525, 480, 525, 490, 492},
+ /* 720*480/60 */
+ {720, 480, 60, 27027, 858, 720, 858, 736, 798, 525, 480, 525, 489, 495},
+ /* 720*480/60-16:9 */
+ {720, 480, 60, 27027, 858, 720, 858, 736, 798, 525, 480, 525, 489, 495},
+ /* 1280*720/60 */
+ {1280, 720, 60, 74250, 1650, 1280, 1650, 1390, 1430, 750, 720, 750, 725, 730},
{5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
- {19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* 1280*720/50 */
+ {1280, 720, 50, 74250, 1980, 1280, 1980, 1720, 1760, 750, 720, 750, 725, 730},
{20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
PSB_DEBUG_ENTRY("%s\n", __func__);
+ if(unlikely(!mode))
+ {
+ PSB_DEBUG_ENTRY("display mode is NULL!\n");
+ return 0;
+ }
+
/*get edid infomation*/
if (connector && connector->edid_blob_ptr) {
edid_block = connector->edid_blob_ptr->data;
int dspcntr_reg = DSPBCNTR;
int dspbase_reg = MRST_DSPBBASE;
struct drm_device *dev = encoder->dev;
+ struct psb_intel_output *output = enc_to_psb_intel_output(encoder);
+ struct mid_intel_hdmi_priv *hdmi_priv = output->dev_priv;
u32 temp;
PSB_DEBUG_ENTRY("\n");
OSPM_UHB_FORCE_POWER_ON))
return ;
+ hdmi_priv->need_encoder_restore = true;
+
/*Use Disable pipeB plane to turn off HDMI screen
in early_suspend */
temp = REG_READ(dspcntr_reg);
{
int dspcntr_reg = DSPBCNTR;
int dspbase_reg = MRST_DSPBBASE;
+ int dspbsurf_reg = DSPBSURF;
+ int dspblinoff_reg = DSPBLINOFF;
struct drm_device *dev = encoder->dev;
struct drm_psb_private *dev_priv =
(struct drm_psb_private *)dev->dev_private;
u32 temp;
PSB_DEBUG_ENTRY("\n");
+ if(unlikely(!(hdmi_priv->need_encoder_restore)))
+ return;
+
+ hdmi_priv->need_encoder_restore = false;
+
if (!ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND,
OSPM_UHB_FORCE_POWER_ON))
return ;
+ /*Set DSPBSURF to systemBuffer temporary to avoid hdmi display last picture*/
+ REG_WRITE(dspbsurf_reg, dev_priv->init_screen_start);
+ REG_WRITE(dspblinoff_reg, dev_priv->init_screen_offset);
+
/*Restore pipe B plane to turn on HDMI screen
in late_resume*/
temp = REG_READ(dspcntr_reg);
vic = *(c + j) & 0x7F;
printk("vic: %d\n", vic);
- if (vic == 34 || vic == 32 || vic == 33) {
+ if (vic == 34 || vic == 32 || vic == 33 ||
+ vic == 1 || vic == 2 || vic == 3 ||
+ vic == 4 || vic == 19) {
p_video_mode = &mdfld_hdmi_video_mode_table[vic - 1];
mode = drm_mode_create(dev);
ret += 1;
}
}
-
if (ret <= 0) {
/*
* Didn't get an EDID, so set wide sync ranges so we get all
}
}
- return ret;
+ return ret;
}
static int mdfld_hdmi_mode_valid(struct drm_connector *connector,
/*FIXME: May need to get this somewhere, but CG code seems hard coded it*/
hdmi_priv->hdmib_reg = HDMIB_CONTROL;
hdmi_priv->has_hdmi_sink = false;
+ hdmi_priv->need_encoder_restore = false;
psb_intel_output->dev_priv = hdmi_priv;
drm_encoder_helper_add(encoder, &mdfld_hdmi_helper_funcs);
struct drm_display_mode *edid_preferred_mode;
bool is_hardcode_edid;
struct drm_display_mode *current_mode;
+ bool need_encoder_restore;
};
struct hdmi_edid_info {
int videoenc_access_count;
int videodec_access_count;
int display_access_count;
-
+#if (defined(CONFIG_SND_INTELMID_HDMI_AUDIO) || \
+ defined(CONFIG_SND_INTELMID_HDMI_AUDIO_MODULE))
+ struct drm_psb_private *dev_priv = gpDrmDevice->dev_private;
+ struct snd_intel_had_interface *had_interface = dev_priv->had_interface;
+ int hdmi_audio_busy = 0;
+ pm_event_t hdmi_audio_event;
+#endif
if(gbSuspendInProgress || gbResumeInProgress)
{
#ifdef OSPM_GFX_DPK
#ifdef OSPM_GFX_DPK
printk(KERN_ALERT "%s\n", __func__);
#endif
-
mutex_lock(&g_ospm_mutex);
if (!gbSuspended) {
graphics_access_count = atomic_read(&g_graphics_access_count);
videoenc_access_count = atomic_read(&g_videoenc_access_count);
videodec_access_count = atomic_read(&g_videodec_access_count);
display_access_count = atomic_read(&g_display_access_count);
+#if (defined(CONFIG_SND_INTELMID_HDMI_AUDIO) || \
+ defined(CONFIG_SND_INTELMID_HDMI_AUDIO_MODULE))
+ if (dev_priv->had_pvt_data && hdmi_state) {
+ hdmi_audio_event.event = 0;
+ hdmi_audio_busy =
+ had_interface->suspend(dev_priv->had_pvt_data,
+ hdmi_audio_event);
+ }
+#endif
- if (graphics_access_count ||
- videoenc_access_count ||
- videodec_access_count ||
- display_access_count)
+ if (graphics_access_count
+ || videoenc_access_count
+ || videodec_access_count
+ || display_access_count
+#if (defined(CONFIG_SND_INTELMID_HDMI_AUDIO) || \
+ defined(CONFIG_SND_INTELMID_HDMI_AUDIO_MODULE))
+ || hdmi_audio_busy
+#endif
+ )
ret = -EBUSY;
if (!ret) {
gbSuspendInProgress = true;
pm_message_t state;
int ret = 0;
state.event = 0;
-
-#if (defined(CONFIG_SND_INTELMID_HDMI_AUDIO) || \
- defined(CONFIG_SND_INTELMID_HDMI_AUDIO_MODULE))
- struct drm_psb_private* dev_priv = gpDrmDevice->dev_private;
- int hdmi_audio_busy = 0;
- struct snd_intel_had_interface *had_interface = dev_priv->had_interface;
- pm_event_t hdmi_audio_event;
- char *uevent_string = NULL;
-
- if (dev_priv->had_pvt_data && hdmi_state) {
- hdmi_audio_event.event = 0;
- hdmi_audio_busy =
- had_interface->suspend(dev_priv->had_pvt_data,
- hdmi_audio_event);
-
- if (!hdmi_audio_busy) {
- uevent_string = "HDMI_AUDIO_PM_SUSPENDED=1";
- psb_sysfs_uevent(dev_priv->dev, uevent_string);
- }
- }
-#endif
-
#ifdef OSPM_GFX_DPK
printk(KERN_ALERT "%s\n", __func__);
#endif
if (atomic_read(&g_graphics_access_count) || atomic_read(&g_videoenc_access_count)
|| (gbdispstatus == true)
- || atomic_read(&g_videodec_access_count) || atomic_read(&g_display_access_count)
-#if (defined(CONFIG_SND_INTELMID_HDMI_AUDIO) || \
- defined(CONFIG_SND_INTELMID_HDMI_AUDIO_MODULE))
- || hdmi_audio_busy
-#endif
- ) {
+ || atomic_read(&g_videodec_access_count) || atomic_read(&g_display_access_count)){
#ifdef OSPM_GFX_DPK
printk(KERN_ALERT "GFX:%d VEC:%d VED:%d DC:%d DSR:%d\n",
atomic_read(&g_graphics_access_count),
while (time_before_eq(jiffies, wait_timeout))
cpu_relax();
- mdfld_dsi_send_gen_long_hs(sender, pr2_mcs_protect_off, 1, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_pixel_format, 1, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_dsi_control, 1, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_panel_driving, 2, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_v_timing, 2, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_control, 1, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_test_mode_0, 1, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_h_timing, 4, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_can_skip, 1, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_gamma_set_a, 4, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_gamma_set_b, 4, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_gamma_set_c, 4, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_charge_pump_setting, 2, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_test_mode_1, 2, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_source_amplifiers, 1, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_power_supply_circuit, 1, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_vreg_setting, 1, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_test_mode_2, 1, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_timing_control_0, 3, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_timing_control_1, 2, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_timing_control_2, 1, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_white_balance, 2, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_vcs_setting, 1, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_vcom_dc_setting, 1, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_test_mode_3, 2, 0);
- mdfld_dsi_send_gen_long_hs(sender, pr2_mcs_protect_on, 1, 0);
- mdfld_dsi_send_mcs_long_hs(sender, pr2_set_address_mode, 1, 0);
- mdfld_dsi_send_mcs_long_hs(sender, pr2_set_pixel_format, 1, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_mcs_protect_off, 1, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_pixel_format, 1, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_dsi_control, 1, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_panel_driving, 2, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_v_timing, 2, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_control, 1, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_test_mode_0, 1, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_h_timing, 4, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_can_skip, 1, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_gamma_set_a, 4, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_gamma_set_b, 4, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_gamma_set_c, 4, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_charge_pump_setting, 2, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_test_mode_1, 2, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_source_amplifiers, 1, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_power_supply_circuit, 1, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_vreg_setting, 1, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_test_mode_2, 1, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_timing_control_0, 3, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_timing_control_1, 2, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_timing_control_2, 1, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_white_balance, 2, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_vcs_setting, 1, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_vcom_dc_setting, 1, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_test_mode_3, 2, 0);
+ mdfld_dsi_send_gen_long_lp(sender, pr2_mcs_protect_on, 1, 0);
+ mdfld_dsi_send_mcs_long_lp(sender, pr2_set_address_mode, 1, 0);
+ mdfld_dsi_send_mcs_long_lp(sender, pr2_set_pixel_format, 1, 0);
/* Now In Sleep Mode */
}
static void MRSTLFBFlip(MRSTLFB_DEVINFO *psDevInfo, MRSTLFB_BUFFER *psBuffer)
{
unsigned long ulAddr = (unsigned long)psBuffer->sDevVAddr.uiAddr;
- struct fb_info *psLINFBInfo;
+ struct fb_info *psLINFBInfo;
+ static int FirstCleanFlag = 1;
if (!psDevInfo->bSuspended && !psDevInfo->bLeaveVT)
{
psLINFBInfo = psDevInfo->psLINFBInfo;
psLINFBInfo->screen_base = psBuffer->sCPUVAddr;
+
+ if (FirstCleanFlag == 1) {
+ memset(psDevInfo->sSystemBuffer.sCPUVAddr, 0, psDevInfo->sSystemBuffer.ui32BufferSize);
+ FirstCleanFlag = 0;
+ }
}
static void MRSTLFBRestoreLastFlip(MRSTLFB_DEVINFO *psDevInfo)
#endif
#ifdef CONFIG_GFX_RTPM
- pm_schedule_suspend(&gpDrmDevice->pdev->dev, 0);
+ pm_request_idle(&gpDrmDevice->pdev->dev);
#endif
}