#include "mdfld_dsi_dbi_dpu.h"
#include "mdfld_dsi_pkg_sender.h"
- #include "psb_powermgmt.h"
-#ifdef CONFIG_GFX_RTPM
- #include <linux/pm_runtime.h>
-#endif
-
-int enable_gfx_rtpm = 0;
+#include "psb_powermgmt.h"
int enter_dsr = 0;
struct mdfld_dsi_dbi_output *gdbi_output;
-#ifdef CONFIG_GFX_RTPM
-static void psb_runtimepm_wq_handler(struct work_struct *work);
-DECLARE_DELAYED_WORK(rtpm_work, psb_runtimepm_wq_handler);
-
-void psb_runtimepm_wq_handler(struct work_struct *work)
-{
- struct drm_psb_private * dev_priv = gpDrmDevice->dev_private;
-
- if(drm_psb_ospm && !enable_gfx_rtpm) {
- printk(KERN_ALERT "Enable GFX runtime_pm \n");
-
- dev_priv->rpm_enabled = 1;
-
- enable_gfx_rtpm = 1;
-
- pm_runtime_enable(&gpDrmDevice->pdev->dev);
- pm_runtime_set_active(&gpDrmDevice->pdev->dev);
-
- pm_runtime_allow(&gpDrmDevice->pdev->dev);
- }
-}
-#endif
-
-
/**
* set refreshing area
*/
}
p_funcs = dbi_output->p_funcs;
- if (p_funcs && (p_funcs->esd_detection))
- mdfld_error_detect_correct_timer_end(dev);
+ //if (p_funcs && (p_funcs->esd_detection))
+ // mdfld_error_detect_correct_timer_end(dev);
mdfld_disable_te(dev, pipe);
/*clean IN_DSR flag*/
dbi_output->mode_flags &= ~MODE_SETTING_IN_DSR;
- if (p_funcs && (p_funcs->esd_detection))
- mdfld_error_detect_correct_timer_start(dev);
+ //if (p_funcs && (p_funcs->esd_detection))
+ // mdfld_error_detect_correct_timer_start(dev);
fun_exit:
spin_unlock(&dev_priv->dsr_lock);
}
dbi_output = dsr_info->dbi_outputs;
-#ifdef CONFIG_PM_RUNTIME
- if(drm_psb_ospm && !enable_gfx_rtpm) {
-// pm_runtime_allow(&gpDrmDevice->pdev->dev);
-// schedule_delayed_work(&rtpm_work, 120 * 1000);
- }
-#endif
-
/*for each output, exit dsr*/
for(i=0; i<dsr_info->dbi_output_num; i++) {
/*if panel has been turned off, skip*/
else
p_funcs->dsi_controller_init(dsi_config, pipe, true);
}
- if (dsi_connector->status == connector_status_connected) {
- if (pipe == 0)
- dev_priv->panel_desc |= DISPLAY_A;
- if (pipe == 2)
- dev_priv->panel_desc |= DISPLAY_C;
- }
/* mdfld_dsi_controller_dbi_init(dsi_config, pipe); */
/* TODO: get panel info from DDB */
dev_priv->dsr_fb_update = 0;
dev_priv->b_dsr_enable = false;
- dev_priv->b_async_flip_enable = false;
- dev_priv->exit_idle = mdfld_dsi_dbi_exit_dsr;
- dev_priv->async_flip_update_fb = mdfld_dsi_dbi_async_flip_fb_update;
- dev_priv->async_check_fifo_empty = mdfld_dsi_dbi_async_check_fifo_empty;
-#if defined(CONFIG_MDFLD_DSI_DPU) || defined(CONFIG_MDFLD_DSI_DSR)
- dev_priv->b_dsr_enable_config = true;
-#endif /*CONFIG_MDFLD_DSI_DSR*/
+ //dev_priv->b_async_flip_enable = false;
+ //dev_priv->async_flip_update_fb = mdfld_dsi_dbi_async_flip_fb_update;
+ //dev_priv->async_check_fifo_empty = mdfld_dsi_dbi_async_check_fifo_empty;
dbi_output->first_boot = true;
dbi_output->mode_flags = MODE_SETTING_IN_ENCODER;
OSPM_UHB_FORCE_POWER_ON))
return -EAGAIN;
- ctx->lastbrightnesslevel = psb_brightness;
if (p_funcs->set_brightness(dsi_config, 0))
DRM_ERROR("Failed to set panel brightness\n");
/*save the plane informaton, for it will updated*/
- ctx->dspsurf = dev_priv->init_screen_start;
- ctx->dsplinoff = dev_priv->init_screen_offset;
ctx->pipestat = REG_READ(regs->pipestat_reg);
ctx->dspcntr = REG_READ(regs->dspcntr_reg);
ctx->dspstride= REG_READ(regs->dspstride_reg);
int pipe;
struct drm_device *dev;
struct drm_psb_private *dev_priv;
- static int last_ospm_suspend = -1;
if (!encoder) {
DRM_ERROR("Invalid encoder\n");
return -EINVAL;
}
- PSB_DEBUG_ENTRY("%s, last_ospm_suspend = %s\n", (on ? "on" : "off"),
- (last_ospm_suspend ? "true" : "false"));
-
dsi_encoder = MDFLD_DSI_ENCODER(encoder);
dpi_output = MDFLD_DSI_DPI_OUTPUT(dsi_encoder);
dsi_config = mdfld_dsi_encoder_get_config(dsi_encoder);
if (dsi_connector->status != connector_status_connected)
return 0;
- mutex_lock(&dsi_config->context_lock);
-
- if (last_ospm_suspend == -1)
- last_ospm_suspend = false;
-
if (dpi_output->first_boot && dsi_config->dsi_hw_context.panel_on) {
printk(KERN_ALERT "skip panle power setting for first boot!"
" panel is already powered on\n");
goto fun_exit;
}
- /**
- * if ospm has turned panel off, but dpms tries to turn panel on, skip
- */
- if (dev_priv->dpms_on_off && on && last_ospm_suspend)
- goto fun_exit;
-
switch (on) {
case true:
/* panel is already on */
if (dsi_config->dsi_hw_context.panel_on)
goto fun_exit;
/* For DPMS case, just turn on/off panel */
- if (dev_priv->dpms_on_off) {
+ {
if (mdfld_dsi_dpi_panel_turn_on(dsi_config)) {
DRM_ERROR("Faild to turn on panel\n");
goto set_power_err;
}
- } else {
- if (__dpi_panel_power_on(dsi_config, p_funcs)) {
- DRM_ERROR("Faild to turn on panel\n");
- goto set_power_err;
- }
- }
+ }
+
/**
* If power on, turn off color mode by default,
* let panel in full color mode
mdfld_dsi_dpi_set_color_mode(dsi_config, false);
dsi_config->dsi_hw_context.panel_on = 1;
- last_ospm_suspend = false;
break;
case false:
- if (dev_priv->dpms_on_off &&
- dsi_config->dsi_hw_context.panel_on) {
+ if (dsi_config->dsi_hw_context.panel_on) {
if (mdfld_dsi_dpi_panel_shut_down(dsi_config))
DRM_ERROR("Faild to shutdown panel\n");
-
- last_ospm_suspend = false;
- } else if (!dev_priv->dpms_on_off && !last_ospm_suspend) {
- if (__dpi_panel_power_off(dsi_config, p_funcs)) {
- DRM_ERROR("Faild to turn off panel\n");
- goto set_power_err;
- }
- /* ospm suspend called? */
- last_ospm_suspend = true;
}
+
dsi_config->dsi_hw_context.panel_on = 0;
break;
default:
}
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;
}
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;
PSB_DEBUG_ENTRY(
"%s\n", (mode == DRM_MODE_DPMS_ON ? "on" : "off"));
- if (!gbdispstatus) {
- PSB_DEBUG_ENTRY(
- "panel in suspend status, skip turn on/off from DMPS");
- return ;
- }
- mutex_lock(&dev_priv->dpms_mutex);
- dev_priv->dpms_on_off = true;
if (mode == DRM_MODE_DPMS_ON)
mdfld_dsi_dpi_set_power(encoder, true);
else
mdfld_dsi_dpi_set_power(encoder, false);
- dev_priv->dpms_on_off = false;
- mutex_unlock(&dev_priv->dpms_mutex);
}
bool mdfld_dsi_dpi_mode_fixup(struct drm_encoder *encoder,
void mdfld_dsi_dpi_save(struct drm_encoder *encoder)
{
- printk(KERN_ALERT"%s\n", __func__);
-
- if (!encoder)
- return;
-
- /*turn off*/
- __mdfld_dsi_dpi_set_power(encoder, false);
+ return;
}
void mdfld_dsi_dpi_restore(struct drm_encoder *encoder)
{
- printk(KERN_ALERT"%s\n", __func__);
-
- if (!encoder)
- return;
-
- /*turn on*/
- __mdfld_dsi_dpi_set_power(encoder, true);
-}
-
-/**
- * Exit from DSR
- */
-void mdfld_dsi_dpi_exit_idle(struct drm_device *dev,
- u32 update_src,
- void *p_surfaceAddr,
- bool check_hw_on_only)
-{
- struct drm_psb_private * dev_priv = dev->dev_private;
- unsigned long irqflags;
-
- /* PSB_DEBUG_ENTRY("\n"); */
-
- if (!ospm_power_is_hw_on(OSPM_DISPLAY_ISLAND)) {
- DRM_ERROR("hw begin failed\n");
- return;
- }
-
- spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
- if (dev_priv->b_is_in_idle) {
- /* update the surface base address. */
- if (p_surfaceAddr) {
- REG_WRITE(DSPASURF, *((u32 *)p_surfaceAddr));
-#if defined(CONFIG_MDFD_DUAL_MIPI)
- REG_WRITE(DSPCSURF, *((u32 *)p_surfaceAddr));
-#endif
- }
-
- mid_enable_pipe_event(dev_priv, 0);
- psb_enable_pipestat(dev_priv, 0, PIPE_VBLANK_INTERRUPT_ENABLE);
- dev_priv->b_is_in_idle = false;
- dev_priv->dsr_idle_count = 0;
- }
- spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
+ return;
}
/*
dsi_connector->status = connector_status_connected;
#endif
- /**
- * TODO: can we keep these code out of display driver as
- * it will make display driver hard to be maintained
- */
- if (dsi_connector->status == connector_status_connected) {
- if (pipe == 0)
- dev_priv->panel_desc |= DISPLAY_A;
- if (pipe == 2)
- dev_priv->panel_desc |= DISPLAY_C;
- }
-
dpi_output = kzalloc(sizeof(struct mdfld_dsi_dpi_output), GFP_KERNEL);
if (!dpi_output) {
DRM_ERROR("No memory\n");
dev_priv->dsr_fb_update = 0;
dev_priv->b_dsr_enable = false;
- dev_priv->exit_idle = mdfld_dsi_dpi_exit_idle;
-#if defined(CONFIG_MDFLD_DSI_DPU) || defined(CONFIG_MDFLD_DSI_DSR)
- dev_priv->b_dsr_enable_config = true;
-#endif /*CONFIG_MDFLD_DSI_DSR*/
-
#ifdef CONFIG_SUPPORT_TOSHIBA_MIPI_DISPLAY
dev_priv->dpi_panel_on = true;
return dsi_connector->status;
}
-static int mdfld_dsi_connector_set_property(struct drm_connector *connector,
- struct drm_property *property,
- uint64_t value)
-{
- struct drm_encoder *encoder = connector->encoder;
- struct backlight_device *psb_bd;
-
- PSB_DEBUG_ENTRY("\n");
-
- if (!strcmp(property->name, "scaling mode") && encoder) {
- struct psb_intel_crtc * psb_crtc = to_psb_intel_crtc(encoder->crtc);
- bool bTransitionFromToCentered;
- uint64_t curValue;
-
- if (!psb_crtc)
- goto set_prop_error;
-
- switch (value) {
- case DRM_MODE_SCALE_FULLSCREEN:
- break;
- case DRM_MODE_SCALE_CENTER:
- break;
- case DRM_MODE_SCALE_NO_SCALE:
- break;
- case DRM_MODE_SCALE_ASPECT:
- break;
- default:
- goto set_prop_error;
- }
-
- if (drm_connector_property_get_value(connector, property, &curValue))
- goto set_prop_error;
-
- if (curValue == value)
- goto set_prop_done;
-
- if (drm_connector_property_set_value(connector, property, value))
- goto set_prop_error;
-
- bTransitionFromToCentered = (curValue == DRM_MODE_SCALE_NO_SCALE) ||
- (value == DRM_MODE_SCALE_NO_SCALE);
-
- if (psb_crtc->saved_mode.hdisplay != 0 &&
- psb_crtc->saved_mode.vdisplay != 0) {
- if (bTransitionFromToCentered) {
- if (!drm_crtc_helper_set_mode(encoder->crtc, &psb_crtc->saved_mode,
- encoder->crtc->x, encoder->crtc->y, encoder->crtc->fb))
- goto set_prop_error;
- } else {
- struct drm_encoder_helper_funcs *pEncHFuncs = encoder->helper_private;
- pEncHFuncs->mode_set(encoder, &psb_crtc->saved_mode,
- &psb_crtc->saved_adjusted_mode);
- }
- }
- } else if (!strcmp(property->name, "backlight") && encoder) {
- PSB_DEBUG_ENTRY("backlight level = %d\n", (int)value);
- if (drm_connector_property_set_value(connector, property, value))
- goto set_prop_error;
- else {
- PSB_DEBUG_ENTRY("set brightness to %d", (int)value);
- psb_bd = psb_get_backlight_device();
- if(psb_bd) {
- psb_bd->props.brightness = value;
- psb_set_brightness(psb_bd);
- }
- }
- }
-set_prop_done:
- return 0;
-set_prop_error:
- return -1;
-}
-
static void mdfld_dsi_connector_destroy(struct drm_connector * connector)
{
struct psb_intel_output * psb_output = to_psb_intel_output(connector);
static void mdfld_dsi_connector_dpms(struct drm_connector *connector, int mode)
{
-#ifdef CONFIG_PM_RUNTIME
- struct drm_device * dev = connector->dev;
- struct drm_psb_private * dev_priv = dev->dev_private;
- bool panel_on, panel_on1, panel_on2;
-#endif
- /*first, execute dpms*/
drm_helper_connector_dpms(connector, mode);
-
-#ifdef CONFIG_PM_RUNTIME
- if(is_panel_vid_or_cmd(dev)) {
- /*DPI panel*/
- panel_on = dev_priv->dpi_panel_on;
- panel_on2 = dev_priv->dpi_panel_on2;
- } else {
- /*DBI panel*/
- panel_on = dev_priv->dbi_panel_on;
- panel_on2 = dev_priv->dbi_panel_on2;
- }
-
-
- if (!ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND,
- OSPM_UHB_ONLY_IF_ON))
- return ;
-
- acquire_ospm_lock();
- if (dev_priv->bhdmiconnected)
- panel_on1 = (REG_READ(HDMIB_CONTROL) & HDMIB_PORT_EN);
- else
- panel_on1 = false;
- release_ospm_lock();
-
- /*then check all display panels + monitors status*/
- if (!panel_on && !panel_on2 && !panel_on1) {
- /*request rpm idle*/
- if(dev_priv->rpm_enabled) {
- pm_request_idle(&dev->pdev->dev);
- }
- }
-
- /**
- * if rpm wasn't enabled yet, try to allow it
- * FIXME: won't enable rpm for DPI since DPI
- * CRTC setting is a little messy now.
- * Enable it later!
- */
-#if 0 /* revist to check if we can enable rpm for DPI */
- if(!dev_priv->rpm_enabled && !is_panel_vid_or_cmd(dev))
- ospm_runtime_pm_allow(dev);
-#endif
- ospm_power_using_hw_end(OSPM_DISPLAY_ISLAND);
-#endif
}
static struct drm_encoder * mdfld_dsi_connector_best_encoder(struct drm_connector * connector)
.restore = mdfld_dsi_connector_restore,
.detect = mdfld_dsi_connector_detect,
.fill_modes = drm_helper_probe_single_connector_modes,
- .set_property = mdfld_dsi_connector_set_property,
.destroy = mdfld_dsi_connector_destroy,
};
}
encoder->private = dsi_config;
dsi_config->encoders[MDFLD_DSI_ENCODER_DBI] = encoder;
-
- if (pipe == 2)
- dev_priv->encoder2 = encoder;
-
- if (pipe == 0)
- dev_priv->encoder0 = encoder;
}
if(p_vid_funcs) {
}
encoder->private = dsi_config;
dsi_config->encoders[MDFLD_DSI_ENCODER_DPI] = encoder;
-
- if (pipe == 2)
- dev_priv->encoder2 = encoder;
-
- if (pipe == 0)
- dev_priv->encoder0 = encoder;
}
drm_sysfs_connector_add(connector);
#include "displays/tpo_cmd.h"
#include "displays/tpo_vid.h"
-#include "displays/tmd_cmd.h"
#include "displays/tmd_vid.h"
-#include "displays/pyr_cmd.h"
-#include "displays/pyr_vid.h"
#include "displays/tmd_6x10_vid.h"
-#include "displays/h8c7_vid.h"
-#include "displays/auo_sc1_vid.h"
-#include "displays/auo_sc1_cmd.h"
-#include "displays/gi_sony_vid.h"
-#include "displays/gi_sony_cmd.h"
-#include "displays/h8c7_cmd.h"
#include "displays/hdmi.h"
#include "psb_drv.h"
struct panel_funcs * p_vid_funcs = NULL;
int ret = 0;
- dev_priv->cur_pipe = mipi_pipe;
p_cmd_funcs = kzalloc(sizeof(struct panel_funcs), GFP_KERNEL);
p_vid_funcs = kzalloc(sizeof(struct panel_funcs), GFP_KERNEL);
switch (p_type) {
- case TPO_CMD:
- kfree(p_vid_funcs);
- p_vid_funcs = NULL;
- tpo_cmd_init(dev, p_cmd_funcs);
- ret = mdfld_dsi_output_init(dev, mipi_pipe, NULL, p_cmd_funcs, NULL);
- break;
- case TPO_VID:
- kfree(p_cmd_funcs);
- p_cmd_funcs = NULL;
- tpo_vid_init(dev, p_vid_funcs);
- ret = mdfld_dsi_output_init(dev, mipi_pipe, NULL, NULL, p_vid_funcs);
- break;
- case AUO_SC1_CMD:
- kfree(p_vid_funcs);
- p_vid_funcs = NULL;
- auo_sc1_cmd_init(dev, p_cmd_funcs);
- ret = mdfld_dsi_output_init(dev, mipi_pipe, NULL, p_cmd_funcs,
- NULL);
- break;
- case AUO_SC1_VID:
- kfree(p_cmd_funcs);
- p_cmd_funcs = NULL;
- auo_sc1_vid_init(dev, p_vid_funcs);
- ret = mdfld_dsi_output_init(dev, mipi_pipe, NULL, NULL,
- p_vid_funcs);
- break;
- case GI_SONY_CMD:
- kfree(p_vid_funcs);
- p_vid_funcs = NULL;
- gi_sony_cmd_init(dev, p_cmd_funcs);
- ret = mdfld_dsi_output_init(dev, mipi_pipe, NULL, p_cmd_funcs,
- NULL);
- break;
- case H8C7_CMD:
- kfree(p_vid_funcs);
- p_vid_funcs = NULL;
- h8c7_cmd_init(dev, p_cmd_funcs);
- ret = mdfld_dsi_output_init(dev, mipi_pipe, NULL, p_cmd_funcs,
- NULL);
- break;
- case GI_SONY_VID:
- kfree(p_cmd_funcs);
- p_cmd_funcs = NULL;
- gi_sony_vid_init(dev, p_vid_funcs);
- ret = mdfld_dsi_output_init(dev, mipi_pipe, NULL, NULL,
- p_vid_funcs);
- break;
case TMD_6X10_VID:
kfree(p_cmd_funcs);
p_cmd_funcs = NULL;
NULL,
p_vid_funcs);
break;
- case H8C7_VID:
- kfree(p_cmd_funcs);
- p_cmd_funcs = NULL;
- h8c7_vid_init(dev, p_vid_funcs);
- ret = mdfld_dsi_output_init(dev, mipi_pipe,
- NULL,
- NULL,
- p_vid_funcs);
- break;
case TMD_CMD:
/*tmd_cmd_init(dev, p_cmd_funcs);*/
kfree(p_vid_funcs);
p_vid_funcs = NULL;
ret = mdfld_dsi_output_init(dev, mipi_pipe, NULL, p_cmd_funcs, NULL);
break;
- case TMD_VID:
- kfree(p_cmd_funcs);
- p_cmd_funcs = NULL;
- tmd_vid_init(dev, p_vid_funcs);
- ret = mdfld_dsi_output_init(dev, mipi_pipe, NULL, NULL, p_vid_funcs);
- break;
- case PYR_CMD:
- kfree(p_vid_funcs);
- p_vid_funcs = NULL;
- pyr_cmd_init(dev, p_cmd_funcs);
- ret = mdfld_dsi_output_init(dev, mipi_pipe, NULL, p_cmd_funcs, NULL);
- break;
- case PYR_VID:
- /*pyr_vid_init(dev, p_vid_funcs);*/
- kfree(p_cmd_funcs);
- p_cmd_funcs = NULL;
- ret = mdfld_dsi_output_init(dev, mipi_pipe, NULL, NULL, p_vid_funcs);
- break;
- case TPO: /*TPO panel supports both cmd & vid interfaces*/
- tpo_cmd_init(dev, p_cmd_funcs);
- tpo_vid_init(dev, p_vid_funcs);
- ret = mdfld_dsi_output_init(dev, mipi_pipe, NULL, p_cmd_funcs, p_vid_funcs);
- break;
case TMD:
case PYR:
kfree(p_vid_funcs);
PSB_DEBUG_ENTRY("vtotal is %d\n", mode->vtotal);
PSB_DEBUG_ENTRY("clock is %d\n", mode->clock);
} else {
- mode->hdisplay = 800;
+ mode->hdisplay = 600;
mode->vdisplay = 1024;
mode->hsync_start = 823;
mode->hsync_end = 831;
*/
uint32_t swap_chain_flag;
+ spinlock_t dsr_lock;
+
bool hdmi_done_reading_edid;
bool xserver_start;