From patchwork Thu Mar 27 16:37:44 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Baransky X-Patchwork-Id: 14031294 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id F14AEC36010 for ; Thu, 27 Mar 2025 16:39:06 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 643B410E11B; Thu, 27 Mar 2025 16:39:06 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Ce5NhHFL"; dkim-atps=neutral Received: from mail-lf1-f67.google.com (mail-lf1-f67.google.com [209.85.167.67]) by gabe.freedesktop.org (Postfix) with ESMTPS id EE3A210E11B for ; Thu, 27 Mar 2025 16:39:05 +0000 (UTC) Received: by mail-lf1-f67.google.com with SMTP id 2adb3069b0e04-549967c72bcso1232846e87.3 for ; Thu, 27 Mar 2025 09:39:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1743093544; x=1743698344; darn=lists.freedesktop.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=gp0Fu3ouz4uc6KpA7K7Yg17pL+gYDllzv0em80pWIw0=; b=Ce5NhHFLOqSpJ+79dB0MRDBNbpF/CXQlVCuCSEfGG7oLBsK0ahYs49EHOZbOsx60bh KhfrREmoAl4s7ln2YxYn5EvH4BevTFwgg5bKO9sY0uN/o0f0s9kvZKjyrCAS+JH8jo84 gAevPIkjLfzlfTsbmRUGq2kzOnh9ljpNbIDhEse3i3ux397vzuKFQJEOve9+/8QpQ7pn MxqUmBU+B7rJMXVFha4YF5T5Iq25YXc7zy4kdYR76emOfnfT+RS/NT/7b2BVcHSh7FTN 9RqmHNsYCT+0nQ3J29DjdPWvlXpYJ861H4RYfj4vITVaYuS1ujtRl//c+WTeAfRPWzGe r84Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743093544; x=1743698344; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gp0Fu3ouz4uc6KpA7K7Yg17pL+gYDllzv0em80pWIw0=; b=A3pSBtLRk33EW3vYhvRWaw3zDv8XwCZ/vXFFPufDoIUaehp+/QCeBVpNLZz4XbsC7u R3WReZUyy0UZJjrqgARdYZunbAUHjo5MLEhkYxUpuf75MsahCM/vsRh4gjkh8+NyJUw8 eDCNrq/0oQAGGSFIi/CKqlZ6iuVJsJfBt6ygeDhtsT/e1geKFuJYiL5QVsqD1dx1g60Q FR8MRfK/6fEdkvLSW5FhJ1CDP+freaA90VV6RV8tu3RMDhfm1WnMAU4bbifwXtj6oIIq IDIrlv4ezEWmpIkIvT4zgaOApj79MtWA+l0kjRvis9vLRqBWwtAgUSE0KBMLAl37Jyqi 6RhA== X-Forwarded-Encrypted: i=1; AJvYcCWeu3+qk998NIJmzJdXqE0BAGXZJ7UVcNMzuVFmRFmLsfd1z9PyqzsgmQk4EVjZk8Fn/vTWomhK6SY=@lists.freedesktop.org X-Gm-Message-State: AOJu0Yw+Zbx3S/rF/pxFpuxE8alaz3IJqh6ObBJ9BXiJPMiRoyH1wFIZ b3TVSg6L1macigy2mXlwp8uzVoRmVJQTU7wcb5Yyc1DHzBLhkAO2ejg9Rrnl/1llUg== X-Gm-Gg: ASbGncuFDpM+NqOgQjRDtu2FhdxIPmIR7fRit8AyrvhaC/ZljY0OLZqKxh920bmETfl 0xB/ZFICdElIBQiHSJ3/Xs46/3D1X0dcj3KUDs7KZwX6BcLK0o8Focm5YqWQUP1Ue5QqJbqkePB dPjdOWaBbHu8feUttyxR0G7W4T4z7lcZfBaAeU5LOMK/FE0ocKTtekRLGEhcrQAKXEHQHMbAYdq u/Hzpe/RbCZKlssngUlmV6itf0ctRMH9dySQHjaDXAmdvHsLAjHQTM8MWKdN99bQhUyQcznYG8C aelg3TQUL1h0gBt6BNToZt01vNXtBFu7qgo5JYWjgKP6JKiqtkouQ1lAzA== X-Google-Smtp-Source: AGHT+IFQwu1Y68UvrgupbE2Y9sQpN7MLE/jssxGsoGgiHHOFdcRsTbQNTBxX/oUs5XurF+hk2bd7oA== X-Received: by 2002:a05:6512:23a9:b0:545:27af:f2d1 with SMTP id 2adb3069b0e04-54b012532camr1744900e87.44.1743093544034; Thu, 27 Mar 2025 09:39:04 -0700 (PDT) Received: from pilotmaintrash.lan ([178.34.180.83]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54b0957feedsm10150e87.110.2025.03.27.09.39.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Mar 2025 09:39:03 -0700 (PDT) From: Alexander Baransky To: neil.armstrong@linaro.org, quic_jesszhan@quicinc.com, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, simona@ffwll.ch, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: Alexander Baransky , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Krzysztof Kozlowski Subject: [PATCH v2 1/2] dt-bindings: display: panel: Add Visionox G2647FB105 Date: Thu, 27 Mar 2025 19:37:44 +0300 Message-ID: <20250327163750.986815-2-sanyapilot496@gmail.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250327163750.986815-1-sanyapilot496@gmail.com> References: <20250327163750.986815-1-sanyapilot496@gmail.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Add a DT binding for the Visionox G2647FB105, 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) Xiaomi likes to use different panels in various revisions of the same device. A factory panel even can be replaced with another model in a service center. So, the power configuration of this panel is similar to some Samsung AMOLED panels, e.g. samsung,ams639rq08, which can be found on other sm7150 Xiaomi devices. Even though Samsung panels weren't used in sm7150-xiaomi-tucana and toco, the described voltage rails exist (confirmed by schematics of the device). Signed-off-by: Alexander Baransky Reviewed-by: Krzysztof Kozlowski --- .../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 + +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 + + 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>; + }; + }; + }; + }; + +... From patchwork Thu Mar 27 16:37:45 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Baransky X-Patchwork-Id: 14031295 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2B9E4C3600B for ; Thu, 27 Mar 2025 16:39:37 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 9AEEF10E922; Thu, 27 Mar 2025 16:39:36 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="B+KpKYxq"; dkim-atps=neutral Received: from mail-lf1-f66.google.com (mail-lf1-f66.google.com [209.85.167.66]) by gabe.freedesktop.org (Postfix) with ESMTPS id BA5CB10E922 for ; Thu, 27 Mar 2025 16:39:35 +0000 (UTC) Received: by mail-lf1-f66.google.com with SMTP id 2adb3069b0e04-5497590ffbbso1385644e87.1 for ; Thu, 27 Mar 2025 09:39:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1743093574; x=1743698374; darn=lists.freedesktop.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=CWj+oZ2EMXAKw1Ymrwp25R0LvcV47DCrjiccqcdcGrc=; b=B+KpKYxq+uX3pVwwXkip7dgDP0pW6HYGiem2JJacz7dV4KbpgnCxWdIEvsMzKhyRzZ fWmHfpMMIqStghbnh7LZSW75uNqkSWP5w7MprEBCKQSULKXGAQomMVCvxevU4/oKXAlb MBJmFbD8TP+WmK9Y6FmR8bExAm0FSTNr36DZObhut1jzSxSg2BKq4Ez/oL8IhHvC1b36 bd4UPg8h6OTD8nU6+s0p4sXpqSO1jzPbzwt5YzwKThfIIS6ZnhCS3j8j35FxIGLi1rDg g/PiPHxH4Y4q2XrKPYZdJNa3zNYxMRTpN7fC1Rjta6QP/tWk8r3SfdaDg+RBTVXplVBJ TESg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743093574; x=1743698374; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CWj+oZ2EMXAKw1Ymrwp25R0LvcV47DCrjiccqcdcGrc=; b=hrnIgvNjVZmvm4AdwvjqdDt3oZIJ51upgxhd/p+pPqLfrKc36RRT/O40/UfiFGcG5x W5TvvOOzkjsXKhJuQiSlE78CVeiwc4r1GtDzUkvCIbJySysAreRx2YJcA/Tz6m/vNzqu bB0qxkpAilhkIMSlHJFFRtW+vHu1uBjIkSMHVHK1cM3/h6yaeOvptemufstnn5NHDv62 GGC4oyyGM1Eg9qDu2BdVq/m7VRDPIbzW7MBYGvABHDUywdlRxd/ZMnZfLTtI1Ewa0aen zT8YChR1RnNaDeATZhYZwMwmB8OMkVWsPd9g2VNdzfSNpkymgjk73k4Eaql4uAdvj9P1 6AHA== X-Forwarded-Encrypted: i=1; AJvYcCXvJgm5mGH308Aqv4xOIbeo3l3YQbsZg/OGxY0QFUU96K0Xe4Hm3swkWDXZTdltFXSuZ52bdGXyIlw=@lists.freedesktop.org X-Gm-Message-State: AOJu0YzIyF5cYqYxMY6NWZhOQrqJ26cMOw6RXDgba4hyhOpNgqQ0E2v+ k7yxAJ3KNv2xBJdXUsMLodAVA5tfTUrYf/lfVl2gxfku0V/WLHRu X-Gm-Gg: ASbGncueq9BOfDvX8niB0L/ALgoZfoMdiCz98u+UZ/vs5jN5DkqwkWqKvOZ/7a8xpu2 gw76hi6kVHKWmo39dZNqqoYaFW9mAfXEAXPJgtGp+7E5OMKhjpiIPXycEKyHrWNT7S6MZdRJq9c +mGUkmgZV2v2NgXwK+GQHi/MaEq4lXvFyxmnI13VSr3Gy3GBWU+8LSXPpq15UnNwaXlsZBYGJJA xl62vcpJBKPMxpwePss6pMs5x5d3gemS8FrsdjhxmqnFgEjbqvErHoNEh8KcdUZsv+MCJHA5H7X hyfeUMfow3wYTU1Ea7wcbHfUYiket+efk8cmaKyaiosOHmqCUGiimPkNaw== X-Google-Smtp-Source: AGHT+IEQc9SjafjwgOphA4UvFg3uKCwFnBis8J9x5nKO8FZ2vwMXlomF6WTq15HIxrf4DeeD7E8pZQ== X-Received: by 2002:a05:6512:114f:b0:549:4f0e:8e28 with SMTP id 2adb3069b0e04-54b011d5825mr1934697e87.15.1743093573701; Thu, 27 Mar 2025 09:39:33 -0700 (PDT) Received: from pilotmaintrash.lan ([178.34.180.83]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54b0957feedsm10150e87.110.2025.03.27.09.39.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Mar 2025 09:39:32 -0700 (PDT) From: Alexander Baransky To: neil.armstrong@linaro.org, quic_jesszhan@quicinc.com, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, simona@ffwll.ch, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: Alexander Baransky , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 2/2] drm/panel: Add Visionox G2647FB105 panel driver Date: Thu, 27 Mar 2025 19:37:45 +0300 Message-ID: <20250327163750.986815-3-sanyapilot496@gmail.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250327163750.986815-1-sanyapilot496@gmail.com> References: <20250327163750.986815-1-sanyapilot496@gmail.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" 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 --- drivers/gpu/drm/panel/Kconfig | 9 + drivers/gpu/drm/panel/Makefile | 1 + .../gpu/drm/panel/panel-visionox-g2647fb105.c | 282 ++++++++++++++++++ 3 files changed, 292 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..c926ec16f67c --- /dev/null +++ b/drivers/gpu/drm/panel/panel-visionox-g2647fb105.c @@ -0,0 +1,282 @@ +// 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 + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +struct visionox_g2647fb105 { + struct drm_panel panel; + struct mipi_dsi_device *dsi; + struct gpio_desc *reset_gpio; + struct regulator_bulk_data *supplies; +}; + +static const struct regulator_bulk_data visionox_g2647fb105_supplies[] = { + { .supply = "vdd3p3" }, + { .supply = "vddio" }, + { .supply = "vsn" }, + { .supply = "vsp" }, +}; + +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(visionox_g2647fb105_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(visionox_g2647fb105_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(visionox_g2647fb105_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; + + ret = devm_regulator_bulk_get_const(dev, + ARRAY_SIZE(visionox_g2647fb105_supplies), + visionox_g2647fb105_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 "); +MODULE_DESCRIPTION("DRM driver for Visionox G2647FB105 AMOLED DSI panel"); +MODULE_LICENSE("GPL");