* [PATCH v3 0/3] Add support for the Samsung S6E8FCO DSI and M1906F9 display panel
@ 2026-03-12 11:55 Yedaya Katsman
2026-03-12 11:55 ` [PATCH v3 1/3] dt-bindings: display: panel: Add Samsung S6E8FCO-M1906F9 Yedaya Katsman
` (3 more replies)
0 siblings, 4 replies; 12+ messages in thread
From: Yedaya Katsman @ 2026-03-12 11:55 UTC (permalink / raw)
To: Neil Armstrong, Jessica Zhang, David Airlie, Simona Vetter,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Kamil Gołda,
Bjorn Andersson, Konrad Dybcio
Cc: ~postmarketos/upstreaming, phone-devel, dri-devel, devicetree,
linux-kernel, linux-arm-msm, Yedaya Katsman
This adds a driver to support the Samsung S6E8FCO DSI controller with the
M1906F9 display panel found in Xiaomi Mi A3 (xiaomi-laurel). The driver is
generated using linux-mdss-dsi-panel-driver-generator[0].
The mdss reset dependency makes the screen work more reliably.
[0]: https://github.com/msm8916-mainline/linux-mdss-dsi-panel-driver-generator
Original tree with patches: https://gitlab.postmarketos.org/SzczurekYT/linux/-/tree/laurel
Signed-off-by: Yedaya Katsman <yedaya.ka@gmail.com>
---
Changes in v3:
- Make driver, bindings, compatible specific to M1906F9 panel
- Adjust brightness scale and default
- de-mystify some dsi writes
- move pinctrl for mdss into panel node
- Rename regulator nodes and names according to schematic
- Treat vreg_l9a as input to vddi regulator
- Add myself to copyright header, remove years
- Link to v2: https://lore.kernel.org/r/20260223-panel-patches-v2-0-1b6ad471d540@gmail.com
Changes in v2:
- Changed commit title like Dmitry asked
- Fixed copyright header years
- Link to v1: https://lore.kernel.org/r/20260223-panel-patches-v1-0-7756209477f9@gmail.com
---
Yedaya Katsman (3):
dt-bindings: display: panel: Add Samsung S6E8FCO-M1906F9
drm: panel: Add Samsung S6E8FCO DSI controller for M1906F9 panel
arm64: dts: qcom: sm6125-xiaomi-laurel-sprout: Enable MDSS and add panel
.../display/panel/samsung,s6e8fco-m1906f9.yaml | 63 +++++
MAINTAINERS | 6 +
.../boot/dts/qcom/sm6125-xiaomi-laurel-sprout.dts | 94 +++++++
drivers/gpu/drm/panel/Kconfig | 13 +
drivers/gpu/drm/panel/Makefile | 1 +
.../gpu/drm/panel/panel-samsung-s6e8fco-m1906f9.c | 302 +++++++++++++++++++++
6 files changed, 479 insertions(+)
---
base-commit: d4906ae14a5f136ceb671bb14cedbf13fa560da6
change-id: 20260218-panel-patches-696df7e0d810
prerequisite-message-id: <20260303034847.13870-1-val@packett.cool>
prerequisite-patch-id: 3fba84f11111406e0d530013fd45ad0eb389786b
prerequisite-patch-id: 81440b7f28f9101d3dc5d4bad6dc86e39b81a026
prerequisite-patch-id: 53469d8c9810169d058f1bfd27ac8399038aae74
prerequisite-patch-id: 80809bee71eb6434f6699d5e5f8c7f9d4bcd1ca7
prerequisite-patch-id: 0269e01c9c54a37bb92983635cd516342189aee5
prerequisite-patch-id: e2bbf7c452d4da6d71b1a5194e0d7ce46584e113
Best regards,
--
Yedaya Katsman <yedaya.ka@gmail.com>
^ permalink raw reply [flat|nested] 12+ messages in thread* [PATCH v3 1/3] dt-bindings: display: panel: Add Samsung S6E8FCO-M1906F9 2026-03-12 11:55 [PATCH v3 0/3] Add support for the Samsung S6E8FCO DSI and M1906F9 display panel Yedaya Katsman @ 2026-03-12 11:55 ` Yedaya Katsman 2026-03-13 4:15 ` Claude review: " Claude Code Review Bot 2026-03-12 11:55 ` [PATCH v3 2/3] drm: panel: Add Samsung S6E8FCO DSI controller for M1906F9 panel Yedaya Katsman ` (2 subsequent siblings) 3 siblings, 1 reply; 12+ messages in thread From: Yedaya Katsman @ 2026-03-12 11:55 UTC (permalink / raw) To: Neil Armstrong, Jessica Zhang, David Airlie, Simona Vetter, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Kamil Gołda, Bjorn Andersson, Konrad Dybcio Cc: ~postmarketos/upstreaming, phone-devel, dri-devel, devicetree, linux-kernel, linux-arm-msm, Yedaya Katsman Document Samsung S6E8FCO DTS binding used with the M1906F9 6.09" 720x1560 panel found in the Xiaomi Mi A3 smartphone. Co-developed-by: Kamil Gołda <kamil.golda@protonmail.com> Signed-off-by: Kamil Gołda <kamil.golda@protonmail.com> Signed-off-by: Yedaya Katsman <yedaya.ka@gmail.com> --- .../display/panel/samsung,s6e8fco-m1906f9.yaml | 63 ++++++++++++++++++++++ MAINTAINERS | 5 ++ 2 files changed, 68 insertions(+) diff --git a/Documentation/devicetree/bindings/display/panel/samsung,s6e8fco-m1906f9.yaml b/Documentation/devicetree/bindings/display/panel/samsung,s6e8fco-m1906f9.yaml new file mode 100644 index 0000000000000000000000000000000000000000..927d170793dcd49c19ebe353268980710ad4b5b2 --- /dev/null +++ b/Documentation/devicetree/bindings/display/panel/samsung,s6e8fco-m1906f9.yaml @@ -0,0 +1,63 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/display/panel/samsung,s6e8fco-m1906f9.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Samsung S6E8FCO DSI for the Samsung M1906F9 AMOLED Panel + +maintainers: + - Yedaya Katsman <yedaya.ka@gmail.com> + +allOf: + - $ref: panel-common.yaml# + +properties: + compatible: + const: samsung,s6e8fco-m1906f9 + + reg: + maxItems: 1 + + vddi-supply: + description: VDDI regulator + vci-supply: + description: VCI regulator + reset-gpios: true + port: true + +required: + - compatible + - reg + - vddi-supply + - vci-supply + - port + - reset-gpios + +additionalProperties: false + +examples: + - | + #include <dt-bindings/gpio/gpio.h> + + dsi { + #address-cells = <1>; + #size-cells = <0>; + + panel@0 { + compatible = "samsung,s6e8fco-m1906f9"; + reg = <0>; + + vddi-supply = <&panel_vddi_1p8>; + vci-supply = <&panel_vci_3p0>; + + reset-gpios = <&tlmm 90 GPIO_ACTIVE_LOW>; + + port { + panel_in: endpoint { + remote-endpoint = <&mdss_dsi0_out>; + }; + }; + }; + }; +... diff --git a/MAINTAINERS b/MAINTAINERS index e087673237636268346979ddc270f8cf0905c722..d7aee8dab903cd42c245fea3cf8971dcd99b2196 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -8183,6 +8183,11 @@ S: Maintained F: Documentation/devicetree/bindings/display/panel/samsung,s6e3ha8.yaml F: drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c +DRM DRIVER FOR SAMSUNG S6E8FCO PANELS +M: Yedaya Katsman <yedaya.ka@gmail.com> +S: Maintained +F: Documentation/devicetree/bindings/display/panel/samsung,s6e8fco-m1906f9.yaml + DRM DRIVER FOR SAMSUNG SOFEF00 DDIC M: David Heidelberg <david@ixit.cz> M: Casey Connolly <casey.connolly@linaro.org> -- 2.53.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Claude review: dt-bindings: display: panel: Add Samsung S6E8FCO-M1906F9 2026-03-12 11:55 ` [PATCH v3 1/3] dt-bindings: display: panel: Add Samsung S6E8FCO-M1906F9 Yedaya Katsman @ 2026-03-13 4:15 ` Claude Code Review Bot 0 siblings, 0 replies; 12+ messages in thread From: Claude Code Review Bot @ 2026-03-13 4:15 UTC (permalink / raw) To: dri-devel-reviews Patch Review This patch adds the YAML binding and MAINTAINERS entry. It looks clean. **Minor observations:** - The binding looks correct, using `panel-common.yaml` as the base, with the right required properties. - The `reset-gpios` is listed as `true` (accepting the panel-common schema), which is fine. - No `backlight` property is documented, but since the driver creates its own backlight device internally, this is acceptable. No issues with this patch. --- Generated by Claude Code Patch Reviewer ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v3 2/3] drm: panel: Add Samsung S6E8FCO DSI controller for M1906F9 panel 2026-03-12 11:55 [PATCH v3 0/3] Add support for the Samsung S6E8FCO DSI and M1906F9 display panel Yedaya Katsman 2026-03-12 11:55 ` [PATCH v3 1/3] dt-bindings: display: panel: Add Samsung S6E8FCO-M1906F9 Yedaya Katsman @ 2026-03-12 11:55 ` Yedaya Katsman 2026-03-12 12:09 ` David Heidelberg 2026-03-12 12:10 ` David Heidelberg 2026-03-12 11:55 ` [PATCH v3 3/3] arm64: dts: qcom: sm6125-xiaomi-laurel-sprout: Enable MDSS and add panel Yedaya Katsman 2026-03-13 4:15 ` Claude review: Add support for the Samsung S6E8FCO DSI and M1906F9 display panel Claude Code Review Bot 3 siblings, 2 replies; 12+ messages in thread From: Yedaya Katsman @ 2026-03-12 11:55 UTC (permalink / raw) To: Neil Armstrong, Jessica Zhang, David Airlie, Simona Vetter, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Kamil Gołda, Bjorn Andersson, Konrad Dybcio Cc: ~postmarketos/upstreaming, phone-devel, dri-devel, devicetree, linux-kernel, linux-arm-msm, Yedaya Katsman Add driver for Samsung S6E8FCO DSI controller for M1906F9 video mode panel, found in Xiaomi Mi A3 mobile phone. Co-developed-by: Kamil Gołda <kamil.golda@protonmail.com> Signed-off-by: Kamil Gołda <kamil.golda@protonmail.com> Signed-off-by: Yedaya Katsman <yedaya.ka@gmail.com> --- MAINTAINERS | 1 + drivers/gpu/drm/panel/Kconfig | 13 + drivers/gpu/drm/panel/Makefile | 1 + .../gpu/drm/panel/panel-samsung-s6e8fco-m1906f9.c | 302 +++++++++++++++++++++ 4 files changed, 317 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index d7aee8dab903cd42c245fea3cf8971dcd99b2196..d00775a09445a8a1bd626ecfd27903471d08d33a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -8187,6 +8187,7 @@ DRM DRIVER FOR SAMSUNG S6E8FCO PANELS M: Yedaya Katsman <yedaya.ka@gmail.com> S: Maintained F: Documentation/devicetree/bindings/display/panel/samsung,s6e8fco-m1906f9.yaml +F: drivers/gpu/drm/panel/panel-samsung-s6e8fco-m1906f9.c DRM DRIVER FOR SAMSUNG SOFEF00 DDIC M: David Heidelberg <david@ixit.cz> diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig index 7a83804fedca1b688ce6fbe4295ec9009007e693..ee9cc6939f2ac1dc4542563fd73f68ac5f9ee371 100644 --- a/drivers/gpu/drm/panel/Kconfig +++ b/drivers/gpu/drm/panel/Kconfig @@ -893,6 +893,19 @@ config DRM_PANEL_SAMSUNG_S6E8AA5X01_AMS561RA01 ~5.6 inch AMOLED display, and the controller is driven by the MIPI DSI protocol with 4 lanes. +config DRM_PANEL_SAMSUNG_S6E8FCO_M1906F9 + tristate "Samsung M1906F9 panel with S6E8FCO DSI controller" + depends on OF + depends on BACKLIGHT_CLASS_DEVICE + select DRM_MIPI_DSI + select VIDEOMODE_HELPERS + help + Say Y or M here if you want to enable support for the Samsung video + mode panel M1906F9 (M1906F9SH or M1906F9SI), which uses the Samsung + S6E8FCO DSI controller. The panel has a 6.09 inch AMOLED display, + with a resolution of 720x1560. + Found in the Xiaomi Mi A3 smartphone (xiaomi-laurel). + config DRM_PANEL_SAMSUNG_SOFEF00 tristate "Samsung SOFEF00 DSI panel controller" depends on OF diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile index b9562a6fdcb38bfd0dfee9e8c11e16149ada4386..19e1e898dfd4af2d34eafe7a6ded5ad74fc7ee04 100644 --- a/drivers/gpu/drm/panel/Makefile +++ b/drivers/gpu/drm/panel/Makefile @@ -91,6 +91,7 @@ obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS427AP24) += panel-samsung-s6e88a0-ams4 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_S6E8AA5X01_AMS561RA01) += panel-samsung-s6e8aa5x01-ams561ra01.o +obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E8FCO_M1906F9) += panel-samsung-s6e8fco-m1906f9.o obj-$(CONFIG_DRM_PANEL_SAMSUNG_SOFEF00) += panel-samsung-sofef00.o obj-$(CONFIG_DRM_PANEL_SEIKO_43WVF1G) += panel-seiko-43wvf1g.o obj-$(CONFIG_DRM_PANEL_SHARP_LQ079L1SX01) += panel-sharp-lq079l1sx01.o diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e8fco-m1906f9.c b/drivers/gpu/drm/panel/panel-samsung-s6e8fco-m1906f9.c new file mode 100644 index 0000000000000000000000000000000000000000..ccf18da59271dc4926a536f795a38d8eae349e00 --- /dev/null +++ b/drivers/gpu/drm/panel/panel-samsung-s6e8fco-m1906f9.c @@ -0,0 +1,302 @@ +// SPDX-License-Identifier: GPL-2.0-only +// Copyright (c) Kamil Gołda <kamil.golda@protonmail.com> +// Copyright (c) Yedaya Katsman <yedaya.ka@gmail.com> +// Generated with linux-mdss-dsi-panel-driver-generator from vendor device tree: +// Copyright (c) The Linux Foundation. All rights reserved. + +#include <linux/backlight.h> +#include <linux/delay.h> +#include <linux/gpio/consumer.h> +#include <linux/mod_devicetable.h> +#include <linux/module.h> +#include <linux/regulator/consumer.h> + +#include <video/mipi_display.h> + +#include <drm/drm_mipi_dsi.h> +#include <drm/drm_modes.h> +#include <drm/drm_panel.h> +#include <drm/drm_probe_helper.h> + +struct s6e8fco_m1906f9_ctx { + struct drm_panel panel; + struct mipi_dsi_device *dsi; + struct regulator_bulk_data *supplies; + struct gpio_desc *reset_gpio; +}; + +static const struct regulator_bulk_data s6e8fco_m1906f9_supplies[] = { + { .supply = "vddi" }, + { .supply = "vci" }, +}; + +static inline +struct s6e8fco_m1906f9_ctx *to_s6e8fco_m1906f9_ctx(struct drm_panel *panel) +{ + return container_of_const(panel, struct s6e8fco_m1906f9_ctx, panel); +} + +static void s6e8fco_m1906f9_reset(struct s6e8fco_m1906f9_ctx *ctx) +{ + gpiod_set_value_cansleep(ctx->reset_gpio, 0); + usleep_range(12000, 13000); + gpiod_set_value_cansleep(ctx->reset_gpio, 1); + usleep_range(2000, 3000); + gpiod_set_value_cansleep(ctx->reset_gpio, 0); + usleep_range(10000, 11000); +} + +#define s6e8fco_m1906f9_test_key_on_lvl2(ctx) \ + mipi_dsi_dcs_write_seq_multi(ctx, 0xf0, 0x5a, 0x5a) +#define s6e8fco_m1906f9_test_key_off_lvl2(ctx) \ + mipi_dsi_dcs_write_seq_multi(ctx, 0xf0, 0xa5, 0xa5) +#define s6e8fco_m1906f9_test_key_on_lvl3(ctx) \ + mipi_dsi_dcs_write_seq_multi(ctx, 0xfc, 0x5a, 0x5a) +#define s6e8fco_m1906f9_test_key_off_lvl3(ctx) \ + mipi_dsi_dcs_write_seq_multi(ctx, 0xfc, 0xa5, 0xa5) + +static int s6e8fco_m1906f9_on(struct s6e8fco_m1906f9_ctx *ctx) +{ + struct mipi_dsi_multi_context dsi_ctx = { .dsi = ctx->dsi }; + + s6e8fco_m1906f9_test_key_on_lvl3(&dsi_ctx); + + mipi_dsi_dcs_set_display_brightness_multi(&dsi_ctx, 0x0000); + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_WRITE_CONTROL_DISPLAY, + 0x20); + mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx); + mipi_dsi_msleep(&dsi_ctx, 50); + mipi_dsi_dcs_set_display_on_multi(&dsi_ctx); + + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb0, 0x04, 0xed); + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xed, + 0xe4, 0x08, 0x96, 0xa4, 0x2a, 0x72, 0xe2, + 0xca, 0x00); + s6e8fco_m1906f9_test_key_off_lvl3(&dsi_ctx); + s6e8fco_m1906f9_test_key_on_lvl2(&dsi_ctx); + s6e8fco_m1906f9_test_key_on_lvl3(&dsi_ctx); + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe1, 0x93); + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb0, 0x05, 0xf4); + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf4, 0x03); + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xed, 0x01, 0x81, 0x04); + s6e8fco_m1906f9_test_key_off_lvl2(&dsi_ctx); + s6e8fco_m1906f9_test_key_off_lvl3(&dsi_ctx); + + return dsi_ctx.accum_err; +} + +static int s6e8fco_m1906f9_off(struct s6e8fco_m1906f9_ctx *ctx) +{ + struct mipi_dsi_multi_context dsi_ctx = { .dsi = ctx->dsi }; + + mipi_dsi_dcs_set_display_off_multi(&dsi_ctx); + mipi_dsi_msleep(&dsi_ctx, 20); + mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx); + mipi_dsi_msleep(&dsi_ctx, 120); + + return dsi_ctx.accum_err; +} + +static int s6e8fco_m1906f9_prepare(struct drm_panel *panel) +{ + struct s6e8fco_m1906f9_ctx *ctx = to_s6e8fco_m1906f9_ctx(panel); + struct device *dev = &ctx->dsi->dev; + int ret; + + ret = regulator_bulk_enable(ARRAY_SIZE(s6e8fco_m1906f9_supplies), ctx->supplies); + if (ret < 0) { + dev_err(dev, "Failed to enable regulators: %d\n", ret); + return ret; + } + + s6e8fco_m1906f9_reset(ctx); + + ret = s6e8fco_m1906f9_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(s6e8fco_m1906f9_supplies), ctx->supplies); + return ret; + } + + return 0; +} + +static int s6e8fco_m1906f9_unprepare(struct drm_panel *panel) +{ + struct s6e8fco_m1906f9_ctx *ctx = to_s6e8fco_m1906f9_ctx(panel); + struct device *dev = &ctx->dsi->dev; + int ret; + + ret = s6e8fco_m1906f9_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(s6e8fco_m1906f9_supplies), ctx->supplies); + + return 0; +} + +static const struct drm_display_mode s6e8fco_m1906f9_samsungp_mode = { + .clock = (720 + 350 + 40 + 294) * (1560 + 17 + 2 + 5) * 60 / 1000, + .hdisplay = 720, + .hsync_start = 720 + 350, + .hsync_end = 720 + 350 + 40, + .htotal = 720 + 350 + 40 + 294, + .vdisplay = 1560, + .vsync_start = 1560 + 17, + .vsync_end = 1560 + 17 + 2, + .vtotal = 1560 + 17 + 2 + 5, + .width_mm = 65, + .height_mm = 140, + .type = DRM_MODE_TYPE_DRIVER, +}; + +static int s6e8fco_m1906f9_get_modes(struct drm_panel *panel, + struct drm_connector *connector) +{ + return drm_connector_helper_get_modes_fixed(connector, &s6e8fco_m1906f9_samsungp_mode); +} + +static const struct drm_panel_funcs s6e8fco_m1906f9_panel_funcs = { + .prepare = s6e8fco_m1906f9_prepare, + .unprepare = s6e8fco_m1906f9_unprepare, + .get_modes = s6e8fco_m1906f9_get_modes, +}; + +static int s6e8fco_m1906f9_bl_update_status(struct backlight_device *bl) +{ + struct mipi_dsi_device *dsi = bl_get_data(bl); + u16 brightness = backlight_get_brightness(bl); + int ret; + + dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; + + ret = mipi_dsi_dcs_set_display_brightness_large(dsi, brightness); + if (ret < 0) + return ret; + + dsi->mode_flags |= MIPI_DSI_MODE_LPM; + + return 0; +} + +static int s6e8fco_m1906f9_bl_get_brightness(struct backlight_device *bl) +{ + struct mipi_dsi_device *dsi = bl_get_data(bl); + u16 brightness; + int ret; + + dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; + + ret = mipi_dsi_dcs_get_display_brightness_large(dsi, &brightness); + if (ret < 0) + return ret; + + dsi->mode_flags |= MIPI_DSI_MODE_LPM; + + return brightness; +} + +static const struct backlight_ops s6e8fco_m1906f9_bl_ops = { + .update_status = s6e8fco_m1906f9_bl_update_status, + .get_brightness = s6e8fco_m1906f9_bl_get_brightness, +}; + +static struct backlight_device * +s6e8fco_m1906f9_create_backlight(struct mipi_dsi_device *dsi) +{ + struct device *dev = &dsi->dev; + const struct backlight_properties props = { + .type = BACKLIGHT_RAW, + .brightness = 512, + // The downstream dts claims 2047, but seems to ignore the MSB. + .max_brightness = 1023, + }; + + return devm_backlight_device_register(dev, dev_name(dev), dev, dsi, + &s6e8fco_m1906f9_bl_ops, &props); +} + +static int s6e8fco_m1906f9_probe(struct mipi_dsi_device *dsi) +{ + struct device *dev = &dsi->dev; + struct s6e8fco_m1906f9_ctx *ctx; + int ret; + + ctx = devm_drm_panel_alloc(dev, struct s6e8fco_m1906f9_ctx, panel, + &s6e8fco_m1906f9_panel_funcs, + DRM_MODE_CONNECTOR_DSI); + if (IS_ERR(ctx)) + return PTR_ERR(ctx); + + ret = devm_regulator_bulk_get_const(dev, + ARRAY_SIZE(s6e8fco_m1906f9_supplies), + s6e8fco_m1906f9_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 = 4; + dsi->format = MIPI_DSI_FMT_RGB888; + dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | + MIPI_DSI_CLOCK_NON_CONTINUOUS; + + ctx->panel.prepare_prev_first = true; + + ctx->panel.backlight = s6e8fco_m1906f9_create_backlight(dsi); + if (IS_ERR(ctx->panel.backlight)) + return dev_err_probe(dev, PTR_ERR(ctx->panel.backlight), + "Failed to create backlight\n"); + + drm_panel_add(&ctx->panel); + + ret = mipi_dsi_attach(dsi); + if (ret < 0) { + drm_panel_remove(&ctx->panel); + return dev_err_probe(dev, ret, "Failed to attach to DSI host\n"); + } + + return 0; +} + +static void s6e8fco_m1906f9_remove(struct mipi_dsi_device *dsi) +{ + struct s6e8fco_m1906f9_ctx *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 samsung_s6e8fco_m1906f9_of_match[] = { + { .compatible = "samsung,s6e8fco-m1906f9" }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, samsung_s6e8fco_m1906f9_of_match); + +static struct mipi_dsi_driver s6e8fco_m1906f9_driver = { + .probe = s6e8fco_m1906f9_probe, + .remove = s6e8fco_m1906f9_remove, + .driver = { + .name = "panel-samsung-s6e8fco-m1906f9", + .of_match_table = samsung_s6e8fco_m1906f9_of_match, + }, +}; +module_mipi_dsi_driver(s6e8fco_m1906f9_driver); + +MODULE_AUTHOR("Kamil Gołda <kamil.golda@protonmail.com>"); +MODULE_DESCRIPTION("DRM driver for Samsubng s6e8fco DSI controller for m1906f9 amoled video mode panel"); +MODULE_LICENSE("GPL"); -- 2.53.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v3 2/3] drm: panel: Add Samsung S6E8FCO DSI controller for M1906F9 panel 2026-03-12 11:55 ` [PATCH v3 2/3] drm: panel: Add Samsung S6E8FCO DSI controller for M1906F9 panel Yedaya Katsman @ 2026-03-12 12:09 ` David Heidelberg 2026-03-13 4:15 ` Claude review: " Claude Code Review Bot 2026-03-12 12:10 ` David Heidelberg 1 sibling, 1 reply; 12+ messages in thread From: David Heidelberg @ 2026-03-12 12:09 UTC (permalink / raw) To: Yedaya Katsman, Neil Armstrong, Jessica Zhang, David Airlie, Simona Vetter, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Kamil Gołda, Bjorn Andersson, Konrad Dybcio Cc: ~postmarketos/upstreaming, phone-devel, dri-devel, devicetree, linux-kernel, linux-arm-msm On 12/03/2026 12:55, Yedaya Katsman wrote: > Add driver for Samsung S6E8FCO DSI controller for M1906F9 video mode panel, > found in Xiaomi Mi A3 mobile phone. > > Co-developed-by: Kamil Gołda <kamil.golda@protonmail.com> > Signed-off-by: Kamil Gołda <kamil.golda@protonmail.com> > Signed-off-by: Yedaya Katsman <yedaya.ka@gmail.com> > --- > MAINTAINERS | 1 + > drivers/gpu/drm/panel/Kconfig | 13 + > drivers/gpu/drm/panel/Makefile | 1 + > .../gpu/drm/panel/panel-samsung-s6e8fco-m1906f9.c | 302 +++++++++++++++++++++ > 4 files changed, 317 insertions(+) > Thanks for sending the panel upstream, see few thoughts below: > diff --git a/MAINTAINERS b/MAINTAINERS > index d7aee8dab903cd42c245fea3cf8971dcd99b2196..d00775a09445a8a1bd626ecfd27903471d08d33a 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -8187,6 +8187,7 @@ DRM DRIVER FOR SAMSUNG S6E8FCO PANELS > M: Yedaya Katsman <yedaya.ka@gmail.com> > S: Maintained > F: Documentation/devicetree/bindings/display/panel/samsung,s6e8fco-m1906f9.yaml > +F: drivers/gpu/drm/panel/panel-samsung-s6e8fco-m1906f9.c > > DRM DRIVER FOR SAMSUNG SOFEF00 DDIC > M: David Heidelberg <david@ixit.cz> > diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig > index 7a83804fedca1b688ce6fbe4295ec9009007e693..ee9cc6939f2ac1dc4542563fd73f68ac5f9ee371 100644 > --- a/drivers/gpu/drm/panel/Kconfig > +++ b/drivers/gpu/drm/panel/Kconfig > @@ -893,6 +893,19 @@ config DRM_PANEL_SAMSUNG_S6E8AA5X01_AMS561RA01 > ~5.6 inch AMOLED display, and the controller is driven by the MIPI > DSI protocol with 4 lanes. > > +config DRM_PANEL_SAMSUNG_S6E8FCO_M1906F9 > + tristate "Samsung M1906F9 panel with S6E8FCO DSI controller" I believe here it should be only S6E8FC0 mentioned, as the list of supported panels can grow in the future. The supported panel should be definitely named in description (incl. where found as you did), also panel structure should be named as you named whole driver. Rest of the more generic calls and function I would recomend using only s6e8fc0 identification. Same the structs naming inside the panel, etc. > + depends on OF > + depends on BACKLIGHT_CLASS_DEVICE > + select DRM_MIPI_DSI > + select VIDEOMODE_HELPERS > + help > + Say Y or M here if you want to enable support for the Samsung video > + mode panel M1906F9 (M1906F9SH or M1906F9SI), which uses the Samsung > + S6E8FCO DSI controller. The panel has a 6.09 inch AMOLED display, > + with a resolution of 720x1560. > + Found in the Xiaomi Mi A3 smartphone (xiaomi-laurel). > + > config DRM_PANEL_SAMSUNG_SOFEF00 > tristate "Samsung SOFEF00 DSI panel controller" > depends on OF > diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile > index b9562a6fdcb38bfd0dfee9e8c11e16149ada4386..19e1e898dfd4af2d34eafe7a6ded5ad74fc7ee04 100644 > --- a/drivers/gpu/drm/panel/Makefile > +++ b/drivers/gpu/drm/panel/Makefile > @@ -91,6 +91,7 @@ obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS427AP24) += panel-samsung-s6e88a0-ams4 > 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_S6E8AA5X01_AMS561RA01) += panel-samsung-s6e8aa5x01-ams561ra01.o > +obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E8FCO_M1906F9) += panel-samsung-s6e8fco-m1906f9.o > obj-$(CONFIG_DRM_PANEL_SAMSUNG_SOFEF00) += panel-samsung-sofef00.o > obj-$(CONFIG_DRM_PANEL_SEIKO_43WVF1G) += panel-seiko-43wvf1g.o > obj-$(CONFIG_DRM_PANEL_SHARP_LQ079L1SX01) += panel-sharp-lq079l1sx01.o > diff --git a/drivers/gpu/drm/panel/panel-samsung-s6e8fco-m1906f9.c b/drivers/gpu/drm/panel/panel-samsung-s6e8fco-m1906f9.c > new file mode 100644 > index 0000000000000000000000000000000000000000..ccf18da59271dc4926a536f795a38d8eae349e00 > --- /dev/null > +++ b/drivers/gpu/drm/panel/panel-samsung-s6e8fco-m1906f9.c > @@ -0,0 +1,302 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +// Copyright (c) Kamil Gołda <kamil.golda@protonmail.com> > +// Copyright (c) Yedaya Katsman <yedaya.ka@gmail.com> > +// Generated with linux-mdss-dsi-panel-driver-generator from vendor device tree: > +// Copyright (c) The Linux Foundation. All rights reserved. > + > +#include <linux/backlight.h> > +#include <linux/delay.h> > +#include <linux/gpio/consumer.h> > +#include <linux/mod_devicetable.h> > +#include <linux/module.h> > +#include <linux/regulator/consumer.h> > + > +#include <video/mipi_display.h> > + > +#include <drm/drm_mipi_dsi.h> > +#include <drm/drm_modes.h> > +#include <drm/drm_panel.h> > +#include <drm/drm_probe_helper.h> > + > +struct s6e8fco_m1906f9_ctx { > + struct drm_panel panel; > + struct mipi_dsi_device *dsi; > + struct regulator_bulk_data *supplies; > + struct gpio_desc *reset_gpio; > +}; > + > +static const struct regulator_bulk_data s6e8fco_m1906f9_supplies[] = { > + { .supply = "vddi" }, > + { .supply = "vci" }, > +}; > + > +static inline > +struct s6e8fco_m1906f9_ctx *to_s6e8fco_m1906f9_ctx(struct drm_panel *panel) > +{ > + return container_of_const(panel, struct s6e8fco_m1906f9_ctx, panel); > +} > + > +static void s6e8fco_m1906f9_reset(struct s6e8fco_m1906f9_ctx *ctx) > +{ > + gpiod_set_value_cansleep(ctx->reset_gpio, 0); > + usleep_range(12000, 13000); > + gpiod_set_value_cansleep(ctx->reset_gpio, 1); > + usleep_range(2000, 3000); > + gpiod_set_value_cansleep(ctx->reset_gpio, 0); > + usleep_range(10000, 11000); > +} > + > +#define s6e8fco_m1906f9_test_key_on_lvl2(ctx) \ > + mipi_dsi_dcs_write_seq_multi(ctx, 0xf0, 0x5a, 0x5a) > +#define s6e8fco_m1906f9_test_key_off_lvl2(ctx) \ > + mipi_dsi_dcs_write_seq_multi(ctx, 0xf0, 0xa5, 0xa5) > +#define s6e8fco_m1906f9_test_key_on_lvl3(ctx) \ > + mipi_dsi_dcs_write_seq_multi(ctx, 0xfc, 0x5a, 0x5a) > +#define s6e8fco_m1906f9_test_key_off_lvl3(ctx) \ > + mipi_dsi_dcs_write_seq_multi(ctx, 0xfc, 0xa5, 0xa5) > + > +static int s6e8fco_m1906f9_on(struct s6e8fco_m1906f9_ctx *ctx) > +{ > + struct mipi_dsi_multi_context dsi_ctx = { .dsi = ctx->dsi }; > + > + s6e8fco_m1906f9_test_key_on_lvl3(&dsi_ctx); > + > + mipi_dsi_dcs_set_display_brightness_multi(&dsi_ctx, 0x0000); > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_WRITE_CONTROL_DISPLAY, > + 0x20); > + mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx); > + mipi_dsi_msleep(&dsi_ctx, 50); > + mipi_dsi_dcs_set_display_on_multi(&dsi_ctx); > + > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb0, 0x04, 0xed); > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xed, > + 0xe4, 0x08, 0x96, 0xa4, 0x2a, 0x72, 0xe2, > + 0xca, 0x00); > + s6e8fco_m1906f9_test_key_off_lvl3(&dsi_ctx); > + s6e8fco_m1906f9_test_key_on_lvl2(&dsi_ctx); > + s6e8fco_m1906f9_test_key_on_lvl3(&dsi_ctx); > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe1, 0x93); > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb0, 0x05, 0xf4); > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf4, 0x03); > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xed, 0x01, 0x81, 0x04); > + s6e8fco_m1906f9_test_key_off_lvl2(&dsi_ctx); > + s6e8fco_m1906f9_test_key_off_lvl3(&dsi_ctx); > + > + return dsi_ctx.accum_err; > +} > + > +static int s6e8fco_m1906f9_off(struct s6e8fco_m1906f9_ctx *ctx) > +{ > + struct mipi_dsi_multi_context dsi_ctx = { .dsi = ctx->dsi }; > + > + mipi_dsi_dcs_set_display_off_multi(&dsi_ctx); > + mipi_dsi_msleep(&dsi_ctx, 20); > + mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx); > + mipi_dsi_msleep(&dsi_ctx, 120); > + > + return dsi_ctx.accum_err; > +} > + > +static int s6e8fco_m1906f9_prepare(struct drm_panel *panel) > +{ > + struct s6e8fco_m1906f9_ctx *ctx = to_s6e8fco_m1906f9_ctx(panel); > + struct device *dev = &ctx->dsi->dev; > + int ret; > + > + ret = regulator_bulk_enable(ARRAY_SIZE(s6e8fco_m1906f9_supplies), ctx->supplies); > + if (ret < 0) { > + dev_err(dev, "Failed to enable regulators: %d\n", ret); > + return ret; > + } > + > + s6e8fco_m1906f9_reset(ctx); > + > + ret = s6e8fco_m1906f9_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(s6e8fco_m1906f9_supplies), ctx->supplies); > + return ret; > + } > + > + return 0; > +} > + > +static int s6e8fco_m1906f9_unprepare(struct drm_panel *panel) > +{ > + struct s6e8fco_m1906f9_ctx *ctx = to_s6e8fco_m1906f9_ctx(panel); > + struct device *dev = &ctx->dsi->dev; > + int ret; > + > + ret = s6e8fco_m1906f9_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(s6e8fco_m1906f9_supplies), ctx->supplies); > + > + return 0; > +} > + > +static const struct drm_display_mode s6e8fco_m1906f9_samsungp_mode = { > + .clock = (720 + 350 + 40 + 294) * (1560 + 17 + 2 + 5) * 60 / 1000, > + .hdisplay = 720, > + .hsync_start = 720 + 350, > + .hsync_end = 720 + 350 + 40, > + .htotal = 720 + 350 + 40 + 294, > + .vdisplay = 1560, > + .vsync_start = 1560 + 17, > + .vsync_end = 1560 + 17 + 2, > + .vtotal = 1560 + 17 + 2 + 5, > + .width_mm = 65, > + .height_mm = 140, > + .type = DRM_MODE_TYPE_DRIVER, > +}; > + > +static int s6e8fco_m1906f9_get_modes(struct drm_panel *panel, > + struct drm_connector *connector) > +{ > + return drm_connector_helper_get_modes_fixed(connector, &s6e8fco_m1906f9_samsungp_mode); > +} > + > +static const struct drm_panel_funcs s6e8fco_m1906f9_panel_funcs = { > + .prepare = s6e8fco_m1906f9_prepare, > + .unprepare = s6e8fco_m1906f9_unprepare, > + .get_modes = s6e8fco_m1906f9_get_modes, > +}; > + > +static int s6e8fco_m1906f9_bl_update_status(struct backlight_device *bl) > +{ > + struct mipi_dsi_device *dsi = bl_get_data(bl); > + u16 brightness = backlight_get_brightness(bl); > + int ret; > + > + dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; > + > + ret = mipi_dsi_dcs_set_display_brightness_large(dsi, brightness); > + if (ret < 0) > + return ret; > + > + dsi->mode_flags |= MIPI_DSI_MODE_LPM; > + > + return 0; > +} > + > +static int s6e8fco_m1906f9_bl_get_brightness(struct backlight_device *bl) > +{ > + struct mipi_dsi_device *dsi = bl_get_data(bl); > + u16 brightness; > + int ret; > + > + dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; > + > + ret = mipi_dsi_dcs_get_display_brightness_large(dsi, &brightness); > + if (ret < 0) > + return ret; > + > + dsi->mode_flags |= MIPI_DSI_MODE_LPM; > + > + return brightness; > +} > + > +static const struct backlight_ops s6e8fco_m1906f9_bl_ops = { > + .update_status = s6e8fco_m1906f9_bl_update_status, > + .get_brightness = s6e8fco_m1906f9_bl_get_brightness, > +}; > + > +static struct backlight_device * > +s6e8fco_m1906f9_create_backlight(struct mipi_dsi_device *dsi) > +{ > + struct device *dev = &dsi->dev; > + const struct backlight_properties props = { > + .type = BACKLIGHT_RAW, > + .brightness = 512, > + // The downstream dts claims 2047, but seems to ignore the MSB. I think this type of comment is useful for initial reviewers (maybe below the --- in commit message, but not must-have in the code itself). > + .max_brightness = 1023, > + }; > + > + return devm_backlight_device_register(dev, dev_name(dev), dev, dsi, > + &s6e8fco_m1906f9_bl_ops, &props); > +} > + > +static int s6e8fco_m1906f9_probe(struct mipi_dsi_device *dsi) > +{ > + struct device *dev = &dsi->dev; > + struct s6e8fco_m1906f9_ctx *ctx; > + int ret; > + > + ctx = devm_drm_panel_alloc(dev, struct s6e8fco_m1906f9_ctx, panel, > + &s6e8fco_m1906f9_panel_funcs, > + DRM_MODE_CONNECTOR_DSI); > + if (IS_ERR(ctx)) > + return PTR_ERR(ctx); > + > + ret = devm_regulator_bulk_get_const(dev, > + ARRAY_SIZE(s6e8fco_m1906f9_supplies), > + s6e8fco_m1906f9_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 = 4; > + dsi->format = MIPI_DSI_FMT_RGB888; > + dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | > + MIPI_DSI_CLOCK_NON_CONTINUOUS; > + > + ctx->panel.prepare_prev_first = true; > + > + ctx->panel.backlight = s6e8fco_m1906f9_create_backlight(dsi); > + if (IS_ERR(ctx->panel.backlight)) > + return dev_err_probe(dev, PTR_ERR(ctx->panel.backlight), > + "Failed to create backlight\n"); > + > + drm_panel_add(&ctx->panel); > + > + ret = mipi_dsi_attach(dsi); > + if (ret < 0) { > + drm_panel_remove(&ctx->panel); > + return dev_err_probe(dev, ret, "Failed to attach to DSI host\n"); > + } > + > + return 0; > +} > + > +static void s6e8fco_m1906f9_remove(struct mipi_dsi_device *dsi) > +{ > + struct s6e8fco_m1906f9_ctx *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 samsung_s6e8fco_m1906f9_of_match[] = { > + { .compatible = "samsung,s6e8fco-m1906f9" }, > + { /* sentinel */ } > +}; > +MODULE_DEVICE_TABLE(of, samsung_s6e8fco_m1906f9_of_match); > + > +static struct mipi_dsi_driver s6e8fco_m1906f9_driver = { > + .probe = s6e8fco_m1906f9_probe, > + .remove = s6e8fco_m1906f9_remove, > + .driver = { > + .name = "panel-samsung-s6e8fco-m1906f9", > + .of_match_table = samsung_s6e8fco_m1906f9_of_match, > + }, > +}; > +module_mipi_dsi_driver(s6e8fco_m1906f9_driver); > + > +MODULE_AUTHOR("Kamil Gołda <kamil.golda@protonmail.com>"); > +MODULE_DESCRIPTION("DRM driver for Samsubng s6e8fco DSI controller for m1906f9 amoled video mode panel"); typo in Samsung, also here feel free to drop "for m190..." part Except the nitpicks, looks really good. David > +MODULE_LICENSE("GPL"); > -- David Heidelberg ^ permalink raw reply [flat|nested] 12+ messages in thread
* Claude review: Re: [PATCH v3 2/3] drm: panel: Add Samsung S6E8FCO DSI controller for M1906F9 panel 2026-03-12 12:09 ` David Heidelberg @ 2026-03-13 4:15 ` Claude Code Review Bot 0 siblings, 0 replies; 12+ messages in thread From: Claude Code Review Bot @ 2026-03-13 4:15 UTC (permalink / raw) To: dri-devel-reviews Patch Review This is the main driver patch. Several issues: **Bug: Typo in MODULE_DESCRIPTION (line 654 of mbox / line 302 of the new file):** ```c MODULE_DESCRIPTION("DRM driver for Samsubng s6e8fco DSI controller for m1906f9 amoled video mode panel"); ``` "Samsubng" should be "Samsung". This is a trivially-fixable typo but should be corrected before merge. **Questionable: Mode name contains "samsungp" (line 494 of mbox):** ```c static const struct drm_display_mode s6e8fco_m1906f9_samsungp_mode = { ``` The trailing "p" in `samsungp` looks like a stray character. It should likely just be `s6e8fco_m1906f9_mode` or `s6e8fco_m1906f9_samsung_mode`. **Observation: Reset GPIO polarity:** ```c static void s6e8fco_m1906f9_reset(struct s6e8fco_m1906f9_ctx *ctx) { gpiod_set_value_cansleep(ctx->reset_gpio, 0); usleep_range(12000, 13000); gpiod_set_value_cansleep(ctx->reset_gpio, 1); usleep_range(2000, 3000); gpiod_set_value_cansleep(ctx->reset_gpio, 0); usleep_range(10000, 11000); } ``` The GPIO is requested as `GPIOD_OUT_HIGH` (asserting reset initially), then the reset sequence de-asserts (0), pulses assert (1), then de-asserts (0). The DTS specifies `GPIO_ACTIVE_LOW`, so the logical and physical levels should be consistent. This looks correct. **Observation: LPM flag toggling in backlight ops:** ```c static int s6e8fco_m1906f9_bl_update_status(struct backlight_device *bl) { ... dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; ret = mipi_dsi_dcs_set_display_brightness_large(dsi, brightness); ... dsi->mode_flags |= MIPI_DSI_MODE_LPM; return 0; } ``` This pattern of toggling LPM around brightness commands is used by several existing panel drivers (panel-visionox-rm69299, panel-lg-sw43408, etc.), so it's an accepted pattern, though it isn't thread-safe. This is pre-existing practice, not something to block on. **Observation: Backlight brightness comment:** ```c // The downstream dts claims 2047, but seems to ignore the MSB. .max_brightness = 1023, ``` This comment is helpful and explains the deviation from the downstream value. The use of `mipi_dsi_dcs_set_display_brightness_large` (which sends a 16-bit value) with max 1023 seems reasonable. **Observation: `MIPI_DSI_MODE_LPM` not set initially:** The driver sets: ```c dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_CLOCK_NON_CONTINUOUS; ``` `MIPI_DSI_MODE_LPM` is never set initially, yet the backlight code adds it back after brightness commands. This means the initial on-sequence commands are sent in HS mode (no LPM), and then after the first backlight update, LPM gets permanently set. This could be intentional but is worth a second look — if LPM should be set from the start, it should be added to the initial mode_flags. If HS mode is desired for all commands, the LPM toggling in the backlight ops is suspicious. **No issue: The driver uses `devm_drm_panel_alloc`**, which is the modern pattern. Good. --- Generated by Claude Code Patch Reviewer ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v3 2/3] drm: panel: Add Samsung S6E8FCO DSI controller for M1906F9 panel 2026-03-12 11:55 ` [PATCH v3 2/3] drm: panel: Add Samsung S6E8FCO DSI controller for M1906F9 panel Yedaya Katsman 2026-03-12 12:09 ` David Heidelberg @ 2026-03-12 12:10 ` David Heidelberg 1 sibling, 0 replies; 12+ messages in thread From: David Heidelberg @ 2026-03-12 12:10 UTC (permalink / raw) To: Yedaya Katsman, Neil Armstrong, Jessica Zhang, David Airlie, Simona Vetter, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Kamil Gołda, Bjorn Andersson, Konrad Dybcio Cc: phone-devel, dri-devel, devicetree, linux-kernel, linux-arm-msm On 12/03/2026 12:55, Yedaya Katsman wrote: > Add driver for Samsung S6E8FCO DSI controller for M1906F9 video mode panel, > found in Xiaomi Mi A3 mobile phone. > > Co-developed-by: Kamil Gołda <kamil.golda@protonmail.com> > Signed-off-by: Kamil Gołda <kamil.golda@protonmail.com> > Signed-off-by: Yedaya Katsman <yedaya.ka@gmail.com> > --- > MAINTAINERS | 1 + > drivers/gpu/drm/panel/Kconfig | 13 + > drivers/gpu/drm/panel/Makefile | 1 + > .../gpu/drm/panel/panel-samsung-s6e8fco-m1906f9.c | 302 +++++++++++++++++++++ > 4 files changed, 317 insertions(+) > > diff --git a/MAINTAINERS b/MAINTAINERS > index d7aee8dab903cd42c245fea3cf8971dcd99b2196..d00775a09445a8a1bd626ecfd27903471d08d33a 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -8187,6 +8187,7 @@ DRM DRIVER FOR SAMSUNG S6E8FCO PANELS > M: Yedaya Katsman <yedaya.ka@gmail.com> > S: Maintained > F: Documentation/devicetree/bindings/display/panel/samsung,s6e8fco-m1906f9.yaml > +F: drivers/gpu/drm/panel/panel-samsung-s6e8fco-m1906f9.c > > DRM DRIVER FOR SAMSUNG SOFEF00 DDIC > M: David Heidelberg <david@ixit.cz> > diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig > index 7a83804fedca1b688ce6fbe4295ec9009007e693..ee9cc6939f2ac1dc4542563fd73f68ac5f9ee371 100644 > --- a/drivers/gpu/drm/panel/Kconfig > +++ b/drivers/gpu/drm/panel/Kconfig > @@ -893,6 +893,19 @@ config DRM_PANEL_SAMSUNG_S6E8AA5X01_AMS561RA01 > ~5.6 inch AMOLED display, and the controller is driven by the MIPI > DSI protocol with 4 lanes. > > +config DRM_PANEL_SAMSUNG_S6E8FCO_M1906F9 > + tristate "Samsung M1906F9 panel with S6E8FCO DSI controller" > + depends on OF > + depends on BACKLIGHT_CLASS_DEVICE > + select DRM_MIPI_DSI > + select VIDEOMODE_HELPERS one more small nit - please double check you need VIDEOMODE_HELPERS David [...] -- David Heidelberg ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v3 3/3] arm64: dts: qcom: sm6125-xiaomi-laurel-sprout: Enable MDSS and add panel 2026-03-12 11:55 [PATCH v3 0/3] Add support for the Samsung S6E8FCO DSI and M1906F9 display panel Yedaya Katsman 2026-03-12 11:55 ` [PATCH v3 1/3] dt-bindings: display: panel: Add Samsung S6E8FCO-M1906F9 Yedaya Katsman 2026-03-12 11:55 ` [PATCH v3 2/3] drm: panel: Add Samsung S6E8FCO DSI controller for M1906F9 panel Yedaya Katsman @ 2026-03-12 11:55 ` Yedaya Katsman 2026-03-12 13:31 ` Dmitry Baryshkov 2026-03-13 4:15 ` Claude review: Add support for the Samsung S6E8FCO DSI and M1906F9 display panel Claude Code Review Bot 3 siblings, 1 reply; 12+ messages in thread From: Yedaya Katsman @ 2026-03-12 11:55 UTC (permalink / raw) To: Neil Armstrong, Jessica Zhang, David Airlie, Simona Vetter, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Kamil Gołda, Bjorn Andersson, Konrad Dybcio Cc: ~postmarketos/upstreaming, phone-devel, dri-devel, devicetree, linux-kernel, linux-arm-msm, Yedaya Katsman Enable the MDSS nodes and add supplies and bindings for the Samsung S6E8FCO DSI controller for the M1906F9 panel. The ldo and iovcc gpio pins boot up with a current of 16 mA, but they work fine with 2mA, so I used that. Co-developed-by: Kamil Gołda <kamil.golda@protonmail.com> Signed-off-by: Kamil Gołda <kamil.golda@protonmail.com> Signed-off-by: Yedaya Katsman <yedaya.ka@gmail.com> --- .../boot/dts/qcom/sm6125-xiaomi-laurel-sprout.dts | 94 ++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/arch/arm64/boot/dts/qcom/sm6125-xiaomi-laurel-sprout.dts b/arch/arm64/boot/dts/qcom/sm6125-xiaomi-laurel-sprout.dts index 994fb0412fcbdf5466f87a325c48b697a37b514b..878b7cab479fb173bbc01ffb653e306e52cae54b 100644 --- a/arch/arm64/boot/dts/qcom/sm6125-xiaomi-laurel-sprout.dts +++ b/arch/arm64/boot/dts/qcom/sm6125-xiaomi-laurel-sprout.dts @@ -82,6 +82,33 @@ key-volume-up { }; }; + panel_vddi_1p8: regulator-panel-vddi { + compatible = "regulator-fixed"; + regulator-name = "panel_vddi_1p8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-boot-on; + vin-supply = <&vreg_l9a>; + + enable-active-high; + gpio = <&tlmm 26 GPIO_ACTIVE_HIGH>; + pinctrl-0 = <&panel_vddi_1p8_en>; + pinctrl-names = "default"; + }; + + panel_vci_3p0: regulator-panel-vci { + compatible = "regulator-fixed"; + regulator-name = "panel_vci_3p0"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-boot-on; + + enable-active-high; + gpio = <&tlmm 124 GPIO_ACTIVE_HIGH>; + pinctrl-0 = <&panel_vci_3p0_en>; + pinctrl-names = "default"; + }; + thermal-zones { rf-pa0-thermal { thermal-sensors = <&pm6125_adc_tm 0>; @@ -128,6 +155,45 @@ &hsusb_phy1 { status = "okay"; }; +&mdss { + status = "okay"; +}; + +&mdss_dsi0 { + vdda-supply = <&vreg_l18a>; + status = "okay"; + + panel@0 { + compatible = "samsung,s6e8fco-m1906f9"; + reg = <0>; + + reset-gpios = <&tlmm 90 GPIO_ACTIVE_LOW>; + + pinctrl-0 = <&mdss_default>; + pinctrl-1 = <&mdss_sleep>; + pinctrl-names = "default", "sleep"; + + vddi-supply = <&panel_vddi_1p8>; + vci-supply = <&panel_vci_3p0>; + + port { + panel_in: endpoint { + remote-endpoint = <&mdss_dsi0_out>; + }; + }; + }; +}; + +&mdss_dsi0_out { + data-lanes = <0 1 2 3>; + remote-endpoint = <&panel_in>; +}; + + +&mdss_dsi0_phy { + status = "okay"; +}; + &pm6125_adc { pinctrl-names = "default"; pinctrl-0 = <&camera_flash_therm &emmc_ufs_therm>; @@ -387,6 +453,34 @@ &sdhc_2 { &tlmm { gpio-reserved-ranges = <22 2>, <28 6>; + + panel_vddi_1p8_en: panel-vddi-default-state { + pins = "gpio26"; + function = "gpio"; + drive-strength = <2>; + bias-pull-up; + }; + + mdss_default: mdss-default-state { + pins = "gpio90"; + function = "gpio"; + drive-strength = <8>; + bias-disable; + }; + + mdss_sleep: mdss-sleep-state { + pins = "gpio90"; + function = "gpio"; + drive-strength = <2>; + bias-pull-down; + }; + + panel_vci_3p0_en: panel-vci-default-state { + pins = "gpio124"; + function = "gpio"; + drive-strength = <2>; + bias-pull-up; + }; }; &ufs_mem_hc { -- 2.53.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v3 3/3] arm64: dts: qcom: sm6125-xiaomi-laurel-sprout: Enable MDSS and add panel 2026-03-12 11:55 ` [PATCH v3 3/3] arm64: dts: qcom: sm6125-xiaomi-laurel-sprout: Enable MDSS and add panel Yedaya Katsman @ 2026-03-12 13:31 ` Dmitry Baryshkov 2026-03-13 4:15 ` Claude review: " Claude Code Review Bot 0 siblings, 1 reply; 12+ messages in thread From: Dmitry Baryshkov @ 2026-03-12 13:31 UTC (permalink / raw) To: Yedaya Katsman Cc: Neil Armstrong, Jessica Zhang, David Airlie, Simona Vetter, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Kamil Gołda, Bjorn Andersson, Konrad Dybcio, ~postmarketos/upstreaming, phone-devel, dri-devel, devicetree, linux-kernel, linux-arm-msm On Thu, Mar 12, 2026 at 01:55:10PM +0200, Yedaya Katsman wrote: > Enable the MDSS nodes and add supplies and bindings for the Samsung S6E8FCO > DSI controller for the M1906F9 panel. > > The ldo and iovcc gpio pins boot up with a current of 16 mA, but they work > fine with 2mA, so I used that. > > Co-developed-by: Kamil Gołda <kamil.golda@protonmail.com> > Signed-off-by: Kamil Gołda <kamil.golda@protonmail.com> > Signed-off-by: Yedaya Katsman <yedaya.ka@gmail.com> > --- > .../boot/dts/qcom/sm6125-xiaomi-laurel-sprout.dts | 94 ++++++++++++++++++++++ > 1 file changed, 94 insertions(+) > Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 12+ messages in thread
* Claude review: Re: [PATCH v3 3/3] arm64: dts: qcom: sm6125-xiaomi-laurel-sprout: Enable MDSS and add panel 2026-03-12 13:31 ` Dmitry Baryshkov @ 2026-03-13 4:15 ` Claude Code Review Bot 0 siblings, 0 replies; 12+ messages in thread From: Claude Code Review Bot @ 2026-03-13 4:15 UTC (permalink / raw) To: dri-devel-reviews Patch Review **Potential bug: VCI regulator voltage mismatch (lines 809-820 of mbox):** ```dts panel_vci_3p0: regulator-panel-vci { compatible = "regulator-fixed"; regulator-name = "panel_vci_3p0"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; ``` The node and regulator are named `panel_vci_3p0` implying 3.0V, but the voltage is set to 1800000 (1.8V). Either the name is misleading or the voltage is wrong. This should be clarified — if the panel VCI truly runs at 1.8V, the label should be renamed to `panel_vci_1p8` to avoid confusion. If it should actually be 3.0V (3000000 µV), the voltage values need fixing. VCI for AMOLED panels is typically 3.0V–3.3V, so this looks like it might be a real bug. **Minor: Extra blank line (line 863 of mbox):** ```dts &mdss_dsi0_out { data-lanes = <0 1 2 3>; remote-endpoint = <&panel_in>; }; &mdss_dsi0_phy { ``` There's an extra blank line between `&mdss_dsi0_out` and `&mdss_dsi0_phy`. Minor style nit. **Observation: `regulator-boot-on` present on both regulators.** This is fine for panels that need to be powered at boot for a smooth transition from the bootloader's display. **Observation: No `vin-supply` on `panel_vci_3p0`.** The VDDI regulator has `vin-supply = <&vreg_l9a>` but the VCI regulator has no `vin-supply`. This may be fine if VCI is powered directly from battery or another always-on rail, but it's worth confirming. **Summary of required fixes:** 1. Fix "Samsubng" typo in MODULE_DESCRIPTION (patch 2) 2. Clean up `samsungp` in the display mode variable name (patch 2) 3. Verify/fix the `panel_vci_3p0` voltage — 1.8V vs 3.0V mismatch (patch 3) 4. Clarify the `MIPI_DSI_MODE_LPM` behavior — it's never set initially but gets added after the first backlight update (patch 2) --- Generated by Claude Code Patch Reviewer ^ permalink raw reply [flat|nested] 12+ messages in thread
* Claude review: Add support for the Samsung S6E8FCO DSI and M1906F9 display panel 2026-03-12 11:55 [PATCH v3 0/3] Add support for the Samsung S6E8FCO DSI and M1906F9 display panel Yedaya Katsman ` (2 preceding siblings ...) 2026-03-12 11:55 ` [PATCH v3 3/3] arm64: dts: qcom: sm6125-xiaomi-laurel-sprout: Enable MDSS and add panel Yedaya Katsman @ 2026-03-13 4:15 ` Claude Code Review Bot 3 siblings, 0 replies; 12+ messages in thread From: Claude Code Review Bot @ 2026-03-13 4:15 UTC (permalink / raw) To: dri-devel-reviews Overall Series Review Subject: Add support for the Samsung S6E8FCO DSI and M1906F9 display panel Author: Yedaya Katsman <yedaya.ka@gmail.com> Patches: 7 Reviewed: 2026-03-13T14:15:08.071068 --- This is a 3-patch series adding support for the Samsung S6E8FCO DSI controller with the M1906F9 panel found in the Xiaomi Mi A3. The series is well-structured (bindings, driver, DTS) and follows modern panel driver conventions (uses `devm_drm_panel_alloc`, `mipi_dsi_multi_context`, `devm_regulator_bulk_get_const`). The code is largely auto-generated by `linux-mdss-dsi-panel-driver-generator` with manual refinements. There are a few issues that should be addressed, the most notable being a typo in MODULE_DESCRIPTION and a suspicious voltage mismatch in the DTS. --- Generated by Claude Code Patch Reviewer ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 0/3] Add support for the Samsung S6E8FCO DSI and M1906F9 display panel
@ 2026-03-14 21:46 Yedaya Katsman
2026-03-16 1:54 ` Claude review: " Claude Code Review Bot
0 siblings, 1 reply; 12+ messages in thread
From: Yedaya Katsman @ 2026-03-14 21:46 UTC (permalink / raw)
To: Neil Armstrong, Jessica Zhang, David Airlie, Simona Vetter,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Kamil Gołda,
Bjorn Andersson, Konrad Dybcio, Kaustabh Chakraborty
Cc: ~postmarketos/upstreaming, phone-devel, dri-devel, devicetree,
linux-kernel, linux-arm-msm, Yedaya Katsman, Dmitry Baryshkov,
Konrad Dybcio
This adds a driver to support the Samsung S6E8FCO DSI controller with the
M1906F9 display panel found in Xiaomi Mi A3 (xiaomi-laurel). The driver is
generated using linux-mdss-dsi-panel-driver-generator[0].
The mdss reset dependency makes the screen work more reliably.
[0]: https://github.com/msm8916-mainline/linux-mdss-dsi-panel-driver-generator
Original tree with patches: https://gitlab.postmarketos.org/SzczurekYT/linux/-/tree/laurel
Signed-off-by: Yedaya Katsman <yedaya.ka@gmail.com>
---
Changes in v4:
- Use exisiting binding instead of creating a new one
- Mention dsi phy power source in commit message
- Mention only DSI controller, not panel where it makes sense
- Remove VIDEOMODE_HELPERS selection
- Collect trailers
- Link to v3: https://lore.kernel.org/r/20260312-panel-patches-v3-0-6ed8c006d0be@gmail.com
Changes in v3:
- Make driver, bindings, compatible specific to M1906F9 panel
- Adjust brightness scale and default
- de-mystify some dsi writes
- move pinctrl for mdss into panel node
- Rename regulator nodes and names according to schematic
- Treat vreg_l9a as input to vddi regulator
- Add myself to copyright header, remove years
- Link to v2: https://lore.kernel.org/r/20260223-panel-patches-v2-0-1b6ad471d540@gmail.com
Changes in v2:
- Changed commit title like Dmitry asked
- Fixed copyright header years
- Link to v1: https://lore.kernel.org/r/20260223-panel-patches-v1-0-7756209477f9@gmail.com
---
Yedaya Katsman (3):
dt-bindings: display: panel: Add Samsung S6E8FCO-M1906F9
drm: panel: Add Samsung S6E8FCO DSI controller for M1906F9 panel
arm64: dts: qcom: sm6125-xiaomi-laurel-sprout: Enable MDSS and add panel
.../panel/samsung,s6e8aa5x01-ams561ra01.yaml | 5 +-
MAINTAINERS | 5 +
.../boot/dts/qcom/sm6125-xiaomi-laurel-sprout.dts | 94 +++++++
drivers/gpu/drm/panel/Kconfig | 13 +
drivers/gpu/drm/panel/Makefile | 1 +
.../gpu/drm/panel/panel-samsung-s6e8fco-m1906f9.c | 301 +++++++++++++++++++++
6 files changed, 418 insertions(+), 1 deletion(-)
---
base-commit: d4906ae14a5f136ceb671bb14cedbf13fa560da6
change-id: 20260218-panel-patches-696df7e0d810
prerequisite-message-id: <20260303034847.13870-1-val@packett.cool>
prerequisite-patch-id: 3fba84f11111406e0d530013fd45ad0eb389786b
prerequisite-patch-id: 81440b7f28f9101d3dc5d4bad6dc86e39b81a026
prerequisite-patch-id: 53469d8c9810169d058f1bfd27ac8399038aae74
prerequisite-patch-id: 80809bee71eb6434f6699d5e5f8c7f9d4bcd1ca7
prerequisite-patch-id: 0269e01c9c54a37bb92983635cd516342189aee5
prerequisite-patch-id: e2bbf7c452d4da6d71b1a5194e0d7ce46584e113
Best regards,
--
Yedaya Katsman <yedaya.ka@gmail.com>
^ permalink raw reply [flat|nested] 12+ messages in thread* Claude review: Add support for the Samsung S6E8FCO DSI and M1906F9 display panel 2026-03-14 21:46 [PATCH v4 0/3] " Yedaya Katsman @ 2026-03-16 1:54 ` Claude Code Review Bot 0 siblings, 0 replies; 12+ messages in thread From: Claude Code Review Bot @ 2026-03-16 1:54 UTC (permalink / raw) To: dri-devel-reviews Overall Series Review Subject: Add support for the Samsung S6E8FCO DSI and M1906F9 display panel Author: Yedaya Katsman <yedaya.ka@gmail.com> Patches: 5 Reviewed: 2026-03-16T11:54:45.138005 --- This is a v4 series adding support for the Samsung S6E8FCO DSI controller with the M1906F9 panel found in the Xiaomi Mi A3 (laurel-sprout). The series is 3 patches: a DT binding addition, a panel driver, and a DTS enablement patch. The code is largely auto-generated via `linux-mdss-dsi-panel-driver-generator` with manual refinements. Overall the series is in reasonable shape — it follows existing panel driver conventions, uses `devm_drm_panel_alloc()` and the multi-context DSI API. There are a few issues to address, mostly in the DTS patch. --- --- Generated by Claude Code Patch Reviewer ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2026-03-16 1:54 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-03-12 11:55 [PATCH v3 0/3] Add support for the Samsung S6E8FCO DSI and M1906F9 display panel Yedaya Katsman 2026-03-12 11:55 ` [PATCH v3 1/3] dt-bindings: display: panel: Add Samsung S6E8FCO-M1906F9 Yedaya Katsman 2026-03-13 4:15 ` Claude review: " Claude Code Review Bot 2026-03-12 11:55 ` [PATCH v3 2/3] drm: panel: Add Samsung S6E8FCO DSI controller for M1906F9 panel Yedaya Katsman 2026-03-12 12:09 ` David Heidelberg 2026-03-13 4:15 ` Claude review: " Claude Code Review Bot 2026-03-12 12:10 ` David Heidelberg 2026-03-12 11:55 ` [PATCH v3 3/3] arm64: dts: qcom: sm6125-xiaomi-laurel-sprout: Enable MDSS and add panel Yedaya Katsman 2026-03-12 13:31 ` Dmitry Baryshkov 2026-03-13 4:15 ` Claude review: " Claude Code Review Bot 2026-03-13 4:15 ` Claude review: Add support for the Samsung S6E8FCO DSI and M1906F9 display panel Claude Code Review Bot -- strict thread matches above, loose matches on Subject: below -- 2026-03-14 21:46 [PATCH v4 0/3] " Yedaya Katsman 2026-03-16 1:54 ` Claude review: " Claude Code Review Bot
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox