* [PATCH v3 01/10] dt-bindings: display: panel: s6e3ha8: Adjust to reflect the DDIC and panel used
2026-11-08 12:32 [PATCH v3 00/10] Pixel 3 XL display panel support David Heidelberg via B4 Relay
@ 2026-11-08 12:32 ` David Heidelberg via B4 Relay
2026-11-08 12:32 ` [PATCH v3 02/10] dt-bindings: display: panel: samsung,s6e3ha8: Add AMB630QY01 panel David Heidelberg via B4 Relay
` (8 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-11-08 12:32 UTC (permalink / raw)
To: Dzmitry Sankouski, Neil Armstrong, Jessica Zhang, David Airlie,
Simona Vetter, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson, Konrad Dybcio, Abel Vesa
Cc: Konrad Dybcio, Petr Vorel, dri-devel, devicetree, linux-kernel,
linux-arm-msm, phone-devel, David Heidelberg
From: David Heidelberg <david@ixit.cz>
S6E3HA8 is the DDIC, while the panel used on the Samsung Galaxy S9 is
the Samsung AMB577PX01. Introduce a compatible reflecting that, adjust
the example, and deprecate the DDIC-only samsung,s6e3ha8 compatible.
We're going to introduce another panel with different sequence, so keep
calling original panel sequence just by the DDIC name is confusing.
While we at it, we can cleanly fix reversed GPIO polarity.
Update the polarity to better match newly introduced compatibles with
fixed logic.
Signed-off-by: David Heidelberg <david@ixit.cz>
---
.../bindings/display/panel/samsung,s6e3ha8.yaml | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/Documentation/devicetree/bindings/display/panel/samsung,s6e3ha8.yaml b/Documentation/devicetree/bindings/display/panel/samsung,s6e3ha8.yaml
index 00ce5a4e1c6be..ca250b1b91712 100644
--- a/Documentation/devicetree/bindings/display/panel/samsung,s6e3ha8.yaml
+++ b/Documentation/devicetree/bindings/display/panel/samsung,s6e3ha8.yaml
@@ -1,28 +1,35 @@
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
%YAML 1.2
---
$id: http://devicetree.org/schemas/display/panel/samsung,s6e3ha8.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Samsung s6e3ha8 AMOLED DSI panel
-description: The s6e3ha8 is a 1440x2960 DPI display panel from Samsung Mobile
- Displays (SMD).
+description: |
+ The s6e3ha8 is a display driver IC used in 1440x2960 AMOLED panels from
+ Samsung Mobile Displays (SMD).
+
+ Known panels:
+ - AMB577PX01, 5.77", Samsung Galaxy S9 (samsung,s6e3ha8-amb577px01)
maintainers:
- Dzmitry Sankouski <dsankouski@gmail.com>
allOf:
- $ref: panel-common.yaml#
properties:
compatible:
- const: samsung,s6e3ha8
+ oneOf:
+ - const: samsung,s6e3ha8-amb577px01
+ - const: samsung,s6e3ha8
+ deprecated: true
reg:
maxItems: 1
vdd3-supply:
description: VDD regulator
vci-supply:
@@ -44,23 +51,23 @@ examples:
- |
#include <dt-bindings/gpio/gpio.h>
dsi {
#address-cells = <1>;
#size-cells = <0>;
panel@0 {
- compatible = "samsung,s6e3ha8";
+ compatible = "samsung,s6e3ha8-amb577px01";
reg = <0>;
vci-supply = <&s2dos05_ldo4>;
vddr-supply = <&s2dos05_buck1>;
vdd3-supply = <&s2dos05_ldo1>;
te-gpios = <&tlmm 10 GPIO_ACTIVE_HIGH>;
- reset-gpios = <&tlmm 6 GPIO_ACTIVE_HIGH>;
+ reset-gpios = <&tlmm 6 GPIO_ACTIVE_LOW>;
pinctrl-0 = <&sde_dsi_active &sde_te_active_sleep>;
pinctrl-1 = <&sde_dsi_suspend &sde_te_active_sleep>;
pinctrl-names = "default", "sleep";
port {
panel_in: endpoint {
remote-endpoint = <&mdss_dsi0_out>;
};
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH v3 02/10] dt-bindings: display: panel: samsung,s6e3ha8: Add AMB630QY01 panel
2026-11-08 12:32 [PATCH v3 00/10] Pixel 3 XL display panel support David Heidelberg via B4 Relay
2026-11-08 12:32 ` [PATCH v3 01/10] dt-bindings: display: panel: s6e3ha8: Adjust to reflect the DDIC and panel used David Heidelberg via B4 Relay
@ 2026-11-08 12:32 ` David Heidelberg via B4 Relay
2026-11-08 12:32 ` [PATCH v3 03/10] drm/panel: s6e3ha8: Introduce AMB577PX01 panel compatible David Heidelberg via B4 Relay
` (7 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-11-08 12:32 UTC (permalink / raw)
To: Dzmitry Sankouski, Neil Armstrong, Jessica Zhang, David Airlie,
Simona Vetter, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson, Konrad Dybcio, Abel Vesa
Cc: Konrad Dybcio, Petr Vorel, dri-devel, devicetree, linux-kernel,
linux-arm-msm, phone-devel, David Heidelberg
From: David Heidelberg <david@ixit.cz>
The Google Pixel 3 XL (crosshatch) uses a Samsung AMB630QY01 6.3"
1440x2960 flexible AMOLED panel.
Signed-off-by: David Heidelberg <david@ixit.cz>
---
.../bindings/display/panel/samsung,s6e3ha8.yaml | 41 ++++++++++++++++++----
1 file changed, 34 insertions(+), 7 deletions(-)
diff --git a/Documentation/devicetree/bindings/display/panel/samsung,s6e3ha8.yaml b/Documentation/devicetree/bindings/display/panel/samsung,s6e3ha8.yaml
index ca250b1b91712..dcf347fe5ca83 100644
--- a/Documentation/devicetree/bindings/display/panel/samsung,s6e3ha8.yaml
+++ b/Documentation/devicetree/bindings/display/panel/samsung,s6e3ha8.yaml
@@ -7,48 +7,75 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
title: Samsung s6e3ha8 AMOLED DSI panel
description: |
The s6e3ha8 is a display driver IC used in 1440x2960 AMOLED panels from
Samsung Mobile Displays (SMD).
Known panels:
- AMB577PX01, 5.77", Samsung Galaxy S9 (samsung,s6e3ha8-amb577px01)
+ - AMB630QY01, 6.3", Google Pixel 3 XL (samsung,s6e3ha8-amb630qy01)
maintainers:
- Dzmitry Sankouski <dsankouski@gmail.com>
+required:
+ - compatible
+ - reset-gpios
+ - vdd3-supply
+ - vci-supply
+
allOf:
- $ref: panel-common.yaml#
+ - if:
+ properties:
+ compatible:
+ contains:
+ enum:
+ - samsung,s6e3ha8
+ - samsung,s6e3ha8-amb577px01
+ then:
+ required:
+ - vddr-supply
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: samsung,s6e3ha8-amb630qy01
+ then:
+ required:
+ - vddpos-supply
+ - vddneg-supply
properties:
compatible:
oneOf:
- - const: samsung,s6e3ha8-amb577px01
+ - enum:
+ - samsung,s6e3ha8-amb577px01
+ - samsung,s6e3ha8-amb630qy01
- const: samsung,s6e3ha8
deprecated: true
reg:
maxItems: 1
vdd3-supply:
description: VDD regulator
vci-supply:
description: VCI regulator
vddr-supply:
description: VDDR regulator
-required:
- - compatible
- - reset-gpios
- - vdd3-supply
- - vci-supply
- - vddr-supply
+ vddpos-supply:
+ description: positive boost supply regulator (ELVDD)
+
+ vddneg-supply:
+ description: negative boost supply regulator (ELVSS)
unevaluatedProperties: false
examples:
- |
#include <dt-bindings/gpio/gpio.h>
dsi {
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH v3 03/10] drm/panel: s6e3ha8: Introduce AMB577PX01 panel compatible
2026-11-08 12:32 [PATCH v3 00/10] Pixel 3 XL display panel support David Heidelberg via B4 Relay
2026-11-08 12:32 ` [PATCH v3 01/10] dt-bindings: display: panel: s6e3ha8: Adjust to reflect the DDIC and panel used David Heidelberg via B4 Relay
2026-11-08 12:32 ` [PATCH v3 02/10] dt-bindings: display: panel: samsung,s6e3ha8: Add AMB630QY01 panel David Heidelberg via B4 Relay
@ 2026-11-08 12:32 ` David Heidelberg via B4 Relay
2026-11-08 12:32 ` [PATCH v3 04/10] drm/panel: s6e3ha8: Prepare for supporting multiple panels David Heidelberg via B4 Relay
` (6 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-11-08 12:32 UTC (permalink / raw)
To: Dzmitry Sankouski, Neil Armstrong, Jessica Zhang, David Airlie,
Simona Vetter, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson, Konrad Dybcio, Abel Vesa
Cc: Konrad Dybcio, Petr Vorel, dri-devel, devicetree, linux-kernel,
linux-arm-msm, phone-devel, David Heidelberg
From: David Heidelberg <david@ixit.cz>
S6E3HA8 is the DDIC, while the panel used on the Samsung Galaxy S9 is
the Samsung AMB577PX01. Match on the new panel compatible, and keep
the deprecated DDIC-only one working for existing devicetrees.
Reviewed-by: Petr Vorel <petr.vorel@gmail.com>
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: David Heidelberg <david@ixit.cz>
---
drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c b/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
index 078523df48860..45b1c522b0ccf 100644
--- a/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
+++ b/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
@@ -296,17 +296,18 @@ static int s6e3ha8_amb577px01_wqhd_probe(struct mipi_dsi_device *dsi)
dev_err(dev, "Failed to attach to DSI host: %d\n", ret);
return ret;
}
return 0;
}
static const struct of_device_id s6e3ha8_amb577px01_wqhd_of_match[] = {
- { .compatible = "samsung,s6e3ha8" },
+ { .compatible = "samsung,s6e3ha8" }, /* deprecated */
+ { .compatible = "samsung,s6e3ha8-amb577px01" },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, s6e3ha8_amb577px01_wqhd_of_match);
static struct mipi_dsi_driver s6e3ha8_amb577px01_wqhd_driver = {
.probe = s6e3ha8_amb577px01_wqhd_probe,
.driver = {
.name = "panel-s6e3ha8",
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH v3 04/10] drm/panel: s6e3ha8: Prepare for supporting multiple panels
2026-11-08 12:32 [PATCH v3 00/10] Pixel 3 XL display panel support David Heidelberg via B4 Relay
` (2 preceding siblings ...)
2026-11-08 12:32 ` [PATCH v3 03/10] drm/panel: s6e3ha8: Introduce AMB577PX01 panel compatible David Heidelberg via B4 Relay
@ 2026-11-08 12:32 ` David Heidelberg via B4 Relay
2026-11-08 12:32 ` [PATCH v3 05/10] drm/panel: s6e3ha8: Correct the polarity logic within David Heidelberg via B4 Relay
` (5 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-11-08 12:32 UTC (permalink / raw)
To: Dzmitry Sankouski, Neil Armstrong, Jessica Zhang, David Airlie,
Simona Vetter, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson, Konrad Dybcio, Abel Vesa
Cc: Konrad Dybcio, Petr Vorel, dri-devel, devicetree, linux-kernel,
linux-arm-msm, phone-devel, David Heidelberg
From: David Heidelberg <david@ixit.cz>
The S6E3HA8 DDIC drives more panels than the Galaxy S9 (AMB577PX01)
one currently supported. Move the display mode, DSI mode flags,
regulator supplies and panel functions into a per-compatible descriptor
passed as OF match data, and rename the panel-specific symbols
accordingly.
No functional change.
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: David Heidelberg <david@ixit.cz>
---
drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c | 118 ++++++++++++++++----------
1 file changed, 74 insertions(+), 44 deletions(-)
diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c b/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
index 45b1c522b0ccf..f5b3992d948bc 100644
--- a/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
+++ b/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
@@ -3,49 +3,73 @@
// Generated with linux-mdss-dsi-panel-driver-generator from vendor device tree:
// Copyright (c) 2013, The Linux Foundation. All rights reserved.
// Copyright (c) 2024 Dzmitry Sankouski <dsankouski@gmail.com>
#include <linux/delay.h>
#include <linux/gpio/consumer.h>
#include <linux/module.h>
#include <linux/of.h>
+#include <linux/property.h>
#include <linux/regulator/consumer.h>
#include <drm/display/drm_dsc.h>
#include <drm/display/drm_dsc_helper.h>
#include <drm/drm_mipi_dsi.h>
#include <drm/drm_probe_helper.h>
#include <drm/drm_panel.h>
#include "panel-samsung-dsi.h"
+struct s6e3ha8_desc {
+ const struct drm_panel_funcs *funcs;
+ const struct drm_display_mode *mode;
+ unsigned long mode_flags;
+ const struct regulator_bulk_data *supplies;
+ unsigned int num_supplies;
+};
+
struct s6e3ha8 {
struct drm_panel panel;
struct mipi_dsi_device *dsi;
+ const struct s6e3ha8_desc *desc;
struct drm_dsc_config dsc;
struct gpio_desc *reset_gpio;
struct regulator_bulk_data *supplies;
};
-static const struct regulator_bulk_data s6e3ha8_supplies[] = {
+static const struct regulator_bulk_data s6e3ha8_vddr_supplies[] = {
{ .supply = "vdd3" },
{ .supply = "vci" },
{ .supply = "vddr" },
};
-static inline
-struct s6e3ha8 *to_s6e3ha8_amb577px01_wqhd(struct drm_panel *panel)
+static inline struct s6e3ha8 *to_s6e3ha8(struct drm_panel *panel)
{
return container_of(panel, struct s6e3ha8, panel);
}
#define s6e3ha8_afc_off(ctx) \
mipi_dsi_dcs_write_seq_multi(ctx, 0xe2, 0x00, 0x00)
+static int s6e3ha8_get_modes(struct drm_panel *panel,
+ struct drm_connector *connector)
+{
+ struct s6e3ha8 *priv = to_s6e3ha8(panel);
+
+ return drm_connector_helper_get_modes_fixed(connector, priv->desc->mode);
+}
+
+static int s6e3ha8_unprepare(struct drm_panel *panel)
+{
+ struct s6e3ha8 *priv = to_s6e3ha8(panel);
+
+ return regulator_bulk_disable(priv->desc->num_supplies, priv->supplies);
+}
+
static void s6e3ha8_amb577px01_wqhd_reset(struct s6e3ha8 *priv)
{
gpiod_set_value_cansleep(priv->reset_gpio, 1);
usleep_range(5000, 6000);
gpiod_set_value_cansleep(priv->reset_gpio, 0);
usleep_range(5000, 6000);
gpiod_set_value_cansleep(priv->reset_gpio, 1);
usleep_range(5000, 6000);
@@ -130,32 +154,32 @@ static int s6e3ha8_amb577px01_wqhd_on(struct s6e3ha8 *priv)
mipi_dsi_dcs_write_seq_multi(&ctx, 0xf7, 0x03); /* Gamma, LTPS(AID) update */
samsung_dsi_test_key_off_lvl2(&ctx);
samsung_dsi_test_key_off_lvl1(&ctx);
return ctx.accum_err;
}
-static int s6e3ha8_enable(struct drm_panel *panel)
+static int s6e3ha8_amb577px01_wqhd_enable(struct drm_panel *panel)
{
- struct s6e3ha8 *priv = to_s6e3ha8_amb577px01_wqhd(panel);
+ struct s6e3ha8 *priv = to_s6e3ha8(panel);
struct mipi_dsi_device *dsi = priv->dsi;
struct mipi_dsi_multi_context ctx = { .dsi = dsi };
samsung_dsi_test_key_on_lvl1(&ctx);
mipi_dsi_dcs_set_display_on_multi(&ctx);
samsung_dsi_test_key_off_lvl1(&ctx);
return ctx.accum_err;
}
-static int s6e3ha8_disable(struct drm_panel *panel)
+static int s6e3ha8_amb577px01_wqhd_disable(struct drm_panel *panel)
{
- struct s6e3ha8 *priv = to_s6e3ha8_amb577px01_wqhd(panel);
+ struct s6e3ha8 *priv = to_s6e3ha8(panel);
struct mipi_dsi_device *dsi = priv->dsi;
struct mipi_dsi_multi_context ctx = { .dsi = dsi };
samsung_dsi_test_key_on_lvl1(&ctx);
mipi_dsi_dcs_set_display_off_multi(&ctx);
samsung_dsi_test_key_off_lvl1(&ctx);
mipi_dsi_msleep(&ctx, 20);
@@ -165,23 +189,23 @@ static int s6e3ha8_disable(struct drm_panel *panel)
mipi_dsi_msleep(&ctx, 160);
return ctx.accum_err;
}
static int s6e3ha8_amb577px01_wqhd_prepare(struct drm_panel *panel)
{
- struct s6e3ha8 *priv = to_s6e3ha8_amb577px01_wqhd(panel);
+ struct s6e3ha8 *priv = to_s6e3ha8(panel);
struct mipi_dsi_device *dsi = priv->dsi;
struct mipi_dsi_multi_context ctx = { .dsi = dsi };
struct drm_dsc_picture_parameter_set pps;
int ret;
- ret = regulator_bulk_enable(ARRAY_SIZE(s6e3ha8_supplies), priv->supplies);
+ ret = regulator_bulk_enable(priv->desc->num_supplies, priv->supplies);
if (ret < 0)
return ret;
mipi_dsi_msleep(&ctx, 120);
s6e3ha8_amb577px01_wqhd_reset(priv);
ret = s6e3ha8_amb577px01_wqhd_on(priv);
if (ret < 0) {
gpiod_set_value_cansleep(priv->reset_gpio, 1);
@@ -193,88 +217,88 @@ static int s6e3ha8_amb577px01_wqhd_prepare(struct drm_panel *panel)
samsung_dsi_test_key_on_lvl1(&ctx);
mipi_dsi_picture_parameter_set_multi(&ctx, &pps);
samsung_dsi_test_key_off_lvl1(&ctx);
mipi_dsi_msleep(&ctx, 28);
return ctx.accum_err;
err:
- regulator_bulk_disable(ARRAY_SIZE(s6e3ha8_supplies), priv->supplies);
+ regulator_bulk_disable(priv->desc->num_supplies, priv->supplies);
return ret;
}
-static int s6e3ha8_amb577px01_wqhd_unprepare(struct drm_panel *panel)
-{
- struct s6e3ha8 *priv = to_s6e3ha8_amb577px01_wqhd(panel);
-
- return regulator_bulk_disable(ARRAY_SIZE(s6e3ha8_supplies), priv->supplies);
-}
-
static const struct drm_display_mode s6e3ha8_amb577px01_wqhd_mode = {
.clock = (1440 + 116 + 44 + 120) * (2960 + 120 + 80 + 124) * 60 / 1000,
.hdisplay = 1440,
.hsync_start = 1440 + 116,
.hsync_end = 1440 + 116 + 44,
.htotal = 1440 + 116 + 44 + 120,
.vdisplay = 2960,
.vsync_start = 2960 + 120,
.vsync_end = 2960 + 120 + 80,
.vtotal = 2960 + 120 + 80 + 124,
.width_mm = 64,
.height_mm = 132,
};
-static int s6e3ha8_amb577px01_wqhd_get_modes(struct drm_panel *panel,
- struct drm_connector *connector)
-{
- return drm_connector_helper_get_modes_fixed(connector, &s6e3ha8_amb577px01_wqhd_mode);
-}
-
static const struct drm_panel_funcs s6e3ha8_amb577px01_wqhd_panel_funcs = {
.prepare = s6e3ha8_amb577px01_wqhd_prepare,
- .unprepare = s6e3ha8_amb577px01_wqhd_unprepare,
- .get_modes = s6e3ha8_amb577px01_wqhd_get_modes,
- .enable = s6e3ha8_enable,
- .disable = s6e3ha8_disable,
+ .unprepare = s6e3ha8_unprepare,
+ .get_modes = s6e3ha8_get_modes,
+ .enable = s6e3ha8_amb577px01_wqhd_enable,
+ .disable = s6e3ha8_amb577px01_wqhd_disable,
+};
+
+static const struct s6e3ha8_desc s6e3ha8_amb577px01_wqhd_desc = {
+ .funcs = &s6e3ha8_amb577px01_wqhd_panel_funcs,
+ .mode = &s6e3ha8_amb577px01_wqhd_mode,
+ .mode_flags = MIPI_DSI_CLOCK_NON_CONTINUOUS |
+ MIPI_DSI_MODE_VIDEO_NO_HFP | MIPI_DSI_MODE_VIDEO_NO_HBP |
+ MIPI_DSI_MODE_VIDEO_NO_HSA | MIPI_DSI_MODE_NO_EOT_PACKET,
+ .supplies = s6e3ha8_vddr_supplies,
+ .num_supplies = ARRAY_SIZE(s6e3ha8_vddr_supplies),
};
-static int s6e3ha8_amb577px01_wqhd_probe(struct mipi_dsi_device *dsi)
+static int s6e3ha8_probe(struct mipi_dsi_device *dsi)
{
struct device *dev = &dsi->dev;
+ const struct s6e3ha8_desc *desc;
struct s6e3ha8 *priv;
int ret;
- priv = devm_drm_panel_alloc(dev, struct s6e3ha8, panel,
- &s6e3ha8_amb577px01_wqhd_panel_funcs,
+ desc = device_get_match_data(dev);
+ if (!desc)
+ return -ENODEV;
+
+ priv = devm_drm_panel_alloc(dev, struct s6e3ha8, panel, desc->funcs,
DRM_MODE_CONNECTOR_DSI);
if (IS_ERR(priv))
return PTR_ERR(priv);
- ret = devm_regulator_bulk_get_const(dev, ARRAY_SIZE(s6e3ha8_supplies),
- s6e3ha8_supplies,
- &priv->supplies);
+ priv->desc = desc;
+
+ ret = devm_regulator_bulk_get_const(dev, desc->num_supplies,
+ desc->supplies, &priv->supplies);
if (ret < 0) {
dev_err(dev, "failed to get regulators: %d\n", ret);
return ret;
}
priv->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
if (IS_ERR(priv->reset_gpio))
return dev_err_probe(dev, PTR_ERR(priv->reset_gpio),
"Failed to get reset-gpios\n");
priv->dsi = dsi;
mipi_dsi_set_drvdata(dsi, priv);
dsi->lanes = 4;
dsi->format = MIPI_DSI_FMT_RGB888;
- dsi->mode_flags = MIPI_DSI_CLOCK_NON_CONTINUOUS |
- MIPI_DSI_MODE_VIDEO_NO_HFP | MIPI_DSI_MODE_VIDEO_NO_HBP |
- MIPI_DSI_MODE_VIDEO_NO_HSA | MIPI_DSI_MODE_NO_EOT_PACKET;
+ dsi->mode_flags = priv->desc->mode_flags;
priv->panel.prepare_prev_first = true;
ret = devm_drm_panel_add(dev, &priv->panel);
if (ret)
return ret;
/* This panel only supports DSC; unconditionally enable it */
@@ -295,27 +319,33 @@ static int s6e3ha8_amb577px01_wqhd_probe(struct mipi_dsi_device *dsi)
if (ret < 0) {
dev_err(dev, "Failed to attach to DSI host: %d\n", ret);
return ret;
}
return 0;
}
-static const struct of_device_id s6e3ha8_amb577px01_wqhd_of_match[] = {
- { .compatible = "samsung,s6e3ha8" }, /* deprecated */
- { .compatible = "samsung,s6e3ha8-amb577px01" },
+static const struct of_device_id s6e3ha8_of_match[] = {
+ {
+ /* deprecated */
+ .compatible = "samsung,s6e3ha8",
+ .data = &s6e3ha8_amb577px01_wqhd_desc,
+ }, {
+ .compatible = "samsung,s6e3ha8-amb577px01",
+ .data = &s6e3ha8_amb577px01_wqhd_desc,
+ },
{ /* sentinel */ }
};
-MODULE_DEVICE_TABLE(of, s6e3ha8_amb577px01_wqhd_of_match);
+MODULE_DEVICE_TABLE(of, s6e3ha8_of_match);
-static struct mipi_dsi_driver s6e3ha8_amb577px01_wqhd_driver = {
- .probe = s6e3ha8_amb577px01_wqhd_probe,
+static struct mipi_dsi_driver s6e3ha8_driver = {
+ .probe = s6e3ha8_probe,
.driver = {
.name = "panel-s6e3ha8",
- .of_match_table = s6e3ha8_amb577px01_wqhd_of_match,
+ .of_match_table = s6e3ha8_of_match,
},
};
-module_mipi_dsi_driver(s6e3ha8_amb577px01_wqhd_driver);
+module_mipi_dsi_driver(s6e3ha8_driver);
MODULE_AUTHOR("Dzmitry Sankouski <dsankouski@gmail.com>");
MODULE_DESCRIPTION("DRM driver for S6E3HA8 panel");
MODULE_LICENSE("GPL");
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH v3 05/10] drm/panel: s6e3ha8: Correct the polarity logic within
2026-11-08 12:32 [PATCH v3 00/10] Pixel 3 XL display panel support David Heidelberg via B4 Relay
` (3 preceding siblings ...)
2026-11-08 12:32 ` [PATCH v3 04/10] drm/panel: s6e3ha8: Prepare for supporting multiple panels David Heidelberg via B4 Relay
@ 2026-11-08 12:32 ` David Heidelberg via B4 Relay
2026-11-08 12:32 ` [PATCH v3 06/10] drm/panel: s6e3ha8: Assert reset GPIO in unprepare David Heidelberg via B4 Relay
` (4 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-11-08 12:32 UTC (permalink / raw)
To: Dzmitry Sankouski, Neil Armstrong, Jessica Zhang, David Airlie,
Simona Vetter, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson, Konrad Dybcio, Abel Vesa
Cc: Konrad Dybcio, Petr Vorel, dri-devel, devicetree, linux-kernel,
linux-arm-msm, phone-devel, David Heidelberg
From: David Heidelberg <david@ixit.cz>
The reset was introduced with wrong polarity. Correct for the future
compatibles and keep current with reverted logic.
Old DTs keep GPIO_ACTIVE_HIGH and are fixed up via
gpiod_toggle_active_low() on the deprecated compatible.
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: David Heidelberg <david@ixit.cz>
---
drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c | 21 ++++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c b/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
index f5b3992d948bc..99290913de69a 100644
--- a/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
+++ b/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
@@ -20,16 +20,17 @@
#include "panel-samsung-dsi.h"
struct s6e3ha8_desc {
const struct drm_panel_funcs *funcs;
const struct drm_display_mode *mode;
unsigned long mode_flags;
const struct regulator_bulk_data *supplies;
unsigned int num_supplies;
+ bool broken_reset_polarity;
};
struct s6e3ha8 {
struct drm_panel panel;
struct mipi_dsi_device *dsi;
const struct s6e3ha8_desc *desc;
struct drm_dsc_config dsc;
struct gpio_desc *reset_gpio;
@@ -62,22 +63,22 @@ static int s6e3ha8_unprepare(struct drm_panel *panel)
{
struct s6e3ha8 *priv = to_s6e3ha8(panel);
return regulator_bulk_disable(priv->desc->num_supplies, priv->supplies);
}
static void s6e3ha8_amb577px01_wqhd_reset(struct s6e3ha8 *priv)
{
- gpiod_set_value_cansleep(priv->reset_gpio, 1);
- usleep_range(5000, 6000);
gpiod_set_value_cansleep(priv->reset_gpio, 0);
usleep_range(5000, 6000);
gpiod_set_value_cansleep(priv->reset_gpio, 1);
usleep_range(5000, 6000);
+ gpiod_set_value_cansleep(priv->reset_gpio, 0);
+ usleep_range(5000, 6000);
}
static int s6e3ha8_amb577px01_wqhd_on(struct s6e3ha8 *priv)
{
struct mipi_dsi_device *dsi = priv->dsi;
struct mipi_dsi_multi_context ctx = { .dsi = dsi };
dsi->mode_flags |= MIPI_DSI_MODE_LPM;
@@ -243,16 +244,27 @@ static const struct drm_display_mode s6e3ha8_amb577px01_wqhd_mode = {
static const struct drm_panel_funcs s6e3ha8_amb577px01_wqhd_panel_funcs = {
.prepare = s6e3ha8_amb577px01_wqhd_prepare,
.unprepare = s6e3ha8_unprepare,
.get_modes = s6e3ha8_get_modes,
.enable = s6e3ha8_amb577px01_wqhd_enable,
.disable = s6e3ha8_amb577px01_wqhd_disable,
};
+static const struct s6e3ha8_desc s6e3ha8_amb577px01_wqhd_desc_legacy = {
+ .funcs = &s6e3ha8_amb577px01_wqhd_panel_funcs,
+ .mode = &s6e3ha8_amb577px01_wqhd_mode,
+ .mode_flags = MIPI_DSI_CLOCK_NON_CONTINUOUS |
+ MIPI_DSI_MODE_VIDEO_NO_HFP | MIPI_DSI_MODE_VIDEO_NO_HBP |
+ MIPI_DSI_MODE_VIDEO_NO_HSA | MIPI_DSI_MODE_NO_EOT_PACKET,
+ .supplies = s6e3ha8_vddr_supplies,
+ .num_supplies = ARRAY_SIZE(s6e3ha8_vddr_supplies),
+ .broken_reset_polarity = true,
+};
+
static const struct s6e3ha8_desc s6e3ha8_amb577px01_wqhd_desc = {
.funcs = &s6e3ha8_amb577px01_wqhd_panel_funcs,
.mode = &s6e3ha8_amb577px01_wqhd_mode,
.mode_flags = MIPI_DSI_CLOCK_NON_CONTINUOUS |
MIPI_DSI_MODE_VIDEO_NO_HFP | MIPI_DSI_MODE_VIDEO_NO_HBP |
MIPI_DSI_MODE_VIDEO_NO_HSA | MIPI_DSI_MODE_NO_EOT_PACKET,
.supplies = s6e3ha8_vddr_supplies,
.num_supplies = ARRAY_SIZE(s6e3ha8_vddr_supplies),
@@ -283,16 +295,19 @@ static int s6e3ha8_probe(struct mipi_dsi_device *dsi)
return ret;
}
priv->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
if (IS_ERR(priv->reset_gpio))
return dev_err_probe(dev, PTR_ERR(priv->reset_gpio),
"Failed to get reset-gpios\n");
+ if (priv->desc->broken_reset_polarity)
+ gpiod_toggle_active_low(priv->reset_gpio);
+
priv->dsi = dsi;
mipi_dsi_set_drvdata(dsi, priv);
dsi->lanes = 4;
dsi->format = MIPI_DSI_FMT_RGB888;
dsi->mode_flags = priv->desc->mode_flags;
priv->panel.prepare_prev_first = true;
@@ -323,17 +338,17 @@ static int s6e3ha8_probe(struct mipi_dsi_device *dsi)
return 0;
}
static const struct of_device_id s6e3ha8_of_match[] = {
{
/* deprecated */
.compatible = "samsung,s6e3ha8",
- .data = &s6e3ha8_amb577px01_wqhd_desc,
+ .data = &s6e3ha8_amb577px01_wqhd_desc_legacy,
}, {
.compatible = "samsung,s6e3ha8-amb577px01",
.data = &s6e3ha8_amb577px01_wqhd_desc,
},
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, s6e3ha8_of_match);
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH v3 06/10] drm/panel: s6e3ha8: Assert reset GPIO in unprepare
2026-11-08 12:32 [PATCH v3 00/10] Pixel 3 XL display panel support David Heidelberg via B4 Relay
` (4 preceding siblings ...)
2026-11-08 12:32 ` [PATCH v3 05/10] drm/panel: s6e3ha8: Correct the polarity logic within David Heidelberg via B4 Relay
@ 2026-11-08 12:32 ` David Heidelberg via B4 Relay
2026-11-08 12:32 ` [PATCH v3 07/10] drm/panel: s6e3ha8: add Samsung AMB630QY01 (Google Pixel 3 XL) panel David Heidelberg via B4 Relay
` (3 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-11-08 12:32 UTC (permalink / raw)
To: Dzmitry Sankouski, Neil Armstrong, Jessica Zhang, David Airlie,
Simona Vetter, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson, Konrad Dybcio, Abel Vesa
Cc: Konrad Dybcio, Petr Vorel, dri-devel, devicetree, linux-kernel,
linux-arm-msm, phone-devel, David Heidelberg
From: David Heidelberg <david@ixit.cz>
For correct shutdown, the reset should be asserted.
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: David Heidelberg <david@ixit.cz>
---
drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c b/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
index 99290913de69a..2591b8c1a7753 100644
--- a/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
+++ b/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
@@ -58,16 +58,17 @@ static int s6e3ha8_get_modes(struct drm_panel *panel,
return drm_connector_helper_get_modes_fixed(connector, priv->desc->mode);
}
static int s6e3ha8_unprepare(struct drm_panel *panel)
{
struct s6e3ha8 *priv = to_s6e3ha8(panel);
+ gpiod_set_value_cansleep(priv->reset_gpio, 1);
return regulator_bulk_disable(priv->desc->num_supplies, priv->supplies);
}
static void s6e3ha8_amb577px01_wqhd_reset(struct s6e3ha8 *priv)
{
gpiod_set_value_cansleep(priv->reset_gpio, 0);
usleep_range(5000, 6000);
gpiod_set_value_cansleep(priv->reset_gpio, 1);
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH v3 07/10] drm/panel: s6e3ha8: add Samsung AMB630QY01 (Google Pixel 3 XL) panel
2026-11-08 12:32 [PATCH v3 00/10] Pixel 3 XL display panel support David Heidelberg via B4 Relay
` (5 preceding siblings ...)
2026-11-08 12:32 ` [PATCH v3 06/10] drm/panel: s6e3ha8: Assert reset GPIO in unprepare David Heidelberg via B4 Relay
@ 2026-11-08 12:32 ` David Heidelberg via B4 Relay
2026-11-08 12:32 ` [PATCH v3 08/10] arm64: dts: qcom: sdm845-samsung-starqltechn: Update panel compatible David Heidelberg via B4 Relay
` (2 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-11-08 12:32 UTC (permalink / raw)
To: Dzmitry Sankouski, Neil Armstrong, Jessica Zhang, David Airlie,
Simona Vetter, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson, Konrad Dybcio, Abel Vesa
Cc: Konrad Dybcio, Petr Vorel, dri-devel, devicetree, linux-kernel,
linux-arm-msm, phone-devel, David Heidelberg
From: David Heidelberg <david@ixit.cz>
The Google Pixel 3 XL (crosshatch) uses a Samsung AMB630QY01 6.3"
1440x2960 flexible AMOLED panel, driven by the same S6E3HA8 DDIC as
the Galaxy S9 panel this driver already supports.
The init/teardown sequences and timings are taken from the downstream
dsi-panel-s6e3ha8-dsc-wqhd-cmd.dtsi (Google bluecross kernel). The
downstream DSI host neither appends EOT packets nor keeps the clock
lane in HS, so mirror that with the corresponding mode flags, and set
the RAM window explicitly since the kernel DSI host never sends the
column/page addresses the downstream one does.
Unlike the S9 panel, brightness is controlled with standard DCS
commands (10-bit), so register a backlight device for it. Brightness
readback is intentionally not implemented: DCS reads wedge the DSI
host command engine and take the display pipeline down with it.
Cosmetics: update Copyright header and add myself.
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: David Heidelberg <david@ixit.cz>
---
drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c | 173 +++++++++++++++++++++++++-
1 file changed, 168 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c b/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
index 2591b8c1a7753..e02f1d9f0dcd0 100644
--- a/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
+++ b/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
@@ -1,36 +1,42 @@
// SPDX-License-Identifier: GPL-2.0-only
-//
-// Generated with linux-mdss-dsi-panel-driver-generator from vendor device tree:
-// Copyright (c) 2013, The Linux Foundation. All rights reserved.
-// Copyright (c) 2024 Dzmitry Sankouski <dsankouski@gmail.com>
-
+/*
+ * Generated with linux-mdss-dsi-panel-driver-generator from vendor device tree:
+ * Copyright (c) 2013, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2024 Dzmitry Sankouski <dsankouski@gmail.com>
+ * Copyright David Heidelberg
+ */
+
+#include <linux/backlight.h>
#include <linux/delay.h>
#include <linux/gpio/consumer.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/property.h>
#include <linux/regulator/consumer.h>
+#include <video/mipi_display.h>
+
#include <drm/display/drm_dsc.h>
#include <drm/display/drm_dsc_helper.h>
#include <drm/drm_mipi_dsi.h>
#include <drm/drm_probe_helper.h>
#include <drm/drm_panel.h>
#include "panel-samsung-dsi.h"
struct s6e3ha8_desc {
const struct drm_panel_funcs *funcs;
const struct drm_display_mode *mode;
unsigned long mode_flags;
const struct regulator_bulk_data *supplies;
unsigned int num_supplies;
bool broken_reset_polarity;
+ bool has_backlight;
};
struct s6e3ha8 {
struct drm_panel panel;
struct mipi_dsi_device *dsi;
const struct s6e3ha8_desc *desc;
struct drm_dsc_config dsc;
struct gpio_desc *reset_gpio;
@@ -38,16 +44,23 @@ struct s6e3ha8 {
};
static const struct regulator_bulk_data s6e3ha8_vddr_supplies[] = {
{ .supply = "vdd3" },
{ .supply = "vci" },
{ .supply = "vddr" },
};
+static const struct regulator_bulk_data s6e3ha8_boost_supplies[] = {
+ { .supply = "vdd3" },
+ { .supply = "vci" },
+ { .supply = "vddpos" },
+ { .supply = "vddneg" },
+};
+
static inline struct s6e3ha8 *to_s6e3ha8(struct drm_panel *panel)
{
return container_of(panel, struct s6e3ha8, panel);
}
#define s6e3ha8_afc_off(ctx) \
mipi_dsi_dcs_write_seq_multi(ctx, 0xe2, 0x00, 0x00)
@@ -72,16 +85,26 @@ static void s6e3ha8_amb577px01_wqhd_reset(struct s6e3ha8 *priv)
gpiod_set_value_cansleep(priv->reset_gpio, 0);
usleep_range(5000, 6000);
gpiod_set_value_cansleep(priv->reset_gpio, 1);
usleep_range(5000, 6000);
gpiod_set_value_cansleep(priv->reset_gpio, 0);
usleep_range(5000, 6000);
}
+static void s6e3ha8_amb630qy01_reset(struct s6e3ha8 *priv)
+{
+ gpiod_set_value_cansleep(priv->reset_gpio, 0);
+ usleep_range(10000, 11000);
+ gpiod_set_value_cansleep(priv->reset_gpio, 1);
+ usleep_range(1000, 2000);
+ gpiod_set_value_cansleep(priv->reset_gpio, 0);
+ usleep_range(5000, 6000);
+}
+
static int s6e3ha8_amb577px01_wqhd_on(struct s6e3ha8 *priv)
{
struct mipi_dsi_device *dsi = priv->dsi;
struct mipi_dsi_multi_context ctx = { .dsi = dsi };
dsi->mode_flags |= MIPI_DSI_MODE_LPM;
samsung_dsi_test_key_on_lvl1(&ctx);
@@ -266,16 +289,146 @@ static const struct s6e3ha8_desc s6e3ha8_amb577px01_wqhd_desc = {
.mode = &s6e3ha8_amb577px01_wqhd_mode,
.mode_flags = MIPI_DSI_CLOCK_NON_CONTINUOUS |
MIPI_DSI_MODE_VIDEO_NO_HFP | MIPI_DSI_MODE_VIDEO_NO_HBP |
MIPI_DSI_MODE_VIDEO_NO_HSA | MIPI_DSI_MODE_NO_EOT_PACKET,
.supplies = s6e3ha8_vddr_supplies,
.num_supplies = ARRAY_SIZE(s6e3ha8_vddr_supplies),
};
+static int s6e3ha8_amb630qy01_prepare(struct drm_panel *panel)
+{
+ struct s6e3ha8 *priv = to_s6e3ha8(panel);
+ struct mipi_dsi_multi_context ctx = { .dsi = priv->dsi };
+ struct drm_dsc_picture_parameter_set pps;
+ int ret;
+
+ ret = regulator_bulk_enable(priv->desc->num_supplies, priv->supplies);
+ if (ret < 0)
+ return ret;
+
+ s6e3ha8_amb630qy01_reset(priv);
+
+ mipi_dsi_compression_mode_multi(&ctx, true);
+
+ mipi_dsi_dcs_exit_sleep_mode_multi(&ctx);
+ mipi_dsi_msleep(&ctx, 120);
+
+ mipi_dsi_dcs_write_seq_multi(&ctx, MIPI_DCS_WRITE_CONTROL_DISPLAY, 0x20);
+ mipi_dsi_dcs_set_tear_on_multi(&ctx, MIPI_DSI_DCS_TEAR_MODE_VBLANK);
+
+ /*
+ * Unlike the downstream DSI host, the kernel one never sends the
+ * column/page addresses, so set the RAM window explicitly.
+ */
+ mipi_dsi_dcs_set_column_address_multi(&ctx, 0, 1440 - 1);
+ mipi_dsi_dcs_set_page_address_multi(&ctx, 0, 2960 - 1);
+
+ samsung_dsi_test_key_on_lvl2(&ctx);
+ mipi_dsi_dcs_write_seq_multi(&ctx, 0xb9,
+ 0x01, 0xb0, 0x81, 0x09, 0x00, 0x00, 0x00,
+ 0x11, 0x03); /* TSP HSYNC Setting */
+ samsung_dsi_test_key_off_lvl2(&ctx);
+
+ drm_dsc_pps_payload_pack(&pps, &priv->dsc);
+ mipi_dsi_picture_parameter_set_multi(&ctx, &pps);
+
+ if (ctx.accum_err) {
+ gpiod_set_value_cansleep(priv->reset_gpio, 1);
+ regulator_bulk_disable(priv->desc->num_supplies, priv->supplies);
+ }
+
+ return ctx.accum_err;
+}
+
+static int s6e3ha8_amb630qy01_enable(struct drm_panel *panel)
+{
+ struct s6e3ha8 *priv = to_s6e3ha8(panel);
+ struct mipi_dsi_multi_context ctx = { .dsi = priv->dsi };
+
+ mipi_dsi_dcs_set_display_on_multi(&ctx);
+
+ return ctx.accum_err;
+}
+
+static int s6e3ha8_amb630qy01_disable(struct drm_panel *panel)
+{
+ struct s6e3ha8 *priv = to_s6e3ha8(panel);
+ struct mipi_dsi_multi_context ctx = { .dsi = priv->dsi };
+
+ mipi_dsi_dcs_set_display_off_multi(&ctx);
+ mipi_dsi_msleep(&ctx, 10);
+ mipi_dsi_dcs_enter_sleep_mode_multi(&ctx);
+ mipi_dsi_msleep(&ctx, 120);
+
+ return ctx.accum_err;
+}
+
+static const struct drm_display_mode s6e3ha8_amb630qy01_mode = {
+ .clock = (1440 + 116 + 44 + 116) * (2960 + 124 + 120 + 80) * 60 / 1000,
+ .hdisplay = 1440,
+ .hsync_start = 1440 + 116,
+ .hsync_end = 1440 + 116 + 44,
+ .htotal = 1440 + 116 + 44 + 116,
+ .vdisplay = 2960,
+ .vsync_start = 2960 + 124,
+ .vsync_end = 2960 + 124 + 120,
+ .vtotal = 2960 + 124 + 120 + 80,
+ .width_mm = 70,
+ .height_mm = 144,
+};
+
+static const struct drm_panel_funcs s6e3ha8_amb630qy01_panel_funcs = {
+ .prepare = s6e3ha8_amb630qy01_prepare,
+ .unprepare = s6e3ha8_unprepare,
+ .get_modes = s6e3ha8_get_modes,
+ .enable = s6e3ha8_amb630qy01_enable,
+ .disable = s6e3ha8_amb630qy01_disable,
+};
+
+static const struct s6e3ha8_desc s6e3ha8_amb630qy01_desc = {
+ .funcs = &s6e3ha8_amb630qy01_panel_funcs,
+ .mode = &s6e3ha8_amb630qy01_mode,
+ .mode_flags = MIPI_DSI_MODE_LPM | MIPI_DSI_CLOCK_NON_CONTINUOUS |
+ MIPI_DSI_MODE_NO_EOT_PACKET,
+ .supplies = s6e3ha8_boost_supplies,
+ .num_supplies = ARRAY_SIZE(s6e3ha8_boost_supplies),
+ .has_backlight = true,
+};
+
+static int s6e3ha8_bl_update_status(struct backlight_device *bl)
+{
+ struct mipi_dsi_device *dsi = bl_get_data(bl);
+ u16 brightness = backlight_get_brightness(bl);
+
+ return mipi_dsi_dcs_set_display_brightness_large(dsi, brightness);
+}
+
+/*
+ * No .get_brightness: DCS reads wedge the DSI host command engine and
+ * take the whole display pipeline down with it.
+ */
+static const struct backlight_ops s6e3ha8_bl_ops = {
+ .update_status = s6e3ha8_bl_update_status,
+};
+
+static struct backlight_device *
+s6e3ha8_create_backlight(struct mipi_dsi_device *dsi)
+{
+ struct device *dev = &dsi->dev;
+ const struct backlight_properties props = {
+ .type = BACKLIGHT_RAW,
+ .brightness = 512,
+ .max_brightness = 1023,
+ };
+
+ return devm_backlight_device_register(dev, dev_name(dev), dev, dsi,
+ &s6e3ha8_bl_ops, &props);
+}
+
static int s6e3ha8_probe(struct mipi_dsi_device *dsi)
{
struct device *dev = &dsi->dev;
const struct s6e3ha8_desc *desc;
struct s6e3ha8 *priv;
int ret;
desc = device_get_match_data(dev);
@@ -308,16 +461,23 @@ static int s6e3ha8_probe(struct mipi_dsi_device *dsi)
mipi_dsi_set_drvdata(dsi, priv);
dsi->lanes = 4;
dsi->format = MIPI_DSI_FMT_RGB888;
dsi->mode_flags = priv->desc->mode_flags;
priv->panel.prepare_prev_first = true;
+ if (priv->desc->has_backlight) {
+ priv->panel.backlight = s6e3ha8_create_backlight(dsi);
+ if (IS_ERR(priv->panel.backlight))
+ return dev_err_probe(dev, PTR_ERR(priv->panel.backlight),
+ "Failed to create backlight\n");
+ }
+
ret = devm_drm_panel_add(dev, &priv->panel);
if (ret)
return ret;
/* This panel only supports DSC; unconditionally enable it */
dsi->dsc = &priv->dsc;
priv->dsc.dsc_version_major = 1;
@@ -343,16 +503,19 @@ static int s6e3ha8_probe(struct mipi_dsi_device *dsi)
static const struct of_device_id s6e3ha8_of_match[] = {
{
/* deprecated */
.compatible = "samsung,s6e3ha8",
.data = &s6e3ha8_amb577px01_wqhd_desc_legacy,
}, {
.compatible = "samsung,s6e3ha8-amb577px01",
.data = &s6e3ha8_amb577px01_wqhd_desc,
+ }, {
+ .compatible = "samsung,s6e3ha8-amb630qy01",
+ .data = &s6e3ha8_amb630qy01_desc,
},
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, s6e3ha8_of_match);
static struct mipi_dsi_driver s6e3ha8_driver = {
.probe = s6e3ha8_probe,
.driver = {
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH v3 08/10] arm64: dts: qcom: sdm845-samsung-starqltechn: Update panel compatible
2026-11-08 12:32 [PATCH v3 00/10] Pixel 3 XL display panel support David Heidelberg via B4 Relay
` (6 preceding siblings ...)
2026-11-08 12:32 ` [PATCH v3 07/10] drm/panel: s6e3ha8: add Samsung AMB630QY01 (Google Pixel 3 XL) panel David Heidelberg via B4 Relay
@ 2026-11-08 12:32 ` David Heidelberg via B4 Relay
2026-11-08 12:32 ` [PATCH v3 09/10] arm64: dts: qcom: sdm845-google: Move panel pins into common David Heidelberg via B4 Relay
2026-11-08 12:32 ` [PATCH v3 10/10] arm64: dts: qcom: sdm845-google-crosshatch: Add display panel David Heidelberg via B4 Relay
9 siblings, 0 replies; 11+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-11-08 12:32 UTC (permalink / raw)
To: Dzmitry Sankouski, Neil Armstrong, Jessica Zhang, David Airlie,
Simona Vetter, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson, Konrad Dybcio, Abel Vesa
Cc: Konrad Dybcio, Petr Vorel, dri-devel, devicetree, linux-kernel,
linux-arm-msm, phone-devel, David Heidelberg
From: David Heidelberg <david@ixit.cz>
Original compatible describing only the DDIC used, but omit describing
the panel used (Samsung AMB577PX01), which we have no way to detect.
New compatible allows without breaking ABI fixing the inverted reset.
Reviewed-by: Petr Vorel <petr.vorel@gmail.com>
Signed-off-by: David Heidelberg <david@ixit.cz>
---
arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts b/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts
index bd59f1dcd96dc..c156ed3733b4e 100644
--- a/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts
+++ b/arch/arm64/boot/dts/qcom/sdm845-samsung-starqltechn.dts
@@ -262,23 +262,23 @@ &mdss {
status = "okay";
};
&mdss_dsi0 {
vdda-supply = <&vreg_l26a_1p2>;
status = "okay";
panel@0 {
- compatible = "samsung,s6e3ha8";
+ compatible = "samsung,s6e3ha8-amb577px01";
reg = <0>;
vci-supply = <&s2dos05_ldo4>;
vddr-supply = <&s2dos05_buck>;
vdd3-supply = <&s2dos05_ldo1>;
te-gpios = <&tlmm 10 GPIO_ACTIVE_HIGH>;
- reset-gpios = <&tlmm 6 GPIO_ACTIVE_HIGH>;
+ reset-gpios = <&tlmm 6 GPIO_ACTIVE_LOW>;
pinctrl-0 = <&dsi_default &dsi_te>;
pinctrl-1 = <&dsi_suspend &dsi_te>;
pinctrl-names = "default", "suspend";
port {
panel_in: endpoint {
remote-endpoint = <&mdss_dsi0_out>;
};
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH v3 09/10] arm64: dts: qcom: sdm845-google: Move panel pins into common
2026-11-08 12:32 [PATCH v3 00/10] Pixel 3 XL display panel support David Heidelberg via B4 Relay
` (7 preceding siblings ...)
2026-11-08 12:32 ` [PATCH v3 08/10] arm64: dts: qcom: sdm845-samsung-starqltechn: Update panel compatible David Heidelberg via B4 Relay
@ 2026-11-08 12:32 ` David Heidelberg via B4 Relay
2026-11-08 12:32 ` [PATCH v3 10/10] arm64: dts: qcom: sdm845-google-crosshatch: Add display panel David Heidelberg via B4 Relay
9 siblings, 0 replies; 11+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-11-08 12:32 UTC (permalink / raw)
To: Dzmitry Sankouski, Neil Armstrong, Jessica Zhang, David Airlie,
Simona Vetter, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson, Konrad Dybcio, Abel Vesa
Cc: Konrad Dybcio, Petr Vorel, dri-devel, devicetree, linux-kernel,
linux-arm-msm, phone-devel, David Heidelberg
From: David Heidelberg <david@ixit.cz>
Both devices share the pinctrl configuration.
Reviewed-by: Petr Vorel <petr.vorel@gmail.com>
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Signed-off-by: David Heidelberg <david@ixit.cz>
---
arch/arm64/boot/dts/qcom/sdm845-google-blueline.dts | 18 ------------------
arch/arm64/boot/dts/qcom/sdm845-google-common.dtsi | 16 ++++++++++++++++
2 files changed, 16 insertions(+), 18 deletions(-)
diff --git a/arch/arm64/boot/dts/qcom/sdm845-google-blueline.dts b/arch/arm64/boot/dts/qcom/sdm845-google-blueline.dts
index fa89be500fb85..a000c75494f1c 100644
--- a/arch/arm64/boot/dts/qcom/sdm845-google-blueline.dts
+++ b/arch/arm64/boot/dts/qcom/sdm845-google-blueline.dts
@@ -61,29 +61,11 @@ &mdss_dsi0_out {
};
&mdss_dsi0_phy {
vdds-supply = <&vdda_mipi_dsi0_pll>;
status = "okay";
};
-&tlmm {
- panel_default: panel-default-state {
- reset-pins {
- pins = "gpio6";
- function = "gpio";
- drive-strength = <8>;
- bias-disable;
- };
-
- te-pins {
- pins = "gpio12";
- function = "mdp_vsync";
- drive-strength = <2>;
- bias-pull-down;
- };
- };
-};
-
&wifi {
qcom,calibration-variant = "Google_blueline";
};
diff --git a/arch/arm64/boot/dts/qcom/sdm845-google-common.dtsi b/arch/arm64/boot/dts/qcom/sdm845-google-common.dtsi
index f1379857e2742..d54cb47cdf95b 100644
--- a/arch/arm64/boot/dts/qcom/sdm845-google-common.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm845-google-common.dtsi
@@ -473,16 +473,32 @@ &qup_uart9_tx {
drive-strength = <2>;
bias-disable;
};
&tlmm {
gpio-reserved-ranges = < 0 4>, /* SPI (Intel MNH Pixel Visual Core) */
<81 4>; /* SPI (most likely Fingerprint Cards FPC1075) */
+ panel_default: panel-default-state {
+ reset-pins {
+ pins = "gpio6";
+ function = "gpio";
+ drive-strength = <8>;
+ bias-disable;
+ };
+
+ te-pins {
+ pins = "gpio12";
+ function = "mdp_vsync";
+ drive-strength = <2>;
+ bias-pull-down;
+ };
+ };
+
nfc_default: nfc-default-state {
enable-pins {
pins = "gpio25";
function = "gpio";
drive-strength = <2>;
bias-pull-down;
};
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH v3 10/10] arm64: dts: qcom: sdm845-google-crosshatch: Add display panel
2026-11-08 12:32 [PATCH v3 00/10] Pixel 3 XL display panel support David Heidelberg via B4 Relay
` (8 preceding siblings ...)
2026-11-08 12:32 ` [PATCH v3 09/10] arm64: dts: qcom: sdm845-google: Move panel pins into common David Heidelberg via B4 Relay
@ 2026-11-08 12:32 ` David Heidelberg via B4 Relay
9 siblings, 0 replies; 11+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-11-08 12:32 UTC (permalink / raw)
To: Dzmitry Sankouski, Neil Armstrong, Jessica Zhang, David Airlie,
Simona Vetter, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Bjorn Andersson, Konrad Dybcio, Abel Vesa
Cc: Konrad Dybcio, Petr Vorel, dri-devel, devicetree, linux-kernel,
linux-arm-msm, phone-devel, David Heidelberg
From: David Heidelberg <david@ixit.cz>
Wire up the Samsung AMB630QY01 AMOLED panel on the Pixel 3 XL and drop
the MDSS/DISPCC disables that kept simple-framebuffer alive.
Signed-off-by: David Heidelberg <david@ixit.cz>
---
.../boot/dts/qcom/sdm845-google-crosshatch.dts | 60 +++++++++++++++++++---
1 file changed, 52 insertions(+), 8 deletions(-)
diff --git a/arch/arm64/boot/dts/qcom/sdm845-google-crosshatch.dts b/arch/arm64/boot/dts/qcom/sdm845-google-crosshatch.dts
index 2a81ca1d00b1b..3b788757b7303 100644
--- a/arch/arm64/boot/dts/qcom/sdm845-google-crosshatch.dts
+++ b/arch/arm64/boot/dts/qcom/sdm845-google-crosshatch.dts
@@ -10,27 +10,71 @@ / {
};
&battery {
charge-full-design-microamp-hours = <3480000>;
voltage-min-design-microvolt = <3600000>;
voltage-max-design-microvolt = <4400000>;
};
-&dispcc {
- /* Disable for now so simple-framebuffer continues working */
- status = "disabled";
-};
-
&framebuffer0 {
width = <1440>;
height = <2960>;
stride = <(1440 * 4)>;
};
-&mdss {
- /* Disable for now so simple-framebuffer continues working */
- status = "disabled";
+&ibb {
+ regulator-min-microvolt = <4600000>;
+ regulator-max-microvolt = <6000000>;
+ regulator-over-current-protection;
+ regulator-pull-down;
+ regulator-soft-start;
+};
+
+&lab {
+ regulator-min-microvolt = <4600000>;
+ regulator-max-microvolt = <6000000>;
+ regulator-soft-start;
+ regulator-pull-down;
+};
+
+&mdss_dsi0 {
+ vdda-supply = <&vdda_mipi_dsi0_1p2>;
+
+ status = "okay";
+
+ panel@0 {
+ compatible = "samsung,s6e3ha8-amb630qy01";
+ reg = <0>;
+
+ vdd3-supply = <&vreg_l14a_1p8>;
+ vci-supply = <&vreg_l28a_3p0>;
+ vddpos-supply = <&lab>;
+ vddneg-supply = <&ibb>;
+
+ reset-gpios = <&tlmm 6 GPIO_ACTIVE_LOW>;
+
+ pinctrl-0 = <&panel_default>;
+ pinctrl-names = "default";
+
+ port {
+ panel_in: endpoint {
+ remote-endpoint = <&mdss_dsi0_out>;
+ };
+ };
+ };
+};
+
+&mdss_dsi0_out {
+ data-lanes = <0 1 2 3>;
+ remote-endpoint = <&panel_in>;
+ qcom,te-source = "mdp_vsync_e";
+};
+
+&mdss_dsi0_phy {
+ vdds-supply = <&vdda_mipi_dsi0_pll>;
+
+ status = "okay";
};
&wifi {
qcom,calibration-variant = "Google_crosshatch";
};
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread