Skip to contentSkip to conversation

Add new panel driver Samsung S6E88A0-AMS427AP24

PATCH Superseded Jakob Hauser 2 participants 14 messages Oct 24, 2024 – Oct 26, 2024

Subsystems (4)

v3 of 4 Superseded Latest is v4 →

lore
Share & tools
lore
#0 lore raw

v3 cover Add new panel driver Samsung S6E88A0-AMS427AP24

The patchset adds a new driver for Samsung AMS427AP24 panel with S6E88A0 controller. Patches are based on current branch drm-misc-next.

Changes in v3:
- Patch 2: Dropped the second "bindings" in the commit subject.
- Patch 2: Applied 4 spaces indentation in the example.
- Patch 3: Made struct s6e88a0_ams427ap24_supplies[] "static".
- Patch 3: Removed the "panel->prepared" parts from functions s6e88a0_ams427ap24_prepare() and s6e88a0_ams427ap24_unprepare().
- Patch 5: Dissolved function s6e88a0_ams427ap24_parse_dt() and placed the parsing in the probe function. Changed the parsing from of_property_read_bool() to device_property_read_bool().

v1: https://lore.kernel.org/dri-devel/[email protected]/T/#t
v2: https://lore.kernel.org/dri-devel/[email protected]/T/#t

Jakob Hauser (5):
dt-bindings: display: panel: Move flip properties to panel-common
dt-bindings: display: panel: Add Samsung S6E88A0-AMS427AP24 drm/panel: samsung-s6e88a0-ams427ap24: Add initial driver drm/panel: samsung-s6e88a0-ams427ap24: Add brightness control drm/panel: samsung-s6e88a0-ams427ap24: Add flip option

 .../bindings/display/panel/panel-common.yaml  |   8 +
 .../panel/samsung,s6e88a0-ams427ap24.yaml     |  65 ++
 .../display/panel/samsung,s6e8aa0.yaml        |  10 +-
 drivers/gpu/drm/panel/Kconfig                 |  10 +
 drivers/gpu/drm/panel/Makefile                |   1 +
 .../panel/panel-samsung-s6e88a0-ams427ap24.c  | 754 ++++++++++++++++++
 6 files changed, 840 insertions(+), 8 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/display/panel/samsung,s6e88a0-ams427ap24.yaml
 create mode 100644 drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c
Signature · 1 line
2.39.5
#1 lore raw

PATCH v3 1/5 dt-bindings: display: panel: Move flip properties to panel-common

The flip properties were used by "samsung,s6e8aa0.yaml" only so far. By introducing "samsung,s6e88a0-ams427ap24.yaml" they become more common.

---
Patch is based on current branch drm-misc-next.

---
 .../bindings/display/panel/panel-common.yaml           |  8 ++++++++
 .../bindings/display/panel/samsung,s6e8aa0.yaml        | 10 ++--------
 2 files changed, 10 insertions(+), 8 deletions(-)
Documentation/devicetree/bindings/display/panel/panel-common.yaml +8 -0
index 0a57a31f4f3d..087415753d60 100644
@@ -51,6 +51,14 @@ properties:
     $ref: /schemas/types.yaml#/definitions/uint32
     enum: [0, 90, 180, 270]
 
+  flip-horizontal:
+    description: boolean to flip image horizontally
+    type: boolean
+
+  flip-vertical:
+    description: boolean to flip image vertically
+    type: boolean
+
   # Display Timings
   panel-timing:
     description:
Documentation/devicetree/bindings/display/panel/samsung,s6e8aa0.yaml +2 -8
index 4601fa460680..19c8cc83db97 100644
@@ -21,6 +21,8 @@ properties:
 
   reset-gpios: true
   display-timings: true
+  flip-horizontal: true
+  flip-vertical: true
 
   vdd3-supply:
     description: core voltage supply
@@ -46,14 +48,6 @@ properties:
   panel-height-mm:
     description: physical panel height [mm]
 
-  flip-horizontal:
-    description: boolean to flip image horizontally
-    type: boolean
-
-  flip-vertical:
-    description: boolean to flip image vertically
-    type: boolean
-
 required:
   - compatible
   - reg
Signature · 1 line
2.39.5
Reviewed-by on v3 1/5
#2 lore raw

Re: [PATCH v3 1/5] dt-bindings: display: panel: Move flip properties to panel-common

Quoted 5 lines · Jakob Hauser

The flip properties were used by "samsung,s6e8aa0.yaml" only so far. By introducing "samsung,s6e88a0-ams427ap24.yaml" they become more common.

I think I even have a legacy panel that needs this, good!

Yours,
Linus Walleij

#3 lore raw

PATCH v3 2/5 dt-bindings: display: panel: Add Samsung S6E88A0-AMS427AP24

In reply to Jakob Hauser

Add bindings for Samsung AMS427AP24 panel with S6E88A0 controller.

---
Patch is based on current branch drm-misc-next.

Changes in v3:
- Dropped the second "bindings" in the commit subject.
- Applied 4 spaces indentation in the example.

---
 .../panel/samsung,s6e88a0-ams427ap24.yaml     | 65 +++++++++++++++++++
 1 file changed, 65 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/display/panel/samsung,s6e88a0-ams427ap24.yaml
Documentation/devicetree/bindings/display/panel/samsung,s6e88a0-ams427ap24.yaml new file +65 -0
new file mode 100644
index 000000000000..db284ba5be20
@@ -0,0 +1,65 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/panel/samsung,s6e88a0-ams427ap24.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Samsung AMS427AP24 panel with S6E88A0 controller
+
+maintainers:
+  - Jakob Hauser <[email protected]>
+
+allOf:
+  - $ref: panel-common.yaml#
+
+properties:
+  compatible:
+    const: samsung,s6e88a0-ams427ap24
+
+  reg:
+    maxItems: 1
+
+  port: true
+  reset-gpios: true
+  flip-horizontal: true
+
+  vdd3-supply:
+    description: core voltage supply
+
+  vci-supply:
+    description: voltage supply for analog circuits
+
+required:
+  - compatible
+  - reg
+  - port
+  - reset-gpios
+  - vdd3-supply
+  - vci-supply
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/gpio/gpio.h>
+
+    dsi {
+        #address-cells = <1>;
+        #size-cells = <0>;
+
+        panel@0 {
+            compatible = "samsung,s6e88a0-ams427ap24";
+            reg = <0>;
+
+            vdd3-supply = <&pm8916_l17>;
+            vci-supply = <&pm8916_l6>;
+            reset-gpios = <&tlmm 25 GPIO_ACTIVE_LOW>;
+            flip-horizontal;
+
+            port {
+                panel_in: endpoint {
+                    remote-endpoint = <&mdss_dsi0_out>;
+                };
+            };
+        };
+    };
Signature · 1 line
2.39.5
#5 lore raw

PATCH v3 3/5 drm/panel: samsung-s6e88a0-ams427ap24: Add initial driver

In reply to Jakob Hauser

This initial part of the panel driver was mostly generated by the "linux-mdss-dsi-panel-driver-generator" tool [1], reading downstream Android kernel file "dsi_panel_S6E88A0_AMS427AP24_qhd_octa_video.dtsi" [2].

On top of the generic output of the tool, there were a couple of changes applied:
- Added mipi_dsi_dcs_set_display_on() to function s6e88a0_ams427ap24_on(), otherwise the display does not show up.
- In functions s6e88a0_ams427ap24_on() and s6e88a0_ams427ap24_off() changed DSI commands to multi context and used "accum_err" returns.
- In functions s6e88a0_ams427ap24_on() and s6e88a0_ams427ap24_off() replaced msleep() by mipi_dsi_msleep().
- The function s6e88a0_ams427ap24_get_modes() was changed to make use of drm_connector_helper_get_modes_fixed(). This also required to include drm/drm_probe_helper.h.
- In function s6e88a0_ams427ap24_probe() registring the regulators was changed to devm_regulator_bulk_get_const(). This required to change supplies in struct s6e88a0_ams427ap24 to a pointer.
- Removed bool "prepared" from struct s6e88a0_ams427ap24 and according parts in functions s6e88a0_ams427ap24_prepare() and s6e88a0_ams427ap24_unprepare().

[1] https://github.com/msm8916-mainline/linux-mdss-dsi-panel-driver-generator
[2] https://github.com/msm8916-mainline/linux-downstream/blob/GT-I9195I/drivers/video/msm/mdss/samsung/S6E88A0_AMS427AP24/dsi_panel_S6E88A0_AMS427AP24_qhd_octa_video.dtsi

---
Changes in v3:
- Made struct s6e88a0_ams427ap24_supplies[] "static".
- Removed the "panel->prepared" parts from functions s6e88a0_ams427ap24_prepare() and s6e88a0_ams427ap24_unprepare().

---
 drivers/gpu/drm/panel/Kconfig                 |   9 +
 drivers/gpu/drm/panel/Makefile                |   1 +
 .../panel/panel-samsung-s6e88a0-ams427ap24.c  | 252 ++++++++++++++++++
 3 files changed, 262 insertions(+)
 create mode 100644 drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c
drivers/gpu/drm/panel/Kconfig +9 -0
index bce4cb64184a..f8adc38447fb 100644
@@ -632,6 +632,15 @@ config DRM_PANEL_SAMSUNG_AMS639RQ08
 	  Say Y or M here if you want to enable support for the
 	  Samsung AMS639RQ08 FHD Plus (2340x1080@60Hz) CMD mode panel.
 
+config DRM_PANEL_SAMSUNG_S6E88A0_AMS427AP24
+	tristate "Samsung AMS427AP24 panel with S6E88A0 controller"
+	depends on GPIOLIB && OF && REGULATOR
+	depends on DRM_MIPI_DSI
+	help
+	  Say Y here if you want to enable support for Samsung AMS427AP24 panel
+	  with S6E88A0 controller (found in Samsung Galaxy S4 Mini Value Edition
+	  GT-I9195I). To compile this driver as a module, choose M here.
+
 config DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01
 	tristate "Samsung AMS452EF01 panel with S6E88A0 DSI video mode controller"
 	depends on OF
drivers/gpu/drm/panel/Makefile +1 -0
index 4db02c2411ae..7dcf72646cac 100644
@@ -77,6 +77,7 @@ obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03) += panel-samsung-s6e63j0x03.o
 obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E63M0) += panel-samsung-s6e63m0.o
 obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E63M0_SPI) += panel-samsung-s6e63m0-spi.o
 obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E63M0_DSI) += panel-samsung-s6e63m0-dsi.o
+obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS427AP24) += panel-samsung-s6e88a0-ams427ap24.o
 obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01) += panel-samsung-s6e88a0-ams452ef01.o
 obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0) += panel-samsung-s6e8aa0.o
 obj-$(CONFIG_DRM_PANEL_SAMSUNG_SOFEF00) += panel-samsung-sofef00.o
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c new file +252 -0

252 lines not on this page · raw message

Signature · 1 line
2.39.5
#6 lore raw

Re: [PATCH v3 3/5] drm/panel: samsung-s6e88a0-ams427ap24: Add initial driver

Hi Jakob,

thanks for your patch!

Quoted 21 lines · Jakob Hauser

This initial part of the panel driver was mostly generated by the "linux-mdss-dsi-panel-driver-generator" tool [1], reading downstream Android kernel file "dsi_panel_S6E88A0_AMS427AP24_qhd_octa_video.dtsi" [2].

On top of the generic output of the tool, there were a couple of changes applied:
- Added mipi_dsi_dcs_set_display_on() to function s6e88a0_ams427ap24_on(), otherwise the display does not show up.
- In functions s6e88a0_ams427ap24_on() and s6e88a0_ams427ap24_off() changed DSI commands to multi context and used "accum_err" returns.
- In functions s6e88a0_ams427ap24_on() and s6e88a0_ams427ap24_off() replaced msleep() by mipi_dsi_msleep().
- The function s6e88a0_ams427ap24_get_modes() was changed to make use of drm_connector_helper_get_modes_fixed(). This also required to include drm/drm_probe_helper.h.
- In function s6e88a0_ams427ap24_probe() registring the regulators was changed to devm_regulator_bulk_get_const(). This required to change supplies in struct s6e88a0_ams427ap24 to a pointer.
- Removed bool "prepared" from struct s6e88a0_ams427ap24 and according parts in functions s6e88a0_ams427ap24_prepare() and s6e88a0_ams427ap24_unprepare().

Quoted 4 lines

[1] https://github.com/msm8916-mainline/linux-mdss-dsi-panel-driver-generator
[2] https://github.com/msm8916-mainline/linux-downstream/blob/GT-I9195I/drivers/video/msm/mdss/samsung/S6E88A0_AMS427AP24/dsi_panel_S6E88A0_AMS427AP24_qhd_octa_video.dtsi

Nice job on this driver so far!

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c line 10

Quoted 4 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c new file +4 -0
+#include <linux/delay.h>
+#include <linux/gpio/consumer.h>
+#include <linux/module.h>
+#include <linux/of.h>

Why do you need this include? .of_match_table is part of <linux/driver.h>

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c line 55

Quoted 8 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c new file +8 -0
+static int s6e88a0_ams427ap24_on(struct s6e88a0_ams427ap24 *ctx)
+{
+       struct mipi_dsi_device *dsi = ctx->dsi;
+       struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi };
+
+       dsi->mode_flags |= MIPI_DSI_MODE_LPM;
+
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf0, 0x5a, 0x5a);

Can we provide #defines for at least some of this magic? See other drivers for a very good idea of what some of them mean.
panel-samsung-s6d27a1.c:#define S6D27A1_PASSWD_L2 0xF0 /*
Password Command for Level 2 Control */
panel-samsung-s6d7aa0.c:#define MCS_PASSWD1 0xf0

Quoted 1 line

+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfc, 0x5a, 0x5a);

panel-samsung-s6d7aa0.c:#define MCS_PASSWD3 0xfc

Quoted 6 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c new file +6 -0
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb0, 0x11);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfd, 0x11);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb0, 0x13);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfd, 0x18);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb0, 0x02);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb8, 0x30);

(...)

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c line 67

Quoted 4 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c new file +4 -0
+       mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
+       mipi_dsi_msleep(&dsi_ctx, 20);
+
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf1, 0x5a, 0x5a);

panel-samsung-s6d7aa0.c:#define MCS_PASSWD2 0xf1

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c line 70

Quoted 3 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c new file +3 -0
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xcc, 0x4c);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf2, 0x03, 0x0d);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf1, 0xa5, 0xa5);

panel-samsung-s6d7aa0.c:#define MCS_PASSWD2 0xf1
Send in the reverse password: disable access.

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c line 83

Quoted 13 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c new file +13 -0
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xca,
+                                    0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x80,
+                                    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+                                    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+                                    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+                                    0x80, 0x80, 0x00, 0x00, 0x00);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb2,
+                                    0x40, 0x08, 0x20, 0x00, 0x08);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb6, 0x28, 0x0b);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf7, 0x03);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x55, 0x00);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf0, 0xa5, 0xa5);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfc, 0xa5, 0xa5);

Send in the reverse password: disable access.

A bit of #defines and comments would make it much more clear what is going on.

Yours,
Linus Walleij

#7 lore raw

Re: [PATCH v3 3/5] drm/panel: samsung-s6e88a0-ams427ap24: Add initial driver

Hi Linus,

On 25.10.24 18:36, Linus Walleij wrote:
...

Quoted 1 line · Jakob Hauser

...

Quoted 8 lines

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c line 10

Quoted 5 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c new file +4 -0
+#include <linux/delay.h>
+#include <linux/gpio/consumer.h>
+#include <linux/module.h>
+#include <linux/of.h>

Why do you need this include? .of_match_table is part of <linux/driver.h>

You're right, I'll remove it.

Quoted 54 lines

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c line 55

Quoted 8 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c new file +8 -0
+static int s6e88a0_ams427ap24_on(struct s6e88a0_ams427ap24 *ctx)
+{
+       struct mipi_dsi_device *dsi = ctx->dsi;
+       struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi };
+
+       dsi->mode_flags |= MIPI_DSI_MODE_LPM;
+
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf0, 0x5a, 0x5a);

Can we provide #defines for at least some of this magic? See other drivers for a very good idea of what some of them mean.
panel-samsung-s6d27a1.c:#define S6D27A1_PASSWD_L2 0xF0 /*
Password Command for Level 2 Control */
panel-samsung-s6d7aa0.c:#define MCS_PASSWD1 0xf0

Quoted 1 line

+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfc, 0x5a, 0x5a);

panel-samsung-s6d7aa0.c:#define MCS_PASSWD3 0xfc

Quoted 6 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c new file +6 -0
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb0, 0x11);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfd, 0x11);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb0, 0x13);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfd, 0x18);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb0, 0x02);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb8, 0x30);

(...)

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c line 67

Quoted 4 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c new file +4 -0
+       mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
+       mipi_dsi_msleep(&dsi_ctx, 20);
+
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf1, 0x5a, 0x5a);

panel-samsung-s6d7aa0.c:#define MCS_PASSWD2 0xf1

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c line 70

Quoted 3 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c new file +3 -0
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xcc, 0x4c);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf2, 0x03, 0x0d);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf1, 0xa5, 0xa5);

panel-samsung-s6d7aa0.c:#define MCS_PASSWD2 0xf1
Send in the reverse password: disable access.

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c line 83

Quoted 13 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c new file +13 -0
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xca,
+                                    0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x80,
+                                    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+                                    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+                                    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+                                    0x80, 0x80, 0x00, 0x00, 0x00);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb2,
+                                    0x40, 0x08, 0x20, 0x00, 0x08);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb6, 0x28, 0x0b);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf7, 0x03);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x55, 0x00);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf0, 0xa5, 0xa5);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfc, 0xa5, 0xa5);
Quoted 4 lines

Send in the reverse password: disable access.

A bit of #defines and comments would make it much more clear what is going on.

The difficulty I'm in is that I don't have a datasheet.

From the Android kernel downstream driver data ams427ap24 [1], from the similar but older panel ams427ap01 downstream driver [2] and the similar panel ams452ef01 upstream driver [3] I can guess what the commands do... except I couldn't find out what "0xf2, 0x03, 0x0d" does and for "0xf1, 0x5a, 0x5a" I was guessing level 3 key on because level 1 and 2 was already there.

[1] https://github.com/msm8916-mainline/linux-downstream/blob/GT-I9195I/drivers/video/msm/mdss/samsung/S6E88A0_AMS427AP24/dsi_panel_S6E88A0_AMS427AP24_qhd_octa_video.dtsi
[2] https://github.com/LineageOS/android_kernel_samsung_msm8930-common/blob/lineage-15.1/drivers/video/msm/mipi_samsung_oled_video_qhd_pt-8930.c
[3] https://github.com/torvalds/linux/blob/v6.11/drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams452ef01.c

That said, I can offer to comment the single command lines like this:

mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf0, 0x5a, 0x5a); // level 1 key on mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfc, 0x5a, 0x5a); // level 2 key on mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb0, 0x11); // src latch set global 1 mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfd, 0x11); // src latch set 1 mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb0, 0x13); // src latch set global 2 mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfd, 0x18); // src latch set 2 mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb0, 0x02); // avdd set 1 mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb8, 0x30); // avdd set 2

mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
mipi_dsi_msleep(&dsi_ctx, 20);

mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf1, 0x5a, 0x5a); // level 3 key on mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xcc, 0x4c); // pixel clock divider pol. mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf2, 0x03, 0x0d); // unknown mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf1, 0xa5, 0xa5); // level 3 key off mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xca,

                             0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x80,
                             0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
                             0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
                             0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
                             0x80, 0x80, 0x00, 0x00, 0x00); // set gamma
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb2,
                             0x40, 0x08, 0x20, 0x00, 0x08); // set aid

mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb6, 0x28, 0x0b); // set elvss mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf7, 0x03); // gamma update mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x55, 0x00); // acl off mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf0, 0xa5, 0xa5); // level 1 key off mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfc, 0xa5, 0xa5); // level 2 key off

Some of those lines exceed the 80 characters limit. I would still prefer not to break those lines to keep readability.

Now commenting the single command lines is one thing. But giving names to the command registers is something different. E.g. in 0xb0 there is "src latch set global" but also one of the "avdd". I wouldn't know what name that command register should have. For 0xcc and 0xf2 in the downstream ams427ap24 they're both in a block labelled "PCD" and in upstream ams452ef01 the 0xcc line is commented as "set Pixel Clock Divider polarity" but the 0xf2 register seems to be more general because in downstream ams427ap24 it also shows up in a block called "AVC" and in downstream ams427ap01 in a command labelled "vporch". Guessing names for the command registers will become too arbitrary.

Additionally, I actually would like to avoid the #defines for the command registers because this will definitively break the 80 character lines limits strong enough, splintering the above command blocks into quite some mess.

Kind regards,
Jakob

#8 lore raw

PATCH v3 4/5 drm/panel: samsung-s6e88a0-ams427ap24: Add brightness control

In reply to Jakob Hauser

The tables for brightness to candela, aid and elvss were taken from downstream kernel file "dsi_panel_S6E88A0_AMS427AP24_qhd_octa_video.dtsi" [1][2][3].

The gamma table gets generated in "ss_dsi_smart_dimming_S6E88A0_AMS427AP24.c" [4] with hard-coded starting values. The function smart_dimming_init() [5] goes through the v{*}_adjustments, generate_gray_scale and gamma_init procedure. Instead of calculating it manually, it's easier to compile a custom downstream kernel with SMART_DIMMING_DEBUG enabled and read out dmesg early at boot.

Selection of the values for aid and elvss are again according to downstream file "dsi_panel_S6E88A0_AMS427AP24_qhd_octa_video.dtsi" [6][7].

The set of write commands is guided by downstream file "ss_dsi_panel_common.c" [8] followed by "ss_dsi_panel_S6E88A0_AMS427AP24.c" [9].

The dsi mode flag MIPI_DSI_MODE_VIDEO_NO_HFP prevents screen flickering while changing the brightness.

[1] https://github.com/msm8916-mainline/linux-downstream/blob/GT-I9195I/drivers/video/msm/mdss/samsung/S6E88A0_AMS427AP24/dsi_panel_S6E88A0_AMS427AP24_qhd_octa_video.dtsi#L341-L397
[2] https://github.com/msm8916-mainline/linux-downstream/blob/GT-I9195I/drivers/video/msm/mdss/samsung/S6E88A0_AMS427AP24/dsi_panel_S6E88A0_AMS427AP24_qhd_octa_video.dtsi#L214-L254
[3] https://github.com/msm8916-mainline/linux-downstream/blob/GT-I9195I/drivers/video/msm/mdss/samsung/S6E88A0_AMS427AP24/dsi_panel_S6E88A0_AMS427AP24_qhd_octa_video.dtsi#L301-L320
[4] https://github.com/msm8916-mainline/linux-downstream/blob/GT-I9195I/drivers/video/msm/mdss/samsung/S6E88A0_AMS427AP24/ss_dsi_smart_dimming_S6E88A0_AMS427AP24.c
[5] https://github.com/msm8916-mainline/linux-downstream/blob/GT-I9195I/drivers/video/msm/mdss/samsung/S6E88A0_AMS427AP24/ss_dsi_smart_dimming_S6E88A0_AMS427AP24.c#L1816-L1900
[6] https://github.com/msm8916-mainline/linux-downstream/blob/GT-I9195I/drivers/video/msm/mdss/samsung/S6E88A0_AMS427AP24/dsi_panel_S6E88A0_AMS427AP24_qhd_octa_video.dtsi#L256-L268
[7] https://github.com/msm8916-mainline/linux-downstream/blob/GT-I9195I/drivers/video/msm/mdss/samsung/S6E88A0_AMS427AP24/dsi_panel_S6E88A0_AMS427AP24_qhd_octa_video.dtsi#L322-L334
[8] https://github.com/msm8916-mainline/linux-downstream/blob/GT-I9195I/drivers/video/msm/mdss/samsung/ss_dsi_panel_common.c#L1389-L1517
[9] https://github.com/msm8916-mainline/linux-downstream/blob/GT-I9195I/drivers/video/msm/mdss/samsung/S6E88A0_AMS427AP24/ss_dsi_panel_S6E88A0_AMS427AP24.c#L666-L678

---
 drivers/gpu/drm/panel/Kconfig                 |   1 +
 .../panel/panel-samsung-s6e88a0-ams427ap24.c  | 519 +++++++++++++++++-
 2 files changed, 508 insertions(+), 12 deletions(-)
drivers/gpu/drm/panel/Kconfig +1 -0
index f8adc38447fb..d7469c565d1d 100644
@@ -636,6 +636,7 @@ config DRM_PANEL_SAMSUNG_S6E88A0_AMS427AP24
 	tristate "Samsung AMS427AP24 panel with S6E88A0 controller"
 	depends on GPIOLIB && OF && REGULATOR
 	depends on DRM_MIPI_DSI
+	depends on BACKLIGHT_CLASS_DEVICE
 	help
 	  Say Y here if you want to enable support for Samsung AMS427AP24 panel
 	  with S6E88A0 controller (found in Samsung Galaxy S4 Mini Value Edition
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +507 -12

571 lines not on this page · raw message

Signature · 1 line
2.39.5
#9 lore raw

Re: [PATCH v3 4/5] drm/panel: samsung-s6e88a0-ams427ap24: Add brightness control

Hi Jakob,

thanks for your patch!

Quoted 1 line · Jakob Hauser

+static const int s6e88a0_ams427ap24_br_to_cd[NUM_STEPS_CANDELA] = {

(...)

Quoted 1 line

+ /* brightness till, candela */

Brightness to candela conversion table? Edit comment?

Quoted 1 line

+static const u8 s6e88a0_ams427ap24_aid[NUM_STEPS_AID][SEQ_LENGTH_AID] = {

If you know that the sequence 0xb2, 0x40, 0x08, 0x20 means "set AID" (or is it AOR??) you can #define

#define S6E88A0_SET_AID 0xb2

Then make a small buffer:

u8 set_aid[5] = { S6E88A0_SET_AID, 0x40, 0x08, 0x20, 0x00, 0x00 };

then you can strip the first three bytes from the entire table, just copy in the two relevant bytes into set_aor[] and send that.

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c struct s6e88a0_ams427ap24 *to_s6e88a0_ams427ap24(struct drm_panel *panel) · line 207

Quoted 3 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +3 -0
+static const u8 s6e88a0_ams427ap24_elvss[NUM_STEPS_ELVSS][SEQ_LENGTH_ELVSS] = {
+       { 0x28, 0x14 }, /* 10CD ~ 111CD */
+       { 0x28, 0x13 }, /* 119CD */

Command 0xb6 is
#define S6E88A0_SET_LVSS 0xb6

Same comment: just define
u8 set_lvss[2] = {S6E88A0_SET_LVSS, 0x28, 0x00}; copy the second byte into the command, this becomes an array of single bytes.

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c struct s6e88a0_ams427ap24 *to_s6e88a0_ams427ap24(struct drm_panel *panel) · line 229

Quoted 5 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +5 -0
+static const u8 s6e88a0_ams427ap24_gamma[NUM_STEPS_CANDELA][SEQ_LENGTH_GAMMA] = {
+       /* 10CD */
+       { 0x00, 0xc8, 0x00, 0xc4, 0x00, 0xc5, 0x8c, 0x8a, 0x8a, 0x8c, 0x8b,
+         0x8c, 0x87, 0x89, 0x89, 0x88, 0x87, 0x8c, 0x80, 0x82, 0x88, 0x7b,
+         0x72, 0x8c, 0x60, 0x68, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },

This array looks fine though, it seems to be all unique gamma calibration.

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c struct s6e88a0_ams427ap24 *to_s6e88a0_ams427ap24(struct drm_panel *panel) · line 454

Quoted 11 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +11 -0
+static int s6e88a0_ams427ap24_set_brightness(struct backlight_device *bd)
+{
+       struct s6e88a0_ams427ap24 *ctx = bl_get_data(bd);
+       struct mipi_dsi_device *dsi = ctx->dsi;
+       struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi };
+       struct device *dev = &dsi->dev;
+       int brightness = bd->props.brightness;
+       int candela_enum;
+       u8 b2[SEQ_LENGTH_AID + 1];
+       u8 b6[SEQ_LENGTH_ELVSS + 1];
+       u8 ca[SEQ_LENGTH_GAMMA + 1];

Rename them to something like my suggestions so we understand what it is all about. It seems the infrastructure for what I suggested is mostly already there.

See comment above how to modify arrays to contain stuff that is always the same.

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c struct s6e88a0_ams427ap24 *to_s6e88a0_ams427ap24(struct drm_panel *panel) · line 462

Quoted 2 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +2 -0
+       /* get aid */
+       b2[0] = 0xb2;

Use a define per above.

Quoted 10 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +10 -0
+       switch (candela_enum) {
+       case CANDELA_10CD ... CANDELA_105CD:
+               memcpy(&b2[1], s6e88a0_ams427ap24_aid[candela_enum],
+                      SEQ_LENGTH_AID);
+               break;
+       case CANDELA_111CD ... CANDELA_172CD:
+               memcpy(&b2[1], s6e88a0_ams427ap24_aid[CANDELA_111CD],
+                      SEQ_LENGTH_AID);
+               break;
+       case CANDELA_183CD ... CANDELA_300CD:

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c struct s6e88a0_ams427ap24 *to_s6e88a0_ams427ap24(struct drm_panel *panel) · line 482

Quoted 10 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +10 -0
+               memcpy(&b2[1], s6e88a0_ams427ap24_aid[CANDELA_111CD + 1],
+                      SEQ_LENGTH_AID);
+               break;
+       default:
+               dev_err(dev, "Failed to get aid data\n");
+               return -EINVAL;
+       }
+
+       /* get elvss */
+       b6[0] = 0xb6;

Use a define per above.

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c struct s6e88a0_ams427ap24 *to_s6e88a0_ams427ap24(struct drm_panel *panel) · line 491

Quoted 9 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +9 -0
+       if (candela_enum <= CANDELA_111CD) {
+               memcpy(&b6[1], s6e88a0_ams427ap24_elvss[0], SEQ_LENGTH_ELVSS);
+       } else {
+               memcpy(&b6[1], s6e88a0_ams427ap24_elvss[candela_enum - CANDELA_111CD],
+                      SEQ_LENGTH_ELVSS);
+       }
+
+       /* get gamma */
+       ca[0] = 0xca;

#define S6E88A0_SET_GAMMA 0xca

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c struct s6e88a0_ams427ap24 *to_s6e88a0_ams427ap24(struct drm_panel *panel) · line 495

Quoted 4 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +4 -0
+       memcpy(&ca[1], s6e88a0_ams427ap24_gamma[candela_enum], SEQ_LENGTH_GAMMA);
+
+       /* write: key on, aid, acl off, elvss, gamma, gamma update, key off */
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf0, 0x5a, 0x5a);

0xf0 is clearly an unlocking key as per comment in the previous patch.

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c struct s6e88a0_ams427ap24 *to_s6e88a0_ams427ap24(struct drm_panel *panel) · line 497

Quoted 2 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +2 -0
+       mipi_dsi_dcs_write_buffer_multi(&dsi_ctx, b2, ARRAY_SIZE(b2));
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x55, 0x00);

0x55 is MIPI_DCS_WRITE_POWER_SAVE in <video/mipi_display.h>

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c struct s6e88a0_ams427ap24 *to_s6e88a0_ams427ap24(struct drm_panel *panel) · line 501

Quoted 5 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +4 -0
+       mipi_dsi_dcs_write_buffer_multi(&dsi_ctx, b6, ARRAY_SIZE(b6));
+       mipi_dsi_dcs_write_buffer_multi(&dsi_ctx, ca, ARRAY_SIZE(ca));
 
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf7, 0x03);
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf0, 0xa5, 0xa5);

Clearly this locks the L2 access again.

Yours,
Linus Walleij

#10 lore raw

Re: [PATCH v3 4/5] drm/panel: samsung-s6e88a0-ams427ap24: Add brightness control

Hi Linus,

On 25.10.24 21:27, Linus Walleij wrote:
...

Quoted 7 lines · Jakob Hauser
Quoted 1 line

+static const int s6e88a0_ams427ap24_br_to_cd[NUM_STEPS_CANDELA] = {

(...)

Quoted 1 line

+ /* brightness till, candela */

Brightness to candela conversion table? Edit comment?

In the downstream driver there is a table with four columns:
<idx> <from> <till> <candella>.

https://github.com/msm8916-mainline/linux-downstream/blob/GT-I9195I/drivers/video/msm/mdss/samsung/S6E88A0_AMS427AP24/dsi_panel_S6E88A0_AMS427AP24_qhd_octa_video.dtsi#L341-L397

The first column is a counter, the second and third is the from-till-range of brightness steps that correspond to the forth column of candela identifier.

In the patch here I only adopted the third and forth column, because the others were not necessary. The comment "brightness till, candela" was intended to label those two columns.

To make it more clear, I could add the keyword "columns" and the column "brightness from".

        /* columns: brightness from, brightness till, candela */
        /* 0 */    10,  /* 10CD */
        /* 11 */   11,  /* 11CD */
        /* 12 */   12,  /* 12CD */
        /* 13 */   13,  /* 13CD */
        /* 14 */   14,  /* 14CD */

        ...

        /* 30 */   30,  /* 39CD */
        /* 31 */   32,  /* 41CD */
        /* 33 */   34,  /* 44CD */
        /* 35 */   36,  /* 47CD */

        ...

        /* 92 */   97,  /* 126CD */
        /* 98 */   104, /* 134CD */
        /* 105 */  110, /* 143CD */
        /* 111 */  118, /* 152CD */

        ...

        /* 182 */  205, /* 249CD */
        /* 206 */  234, /* 265CD */
        /* 235 */  254, /* 282CD */
        /* 255 */  255, /* 300CD */
Quoted 6 lines
Quoted 1 line

+static const u8 s6e88a0_ams427ap24_aid[NUM_STEPS_AID][SEQ_LENGTH_AID] = {

If you know that the sequence 0xb2, 0x40, 0x08, 0x20 means "set AID" (or is it AOR??) you can #define

#define S6E88A0_SET_AID 0xb2

Thanks to Alexey Min, who looked this up, I can say:

"The PWM mechanism used on Samsung displays is called AOR (AMOLED off ratio), the related function on the kernel driver is called AID (AMOLED impulsive driving)."

source: xdaforums

The downstream driver of ams427ap24 uses the "aid" labeling, therefore I stick to that. (Interestingly the older downstream driver ams427ap01 uses the "aor" labeling.)

Quoted 7 lines

Then make a small buffer:

u8 set_aid[5] = { S6E88A0_SET_AID, 0x40, 0x08, 0x20, 0x00, 0x00 };

then you can strip the first three bytes from the entire table, just copy in the two relevant bytes into set_aor[] and send that.

Ok, I'll try to implement that. The size of the second array dimension of that table will then become [SEQ_LENGTH_AID - 3].

...

Quoted 7 lines
Quoted 7 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +7 -0
+static int s6e88a0_ams427ap24_set_brightness(struct backlight_device *bd)
+{
+       struct s6e88a0_ams427ap24 *ctx = bl_get_data(bd);
+       struct mipi_dsi_device *dsi = ctx->dsi;
+       struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi };
+       struct device *dev = &dsi->dev;
+       int brightness = bd->props.brightness;
Quoted 8 lines

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c struct s6e88a0_ams427ap24 *to_s6e88a0_ams427ap24(struct drm_panel *panel) · line 454

Quoted 4 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +4 -0
+       int candela_enum;
+       u8 b2[SEQ_LENGTH_AID + 1];
+       u8 b6[SEQ_LENGTH_ELVSS + 1];
+       u8 ca[SEQ_LENGTH_GAMMA + 1];

Rename them to something like my suggestions so we understand what it is all about. It seems the infrastructure for what I suggested is mostly already there.

These defines are intended to be the sequence length of the payload for commands aid, elvss and gamma. The naming makes sense to me.

The "+ 1" became necessary because when changing the DCS commands to multi type I ran into the issue that there is one for "mipi_dsi_dcs_write_seq" and one for "mipi_dsi_dcs_write_buffer"... but none for "mipi_dsi_dcs_write" :( So I had to convert those into "mipi_dsi_dcs_write_buffer"+multi, thus including the command register value into the payload string.

...

Quoted 11 lines

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c struct s6e88a0_ams427ap24 *to_s6e88a0_ams427ap24(struct drm_panel *panel) · line 491

Quoted 9 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +9 -0
+       if (candela_enum <= CANDELA_111CD) {
+               memcpy(&b6[1], s6e88a0_ams427ap24_elvss[0], SEQ_LENGTH_ELVSS);
+       } else {
+               memcpy(&b6[1], s6e88a0_ams427ap24_elvss[candela_enum - CANDELA_111CD],
+                      SEQ_LENGTH_ELVSS);
+       }
+
+       /* get gamma */
+       ca[0] = 0xca;

#define S6E88A0_SET_GAMMA 0xca

As stated in my reply on patch 3, I would like to avoid those defines because firstly the naming becomes arbitrary and secondly it spoils the readability of the larger DCS command blocks due to necessary line breaks.

In this specific case here a define would make sense. But I can hardly implement it here without doing it elsewhere. Therefore I would like to keep that as it is.

...

Quoted 4 lines

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c struct s6e88a0_ams427ap24 *to_s6e88a0_ams427ap24(struct drm_panel *panel) · line 497

Quoted 2 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +2 -0
+       mipi_dsi_dcs_write_buffer_multi(&dsi_ctx, b2, ARRAY_SIZE(b2));
+       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x55, 0x00);

0x55 is MIPI_DCS_WRITE_POWER_SAVE in <video/mipi_display.h>

It's the only one that could be used from <video/mipi_display.h>.

Though "MIPI_DCS_WRITE_POWER_SAVE, 0x00" doesn't say much. In the downstream driver there are four levels of ACL:

        0x55, 0x00 -> ACL off
        0x55, 0x01 -> default ACL 15 %
        0x55, 0x02 -> ACL 30 %, also corresponds to the "ACL on" command
        0x55, 0x03 -> doesn't seem to be used

https://github.com/msm8916-mainline/linux-downstream/blob/GT-I9195I/drivers/video/msm/mdss/samsung/S6E88A0_AMS427AP24/dsi_panel_S6E88A0_AMS427AP24_qhd_octa_video.dtsi#L275-L281

I would prefer to stay at 0x55 and add comment "acl off". Embedded in a block of other DCS commands with plain command register values and single line comments appended, as proposed in my reply on patch 3, it looks more readable and descriptive in the context of the other commands.

Kind regards,
Jakob

#11 lore raw

PATCH v3 5/5 drm/panel: samsung-s6e88a0-ams427ap24: Add flip option

In reply to Jakob Hauser

The way of implementing a flip option follows the existing panel-samsung-s6e8aa0.c [1][2][3].

The value to flip the screen is taken from a downstream kernel file of a similar but older panel [4]. The mipi clock [5] for the new panel samsung-s6e88a0-ams427ap24 matches 461 MHz and a hardware read-out of the 0xcb values corresponds to revision R01 of that older panel [6]. Although for samsung-s6e88a0-ams427ap24 that's in non-flipped state while in this older driver it seems to be the other way around. Further up there is a hint [7] basically saying for revision R01 to change the first word of the 0xcb command from 0x06 to 0x0e, which is actually setting BIT(3) of that word. This causes a horizontal flip.

[1] https://github.com/torvalds/linux/blob/v6.11/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c#L103
[2] https://github.com/torvalds/linux/blob/v6.11/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c#L207-L211
[3] https://github.com/torvalds/linux/blob/v6.11/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c#L954-L974
[4] https://github.com/LineageOS/android_kernel_samsung_msm8930-common/blob/lineage-15.1/drivers/video/msm/mipi_samsung_oled_video_qhd_pt-8930.c
[5] https://github.com/LineageOS/android_kernel_samsung_msm8930-common/blob/lineage-15.1/drivers/video/msm/mipi_samsung_oled_video_qhd_pt-8930.c#L2027-L2028
[6] https://github.com/LineageOS/android_kernel_samsung_msm8930-common/blob/lineage-15.1/drivers/video/msm/mipi_samsung_oled_video_qhd_pt-8930.c#L137-L151
[7] https://github.com/LineageOS/android_kernel_samsung_msm8930-common/blob/lineage-15.1/drivers/video/msm/mipi_samsung_oled_video_qhd_pt-8930.c#L66-L74

---
Changes in v3:
- Dissolved function s6e88a0_ams427ap24_parse_dt() and placed the parsing in the probe function. Changed the parsing from of_property_read_bool() to device_property_read_bool().

---
 drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c | 7 +++++++
 1 file changed, 7 insertions(+)
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +7 -0
index 9e211be432d7..cbd51351a325 100644
@@ -32,6 +32,7 @@ struct s6e88a0_ams427ap24 {
 	struct mipi_dsi_device *dsi;
 	struct regulator_bulk_data *supplies;
 	struct gpio_desc *reset_gpio;
+	bool flip_horizontal;
 };
 
 static const struct regulator_bulk_data s6e88a0_ams427ap24_supplies[] = {
@@ -538,6 +539,10 @@ static int s6e88a0_ams427ap24_on(struct s6e88a0_ams427ap24 *ctx)
 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xcc, 0x4c);
 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf2, 0x03, 0x0d);
 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf1, 0xa5, 0xa5);
+
+	if (ctx->flip_horizontal)
+		mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xcb, 0x0e);
+
 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf0, 0xa5, 0xa5);
 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfc, 0xa5, 0xa5);
 
@@ -698,6 +703,8 @@ static int s6e88a0_ams427ap24_probe(struct mipi_dsi_device *dsi)
 		       DRM_MODE_CONNECTOR_DSI);
 	ctx->panel.prepare_prev_first = true;
 
+	ctx->flip_horizontal = device_property_read_bool(dev, "flip-horizontal");
+
 	ret = s6e88a0_ams427ap24_register_backlight(ctx);
 	if (ret < 0)
 		return ret;
Signature · 1 line
2.39.5
#12 lore raw

Re: [PATCH v3 5/5] drm/panel: samsung-s6e88a0-ams427ap24: Add flip option

Hi Jakob,

thanks for your patch!

Quoted 2 lines · Jakob Hauser

The way of implementing a flip option follows the existing panel-samsung-s6e8aa0.c [1][2][3].

That driver is notoriously hard to read because it uses so much magic numbers so please don't copy that aspect of the driver.

(...)

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c static int s6e88a0_ams427ap24_on(struct s6e88a0_ams427ap24 *ctx) · line 544

Quoted 2 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +2 -0
+       if (ctx->flip_horizontal)
+               mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xcb, 0x0e);

#define S6E88A0_SET_FLIP 0xcb
or something like this.

Other than that it looks good!

Yours,
Linus Walleij

#13 lore raw

Re: [PATCH v3 5/5] drm/panel: samsung-s6e88a0-ams427ap24: Add flip option

Hi Linus,

On 25.10.24 21:32, Linus Walleij wrote:
...

Quoted 7 lines · Jakob Hauser
Quoted 3 lines

The way of implementing a flip option follows the existing panel-samsung-s6e8aa0.c [1][2][3].

That driver is notoriously hard to read because it uses so much magic numbers so please don't copy that aspect of the driver.

Actually I used that same approach for the flip option. The implementation of flip looked very well to me. I wanted to state it as source in the commit message. I don't feel comfortable without declaring it.

Quoted 7 lines

(...)

drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c static int s6e88a0_ams427ap24_on(struct s6e88a0_ams427ap24 *ctx) · line 544

Quoted 2 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +2 -0
+       if (ctx->flip_horizontal)
+               mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xcb, 0x0e);

#define S6E88A0_SET_FLIP 0xcb
or something like this.

The 0xcb command register might be more a general panel control, not only serving panel flip. But I can't say for sure. Translating single commands to command register names becomes too arbitrary.

...

Kind regards,
Jakob