dt-bindings: display: panel: Add Samsung S6E88A0-AMS427AP24 bindings
Subsystems (4)
A message that is not in the archive (sent off-list or not yet received): [email protected]
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.
Jakob Hauser (4):
dt-bindings: display: panel: Add Samsung S6E88A0-AMS427AP24 bindings drm/panel: samsung-s6e88a0-ams427ap24: Add initial driver drm/panel: samsung-s6e88a0-ams427ap24: Add brightness control drm/panel: samsung-s6e88a0-ams427ap24: Add flip option
.../panel/samsung,s6e88a0-ams427ap24.yaml | 68 ++ drivers/gpu/drm/panel/Kconfig | 10 + drivers/gpu/drm/panel/Makefile | 1 + .../panel/panel-samsung-s6e88a0-ams427ap24.c | 772 ++++++++++++++++++ 4 files changed, 851 insertions(+) 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
PATCH 1/4 dt-bindings: display: panel: Add Samsung S6E88A0-AMS427AP24 bindings
Add bindings for Samsung AMS427AP24 panel with S6E88A0 controller.
---
Patch is based on https://gitlab.freedesktop.org/drm/misc/kernel.git
current branch drm-misc-next.
--- .../panel/samsung,s6e88a0-ams427ap24.yaml | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/panel/samsung,s6e88a0-ams427ap24.yaml
Documentation/devicetree/bindings/display/panel/samsung,s6e88a0-ams427ap24.yaml new file +68 -0
@@ -0,0 +1,68 @@ +# 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 + + vdd3-supply: + description: core voltage supply + + vci-supply: + description: voltage supply for analog circuits + + flip-horizontal: + description: boolean to flip image horizontally + type: boolean + +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
Rob Herring
maintainerQuoted 40 lines · Jakob Hauser
Add bindings for Samsung AMS427AP24 panel with S6E88A0 controller.
Signed-off-by Jakob Hauser <[email protected]>---
Patch is based on https://gitlab.freedesktop.org/drm/misc/kernel.git
current branch drm-misc-next.--- .../panel/samsung,s6e88a0-ams427ap24.yaml | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/panel/samsung,s6e88a0-ams427ap24.yamlDocumentation/devicetree/bindings/display/panel/samsung,s6e88a0-ams427ap24.yaml new file +23
-0@@ -0,0 +1,68 @@ +# 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
Documentation/devicetree/bindings/display/panel/samsung,s6e88a0-ams427ap24.yaml line 33
Quoted 10 lines
Documentation/devicetree/bindings/display/panel/samsung,s6e88a0-ams427ap24.yaml new file +10
-0+ + vdd3-supply: + description: core voltage supply + + vci-supply: + description: voltage supply for analog circuits + + flip-horizontal: + description: boolean to flip image horizontally + type: boolean
This is already used in another panel. Please move it to panel-common.yaml.
Quoted 38 lines
Documentation/devicetree/bindings/display/panel/samsung,s6e88a0-ams427ap24.yaml new file +35
-0+ +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
Hi Rob,
Quoted 46 lines · Rob Herring
Quoted 45 lines · Jakob Hauser
Add bindings for Samsung AMS427AP24 panel with S6E88A0 controller.
Signed-off-by Jakob Hauser <[email protected]>---
Patch is based on https://gitlab.freedesktop.org/drm/misc/kernel.git
current branch drm-misc-next.--- .../panel/samsung,s6e88a0-ams427ap24.yaml | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+)create mode 100644
Documentation/devicetree/bindings/display/panel/samsung,s6e88a0-ams427ap24.yamlDocumentation/devicetree/bindings/display/panel/samsung,s6e88a0-ams427ap24.yaml new file +28
-0@@ -0,0 +1,68 @@ +# 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 + + vdd3-supply: + description: core voltage supply + + vci-supply:
Quoted 9 lines
Documentation/devicetree/bindings/display/panel/samsung,s6e88a0-ams427ap24.yaml line 33
Quoted 5 lines
Documentation/devicetree/bindings/display/panel/samsung,s6e88a0-ams427ap24.yaml new file +5
-0+ description: voltage supply for analog circuits + + flip-horizontal: + description: boolean to flip image horizontally + type: booleanThis is already used in another panel. Please move it to
panel-common.yaml.
I'll add a patch in v2 to move "flip-horizontal" and along with it also "flip-vertical" to "panel-common.yaml". File "samsung,s6e8aa0.yaml" needs to be changed accordingly.
@ Thierry, Laurent & Andrzej: CC'ing you as you're listed as maintainers of the affected files.
Quoted 30 lines
Quoted 30 lines
Documentation/devicetree/bindings/display/panel/samsung,s6e88a0-ams427ap24.yaml new file +30
-0+ +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 {
Quoted 8 lines
Quoted 8 lines
Documentation/devicetree/bindings/display/panel/samsung,s6e88a0-ams427ap24.yaml new file +5
-0+ remote-endpoint = <&mdss_dsi0_out>; + }; + }; + }; + };Signature · 1 line
2.39.5
Kind regards,
Jakob
PATCH 2/4 drm/panel: samsung-s6e88a0-ams427ap24: Add initial driver
In reply to Jakob HauserThis 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.
Coulnd't read out RAW EDID, /sys/class/drm/card0-DSI-1/edid is empty.
[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
--- drivers/gpu/drm/panel/Kconfig | 9 + drivers/gpu/drm/panel/Makefile | 1 + .../panel/panel-samsung-s6e88a0-ams427ap24.c | 261 ++++++++++++++++++ 3 files changed, 271 insertions(+) create mode 100644 drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c
drivers/gpu/drm/panel/Kconfig +9 -0
@@ -623,6 +623,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
@@ -76,6 +76,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 +261 -0
261 lines not on this page · raw message
Signature · 1 line
2.39.5
Re: [PATCH 2/4] drm/panel: samsung-s6e88a0-ams427ap24: Add initial driver
Quoted 85 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:
- Addedmipi_dsi_dcs_set_display_on()to functions6e88a0_ams427ap24_on(), otherwise the display does not show up.
- In functionss6e88a0_ams427ap24_on()ands6e88a0_ams427ap24_off()changed DSI commands to multi context and used "accum_err" returns.
- In functionss6e88a0_ams427ap24_on()ands6e88a0_ams427ap24_off()replacedmsleep()bymipi_dsi_msleep().
- The functions6e88a0_ams427ap24_get_modes()was changed to make use ofdrm_connector_helper_get_modes_fixed(). This also required to includedrm/drm_probe_helper.h.
- In functions6e88a0_ams427ap24_probe()registring the regulators was changed todevm_regulator_bulk_get_const(). This required to change supplies in structs6e88a0_ams427ap24to a pointer.Coulnd't read out RAW EDID,
/sys/class/drm/card0-DSI-1/edidis empty.[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.dtsiSigned-off-by Jakob Hauser <[email protected]>--- drivers/gpu/drm/panel/Kconfig | 9 + drivers/gpu/drm/panel/Makefile | 1 + .../panel/panel-samsung-s6e88a0-ams427ap24.c | 261 ++++++++++++++++++ 3 files changed, 271 insertions(+)create mode 100644
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.cdrivers/gpu/drm/panel/Kconfig +9
-0@@ -623,6 +623,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 OFdrivers/gpu/drm/panel/Makefile +1
-0@@ -76,6 +76,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.odrivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c new file +15
-0@@ -0,0 +1,261 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* +* Samsung AMS427AP24 panel with S6E88A0 controller +* Copyright (c) 2024 Jakob Hauser <[email protected]> +*/ + +#include <linux/delay.h> +#include <linux/gpio/consumer.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/regulator/consumer.h> + +#include <video/mipi_display.h> + +#include <drm/drm_mipi_dsi.h>
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c line 25
Quoted 10 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c new file +10
-0+#include <drm/drm_modes.h> +#include <drm/drm_panel.h> +#include <drm/drm_probe_helper.h> + +struct s6e88a0_ams427ap24 { +struct drm_panel panel; +struct mipi_dsi_device *dsi; +struct regulator_bulk_data *supplies; +struct gpio_desc *reset_gpio; +bool prepared;
Hi Jakob,
I think you can drop the prepared here as it should be handled by framework now [1]
Thanks,
Jessica Zhang
[1] https://elixir.bootlin.com/linux/v6.11.3/source/include/drm/drm_panel.h#L262
Quoted 239 lines
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c new file +236
-0+}; + +const struct regulator_bulk_data s6e88a0_ams427ap24_supplies[] = { + { .supply ="vdd3" }, + { .supply ="vci" }, +}; + +static inline +struct s6e88a0_ams427ap24 *to_s6e88a0_ams427ap24 (struct drm_panel *panel) +{ + return container_of(panel, struct s6e88a0_ams427ap24, panel); +} + +static void s6e88a0_ams427ap24_reset (struct s6e88a0_ams427ap24 *ctx) +{ +gpiod_set_value_cansleep (ctx->reset_gpio,0 ); +usleep_range (5000 ,6000 ); +gpiod_set_value_cansleep (ctx->reset_gpio,1 ); +usleep_range (1000 ,2000 ); +gpiod_set_value_cansleep (ctx->reset_gpio,0 ); +usleep_range (18000 ,19000 ); +} + +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 ); +mipi_dsi_dcs_write_seq_multi (&dsi_ctx,0xfc ,0x5a ,0x5a ); +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 ); + +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 ); +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 ); +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 ); + +mipi_dsi_dcs_set_display_on_multi (&dsi_ctx); + +return dsi_ctx.accum_err; +} + +static int s6e88a0_ams427ap24_off (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_set_display_off_multi (&dsi_ctx); +mipi_dsi_dcs_enter_sleep_mode_multi (&dsi_ctx); +mipi_dsi_msleep (&dsi_ctx,120 ); + +return dsi_ctx.accum_err; +} + +static int s6e88a0_ams427ap24_prepare (struct drm_panel *panel) +{ +struct s6e88a0_ams427ap24 *ctx =to_s6e88a0_ams427ap24 (panel); +struct device *dev = &ctx->dsi->dev; +int ret; + +if (ctx->prepared) +return 0 ; + + ret =regulator_bulk_enable (ARRAY_SIZE (s6e88a0_ams427ap24_supplies), + ctx->supplies); +if (ret <0 ) { +dev_err (dev,"Failed to enable regulators: %d\n" , ret); +return ret; + } + +s6e88a0_ams427ap24_reset (ctx); + + ret =s6e88a0_ams427ap24_on (ctx); +if (ret <0 ) { +dev_err (dev,"Failed to initialize panel: %d\n" , ret); +gpiod_set_value_cansleep (ctx->reset_gpio,1 ); +regulator_bulk_disable (ARRAY_SIZE (s6e88a0_ams427ap24_supplies), + ctx->supplies); +return ret; + } + + ctx->prepared = true; +return 0 ; +} + +static int s6e88a0_ams427ap24_unprepare (struct drm_panel *panel) +{ +struct s6e88a0_ams427ap24 *ctx =to_s6e88a0_ams427ap24 (panel); +struct device *dev = &ctx->dsi->dev; +int ret; + +if (!ctx->prepared) +return 0 ; + + ret =s6e88a0_ams427ap24_off (ctx); +if (ret <0 ) +dev_err (dev,"Failed to un-initialize panel: %d\n" , ret); + +gpiod_set_value_cansleep (ctx->reset_gpio,1 ); +regulator_bulk_disable (ARRAY_SIZE (s6e88a0_ams427ap24_supplies), + ctx->supplies); + + ctx->prepared = false; +return 0 ; +} + +static const struct drm_display_mode s6e88a0_ams427ap24_mode = { + .clock = (540 +94 +4 +18 ) * (960 +12 +1 +3 ) *60 /1000 , + .hdisplay =540 , + .hsync_start =540 +94 , + .hsync_end =540 +94 +4 , + .htotal =540 +94 +4 +18 , + .vdisplay =960 , + .vsync_start =960 +12 , + .vsync_end =960 +12 +1 , + .vtotal =960 +12 +1 +3 , + .width_mm =55 , + .height_mm =95 , + .type =DRM_MODE_TYPE_DRIVER |DRM_MODE_TYPE_PREFERRED , +}; + +static int s6e88a0_ams427ap24_get_modes (struct drm_panel *panel, +struct drm_connector *connector) +{ +return drm_connector_helper_get_modes_fixed (connector, + &s6e88a0_ams427ap24_mode); +} + +static const struct drm_panel_funcs s6e88a0_ams427ap24_panel_funcs = { + .prepare = s6e88a0_ams427ap24_prepare, + .unprepare = s6e88a0_ams427ap24_unprepare, + .get_modes = s6e88a0_ams427ap24_get_modes, +}; + +static int s6e88a0_ams427ap24_probe (struct mipi_dsi_device *dsi) +{ +struct device *dev = &dsi->dev; +struct s6e88a0_ams427ap24 *ctx; +int ret; + + ctx =devm_kzalloc (dev,sizeof (*ctx),GFP_KERNEL ); +if (!ctx) +return -ENOMEM ; + + ret =devm_regulator_bulk_get_const (dev, +ARRAY_SIZE (s6e88a0_ams427ap24_supplies), + s6e88a0_ams427ap24_supplies, + &ctx->supplies); +if (ret <0 ) +return ret; + + ctx->reset_gpio =devm_gpiod_get (dev,"reset" ,GPIOD_OUT_HIGH ); +if (IS_ERR (ctx->reset_gpio)) +return dev_err_probe (dev,PTR_ERR (ctx->reset_gpio), +"Failed to get reset-gpios\n" ); + + ctx->dsi = dsi; +mipi_dsi_set_drvdata (dsi, ctx); + + dsi->lanes =2 ; + dsi->format =MIPI_DSI_FMT_RGB888 ; + dsi->mode_flags =MIPI_DSI_MODE_VIDEO |MIPI_DSI_MODE_VIDEO_BURST | +MIPI_DSI_MODE_NO_EOT_PACKET ; + +drm_panel_init (&ctx->panel, dev, &s6e88a0_ams427ap24_panel_funcs, +DRM_MODE_CONNECTOR_DSI ); + ctx->panel.prepare_prev_first = true; + +drm_panel_add (&ctx->panel); + + ret =mipi_dsi_attach (dsi); +if (ret <0 ) { +dev_err (dev,"Failed to attach to DSI host: %d\n" , ret); +drm_panel_remove (&ctx->panel); +return ret; + } + +return 0 ; +} + +static void s6e88a0_ams427ap24_remove (struct mipi_dsi_device *dsi) +{ +struct s6e88a0_ams427ap24 *ctx =mipi_dsi_get_drvdata (dsi); +int ret; + + ret =mipi_dsi_detach (dsi); +if (ret <0 ) +dev_err (&dsi->dev,"Failed to detach from DSI host: %d\n" , ret); + +drm_panel_remove (&ctx->panel); +} + +static const struct of_device_id s6e88a0_ams427ap24_of_match[] = { + { .compatible ="samsung,s6e88a0-ams427ap24" }, + {/* sentinel */ }, +}; +MODULE_DEVICE_TABLE (of, s6e88a0_ams427ap24_of_match); + +static struct mipi_dsi_driver s6e88a0_ams427ap24_driver = { + .probe = s6e88a0_ams427ap24_probe, + .remove = s6e88a0_ams427ap24_remove, + .driver = { + .name ="panel-s6e88a0-ams427ap24" , + .of_match_table = s6e88a0_ams427ap24_of_match, + }, +}; +module_mipi_dsi_driver (s6e88a0_ams427ap24_driver); + +MODULE_AUTHOR ("Jakob Hauser <[email protected]>" ); +MODULE_DESCRIPTION ("Samsung AMS427AP24 panel with S6E88A0 controller" ); +MODULE_LICENSE ("GPL v2" );Signature · 1 line
2.39.5
Re: [PATCH 2/4] drm/panel: samsung-s6e88a0-ams427ap24: Add initial driver
Hi Jessica,
Quoted 3 lines · Jessica Zhang
On 10/10/2024 11:31 AM, Jakob Hauser wrote:
...
Quoted 9 lines
Quoted 6 lines
+struct
s6e88a0_ams427ap24{
+ structdrm_panelpanel;
+ structmipi_dsi_device*dsi;
+ structregulator_bulk_data*supplies;
+ structgpio_desc*reset_gpio;
+ bool prepared;Hi Jakob,
Quoted 9 lines
I think you can drop the
preparedhere as it should be handled by framework now [1]Thanks,
Jessica Zhang
[1] https://elixir.bootlin.com/linux/v6.11.3/source/include/drm/drm_panel.h#L262
Quoted 1 line
+};
Thanks for the hint. I'll change that in v2.
...
Kind regards,
Jakob
PATCH 3/4 drm/panel: samsung-s6e88a0-ams427ap24: Add brightness control
In reply to Jakob HauserThe 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
@@ -627,6 +627,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
PATCH 4/4 drm/panel: samsung-s6e88a0-ams427ap24: Add flip option
In reply to Jakob HauserThe 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
--- .../drm/panel/panel-samsung-s6e88a0-ams427ap24.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +16 -0
@@ -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;bool prepared; };
@@ -539,6 +540,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 );
@@ -673,6 +678,15 @@ static int s6e88a0_ams427ap24_register_backlight(struct s6e88a0_ams427ap24 *ctx)return ret; } +static void s6e88a0_ams427ap24_parse_dt (struct s6e88a0_ams427ap24 *ctx) +{ +struct mipi_dsi_device *dsi = ctx->dsi; +struct device *dev = &dsi->dev; +struct device_node *np = dev->of_node; + + ctx->flip_horizontal =of_property_read_bool (np,"flip-horizontal" ); +} +static int s6e88a0_ams427ap24_probe (struct mipi_dsi_device *dsi) {struct device *dev = &dsi->dev;
@@ -707,6 +721,8 @@ static int s6e88a0_ams427ap24_probe(struct mipi_dsi_device *dsi) DRM_MODE_CONNECTOR_DSI); ctx->panel.prepare_prev_first = true; +s6e88a0_ams427ap24_parse_dt (ctx); + ret =s6e88a0_ams427ap24_register_backlight (ctx);if (ret <0 )return ret;
Signature · 1 line
2.39.5
Re: [PATCH 4/4] drm/panel: samsung-s6e88a0-ams427ap24: Add flip option
Quoted 9 lines · 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
0xcbvalues 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
Hi Jakob,
I'm a bit confused by the wording here. Do you mean that even though the downstream driver comments state the panel is in a non-flipped state by default, your observations suggest that it's actually defaulting to a flipped state?
Thanks,
Jessica Zhang
Quoted 68 lines
hint [7] basically saying for revision R01 to change the first word of the
0xcbcommand from0x06to0x0e, 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-L74Signed-off-by Jakob Hauser <[email protected]>--- .../drm/panel/panel-samsung-s6e88a0-ams427ap24.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.c +16
-0@@ -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;bool prepared; };@@ -539,6 +540,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 );@@ -673,6 +678,15 @@ static int s6e88a0_ams427ap24_register_backlight(struct s6e88a0_ams427ap24 *ctx)return ret; } +static void s6e88a0_ams427ap24_parse_dt (struct s6e88a0_ams427ap24 *ctx) +{ +struct mipi_dsi_device *dsi = ctx->dsi; +struct device *dev = &dsi->dev; +struct device_node *np = dev->of_node; + + ctx->flip_horizontal =of_property_read_bool (np,"flip-horizontal" ); +} +static int s6e88a0_ams427ap24_probe (struct mipi_dsi_device *dsi) {struct device *dev = &dsi->dev;@@ -707,6 +721,8 @@ static int s6e88a0_ams427ap24_probe(struct mipi_dsi_device *dsi) DRM_MODE_CONNECTOR_DSI); ctx->panel.prepare_prev_first = true; +s6e88a0_ams427ap24_parse_dt (ctx); + ret =s6e88a0_ams427ap24_register_backlight (ctx);if (ret <0 )return ret;Signature · 1 line
2.39.5
Re: [PATCH 4/4] drm/panel: samsung-s6e88a0-ams427ap24: Add flip option
Hi Jessica,
Quoted 12 lines · Jessica Zhang
Quoted 9 lines · 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
0xcbvalues 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
Quoted 19 lines
Hi Jakob,
I'm a bit confused by the wording here. Do you mean that even though the downstream driver comments state the panel is in a non-flipped state by default, your observations suggest that it's actually defaulting to a flipped state?
Thanks,
Jessica Zhang
Quoted 11 lines
hint [7] basically saying for revision R01 to change the first word of the
0xcbcommand from0x06to0x0e, 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
In the commit message I'm referencing another downstream driver for a different (similar but older) panel. The commit message is very summarized. I'll try to describe the situation more detailed here. Maybe this is going too far but I don't know how to dissolve it otherwise.
The panel AMS427AP24 of this patchset is mounted in device samsung-serranove "Samsung Galaxy S4 Mini Value Edition". On this device the picture by default is the wrong way around (flipped/mirrored). So it needs horizontal flip to get it right. In the downstream Android kernel this is done in the panel controller. Following links are just for reference, no need to study them in deep: "hflip" in dtsi file [a], reading "hflip" in mdss_dsi_panel.c [b], and then I'm fully not sure how it continues... processing in mdss_mdp_overlay.c [d] or in mdss_mdp_rotator.c [e] or in mdss_mdp_pipe.c [f].
I noticed that in another downstream panel driver used by the similar but older device samsung-serranolte ("Samsung Galaxy S4 Mini LTE", not the "ve" Value Edition) the flip is done directly in the panel driver. That driver is labelled "AMS427AP01" [f] but it seems to serve a couple of different dimensions [g] and also distinguishes between an original revision and a revision "r01". This driver contains a section "#if defined(CONFIG_FEATURE_FLIPLR)" [h]. FLIPLR means flip left-right. That section holds values for the 0xcb command for different sizes (different mipi clocks) and the two different revisions.
When reading out the default values of the 0xcb command on the newer device samsung-serranove ("ve" Value Edition") with panel AMS427AP24, they match with the values of the older driver AMS427AP01 for mipi clock 461 MHz revision r01 [i].
However, for the newer device samsung-serranove ("ve" Value Edition") with panel AMS427AP24 that's the default value. Now it needs a horizontal flip to get the picture right. This can be achieved by changing the first value of 0xcb command from 0x06 to 0x0e. That's what I implemented in the patch as an option.
For the older device samsung-serranolte (LTE, not "ve" Value Edition) with panel AMS427AP01 I can't say much. That's possibly where the confusion comes from. In that driver for that older panel the hint on value 0x0e is just a comment [j] while the value 0x06 [k] is part of the "#if defined(CONFIG_FEATURE_FLIPLR)" section. Therefore I assume that on the older panel AMS427AP01 it's the other way around: value 0x0e as default and 0x06 as flip option.
I hope this more detailed description is comprehensible. Let me know if you have questions. Also feel free to suggest improvements on the commit message.
[a] 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#L112
[b] https://github.com/msm8916-mainline/linux-downstream/blob/GT-I9195I/drivers/video/msm/mdss/mdss_dsi_panel.c#L1290-L1291
[c] https://github.com/msm8916-mainline/linux-downstream/blob/GT-I9195I/drivers/video/msm/mdss/mdss_mdp_overlay.c#L709-L711
[d] https://github.com/msm8916-mainline/linux-downstream/blob/GT-I9195I/drivers/video/msm/mdss/mdss_mdp_rotator.c#L590-L591
[e] https://github.com/msm8916-mainline/linux-downstream/blob/GT-I9195I/drivers/video/msm/mdss/mdss_mdp_pipe.c#L1309-L1310
[f] https://github.com/LineageOS/android_kernel_samsung_msm8930-common/blob/lineage-15.1/drivers/video/msm/mipi_samsung_oled_video_qhd_pt-8930.c#L1867
[g] https://github.com/LineageOS/android_kernel_samsung_msm8930-common/blob/lineage-15.1/drivers/video/msm/mipi_samsung_oled_video_qhd_pt-8930.c#L1980-L1995
[h] https://github.com/LineageOS/android_kernel_samsung_msm8930-common/blob/lineage-15.1/drivers/video/msm/mipi_samsung_oled_video_qhd_pt-8930.c#L65-L246
[i] 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
[j] https://github.com/LineageOS/android_kernel_samsung_msm8930-common/blob/lineage-15.1/drivers/video/msm/mipi_samsung_oled_video_qhd_pt-8930.c#L68
[k] https://github.com/LineageOS/android_kernel_samsung_msm8930-common/blob/lineage-15.1/drivers/video/msm/mipi_samsung_oled_video_qhd_pt-8930.c#L139-L140
...
Kind regards,
Jakob