Commit d6540632 authored by Jani Nikula's avatar Jani Nikula Committed by Daniel Vetter

drm/i915: keep max backlight internal to intel_panel.c

In preparation of adding locking to backlight, make max backlight value
(the modulation frequency the PWM duty cycle value must not exceed)
internal to intel_panel.c.

Have intel_panel_set_backlight() accept a caller defined range for level,
and scale input to max backlight value internally.

Clean up intel_panel_get_max_backlight() and usage internally.
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 2a7aceec
...@@ -553,8 +553,8 @@ extern void intel_pch_panel_fitting(struct drm_device *dev, ...@@ -553,8 +553,8 @@ extern void intel_pch_panel_fitting(struct drm_device *dev,
int fitting_mode, int fitting_mode,
const struct drm_display_mode *mode, const struct drm_display_mode *mode,
struct drm_display_mode *adjusted_mode); struct drm_display_mode *adjusted_mode);
extern u32 intel_panel_get_max_backlight(struct drm_device *dev); extern void intel_panel_set_backlight(struct drm_device *dev,
extern void intel_panel_set_backlight(struct drm_device *dev, u32 level); u32 level, u32 max);
extern int intel_panel_setup_backlight(struct drm_connector *connector); extern int intel_panel_setup_backlight(struct drm_connector *connector);
extern void intel_panel_enable_backlight(struct drm_device *dev, extern void intel_panel_enable_backlight(struct drm_device *dev,
enum pipe pipe); enum pipe pipe);
......
...@@ -152,7 +152,6 @@ static u32 asle_set_backlight(struct drm_device *dev, u32 bclp) ...@@ -152,7 +152,6 @@ static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
{ {
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
struct opregion_asle __iomem *asle = dev_priv->opregion.asle; struct opregion_asle __iomem *asle = dev_priv->opregion.asle;
u32 max;
DRM_DEBUG_DRIVER("bclp = 0x%08x\n", bclp); DRM_DEBUG_DRIVER("bclp = 0x%08x\n", bclp);
...@@ -163,8 +162,7 @@ static u32 asle_set_backlight(struct drm_device *dev, u32 bclp) ...@@ -163,8 +162,7 @@ static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
if (bclp > 255) if (bclp > 255)
return ASLE_BACKLIGHT_FAILED; return ASLE_BACKLIGHT_FAILED;
max = intel_panel_get_max_backlight(dev); intel_panel_set_backlight(dev, bclp, 255);
intel_panel_set_backlight(dev, bclp * max / 255);
iowrite32((bclp*0x64)/0xff | ASLE_CBLV_VALID, &asle->cblv); iowrite32((bclp*0x64)/0xff | ASLE_CBLV_VALID, &asle->cblv);
return 0; return 0;
......
...@@ -130,6 +130,9 @@ static int is_backlight_combination_mode(struct drm_device *dev) ...@@ -130,6 +130,9 @@ static int is_backlight_combination_mode(struct drm_device *dev)
return 0; return 0;
} }
/* XXX: query mode clock or hardware clock and program max PWM appropriately
* when it's 0.
*/
static u32 i915_read_blc_pwm_ctl(struct drm_device *dev) static u32 i915_read_blc_pwm_ctl(struct drm_device *dev)
{ {
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
...@@ -164,7 +167,7 @@ static u32 i915_read_blc_pwm_ctl(struct drm_device *dev) ...@@ -164,7 +167,7 @@ static u32 i915_read_blc_pwm_ctl(struct drm_device *dev)
return val; return val;
} }
static u32 _intel_panel_get_max_backlight(struct drm_device *dev) static u32 intel_panel_get_max_backlight(struct drm_device *dev)
{ {
u32 max; u32 max;
...@@ -182,23 +185,8 @@ static u32 _intel_panel_get_max_backlight(struct drm_device *dev) ...@@ -182,23 +185,8 @@ static u32 _intel_panel_get_max_backlight(struct drm_device *dev)
max *= 0xff; max *= 0xff;
} }
return max;
}
u32 intel_panel_get_max_backlight(struct drm_device *dev)
{
u32 max;
max = _intel_panel_get_max_backlight(dev);
if (max == 0) {
/* XXX add code here to query mode clock or hardware clock
* and program max PWM appropriately.
*/
pr_warn_once("fixme: max PWM is zero\n");
return 1;
}
DRM_DEBUG_DRIVER("max backlight PWM = %d\n", max); DRM_DEBUG_DRIVER("max backlight PWM = %d\n", max);
return max; return max;
} }
...@@ -217,8 +205,11 @@ static u32 intel_panel_compute_brightness(struct drm_device *dev, u32 val) ...@@ -217,8 +205,11 @@ static u32 intel_panel_compute_brightness(struct drm_device *dev, u32 val)
return val; return val;
if (i915_panel_invert_brightness > 0 || if (i915_panel_invert_brightness > 0 ||
dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS) dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS) {
return intel_panel_get_max_backlight(dev) - val; u32 max = intel_panel_get_max_backlight(dev);
if (max)
return max - val;
}
return val; return val;
} }
...@@ -270,6 +261,10 @@ static void intel_panel_actually_set_backlight(struct drm_device *dev, u32 level ...@@ -270,6 +261,10 @@ static void intel_panel_actually_set_backlight(struct drm_device *dev, u32 level
u32 max = intel_panel_get_max_backlight(dev); u32 max = intel_panel_get_max_backlight(dev);
u8 lbpc; u8 lbpc;
/* we're screwed, but keep behaviour backwards compatible */
if (!max)
max = 1;
lbpc = level * 0xfe / max + 1; lbpc = level * 0xfe / max + 1;
level /= lbpc; level /= lbpc;
pci_write_config_byte(dev->pdev, PCI_LBPC, lbpc); pci_write_config_byte(dev->pdev, PCI_LBPC, lbpc);
...@@ -282,9 +277,20 @@ static void intel_panel_actually_set_backlight(struct drm_device *dev, u32 level ...@@ -282,9 +277,20 @@ static void intel_panel_actually_set_backlight(struct drm_device *dev, u32 level
I915_WRITE(BLC_PWM_CTL, tmp | level); I915_WRITE(BLC_PWM_CTL, tmp | level);
} }
void intel_panel_set_backlight(struct drm_device *dev, u32 level) /* set backlight brightness to level in range [0..max] */
void intel_panel_set_backlight(struct drm_device *dev, u32 level, u32 max)
{ {
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
u32 freq;
freq = intel_panel_get_max_backlight(dev);
if (!freq) {
/* we are screwed, bail out */
return;
}
/* scale to hardware */
level = level * freq / max;
dev_priv->backlight.level = level; dev_priv->backlight.level = level;
if (dev_priv->backlight.device) if (dev_priv->backlight.device)
...@@ -405,7 +411,8 @@ intel_panel_detect(struct drm_device *dev) ...@@ -405,7 +411,8 @@ intel_panel_detect(struct drm_device *dev)
static int intel_panel_update_status(struct backlight_device *bd) static int intel_panel_update_status(struct backlight_device *bd)
{ {
struct drm_device *dev = bl_get_data(bd); struct drm_device *dev = bl_get_data(bd);
intel_panel_set_backlight(dev, bd->props.brightness); intel_panel_set_backlight(dev, bd->props.brightness,
bd->props.max_brightness);
return 0; return 0;
} }
...@@ -434,7 +441,7 @@ int intel_panel_setup_backlight(struct drm_connector *connector) ...@@ -434,7 +441,7 @@ int intel_panel_setup_backlight(struct drm_connector *connector)
memset(&props, 0, sizeof(props)); memset(&props, 0, sizeof(props));
props.type = BACKLIGHT_RAW; props.type = BACKLIGHT_RAW;
props.brightness = dev_priv->backlight.level; props.brightness = dev_priv->backlight.level;
props.max_brightness = _intel_panel_get_max_backlight(dev); props.max_brightness = intel_panel_get_max_backlight(dev);
if (props.max_brightness == 0) { if (props.max_brightness == 0) {
DRM_DEBUG_DRIVER("Failed to get maximum backlight value\n"); DRM_DEBUG_DRIVER("Failed to get maximum backlight value\n");
return -ENODEV; return -ENODEV;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment