|
@@ -277,7 +277,7 @@ void intel_panel_enable_backlight(struct drm_device *dev)
|
|
|
dev_priv->backlight_enabled = true;
|
|
|
}
|
|
|
|
|
|
-void intel_panel_setup_backlight(struct drm_device *dev)
|
|
|
+static void intel_panel_init_backlight(struct drm_device *dev)
|
|
|
{
|
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
|
|
@@ -309,3 +309,73 @@ intel_panel_detect(struct drm_device *dev)
|
|
|
|
|
|
return connector_status_unknown;
|
|
|
}
|
|
|
+
|
|
|
+#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE
|
|
|
+static int intel_panel_update_status(struct backlight_device *bd)
|
|
|
+{
|
|
|
+ struct drm_device *dev = bl_get_data(bd);
|
|
|
+ intel_panel_set_backlight(dev, bd->props.brightness);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int intel_panel_get_brightness(struct backlight_device *bd)
|
|
|
+{
|
|
|
+ struct drm_device *dev = bl_get_data(bd);
|
|
|
+ return intel_panel_get_backlight(dev);
|
|
|
+}
|
|
|
+
|
|
|
+static const struct backlight_ops intel_panel_bl_ops = {
|
|
|
+ .update_status = intel_panel_update_status,
|
|
|
+ .get_brightness = intel_panel_get_brightness,
|
|
|
+};
|
|
|
+
|
|
|
+int intel_panel_setup_backlight(struct drm_device *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;
|
|
|
+
|
|
|
+ props.type = BACKLIGHT_RAW;
|
|
|
+ props.max_brightness = intel_panel_get_max_backlight(dev);
|
|
|
+ dev_priv->backlight =
|
|
|
+ backlight_device_register("intel_backlight",
|
|
|
+ &connector->kdev, dev,
|
|
|
+ &intel_panel_bl_ops, &props);
|
|
|
+
|
|
|
+ if (IS_ERR(dev_priv->backlight)) {
|
|
|
+ DRM_ERROR("Failed to register backlight: %ld\n",
|
|
|
+ PTR_ERR(dev_priv->backlight));
|
|
|
+ dev_priv->backlight = NULL;
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
+ dev_priv->backlight->props.brightness = intel_panel_get_backlight(dev);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+void intel_panel_destroy_backlight(struct drm_device *dev)
|
|
|
+{
|
|
|
+ struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
+ if (dev_priv->backlight)
|
|
|
+ backlight_device_unregister(dev_priv->backlight);
|
|
|
+}
|
|
|
+#else
|
|
|
+int intel_panel_setup_backlight(struct drm_device *dev)
|
|
|
+{
|
|
|
+ intel_panel_init_backlight(dev);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+void intel_panel_destroy_backlight(struct drm_device *dev)
|
|
|
+{
|
|
|
+ return;
|
|
|
+}
|
|
|
+#endif
|