[v1 3/3] drm/bridge: ti-sn65dsi86: Add DisplayPort aux backlight support

From: Rajeev Nandan
Date: Wed Apr 14 2021 - 12:41:28 EST


Add support to control the backlight of the eDP panel connected to
the ti-sn65dsi86 bridge through aux channel.

Signed-off-by: Rajeev Nandan <rajeevny@xxxxxxxxxxxxxx>
---
drivers/gpu/drm/bridge/Kconfig | 1 +
drivers/gpu/drm/bridge/ti-sn65dsi86.c | 26 ++++++++++++++++++++++++++
2 files changed, 27 insertions(+)

diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig
index e4110d6..e556ec22 100644
--- a/drivers/gpu/drm/bridge/Kconfig
+++ b/drivers/gpu/drm/bridge/Kconfig
@@ -239,6 +239,7 @@ config DRM_TI_SN65DSI86
select REGMAP_I2C
select DRM_PANEL
select DRM_MIPI_DSI
+ select DRM_DP_AUX_BACKLIGHT
help
Texas Instruments SN65DSI86 DSI to eDP Bridge driver

diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c b/drivers/gpu/drm/bridge/ti-sn65dsi86.c
index f27306c..813d067 100644
--- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c
+++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c
@@ -22,6 +22,7 @@
#include <drm/drm_atomic.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_bridge.h>
+#include <drm/drm_dp_aux_backlight.h>
#include <drm/drm_dp_helper.h>
#include <drm/drm_mipi_dsi.h>
#include <drm/drm_of.h>
@@ -126,6 +127,7 @@
* @panel: Our panel.
* @enable_gpio: The GPIO we toggle to enable the bridge.
* @supplies: Data for bulk enabling/disabling our regulators.
+ * @backlight: The DP aux backlight device.
* @dp_lanes: Count of dp_lanes we're using.
* @ln_assign: Value to program to the LN_ASSIGN register.
* @ln_polrs: Value for the 4-bit LN_POLRS field of SN_ENH_FRAME_REG.
@@ -154,6 +156,7 @@ struct ti_sn_bridge {
struct drm_panel *panel;
struct gpio_desc *enable_gpio;
struct regulator_bulk_data supplies[SN_REGULATOR_SUPPLY_NUM];
+ struct drm_dp_aux_backlight *backlight;
int dp_lanes;
u8 ln_assign;
u8 ln_polrs;
@@ -431,6 +434,8 @@ static void ti_sn_bridge_disable(struct drm_bridge *bridge)
{
struct ti_sn_bridge *pdata = bridge_to_ti_sn_bridge(bridge);

+ drm_dp_aux_backlight_disable(pdata->backlight);
+
drm_panel_disable(pdata->panel);

/* disable video stream */
@@ -819,6 +824,8 @@ static void ti_sn_bridge_enable(struct drm_bridge *bridge)
VSTREAM_ENABLE);

drm_panel_enable(pdata->panel);
+
+ drm_dp_aux_backlight_enable(pdata->backlight);
}

static void ti_sn_bridge_pre_enable(struct drm_bridge *bridge)
@@ -1215,6 +1222,7 @@ static int ti_sn_bridge_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct ti_sn_bridge *pdata;
+ struct drm_dp_aux_backlight *aux_bl;
int ret;

if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
@@ -1294,9 +1302,27 @@ static int ti_sn_bridge_probe(struct i2c_client *client,

drm_bridge_add(&pdata->bridge);

+ if (of_find_property(pdata->dev->of_node, "use-aux-backlight", NULL)) {
+ aux_bl = devm_kzalloc(pdata->dev, sizeof(*aux_bl), GFP_KERNEL);
+ if (!aux_bl) {
+ ret = -ENOMEM;
+ goto out;
+ }
+ aux_bl->dev = pdata->dev;
+ aux_bl->aux = &pdata->aux;
+ ret = drm_dp_aux_backlight_register("ti-sn-aux-backlight", aux_bl);
+ if (ret)
+ goto out;
+ pdata->backlight = aux_bl;
+ }
+
ti_sn_debugfs_init(pdata);

return 0;
+
+out:
+ pm_runtime_disable(pdata->dev);
+ return ret;
}

static int ti_sn_bridge_remove(struct i2c_client *client)
--
2.7.4