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
