From nobody Tue Aug 25 00:12:11 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 332FA290DBB for ; Sat, 4 Jul 2026 18:32:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783189980; cv=none; b=tdmxsABLLXZ/Cv2H802c7dYUh3YucZWroNsZzl4G18wXTIvbfqMcubtZkvAor066ULdMF1BP3+5dZ2K1eMxsxqqFI1d3WnW9mwPj8REUmT5JVzD6LLtFr4gn6Ek60UH3H+jRoZEkY+dcVTvknmPq59YVtw89qNe6KjXW8SNTs0U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783189980; c=relaxed/simple; bh=ZBckuX3txIAWgfa7laBsW3ynqRXr57quONUZ0OswUhc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=m3Q7kYK7yZVF2d8HHLZTlx4EZLsceiF1Z5Gm7sE77JInxWvbsn5kXiYBnlBGCcbHnqGl+ZF051ZLWKO25XAG7sbFo2GwoZ1MASV5E7g43AHABGaQzBTrjNig0KMtEnN8MM/4ftVOG7FpoYKZcIdcH8kMbzlbw29GdaxMiD4t6Cc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=KMvlZI/B; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=aU5EhimD; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="KMvlZI/B"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="aU5EhimD" Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 664G8jZ63443091 for ; Sat, 4 Jul 2026 18:32:58 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= Ttm/7fm0Amr5YNq5qGHZbCjSuHzVM8tYT1SDU8QGDHk=; b=KMvlZI/BAGdkRbPC g4ZIOHQiHU6hWIPh5Xyk1zLy8YjJRzKKQ8XvMI6bfVxnghFPZKFzMyNCXHQVnYLh CpqZ/+AAF8wlJkPYwd58iNQLXFzwdZFIxpybyiWg2LAQYA2wMZB5Igu2MDLJjIh3 2MlbaKCZEkHHerTQH5LcXL8V5TIMkSQc0apFOBcJni38UEsDNAAjj0xVykLSTgVb zqR7onBwTqwp6lznxPUOIxN1iN+t5D5W7XO1ZEf/uUbb80VQW4JdAs1wk0TFLWuR qOpgAbSlNa/p0eFNqRUvnHImfWzu7nhZbAK6rh0ZXmecbvahwLNXC3ar8iwI1eDi WKzCvg== Received: from mail-pf1-f199.google.com (mail-pf1-f199.google.com [209.85.210.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4f6s64hgtm-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sat, 04 Jul 2026 18:32:57 +0000 (GMT) Received: by mail-pf1-f199.google.com with SMTP id d2e1a72fcca58-84770f89b99so2535576b3a.1 for ; Sat, 04 Jul 2026 11:32:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1783189977; x=1783794777; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=Ttm/7fm0Amr5YNq5qGHZbCjSuHzVM8tYT1SDU8QGDHk=; b=aU5EhimDVZXnAZRndYDTGWpmvjYsbAaf7bwyN7cs8UXrahjycKOgaaeOgGajJNUxd4 SvoO25AbATuHXe3ECkrxlCYMpGPUQxrXBWGCJf/kAKW8cw+SRGXti0X5QYNBES/V/9+y dbbEP0h9Er0hLBSmGagx2fiVIT0QBZ+Fsp6py4KwiJwfgEPaPy+lo5fTBSLRh83UF9aQ Ybw+sJQoPpqiscsp091qf7AxalbMy+xD4nV7JRUbRhcnHzYzjW9d03u5d5hPdlDemhpY BEwc8uH5DI8pZLgccJnPaLFg4XZEYmWIzfyI1d7MzpmAiN1AYHqZpRLraJ2ByDsAFEId YlxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783189977; x=1783794777; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=Ttm/7fm0Amr5YNq5qGHZbCjSuHzVM8tYT1SDU8QGDHk=; b=CKFXOzvh+vZgaF34O+4kcivKty82mrdSR4ThRYLUD0l/m4QhHSq91VGqWvuICiqYyc Y3m3qxK98nlxicLsbSG9D0Mmk0660skUiAsxLMHryKj8bmfxb8TzBvx6RTWWG3ou+4w9 UqontuRiON7ELsbhPbrQKQLVpJVtHb1YmF/HekChtaub1cHrs5/zaYwDrwaQtsX0oc1F fUqum5YgYFvi+xQPzvkWohVKa8flW+notXAsdSMSt3V6XoknLQ09uOo+mZlBbdUWGhgI ODxVKZEPS4M5riDqrfHCgJGShXKlnlaxwTFY5RtxJ3yyy6bS1VCMf73Y7qZsjHjXNefr asvg== X-Forwarded-Encrypted: i=1; AFNElJ//J1TZC4dcAYFC76YnOdq8PSyxwtyKlstwVRi5dDmHUDk+O4as4GIYWjwOa4+3oNAlB+8p1sM8YsSeRkA=@vger.kernel.org X-Gm-Message-State: AOJu0Yxi35+gLIgWUFuVtD2625UN57J6keTq8Irbflur9hGCoJeAiexO hJt6J7TevG0xfRv9RuYxOQDT0CpTZNgDd8tvU0CaYKJ11jBbBY/uIaGFV5+hZjA9zNgRF1ybtwZ CF4FmI3xkRxG6pk4/idyRG52IrC4J1858+riV3evpHG+EBpDAbStCyplkyz8P9OPXULw= X-Gm-Gg: AfdE7ckKaql7rQ1jKvzVVSe+FM2FPNIa3FbeJiL2VRUHM5Q19UPyPqBNcXjHYi9QXb9 KsirI0WV8vAxdgbI+u23P+0Wt/kUmrzxn5+MDdChy33OjAHHm2IVEF9QDDiflXafpMYexofvS/2 v5XfGN5QS3HWYg3kbaygQKmXkCf+7rqispONbKF+WIiLRJWQI6r0hhCpAJzWo4o797FjP08N7yz yGe4Wj2qspyTF0s6WzLrzHwZQOiDm6ndw8bt64cbeYMyFSWp+Dxdx2ldCw6OVKHuIiRqNh29I+0 iVjFVxedCZnOYgVg5diUjw1tBnsDP5LssfuMfydnpB3bRN3YBidt1InDUm3pafDEX07gXeRCfeN Bk7mVTfIBcJpLPGADWKXFNO8= X-Received: by 2002:a05:6a00:330a:b0:845:e873:4248 with SMTP id d2e1a72fcca58-847f6f88bf1mr3891491b3a.56.1783189976893; Sat, 04 Jul 2026 11:32:56 -0700 (PDT) X-Received: by 2002:a05:6a00:330a:b0:845:e873:4248 with SMTP id d2e1a72fcca58-847f6f88bf1mr3891475b3a.56.1783189976356; Sat, 04 Jul 2026 11:32:56 -0700 (PDT) Received: from [192.168.1.100] ([151.243.38.149]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-847f6b6057dsm1508437b3a.7.2026.07.04.11.32.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 04 Jul 2026 11:32:54 -0700 (PDT) From: Ze Huang Date: Sun, 05 Jul 2026 02:31:12 +0800 Subject: [PATCH 3/9] drm/imx: replace struct drm_simple_display_pipe with regular atomic helpers 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: <20260705-drm-simple-kms-removal-v1-3-b4e1ca053623@oss.qualcomm.com> References: <20260705-drm-simple-kms-removal-v1-0-b4e1ca053623@oss.qualcomm.com> In-Reply-To: <20260705-drm-simple-kms-removal-v1-0-b4e1ca053623@oss.qualcomm.com> To: Alexey Brodkin , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Joel Stanley , Andrew Jeffery , Frank Li , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Linus Walleij , Hans de Goede , Alex Lanzano , Oleksandr Andrushchenko Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-aspeed@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org, imx@lists.linux.dev, xen-devel@lists.xenproject.org, Ze Huang X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1783189912; l=12402; i=ze.huang@oss.qualcomm.com; s=20260704; h=from:subject:message-id; bh=ZBckuX3txIAWgfa7laBsW3ynqRXr57quONUZ0OswUhc=; b=CcD/bGc8N1fmpUeIAF1DgOcRu2w5rkAIDVMHiLPgTjWBMB2Cr/5H5zbeIN+QE6UHLIN4SkusI ddIQkvZ0PpPDGax+ynKj3ZJ+UsHYNrpUI0x4wQabe61C0XeadfBIfqL X-Developer-Key: i=ze.huang@oss.qualcomm.com; a=ed25519; pk=pSsISLZF2ubEjJRmslsa6Ps4W3yAuPY7yaircQTlQQU= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzA0MDE5MiBTYWx0ZWRfX/V/aAtff54vA hQvkU+Q92DcbWXa2g5mmI7aXV3+y+tCLbciJOmbbXC/WIr0c26yL+/wJcTAZAFRpvbAVq2T9Krw FT4riJvPPZbTZs3agDbOSwm298SVmOJ/pLp3Z54pA/L3JUpU4JRGm7M/yVLJIgvCFnKpxSUn7aE Pr92stJdtgVUXU8wJbvVzRFmQM88vysRpeCAbox35KUohmNFW2io9hOW0a5hVGqhtb1pAE+GVvc XOUQHf/sLTRFjc4cbiRmNm7HDKy4zNtaC/d850fEPBUIFwB3A0JWMofVaJaZSvEeydL9YZgN9EQ cPzQSHqGaSkzU4WoXgnSjWBOLvR43TeLn0HmtloivAOl/gNIXXH2p5/nCdoGQ9EbEoYqYQiknJC LtLna29FWponY0/g0DnUJeNXgIfCCAYCGi4iM3ygIiAo7rfyGMpjLZRRRL5wh57BKogiTkF6ZRV Ai+daOQ9RpMK9yGwgqg== X-Authority-Analysis: v=2.4 cv=VvITxe2n c=1 sm=1 tr=0 ts=6a4951da cx=c_pps a=WW5sKcV1LcKqjgzy2JUPuA==:117 a=cNux22OjBTKCC6TmznXXXA==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_glEPmIy2e8OvE2BGh3C:22 a=EUspDBNiAAAA:8 a=mQfPNFbHEbGQ-wo8duEA:9 a=QEXdDO2ut3YA:10 a=OpyuDcXvxspvyRM73sMx:22 X-Proofpoint-ORIG-GUID: A4jUhETIkEaMPfpyK5aaz4-UCv4kTTM5 X-Proofpoint-Spam-Info: AW1haW4tMjYwNzA0MDE5MiBTYWx0ZWRfX9mPWKXmRDE+z 7AZmTvlVtt0u4chC6EEDO0ebU55Q1X/BOjg7o3Hx9Zk6bGshxTf72plMeHcuPGb4ZCpbId1PLrs RsA/8pRNRemJqSKCORc0CZLRFJ8rak8= X-Proofpoint-GUID: A4jUhETIkEaMPfpyK5aaz4-UCv4kTTM5 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-07-04_02,2026-07-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 spamscore=0 suspectscore=0 bulkscore=0 adultscore=0 priorityscore=1501 lowpriorityscore=0 phishscore=0 clxscore=1015 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607040192 Convert i.MX LCDC to explicit primary plane, CRTC and encoder objects. Keep no-scaling plane check and GEM framebuffer prepare callback from simple-KMS path. Only touch hardware state when framebuffer exists, since atomic plane updates can run on disabling transitions. Signed-off-by: Ze Huang --- drivers/gpu/drm/imx/lcdc/imx-lcdc.c | 178 ++++++++++++++++++++++++++------= ---- 1 file changed, 130 insertions(+), 48 deletions(-) diff --git a/drivers/gpu/drm/imx/lcdc/imx-lcdc.c b/drivers/gpu/drm/imx/lcdc= /imx-lcdc.c index f52832b43aca..d091dc562098 100644 --- a/drivers/gpu/drm/imx/lcdc/imx-lcdc.c +++ b/drivers/gpu/drm/imx/lcdc/imx-lcdc.c @@ -14,9 +14,9 @@ #include #include #include +#include #include #include -#include #include #include #include @@ -102,7 +102,9 @@ =20 struct imx_lcdc { struct drm_device drm; - struct drm_simple_display_pipe pipe; + struct drm_plane plane; + struct drm_crtc crtc; + struct drm_encoder encoder; struct drm_connector *connector; void __iomem *base; =20 @@ -135,14 +137,13 @@ static unsigned int imx_lcdc_get_format(unsigned int = drm_format) } } =20 -static void imx_lcdc_update_hw_registers(struct drm_simple_display_pipe *p= ipe, +static void imx_lcdc_update_hw_registers(struct drm_crtc *crtc, struct drm_plane_state *old_state, bool mode_set) { - struct drm_crtc *crtc =3D &pipe->crtc; - struct drm_plane_state *new_state =3D pipe->plane.state; + struct drm_plane_state *new_state =3D crtc->primary->state; struct drm_framebuffer *fb =3D new_state->fb; - struct imx_lcdc *lcdc =3D imx_lcdc_from_drmdev(pipe->crtc.dev); + struct imx_lcdc *lcdc =3D imx_lcdc_from_drmdev(crtc->dev); u32 lpcr, lvcr, lhcr; u32 framesize; dma_addr_t addr; @@ -188,16 +189,16 @@ static void imx_lcdc_update_hw_registers(struct drm_s= imple_display_pipe *pipe, clk_prepare_enable(lcdc->clk_per); } =20 -static void imx_lcdc_pipe_enable(struct drm_simple_display_pipe *pipe, - struct drm_crtc_state *crtc_state, - struct drm_plane_state *plane_state) +static void imx_lcdc_crtc_helper_atomic_enable(struct drm_crtc *crtc, + struct drm_atomic_commit *state) { int ret; int clk_div; int bpp; - struct imx_lcdc *lcdc =3D imx_lcdc_from_drmdev(pipe->crtc.dev); - struct drm_display_mode *mode =3D &pipe->crtc.mode; + struct imx_lcdc *lcdc =3D imx_lcdc_from_drmdev(crtc->dev); + struct drm_display_mode *mode =3D &crtc->mode; struct drm_display_info *disp_info =3D &lcdc->connector->display_info; + struct drm_plane_state *plane_state =3D crtc->primary->state; const int hsync_pol =3D (mode->flags & DRM_MODE_FLAG_PHSYNC) ? 0 : 1; const int vsync_pol =3D (mode->flags & DRM_MODE_FLAG_PVSYNC) ? 0 : 1; const int data_enable_pol =3D @@ -231,34 +232,34 @@ static void imx_lcdc_pipe_enable(struct drm_simple_di= splay_pipe *pipe, =20 ret =3D clk_prepare_enable(lcdc->clk_ipg); if (ret) { - dev_err(pipe->crtc.dev->dev, "Cannot enable ipg clock: %pe\n", ERR_PTR(r= et)); + dev_err(crtc->dev->dev, "Cannot enable ipg clock: %pe\n", ERR_PTR(ret)); return; } ret =3D clk_prepare_enable(lcdc->clk_ahb); if (ret) { - dev_err(pipe->crtc.dev->dev, "Cannot enable ahb clock: %pe\n", ERR_PTR(r= et)); + dev_err(crtc->dev->dev, "Cannot enable ahb clock: %pe\n", ERR_PTR(ret)); =20 clk_disable_unprepare(lcdc->clk_ipg); =20 return; } =20 - imx_lcdc_update_hw_registers(pipe, NULL, true); + imx_lcdc_update_hw_registers(crtc, NULL, true); =20 /* Enable VBLANK Interrupt */ writel(INTR_EOF, lcdc->base + IMX21LCDC_LIER); } =20 -static void imx_lcdc_pipe_disable(struct drm_simple_display_pipe *pipe) +static void imx_lcdc_crtc_helper_atomic_disable(struct drm_crtc *crtc, + struct drm_atomic_commit *state) { - struct imx_lcdc *lcdc =3D imx_lcdc_from_drmdev(pipe->crtc.dev); - struct drm_crtc *crtc =3D &lcdc->pipe.crtc; + struct imx_lcdc *lcdc =3D imx_lcdc_from_drmdev(crtc->dev); struct drm_pending_vblank_event *event; =20 clk_disable_unprepare(lcdc->clk_ahb); clk_disable_unprepare(lcdc->clk_ipg); =20 - if (pipe->crtc.enabled) + if (crtc->enabled) clk_disable_unprepare(lcdc->clk_per); =20 spin_lock_irq(&lcdc->drm.event_lock); @@ -273,17 +274,18 @@ static void imx_lcdc_pipe_disable(struct drm_simple_d= isplay_pipe *pipe) writel(0, lcdc->base + IMX21LCDC_LIER); } =20 -static int imx_lcdc_pipe_check(struct drm_simple_display_pipe *pipe, - struct drm_plane_state *plane_state, - struct drm_crtc_state *crtc_state) +static int imx_lcdc_crtc_helper_atomic_check(struct drm_crtc *crtc, + struct drm_atomic_commit *state) { + struct drm_crtc_state *crtc_state =3D drm_atomic_get_new_crtc_state(state= , crtc); const struct drm_display_mode *mode =3D &crtc_state->mode; - const struct drm_display_mode *old_mode =3D &pipe->crtc.state->mode; + const struct drm_display_mode *old_mode =3D &crtc->state->mode; + int ret; =20 if (mode->hdisplay < LCDC_MIN_XRES || mode->hdisplay > LCDC_MAX_XRES || mode->vdisplay < LCDC_MIN_YRES || mode->vdisplay > LCDC_MAX_YRES || mode->hdisplay % 0x10) { /* must be multiple of 16 */ - drm_err(pipe->crtc.dev, "unsupported display mode (%u x %u)\n", + drm_err(crtc->dev, "unsupported display mode (%u x %u)\n", mode->hdisplay, mode->vdisplay); return -EINVAL; } @@ -292,27 +294,42 @@ static int imx_lcdc_pipe_check(struct drm_simple_disp= lay_pipe *pipe, old_mode->hdisplay !=3D mode->hdisplay || old_mode->vdisplay !=3D mode->vdisplay; =20 - return 0; + if (!crtc_state->enable) + goto out; + + ret =3D drm_atomic_helper_check_crtc_primary_plane(crtc_state); + if (ret) + return ret; + +out: + return drm_atomic_add_affected_planes(state, crtc); } =20 -static void imx_lcdc_pipe_update(struct drm_simple_display_pipe *pipe, - struct drm_plane_state *old_state) +static void imx_lcdc_plane_helper_atomic_update(struct drm_plane *plane, + struct drm_atomic_commit *state) { - struct drm_crtc *crtc =3D &pipe->crtc; - struct drm_pending_vblank_event *event =3D crtc->state->event; - struct drm_plane_state *new_state =3D pipe->plane.state; + struct drm_plane_state *old_state =3D drm_atomic_get_old_plane_state(stat= e, plane); + struct drm_plane_state *new_state =3D plane->state; + struct drm_crtc *crtc =3D new_state->crtc ?: old_state->crtc; + struct drm_pending_vblank_event *event; struct drm_framebuffer *fb =3D new_state->fb; struct drm_framebuffer *old_fb =3D old_state->fb; struct drm_crtc *old_crtc =3D old_state->crtc; bool mode_changed =3D false; =20 - if (old_fb && old_fb->format !=3D fb->format) - mode_changed =3D true; - else if (old_crtc !=3D crtc) - mode_changed =3D true; + if (!crtc) + return; =20 - imx_lcdc_update_hw_registers(pipe, old_state, mode_changed); + if (fb) { + if (old_fb && old_fb->format !=3D fb->format) + mode_changed =3D true; + else if (old_crtc !=3D crtc) + mode_changed =3D true; =20 + imx_lcdc_update_hw_registers(crtc, old_state, mode_changed); + } + + event =3D crtc->state->event; if (event) { crtc->state->event =3D NULL; =20 @@ -327,11 +344,56 @@ static void imx_lcdc_pipe_update(struct drm_simple_di= splay_pipe *pipe, } } =20 -static const struct drm_simple_display_pipe_funcs imx_lcdc_pipe_funcs =3D { - .enable =3D imx_lcdc_pipe_enable, - .disable =3D imx_lcdc_pipe_disable, - .check =3D imx_lcdc_pipe_check, - .update =3D imx_lcdc_pipe_update, +static int imx_lcdc_plane_helper_atomic_check(struct drm_plane *plane, + struct drm_atomic_commit *state) +{ + struct drm_plane_state *plane_state =3D drm_atomic_get_new_plane_state(st= ate, plane); + struct drm_crtc *crtc =3D plane_state->crtc; + struct drm_crtc_state *crtc_state =3D NULL; + int ret; + + if (crtc) + crtc_state =3D drm_atomic_get_new_crtc_state(state, crtc); + + ret =3D drm_atomic_helper_check_plane_state(plane_state, crtc_state, + DRM_PLANE_NO_SCALING, + DRM_PLANE_NO_SCALING, + false, false); + return ret; +} + +static const struct drm_plane_helper_funcs imx_lcdc_plane_helper_funcs =3D= { + .prepare_fb =3D drm_gem_plane_helper_prepare_fb, + .atomic_check =3D imx_lcdc_plane_helper_atomic_check, + .atomic_update =3D imx_lcdc_plane_helper_atomic_update, +}; + +static const struct drm_plane_funcs imx_lcdc_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, +}; + +static const struct drm_crtc_helper_funcs imx_lcdc_crtc_helper_funcs =3D { + .atomic_check =3D imx_lcdc_crtc_helper_atomic_check, + .atomic_enable =3D imx_lcdc_crtc_helper_atomic_enable, + .atomic_disable =3D imx_lcdc_crtc_helper_atomic_disable, +}; + +static const struct drm_crtc_funcs imx_lcdc_crtc_funcs =3D { + .reset =3D drm_atomic_helper_crtc_reset, + .destroy =3D drm_crtc_cleanup, + .set_config =3D drm_atomic_helper_set_config, + .page_flip =3D drm_atomic_helper_page_flip, + .atomic_duplicate_state =3D drm_atomic_helper_crtc_duplicate_state, + .atomic_destroy_state =3D drm_atomic_helper_crtc_destroy_state, +}; + +static const struct drm_encoder_funcs imx_lcdc_encoder_funcs =3D { + .destroy =3D drm_encoder_cleanup, }; =20 static const struct drm_mode_config_funcs imx_lcdc_mode_config_funcs =3D { @@ -369,7 +431,7 @@ MODULE_DEVICE_TABLE(of, imx_lcdc_of_dev_id); static irqreturn_t imx_lcdc_irq_handler(int irq, void *arg) { struct imx_lcdc *lcdc =3D arg; - struct drm_crtc *crtc =3D &lcdc->pipe.crtc; + struct drm_crtc *crtc =3D &lcdc->crtc; unsigned int status; =20 status =3D readl(lcdc->base + IMX21LCDC_LISR); @@ -387,6 +449,9 @@ static int imx_lcdc_probe(struct platform_device *pdev) struct imx_lcdc *lcdc; struct drm_device *drm; struct drm_bridge *bridge; + struct drm_plane *plane; + struct drm_crtc *crtc; + struct drm_encoder *encoder; int irq; int ret; struct device *dev =3D &pdev->dev; @@ -428,23 +493,40 @@ static int imx_lcdc_probe(struct platform_device *pde= v) if (ret) return dev_err_probe(dev, ret, "Cannot initialize mode configuration str= ucture\n"); =20 - /* CRTC, Plane, Encoder */ - ret =3D drm_simple_display_pipe_init(drm, &lcdc->pipe, - &imx_lcdc_pipe_funcs, - imx_lcdc_formats, - ARRAY_SIZE(imx_lcdc_formats), NULL, NULL); + plane =3D &lcdc->plane; + ret =3D drm_universal_plane_init(drm, plane, 0, + &imx_lcdc_plane_funcs, + imx_lcdc_formats, + ARRAY_SIZE(imx_lcdc_formats), + NULL, + DRM_PLANE_TYPE_PRIMARY, NULL); + if (ret < 0) + return dev_err_probe(drm->dev, ret, "Cannot initialize primary plane\n"); + drm_plane_helper_add(plane, &imx_lcdc_plane_helper_funcs); + + crtc =3D &lcdc->crtc; + ret =3D drm_crtc_init_with_planes(drm, crtc, plane, NULL, + &imx_lcdc_crtc_funcs, NULL); + if (ret < 0) + return dev_err_probe(drm->dev, ret, "Cannot initialize CRTC\n"); + drm_crtc_helper_add(crtc, &imx_lcdc_crtc_helper_funcs); + + encoder =3D &lcdc->encoder; + ret =3D drm_encoder_init(drm, encoder, &imx_lcdc_encoder_funcs, + DRM_MODE_ENCODER_NONE, NULL); if (ret < 0) - return dev_err_probe(drm->dev, ret, "Cannot setup simple display pipe\n"= ); + return dev_err_probe(drm->dev, ret, "Cannot initialize encoder\n"); + encoder->possible_crtcs =3D drm_crtc_mask(crtc); =20 ret =3D drm_vblank_init(drm, drm->mode_config.num_crtc); if (ret < 0) return dev_err_probe(drm->dev, ret, "Failed to initialize vblank\n"); =20 - ret =3D drm_bridge_attach(&lcdc->pipe.encoder, bridge, NULL, DRM_BRIDGE_A= TTACH_NO_CONNECTOR); + ret =3D drm_bridge_attach(encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CON= NECTOR); if (ret) return dev_err_probe(drm->dev, ret, "Cannot attach bridge\n"); =20 - lcdc->connector =3D drm_bridge_connector_init(drm, &lcdc->pipe.encoder); + lcdc->connector =3D drm_bridge_connector_init(drm, encoder); if (IS_ERR(lcdc->connector)) return dev_err_probe(drm->dev, PTR_ERR(lcdc->connector), "Cannot init br= idge connector\n"); =20 --=20 2.55.0