Expose GMA500 panel brightness through the connector LUMINANCE property
when DRM_LUMINANCE is enabled. Route updates through the existing platform
backlight operations and preserve legacy registration otherwise.

Signed-off-by: Mario Limonciello <[email protected]>
---
 drivers/gpu/drm/gma500/Kconfig          |  2 +-
 drivers/gpu/drm/gma500/backlight.c      | 45 ++++++++++++++++---------
 drivers/gpu/drm/gma500/cdv_intel_lvds.c |  2 ++
 drivers/gpu/drm/gma500/psb_drv.c        |  2 +-
 drivers/gpu/drm/gma500/psb_drv.h        |  4 ++-
 drivers/gpu/drm/gma500/psb_intel_lvds.c |  3 +-
 6 files changed, 38 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/gma500/Kconfig b/drivers/gpu/drm/gma500/Kconfig
index a2acaa699dd58..72b14a7d07d5c 100644
--- a/drivers/gpu/drm/gma500/Kconfig
+++ b/drivers/gpu/drm/gma500/Kconfig
@@ -9,7 +9,7 @@ config DRM_GMA500
        select I2C_ALGOBIT
        # GMA500 depends on ACPI_VIDEO when ACPI is enabled, just like i915
        select ACPI_VIDEO if ACPI
-       select BACKLIGHT_CLASS_DEVICE if ACPI
+       select BACKLIGHT_CLASS_DEVICE if ACPI && !DRM_LUMINANCE
        select INPUT if ACPI
        select X86_PLATFORM_DEVICES if ACPI
        select ACPI_WMI if ACPI
diff --git a/drivers/gpu/drm/gma500/backlight.c 
b/drivers/gpu/drm/gma500/backlight.c
index c8f1716a12d52..4bb39fba04539 100644
--- a/drivers/gpu/drm/gma500/backlight.c
+++ b/drivers/gpu/drm/gma500/backlight.c
@@ -8,7 +8,6 @@
  */
 
 #include <linux/backlight.h>
-
 #include <acpi/video.h>
 
 #include <drm/drm_print.h>
@@ -73,10 +72,9 @@ static const struct backlight_ops gma_backlight_ops 
__maybe_unused = {
        .update_status  = gma_backlight_update_status,
 };
 
-int gma_backlight_init(struct drm_device *dev)
+int gma_backlight_init(struct drm_device *dev, struct drm_connector *connector)
 {
        struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
-       struct backlight_properties props __maybe_unused = {};
        int ret;
 
        dev_priv->backlight_enabled = true;
@@ -92,28 +90,43 @@ int gma_backlight_init(struct drm_device *dev)
                return 0;
        }
 
-#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE
-       props.brightness = dev_priv->backlight_level;
-       props.max_brightness = PSB_MAX_BRIGHTNESS;
-       props.type = BACKLIGHT_RAW;
+       if (IS_ENABLED(CONFIG_DRM_LUMINANCE))
+               return drm_connector_attach_luminance_property(connector, 0,
+                                                        PSB_MAX_BRIGHTNESS,
+                                                        
dev_priv->backlight_level);
+
+       {
+               struct backlight_properties props = {};
 
-       dev_priv->backlight_device =
-               backlight_device_register(dev_priv->ops->backlight_name,
-                                         dev->dev, dev,
-                                         &gma_backlight_ops, &props);
-       if (IS_ERR(dev_priv->backlight_device))
-               return PTR_ERR(dev_priv->backlight_device);
-#endif
+               props.brightness = dev_priv->backlight_level;
+               props.max_brightness = PSB_MAX_BRIGHTNESS;
+               props.type = BACKLIGHT_RAW;
+
+               dev_priv->backlight_device =
+                       backlight_device_register(dev_priv->ops->backlight_name,
+                                                 dev->dev, dev,
+                                                 &gma_backlight_ops, &props);
+               if (IS_ERR(dev_priv->backlight_device))
+                       return PTR_ERR(dev_priv->backlight_device);
+       }
 
        return 0;
 }
 
+void gma_connector_set_luminance(const struct drm_connector_state *conn_state)
+{
+       gma_backlight_set(conn_state->connector->dev, conn_state->luminance);
+}
+
+void gma_connector_disable_luminance(const struct drm_connector_state 
*conn_state)
+{
+       gma_backlight_disable(conn_state->connector->dev);
+}
+
 void gma_backlight_exit(struct drm_device *dev)
 {
-#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE
        struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
 
        if (dev_priv->backlight_device)
                backlight_device_unregister(dev_priv->backlight_device);
-#endif
 }
diff --git a/drivers/gpu/drm/gma500/cdv_intel_lvds.c 
b/drivers/gpu/drm/gma500/cdv_intel_lvds.c
index 336ab411d6995..cef97f1532358 100644
--- a/drivers/gpu/drm/gma500/cdv_intel_lvds.c
+++ b/drivers/gpu/drm/gma500/cdv_intel_lvds.c
@@ -412,6 +412,8 @@ static const struct drm_connector_helper_funcs
        .get_modes = cdv_intel_lvds_get_modes,
        .mode_valid = cdv_intel_lvds_mode_valid,
        .best_encoder = gma_best_encoder,
+       .set_luminance = gma_connector_set_luminance,
+       .disable_luminance = gma_connector_disable_luminance,
 };
 
 static const struct drm_connector_funcs cdv_intel_lvds_connector_funcs = {
diff --git a/drivers/gpu/drm/gma500/psb_drv.c b/drivers/gpu/drm/gma500/psb_drv.c
index d17cb5b4a4bf2..5de7af651ac39 100644
--- a/drivers/gpu/drm/gma500/psb_drv.c
+++ b/drivers/gpu/drm/gma500/psb_drv.c
@@ -396,7 +396,7 @@ static int psb_driver_load(struct drm_device *dev, unsigned 
long flags)
 
                if (gma_encoder->type == INTEL_OUTPUT_LVDS ||
                    gma_encoder->type == INTEL_OUTPUT_MIPI) {
-                       ret = gma_backlight_init(dev);
+                       ret = gma_backlight_init(dev, connector);
                        if (ret == 0)
                                acpi_video_register_backlight();
                        break;
diff --git a/drivers/gpu/drm/gma500/psb_drv.h b/drivers/gpu/drm/gma500/psb_drv.h
index db197b865b90a..4fc22c66e6c8f 100644
--- a/drivers/gpu/drm/gma500/psb_drv.h
+++ b/drivers/gpu/drm/gma500/psb_drv.h
@@ -604,11 +604,13 @@ int psb_fbdev_driver_fbdev_probe(struct drm_fb_helper 
*fb_helper,
 #endif
 
 /* backlight.c */
-int gma_backlight_init(struct drm_device *dev);
+int gma_backlight_init(struct drm_device *dev, struct drm_connector 
*connector);
 void gma_backlight_exit(struct drm_device *dev);
 void gma_backlight_disable(struct drm_device *dev);
 void gma_backlight_enable(struct drm_device *dev);
 void gma_backlight_set(struct drm_device *dev, int v);
+void gma_connector_set_luminance(const struct drm_connector_state *conn_state);
+void gma_connector_disable_luminance(const struct drm_connector_state 
*conn_state);
 
 /* oaktrail_crtc.c */
 extern const struct drm_crtc_helper_funcs oaktrail_helper_funcs;
diff --git a/drivers/gpu/drm/gma500/psb_intel_lvds.c 
b/drivers/gpu/drm/gma500/psb_intel_lvds.c
index cd882786d9461..fa0bc8492ff7f 100644
--- a/drivers/gpu/drm/gma500/psb_intel_lvds.c
+++ b/drivers/gpu/drm/gma500/psb_intel_lvds.c
@@ -610,6 +610,8 @@ const struct drm_connector_helper_funcs
        .get_modes = psb_intel_lvds_get_modes,
        .mode_valid = psb_intel_lvds_mode_valid,
        .best_encoder = gma_best_encoder,
+       .set_luminance = gma_connector_set_luminance,
+       .disable_luminance = gma_connector_disable_luminance,
 };
 
 const struct drm_connector_funcs psb_intel_lvds_connector_funcs = {
@@ -808,4 +810,3 @@ void psb_intel_lvds_init(struct drm_device *dev,
 err_free_encoder:
        kfree(gma_encoder);
 }
-
-- 
2.43.0

Reply via email to