From nobody Tue Jun 9 01:01:39 2026 Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 38D96314D34 for ; Sun, 24 May 2026 19:45:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779651903; cv=none; b=tbyngl1J3FTZZ5tcGCvYhDlmoYjYLSrNiMfU7Tf3bZWaHLJgmRp7Pbxr2/ZjFQL7GVcrsKT+cT8D+7vkqxLaJeqlWW2mSh/wnPycU0/AByBxC1zkqyd+YJvzet4NbXgW0cjWcBFPTwERLDwFHR/dF9jKv/wi/Q0UrC40HcGrKtE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779651903; c=relaxed/simple; bh=S9yv0ppDny13+PFHIZntF7i0NLLrmOWsJlGQ0136268=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tKYVVm1dYpkatKQzFBpS+sI52hf+ee/A5CeiqzOp2ng98BeLrNt0oNQqi8y5uogQbO+WNQnxaDX5qPUbnjhrPmQQbVnP4T61fbdOkmzMDBXrJmnzAdbTwO0UHwLpmHK0XBat6fkovEDvhnmSEegW5J6cgRXyTFZLdyDz8dAb2QE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=HlfEX2kB; arc=none smtp.client-ip=209.85.128.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="HlfEX2kB" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-49041e84237so20305845e9.1 for ; Sun, 24 May 2026 12:45:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779651901; x=1780256701; darn=vger.kernel.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=+Y9GPXTLGAUIBWqeRqyMnJLPiEzYcwSV+9lPF8ht34M=; b=HlfEX2kB7WoIYFpXFN45JFc/yGSSoSp2kc91/cjtTj7lmKm6N36iUsD3jvzHS9ZyNq 2SLg6r4tGrYSe53AGIAwMB62VJ+PdBFYeJ4oqmU6keyvkRWEKtLcj5Yre8YXr5c3K9fH bxPVB8W8z0WJxBt6pYtsX8dm8XNJMt5wwRCqXktyw54qnuRSxUETq0DaaLHygbyRvHnJ uqBYtFuH+PaELqNmtP0Y+hokULAvR+VUIzp+NtIzT4/k43CVqjqg52OcWwkPK8Gkr6So n0HlbYHVQCF4jV4cD9h0r4pquQ6l7AWz7CmCLmPsqqTuyls7/OpJqsfGqpzlKvt3KBWC 1WNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779651901; x=1780256701; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=+Y9GPXTLGAUIBWqeRqyMnJLPiEzYcwSV+9lPF8ht34M=; b=ENfxueITW3fcuR2bzuSXivdmTtXa9n84s+d4ecF89kx+Okzdhj6k19tyn0X5KV/ELc sPZg+mb2tnFYVyeqT4lBKYX2WA83RtGVRbPJ4IPkskBsjgkFFMh4xV2N+NeheztCUoNS a7Cqun/4rXxcmAWXcQa4PelxooNI5T3IA96nNgGG8Jtu3YB40Riu1Y4HTwfATgpBs/9+ jVAi14OhGet11VDNop44GOSBp3kHI6ELaT0djIZiEMo9fTQ0IoJcsPw1UHgojKa7F32E lwg6RdJVvAKvZ4gor6cxflU+bMsdts43+AsiIa5KeupKpmL4bF+sSydEBBotJ2pKoLHs /oHg== X-Forwarded-Encrypted: i=1; AFNElJ83YaCTtkRP3CR58W3twSHFbLVc7U+6dMJug0/qhMOQSRIYoKVl4+IxomDIDz80lPvHT3ZKM56tIakcQ9g=@vger.kernel.org X-Gm-Message-State: AOJu0YzNG32ibYZcny5xc3g3mE6XBXQsEXbQsts+7OfDDHNYkNHiIFIN FzUr5aMBbZY+sYf3lVe5nmVYtfUF4z6SvuFWw7bKiN0XvzP3hRSYNATk X-Gm-Gg: Acq92OF/0GtQxCLlpSrM1tgYzUwfjbFbw+XvRfq20x2Eol1sScSywNblHN1ga6Ez2jm ouI+Cdh8HSl0arGJYHAmlOii07QBymO353mTim5vo8/4TE1Te70PV94Af7pFcg+iRmMFpVkzSAB umHZuLegeHPx/KgdAEL3dQIlKoe1jc+epsWStxpyRy6GfvvveVGg0AJX1Qn/cSuSzj1O+kO9F3t 8h8XQIfGtHWBYf8H0IC7pMbLTlyvgtww+YMG5x4k3GpFiAD6seUwgZxEovJ6rTAmG2iDvdKnFIt 4emULzTx8Ws+ixsljD8RXwy+YgUzeXIv65B2pt5I0lXt5Crmgu1oA7IxfFhOCgZ4ednx5p8fraB nQaYV6wjZ/+65sdpju5bL+CDAPzN4K753Ls/ABNlp+UAoPLHFWe5jdTDO3aW2YLCHS6/USC+sPS DSkopJtEUqZ0mf/LYBO58SH2u1b9Ykr3U= X-Received: by 2002:a05:600c:46cb:b0:48f:e044:927d with SMTP id 5b1f17b1804b1-49042480f2dmr161584355e9.10.1779651900589; Sun, 24 May 2026 12:45:00 -0700 (PDT) Received: from biju.lan ([2a00:23c4:a700:7301:ae73:a12b:ca55:91be]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49042cde62csm68224515e9.32.2026.05.24.12.44.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 24 May 2026 12:45:00 -0700 (PDT) From: Biju X-Google-Original-From: Biju To: Andrzej Hajda , Neil Armstrong , Robert Foss , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Geert Uytterhoeven , Magnus Damm Cc: Biju Das , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Tommaso Merciai , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Prabhakar Mahadev Lad , Biju Das , Conor Dooley Subject: [PATCH v2 1/2] dt-bindings: display: bridge: Document Renesas RZ/G3L LVDS encoder Date: Sun, 24 May 2026 20:44:50 +0100 Message-ID: <20260524194457.479681-2-biju.das.jz@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260524194457.479681-1-biju.das.jz@bp.renesas.com> References: <20260524194457.479681-1-biju.das.jz@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Biju Das Document the LVDS encoder IP found on the RZ/G3L SoC. It supports single-link mode. LVDS and the DSI interface share a peripheral clock and the MIPI_DSI_PRESET_N reset signal. However, the LVDS module cannot be used at the same time as MIPI-DSI. Signed-off-by: Tommaso Merciai Acked-by: Conor Dooley Signed-off-by: Biju Das Reviewed-by: Tommaso Merciai --- v2->v3: * No change. v1->v2: * Collected tag. --- .../bridge/renesas,r9a08g046-lvds.yaml | 128 ++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/bridge/renesa= s,r9a08g046-lvds.yaml diff --git a/Documentation/devicetree/bindings/display/bridge/renesas,r9a08= g046-lvds.yaml b/Documentation/devicetree/bindings/display/bridge/renesas,r= 9a08g046-lvds.yaml new file mode 100644 index 000000000000..b1f6d020ae7b --- /dev/null +++ b/Documentation/devicetree/bindings/display/bridge/renesas,r9a08g046-lv= ds.yaml @@ -0,0 +1,128 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/display/bridge/renesas,r9a08g046-lvds.y= aml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Renesas RZ/G3L LVDS Encoder + +maintainers: + - Biju Das + - Tommaso Merciai + +description: | + This binding describe the LVDS encoder embedded in the Renesas RZ/G3L + SoC. The encoder can operate in LVDS Single-link mode with 4 lanes + (Data) + 1 lane (Clock). + +properties: + compatible: + const: renesas,r9a08g046-lvds + + reg: + maxItems: 1 + + clocks: + items: + - description: Peripheral clock + - description: PHY clock + - description: Dot clock + + clock-names: + items: + - const: pclk + - const: phyclk + - const: dotclk + + resets: + items: + - description: LVDS_RESET_N + - description: MIPI_DSI_PRESET_N + - description: MIPI_DSI_CMN_RSTB + - description: MIPI_DSI_ARESET_N + + reset-names: + items: + - const: lvdrst + - const: prst + - const: rst + - const: arst + + power-domains: + maxItems: 1 + + ports: + $ref: /schemas/graph.yaml#/properties/ports + + properties: + port@0: + $ref: /schemas/graph.yaml#/properties/port + description: Input channel, directly connected to the Display Unit. + + port@1: + $ref: /schemas/graph.yaml#/properties/port + description: | + Output channel, directly connected to the LVDS panel or bridge. + + required: + - port@0 + - port@1 + +required: + - compatible + - reg + - clocks + - clock-names + - resets + - reset-names + - power-domains + - ports + +additionalProperties: false + +examples: + - | + #include + + lvds-cmn@108a0000 { + compatible =3D "renesas,r9a08g046-lvds-cmn", + "simple-mfd", "syscon"; + reg =3D <0x108a0000 0x10000>; + #address-cells =3D <1>; + #size-cells =3D <1>; + + lvds0: lvds@10 { + compatible =3D "renesas,r9a08g046-lvds"; + reg =3D <0x10 0x8>; + clocks =3D <&cpg CPG_MOD R9A08G046_MIPI_DSI_PCLK>, + <&cpg CPG_MOD R9A08G046_LVDS_PLLCLK>, + <&cpg CPG_MOD R9A08G046_LVDS_CLK_DOT0>; + clock-names =3D "pclk", "phyclk", "dotclk"; + resets =3D <&cpg R9A08G046_LVDS_RESET_N>, + <&cpg R9A08G046_MIPI_DSI_PRESET_N>, + <&cpg R9A08G046_MIPI_DSI_CMN_RSTB>, + <&cpg R9A08G046_MIPI_DSI_ARESET_N>; + reset-names =3D "lvdrst", "prst", "rst", "arst"; + power-domains =3D <&cpg>; + + ports { + #address-cells =3D <1>; + #size-cells =3D <0>; + + port@0 { + reg =3D <0>; + lvds0_in: endpoint { + remote-endpoint =3D <&du_out_lvds0>; + }; + }; + + port@1 { + reg =3D <1>; + lvds0_out: endpoint { + remote-endpoint =3D <&panel_in>; + }; + }; + }; + }; + }; +... --=20 2.43.0 From nobody Tue Jun 9 01:01:39 2026 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E8989317147 for ; Sun, 24 May 2026 19:45:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779651906; cv=none; b=LzOdQ/NhvmKhLy/2C+vSsh9Cr4W5TewoWG1zmgspu5KKjtzD41UIS5FMdYxghY8xo1vizE7mhvtnpXgIY+hoNuflKaxBSDEabavybG4L4gvYj3V1V7A7ycuEW3FuShwRhrsC2VQzF3OstGpBC8pocujcmd9GpcikPLUIjrNxDlI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779651906; c=relaxed/simple; bh=WAamu4c0D9yTt0/FpNfiGWwP/tuVYI2m9kzm+++wC2s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lUevwJqTxNJIYqSYZqy8FnT5AeFUvs+Sre/9Ve0zDfuRQ8ELwe3z9JVnrTu6IdhVd8P+9NbhOx9Zu2gMqlu5a8K/v1hsK+Z+cDTV1jFV7q8yaHI8zWQ81R12hz1Y1ckbALYn2sRnLJ/mCz1ozTI3Uh/C82WbXVgxxWFun8yHfYc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=KlSIQ7fg; arc=none smtp.client-ip=209.85.128.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="KlSIQ7fg" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-49056b9f04aso14120645e9.0 for ; Sun, 24 May 2026 12:45:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779651901; x=1780256701; darn=vger.kernel.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=B7w7L5X+8CgXQ2GRNFrqiEaxR/6ZtsuTgo7YyhEXHZE=; b=KlSIQ7fgE6NQVziuft959R/t+/AZg54sQYiuudFdryxdNTYcBGWbiS2WAcoT1T653S ijYz/yak9j3EqbWqHQQcCOkfweQbFolh3C+cU2LF+qgdyPF5CdjusHads/sDUY1s1iMc A+FyPlb1PJr0ZzT61CJPxoBhSuxMMYWJafnmiCrY2LKhRUzRurNdY7UbkiQmjbaKEQnR o/wcb3H0WqOB4tHCqgtTDW2ejTBRs7Hqkqu7G+3D19vpq2ivBIUg0I+R0TseMTJWAwvZ ub3yHuUoP3CyGM1icHp3wah0aFGx1Xh1LNJXYICOn08FQUlCy/wxkfWpK5+qF3BraBAI w2WQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779651901; x=1780256701; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=B7w7L5X+8CgXQ2GRNFrqiEaxR/6ZtsuTgo7YyhEXHZE=; b=YYfX+2TWilToev4Z307/fK4vtn6ZdMhkKxuuDW5dzL5PjN7F+xZ80AkPh8YSc/YjPg BuusdHPgFQahXhGDE/xAyg9XaAim2JmYujGqRlHzwzyWSxSgJKmqseGvI9slG6Nw2GRg bcomgjWuA1Wcphv2zayi+tUhTkojJta+gYn+mW0MJ+SyeWHbPNKaJJ5utzP7vDd3q1k+ 0ACn563Mj2vLNtl+yqxmlWoYr4nZh+7OXql0S7n7OVv4Fn0qv08YvvXBMRwL/u96IGTZ NxOlibF0yi87sPzEjiJqwzn77lYrpWtZUWDwcfehV/xsOoLPgeOEgarXDgXHOnghCNLj MWCg== X-Gm-Message-State: AOJu0YyFSnIQio7BP0PgF6BMpOqxeT3i4Po0bRaDIaKMR7tC2yRGkHoJ 3o6AAErIltSRkLx83cn+Zv8SZRg+c20GpXHWgIIzL5nPatr4vxm3+VFr X-Gm-Gg: Acq92OGKv2n8Y6Fe+2V2s226B5dIz6/Uv99+9FQk8+4QKyqFZhoDinPD7vArurXsTm+ s8333rm7mnrd8gIz7qGxUkpaXfALwKqewiraYJgiCinpyaVKA9MQr9w5nspUX++o9dV4cT9KJUJ vWUjNaZOgPqweTItSk5Y30yt5CtE//FfeEcmJTe6FoRLzylCevDXNUpgnMk+Bd8M7j3+yVNqrhf JxnNVkFfZBjaawob61GIv9/xIJ6drbNuvqcKQZTizNknh10fWV2G3iMjy88NycGiww/oYzw1+SC csa4wkGQ81FAOM1a+r7AZBnGBxlMz1J2YmwJt9QTkD7ca2BMzuHWNRSQCW2uNmy87EBGH53BdJG VNJgPRTPXmEU8y6MTqBzbLCO1RNNw380+1sniyu2YSWNExBe8Dxv8STetsT/d/PW6ErTi0BxEWz Ui8vFUL59yxqxaaKAu+UwPYZYhH2d/+YS1LI7qSmd4cw== X-Received: by 2002:a05:600c:444b:b0:490:388f:1c0d with SMTP id 5b1f17b1804b1-490424a9c9bmr198933185e9.5.1779651901308; Sun, 24 May 2026 12:45:01 -0700 (PDT) Received: from biju.lan ([2a00:23c4:a700:7301:ae73:a12b:ca55:91be]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49042cde62csm68224515e9.32.2026.05.24.12.45.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 24 May 2026 12:45:01 -0700 (PDT) From: Biju X-Google-Original-From: Biju To: Biju Das , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Philipp Zabel , Geert Uytterhoeven , Magnus Damm Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-renesas-soc@vger.kernel.org, Prabhakar Mahadev Lad , Biju Das , Tommaso Merciai Subject: [PATCH v2 2/2] drm: renesas: rz-du: Add support for RZ/G3L LVDS encoder Date: Sun, 24 May 2026 20:44:51 +0100 Message-ID: <20260524194457.479681-3-biju.das.jz@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260524194457.479681-1-biju.das.jz@bp.renesas.com> References: <20260524194457.479681-1-biju.das.jz@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Biju Das Add support for the RZ/G3L LVDS encoder driver. It operates in single-link mode with 4 lanes (Data) + 1 lane (Clock) and supports pixel clock rates from 25 to 87 MHz. The LVDS module cannot be used at the same time as MIPI-DSI. However, LVDS and the DSI interface share a peripheral clock and the MIPI_DSI_PRESET_N reset signal. Also, the MIPI_DSI_CMN_RSTB and MIPI_DSI_ARESET_N reset signals must be asserted before using the LVDS module. Signed-off-by: Tommaso Merciai Signed-off-by: Biju Das Reviewed-by: Tommaso Merciai Tested-by: Tommaso Merciai --- v2->v3: * Replace drm_atomic_state with drm_atomic_commit in rzg3l_lvds_atomic_{en,dis}able(). * Drop local variable ret and dev_err() messages in rzg3l_lvds_atomic_enable(); use WARN_ON() instead to capture unexpected failures since atomic_enable should not fail. * Drop local variable next_bridge from rzg3l_lvds_probe(). v1->v2: * Dropped unused function rzg3l_lvds_is_connected() and removed the=20 corresponding header file rzg3l_lvds.h * Dropped next_bridge from struct rzg3l_lvds instead using bridge's next_bridge. * Replaced pm_runtime_resume_and_get()->pm_runtime_get_sync() as atomic_enable doesn't fail and for each enable there always will be an atomic_disable() call. * Started using DEFINE_RUNTIME_DEV_PM_OPS for PM callback. * Replaced rzg3l_lvds_parse_dt() with devm_drm_of_get_bridge() in probe() * Started using reset_control_bulk_*() in rzg3l_lvds_pm_runtime_{suspend, resume}() --- drivers/gpu/drm/renesas/rz-du/Kconfig | 13 + drivers/gpu/drm/renesas/rz-du/Makefile | 1 + drivers/gpu/drm/renesas/rz-du/rzg3l_lvds.c | 277 ++++++++++++++++++ .../gpu/drm/renesas/rz-du/rzg3l_lvds_regs.h | 26 ++ 4 files changed, 317 insertions(+) create mode 100644 drivers/gpu/drm/renesas/rz-du/rzg3l_lvds.c create mode 100644 drivers/gpu/drm/renesas/rz-du/rzg3l_lvds_regs.h diff --git a/drivers/gpu/drm/renesas/rz-du/Kconfig b/drivers/gpu/drm/renesa= s/rz-du/Kconfig index 7f2ef7137ae5..cbfc7b6bccb8 100644 --- a/drivers/gpu/drm/renesas/rz-du/Kconfig +++ b/drivers/gpu/drm/renesas/rz-du/Kconfig @@ -26,3 +26,16 @@ config DRM_RZG2L_MIPI_DSI def_tristate DRM_RZG2L_DU depends on DRM_RZG2L_USE_MIPI_DSI select DRM_MIPI_DSI + +config DRM_RZG3L_USE_LVDS + bool "RZ/G3L DU LVDS Encoder Support" + depends on DRM_BRIDGE && OF + default DRM_RZG2L_DU + help + Enable support for the RZ/G3L Display Unit embedded LVDS encoders. + +config DRM_RZG3L_LVDS + def_tristate DRM_RZG2L_DU + depends on DRM_RZG3L_USE_LVDS + select DRM_KMS_HELPER + select DRM_PANEL diff --git a/drivers/gpu/drm/renesas/rz-du/Makefile b/drivers/gpu/drm/renes= as/rz-du/Makefile index 2987900ea6b6..46decb7ac4f1 100644 --- a/drivers/gpu/drm/renesas/rz-du/Makefile +++ b/drivers/gpu/drm/renesas/rz-du/Makefile @@ -8,3 +8,4 @@ rzg2l-du-drm-$(CONFIG_VIDEO_RENESAS_VSP1) +=3D rzg2l_du_vsp= .o obj-$(CONFIG_DRM_RZG2L_DU) +=3D rzg2l-du-drm.o =20 obj-$(CONFIG_DRM_RZG2L_MIPI_DSI) +=3D rzg2l_mipi_dsi.o +obj-$(CONFIG_DRM_RZG3L_LVDS) +=3D rzg3l_lvds.o diff --git a/drivers/gpu/drm/renesas/rz-du/rzg3l_lvds.c b/drivers/gpu/drm/r= enesas/rz-du/rzg3l_lvds.c new file mode 100644 index 000000000000..a51c3e5a2efe --- /dev/null +++ b/drivers/gpu/drm/renesas/rz-du/rzg3l_lvds.c @@ -0,0 +1,277 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * RZ/G3L LVDS Encoder Driver + * + * Copyright (C) 2026 Renesas Electronics Corporation + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "rzg3l_lvds_regs.h" + +enum rzg3l_lvds_mode { + RZG3L_LVDS_MODE_JEIDA =3D 0, + RZG3L_LVDS_MODE_JEIDA_MIRROR =3D 1, + RZG3L_LVDS_MODE_MODE2 =3D 2, + RZG3L_LVDS_MODE_MODE2_MIRROR =3D 3, + RZG3L_LVDS_MODE_VESA =3D 4, + RZG3L_LVDS_MODE_VESA_MIRROR =3D 5, + RZG3L_LVDS_MODE_MODE6 =3D 6, + RZG3L_LVDS_MODE_MODE6_MIRROR =3D 7, +}; + +struct rzg3l_lvds { + struct device *dev; + struct reset_control *prstc; + struct reset_control *lvd_rstc; + struct regmap *regmap; + struct drm_bridge bridge; +}; + +#define bridge_to_rzg3l_lvds(b) \ + container_of(b, struct rzg3l_lvds, bridge) + +/* -----------------------------------------------------------------------= ------ + * Bridge + */ + +static void rzg3l_lvds_atomic_enable(struct drm_bridge *bridge, + struct drm_atomic_commit *state) +{ + struct rzg3l_lvds *lvds =3D bridge_to_rzg3l_lvds(bridge); + const struct drm_bridge_state *bridge_state; + u32 fmt; + + /* Get the LVDS format from the bridge state. */ + bridge_state =3D drm_atomic_get_new_bridge_state(state, bridge); + if (WARN_ON(!bridge_state)) + return; + + switch (bridge_state->output_bus_cfg.format) { + case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA: + fmt =3D RZG3L_LVDS_MODE_JEIDA; + break; + case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG: + fmt =3D RZG3L_LVDS_MODE_VESA; + break; + default: + fmt =3D RZG3L_LVDS_MODE_VESA; + dev_warn(lvds->dev, "Unsupported bus fmt 0x%04x\n", + bridge_state->output_bus_cfg.format); + break; + } + + if (WARN_ON(pm_runtime_get_sync(lvds->dev) < 0)) + return; + + regmap_update_bits(lvds->regmap, LVDS_0_PHY_OFFSET, + LVDS_0_PHY_CH_EN_BGR, LVDS_0_PHY_CH_EN_BGR); + fsleep(20); + + regmap_update_bits(lvds->regmap, LVDS_0_PHY_OFFSET, + LVDS_0_PHY_CH_EN_LDO, LVDS_0_PHY_CH_EN_LDO); + fsleep(10); + + regmap_write(lvds->regmap, LVDS_CMN, LVDS_CMN_RST_PHY0_SEL); + regmap_update_bits(lvds->regmap, LVDS_0_CTL_OFFSET, + LVDS_0_CTL_FMT_SEL_MSK, + FIELD_PREP(LVDS_0_CTL_FMT_SEL_MSK, fmt)); + regmap_update_bits(lvds->regmap, LVDS_0_PHY_OFFSET, + LVDS_0_PHY_CH_IO_EN_MSK, LVDS_0_PHY_CH_IO_EN); + regmap_write(lvds->regmap, LVDS_CMN, + LVDS_CMN_RST_PHY0_SEL | LVDS_CMN_PHY_RESET); + fsleep(100); +} + +static void rzg3l_lvds_atomic_disable(struct drm_bridge *bridge, + struct drm_atomic_commit *state) +{ + struct rzg3l_lvds *lvds =3D bridge_to_rzg3l_lvds(bridge); + + regmap_update_bits(lvds->regmap, LVDS_CMN, LVDS_CMN_PHY_RESET, 0); + regmap_update_bits(lvds->regmap, LVDS_0_PHY_OFFSET, + LVDS_0_PHY_CH_IO_EN_MSK, 0); + regmap_update_bits(lvds->regmap, LVDS_0_PHY_OFFSET, + LVDS_0_PHY_CH_EN_LDO, 0); + regmap_update_bits(lvds->regmap, LVDS_0_PHY_OFFSET, + LVDS_0_PHY_CH_EN_BGR, 0); + + pm_runtime_put(lvds->dev); +} + +static int rzg3l_lvds_attach(struct drm_bridge *bridge, + struct drm_encoder *encoder, + enum drm_bridge_attach_flags flags) +{ + struct rzg3l_lvds *lvds =3D bridge_to_rzg3l_lvds(bridge); + + if (!lvds->bridge.next_bridge) + return 0; + + return drm_bridge_attach(encoder, lvds->bridge.next_bridge, bridge, flags= ); +} + +static enum drm_mode_status +rzg3l_lvds_bridge_mode_valid(struct drm_bridge *bridge, + const struct drm_display_info *info, + const struct drm_display_mode *mode) +{ + if (mode->clock > 87000) + return MODE_CLOCK_HIGH; + + if (mode->clock < 25000) + return MODE_CLOCK_LOW; + + return MODE_OK; +} + +static const struct drm_bridge_funcs rzg3l_lvds_bridge_ops =3D { + .attach =3D rzg3l_lvds_attach, + .atomic_duplicate_state =3D drm_atomic_helper_bridge_duplicate_state, + .atomic_destroy_state =3D drm_atomic_helper_bridge_destroy_state, + .atomic_reset =3D drm_atomic_helper_bridge_reset, + .atomic_enable =3D rzg3l_lvds_atomic_enable, + .atomic_disable =3D rzg3l_lvds_atomic_disable, + .mode_valid =3D rzg3l_lvds_bridge_mode_valid, +}; + +/* -----------------------------------------------------------------------= ------ + * Power Management + */ + +static int rzg3l_lvds_pm_runtime_suspend(struct device *dev) +{ + struct rzg3l_lvds *lvds =3D dev_get_drvdata(dev); + struct reset_control_bulk_data resets[] =3D { + { .rstc =3D lvds->lvd_rstc }, + { .rstc =3D lvds->prstc }, + }; + + return reset_control_bulk_assert(ARRAY_SIZE(resets), resets); +} + +static int rzg3l_lvds_pm_runtime_resume(struct device *dev) +{ + struct rzg3l_lvds *lvds =3D dev_get_drvdata(dev); + struct reset_control_bulk_data resets[] =3D { + { .rstc =3D lvds->lvd_rstc }, + { .rstc =3D lvds->prstc }, + }; + + return reset_control_bulk_deassert(ARRAY_SIZE(resets), resets); +} + +static DEFINE_RUNTIME_DEV_PM_OPS(rzg3l_lvds_pm_ops, + rzg3l_lvds_pm_runtime_suspend, + rzg3l_lvds_pm_runtime_resume, NULL); + +/* -----------------------------------------------------------------------= ------ + * Probe & Remove + */ + +static int rzg3l_lvds_probe(struct platform_device *pdev) +{ + struct reset_control *rstc, *arstc; + struct device *dev =3D &pdev->dev; + struct rzg3l_lvds *lvds; + int ret; + + lvds =3D devm_drm_bridge_alloc(dev, struct rzg3l_lvds, bridge, + &rzg3l_lvds_bridge_ops); + if (IS_ERR(lvds)) + return PTR_ERR(lvds); + + lvds->dev =3D dev; + lvds->bridge.of_node =3D pdev->dev.of_node; + + lvds->regmap =3D syscon_node_to_regmap(dev->of_node->parent); + if (IS_ERR(lvds->regmap)) + return PTR_ERR(lvds->regmap); + + rstc =3D devm_reset_control_get_optional_exclusive(dev, "rst"); + if (IS_ERR(rstc)) + return dev_err_probe(dev, PTR_ERR(rstc), "failed to get rst\n"); + + arstc =3D devm_reset_control_get_optional_exclusive(dev, "arst"); + if (IS_ERR(arstc)) + return dev_err_probe(dev, PTR_ERR(arstc), + "failed to get arst\n"); + + lvds->prstc =3D devm_reset_control_get_shared(dev, "prst"); + if (IS_ERR(lvds->prstc)) + return dev_err_probe(dev, PTR_ERR(lvds->prstc), + "failed to get prst\n"); + + lvds->lvd_rstc =3D devm_reset_control_get_shared(dev, "lvdrst"); + if (IS_ERR(lvds->lvd_rstc)) + return dev_err_probe(dev, PTR_ERR(lvds->lvd_rstc), + "failed to get core reset\n"); + + platform_set_drvdata(pdev, lvds); + ret =3D devm_pm_runtime_enable(dev); + if (ret) + return dev_err_probe(dev, ret, "Failed to enable Runtime PM\n"); + + lvds->bridge.next_bridge =3D devm_drm_of_get_bridge(dev, dev->of_node, 1,= 0); + if (IS_ERR(lvds->bridge.next_bridge)) + return dev_err_probe(dev, PTR_ERR(lvds->bridge.next_bridge), + "failed to get next bridge\n"); + + ret =3D reset_control_assert(rstc); + if (ret < 0) + return ret; + + ret =3D reset_control_assert(arstc); + if (ret < 0) + return ret; + + ret =3D devm_drm_bridge_add(dev, &lvds->bridge); + if (ret) + return dev_err_probe(dev, ret, + "Failed to register drm bridge\n"); + + return ret; +} + +static const struct of_device_id rzg3l_lvds_of_table[] =3D { + { .compatible =3D "renesas,r9a08g046-lvds" }, + { /* sentinel */ } +}; + +MODULE_DEVICE_TABLE(of, rzg3l_lvds_of_table); + +static struct platform_driver rzg3l_lvds_platform_driver =3D { + .probe =3D rzg3l_lvds_probe, + .driver =3D { + .name =3D "rzg3l-lvds", + .pm =3D pm_ptr(&rzg3l_lvds_pm_ops), + .of_match_table =3D rzg3l_lvds_of_table, + }, +}; + +module_platform_driver(rzg3l_lvds_platform_driver); + +MODULE_AUTHOR("Biju Das "); +MODULE_AUTHOR("Tommaso Merciai "); +MODULE_DESCRIPTION("Renesas RZ/G3L LVDS Encoder Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/gpu/drm/renesas/rz-du/rzg3l_lvds_regs.h b/drivers/gpu/= drm/renesas/rz-du/rzg3l_lvds_regs.h new file mode 100644 index 000000000000..281b7648f168 --- /dev/null +++ b/drivers/gpu/drm/renesas/rz-du/rzg3l_lvds_regs.h @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * RZ/G3L LVDS Interface Registers Definitions + * + * Copyright (C) 2026 Renesas Electronics Corporation + * + */ + +#ifndef __RZG3L_LVDS_REGS_H__ +#define __RZG3L_LVDS_REGS_H__ + +#define LVDS_CMN 0x00 +#define LVDS_CMN_RST_PHY0_SEL (1 << 24) +#define LVDS_CMN_RST_PHY0_SEL_CH0 (1 << 24) +#define LVDS_CMN_PHY_RESET (1 << 0) + +#define LVDS_0_PHY_OFFSET 0x10 +#define LVDS_0_PHY_CH_IO_EN_MSK (0x1f) +#define LVDS_0_PHY_CH_IO_EN (LVDS_0_PHY_CH_IO_EN_MSK << 0) +#define LVDS_0_PHY_CH_EN_BGR BIT(8) +#define LVDS_0_PHY_CH_EN_LDO BIT(9) + +#define LVDS_0_CTL_OFFSET 0x14 +#define LVDS_0_CTL_FMT_SEL_MSK GENMASK(23, 20) + +#endif /* __RZG3L_LVDS_REGS_H__ */ --=20 2.43.0