From: Rajeev Nandan <rajeevny@codeaurora.org>
To: y@qualcomm.com, dri-devel@lists.freedesktop.org,
linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org,
devicetree@vger.kernel.org
Cc: Rajeev Nandan <rajeevny@codeaurora.org>,
linux-kernel@vger.kernel.org, thierry.reding@gmail.com,
sam@ravnborg.org, robdclark@gmail.com, dianders@chromium.org,
lyude@redhat.com, jani.nikula@intel.com, robh@kernel.org,
laurent.pinchart@ideasonboard.com, a.hajda@samsung.com,
daniel.thompson@linaro.org, hoegsberg@chromium.org,
abhinavk@codeaurora.org, seanpaul@chromium.org,
kalyan_t@codeaurora.org, mkrishn@codeaurora.org
Subject: [v4 1/4] drm/panel-simple: Add basic DPCD backlight support
Date: Tue, 25 May 2021 13:00:28 +0530 [thread overview]
Message-ID: <1621927831-29471-2-git-send-email-rajeevny@codeaurora.org> (raw)
In-Reply-To: <1621927831-29471-1-git-send-email-rajeevny@codeaurora.org>
Add basic support of panel backlight control over eDP aux channel
using VESA's standard backlight control interface.
Signed-off-by: Rajeev Nandan <rajeevny@codeaurora.org>
---
This patch depends on [1] (drm/panel: panel-simple: Stash DP AUX bus;
allow using it for DDC)
Changes in v4:
- New
[1] https://lore.kernel.org/dri-devel/20210524165920.v8.7.I18e60221f6d048d14d6c50a770b15f356fa75092@changeid/
drivers/gpu/drm/panel/panel-simple.c | 99 ++++++++++++++++++++++++++++++++++--
1 file changed, 96 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c
index b09be6e..f9e4e60 100644
--- a/drivers/gpu/drm/panel/panel-simple.c
+++ b/drivers/gpu/drm/panel/panel-simple.c
@@ -21,6 +21,7 @@
* DEALINGS IN THE SOFTWARE.
*/
+#include <linux/backlight.h>
#include <linux/delay.h>
#include <linux/gpio/consumer.h>
#include <linux/iopoll.h>
@@ -171,6 +172,19 @@ struct panel_desc {
/** @connector_type: LVDS, eDP, DSI, DPI, etc. */
int connector_type;
+
+ /**
+ * @uses_dpcd_backlight: Panel supports eDP dpcd backlight control.
+ *
+ * Set true, if the panel supports backlight control over eDP AUX channel
+ * using DPCD registers as per VESA's standard.
+ */
+ bool uses_dpcd_backlight;
+};
+
+struct edp_backlight {
+ struct backlight_device *dev;
+ struct drm_edp_backlight_info info;
};
struct panel_simple {
@@ -194,6 +208,8 @@ struct panel_simple {
struct edid *edid;
+ struct edp_backlight *edp_bl;
+
struct drm_display_mode override_mode;
enum drm_panel_orientation orientation;
@@ -330,10 +346,14 @@ static void panel_simple_wait(ktime_t start_ktime, unsigned int min_ms)
static int panel_simple_disable(struct drm_panel *panel)
{
struct panel_simple *p = to_panel_simple(panel);
+ struct edp_backlight *bl = p->edp_bl;
if (!p->enabled)
return 0;
+ if (p->desc->uses_dpcd_backlight && bl)
+ drm_edp_backlight_disable(p->aux, &bl->info);
+
if (p->desc->delay.disable)
msleep(p->desc->delay.disable);
@@ -496,6 +516,7 @@ static int panel_simple_prepare(struct drm_panel *panel)
static int panel_simple_enable(struct drm_panel *panel)
{
struct panel_simple *p = to_panel_simple(panel);
+ struct edp_backlight *bl = p->edp_bl;
if (p->enabled)
return 0;
@@ -505,6 +526,10 @@ static int panel_simple_enable(struct drm_panel *panel)
panel_simple_wait(p->prepared_time, p->desc->delay.prepare_to_enable);
+ if (p->desc->uses_dpcd_backlight && bl)
+ drm_edp_backlight_enable(p->aux, &bl->info,
+ bl->dev->props.brightness);
+
p->enabled = true;
return 0;
@@ -565,6 +590,59 @@ static const struct drm_panel_funcs panel_simple_funcs = {
.get_timings = panel_simple_get_timings,
};
+static int edp_backlight_update_status(struct backlight_device *bd)
+{
+ struct panel_simple *p = bl_get_data(bd);
+ struct edp_backlight *bl = p->edp_bl;
+
+ if (!p->enabled)
+ return 0;
+
+ return drm_edp_backlight_set_level(p->aux, &bl->info, bd->props.brightness);
+}
+
+static const struct backlight_ops edp_backlight_ops = {
+ .update_status = edp_backlight_update_status,
+};
+
+static int edp_backlight_register(struct device *dev, struct panel_simple *panel)
+{
+ struct edp_backlight *bl;
+ struct backlight_properties props = { 0 };
+ u16 current_level;
+ u8 current_mode;
+ u8 edp_dpcd[EDP_DISPLAY_CTL_CAP_SIZE];
+ int ret;
+
+ bl = devm_kzalloc(dev, sizeof(*bl), GFP_KERNEL);
+ if (!bl)
+ return -ENOMEM;
+
+ ret = drm_dp_dpcd_read(panel->aux, DP_EDP_DPCD_REV, edp_dpcd,
+ EDP_DISPLAY_CTL_CAP_SIZE);
+ if (ret < 0)
+ return ret;
+
+ ret = drm_edp_backlight_init(panel->aux, &bl->info, 0, edp_dpcd,
+ ¤t_level, ¤t_mode);
+ if (ret < 0)
+ return ret;
+
+ props.type = BACKLIGHT_RAW;
+ props.brightness = current_level;
+ props.max_brightness = bl->info.max;
+
+ bl->dev = devm_backlight_device_register(dev, "edp_backlight",
+ dev, panel,
+ &edp_backlight_ops, &props);
+ if (IS_ERR(bl->dev))
+ return PTR_ERR(bl->dev);
+
+ panel->edp_bl = bl;
+
+ return 0;
+}
+
static struct panel_desc panel_dpi;
static int panel_dpi_probe(struct device *dev,
@@ -796,9 +874,24 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc,
drm_panel_init(&panel->base, dev, &panel_simple_funcs, connector_type);
- err = drm_panel_of_backlight(&panel->base);
- if (err)
- goto disable_pm_runtime;
+ if (panel->desc->uses_dpcd_backlight) {
+ if (!panel->aux) {
+ dev_err(dev, "edp backlight needs DP aux\n");
+ err = -EINVAL;
+ goto disable_pm_runtime;
+ }
+
+ err = edp_backlight_register(dev, panel);
+ if (err) {
+ dev_err(dev, "failed to register edp backlight %d\n", err);
+ goto disable_pm_runtime;
+ }
+
+ } else {
+ err = drm_panel_of_backlight(&panel->base);
+ if (err)
+ goto disable_pm_runtime;
+ }
drm_panel_add(&panel->base);
--
2.7.4
next prev parent reply other threads:[~2021-05-25 7:31 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-25 7:30 [v4 0/4] drm: Support basic DPCD backlight in panel-simple and add a new panel ATNA33XC20 Rajeev Nandan
2021-05-25 7:30 ` Rajeev Nandan [this message]
2021-05-25 11:41 ` [v4 1/4] drm/panel-simple: Add basic DPCD backlight support kernel test robot
2021-05-25 17:18 ` Doug Anderson
2021-05-27 12:21 ` rajeevny
2021-05-27 21:41 ` Doug Anderson
2021-06-01 18:28 ` Lyude Paul
2021-06-01 22:20 ` Lyude Paul
2021-06-02 5:38 ` rajeevny
2021-06-08 21:02 ` Doug Anderson
2021-05-25 7:30 ` [v4 2/4] drm/panel-simple: Support for delays between GPIO & regulator Rajeev Nandan
2021-05-25 17:18 ` Doug Anderson
2021-05-25 7:30 ` [v4 3/4] dt-bindings: display: simple: Add Samsung ATNA33XC20 Rajeev Nandan
2021-05-25 17:19 ` Doug Anderson
2021-05-25 7:30 ` [v4 4/4] drm/panel-simple: " Rajeev Nandan
2021-05-25 17:19 ` Doug Anderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1621927831-29471-2-git-send-email-rajeevny@codeaurora.org \
--to=rajeevny@codeaurora.org \
--cc=a.hajda@samsung.com \
--cc=abhinavk@codeaurora.org \
--cc=daniel.thompson@linaro.org \
--cc=devicetree@vger.kernel.org \
--cc=dianders@chromium.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=freedreno@lists.freedesktop.org \
--cc=hoegsberg@chromium.org \
--cc=jani.nikula@intel.com \
--cc=kalyan_t@codeaurora.org \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lyude@redhat.com \
--cc=mkrishn@codeaurora.org \
--cc=robdclark@gmail.com \
--cc=robh@kernel.org \
--cc=sam@ravnborg.org \
--cc=seanpaul@chromium.org \
--cc=thierry.reding@gmail.com \
--cc=y@qualcomm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).