* [PATCH 0/2] Add Visionox G2647FB105 panel support @ 2025-03-25 15:57 Alexander Baransky 2025-03-25 15:57 ` [PATCH 1/2] dt-bindings: display: panel: Add Visionox G2647FB105 Alexander Baransky 2025-03-25 15:57 ` [PATCH 2/2] drm/panel: Add Visionox G2647FB105 panel driver Alexander Baransky 0 siblings, 2 replies; 8+ messages in thread From: Alexander Baransky @ 2025-03-25 15:57 UTC (permalink / raw) To: neil.armstrong, quic_jesszhan, maarten.lankhorst, mripard, tzimmermann, airlied, simona, robh, krzk+dt, conor+dt Cc: Alexander Baransky, dri-devel, devicetree, linux-kernel This patch series adds support for the Visionox G2647FB105 panel, used in: - Xiaomi Mi Note 10 / CC9 Pro (sm7150-xiaomi-tucana) - Xiaomi Mi Note 10 Lite (sm7150-xiaomi-toco) Testing has been done by me on sm7150-xiaomi-tucana. According to the downstream DTS, this driver should be fully compatible with the sm7150-xiaomi-toco (unfortunately not tested) without requiring any modifications. Signed-off-by: Alexander Baransky <sanyapilot496@gmail.com> Alexander Baransky (2): dt-bindings: display: panel: Add Visionox G2647FB105 drm/panel: Add Visionox G2647FB105 panel driver .../display/panel/visionox,g2647fb105.yaml | 79 +++++ drivers/gpu/drm/panel/Kconfig | 9 + drivers/gpu/drm/panel/Makefile | 1 + .../gpu/drm/panel/panel-visionox-g2647fb105.c | 277 ++++++++++++++++++ 4 files changed, 366 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/panel/visionox,g2647fb105.yaml create mode 100644 drivers/gpu/drm/panel/panel-visionox-g2647fb105.c -- 2.49.0 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/2] dt-bindings: display: panel: Add Visionox G2647FB105 2025-03-25 15:57 [PATCH 0/2] Add Visionox G2647FB105 panel support Alexander Baransky @ 2025-03-25 15:57 ` Alexander Baransky 2025-03-25 16:35 ` Krzysztof Kozlowski 2025-03-25 15:57 ` [PATCH 2/2] drm/panel: Add Visionox G2647FB105 panel driver Alexander Baransky 1 sibling, 1 reply; 8+ messages in thread From: Alexander Baransky @ 2025-03-25 15:57 UTC (permalink / raw) To: neil.armstrong, quic_jesszhan, maarten.lankhorst, mripard, tzimmermann, airlied, simona, robh, krzk+dt, conor+dt Cc: Alexander Baransky, dri-devel, devicetree, linux-kernel The Visionox G2647FB105 is a 6.47 inch 1080x2340 MIPI-DSI CMD mode AMOLED panel used in: - Xiaomi Mi Note 10 / CC9 Pro (sm7150-xiaomi-tucana) - Xiaomi Mi Note 10 Lite (sm7150-xiaomi-toco) Add a dt-binding for it. Signed-off-by: Alexander Baransky <sanyapilot496@gmail.com> --- .../display/panel/visionox,g2647fb105.yaml | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/panel/visionox,g2647fb105.yaml diff --git a/Documentation/devicetree/bindings/display/panel/visionox,g2647fb105.yaml b/Documentation/devicetree/bindings/display/panel/visionox,g2647fb105.yaml new file mode 100644 index 000000000000..49dcd9b8f670 --- /dev/null +++ b/Documentation/devicetree/bindings/display/panel/visionox,g2647fb105.yaml @@ -0,0 +1,79 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/display/panel/visionox,g2647fb105.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Visionox G2647FB105 6.47" 1080x2340 MIPI-DSI Panel + +maintainers: + - Alexander Baransky <sanyapilot496@gmail.com> + +description: + The Visionox G2647FB105 is a 6.47 inch 1080x2340 MIPI-DSI CMD mode OLED panel. + +allOf: + - $ref: panel-common.yaml# + +properties: + compatible: + const: visionox,g2647fb105 + + reg: + maxItems: 1 + + vdd3p3-supply: + description: 3.3V source voltage rail + + vddio-supply: + description: I/O source voltage rail + + vsn-supply: + description: Negative source voltage rail + + vsp-supply: + description: Positive source voltage rail + + reset-gpios: true + port: true + +required: + - compatible + - reg + - vdd3p3-supply + - vddio-supply + - vsn-supply + - vsp-supply + - reset-gpios + - port + +additionalProperties: false + +examples: + - | + #include <dt-bindings/gpio/gpio.h> + + dsi { + #address-cells = <1>; + #size-cells = <0>; + + panel@0 { + compatible = "visionox,g2647fb105"; + reg = <0>; + + vdd3p3-supply = <&vreg_l7c_3p0>; + vddio-supply = <&vreg_l13a_1p8>; + vsn-supply = <&vreg_ibb>; + vsp-supply = <&vreg_lab>; + + reset-gpios = <&pm6150l_gpios 9 GPIO_ACTIVE_LOW>; + + port { + panel_in: endpoint { + remote-endpoint = <&mdss_dsi0_out>; + }; + }; + }; + }; + +... -- 2.49.0 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] dt-bindings: display: panel: Add Visionox G2647FB105 2025-03-25 15:57 ` [PATCH 1/2] dt-bindings: display: panel: Add Visionox G2647FB105 Alexander Baransky @ 2025-03-25 16:35 ` Krzysztof Kozlowski 2025-03-25 16:38 ` Krzysztof Kozlowski 2025-03-25 18:16 ` Danila Tikhonov 0 siblings, 2 replies; 8+ messages in thread From: Krzysztof Kozlowski @ 2025-03-25 16:35 UTC (permalink / raw) To: Alexander Baransky, neil.armstrong, quic_jesszhan, maarten.lankhorst, mripard, tzimmermann, airlied, simona, robh, krzk+dt, conor+dt Cc: dri-devel, devicetree, linux-kernel On 25/03/2025 16:57, Alexander Baransky wrote: > The Visionox G2647FB105 is a 6.47 inch 1080x2340 MIPI-DSI CMD mode "Add a DT binding for the Visionox....." > AMOLED panel used in: > - Xiaomi Mi Note 10 / CC9 Pro (sm7150-xiaomi-tucana) > - Xiaomi Mi Note 10 Lite (sm7150-xiaomi-toco) > > Add a dt-binding for it. And drop this sentence. > > Signed-off-by: Alexander Baransky <sanyapilot496@gmail.com> > --- ... > +properties: > + compatible: > + const: visionox,g2647fb105 > + > + reg: > + maxItems: 1 > + > + vdd3p3-supply: > + description: 3.3V source voltage rail > + > + vddio-supply: > + description: I/O source voltage rail > + > + vsn-supply: > + description: Negative source voltage rail > + > + vsp-supply: > + description: Positive source voltage rail Are you sure these are real voltage rails on the device? Weirdly similar to some old Samsung AMOLED panels... Best regards, Krzysztof ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] dt-bindings: display: panel: Add Visionox G2647FB105 2025-03-25 16:35 ` Krzysztof Kozlowski @ 2025-03-25 16:38 ` Krzysztof Kozlowski 2025-03-25 18:16 ` Danila Tikhonov 1 sibling, 0 replies; 8+ messages in thread From: Krzysztof Kozlowski @ 2025-03-25 16:38 UTC (permalink / raw) To: Alexander Baransky, neil.armstrong, quic_jesszhan, maarten.lankhorst, mripard, tzimmermann, airlied, simona, robh, krzk+dt, conor+dt Cc: dri-devel, devicetree, linux-kernel On 25/03/2025 17:35, Krzysztof Kozlowski wrote: > On 25/03/2025 16:57, Alexander Baransky wrote: >> The Visionox G2647FB105 is a 6.47 inch 1080x2340 MIPI-DSI CMD mode > > > "Add a DT binding for the Visionox....." > >> AMOLED panel used in: >> - Xiaomi Mi Note 10 / CC9 Pro (sm7150-xiaomi-tucana) >> - Xiaomi Mi Note 10 Lite (sm7150-xiaomi-toco) >> >> Add a dt-binding for it. > > And drop this sentence. > >> >> Signed-off-by: Alexander Baransky <sanyapilot496@gmail.com> >> --- > > > ... > >> +properties: >> + compatible: >> + const: visionox,g2647fb105 >> + >> + reg: >> + maxItems: 1 >> + >> + vdd3p3-supply: >> + description: 3.3V source voltage rail >> + >> + vddio-supply: >> + description: I/O source voltage rail >> + >> + vsn-supply: >> + description: Negative source voltage rail >> + >> + vsp-supply: >> + description: Positive source voltage rail > > Are you sure these are real voltage rails on the device? Weirdly similar > to some old Samsung AMOLED panels... Heh, actually entire example is the same as in Samsung panels. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] dt-bindings: display: panel: Add Visionox G2647FB105 2025-03-25 16:35 ` Krzysztof Kozlowski 2025-03-25 16:38 ` Krzysztof Kozlowski @ 2025-03-25 18:16 ` Danila Tikhonov 2025-03-25 18:21 ` Krzysztof Kozlowski 1 sibling, 1 reply; 8+ messages in thread From: Danila Tikhonov @ 2025-03-25 18:16 UTC (permalink / raw) To: Krzysztof Kozlowski Cc: Alexander Baransky, neil.armstrong, quic_jesszhan, maarten.lankhorst, mripard, tzimmermann, airlied, simona, robh, dri-devel, krzk+dt, conor+dt, devicetree, linux-kernel [-- Attachment #1: Type: text/plain, Size: 2091 bytes --] On 3/25/25 19:35, Krzysztof Kozlowski wrote: > On 25/03/2025 16:57, Alexander Baransky wrote: >> The Visionox G2647FB105 is a 6.47 inch 1080x2340 MIPI-DSI CMD mode > > "Add a DT binding for the Visionox....." > >> AMOLED panel used in: >> - Xiaomi Mi Note 10 / CC9 Pro (sm7150-xiaomi-tucana) >> - Xiaomi Mi Note 10 Lite (sm7150-xiaomi-toco) >> >> Add a dt-binding for it. > And drop this sentence. > >> Signed-off-by: Alexander Baransky<sanyapilot496@gmail.com> >> --- > > ... > >> +properties: >> + compatible: >> + const: visionox,g2647fb105 >> + >> + reg: >> + maxItems: 1 >> + >> + vdd3p3-supply: >> + description: 3.3V source voltage rail >> + >> + vddio-supply: >> + description: I/O source voltage rail >> + >> + vsn-supply: >> + description: Negative source voltage rail >> + >> + vsp-supply: >> + description: Positive source voltage rail > Are you sure these are real voltage rails on the device? Weirdly similar > to some old Samsung AMOLED panels... Hello Krzysztof, I was somewhat intrigued by your observation, especially since I have some schematics for this device. The patch correctly adds four regulators – ibb, lab, vdd (3p0), and vio (1p8). This situation arises from Xiaomi’s tendency to use different panels in various revisions of the same device. Although, AFAIK, the sm7150-xiaomi-toco/tucana was released with only one possible variation (which this series adds), the sm7150-xiaomi-davinci offers a different perspective. The latter was initially produced with a samsung,ams639rq08 panel (which I had added previously), yet official service centers have replaced the factory panel with the visionox,g1639fp106 during repairs. This suggests that, in terms of power configuration, the samsung,ams639rq08 and the visionox,g1639fp106 panels are effectively identical. It is therefore likely that the visionox,g2647fb105 from this series follows the same way. Nevertheless, it is reassuring that I can confirm these findings with the schematics rather than relying on mere guesswork xD --- Best wishes Danila > Best regards, > Krzysztof [-- Attachment #2: Type: text/html, Size: 3541 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] dt-bindings: display: panel: Add Visionox G2647FB105 2025-03-25 18:16 ` Danila Tikhonov @ 2025-03-25 18:21 ` Krzysztof Kozlowski 0 siblings, 0 replies; 8+ messages in thread From: Krzysztof Kozlowski @ 2025-03-25 18:21 UTC (permalink / raw) To: Danila Tikhonov Cc: Alexander Baransky, neil.armstrong, quic_jesszhan, maarten.lankhorst, mripard, tzimmermann, airlied, simona, robh, dri-devel, krzk+dt, conor+dt, devicetree, linux-kernel On 25/03/2025 19:16, Danila Tikhonov wrote: >>> + vsp-supply: >>> + description: Positive source voltage rail >> Are you sure these are real voltage rails on the device? Weirdly similar >> to some old Samsung AMOLED panels... > Hello Krzysztof, > > I was somewhat intrigued by your observation, especially since I have > some schematics for this device. The patch correctly adds four > regulators – ibb, lab, vdd (3p0), and vio (1p8). > > This situation arises from Xiaomi’s tendency to use different panels in > various revisions of the same device. Although, AFAIK, the > sm7150-xiaomi-toco/tucana was released with only one possible variation > (which this series adds), the sm7150-xiaomi-davinci offers a different > perspective. The latter was initially produced with a samsung,ams639rq08 > panel (which I had added previously), yet official service centers have > replaced the factory panel with the visionox,g1639fp106 during repairs. > This suggests that, in terms of power configuration, the > samsung,ams639rq08 and the visionox,g1639fp106 panels are effectively > identical. > > It is therefore likely that the visionox,g2647fb105 from this series > follows the same way. > > Nevertheless, it is reassuring that I can confirm these findings with > the schematics rather than relying on mere guesswork xD Great, appreciated, thanks for checking. Some parts of above - similarities including replacement of factory panel - might be good for commit msg. Please add them. With that and simplifying the commit sentence style: Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Best regards, Krzysztof ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 2/2] drm/panel: Add Visionox G2647FB105 panel driver 2025-03-25 15:57 [PATCH 0/2] Add Visionox G2647FB105 panel support Alexander Baransky 2025-03-25 15:57 ` [PATCH 1/2] dt-bindings: display: panel: Add Visionox G2647FB105 Alexander Baransky @ 2025-03-25 15:57 ` Alexander Baransky 2025-03-25 18:31 ` Danila Tikhonov 1 sibling, 1 reply; 8+ messages in thread From: Alexander Baransky @ 2025-03-25 15:57 UTC (permalink / raw) To: neil.armstrong, quic_jesszhan, maarten.lankhorst, mripard, tzimmermann, airlied, simona, robh, krzk+dt, conor+dt Cc: Alexander Baransky, dri-devel, devicetree, linux-kernel Add the driver for Visionox G2647FB105 6.47" FHD Plus CMD mode AMOLED panel support found in: - Xiaomi Mi Note 10 / CC9 Pro (sm7150-xiaomi-tucana) - Xiaomi Mi Note 10 Lite (sm7150-xiaomi-toco) Signed-off-by: Alexander Baransky <sanyapilot496@gmail.com> --- drivers/gpu/drm/panel/Kconfig | 9 + drivers/gpu/drm/panel/Makefile | 1 + .../gpu/drm/panel/panel-visionox-g2647fb105.c | 277 ++++++++++++++++++ 3 files changed, 287 insertions(+) create mode 100644 drivers/gpu/drm/panel/panel-visionox-g2647fb105.c diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig index d7469c565d1d..c4de2749260d 100644 --- a/drivers/gpu/drm/panel/Kconfig +++ b/drivers/gpu/drm/panel/Kconfig @@ -977,6 +977,15 @@ config DRM_PANEL_TRULY_NT35597_WQXGA Say Y here if you want to enable support for Truly NT35597 WQXGA Dual DSI Video Mode panel +config DRM_PANEL_VISIONOX_G2647FB105 + tristate "Visionox G2647FB105" + depends on OF + depends on DRM_MIPI_DSI + depends on BACKLIGHT_CLASS_DEVICE + help + Say Y here if you want to enable support for the Visionox + G2647FB105 (2340x1080@60Hz) AMOLED DSI cmd mode panel. + config DRM_PANEL_VISIONOX_R66451 tristate "Visionox R66451" depends on OF diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile index 7dcf72646cac..31dc893e0b16 100644 --- a/drivers/gpu/drm/panel/Makefile +++ b/drivers/gpu/drm/panel/Makefile @@ -99,6 +99,7 @@ obj-$(CONFIG_DRM_PANEL_TPO_TD028TTEC1) += panel-tpo-td028ttec1.o obj-$(CONFIG_DRM_PANEL_TPO_TD043MTEA1) += panel-tpo-td043mtea1.o obj-$(CONFIG_DRM_PANEL_TPO_TPG110) += panel-tpo-tpg110.o obj-$(CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA) += panel-truly-nt35597.o +obj-$(CONFIG_DRM_PANEL_VISIONOX_G2647FB105) += panel-visionox-g2647fb105.o obj-$(CONFIG_DRM_PANEL_VISIONOX_RM69299) += panel-visionox-rm69299.o obj-$(CONFIG_DRM_PANEL_VISIONOX_VTDR6130) += panel-visionox-vtdr6130.o obj-$(CONFIG_DRM_PANEL_VISIONOX_R66451) += panel-visionox-r66451.o diff --git a/drivers/gpu/drm/panel/panel-visionox-g2647fb105.c b/drivers/gpu/drm/panel/panel-visionox-g2647fb105.c new file mode 100644 index 000000000000..cf80310de13c --- /dev/null +++ b/drivers/gpu/drm/panel/panel-visionox-g2647fb105.c @@ -0,0 +1,277 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Generated with linux-mdss-dsi-panel-driver-generator from vendor device tree: + * Copyright (c) 2013, The Linux Foundation. All rights reserved. + * Copyright (c) 2025, Alexander Baransky <sanyapilot496@gmail.com> + */ + +#include <linux/backlight.h> +#include <linux/delay.h> +#include <linux/gpio/consumer.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/regulator/consumer.h> + +#include <drm/drm_mipi_dsi.h> +#include <drm/drm_modes.h> +#include <drm/drm_panel.h> + +struct visionox_g2647fb105 { + struct drm_panel panel; + struct mipi_dsi_device *dsi; + struct gpio_desc *reset_gpio; + struct regulator_bulk_data supplies[4]; +}; + +static inline +struct visionox_g2647fb105 *to_visionox_g2647fb105(struct drm_panel *panel) +{ + return container_of(panel, struct visionox_g2647fb105, panel); +} + +static void visionox_g2647fb105_reset(struct visionox_g2647fb105 *ctx) +{ + gpiod_set_value_cansleep(ctx->reset_gpio, 1); + usleep_range(1000, 2000); + gpiod_set_value_cansleep(ctx->reset_gpio, 0); + usleep_range(10000, 11000); +} + +static int visionox_g2647fb105_on(struct visionox_g2647fb105 *ctx) +{ + struct mipi_dsi_device *dsi = ctx->dsi; + struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi }; + + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x70, 0x04); + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x40); + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4d, 0x32); + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x40); + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xbe, 0x17); + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xbf, 0xbb); + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xc0, 0xdd); + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xc1, 0xff); + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0xd0); + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x03, 0x24); + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x04, 0x03); + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x00); + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xc2, 0x08); + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x00); + + mipi_dsi_dcs_set_tear_on_multi(&dsi_ctx, MIPI_DSI_DCS_TEAR_MODE_VBLANK); + mipi_dsi_dcs_set_display_brightness_multi(&dsi_ctx, 0x0000); + mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx); + mipi_dsi_msleep(&dsi_ctx, 100); + + mipi_dsi_dcs_set_display_on_multi(&dsi_ctx); + + return dsi_ctx.accum_err; +} + +static int visionox_g2647fb105_off(struct visionox_g2647fb105 *ctx) +{ + struct mipi_dsi_device *dsi = ctx->dsi; + struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi }; + + mipi_dsi_dcs_set_display_off_multi(&dsi_ctx); + mipi_dsi_msleep(&dsi_ctx, 50); + + mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx); + mipi_dsi_msleep(&dsi_ctx, 20); + + return dsi_ctx.accum_err; +} + +static int visionox_g2647fb105_prepare(struct drm_panel *panel) +{ + struct visionox_g2647fb105 *ctx = to_visionox_g2647fb105(panel); + struct device *dev = &ctx->dsi->dev; + int ret; + + ret = regulator_bulk_enable(ARRAY_SIZE(ctx->supplies), ctx->supplies); + if (ret < 0) { + dev_err(dev, "Failed to enable regulators: %d\n", ret); + return ret; + } + + visionox_g2647fb105_reset(ctx); + + ret = visionox_g2647fb105_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(ctx->supplies), ctx->supplies); + return ret; + } + + return 0; +} + +static int visionox_g2647fb105_unprepare(struct drm_panel *panel) +{ + struct visionox_g2647fb105 *ctx = to_visionox_g2647fb105(panel); + struct device *dev = &ctx->dsi->dev; + int ret; + + ret = visionox_g2647fb105_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(ctx->supplies), ctx->supplies); + + return 0; +} + +static const struct drm_display_mode visionox_g2647fb105_mode = { + .clock = (1080 + 28 + 4 + 36) * (2340 + 8 + 4 + 4) * 60 / 1000, + .hdisplay = 1080, + .hsync_start = 1080 + 28, + .hsync_end = 1080 + 28 + 4, + .htotal = 1080 + 28 + 4 + 36, + .vdisplay = 2340, + .vsync_start = 2340 + 8, + .vsync_end = 2340 + 8 + 4, + .vtotal = 2340 + 8 + 4 + 4, + .width_mm = 69, + .height_mm = 149, +}; + +static int visionox_g2647fb105_get_modes(struct drm_panel *panel, + struct drm_connector *connector) +{ + struct drm_display_mode *mode; + + mode = drm_mode_duplicate(connector->dev, &visionox_g2647fb105_mode); + if (!mode) + return -ENOMEM; + + drm_mode_set_name(mode); + + mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; + connector->display_info.width_mm = mode->width_mm; + connector->display_info.height_mm = mode->height_mm; + drm_mode_probed_add(connector, mode); + + return 1; +} + +static const struct drm_panel_funcs visionox_g2647fb105_panel_funcs = { + .prepare = visionox_g2647fb105_prepare, + .unprepare = visionox_g2647fb105_unprepare, + .get_modes = visionox_g2647fb105_get_modes, +}; + +static int visionox_g2647fb105_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 const struct backlight_ops visionox_g2647fb105_bl_ops = { + .update_status = visionox_g2647fb105_bl_update_status, +}; + +static struct backlight_device * +visionox_g2647fb105_create_backlight(struct mipi_dsi_device *dsi) +{ + struct device *dev = &dsi->dev; + const struct backlight_properties props = { + .type = BACKLIGHT_RAW, + .brightness = 1023, + .max_brightness = 2047, + }; + + return devm_backlight_device_register(dev, dev_name(dev), dev, dsi, + &visionox_g2647fb105_bl_ops, &props); +} + +static int visionox_g2647fb105_probe(struct mipi_dsi_device *dsi) +{ + struct device *dev = &dsi->dev; + struct visionox_g2647fb105 *ctx; + int ret; + + ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return -ENOMEM; + + ctx->supplies[0].supply = "vdd3p3"; + ctx->supplies[1].supply = "vddio"; + ctx->supplies[2].supply = "vsn"; + ctx->supplies[3].supply = "vsp"; + ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(ctx->supplies), + ctx->supplies); + if (ret < 0) + return dev_err_probe(dev, ret, "Failed to get regulators\n"); + + 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_BURST | + MIPI_DSI_CLOCK_NON_CONTINUOUS | MIPI_DSI_MODE_LPM; + + ctx->panel.prepare_prev_first = true; + + drm_panel_init(&ctx->panel, dev, &visionox_g2647fb105_panel_funcs, + DRM_MODE_CONNECTOR_DSI); + ctx->panel.prepare_prev_first = true; + + ctx->panel.backlight = visionox_g2647fb105_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 = devm_mipi_dsi_attach(dev, 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 visionox_g2647fb105_remove(struct mipi_dsi_device *dsi) +{ + struct visionox_g2647fb105 *ctx = mipi_dsi_get_drvdata(dsi); + drm_panel_remove(&ctx->panel); +} + +static const struct of_device_id visionox_g2647fb105_of_match[] = { + { .compatible = "visionox,g2647fb105" }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, visionox_g2647fb105_of_match); + +static struct mipi_dsi_driver visionox_g2647fb105_driver = { + .probe = visionox_g2647fb105_probe, + .remove = visionox_g2647fb105_remove, + .driver = { + .name = "panel-visionox-g2647fb105", + .of_match_table = visionox_g2647fb105_of_match, + }, +}; +module_mipi_dsi_driver(visionox_g2647fb105_driver); + +MODULE_AUTHOR("Alexander Baransky <sanyapilot496@gmail.com>"); +MODULE_DESCRIPTION("DRM driver for Visionox G2647FB105 AMOLED DSI panel"); +MODULE_LICENSE("GPL"); -- 2.49.0 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] drm/panel: Add Visionox G2647FB105 panel driver 2025-03-25 15:57 ` [PATCH 2/2] drm/panel: Add Visionox G2647FB105 panel driver Alexander Baransky @ 2025-03-25 18:31 ` Danila Tikhonov 0 siblings, 0 replies; 8+ messages in thread From: Danila Tikhonov @ 2025-03-25 18:31 UTC (permalink / raw) To: Alexander Baransky Cc: neil.armstrong, quic_jesszhan, maarten.lankhorst, mripard, tzimmermann, airlied, simona, robh, krzk+dt, conor+dt, dri-devel, devicetree, linux-kernel [-- Attachment #1: Type: text/plain, Size: 11475 bytes --] On 3/25/25 18:57, Alexander Baransky wrote: > Add the driver for Visionox G2647FB105 6.47" FHD Plus CMD mode AMOLED panel > support found in: > - Xiaomi Mi Note 10 / CC9 Pro (sm7150-xiaomi-tucana) > - Xiaomi Mi Note 10 Lite (sm7150-xiaomi-toco) > > Signed-off-by: Alexander Baransky<sanyapilot496@gmail.com> > --- > drivers/gpu/drm/panel/Kconfig | 9 + > drivers/gpu/drm/panel/Makefile | 1 + > .../gpu/drm/panel/panel-visionox-g2647fb105.c | 277 ++++++++++++++++++ > 3 files changed, 287 insertions(+) > create mode 100644 drivers/gpu/drm/panel/panel-visionox-g2647fb105.c > > diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig > index d7469c565d1d..c4de2749260d 100644 > --- a/drivers/gpu/drm/panel/Kconfig > +++ b/drivers/gpu/drm/panel/Kconfig > @@ -977,6 +977,15 @@ config DRM_PANEL_TRULY_NT35597_WQXGA > Say Y here if you want to enable support for Truly NT35597 WQXGA Dual DSI > Video Mode panel > > +config DRM_PANEL_VISIONOX_G2647FB105 > + tristate "Visionox G2647FB105" > + depends on OF > + depends on DRM_MIPI_DSI > + depends on BACKLIGHT_CLASS_DEVICE > + help > + Say Y here if you want to enable support for the Visionox > + G2647FB105 (2340x1080@60Hz) AMOLED DSI cmd mode panel. > + > config DRM_PANEL_VISIONOX_R66451 > tristate "Visionox R66451" > depends on OF > diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile > index 7dcf72646cac..31dc893e0b16 100644 > --- a/drivers/gpu/drm/panel/Makefile > +++ b/drivers/gpu/drm/panel/Makefile > @@ -99,6 +99,7 @@ obj-$(CONFIG_DRM_PANEL_TPO_TD028TTEC1) += panel-tpo-td028ttec1.o > obj-$(CONFIG_DRM_PANEL_TPO_TD043MTEA1) += panel-tpo-td043mtea1.o > obj-$(CONFIG_DRM_PANEL_TPO_TPG110) += panel-tpo-tpg110.o > obj-$(CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA) += panel-truly-nt35597.o > +obj-$(CONFIG_DRM_PANEL_VISIONOX_G2647FB105) += panel-visionox-g2647fb105.o > obj-$(CONFIG_DRM_PANEL_VISIONOX_RM69299) += panel-visionox-rm69299.o > obj-$(CONFIG_DRM_PANEL_VISIONOX_VTDR6130) += panel-visionox-vtdr6130.o > obj-$(CONFIG_DRM_PANEL_VISIONOX_R66451) += panel-visionox-r66451.o > diff --git a/drivers/gpu/drm/panel/panel-visionox-g2647fb105.c b/drivers/gpu/drm/panel/panel-visionox-g2647fb105.c > new file mode 100644 > index 000000000000..cf80310de13c > --- /dev/null > +++ b/drivers/gpu/drm/panel/panel-visionox-g2647fb105.c > @@ -0,0 +1,277 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * Generated with linux-mdss-dsi-panel-driver-generator from vendor device tree: > + * Copyright (c) 2013, The Linux Foundation. All rights reserved. > + * Copyright (c) 2025, Alexander Baransky<sanyapilot496@gmail.com> > + */ > + > +#include <linux/backlight.h> > +#include <linux/delay.h> > +#include <linux/gpio/consumer.h> > +#include <linux/module.h> > +#include <linux/of.h> > +#include <linux/regulator/consumer.h> > + > +#include <drm/drm_mipi_dsi.h> > +#include <drm/drm_modes.h> > +#include <drm/drm_panel.h> > + > +struct visionox_g2647fb105 { > + struct drm_panel panel; > + struct mipi_dsi_device *dsi; > + struct gpio_desc *reset_gpio; > + struct regulator_bulk_data supplies[4]; > +}; > + > +static inline > +struct visionox_g2647fb105 *to_visionox_g2647fb105(struct drm_panel *panel) > +{ > + return container_of(panel, struct visionox_g2647fb105, panel); > +} > + > +static void visionox_g2647fb105_reset(struct visionox_g2647fb105 *ctx) > +{ > + gpiod_set_value_cansleep(ctx->reset_gpio, 1); > + usleep_range(1000, 2000); > + gpiod_set_value_cansleep(ctx->reset_gpio, 0); > + usleep_range(10000, 11000); > +} > + > +static int visionox_g2647fb105_on(struct visionox_g2647fb105 *ctx) > +{ > + struct mipi_dsi_device *dsi = ctx->dsi; > + struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi }; > + > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x70, 0x04); > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x40); > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4d, 0x32); > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x40); > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xbe, 0x17); > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xbf, 0xbb); > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xc0, 0xdd); > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xc1, 0xff); > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0xd0); > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x03, 0x24); > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x04, 0x03); > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x00); > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xc2, 0x08); > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfe, 0x00); > + > + mipi_dsi_dcs_set_tear_on_multi(&dsi_ctx, MIPI_DSI_DCS_TEAR_MODE_VBLANK); > + mipi_dsi_dcs_set_display_brightness_multi(&dsi_ctx, 0x0000); > + mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx); > + mipi_dsi_msleep(&dsi_ctx, 100); > + > + mipi_dsi_dcs_set_display_on_multi(&dsi_ctx); > + > + return dsi_ctx.accum_err; > +} > + > +static int visionox_g2647fb105_off(struct visionox_g2647fb105 *ctx) > +{ > + struct mipi_dsi_device *dsi = ctx->dsi; > + struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi }; > + > + mipi_dsi_dcs_set_display_off_multi(&dsi_ctx); > + mipi_dsi_msleep(&dsi_ctx, 50); > + > + mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx); > + mipi_dsi_msleep(&dsi_ctx, 20); > + > + return dsi_ctx.accum_err; > +} > + > +static int visionox_g2647fb105_prepare(struct drm_panel *panel) > +{ > + struct visionox_g2647fb105 *ctx = to_visionox_g2647fb105(panel); > + struct device *dev = &ctx->dsi->dev; > + int ret; > + > + ret = regulator_bulk_enable(ARRAY_SIZE(ctx->supplies), ctx->supplies); > + if (ret < 0) { > + dev_err(dev, "Failed to enable regulators: %d\n", ret); > + return ret; > + } > + > + visionox_g2647fb105_reset(ctx); > + > + ret = visionox_g2647fb105_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(ctx->supplies), ctx->supplies); > + return ret; > + } > + > + return 0; > +} > + > +static int visionox_g2647fb105_unprepare(struct drm_panel *panel) > +{ > + struct visionox_g2647fb105 *ctx = to_visionox_g2647fb105(panel); > + struct device *dev = &ctx->dsi->dev; > + int ret; > + > + ret = visionox_g2647fb105_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(ctx->supplies), ctx->supplies); > + > + return 0; > +} > + > +static const struct drm_display_mode visionox_g2647fb105_mode = { > + .clock = (1080 + 28 + 4 + 36) * (2340 + 8 + 4 + 4) * 60 / 1000, > + .hdisplay = 1080, > + .hsync_start = 1080 + 28, > + .hsync_end = 1080 + 28 + 4, > + .htotal = 1080 + 28 + 4 + 36, > + .vdisplay = 2340, > + .vsync_start = 2340 + 8, > + .vsync_end = 2340 + 8 + 4, > + .vtotal = 2340 + 8 + 4 + 4, > + .width_mm = 69, > + .height_mm = 149, > +}; > + > +static int visionox_g2647fb105_get_modes(struct drm_panel *panel, > + struct drm_connector *connector) > +{ > + struct drm_display_mode *mode; > + > + mode = drm_mode_duplicate(connector->dev, &visionox_g2647fb105_mode); > + if (!mode) > + return -ENOMEM; > + > + drm_mode_set_name(mode); > + > + mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; > + connector->display_info.width_mm = mode->width_mm; > + connector->display_info.height_mm = mode->height_mm; > + drm_mode_probed_add(connector, mode); > + > + return 1; > +} > + > +static const struct drm_panel_funcs visionox_g2647fb105_panel_funcs = { > + .prepare = visionox_g2647fb105_prepare, > + .unprepare = visionox_g2647fb105_unprepare, > + .get_modes = visionox_g2647fb105_get_modes, > +}; > + > +static int visionox_g2647fb105_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 const struct backlight_ops visionox_g2647fb105_bl_ops = { > + .update_status = visionox_g2647fb105_bl_update_status, > +}; > + > +static struct backlight_device * > +visionox_g2647fb105_create_backlight(struct mipi_dsi_device *dsi) > +{ > + struct device *dev = &dsi->dev; > + const struct backlight_properties props = { > + .type = BACKLIGHT_RAW, > + .brightness = 1023, > + .max_brightness = 2047, > + }; > + > + return devm_backlight_device_register(dev, dev_name(dev), dev, dsi, > + &visionox_g2647fb105_bl_ops, &props); > +} > + > +static int visionox_g2647fb105_probe(struct mipi_dsi_device *dsi) > +{ > + struct device *dev = &dsi->dev; > + struct visionox_g2647fb105 *ctx; > + int ret; > + > + ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); > + if (!ctx) > + return -ENOMEM; > + > + ctx->supplies[0].supply = "vdd3p3"; > + ctx->supplies[1].supply = "vddio"; > + ctx->supplies[2].supply = "vsn"; > + ctx->supplies[3].supply = "vsp"; Hello Alexander, Why don't you want to make regulator_bulk_data a static const structure? Please look: https://lore.kernel.org/all/20240828-topic-sm8x50-upstream-vtdr6130-multi-v1-2-0cae20d4c55d@linaro.org/ --- Best wishes Danila > + ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(ctx->supplies), > + ctx->supplies); > + if (ret < 0) > + return dev_err_probe(dev, ret, "Failed to get regulators\n"); > + > + 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_BURST | > + MIPI_DSI_CLOCK_NON_CONTINUOUS | MIPI_DSI_MODE_LPM; > + > + ctx->panel.prepare_prev_first = true; > + > + drm_panel_init(&ctx->panel, dev, &visionox_g2647fb105_panel_funcs, > + DRM_MODE_CONNECTOR_DSI); > + ctx->panel.prepare_prev_first = true; > + > + ctx->panel.backlight = visionox_g2647fb105_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 = devm_mipi_dsi_attach(dev, 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 visionox_g2647fb105_remove(struct mipi_dsi_device *dsi) > +{ > + struct visionox_g2647fb105 *ctx = mipi_dsi_get_drvdata(dsi); > + drm_panel_remove(&ctx->panel); > +} > + > +static const struct of_device_id visionox_g2647fb105_of_match[] = { > + { .compatible = "visionox,g2647fb105" }, > + { /* sentinel */ } > +}; > +MODULE_DEVICE_TABLE(of, visionox_g2647fb105_of_match); > + > +static struct mipi_dsi_driver visionox_g2647fb105_driver = { > + .probe = visionox_g2647fb105_probe, > + .remove = visionox_g2647fb105_remove, > + .driver = { > + .name = "panel-visionox-g2647fb105", > + .of_match_table = visionox_g2647fb105_of_match, > + }, > +}; > +module_mipi_dsi_driver(visionox_g2647fb105_driver); > + > +MODULE_AUTHOR("Alexander Baransky<sanyapilot496@gmail.com>"); > +MODULE_DESCRIPTION("DRM driver for Visionox G2647FB105 AMOLED DSI panel"); > +MODULE_LICENSE("GPL"); [-- Attachment #2: Type: text/html, Size: 12186 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-03-25 19:22 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-03-25 15:57 [PATCH 0/2] Add Visionox G2647FB105 panel support Alexander Baransky 2025-03-25 15:57 ` [PATCH 1/2] dt-bindings: display: panel: Add Visionox G2647FB105 Alexander Baransky 2025-03-25 16:35 ` Krzysztof Kozlowski 2025-03-25 16:38 ` Krzysztof Kozlowski 2025-03-25 18:16 ` Danila Tikhonov 2025-03-25 18:21 ` Krzysztof Kozlowski 2025-03-25 15:57 ` [PATCH 2/2] drm/panel: Add Visionox G2647FB105 panel driver Alexander Baransky 2025-03-25 18:31 ` Danila Tikhonov
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.