* [PATCH 00/11] Pixel 3 XL display panel support
@ 2026-09-20 11:05 David Heidelberg via B4 Relay
2026-09-20 11:05 ` [PATCH 01/11] dt-bindings: display: panel: s6e3ha8: Adjust to reflect the DDIC and panel used David Heidelberg via B4 Relay
` (10 more replies)
0 siblings, 11 replies; 23+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-09-20 11:05 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: dri-devel, devicetree, linux-kernel, linux-arm-msm, phone-devel,
David Heidelberg, stable
Introduce Samsung AMB630QY01 (Google Pixel 3 XL) panel.
Includes refactoring and improvements to the S6E3HA8 DDIC which is also
used by Samsung S9 (Korea version).
Patches 9 and 11 switch to the new compatibles, so they must not reach
the qcom tree before the driver patches land.
Signed-off-by: David Heidelberg <david@ixit.cz>
---
David Heidelberg (11):
dt-bindings: display: panel: s6e3ha8: Adjust to reflect the DDIC and panel used
dt-bindings: display: panel: samsung,s6e3ha8: Add AMB630QY01 panel
drm/panel: s6e3ha8: Really assert reset on the failure
drm/panel: s6e3ha8: Introduce AMB577PX01 panel compatible
drm/panel: s6e3ha8: Prepare for supporting multiple panels
drm/panel: s6e3ha8: Correct the polarity logic within
drm/panel: s6e3ha8: Assert reset GPIO in unprepare
drm/panel: s6e3ha8: add Samsung AMB630QY01 (Google Pixel 3 XL) panel
arm64: dts: qcom: sdm845-samsung-starqltechn: Update panel compatible
arm64: dts: qcom: sdm845-google: Move panel pins into common
arm64: dts: qcom: sdm845-google-crosshatch: Add display panel
.../bindings/display/panel/samsung,s6e3ha8.yaml | 46 +++-
.../arm64/boot/dts/qcom/sdm845-google-blueline.dts | 18 --
arch/arm64/boot/dts/qcom/sdm845-google-common.dtsi | 16 ++
.../boot/dts/qcom/sdm845-google-crosshatch.dts | 60 +++-
.../boot/dts/qcom/sdm845-samsung-starqltechn.dts | 4 +-
drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c | 304 +++++++++++++++++----
6 files changed, 367 insertions(+), 81 deletions(-)
---
base-commit: 3f2425f5b5bbbdd991ca9cdfd5502e68d8895998
change-id: 20260801-crosshatch-panel-06ce8a69fb7f
Best regards,
--
David Heidelberg <david@ixit.cz>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH 01/11] dt-bindings: display: panel: s6e3ha8: Adjust to reflect the DDIC and panel used
2026-09-20 11:05 [PATCH 00/11] Pixel 3 XL display panel support David Heidelberg via B4 Relay
@ 2026-09-20 11:05 ` David Heidelberg via B4 Relay
2026-09-20 11:05 ` [PATCH 02/11] dt-bindings: display: panel: samsung,s6e3ha8: Add AMB630QY01 panel David Heidelberg via B4 Relay
` (9 subsequent siblings)
10 siblings, 0 replies; 23+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-09-20 11:05 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: 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.
Update the polarity to better match newly introduced compatibles with
fixed logic.
Assisted-by: LLM
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] 23+ messages in thread
* [PATCH 02/11] dt-bindings: display: panel: samsung,s6e3ha8: Add AMB630QY01 panel
2026-09-20 11:05 [PATCH 00/11] Pixel 3 XL display panel support David Heidelberg via B4 Relay
2026-09-20 11:05 ` [PATCH 01/11] dt-bindings: display: panel: s6e3ha8: Adjust to reflect the DDIC and panel used David Heidelberg via B4 Relay
@ 2026-09-20 11:05 ` David Heidelberg via B4 Relay
2026-09-20 11:05 ` [PATCH 03/11] drm/panel: s6e3ha8: Really assert reset on the failure David Heidelberg via B4 Relay
` (8 subsequent siblings)
10 siblings, 0 replies; 23+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-09-20 11:05 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: 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.
Assisted-by: LLM
Signed-off-by: David Heidelberg <david@ixit.cz>
---
.../bindings/display/panel/samsung,s6e3ha8.yaml | 31 ++++++++++++++++++++--
1 file changed, 29 insertions(+), 2 deletions(-)
diff --git a/Documentation/devicetree/bindings/display/panel/samsung,s6e3ha8.yaml b/Documentation/devicetree/bindings/display/panel/samsung,s6e3ha8.yaml
index ca250b1b91712..acc2ea2969298 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>
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
+ vddpos-supply:
+ description: positive boost supply regulator (ELVDD)
+
+ vddneg-supply:
+ description: negative boost supply regulator (ELVSS)
+
required:
- compatible
- reset-gpios
- vdd3-supply
- vci-supply
- - vddr-supply
unevaluatedProperties: false
examples:
- |
#include <dt-bindings/gpio/gpio.h>
dsi {
--
2.55.0
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH 03/11] drm/panel: s6e3ha8: Really assert reset on the failure
2026-09-20 11:05 [PATCH 00/11] Pixel 3 XL display panel support David Heidelberg via B4 Relay
2026-09-20 11:05 ` [PATCH 01/11] dt-bindings: display: panel: s6e3ha8: Adjust to reflect the DDIC and panel used David Heidelberg via B4 Relay
2026-09-20 11:05 ` [PATCH 02/11] dt-bindings: display: panel: samsung,s6e3ha8: Add AMB630QY01 panel David Heidelberg via B4 Relay
@ 2026-09-20 11:05 ` David Heidelberg via B4 Relay
2026-09-24 13:24 ` Neil Armstrong
2026-09-20 11:05 ` [PATCH 04/11] drm/panel: s6e3ha8: Introduce AMB577PX01 panel compatible David Heidelberg via B4 Relay
` (7 subsequent siblings)
10 siblings, 1 reply; 23+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-09-20 11:05 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: dri-devel, devicetree, linux-kernel, linux-arm-msm, phone-devel,
David Heidelberg, stable
From: David Heidelberg <david@ixit.cz>
Due to incorrect implementation 0 == asserted, thus when driver fails it
needs to assert reset.
Minimal fix for stable; the polarity convention is corrected properly
later in this series.
Fixes: 779679d3c1640 ("drm/panel: Add support for S6E3HA8 panel driver")
Cc: stable@vger.kernel.org
Assisted-by: LLM
Signed-off-by: David Heidelberg <david@ixit.cz>
---
drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c b/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
index 078523df48860..835121b322f4a 100644
--- a/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
+++ b/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
@@ -179,17 +179,17 @@ static int s6e3ha8_amb577px01_wqhd_prepare(struct drm_panel *panel)
ret = regulator_bulk_enable(ARRAY_SIZE(s6e3ha8_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);
+ gpiod_set_value_cansleep(priv->reset_gpio, 0);
goto err;
}
drm_dsc_pps_payload_pack(&pps, &priv->dsc);
samsung_dsi_test_key_on_lvl1(&ctx);
mipi_dsi_picture_parameter_set_multi(&ctx, &pps);
samsung_dsi_test_key_off_lvl1(&ctx);
--
2.55.0
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH 04/11] drm/panel: s6e3ha8: Introduce AMB577PX01 panel compatible
2026-09-20 11:05 [PATCH 00/11] Pixel 3 XL display panel support David Heidelberg via B4 Relay
` (2 preceding siblings ...)
2026-09-20 11:05 ` [PATCH 03/11] drm/panel: s6e3ha8: Really assert reset on the failure David Heidelberg via B4 Relay
@ 2026-09-20 11:05 ` David Heidelberg via B4 Relay
2026-09-23 22:51 ` [PATCH 04/11] drm/panel: s6e3ha8: Introduce AMB577PX01 panel Petr Vorel
2026-09-24 13:25 ` [PATCH 04/11] drm/panel: s6e3ha8: Introduce AMB577PX01 panel compatible Neil Armstrong
2026-09-20 11:05 ` [PATCH 05/11] drm/panel: s6e3ha8: Prepare for supporting multiple panels David Heidelberg via B4 Relay
` (6 subsequent siblings)
10 siblings, 2 replies; 23+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-09-20 11:05 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: 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.
Assisted-by: LLM
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 835121b322f4a..a0015ac0e2782 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] 23+ messages in thread
* [PATCH 05/11] drm/panel: s6e3ha8: Prepare for supporting multiple panels
2026-09-20 11:05 [PATCH 00/11] Pixel 3 XL display panel support David Heidelberg via B4 Relay
` (3 preceding siblings ...)
2026-09-20 11:05 ` [PATCH 04/11] drm/panel: s6e3ha8: Introduce AMB577PX01 panel compatible David Heidelberg via B4 Relay
@ 2026-09-20 11:05 ` David Heidelberg via B4 Relay
2026-09-24 13:26 ` Neil Armstrong
2026-09-20 11:05 ` [PATCH 06/11] drm/panel: s6e3ha8: Correct the polarity logic within David Heidelberg via B4 Relay
` (5 subsequent siblings)
10 siblings, 1 reply; 23+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-09-20 11:05 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: 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.
Assisted-by: LLM
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 a0015ac0e2782..5e1e997b83b36 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, 0);
@@ -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] 23+ messages in thread
* [PATCH 06/11] drm/panel: s6e3ha8: Correct the polarity logic within
2026-09-20 11:05 [PATCH 00/11] Pixel 3 XL display panel support David Heidelberg via B4 Relay
` (4 preceding siblings ...)
2026-09-20 11:05 ` [PATCH 05/11] drm/panel: s6e3ha8: Prepare for supporting multiple panels David Heidelberg via B4 Relay
@ 2026-09-20 11:05 ` David Heidelberg via B4 Relay
2026-09-24 13:26 ` Neil Armstrong
2026-09-20 11:05 ` [PATCH 07/11] drm/panel: s6e3ha8: Assert reset GPIO in unprepare David Heidelberg via B4 Relay
` (4 subsequent siblings)
10 siblings, 1 reply; 23+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-09-20 11:05 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: 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.
Assisted-by: LLM
Signed-off-by: David Heidelberg <david@ixit.cz>
---
drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c | 23 +++++++++++++++++++----
1 file changed, 19 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c b/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
index 5e1e997b83b36..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;
@@ -203,17 +204,17 @@ static int s6e3ha8_amb577px01_wqhd_prepare(struct drm_panel *panel)
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, 0);
+ gpiod_set_value_cansleep(priv->reset_gpio, 1);
goto err;
}
drm_dsc_pps_payload_pack(&pps, &priv->dsc);
samsung_dsi_test_key_on_lvl1(&ctx);
mipi_dsi_picture_parameter_set_multi(&ctx, &pps);
samsung_dsi_test_key_off_lvl1(&ctx);
@@ -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] 23+ messages in thread
* [PATCH 07/11] drm/panel: s6e3ha8: Assert reset GPIO in unprepare
2026-09-20 11:05 [PATCH 00/11] Pixel 3 XL display panel support David Heidelberg via B4 Relay
` (5 preceding siblings ...)
2026-09-20 11:05 ` [PATCH 06/11] drm/panel: s6e3ha8: Correct the polarity logic within David Heidelberg via B4 Relay
@ 2026-09-20 11:05 ` David Heidelberg via B4 Relay
2026-09-24 13:27 ` Neil Armstrong
2026-09-20 11:05 ` [PATCH 08/11] drm/panel: s6e3ha8: add Samsung AMB630QY01 (Google Pixel 3 XL) panel David Heidelberg via B4 Relay
` (3 subsequent siblings)
10 siblings, 1 reply; 23+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-09-20 11:05 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: 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.
Assisted-by: LLM
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] 23+ messages in thread
* [PATCH 08/11] drm/panel: s6e3ha8: add Samsung AMB630QY01 (Google Pixel 3 XL) panel
2026-09-20 11:05 [PATCH 00/11] Pixel 3 XL display panel support David Heidelberg via B4 Relay
` (6 preceding siblings ...)
2026-09-20 11:05 ` [PATCH 07/11] drm/panel: s6e3ha8: Assert reset GPIO in unprepare David Heidelberg via B4 Relay
@ 2026-09-20 11:05 ` David Heidelberg via B4 Relay
2026-09-24 13:28 ` Neil Armstrong
2026-09-20 11:05 ` [PATCH 09/11] arm64: dts: qcom: sdm845-samsung-starqltechn: Update panel compatible David Heidelberg via B4 Relay
` (2 subsequent siblings)
10 siblings, 1 reply; 23+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-09-20 11:05 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: 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.
Cosmtetics: update Copyright header and add myself.
Assisted-by: LLM
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] 23+ messages in thread
* [PATCH 09/11] arm64: dts: qcom: sdm845-samsung-starqltechn: Update panel compatible
2026-09-20 11:05 [PATCH 00/11] Pixel 3 XL display panel support David Heidelberg via B4 Relay
` (7 preceding siblings ...)
2026-09-20 11:05 ` [PATCH 08/11] drm/panel: s6e3ha8: add Samsung AMB630QY01 (Google Pixel 3 XL) panel David Heidelberg via B4 Relay
@ 2026-09-20 11:05 ` David Heidelberg via B4 Relay
2026-09-23 22:25 ` [PATCH 09/11] arm64: dts: qcom: sdm845-samsung-starqltechn: Update Petr Vorel
2026-09-20 11:05 ` [PATCH 10/11] arm64: dts: qcom: sdm845-google: Move panel pins into common David Heidelberg via B4 Relay
2026-09-20 11:05 ` [PATCH 11/11] arm64: dts: qcom: sdm845-google-crosshatch: Add display panel David Heidelberg via B4 Relay
10 siblings, 1 reply; 23+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-09-20 11:05 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: 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.
Assisted-by: LLM
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] 23+ messages in thread
* [PATCH 10/11] arm64: dts: qcom: sdm845-google: Move panel pins into common
2026-09-20 11:05 [PATCH 00/11] Pixel 3 XL display panel support David Heidelberg via B4 Relay
` (8 preceding siblings ...)
2026-09-20 11:05 ` [PATCH 09/11] arm64: dts: qcom: sdm845-samsung-starqltechn: Update panel compatible David Heidelberg via B4 Relay
@ 2026-09-20 11:05 ` David Heidelberg via B4 Relay
2026-09-23 22:44 ` [PATCH 10/11] arm64: dts: qcom: sdm845-google: Move panel pins Petr Vorel
2026-09-20 11:05 ` [PATCH 11/11] arm64: dts: qcom: sdm845-google-crosshatch: Add display panel David Heidelberg via B4 Relay
10 siblings, 1 reply; 23+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-09-20 11:05 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: dri-devel, devicetree, linux-kernel, linux-arm-msm, phone-devel,
David Heidelberg
From: David Heidelberg <david@ixit.cz>
Both devices share the pinctrl configuration.
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] 23+ messages in thread
* [PATCH 11/11] arm64: dts: qcom: sdm845-google-crosshatch: Add display panel
2026-09-20 11:05 [PATCH 00/11] Pixel 3 XL display panel support David Heidelberg via B4 Relay
` (9 preceding siblings ...)
2026-09-20 11:05 ` [PATCH 10/11] arm64: dts: qcom: sdm845-google: Move panel pins into common David Heidelberg via B4 Relay
@ 2026-09-20 11:05 ` David Heidelberg via B4 Relay
10 siblings, 0 replies; 23+ messages in thread
From: David Heidelberg via B4 Relay @ 2026-09-20 11:05 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: 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.
Assisted-by: LLM
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] 23+ messages in thread
* Re: [PATCH 09/11] arm64: dts: qcom: sdm845-samsung-starqltechn: Update
2026-09-20 11:05 ` [PATCH 09/11] arm64: dts: qcom: sdm845-samsung-starqltechn: Update panel compatible David Heidelberg via B4 Relay
@ 2026-09-23 22:25 ` Petr Vorel
2026-09-23 22:38 ` [PATCH 10/11] arm64: dts: qcom: sdm845-google: Move panel pins Petr Vorel
2026-09-23 22:48 ` [PATCH 09/11] arm64: dts: qcom: sdm845-samsung-starqltechn: Update Petr Vorel
0 siblings, 2 replies; 23+ messages in thread
From: Petr Vorel @ 2026-09-23 22:25 UTC (permalink / raw)
To: devnull+david.ixit.cz
Cc: abelvesa, airlied, andersson, conor+dt, david, devicetree,
dri-devel, dsankouski, jesszhan0024, konradybcio, krzk+dt,
linux-arm-msm, linux-kernel, maarten.lankhorst, mripard,
neil.armstrong, phone-devel, robh, simona, tzimmermann,
Petr Vorel
>
> 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.
>
> Assisted-by: LLM
> 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";
I guess that keeping the original "samsung,s6e3ha8" would cause that ABI break ABI, right?
compatible = "samsung,s6e3ha8-amb577px01", "samsung,s6e3ha8";
Anyway, LGTM.
Reviewed-by: Petr Vorel <petr.vorel@gmail.com>
Kind regards,
Petr
> 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>;
> };
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 10/11] arm64: dts: qcom: sdm845-google: Move panel pins
2026-09-23 22:25 ` [PATCH 09/11] arm64: dts: qcom: sdm845-samsung-starqltechn: Update Petr Vorel
@ 2026-09-23 22:38 ` Petr Vorel
2026-09-23 22:48 ` [PATCH 09/11] arm64: dts: qcom: sdm845-samsung-starqltechn: Update Petr Vorel
1 sibling, 0 replies; 23+ messages in thread
From: Petr Vorel @ 2026-09-23 22:38 UTC (permalink / raw)
To: petr.vorel
Cc: abelvesa, airlied, andersson, conor+dt, david, devicetree,
devnull+david.ixit.cz, dri-devel, dsankouski, jesszhan0024,
konradybcio, krzk+dt, linux-arm-msm, linux-kernel,
maarten.lankhorst, mripard, neil.armstrong, phone-devel, robh,
simona, tzimmermann
> Both devices share the pinctrl configuration.
LGTM.
Reviewed-by: Petr Vorel <petr.vorel@gmail.com>
Kind regards,
Petr
>
> 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;
> };
>
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 10/11] arm64: dts: qcom: sdm845-google: Move panel pins
2026-09-20 11:05 ` [PATCH 10/11] arm64: dts: qcom: sdm845-google: Move panel pins into common David Heidelberg via B4 Relay
@ 2026-09-23 22:44 ` Petr Vorel
0 siblings, 0 replies; 23+ messages in thread
From: Petr Vorel @ 2026-09-23 22:44 UTC (permalink / raw)
To: petr.vorel
Cc: abelvesa, airlied, andersson, conor+dt, david, devicetree,
devnull+david.ixit.cz, dri-devel, dsankouski, jesszhan0024,
konradybcio, krzk+dt, linux-arm-msm, linux-kernel,
maarten.lankhorst, mripard, neil.armstrong, phone-devel, robh,
simona, tzimmermann
> Both devices share the pinctrl configuration.
LGTM.
Reviewed-by: Petr Vorel <petr.vorel@gmail.com>
Kind regards,
Petr
>
> 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;
> };
>
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 09/11] arm64: dts: qcom: sdm845-samsung-starqltechn: Update
2026-09-23 22:25 ` [PATCH 09/11] arm64: dts: qcom: sdm845-samsung-starqltechn: Update Petr Vorel
2026-09-23 22:38 ` [PATCH 10/11] arm64: dts: qcom: sdm845-google: Move panel pins Petr Vorel
@ 2026-09-23 22:48 ` Petr Vorel
1 sibling, 0 replies; 23+ messages in thread
From: Petr Vorel @ 2026-09-23 22:48 UTC (permalink / raw)
To: devnull+david.ixit.cz
Cc: abelvesa, airlied, andersson, conor+dt, david, devicetree,
dri-devel, dsankouski, jesszhan0024, konradybcio, krzk+dt,
linux-arm-msm, linux-kernel, maarten.lankhorst, mripard,
neil.armstrong, phone-devel, robh, simona, tzimmermann
...
> > +++ 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";
> I guess that keeping the original "samsung,s6e3ha8" would cause that ABI break ABI, right?
> compatible = "samsung,s6e3ha8-amb577px01", "samsung,s6e3ha8";
OK, I now see the deprecation in 4th patch.
{ .compatible = "samsung,s6e3ha8" }, /* deprecated */
Kind regards,
Petr
> Anyway, LGTM.
> Reviewed-by: Petr Vorel <petr.vorel@gmail.com>
> Kind regards,
> Petr
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 04/11] drm/panel: s6e3ha8: Introduce AMB577PX01 panel
2026-09-20 11:05 ` [PATCH 04/11] drm/panel: s6e3ha8: Introduce AMB577PX01 panel compatible David Heidelberg via B4 Relay
@ 2026-09-23 22:51 ` Petr Vorel
2026-09-24 13:25 ` [PATCH 04/11] drm/panel: s6e3ha8: Introduce AMB577PX01 panel compatible Neil Armstrong
1 sibling, 0 replies; 23+ messages in thread
From: Petr Vorel @ 2026-09-23 22:51 UTC (permalink / raw)
To: devnull+david.ixit.cz
Cc: abelvesa, airlied, andersson, conor+dt, david, devicetree,
dri-devel, dsankouski, jesszhan0024, konradybcio, krzk+dt,
linux-arm-msm, linux-kernel, maarten.lankhorst, mripard,
neil.armstrong, phone-devel, robh, simona, tzimmermann,
Petr Vorel
...
> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
...
> static const struct of_device_id s6e3ha8_amb577px01_wqhd_of_match[] = {
> - { .compatible = "samsung,s6e3ha8" },
> + { .compatible = "samsung,s6e3ha8" }, /* deprecated */
> + { .compatible = "samsung,s6e3ha8-amb577px01" },
Reviewed-by: Petr Vorel <petr.vorel@gmail.com>
Kind regards,
Petr
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 03/11] drm/panel: s6e3ha8: Really assert reset on the failure
2026-09-20 11:05 ` [PATCH 03/11] drm/panel: s6e3ha8: Really assert reset on the failure David Heidelberg via B4 Relay
@ 2026-09-24 13:24 ` Neil Armstrong
0 siblings, 0 replies; 23+ messages in thread
From: Neil Armstrong @ 2026-09-24 13:24 UTC (permalink / raw)
To: david, Dzmitry Sankouski, 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: dri-devel, devicetree, linux-kernel, linux-arm-msm, phone-devel, stable
On 9/20/26 13:05, David Heidelberg via B4 Relay wrote:
> From: David Heidelberg <david@ixit.cz>
>
> Due to incorrect implementation 0 == asserted, thus when driver fails it
> needs to assert reset.
>
> Minimal fix for stable; the polarity convention is corrected properly
> later in this series.
>
> Fixes: 779679d3c1640 ("drm/panel: Add support for S6E3HA8 panel driver")
> Cc: stable@vger.kernel.org
> Assisted-by: LLM
> Signed-off-by: David Heidelberg <david@ixit.cz>
> ---
> drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c b/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
> index 078523df48860..835121b322f4a 100644
> --- a/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
> +++ b/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
> @@ -179,17 +179,17 @@ static int s6e3ha8_amb577px01_wqhd_prepare(struct drm_panel *panel)
> ret = regulator_bulk_enable(ARRAY_SIZE(s6e3ha8_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);
> + gpiod_set_value_cansleep(priv->reset_gpio, 0);
> goto err;
> }
>
> drm_dsc_pps_payload_pack(&pps, &priv->dsc);
>
> samsung_dsi_test_key_on_lvl1(&ctx);
> mipi_dsi_picture_parameter_set_multi(&ctx, &pps);
> samsung_dsi_test_key_off_lvl1(&ctx);
>
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Thanks,
Neil
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 04/11] drm/panel: s6e3ha8: Introduce AMB577PX01 panel compatible
2026-09-20 11:05 ` [PATCH 04/11] drm/panel: s6e3ha8: Introduce AMB577PX01 panel compatible David Heidelberg via B4 Relay
2026-09-23 22:51 ` [PATCH 04/11] drm/panel: s6e3ha8: Introduce AMB577PX01 panel Petr Vorel
@ 2026-09-24 13:25 ` Neil Armstrong
1 sibling, 0 replies; 23+ messages in thread
From: Neil Armstrong @ 2026-09-24 13:25 UTC (permalink / raw)
To: david, Dzmitry Sankouski, 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: dri-devel, devicetree, linux-kernel, linux-arm-msm, phone-devel
On 9/20/26 13:05, David Heidelberg via B4 Relay wrote:
> 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.
>
> Assisted-by: LLM
> 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 835121b322f4a..a0015ac0e2782 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",
>
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Thanks,
Neil
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 05/11] drm/panel: s6e3ha8: Prepare for supporting multiple panels
2026-09-20 11:05 ` [PATCH 05/11] drm/panel: s6e3ha8: Prepare for supporting multiple panels David Heidelberg via B4 Relay
@ 2026-09-24 13:26 ` Neil Armstrong
0 siblings, 0 replies; 23+ messages in thread
From: Neil Armstrong @ 2026-09-24 13:26 UTC (permalink / raw)
To: david, Dzmitry Sankouski, 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: dri-devel, devicetree, linux-kernel, linux-arm-msm, phone-devel
On 9/20/26 13:05, David Heidelberg via B4 Relay wrote:
> 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.
>
> Assisted-by: LLM
> 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 a0015ac0e2782..5e1e997b83b36 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, 0);
> @@ -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");
>
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Thanks,
Neil
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 06/11] drm/panel: s6e3ha8: Correct the polarity logic within
2026-09-20 11:05 ` [PATCH 06/11] drm/panel: s6e3ha8: Correct the polarity logic within David Heidelberg via B4 Relay
@ 2026-09-24 13:26 ` Neil Armstrong
0 siblings, 0 replies; 23+ messages in thread
From: Neil Armstrong @ 2026-09-24 13:26 UTC (permalink / raw)
To: david, Dzmitry Sankouski, 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: dri-devel, devicetree, linux-kernel, linux-arm-msm, phone-devel
On 9/20/26 13:05, David Heidelberg via B4 Relay wrote:
> 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.
>
> Assisted-by: LLM
> Signed-off-by: David Heidelberg <david@ixit.cz>
> ---
> drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c | 23 +++++++++++++++++++----
> 1 file changed, 19 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c b/drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c
> index 5e1e997b83b36..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;
> @@ -203,17 +204,17 @@ static int s6e3ha8_amb577px01_wqhd_prepare(struct drm_panel *panel)
> 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, 0);
> + gpiod_set_value_cansleep(priv->reset_gpio, 1);
> goto err;
> }
>
> drm_dsc_pps_payload_pack(&pps, &priv->dsc);
>
> samsung_dsi_test_key_on_lvl1(&ctx);
> mipi_dsi_picture_parameter_set_multi(&ctx, &pps);
> samsung_dsi_test_key_off_lvl1(&ctx);
> @@ -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);
>
>
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Thanks,
Neil
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 07/11] drm/panel: s6e3ha8: Assert reset GPIO in unprepare
2026-09-20 11:05 ` [PATCH 07/11] drm/panel: s6e3ha8: Assert reset GPIO in unprepare David Heidelberg via B4 Relay
@ 2026-09-24 13:27 ` Neil Armstrong
0 siblings, 0 replies; 23+ messages in thread
From: Neil Armstrong @ 2026-09-24 13:27 UTC (permalink / raw)
To: david, Dzmitry Sankouski, 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: dri-devel, devicetree, linux-kernel, linux-arm-msm, phone-devel
On 9/20/26 13:05, David Heidelberg via B4 Relay wrote:
> From: David Heidelberg <david@ixit.cz>
>
> For correct shutdown, the reset should be asserted.
>
> Assisted-by: LLM
> 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);
>
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Thanks,
Neil
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 08/11] drm/panel: s6e3ha8: add Samsung AMB630QY01 (Google Pixel 3 XL) panel
2026-09-20 11:05 ` [PATCH 08/11] drm/panel: s6e3ha8: add Samsung AMB630QY01 (Google Pixel 3 XL) panel David Heidelberg via B4 Relay
@ 2026-09-24 13:28 ` Neil Armstrong
0 siblings, 0 replies; 23+ messages in thread
From: Neil Armstrong @ 2026-09-24 13:28 UTC (permalink / raw)
To: david, Dzmitry Sankouski, 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: dri-devel, devicetree, linux-kernel, linux-arm-msm, phone-devel
On 9/20/26 13:05, David Heidelberg via B4 Relay wrote:
> 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.
>
> Cosmtetics: update Copyright header and add myself.
=> Cosmetics
>
> Assisted-by: LLM
> 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 = {
>
With typo fixed:
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Thanks,
Neil
^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2026-09-24 13:28 UTC | newest]
Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-20 11:05 [PATCH 00/11] Pixel 3 XL display panel support David Heidelberg via B4 Relay
2026-09-20 11:05 ` [PATCH 01/11] dt-bindings: display: panel: s6e3ha8: Adjust to reflect the DDIC and panel used David Heidelberg via B4 Relay
2026-09-20 11:05 ` [PATCH 02/11] dt-bindings: display: panel: samsung,s6e3ha8: Add AMB630QY01 panel David Heidelberg via B4 Relay
2026-09-20 11:05 ` [PATCH 03/11] drm/panel: s6e3ha8: Really assert reset on the failure David Heidelberg via B4 Relay
2026-09-24 13:24 ` Neil Armstrong
2026-09-20 11:05 ` [PATCH 04/11] drm/panel: s6e3ha8: Introduce AMB577PX01 panel compatible David Heidelberg via B4 Relay
2026-09-23 22:51 ` [PATCH 04/11] drm/panel: s6e3ha8: Introduce AMB577PX01 panel Petr Vorel
2026-09-24 13:25 ` [PATCH 04/11] drm/panel: s6e3ha8: Introduce AMB577PX01 panel compatible Neil Armstrong
2026-09-20 11:05 ` [PATCH 05/11] drm/panel: s6e3ha8: Prepare for supporting multiple panels David Heidelberg via B4 Relay
2026-09-24 13:26 ` Neil Armstrong
2026-09-20 11:05 ` [PATCH 06/11] drm/panel: s6e3ha8: Correct the polarity logic within David Heidelberg via B4 Relay
2026-09-24 13:26 ` Neil Armstrong
2026-09-20 11:05 ` [PATCH 07/11] drm/panel: s6e3ha8: Assert reset GPIO in unprepare David Heidelberg via B4 Relay
2026-09-24 13:27 ` Neil Armstrong
2026-09-20 11:05 ` [PATCH 08/11] drm/panel: s6e3ha8: add Samsung AMB630QY01 (Google Pixel 3 XL) panel David Heidelberg via B4 Relay
2026-09-24 13:28 ` Neil Armstrong
2026-09-20 11:05 ` [PATCH 09/11] arm64: dts: qcom: sdm845-samsung-starqltechn: Update panel compatible David Heidelberg via B4 Relay
2026-09-23 22:25 ` [PATCH 09/11] arm64: dts: qcom: sdm845-samsung-starqltechn: Update Petr Vorel
2026-09-23 22:38 ` [PATCH 10/11] arm64: dts: qcom: sdm845-google: Move panel pins Petr Vorel
2026-09-23 22:48 ` [PATCH 09/11] arm64: dts: qcom: sdm845-samsung-starqltechn: Update Petr Vorel
2026-09-20 11:05 ` [PATCH 10/11] arm64: dts: qcom: sdm845-google: Move panel pins into common David Heidelberg via B4 Relay
2026-09-23 22:44 ` [PATCH 10/11] arm64: dts: qcom: sdm845-google: Move panel pins Petr Vorel
2026-09-20 11:05 ` [PATCH 11/11] arm64: dts: qcom: sdm845-google-crosshatch: Add display panel David Heidelberg via B4 Relay
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®