Add common helpers for MIPI DBI drivers to attach the connector LUMINANCE
property and forward updates to their backlight backend when
CONFIG_DRM_LUMINANCE is enabled.

Signed-off-by: Mario Limonciello <[email protected]>
---
 drivers/gpu/drm/drm_mipi_dbi.c | 36 ++++++++++++++++++++++++++++++++++
 include/drm/drm_mipi_dbi.h     |  7 ++++++-
 2 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_mipi_dbi.c b/drivers/gpu/drm/drm_mipi_dbi.c
index 25cf04d029f77..85e3b98a7ccb0 100644
--- a/drivers/gpu/drm/drm_mipi_dbi.c
+++ b/drivers/gpu/drm/drm_mipi_dbi.c
@@ -496,6 +496,42 @@ int drm_mipi_dbi_connector_helper_get_modes(struct 
drm_connector *connector)
 }
 EXPORT_SYMBOL(drm_mipi_dbi_connector_helper_get_modes);
 
+int drm_mipi_dbi_connector_attach_luminance_property(struct drm_connector 
*connector)
+{
+       struct mipi_dbi_dev *dbidev = drm_to_mipi_dbi_dev(connector->dev);
+       struct backlight_device *backlight = dbidev->backlight;
+
+       if (!IS_ENABLED(CONFIG_DRM_LUMINANCE) || !backlight)
+               return 0;
+
+       return drm_connector_attach_luminance_property(connector, 0,
+                                       backlight->props.max_brightness,
+                                       backlight->props.brightness);
+}
+EXPORT_SYMBOL(drm_mipi_dbi_connector_attach_luminance_property);
+
+void drm_mipi_dbi_connector_set_luminance(const struct drm_connector_state 
*conn_state)
+{
+       struct mipi_dbi_dev *dbidev =
+               drm_to_mipi_dbi_dev(conn_state->connector->dev);
+
+       if (!dbidev->backlight)
+               return;
+
+       dbidev->backlight->props.brightness = conn_state->luminance;
+       backlight_update_status(dbidev->backlight);
+}
+EXPORT_SYMBOL(drm_mipi_dbi_connector_set_luminance);
+
+void drm_mipi_dbi_connector_disable_luminance(const struct drm_connector_state 
*conn_state)
+{
+       struct mipi_dbi_dev *dbidev =
+               drm_to_mipi_dbi_dev(conn_state->connector->dev);
+
+       backlight_disable(dbidev->backlight);
+}
+EXPORT_SYMBOL(drm_mipi_dbi_connector_disable_luminance);
+
 static int mipi_dbi_rotate_mode(struct drm_display_mode *mode,
                                unsigned int rotation)
 {
diff --git a/include/drm/drm_mipi_dbi.h b/include/drm/drm_mipi_dbi.h
index d93e25fdc2e1e..8462c6bd6ca9e 100644
--- a/include/drm/drm_mipi_dbi.h
+++ b/include/drm/drm_mipi_dbi.h
@@ -263,9 +263,14 @@ void drm_mipi_dbi_crtc_helper_atomic_disable(struct 
drm_crtc *crtc,
        .atomic_destroy_state = drm_atomic_helper_connector_destroy_state
 
 int drm_mipi_dbi_connector_helper_get_modes(struct drm_connector *connector);
+int drm_mipi_dbi_connector_attach_luminance_property(struct drm_connector 
*connector);
+void drm_mipi_dbi_connector_set_luminance(const struct drm_connector_state 
*conn_state);
+void drm_mipi_dbi_connector_disable_luminance(const struct drm_connector_state 
*conn_state);
 
 #define DRM_MIPI_DBI_CONNECTOR_HELPER_FUNCS \
-       .get_modes = drm_mipi_dbi_connector_helper_get_modes
+       .get_modes = drm_mipi_dbi_connector_helper_get_modes, \
+       .set_luminance = drm_mipi_dbi_connector_set_luminance, \
+       .disable_luminance = drm_mipi_dbi_connector_disable_luminance
 
 /*
  * Mode config
-- 
2.43.0

Reply via email to