130,8 → 130,9 |
return 0; |
} |
|
static u32 i915_read_blc_pwm_ctl(struct drm_i915_private *dev_priv) |
static u32 i915_read_blc_pwm_ctl(struct drm_device *dev) |
{ |
struct drm_i915_private *dev_priv = dev->dev_private; |
u32 val; |
|
/* Restore the CTL value if it lost, e.g. GPU reset */ |
138,24 → 139,25 |
|
if (HAS_PCH_SPLIT(dev_priv->dev)) { |
val = I915_READ(BLC_PWM_PCH_CTL2); |
if (dev_priv->saveBLC_PWM_CTL2 == 0) { |
dev_priv->saveBLC_PWM_CTL2 = val; |
if (dev_priv->regfile.saveBLC_PWM_CTL2 == 0) { |
dev_priv->regfile.saveBLC_PWM_CTL2 = val; |
} else if (val == 0) { |
I915_WRITE(BLC_PWM_PCH_CTL2, |
dev_priv->saveBLC_PWM_CTL2); |
val = dev_priv->saveBLC_PWM_CTL2; |
val = dev_priv->regfile.saveBLC_PWM_CTL2; |
I915_WRITE(BLC_PWM_PCH_CTL2, val); |
} |
} else { |
val = I915_READ(BLC_PWM_CTL); |
if (dev_priv->saveBLC_PWM_CTL == 0) { |
dev_priv->saveBLC_PWM_CTL = val; |
dev_priv->saveBLC_PWM_CTL2 = I915_READ(BLC_PWM_CTL2); |
if (dev_priv->regfile.saveBLC_PWM_CTL == 0) { |
dev_priv->regfile.saveBLC_PWM_CTL = val; |
if (INTEL_INFO(dev)->gen >= 4) |
dev_priv->regfile.saveBLC_PWM_CTL2 = |
I915_READ(BLC_PWM_CTL2); |
} else if (val == 0) { |
I915_WRITE(BLC_PWM_CTL, |
dev_priv->saveBLC_PWM_CTL); |
val = dev_priv->regfile.saveBLC_PWM_CTL; |
I915_WRITE(BLC_PWM_CTL, val); |
if (INTEL_INFO(dev)->gen >= 4) |
I915_WRITE(BLC_PWM_CTL2, |
dev_priv->saveBLC_PWM_CTL2); |
val = dev_priv->saveBLC_PWM_CTL; |
dev_priv->regfile.saveBLC_PWM_CTL2); |
} |
} |
|
164,10 → 166,9 |
|
static u32 _intel_panel_get_max_backlight(struct drm_device *dev) |
{ |
struct drm_i915_private *dev_priv = dev->dev_private; |
u32 max; |
|
max = i915_read_blc_pwm_ctl(dev_priv); |
max = i915_read_blc_pwm_ctl(dev); |
|
if (HAS_PCH_SPLIT(dev)) { |
max >>= 16; |
374,27 → 375,24 |
enum drm_connector_status |
intel_panel_detect(struct drm_device *dev) |
{ |
#if 0 |
struct drm_i915_private *dev_priv = dev->dev_private; |
#endif |
|
if (i915_panel_ignore_lid) |
return i915_panel_ignore_lid > 0 ? |
connector_status_connected : |
connector_status_disconnected; |
|
/* opregion lid state on HP 2540p is wrong at boot up, |
* appears to be either the BIOS or Linux ACPI fault */ |
#if 0 |
/* Assume that the BIOS does not lie through the OpRegion... */ |
if (dev_priv->opregion.lid_state) |
if (!i915_panel_ignore_lid && dev_priv->opregion.lid_state) { |
return ioread32(dev_priv->opregion.lid_state) & 0x1 ? |
connector_status_connected : |
connector_status_disconnected; |
#endif |
} |
|
switch (i915_panel_ignore_lid) { |
case -2: |
return connector_status_connected; |
case -1: |
return connector_status_disconnected; |
default: |
return connector_status_unknown; |
} |
} |
|
#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE |
static int intel_panel_update_status(struct backlight_device *bd) |
416,21 → 414,14 |
.get_brightness = intel_panel_get_brightness, |
}; |
|
int intel_panel_setup_backlight(struct drm_device *dev) |
int intel_panel_setup_backlight(struct drm_connector *connector) |
{ |
struct drm_device *dev = connector->dev; |
struct drm_i915_private *dev_priv = dev->dev_private; |
struct backlight_properties props; |
struct drm_connector *connector; |
|
intel_panel_init_backlight(dev); |
|
if (dev_priv->int_lvds_connector) |
connector = dev_priv->int_lvds_connector; |
else if (dev_priv->int_edp_connector) |
connector = dev_priv->int_edp_connector; |
else |
return -ENODEV; |
|
memset(&props, 0, sizeof(props)); |
props.type = BACKLIGHT_RAW; |
props.max_brightness = _intel_panel_get_max_backlight(dev); |
460,9 → 451,9 |
backlight_device_unregister(dev_priv->backlight); |
} |
#else |
int intel_panel_setup_backlight(struct drm_device *dev) |
int intel_panel_setup_backlight(struct drm_connector *connector) |
{ |
intel_panel_init_backlight(dev); |
intel_panel_init_backlight(connector->dev); |
return 0; |
} |
|
471,3 → 462,20 |
return; |
} |
#endif |
|
int intel_panel_init(struct intel_panel *panel, |
struct drm_display_mode *fixed_mode) |
{ |
panel->fixed_mode = fixed_mode; |
|
return 0; |
} |
|
void intel_panel_fini(struct intel_panel *panel) |
{ |
struct intel_connector *intel_connector = |
container_of(panel, struct intel_connector, panel); |
|
if (panel->fixed_mode) |
drm_mode_destroy(intel_connector->base.dev, panel->fixed_mode); |
} |