From nobody Mon Oct 6 15:25:14 2025 Received: from srv01.abscue.de (abscue.de [89.58.28.240]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 29A2F220F48; Sat, 19 Jul 2025 12:20:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=89.58.28.240 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752927640; cv=none; b=sD/2+Qi9AQ39Qj2jHxCB+9lUwOrkSgg4nVfCe+OiiAHIVsbLlwevGOQAsvkMxnHZS/9g/Rp0GbSA7ZBF99SR1QWoChDvtZttvRjFX/Z3hgZSU387EARs+rLxCXc1gyVuDaSHuWi2EgBqn8lG5i5RszTynP+hdYt4WvFhQlkSEqA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752927640; c=relaxed/simple; bh=Iq06pj5BoKotABug4YVe1ritLyVyzvXK5w1C7uMNt8s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qyWUKdN1cPLCxEueOnO2P02s5eGEfRdgT4v3A8OKibjxNWOFZM3IDZkLe1+ynVtfL/HUV7OWV/sq40AehkPneSXC+bNxAlqgS2G83xEfBHwEfPumkBj8xLWfGVuQLNsvbIdJmadvfKilqC8zxgbk/LQ6yfRuqAR82yA9hlMkhgs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=abscue.de; spf=pass smtp.mailfrom=abscue.de; arc=none smtp.client-ip=89.58.28.240 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=abscue.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=abscue.de Received: from srv01.abscue.de (localhost [127.0.0.1]) by spamfilter.srv.local (Postfix) with ESMTP id 88C661C00FF; Sat, 19 Jul 2025 14:11:28 +0200 (CEST) X-Spam-Level: Received: from fluffy-mammal.metal.fwg-cag.de (unknown [IPv6:2001:9e8:cdf7:4000:ceae:3606:9020:cd4f]) by srv01.abscue.de (Postfix) with ESMTPSA id E84721C025F; Sat, 19 Jul 2025 14:11:27 +0200 (CEST) From: =?utf-8?q?Otto_Pfl=C3=BCger?= Date: Sat, 19 Jul 2025 14:09:37 +0200 Subject: [PATCH 01/12] dt-bindings: display: sprd: adapt for UMS9230 support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250719-ums9230-drm-v1-1-e4344a05eb3d@abscue.de> References: <20250719-ums9230-drm-v1-0-e4344a05eb3d@abscue.de> In-Reply-To: <20250719-ums9230-drm-v1-0-e4344a05eb3d@abscue.de> To: David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Orson Zhai , Baolin Wang , Chunyan Zhang , Kevin Tang Cc: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Otto_Pfl=C3=BCger?= X-Mailer: b4 0.14.2 Add the compatible strings for the display controller found in the UMS9230 SoC and bindings for a gate clock. Add IOMMU-related bindings to the display-subsystem node. Signed-off-by: Otto Pfl=C3=BCger --- .../bindings/display/sprd/sprd,display-subsystem.yaml | 11 +++++++++++ .../bindings/display/sprd/sprd,sharkl3-dpu.yaml | 18 +++++++++++++-= ---- .../bindings/display/sprd/sprd,sharkl3-dsi-host.yaml | 11 ++++++++--- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/Documentation/devicetree/bindings/display/sprd/sprd,display-su= bsystem.yaml b/Documentation/devicetree/bindings/display/sprd/sprd,display-= subsystem.yaml index b3d5e1b96fae2f24ff2afb26c9c3ce0212856be4..d02f79c602f515533f60a993539= ed7cd82ce22ec 100644 --- a/Documentation/devicetree/bindings/display/sprd/sprd,display-subsystem= .yaml +++ b/Documentation/devicetree/bindings/display/sprd/sprd,display-subsystem= .yaml @@ -43,6 +43,17 @@ properties: compatible: const: sprd,display-subsystem =20 + iommus: + maxItems: 1 + + memory-region: + maxItems: 1 + description: + A phandle to the framebuffer region configured by the bootloader. Th= is + can be used together with an iommu-addresses property on the reserved + memory region to create an initial passthrough mapping for the boot + splash framebuffer. + ports: $ref: /schemas/types.yaml#/definitions/phandle-array items: diff --git a/Documentation/devicetree/bindings/display/sprd/sprd,sharkl3-dp= u.yaml b/Documentation/devicetree/bindings/display/sprd/sprd,sharkl3-dpu.ya= ml index 4ebea60b8c5ba5f177854e3a8d89e93e7304e18b..6fedb6e508b247eb71da17ced58= 9b8ed09085592 100644 --- a/Documentation/devicetree/bindings/display/sprd/sprd,sharkl3-dpu.yaml +++ b/Documentation/devicetree/bindings/display/sprd/sprd,sharkl3-dpu.yaml @@ -16,7 +16,12 @@ description: | =20 properties: compatible: - const: sprd,sharkl3-dpu + oneOf: + - items: + - enum: + - sprd,ums9230-dpu + - const: sprd,sharkl3-dpu + - const: sprd,sharkl3-dpu =20 reg: maxItems: 1 @@ -25,12 +30,15 @@ properties: maxItems: 1 =20 clocks: - minItems: 2 + minItems: 1 =20 clock-names: - items: - - const: clk_src_128m - - const: clk_src_384m + oneOf: + - items: + - const: clk_src_128m + - const: clk_src_384m + - items: + - const: enable =20 power-domains: maxItems: 1 diff --git a/Documentation/devicetree/bindings/display/sprd/sprd,sharkl3-ds= i-host.yaml b/Documentation/devicetree/bindings/display/sprd/sprd,sharkl3-d= si-host.yaml index bc5594d18643010b91376c92a8f235a522d7dc3d..8438d2da0a4277db03e30b13cb2= 70684c0c360cb 100644 --- a/Documentation/devicetree/bindings/display/sprd/sprd,sharkl3-dsi-host.= yaml +++ b/Documentation/devicetree/bindings/display/sprd/sprd,sharkl3-dsi-host.= yaml @@ -11,7 +11,9 @@ maintainers: =20 properties: compatible: - const: sprd,sharkl3-dsi-host + enum: + - sprd,sharkl3-dsi-host + - sprd,ums9230-dsi-host =20 reg: maxItems: 1 @@ -23,8 +25,11 @@ properties: minItems: 1 =20 clock-names: - items: - - const: clk_src_96m + oneOf: + - items: + - const: clk_src_96m + - items: + - const: enable =20 power-domains: maxItems: 1 --=20 2.50.0 From nobody Mon Oct 6 15:25:14 2025 Received: from srv01.abscue.de (abscue.de [89.58.28.240]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4479E285CB4; Sat, 19 Jul 2025 12:20:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=89.58.28.240 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752927641; cv=none; b=i5odBM5AhoFMvc1iearG/7hQlWqFI0zvBM3n4YVgcepokXd1KInfwFaZJNL96rkTv3Us60WYXdJStsb8FTnSjMR5ZQt74Z9KLIKNc12zOzM59l+Db2Oh/R0bd/9f6/5THzHdb67Yndetg6JMYbB7JTRW0lksPibThhg2EL90Nq0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752927641; c=relaxed/simple; bh=1M3u83jrpW6a7CtuwC4lCQ3tVKRNAt9Pdwr3OkRHSDA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DSDwdMbb6NhyZM0sORrjsbsCuc4EeOdp2olfHWm2RDNN8HLFCC6iJalKQ5IMiY2XDxj02GiStv+PzcAhTQ7FdaWJloFaH5hNIBRVtrDiYfAPoV5Rj0L7vvvJgkXAXY2HA+wKAvGehrmZ5mlia7l0XWWGcYCaPqdo3t4eJSu00tk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=abscue.de; spf=pass smtp.mailfrom=abscue.de; arc=none smtp.client-ip=89.58.28.240 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=abscue.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=abscue.de Received: from srv01.abscue.de (localhost [127.0.0.1]) by spamfilter.srv.local (Postfix) with ESMTP id 3EF061C025F; Sat, 19 Jul 2025 14:11:29 +0200 (CEST) X-Spam-Level: Received: from fluffy-mammal.metal.fwg-cag.de (unknown [IPv6:2001:9e8:cdf7:4000:ceae:3606:9020:cd4f]) by srv01.abscue.de (Postfix) with ESMTPSA id 977391C0628; Sat, 19 Jul 2025 14:11:28 +0200 (CEST) From: =?utf-8?q?Otto_Pfl=C3=BCger?= Date: Sat, 19 Jul 2025 14:09:38 +0200 Subject: [PATCH 02/12] dt-bindings: display: sprd: allow attaching a DSI panel Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250719-ums9230-drm-v1-2-e4344a05eb3d@abscue.de> References: <20250719-ums9230-drm-v1-0-e4344a05eb3d@abscue.de> In-Reply-To: <20250719-ums9230-drm-v1-0-e4344a05eb3d@abscue.de> To: David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Orson Zhai , Baolin Wang , Chunyan Zhang , Kevin Tang Cc: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Otto_Pfl=C3=BCger?= X-Mailer: b4 0.14.2 Add a DSI output port and include common DSI controller bindings in the bindings for the Unisoc DSI controller. Signed-off-by: Otto Pfl=C3=BCger --- .../display/sprd/sprd,sharkl3-dsi-host.yaml | 27 ++++++++++++++++--= ---- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/Documentation/devicetree/bindings/display/sprd/sprd,sharkl3-ds= i-host.yaml b/Documentation/devicetree/bindings/display/sprd/sprd,sharkl3-d= si-host.yaml index 8438d2da0a4277db03e30b13cb270684c0c360cb..d9a77f7228e145b955b57746967= e08e56f5a0c89 100644 --- a/Documentation/devicetree/bindings/display/sprd/sprd,sharkl3-dsi-host.= yaml +++ b/Documentation/devicetree/bindings/display/sprd/sprd,sharkl3-dsi-host.= yaml @@ -45,12 +45,22 @@ properties: const: 0 =20 port@0: - type: object - description: - A port node with endpoint definitions as defined in - Documentation/devicetree/bindings/media/video-interfaces.txt. - That port should be the input endpoint, usually coming from - the associated DPU. + $ref: /schemas/graph.yaml#/$defs/port-base + unevaluatedProperties: false + properties: + endpoint: + $ref: /schemas/media/video-interfaces.yaml# + unevaluatedProperties: false + description: The input endpoint, usually connected to the DPU + + port@1: + $ref: /schemas/graph.yaml#/$defs/port-base + unevaluatedProperties: false + properties: + endpoint: + $ref: /schemas/media/video-interfaces.yaml# + unevaluatedProperties: false + description: The output endpoint, usually connected to the pan= el =20 required: - "#address-cells" @@ -59,6 +69,9 @@ properties: =20 additionalProperties: false =20 +allOf: + - $ref: /schemas/display/dsi-controller.yaml# + required: - compatible - reg @@ -67,7 +80,7 @@ required: - clock-names - ports =20 -additionalProperties: false +unevaluatedProperties: false =20 examples: - | --=20 2.50.0 From nobody Mon Oct 6 15:25:14 2025 Received: from srv01.abscue.de (abscue.de [89.58.28.240]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 56E18285CB6; Sat, 19 Jul 2025 12:20:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=89.58.28.240 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752927640; cv=none; b=gyM/h4ef4ruj3CVkOESE/svyPy2X3Gy+JKdEUouiSNpQLB4PxqmXV6yG2vLYehLazr/UJE9c5uynF8AkKWAc9LVmxrA2VnoFxPnmI04842KilgiuwMbH+kXZcRUZLpo0MFszwaD+LnP/rHRaNpetpmhL41bPES62oJCAnr3K68c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752927640; c=relaxed/simple; bh=zjySMz+0/AYUyh6hSQ6Z7HdCkhoMYz0NaMLOFFvVLGc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=in4r/I8lH1TwzkDT76IJvxTwuF0+D+Vu2uj/ZhcEwFRCThwbJdnOhkydkJ/TERG+uLFvDYnnEFt4GicKSfKUqWOJ9dJ02zqGm5cZwqiEnoW3wEwlDEtrbHlYwK9TbpGFciSoi5tPbbu4DjTswup0vneOt5Eu2IuET18Ku2mf3eo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=abscue.de; spf=pass smtp.mailfrom=abscue.de; arc=none smtp.client-ip=89.58.28.240 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=abscue.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=abscue.de Received: from srv01.abscue.de (localhost [127.0.0.1]) by spamfilter.srv.local (Postfix) with ESMTP id E13BD1C0628; Sat, 19 Jul 2025 14:11:29 +0200 (CEST) X-Spam-Level: Received: from fluffy-mammal.metal.fwg-cag.de (unknown [IPv6:2001:9e8:cdf7:4000:ceae:3606:9020:cd4f]) by srv01.abscue.de (Postfix) with ESMTPSA id 4DA581C067F; Sat, 19 Jul 2025 14:11:29 +0200 (CEST) From: =?utf-8?q?Otto_Pfl=C3=BCger?= Date: Sat, 19 Jul 2025 14:09:39 +0200 Subject: [PATCH 03/12] drm: of: try binding port parent node instead of the port itself Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250719-ums9230-drm-v1-3-e4344a05eb3d@abscue.de> References: <20250719-ums9230-drm-v1-0-e4344a05eb3d@abscue.de> In-Reply-To: <20250719-ums9230-drm-v1-0-e4344a05eb3d@abscue.de> To: David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Orson Zhai , Baolin Wang , Chunyan Zhang , Kevin Tang Cc: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Otto_Pfl=C3=BCger?= X-Mailer: b4 0.14.2 The drm_of_component_probe function is intended to bind all devices in an OF graph given a set of ports linked using the "ports" property on a main device node. This means that it should also bind the components providing these ports, not just the components of other ports connected to them. In order to do this, it calls drm_of_component_match_add with a pointer to each port node after checking that its parent node is a device. However, when given a pointer to the port node, the compare_of callback does not match it with a device node and thus fails to detect that the node belongs to a component. Fix this by passing a pointer to the parent node here too. Currently only the Unisoc platform driver relies on this feature, which was previously broken and is fixed by this change. On other platforms, the "ports" property points to ports that are not part of a component, i.e. the components only have indirect connections to the main node. Signed-off-by: Otto Pfl=C3=BCger --- drivers/gpu/drm/drm_of.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c index d0183dea770308e77f05da364ffe087d53f3be36..b972facc2ec3fe40a4e10b5d717= 8b5ac8c0158d5 100644 --- a/drivers/gpu/drm/drm_of.c +++ b/drivers/gpu/drm/drm_of.c @@ -132,7 +132,7 @@ int drm_of_component_probe(struct device *dev, =20 if (of_device_is_available(port->parent)) drm_of_component_match_add(dev, &match, compare_of, - port); + port->parent); =20 of_node_put(port); } --=20 2.50.0 From nobody Mon Oct 6 15:25:14 2025 Received: from srv01.abscue.de (abscue.de [89.58.28.240]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 29AA2285C99; Sat, 19 Jul 2025 12:20:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=89.58.28.240 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752927640; cv=none; b=Xst0Z+bzlBxYxxcqrGqs7EmT8OV0R78TUhOd391zrz/s/iscneUkFzp13+7bzm4awssGff6HT+jxBeYG2Na7hM1h9gHXN9Vc9E93sCjiF92Y3z76QRq++QlBWcq7Lox/LCFQTDEu2TmXjlPEy7ZTODrpnIeTVf/j0kVbhJse+Gs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752927640; c=relaxed/simple; bh=7zQVZxclqEAxO9auvvhhb/M0VjFV62I5c4EKcIGwF90=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RHgd9UGgUZTttvL8DVCNUBw+MuYbn2xiwJQtzbXWEEmz8uCcTF8DE+ENRXOQ5X0BnpUBuyyVkjDXk9yEdG4LBs3/s2gx0LmPgqo0icZlx+hKZKDEn/e97I5BCXtTm5NSLoXzzMMFZDYHjFhY54xAXuOtCF9/ZgqW2UE56pppEmY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=abscue.de; spf=pass smtp.mailfrom=abscue.de; arc=none smtp.client-ip=89.58.28.240 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=abscue.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=abscue.de Received: from srv01.abscue.de (localhost [127.0.0.1]) by spamfilter.srv.local (Postfix) with ESMTP id 8FB2C1C067F; Sat, 19 Jul 2025 14:11:30 +0200 (CEST) X-Spam-Level: Received: from fluffy-mammal.metal.fwg-cag.de (unknown [IPv6:2001:9e8:cdf7:4000:ceae:3606:9020:cd4f]) by srv01.abscue.de (Postfix) with ESMTPSA id F10F21C0680; Sat, 19 Jul 2025 14:11:29 +0200 (CEST) From: =?utf-8?q?Otto_Pfl=C3=BCger?= Date: Sat, 19 Jul 2025 14:09:40 +0200 Subject: [PATCH 04/12] drm: sprd: remove plane and crtc destroy callbacks Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250719-ums9230-drm-v1-4-e4344a05eb3d@abscue.de> References: <20250719-ums9230-drm-v1-0-e4344a05eb3d@abscue.de> In-Reply-To: <20250719-ums9230-drm-v1-0-e4344a05eb3d@abscue.de> To: David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Orson Zhai , Baolin Wang , Chunyan Zhang , Kevin Tang Cc: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Otto_Pfl=C3=BCger?= X-Mailer: b4 0.14.2 These callbacks are now required to be NULL and trigger a runtime warning if they are present. Signed-off-by: Otto Pfl=C3=BCger --- drivers/gpu/drm/sprd/sprd_dpu.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/gpu/drm/sprd/sprd_dpu.c b/drivers/gpu/drm/sprd/sprd_dp= u.c index a3447622a33cd612e34be038e833222567bdcd2c..0d9eb778794d92418b39f8535d9= 4abde3566de43 100644 --- a/drivers/gpu/drm/sprd/sprd_dpu.c +++ b/drivers/gpu/drm/sprd/sprd_dpu.c @@ -577,7 +577,6 @@ static const struct drm_plane_helper_funcs sprd_plane_h= elper_funcs =3D { static const struct drm_plane_funcs sprd_plane_funcs =3D { .update_plane =3D drm_atomic_helper_update_plane, .disable_plane =3D drm_atomic_helper_disable_plane, - .destroy =3D drm_plane_cleanup, .reset =3D drm_atomic_helper_plane_reset, .atomic_duplicate_state =3D drm_atomic_helper_plane_duplicate_state, .atomic_destroy_state =3D drm_atomic_helper_plane_destroy_state, @@ -704,7 +703,6 @@ static const struct drm_crtc_helper_funcs sprd_crtc_hel= per_funcs =3D { }; =20 static const struct drm_crtc_funcs sprd_crtc_funcs =3D { - .destroy =3D drm_crtc_cleanup, .set_config =3D drm_atomic_helper_set_config, .page_flip =3D drm_atomic_helper_page_flip, .reset =3D drm_atomic_helper_crtc_reset, --=20 2.50.0 From nobody Mon Oct 6 15:25:14 2025 Received: from srv01.abscue.de (abscue.de [89.58.28.240]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 584E32264C0; Sat, 19 Jul 2025 12:11:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=89.58.28.240 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752927101; cv=none; b=T9yUSnzSWHm70B6TvAogm8gRxzNn+21XJF+AoZQtDoQTj0mgUUXj1blAA7uMOf6f3Y3f89fBb5wji3TA10XEVQ+bPmRB3b7l2vVaXBI45O9ipmuUkq9dHEZLcWM4w3qwRMvaTS0ztg1Uho9I2QmQsaRQwvVc+JKVMrCAwUBLXSE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752927101; c=relaxed/simple; bh=ol/jEr7fVIMqL7/8fIdHMQ25HOjt0SDrl16MqQvYQ6g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JHNmzXFXQ4mrX67He/a3V4SxYo971EZAUOd2rrnnLvLvq7d9snwsO9erd4+wUXLpNtaML3rNsNBa1qIeKsaxKfvDmWuiX11FsMPIRuwOFQtxoTw5JbAmHFdqnCNWsZXua7DHokv3m+lS2slLkv3uyqaoLckWeLuwKz2kuN91VcM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=abscue.de; spf=pass smtp.mailfrom=abscue.de; arc=none smtp.client-ip=89.58.28.240 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=abscue.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=abscue.de Received: from srv01.abscue.de (localhost [127.0.0.1]) by spamfilter.srv.local (Postfix) with ESMTP id 3FFEE1C0680; Sat, 19 Jul 2025 14:11:31 +0200 (CEST) X-Spam-Level: Received: from fluffy-mammal.metal.fwg-cag.de (unknown [IPv6:2001:9e8:cdf7:4000:ceae:3606:9020:cd4f]) by srv01.abscue.de (Postfix) with ESMTPSA id 9F0351C06A3; Sat, 19 Jul 2025 14:11:30 +0200 (CEST) From: =?utf-8?q?Otto_Pfl=C3=BCger?= Date: Sat, 19 Jul 2025 14:09:41 +0200 Subject: [PATCH 05/12] drm: sprd: register a DSI bridge and move init code to pre_enable Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250719-ums9230-drm-v1-5-e4344a05eb3d@abscue.de> References: <20250719-ums9230-drm-v1-0-e4344a05eb3d@abscue.de> In-Reply-To: <20250719-ums9230-drm-v1-0-e4344a05eb3d@abscue.de> To: David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Orson Zhai , Baolin Wang , Chunyan Zhang , Kevin Tang Cc: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Otto_Pfl=C3=BCger?= X-Mailer: b4 0.14.2 If a panel needs to send DSI commands during initialization, it sets the prepare_prev_first flag, which allows the DSI host to initialize itself before the panel's prepare function is called. To support this, the DSI host must register a bridge and perform the necessary initialization steps in its pre_enable function. Implement this for the Unisoc DSI driver by moving the initialization code from the encoder callbacks to a bridge and simplify the remaining encoder-related code which no longer needs any callbacks. Signed-off-by: Otto Pfl=C3=BCger --- drivers/gpu/drm/sprd/Kconfig | 2 + drivers/gpu/drm/sprd/sprd_dsi.c | 143 +++++++++++++++++++++++++-----------= ---- drivers/gpu/drm/sprd/sprd_dsi.h | 4 ++ 3 files changed, 97 insertions(+), 52 deletions(-) diff --git a/drivers/gpu/drm/sprd/Kconfig b/drivers/gpu/drm/sprd/Kconfig index e22b780fe82248296a7153d02269faf8cd63294f..1afcdbf6f0ee3304f2297835241= c9bb10d422154 100644 --- a/drivers/gpu/drm/sprd/Kconfig +++ b/drivers/gpu/drm/sprd/Kconfig @@ -2,6 +2,8 @@ config DRM_SPRD tristate "DRM Support for Unisoc SoCs Platform" depends on ARCH_SPRD || COMPILE_TEST depends on DRM && OF + select DRM_BRIDGE_CONNECTOR + select DRM_DISPLAY_HELPER select DRM_GEM_DMA_HELPER select DRM_KMS_HELPER select DRM_MIPI_DSI diff --git a/drivers/gpu/drm/sprd/sprd_dsi.c b/drivers/gpu/drm/sprd/sprd_ds= i.c index 23b0e1dc547a5023ee6ad7d5e1c49e2cec986bf0..43fff12d73f12619da57606a3c4= 785924e2c1507 100644 --- a/drivers/gpu/drm/sprd/sprd_dsi.c +++ b/drivers/gpu/drm/sprd/sprd_dsi.c @@ -11,8 +11,10 @@ =20 #include #include +#include #include #include +#include =20 #include "sprd_drm.h" #include "sprd_dpu.h" @@ -778,19 +780,53 @@ static void sprd_dphy_fini(struct dsi_context *ctx) dsi_reg_up(ctx, PHY_INTERFACE_CTRL, RF_PHY_RESET_N, RF_PHY_RESET_N); } =20 -static void sprd_dsi_encoder_mode_set(struct drm_encoder *encoder, - struct drm_display_mode *mode, - struct drm_display_mode *adj_mode) +static int sprd_dsi_encoder_init(struct sprd_dsi *dsi, + struct device *dev) +{ + struct drm_encoder *encoder =3D &dsi->encoder; + u32 crtc_mask; + int ret; + + crtc_mask =3D drm_of_find_possible_crtcs(dsi->drm, dev->of_node); + if (!crtc_mask) { + drm_err(dsi->drm, "failed to find crtc mask\n"); + return -EINVAL; + } + + drm_dbg(dsi->drm, "find possible crtcs: 0x%08x\n", crtc_mask); + + encoder->possible_crtcs =3D crtc_mask; + ret =3D drm_simple_encoder_init(dsi->drm, encoder, DRM_MODE_ENCODER_DSI); + if (ret) { + drm_err(dsi->drm, "failed to init dsi encoder\n"); + return ret; + } + + return 0; +} + +static int sprd_dsi_bridge_attach(struct drm_bridge *bridge, + struct drm_encoder *encoder, + enum drm_bridge_attach_flags flags) +{ + struct sprd_dsi *dsi =3D bridge_to_dsi(bridge); + + return drm_bridge_attach(&dsi->encoder, dsi->panel_bridge, + bridge, flags); +} + +static void sprd_dsi_bridge_mode_set(struct drm_bridge *bridge, + const struct drm_display_mode *mode, + const struct drm_display_mode *adj_mode) { - struct sprd_dsi *dsi =3D encoder_to_dsi(encoder); + struct sprd_dsi *dsi =3D bridge_to_dsi(bridge); =20 drm_display_mode_to_videomode(adj_mode, &dsi->ctx.vm); } =20 -static void sprd_dsi_encoder_enable(struct drm_encoder *encoder) +static void sprd_dsi_bridge_pre_enable(struct drm_bridge *bridge) { - struct sprd_dsi *dsi =3D encoder_to_dsi(encoder); - struct sprd_dpu *dpu =3D to_sprd_crtc(encoder->crtc); + struct sprd_dsi *dsi =3D bridge_to_dsi(bridge); struct dsi_context *ctx =3D &dsi->ctx; =20 if (ctx->enabled) { @@ -819,15 +855,15 @@ static void sprd_dsi_encoder_enable(struct drm_encode= r *encoder) dphy_wait_pll_locked(ctx); } =20 - sprd_dpu_run(dpu); + /* DSI commands cannot be issued unless the DPU is running. */ + sprd_dpu_run(to_sprd_crtc(dsi->encoder.crtc)); =20 ctx->enabled =3D true; } =20 -static void sprd_dsi_encoder_disable(struct drm_encoder *encoder) +static void sprd_dsi_bridge_post_disable(struct drm_bridge *bridge) { - struct sprd_dsi *dsi =3D encoder_to_dsi(encoder); - struct sprd_dpu *dpu =3D to_sprd_crtc(encoder->crtc); + struct sprd_dsi *dsi =3D bridge_to_dsi(bridge); struct dsi_context *ctx =3D &dsi->ctx; =20 if (!ctx->enabled) { @@ -835,51 +871,21 @@ static void sprd_dsi_encoder_disable(struct drm_encod= er *encoder) return; } =20 - sprd_dpu_stop(dpu); + sprd_dpu_stop(to_sprd_crtc(dsi->encoder.crtc)); + sprd_dphy_fini(ctx); sprd_dsi_fini(ctx); =20 ctx->enabled =3D false; } =20 -static const struct drm_encoder_helper_funcs sprd_encoder_helper_funcs =3D= { - .mode_set =3D sprd_dsi_encoder_mode_set, - .enable =3D sprd_dsi_encoder_enable, - .disable =3D sprd_dsi_encoder_disable +static const struct drm_bridge_funcs sprd_dsi_bridge_funcs =3D { + .attach =3D sprd_dsi_bridge_attach, + .mode_set =3D sprd_dsi_bridge_mode_set, + .pre_enable =3D sprd_dsi_bridge_pre_enable, + .post_disable =3D sprd_dsi_bridge_post_disable, }; =20 -static const struct drm_encoder_funcs sprd_encoder_funcs =3D { - .destroy =3D drm_encoder_cleanup, -}; - -static int sprd_dsi_encoder_init(struct sprd_dsi *dsi, - struct device *dev) -{ - struct drm_encoder *encoder =3D &dsi->encoder; - u32 crtc_mask; - int ret; - - crtc_mask =3D drm_of_find_possible_crtcs(dsi->drm, dev->of_node); - if (!crtc_mask) { - drm_err(dsi->drm, "failed to find crtc mask\n"); - return -EINVAL; - } - - drm_dbg(dsi->drm, "find possible crtcs: 0x%08x\n", crtc_mask); - - encoder->possible_crtcs =3D crtc_mask; - ret =3D drm_encoder_init(dsi->drm, encoder, &sprd_encoder_funcs, - DRM_MODE_ENCODER_DSI, NULL); - if (ret) { - drm_err(dsi->drm, "failed to init dsi encoder\n"); - return ret; - } - - drm_encoder_helper_add(encoder, &sprd_encoder_helper_funcs); - - return 0; -} - static int sprd_dsi_bridge_init(struct sprd_dsi *dsi, struct device *dev) { @@ -889,11 +895,35 @@ static int sprd_dsi_bridge_init(struct sprd_dsi *dsi, if (IS_ERR(dsi->panel_bridge)) return PTR_ERR(dsi->panel_bridge); =20 - ret =3D drm_bridge_attach(&dsi->encoder, dsi->panel_bridge, NULL, 0); + dsi->bridge.funcs =3D &sprd_dsi_bridge_funcs; + dsi->bridge.of_node =3D dev->of_node; + dsi->bridge.type =3D DRM_MODE_CONNECTOR_DSI; + + drm_bridge_add(&dsi->bridge); + + ret =3D drm_bridge_attach(&dsi->encoder, &dsi->bridge, NULL, + DRM_BRIDGE_ATTACH_NO_CONNECTOR); if (ret) - return ret; + goto err_cleanup; + + dsi->connector =3D drm_bridge_connector_init(dsi->drm, &dsi->encoder); + if (IS_ERR(dsi->connector)) { + drm_err(dsi->drm, "Unable to create bridge connector\n"); + ret =3D PTR_ERR(dsi->connector); + goto err_cleanup; + } + + ret =3D drm_connector_attach_encoder(dsi->connector, &dsi->encoder); + if (ret < 0) + goto err_cleanup; =20 return 0; + +err_cleanup: + drm_bridge_remove(&dsi->bridge); + drm_of_panel_bridge_remove(dev->of_node, 1, 0); + + return ret; } =20 static int sprd_dsi_context_init(struct sprd_dsi *dsi, @@ -940,13 +970,21 @@ static int sprd_dsi_bind(struct device *dev, struct d= evice *master, void *data) =20 ret =3D sprd_dsi_bridge_init(dsi, dev); if (ret) - return ret; + goto err_cleanup_encoder; =20 ret =3D sprd_dsi_context_init(dsi, dev); if (ret) - return ret; + goto err_cleanup_bridge; =20 return 0; + +err_cleanup_encoder: + drm_encoder_cleanup(&dsi->encoder); +err_cleanup_bridge: + drm_bridge_remove(&dsi->bridge); + drm_of_panel_bridge_remove(dev->of_node, 1, 0); + + return ret; } =20 static void sprd_dsi_unbind(struct device *dev, @@ -954,6 +992,7 @@ static void sprd_dsi_unbind(struct device *dev, { struct sprd_dsi *dsi =3D dev_get_drvdata(dev); =20 + drm_bridge_remove(&dsi->bridge); drm_of_panel_bridge_remove(dev->of_node, 1, 0); =20 drm_encoder_cleanup(&dsi->encoder); diff --git a/drivers/gpu/drm/sprd/sprd_dsi.h b/drivers/gpu/drm/sprd/sprd_ds= i.h index d858ebb111150546e99403a87bc7cea42cad0158..f18f7398df6fa995df7ec2c59cf= 5c2745fbd28bd 100644 --- a/drivers/gpu/drm/sprd/sprd_dsi.h +++ b/drivers/gpu/drm/sprd/sprd_dsi.h @@ -18,6 +18,8 @@ #include #include =20 +#define bridge_to_dsi(bridge) \ + container_of(bridge, struct sprd_dsi, bridge) #define encoder_to_dsi(encoder) \ container_of(encoder, struct sprd_dsi, encoder) =20 @@ -116,7 +118,9 @@ struct sprd_dsi { struct mipi_dsi_host host; struct mipi_dsi_device *slave; struct drm_encoder encoder; + struct drm_bridge bridge; struct drm_bridge *panel_bridge; + struct drm_connector *connector; struct dsi_context ctx; }; =20 --=20 2.50.0 From nobody Mon Oct 6 15:25:14 2025 Received: from srv01.abscue.de (abscue.de [89.58.28.240]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 58484221F01; Sat, 19 Jul 2025 12:11:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=89.58.28.240 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752927101; cv=none; b=Us4kb8qE4Dh6oA5+/5R1wArmzdnz016GnbM3LeAQWFQGSshVEiqXdyr+YL6uYiT61/pgaTnn5wDdAAOkmeTD4gDQ+CP4JWIaXFVolR+ZXy2JlioJd2MbUjjUD/sJ8K3ntimgPKlwSIyHqO0ILYBHqwIKUoR9mtvWqq6DtQ6cNaQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752927101; c=relaxed/simple; bh=d7b0NQklUbd30khoRMPI/W98vBf/gSQuiHhpGKkYHPs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mbPCd1ShOQoj5UHtFkk03i7C9Cntd1RIcnebi644/CkeTK7DfVbtJfxzNdIQGEOMdNfMz4GG71BYisheGw89Hxd9/A64hN9U557xhAdzvaKGdPp3mepOeux8qzelSI0JSY8pYqDRAFceoLoMa5jUqmEQyF7d7OyvhG2EP7iBr5c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=abscue.de; spf=pass smtp.mailfrom=abscue.de; arc=none smtp.client-ip=89.58.28.240 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=abscue.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=abscue.de Received: from srv01.abscue.de (localhost [127.0.0.1]) by spamfilter.srv.local (Postfix) with ESMTP id DDCA81C06A3; Sat, 19 Jul 2025 14:11:31 +0200 (CEST) X-Spam-Level: Received: from fluffy-mammal.metal.fwg-cag.de (unknown [IPv6:2001:9e8:cdf7:4000:ceae:3606:9020:cd4f]) by srv01.abscue.de (Postfix) with ESMTPSA id 4E1BC1C06E1; Sat, 19 Jul 2025 14:11:31 +0200 (CEST) From: =?utf-8?q?Otto_Pfl=C3=BCger?= Date: Sat, 19 Jul 2025 14:09:42 +0200 Subject: [PATCH 06/12] drm: sprd: add support for UMS9230 DSI PLL Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250719-ums9230-drm-v1-6-e4344a05eb3d@abscue.de> References: <20250719-ums9230-drm-v1-0-e4344a05eb3d@abscue.de> In-Reply-To: <20250719-ums9230-drm-v1-0-e4344a05eb3d@abscue.de> To: David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Orson Zhai , Baolin Wang , Chunyan Zhang , Kevin Tang Cc: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Otto_Pfl=C3=BCger?= X-Mailer: b4 0.14.2 Move platform-specific PLL parameters to the device tree match data and add the parameters for UMS9230. Signed-off-by: Otto Pfl=C3=BCger --- drivers/gpu/drm/sprd/megacores_pll.c | 21 ++++++++------------- drivers/gpu/drm/sprd/sprd_dsi.c | 21 ++++++++++++++++++++- drivers/gpu/drm/sprd/sprd_dsi.h | 9 ++++++++- 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/sprd/megacores_pll.c b/drivers/gpu/drm/sprd/me= gacores_pll.c index 3091dfdc11e3b547a05a9edaa4047a1e367c1596..e5a18599678ab6e3771cd732dcc= a409ab2d59f72 100644 --- a/drivers/gpu/drm/sprd/megacores_pll.c +++ b/drivers/gpu/drm/sprd/megacores_pll.c @@ -21,12 +21,6 @@ =20 #define AVERAGE(a, b) (min(a, b) + abs((b) - (a)) / 2) =20 -/* sharkle */ -#define VCO_BAND_LOW 750 -#define VCO_BAND_MID 1100 -#define VCO_BAND_HIGH 1500 -#define PHY_REF_CLK 26000 - static int dphy_calc_pll_param(struct dphy_pll *pll) { const u32 khz =3D 1000; @@ -36,11 +30,10 @@ static int dphy_calc_pll_param(struct dphy_pll *pll) int i; =20 pll->potential_fvco =3D pll->freq / khz; - pll->ref_clk =3D PHY_REF_CLK / khz; =20 for (i =3D 0; i < 4; ++i) { - if (pll->potential_fvco >=3D VCO_BAND_LOW && - pll->potential_fvco <=3D VCO_BAND_HIGH) { + if (pll->potential_fvco >=3D pll->platform->band_low && + pll->potential_fvco <=3D pll->platform->band_high) { pll->fvco =3D pll->potential_fvco; pll->out_sel =3D BIT(i); break; @@ -50,21 +43,23 @@ static int dphy_calc_pll_param(struct dphy_pll *pll) if (pll->fvco =3D=3D 0) return -EINVAL; =20 - if (pll->fvco >=3D VCO_BAND_LOW && pll->fvco <=3D VCO_BAND_MID) { + if (pll->fvco >=3D pll->platform->band_low && + pll->fvco <=3D pll->platform->band_mid) { /* vco band control */ pll->vco_band =3D 0x0; /* low pass filter control */ pll->lpf_sel =3D 1; - } else if (pll->fvco > VCO_BAND_MID && pll->fvco <=3D VCO_BAND_HIGH) { + } else if (pll->fvco > pll->platform->band_mid && + pll->fvco <=3D pll->platform->band_high) { pll->vco_band =3D 0x1; pll->lpf_sel =3D 0; } else { return -EINVAL; } =20 - pll->nint =3D pll->fvco / pll->ref_clk; + pll->nint =3D pll->fvco / pll->platform->ref_clk; tmp =3D pll->fvco * factor * mhz; - do_div(tmp, pll->ref_clk); + do_div(tmp, pll->platform->ref_clk); tmp =3D tmp - pll->nint * factor * mhz; tmp *=3D BIT(20); do_div(tmp, 100000000); diff --git a/drivers/gpu/drm/sprd/sprd_dsi.c b/drivers/gpu/drm/sprd/sprd_ds= i.c index 43fff12d73f12619da57606a3c4785924e2c1507..db5f9bcbb2500096402b9d44b9c= c4428070e69ba 100644 --- a/drivers/gpu/drm/sprd/sprd_dsi.c +++ b/drivers/gpu/drm/sprd/sprd_dsi.c @@ -1061,8 +1061,23 @@ static const struct mipi_dsi_host_ops sprd_dsi_host_= ops =3D { .transfer =3D sprd_dsi_host_transfer, }; =20 +static const struct dphy_pll_platform dphy_pll_sharkl3 =3D { + .band_low =3D 750, + .band_mid =3D 1100, + .band_high =3D 1500, + .ref_clk =3D 26, +}; + +static const struct dphy_pll_platform dphy_pll_ums9230 =3D { + .band_low =3D 1250, + .band_mid =3D 1800, + .band_high =3D 2500, + .ref_clk =3D 26, +}; + static const struct of_device_id dsi_match_table[] =3D { - { .compatible =3D "sprd,sharkl3-dsi-host" }, + { .compatible =3D "sprd,sharkl3-dsi-host", .data =3D &dphy_pll_sharkl3 }, + { .compatible =3D "sprd,ums9230-dsi-host", .data =3D &dphy_pll_ums9230 }, { /* sentinel */ }, }; =20 @@ -1080,6 +1095,10 @@ static int sprd_dsi_probe(struct platform_device *pd= ev) dsi->host.ops =3D &sprd_dsi_host_ops; dsi->host.dev =3D dev; =20 + dsi->ctx.pll.platform =3D of_device_get_match_data(dev); + if (!dsi->ctx.pll.platform) + return -EINVAL; + return mipi_dsi_host_register(&dsi->host); } =20 diff --git a/drivers/gpu/drm/sprd/sprd_dsi.h b/drivers/gpu/drm/sprd/sprd_ds= i.h index f18f7398df6fa995df7ec2c59cf5c2745fbd28bd..0b9f1cabe71570743cbc68a8061= e95a249f27191 100644 --- a/drivers/gpu/drm/sprd/sprd_dsi.h +++ b/drivers/gpu/drm/sprd/sprd_dsi.h @@ -66,6 +66,13 @@ enum pll_timing { TA_WAIT, }; =20 +struct dphy_pll_platform { + u32 band_low; + u32 band_mid; + u32 band_high; + u32 ref_clk; /* dphy reference clock, unit: MHz */ +}; + struct dphy_pll { u8 refin; /* Pre-divider control signal */ u8 cp_s; /* 00: SDM_EN=3D1, 10: SDM_EN=3D0 */ @@ -73,7 +80,6 @@ struct dphy_pll { u8 sdm_en; u8 div; u8 int_n; /* integer N PLL */ - u32 ref_clk; /* dphy reference clock, unit: MHz */ u32 freq; /* panel config, unit: KHz */ u32 fvco; u32 potential_fvco; @@ -83,6 +89,7 @@ struct dphy_pll { u8 out_sel; /* post divider control */ u8 vco_band; /* vco range */ u8 det_delay; + const struct dphy_pll_platform *platform; }; =20 struct dsi_context { --=20 2.50.0 From nobody Mon Oct 6 15:25:14 2025 Received: from srv01.abscue.de (abscue.de [89.58.28.240]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C0C0C226D0F; Sat, 19 Jul 2025 12:11:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=89.58.28.240 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752927103; cv=none; b=DzyyrvQYZuzTHKJWnkPjpXaYf+mUVc3JoYbkhcqxijxp7TO2W+99V7kq2ieTOp0C8K1IOTGwNFpt1Iu90HrZsIBV5F0FK9XBQaAZv2QWj6BMNqxu2Quq1ByH9Fys/sZyvrraR7R8zHogQNA/9r0aowxS+T+dV5PZiSoBLQJPbqY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752927103; c=relaxed/simple; bh=UnzIUZPlQGz0ouabWYlcKenXk2gXi61rjpPc3/sFfw0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TAThStQSjIwD+0EFFaxwezaI3S+IAa3PDXU7WA5oznhXXeYA34mdFWev74FKyMVQI5VXR+HAVrStq+HaIvAqBYSpdy+4jR/BF+0jdvuO+yjqtOcPZwHIM5Y4fjjSlnbJR1MCsr/lqMjzRfpLUUGXWEuZBC2yqPOAgZrvMTsUitk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=abscue.de; spf=pass smtp.mailfrom=abscue.de; arc=none smtp.client-ip=89.58.28.240 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=abscue.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=abscue.de Received: from srv01.abscue.de (localhost [127.0.0.1]) by spamfilter.srv.local (Postfix) with ESMTP id 8D0941C07C4; Sat, 19 Jul 2025 14:11:32 +0200 (CEST) X-Spam-Level: Received: from fluffy-mammal.metal.fwg-cag.de (unknown [IPv6:2001:9e8:cdf7:4000:ceae:3606:9020:cd4f]) by srv01.abscue.de (Postfix) with ESMTPSA id ED5A11C0740; Sat, 19 Jul 2025 14:11:31 +0200 (CEST) From: =?utf-8?q?Otto_Pfl=C3=BCger?= Date: Sat, 19 Jul 2025 14:09:43 +0200 Subject: [PATCH 07/12] drm: sprd: fix DSI rate and PLL setup code Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250719-ums9230-drm-v1-7-e4344a05eb3d@abscue.de> References: <20250719-ums9230-drm-v1-0-e4344a05eb3d@abscue.de> In-Reply-To: <20250719-ums9230-drm-v1-0-e4344a05eb3d@abscue.de> To: David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Orson Zhai , Baolin Wang , Chunyan Zhang , Kevin Tang Cc: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Otto_Pfl=C3=BCger?= X-Mailer: b4 0.14.2 Correct the initialization code to treat the hs_rate and lp_rate values as hertz instead of kilohertz. While at it, fix a bit operation bug in the PLL initialization code which caused a PLL register to be set to zero instead of the desired value. Signed-off-by: Otto Pfl=C3=BCger --- drivers/gpu/drm/sprd/megacores_pll.c | 7 +++---- drivers/gpu/drm/sprd/sprd_dsi.c | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/sprd/megacores_pll.c b/drivers/gpu/drm/sprd/me= gacores_pll.c index e5a18599678ab6e3771cd732dcca409ab2d59f72..f214f906b58fb006c4305de9b8b= 86b4a934f2074 100644 --- a/drivers/gpu/drm/sprd/megacores_pll.c +++ b/drivers/gpu/drm/sprd/megacores_pll.c @@ -23,13 +23,12 @@ =20 static int dphy_calc_pll_param(struct dphy_pll *pll) { - const u32 khz =3D 1000; const u32 mhz =3D 1000000; const unsigned long long factor =3D 100; unsigned long long tmp; int i; =20 - pll->potential_fvco =3D pll->freq / khz; + pll->potential_fvco =3D pll->freq / mhz; =20 for (i =3D 0; i < 4; ++i) { if (pll->potential_fvco >=3D pll->platform->band_low && @@ -89,7 +88,7 @@ static void dphy_set_pll_reg(struct dphy_pll *pll, struct= regmap *regmap) reg_val[3] =3D pll->vco_band | (pll->sdm_en << 1) | (pll->refin << 2); reg_val[4] =3D pll->kint >> 12; reg_val[5] =3D pll->kint >> 4; - reg_val[6] =3D pll->out_sel | ((pll->kint << 4) & 0xf); + reg_val[6] =3D pll->out_sel | ((pll->kint & 0xf) << 4); reg_val[7] =3D 1 << 4; reg_val[8] =3D pll->det_delay; =20 @@ -218,7 +217,7 @@ void dphy_timing_config(struct dsi_context *ctx) u32 tmp =3D 0; =20 /* t_ui: 1 ui, byteck: 8 ui, half byteck: 4 ui */ - t_ui =3D 1000 * scale / (pll->freq / 1000); + t_ui =3D 1000 * scale / (pll->freq / 1000000); t_byteck =3D t_ui << 3; t_half_byteck =3D t_ui << 2; constant =3D t_ui << 1; diff --git a/drivers/gpu/drm/sprd/sprd_dsi.c b/drivers/gpu/drm/sprd/sprd_ds= i.c index db5f9bcbb2500096402b9d44b9cc4428070e69ba..e01d1d28fe579644ec2e0c83ec9= 170269932adfe 100644 --- a/drivers/gpu/drm/sprd/sprd_dsi.c +++ b/drivers/gpu/drm/sprd/sprd_dsi.c @@ -391,7 +391,7 @@ static u32 fmt_to_coding(u32 fmt) static void sprd_dsi_init(struct dsi_context *ctx) { struct sprd_dsi *dsi =3D container_of(ctx, struct sprd_dsi, ctx); - u32 byte_clk =3D dsi->slave->hs_rate / 8; + u32 byte_clk =3D dsi->slave->hs_rate / 8000; u16 data_hs2lp, data_lp2hs, clk_hs2lp, clk_lp2hs; u16 max_rd_time; int div; @@ -408,7 +408,7 @@ static void sprd_dsi_init(struct dsi_context *ctx) dsi_reg_up(ctx, VIRTUAL_CHANNEL_ID, VIDEO_PKT_VCID, 0); dsi_reg_up(ctx, VIRTUAL_CHANNEL_ID, GEN_RX_VCID, 0); =20 - div =3D DIV_ROUND_UP(byte_clk, dsi->slave->lp_rate); + div =3D DIV_ROUND_UP(byte_clk, dsi->slave->lp_rate / 1000); writel(div, ctx->base + TX_ESC_CLK_CONFIG); =20 max_rd_time =3D ns_to_cycle(ctx->max_rd_time, byte_clk); @@ -450,7 +450,6 @@ static int sprd_dsi_dpi_video(struct dsi_context *ctx) { struct sprd_dsi *dsi =3D container_of(ctx, struct sprd_dsi, ctx); struct videomode *vm =3D &ctx->vm; - u32 byte_clk =3D dsi->slave->hs_rate / 8; u16 bpp_x100; u16 video_size; u32 ratio_x1000; @@ -472,7 +471,7 @@ static int sprd_dsi_dpi_video(struct dsi_context *ctx) video_size =3D round_video_size(coding, vm->hactive); bpp_x100 =3D calc_bytes_per_pixel_x100(coding); video_size_step =3D calc_video_size_step(coding); - ratio_x1000 =3D byte_clk * 1000 / (vm->pixelclock / 1000); + ratio_x1000 =3D dsi->slave->hs_rate / 8 / (vm->pixelclock / 1000); hline =3D vm->hactive + vm->hsync_len + vm->hfront_porch + vm->hback_porch; =20 --=20 2.50.0 From nobody Mon Oct 6 15:25:14 2025 Received: from srv01.abscue.de (abscue.de [89.58.28.240]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C0BA9226CEB; Sat, 19 Jul 2025 12:11:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=89.58.28.240 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752927102; cv=none; b=YDrpO+V2sMDN9q1HI8TgKrIgkCbolcQLQ4gEE2HGGBqRuWJBYdpe7GwhwCUzWiNR6sBpc5lTREKWdFxbSrDljm7KzFaSMHdyT9SSP2orA6rsJKpQOExauvJc5DvOvnFR/FcPLPYRZQMvOMq2LugH2d2oIlPaU4EWdm5nFzw0viU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752927102; c=relaxed/simple; bh=NcDT63SYeHWCMr3OEf9L0NA2IEyzjCSsdO8vGRpDFkU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DslqxQxWEP78tGUrsvUa9/rCeIlyfuVn2YAsq8+Bm6c1kFdjgT3Kd9zNdiGE0juvAySI4jF7lSf1UJ2xL3L8/OA0lP9mPtvOgpl5UyWXg79IX6O8oD3D8Xed2RdVpAUO21/bHBwv22mrKlXYnBh5BKtZ5HFUgZparXiDkyTi1v8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=abscue.de; spf=pass smtp.mailfrom=abscue.de; arc=none smtp.client-ip=89.58.28.240 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=abscue.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=abscue.de Received: from srv01.abscue.de (localhost [127.0.0.1]) by spamfilter.srv.local (Postfix) with ESMTP id 3BC511C233A; Sat, 19 Jul 2025 14:11:33 +0200 (CEST) X-Spam-Level: Received: from fluffy-mammal.metal.fwg-cag.de (unknown [IPv6:2001:9e8:cdf7:4000:ceae:3606:9020:cd4f]) by srv01.abscue.de (Postfix) with ESMTPSA id 9C7581C07FA; Sat, 19 Jul 2025 14:11:32 +0200 (CEST) From: =?utf-8?q?Otto_Pfl=C3=BCger?= Date: Sat, 19 Jul 2025 14:09:44 +0200 Subject: [PATCH 08/12] drm: sprd: add gate clock support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250719-ums9230-drm-v1-8-e4344a05eb3d@abscue.de> References: <20250719-ums9230-drm-v1-0-e4344a05eb3d@abscue.de> In-Reply-To: <20250719-ums9230-drm-v1-0-e4344a05eb3d@abscue.de> To: David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Orson Zhai , Baolin Wang , Chunyan Zhang , Kevin Tang Cc: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Otto_Pfl=C3=BCger?= X-Mailer: b4 0.14.2 Enable the DPU and DSI gate clocks specified in the device tree. Disable the DSI clock when it is not needed. Signed-off-by: Otto Pfl=C3=BCger --- drivers/gpu/drm/sprd/sprd_dpu.c | 7 +++++++ drivers/gpu/drm/sprd/sprd_dpu.h | 1 + drivers/gpu/drm/sprd/sprd_dsi.c | 10 ++++++++++ drivers/gpu/drm/sprd/sprd_dsi.h | 4 +++- 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/sprd/sprd_dpu.c b/drivers/gpu/drm/sprd/sprd_dp= u.c index 0d9eb778794d92418b39f8535d94abde3566de43..575bcdb0e0bb30055ac5c3d0e65= 178cc9f6611f3 100644 --- a/drivers/gpu/drm/sprd/sprd_dpu.c +++ b/drivers/gpu/drm/sprd/sprd_dpu.c @@ -3,6 +3,7 @@ * Copyright (C) 2020 Unisoc Inc. */ =20 +#include #include #include #include @@ -794,6 +795,12 @@ static int sprd_dpu_context_init(struct sprd_dpu *dpu, if (ctx->irq < 0) return ctx->irq; =20 + ctx->clk =3D devm_clk_get_optional_enabled(dev, "enable"); + if (IS_ERR(ctx->clk)) { + dev_err(dev, "failed to get dpu enable clock\n"); + return PTR_ERR(ctx->clk); + } + /* disable and clear interrupts before register dpu IRQ. */ writel(0x00, ctx->base + REG_DPU_INT_EN); writel(0xff, ctx->base + REG_DPU_INT_CLR); diff --git a/drivers/gpu/drm/sprd/sprd_dpu.h b/drivers/gpu/drm/sprd/sprd_dp= u.h index 157a78f24dc18b071602552ea9d005af66525263..d48b922de580a8a4bf07c4610c4= 31d3321f7b810 100644 --- a/drivers/gpu/drm/sprd/sprd_dpu.h +++ b/drivers/gpu/drm/sprd/sprd_dpu.h @@ -44,6 +44,7 @@ enum { */ struct dpu_context { void __iomem *base; + struct clk *clk; int irq; u8 if_type; struct videomode vm; diff --git a/drivers/gpu/drm/sprd/sprd_dsi.c b/drivers/gpu/drm/sprd/sprd_ds= i.c index e01d1d28fe579644ec2e0c83ec9170269932adfe..e781e6c84860402f37352e76824= 4d88ca6ffd4c9 100644 --- a/drivers/gpu/drm/sprd/sprd_dsi.c +++ b/drivers/gpu/drm/sprd/sprd_dsi.c @@ -828,6 +828,8 @@ static void sprd_dsi_bridge_pre_enable(struct drm_bridg= e *bridge) struct sprd_dsi *dsi =3D bridge_to_dsi(bridge); struct dsi_context *ctx =3D &dsi->ctx; =20 + clk_prepare_enable(ctx->clk); + if (ctx->enabled) { drm_warn(dsi->drm, "dsi is initialized\n"); return; @@ -875,6 +877,8 @@ static void sprd_dsi_bridge_post_disable(struct drm_bri= dge *bridge) sprd_dphy_fini(ctx); sprd_dsi_fini(ctx); =20 + clk_disable_unprepare(ctx->clk); + ctx->enabled =3D false; } =20 @@ -1098,6 +1102,12 @@ static int sprd_dsi_probe(struct platform_device *pd= ev) if (!dsi->ctx.pll.platform) return -EINVAL; =20 + dsi->ctx.clk =3D devm_clk_get_optional(dev, "enable"); + if (IS_ERR(dsi->ctx.clk)) { + dev_err(dev, "failed to get dsi enable clock\n"); + return PTR_ERR(dsi->ctx.clk); + } + return mipi_dsi_host_register(&dsi->host); } =20 diff --git a/drivers/gpu/drm/sprd/sprd_dsi.h b/drivers/gpu/drm/sprd/sprd_ds= i.h index 0b9f1cabe71570743cbc68a8061e95a249f27191..15e57f3f49f8e5c4f856fb496a0= c88f1b0414ced 100644 --- a/drivers/gpu/drm/sprd/sprd_dsi.h +++ b/drivers/gpu/drm/sprd/sprd_dsi.h @@ -6,8 +6,9 @@ #ifndef __SPRD_DSI_H__ #define __SPRD_DSI_H__ =20 -#include +#include #include +#include #include #include