forked from Minki/linux
Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
Pull drm fixes from Dave Airlie: "i915, tda998x and vmwgfx fixes, The main one is i915 fix for missing VGA connectors, along with some fixes for the tda998x from Russell fixing some modesetting problems. (still on holidays, but got a spare moment to find these)" * 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: drm/vmwgfx: Fix incorrect write to read-only register v2: drm/i915: Drop early VLV WA to fix Voltage not getting dropped to Vmin drm/i915: only apply crt_present check on VLV drm/i915: Wait for vblank after enabling the primary plane on BDW drm/i2c: tda998x: add some basic mode validation drm/i2c: tda998x: faster polling for edid drm/i2c: tda998x: move drm_i2c_encoder_destroy call
This commit is contained in:
commit
110e4308f8
@ -810,6 +810,12 @@ static int
|
||||
tda998x_encoder_mode_valid(struct drm_encoder *encoder,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
if (mode->clock > 150000)
|
||||
return MODE_CLOCK_HIGH;
|
||||
if (mode->htotal >= BIT(13))
|
||||
return MODE_BAD_HVALUE;
|
||||
if (mode->vtotal >= BIT(11))
|
||||
return MODE_BAD_VVALUE;
|
||||
return MODE_OK;
|
||||
}
|
||||
|
||||
@ -1048,8 +1054,8 @@ read_edid_block(struct drm_encoder *encoder, uint8_t *buf, int blk)
|
||||
return i;
|
||||
}
|
||||
} else {
|
||||
for (i = 10; i > 0; i--) {
|
||||
msleep(10);
|
||||
for (i = 100; i > 0; i--) {
|
||||
msleep(1);
|
||||
ret = reg_read(priv, REG_INT_FLAGS_2);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
@ -1183,7 +1189,6 @@ static void
|
||||
tda998x_encoder_destroy(struct drm_encoder *encoder)
|
||||
{
|
||||
struct tda998x_priv *priv = to_tda998x_priv(encoder);
|
||||
drm_i2c_encoder_destroy(encoder);
|
||||
|
||||
/* disable all IRQs and free the IRQ handler */
|
||||
cec_write(priv, REG_CEC_RXSHPDINTENA, 0);
|
||||
@ -1193,6 +1198,7 @@ tda998x_encoder_destroy(struct drm_encoder *encoder)
|
||||
|
||||
if (priv->cec)
|
||||
i2c_unregister_device(priv->cec);
|
||||
drm_i2c_encoder_destroy(encoder);
|
||||
kfree(priv);
|
||||
}
|
||||
|
||||
|
@ -2087,6 +2087,7 @@ void intel_flush_primary_plane(struct drm_i915_private *dev_priv,
|
||||
static void intel_enable_primary_hw_plane(struct drm_i915_private *dev_priv,
|
||||
enum plane plane, enum pipe pipe)
|
||||
{
|
||||
struct drm_device *dev = dev_priv->dev;
|
||||
struct intel_crtc *intel_crtc =
|
||||
to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
|
||||
int reg;
|
||||
@ -2106,6 +2107,14 @@ static void intel_enable_primary_hw_plane(struct drm_i915_private *dev_priv,
|
||||
|
||||
I915_WRITE(reg, val | DISPLAY_PLANE_ENABLE);
|
||||
intel_flush_primary_plane(dev_priv, plane);
|
||||
|
||||
/*
|
||||
* BDW signals flip done immediately if the plane
|
||||
* is disabled, even if the plane enable is already
|
||||
* armed to occur at the next vblank :(
|
||||
*/
|
||||
if (IS_BROADWELL(dev))
|
||||
intel_wait_for_vblank(dev, intel_crtc->pipe);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -11088,6 +11097,22 @@ const char *intel_output_name(int output)
|
||||
return names[output];
|
||||
}
|
||||
|
||||
static bool intel_crt_present(struct drm_device *dev)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
|
||||
if (IS_ULT(dev))
|
||||
return false;
|
||||
|
||||
if (IS_CHERRYVIEW(dev))
|
||||
return false;
|
||||
|
||||
if (IS_VALLEYVIEW(dev) && !dev_priv->vbt.int_crt_support)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void intel_setup_outputs(struct drm_device *dev)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
@ -11096,7 +11121,7 @@ static void intel_setup_outputs(struct drm_device *dev)
|
||||
|
||||
intel_lvds_init(dev);
|
||||
|
||||
if (!IS_ULT(dev) && !IS_CHERRYVIEW(dev) && dev_priv->vbt.int_crt_support)
|
||||
if (intel_crt_present(dev))
|
||||
intel_crt_init(dev);
|
||||
|
||||
if (HAS_DDI(dev)) {
|
||||
|
@ -3209,6 +3209,14 @@ void gen6_set_rps(struct drm_device *dev, u8 val)
|
||||
*/
|
||||
static void vlv_set_rps_idle(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
struct drm_device *dev = dev_priv->dev;
|
||||
|
||||
/* Latest VLV doesn't need to force the gfx clock */
|
||||
if (dev->pdev->revision >= 0xd) {
|
||||
valleyview_set_rps(dev_priv->dev, dev_priv->rps.min_freq_softlimit);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* When we are idle. Drop to min voltage state.
|
||||
*/
|
||||
|
@ -690,6 +690,14 @@ intel_post_enable_primary(struct drm_crtc *crtc)
|
||||
struct drm_device *dev = crtc->dev;
|
||||
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
||||
|
||||
/*
|
||||
* BDW signals flip done immediately if the plane
|
||||
* is disabled, even if the plane enable is already
|
||||
* armed to occur at the next vblank :(
|
||||
*/
|
||||
if (IS_BROADWELL(dev))
|
||||
intel_wait_for_vblank(dev, intel_crtc->pipe);
|
||||
|
||||
/*
|
||||
* FIXME IPS should be fine as long as one plane is
|
||||
* enabled, but in practice it seems to have problems
|
||||
|
@ -179,7 +179,6 @@ static int vmw_fb_set_par(struct fb_info *info)
|
||||
vmw_write(vmw_priv, SVGA_REG_DISPLAY_POSITION_Y, info->var.yoffset);
|
||||
vmw_write(vmw_priv, SVGA_REG_DISPLAY_WIDTH, info->var.xres);
|
||||
vmw_write(vmw_priv, SVGA_REG_DISPLAY_HEIGHT, info->var.yres);
|
||||
vmw_write(vmw_priv, SVGA_REG_BYTES_PER_LINE, info->fix.line_length);
|
||||
vmw_write(vmw_priv, SVGA_REG_DISPLAY_ID, SVGA_ID_INVALID);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user