Expose PS8622 brightness through bridge luminance operations when
DRM_LUMINANCE is enabled. Keep registering the backlight class device
otherwise.

Signed-off-by: Mario Limonciello <[email protected]>
---
 drivers/gpu/drm/bridge/Kconfig         |  2 +-
 drivers/gpu/drm/bridge/parade-ps8622.c | 45 +++++++++++++++++++-------
 2 files changed, 34 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig
index 837db36cdf48e..d78eb9f117d1e 100644
--- a/drivers/gpu/drm/bridge/Kconfig
+++ b/drivers/gpu/drm/bridge/Kconfig
@@ -278,7 +278,7 @@ config DRM_PARADE_PS8622
        depends on OF
        select DRM_PANEL
        select DRM_KMS_HELPER
-       select BACKLIGHT_CLASS_DEVICE
+       select BACKLIGHT_CLASS_DEVICE if !DRM_LUMINANCE
        help
          Parade eDP-LVDS bridge chip driver.
 
diff --git a/drivers/gpu/drm/bridge/parade-ps8622.c 
b/drivers/gpu/drm/bridge/parade-ps8622.c
index 3a2ec482037df..229d9d7218c4e 100644
--- a/drivers/gpu/drm/bridge/parade-ps8622.c
+++ b/drivers/gpu/drm/bridge/parade-ps8622.c
@@ -45,6 +45,7 @@ struct ps8622_bridge {
        struct drm_bridge *panel_bridge;
        struct regulator *v12;
        struct backlight_device *bl;
+       u8 brightness;
 
        struct gpio_desc *gpio_slp;
        struct gpio_desc *gpio_rst;
@@ -276,7 +277,7 @@ static int ps8622_send_config(struct ps8622_bridge *ps8622)
 
                /* FFh for 100% brightness, 0h for 0% brightness */
                err = ps8622_set(cl, 0x01, 0xa7,
-                               ps8622->bl->props.brightness);
+                               ps8622->brightness);
                if (err)
                        goto error;
        } else {
@@ -324,6 +325,8 @@ static int ps8622_backlight_update(struct backlight_device 
*bl)
        struct ps8622_bridge *ps8622 = dev_get_drvdata(&bl->dev);
        int ret, brightness = backlight_get_brightness(bl);
 
+       ps8622->brightness = brightness;
+
        if (!ps8622->enabled)
                return -EINVAL;
 
@@ -332,6 +335,15 @@ static int ps8622_backlight_update(struct backlight_device 
*bl)
        return ret;
 }
 
+static void ps8622_set_luminance(struct drm_bridge *bridge,
+                                unsigned int luminance)
+{
+       struct ps8622_bridge *ps8622 = bridge_to_ps8622(bridge);
+
+       ps8622->brightness = luminance;
+       ps8622_set(ps8622->client, 0x01, 0xa7, luminance);
+}
+
 static const struct backlight_ops ps8622_backlight_ops = {
        .update_status  = ps8622_backlight_update,
 };
@@ -438,6 +450,7 @@ static const struct drm_bridge_funcs ps8622_bridge_funcs = {
        .atomic_disable = ps8622_disable,
        .atomic_post_disable = ps8622_post_disable,
        .attach = ps8622_attach,
+       .set_luminance = ps8622_set_luminance,
 };
 
 static const struct of_device_id ps8622_devices[] = {
@@ -502,18 +515,25 @@ static int ps8622_probe(struct i2c_client *client)
                ps8622->lane_count = ps8622->max_lane_count;
        }
 
+       ps8622->brightness = PS8622_MAX_BRIGHTNESS;
        if (!of_property_read_bool(dev->of_node, "use-external-pwm")) {
-               ps8622->bl = backlight_device_register("ps8622-backlight",
-                               dev, ps8622, &ps8622_backlight_ops,
-                               NULL);
-               if (IS_ERR(ps8622->bl)) {
-                       DRM_ERROR("failed to register backlight\n");
-                       ret = PTR_ERR(ps8622->bl);
-                       ps8622->bl = NULL;
-                       return ret;
+               if (IS_ENABLED(CONFIG_DRM_LUMINANCE)) {
+                       ps8622->bridge.ops |= DRM_BRIDGE_OP_LUMINANCE;
+                       ps8622->bridge.luminance_max = PS8622_MAX_BRIGHTNESS;
+                       ps8622->bridge.luminance = ps8622->brightness;
+               } else {
+                       ps8622->bl = 
backlight_device_register("ps8622-backlight",
+                                                              dev, ps8622,
+                                                        &ps8622_backlight_ops, 
NULL);
+                       if (IS_ERR(ps8622->bl)) {
+                               DRM_ERROR("failed to register backlight\n");
+                               ret = PTR_ERR(ps8622->bl);
+                               ps8622->bl = NULL;
+                               return ret;
+                       }
+                       ps8622->bl->props.max_brightness = 
PS8622_MAX_BRIGHTNESS;
+                       ps8622->bl->props.brightness = ps8622->brightness;
                }
-               ps8622->bl->props.max_brightness = PS8622_MAX_BRIGHTNESS;
-               ps8622->bl->props.brightness = PS8622_MAX_BRIGHTNESS;
        }
 
        ps8622->bridge.type = DRM_MODE_CONNECTOR_LVDS;
@@ -529,7 +549,8 @@ static void ps8622_remove(struct i2c_client *client)
 {
        struct ps8622_bridge *ps8622 = i2c_get_clientdata(client);
 
-       backlight_device_unregister(ps8622->bl);
+       if (ps8622->bl)
+               backlight_device_unregister(ps8622->bl);
        drm_bridge_remove(&ps8622->bridge);
 }
 
-- 
2.43.0

Reply via email to