From nobody Tue Aug 25 21:45:06 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.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 DEB87288C30 for ; Sat, 4 Jul 2026 18:33:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783190014; cv=none; b=JmATfhDkEfIraHM8Q6D4DRHyzzco3IHAz12y9dadia8z+YxwcwtdADXKzW5z/grTH/ZhVoSgFgiwYDhpxq+3lagybC04YDiVU2EdMMNNfMz6JTHpCDXRZboA+339yPTCycJa+WJOkzjSuo/vhkRRJ8ZHEoKQ9z0j+M9edAcM/TY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783190014; c=relaxed/simple; bh=IU9daMuh+wIrKu2A7tjNZQhHlWlCXrpg0Z3XcY9yMsA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=iUc3eVCituqmvt9KzcMn1Ol6lIf0bExFFGAdZ/QQoi8Cvvpf+KlVuhUZIQRx/Jzbhw+OEKYbGrWaMSLivW3GjN7QljuvGO4spcSi+CRW8fp8/vanl8rgfidtmISNsT7KcYWyXlZoGMncbMRRaZApT7VsfB3aiFmPJDgjEem+Oxo= 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=W6KKvrhm; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=gXZnYyca; arc=none smtp.client-ip=205.220.168.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="W6KKvrhm"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="gXZnYyca" Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 664G8hDI3450502 for ; Sat, 4 Jul 2026 18:33:30 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= g0BtnuFOv0FQCXxUBDMLCWTcgE0j6FLXPqatMYGCcJA=; b=W6KKvrhmeJ2fyG7f WVeIgvI7yc1jiGCDVMy8ENc4fDLxlrrfJe8IN0O7lmm2B65JmceQegoTuxl0Zy4Q OqrwkMJhj1H45TKfCC4YEbJgkLuuqCQWQ+x7QobwEfYeReDSSCL5wWTZivIRfWQf ZJvG8MRhzMrHmL/91mXHljlnNhNPpfDOq9WZgplUeCnLLFjKY3B6g8sVRCTh67r/ N/u3p+SV46iH5sChKzMK/1uJIPHpraflaat1ixydDZW7kQwP9UJMiq81VaHpAprp JpC6F9G6ErO9rXO+wqrCAT9MR9ncg2ZJVslkCM+/pUyt+MTHGF3FE+8IziiOj809 wXvMLA== Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4f6s4ssfw4-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sat, 04 Jul 2026 18:33:30 +0000 (GMT) Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-845e6a11332so2052508b3a.3 for ; Sat, 04 Jul 2026 11:33:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1783190009; x=1783794809; 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=g0BtnuFOv0FQCXxUBDMLCWTcgE0j6FLXPqatMYGCcJA=; b=gXZnYycay6DnMtWKxFbGuNsrKBZ7bXg3MIvThJ5shdXcl0ScFnOZ9QhPiwnDREmyrk zVah23cqVolM7xdNqfEvampcpARN/sQdNr07cmlGIwtN/DjpmmWVRJNB1dwwWDOzL5go qG6r8wItmuxcDdirCBUn/qHD0Imije1cLDgdNgA7DsS96dlFem1nNXYNsh3jVukKSxY4 KxL2iPP2/P4SB4wa/lpvwk7rM9RLHrG8vYpCctyeki/gZB+U+gee439GuOsvzk9OIPuX 9kqAQgesrTrbL9PpDgPEpNwe4sRZq/MCzX0918kgUY/6Olt50RimD6bFVNVXIUQ4pOvs eIIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783190009; x=1783794809; 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=g0BtnuFOv0FQCXxUBDMLCWTcgE0j6FLXPqatMYGCcJA=; b=kvL7g0/vhwNUDbVAXuDC9n0eqGh2wBzB4irmV1dw8zhVlXxFIgizXR7neyZN0FSrzx U3loKzBPHhMcLn1KjIBshehCaypK+fC6pFVjI+G+gHEXmRWiUNICqTyRBQE66tjQxMci yS+Hblu3QS0KgHV0lRVRNILx0F+gQR1CH5llKC61cF02SoN6mhnx6Mgc0jHkBKwHFQYg 1S9WrlrrDR/GOrSerlwMXj5GdHTLYZt9YM55Lf4CxAmg3cBq/TOMPRMh0cmHoicYMmYr v1XE4H0JxFfZ+aRelhZemT2+zGwmhrDa8q3dkn1+oSEZ2zPQLUcweOlglEqOKeWVyIUm 8N1A== X-Forwarded-Encrypted: i=1; AFNElJ9vOh4vjKVx5GUwLn4Fii/ArqrnDG2lXdhYOjI/O6bZsisWXRycvr/ZHguVsec2FT11PMO/KE0Uvec5dDU=@vger.kernel.org X-Gm-Message-State: AOJu0Yz+rW7f7qiB56yYk8N8tObICDEa1BvWlBaHtxHPzfR31CBvIv/D Z6m90EuIK9G+TnVXjiW9t/EbqiXuWOVxp6GRbEtyzHAjDwiqJxdRa/w/lJKhrTTxIK4Ig2XVj+M KbOOwibEOd3uofJe7d0JjQsO5cCgFmRIhPZ73XTAms18/FiPcbKz654LgF/+Fa/wwdl0= X-Gm-Gg: AfdE7ck/HJnyOG3r0/Z/a/Iti+nOV+1gQdMO8IYHObogVtBglmou/70bHEZMV+mPLGz +lHJafHV8sN5D5tiSuCIYkxwiRybP1q4EuiJtfxeopRoxWemMcubY9zwzIECAMlQ7a84iUmdNhF ybNaR8DT8M/Bjzx6/EMY1P1UB2l1GlsgZ7iXrVd0uTqQ/5XDC5TsAM+u5fpQvHGg7DtDvnS2oDQ bVLpFk3ffhYJfNOT/qGr9OcPQr0VfV/a0We4Iv4ZgvOdRZVu5hIveE1ZnDQAxXxhFl08ddNRKR0 xMdLTdDYShDDj4KMTYgHFDztrcFl1c1NfRBCnSqT5fTRoQbRmynFSx//hGbagBt2f1HKG0CM+/3 saHGh5M+jHfOQU0XO1U4HKUY= X-Received: by 2002:a05:6a00:e05:b0:845:d274:bfa3 with SMTP id d2e1a72fcca58-847f6f96cdemr3661073b3a.58.1783190009308; Sat, 04 Jul 2026 11:33:29 -0700 (PDT) X-Received: by 2002:a05:6a00:e05:b0:845:d274:bfa3 with SMTP id d2e1a72fcca58-847f6f96cdemr3661037b3a.58.1783190008770; Sat, 04 Jul 2026 11:33:28 -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.33.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 04 Jul 2026 11:33:28 -0700 (PDT) From: Ze Huang Date: Sun, 05 Jul 2026 02:31:17 +0800 Subject: [PATCH 8/9] drm/tve200: 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-8-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=12559; i=ze.huang@oss.qualcomm.com; s=20260704; h=from:subject:message-id; bh=IU9daMuh+wIrKu2A7tjNZQhHlWlCXrpg0Z3XcY9yMsA=; b=wca2bARZyhz/O2pE/2ultazGgfCDL/nXmuhK0zZODTqz3phtgEMU73vuIDTkXkqZJvrB1l2Xi pazMWuCMQ9XDkjSq9DKd98nVhHWb8WoQEKSNkWUUn6L6rvw9PKEzFZA X-Developer-Key: i=ze.huang@oss.qualcomm.com; a=ed25519; pk=pSsISLZF2ubEjJRmslsa6Ps4W3yAuPY7yaircQTlQQU= X-Proofpoint-Spam-Info: AW1haW4tMjYwNzA0MDE5MiBTYWx0ZWRfX/J9nZvBVfNcd kr2JEDQ3ScQTMyqvFBq4ajWJu/XxWV5W1bCN0Dh1bfTAgoHyZMjAWh2NsFN8EG91eeRaT35SWkM Ry/OWyP7SMpi/rpHCpS27Z7w2uFtCcI= X-Proofpoint-ORIG-GUID: yK9FKhsj25Fq0KVrQN87kd34Svea5KaM X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzA0MDE5MiBTYWx0ZWRfX/Bs+5bf7Nsq3 zJkCEQbdFurE8PJ8Jx8MGMjlx+5fn+A7m2CFjKhYkn98XDfJYbCu8XLiwzf2Vi6IxyT8jRbsyzy DpohQxiPmg0BEIjDc6mjDJAlyeOlI1LZKK9GhHFo4LlobeZP1O+5FmwY/U1YwRKd+wAcT96+4Ei ffWdoBRYHGFmdNqeoXe0RuvRY1TXLpx96QA98QaUSMbM+FtLhp6u/KDdxK60XLBXsTk8L0J1hwr NRZAfEI7bEcQfud62V8rHAiSh95TQKyRz8hcN4tgsoVOLW0MsGv7EIhl2CB+T0/OTB5OeHmTxOJ Na8eu/rf+JZjfKvxrWJzbjG/+P5F+B2KnzsXgG71+crSArXm2sErhgXQmrthb3VdjbpPCHGkhAC 34AGCh5gc4WGSzyxu8ipTTktev5qT3zUAWgz1xgQchedixKztnxlls2W3rujksnHdxBbAtEB1FZ 3fXi8z8OulxkuBE+qSw== X-Proofpoint-GUID: yK9FKhsj25Fq0KVrQN87kd34Svea5KaM X-Authority-Analysis: v=2.4 cv=ZfQt8MVA c=1 sm=1 tr=0 ts=6a4951fa cx=c_pps a=rEQLjTOiSrHUhVqRoksmgQ==:117 a=cNux22OjBTKCC6TmznXXXA==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=Um2Pa8k9VHT-vaBCBUpS:22 a=EUspDBNiAAAA:8 a=dgwnEUiFKTnKxPjcC9oA:9 a=QEXdDO2ut3YA:10 a=2VI0MkxyNR6bbpdq8BZq:22 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 lowpriorityscore=0 bulkscore=0 impostorscore=0 adultscore=0 phishscore=0 priorityscore=1501 clxscore=1011 suspectscore=0 malwarescore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607040192 Convert TVE200 to explicit plane, CRTC and encoder objects. Keep generic plane-state validation before TVE200-specific mode, alignment, pitch and format-change checks, and install GEM framebuffer prepare helper explicitly. Signed-off-by: Ze Huang --- drivers/gpu/drm/tve200/tve200_display.c | 221 ++++++++++++++++++++++------= ---- drivers/gpu/drm/tve200/tve200_drm.h | 6 +- drivers/gpu/drm/tve200/tve200_drv.c | 17 ++- 3 files changed, 168 insertions(+), 76 deletions(-) diff --git a/drivers/gpu/drm/tve200/tve200_display.c b/drivers/gpu/drm/tve2= 00/tve200_display.c index 26b6c65ef6fd..8fdf69e8e126 100644 --- a/drivers/gpu/drm/tve200/tve200_display.c +++ b/drivers/gpu/drm/tve200/tve200_display.c @@ -15,6 +15,8 @@ #include #include =20 +#include +#include #include #include #include @@ -52,7 +54,7 @@ irqreturn_t tve200_irq(int irq, void *data) val =3D readl(priv->regs + TVE200_CTRL); /* We have an actual start of vsync */ if (!(val & TVE200_VSTSTYPE_BITS)) { - drm_crtc_handle_vblank(&priv->pipe.crtc); + drm_crtc_handle_vblank(&priv->crtc); /* Toggle trigger to start of active image */ val |=3D TVE200_VSTSTYPE_VAI; } else { @@ -69,13 +71,34 @@ irqreturn_t tve200_irq(int irq, void *data) return IRQ_HANDLED; } =20 -static int tve200_display_check(struct drm_simple_display_pipe *pipe, - struct drm_plane_state *pstate, - struct drm_crtc_state *cstate) +static int tve200_plane_helper_atomic_check(struct drm_plane *plane, + struct drm_atomic_commit *state) { - const struct drm_display_mode *mode =3D &cstate->mode; - struct drm_framebuffer *old_fb =3D pipe->plane.state->fb; + struct drm_plane_state *pstate =3D drm_atomic_get_new_plane_state(state, = plane); + struct drm_crtc *crtc =3D pstate->crtc; + struct drm_crtc_state *cstate =3D NULL; + const struct drm_display_mode *mode; + struct drm_framebuffer *old_fb =3D plane->state->fb; struct drm_framebuffer *fb =3D pstate->fb; + int ret; + + if (crtc) + cstate =3D drm_atomic_get_new_crtc_state(state, crtc); + + ret =3D drm_atomic_helper_check_plane_state(pstate, cstate, + DRM_PLANE_NO_SCALING, + DRM_PLANE_NO_SCALING, + false, false); + if (ret) + return ret; + + if (!pstate->visible) + return 0; + + if (!cstate) + return 0; + + mode =3D &cstate->mode; =20 /* * We support these specific resolutions and nothing else. @@ -119,16 +142,73 @@ static int tve200_display_check(struct drm_simple_dis= play_pipe *pipe, return 0; } =20 -static void tve200_display_enable(struct drm_simple_display_pipe *pipe, - struct drm_crtc_state *cstate, - struct drm_plane_state *plane_state) +static void tve200_plane_helper_atomic_update(struct drm_plane *plane, + struct drm_atomic_commit *state) +{ + struct drm_crtc *crtc =3D plane->state->crtc; + struct drm_device *drm; + struct tve200_drm_dev_private *priv; + struct drm_pending_vblank_event *event; + struct drm_plane_state *pstate =3D plane->state; + struct drm_framebuffer *fb =3D pstate->fb; + + if (!crtc) + return; + + drm =3D crtc->dev; + priv =3D drm->dev_private; + event =3D crtc->state->event; + + if (fb) { + /* For RGB, the Y component is used as base address */ + writel(drm_fb_dma_get_gem_addr(fb, pstate, 0), + priv->regs + TVE200_Y_FRAME_BASE_ADDR); + + /* For three plane YUV we need two more addresses */ + if (fb->format->format =3D=3D DRM_FORMAT_YUV420) { + writel(drm_fb_dma_get_gem_addr(fb, pstate, 1), + priv->regs + TVE200_U_FRAME_BASE_ADDR); + writel(drm_fb_dma_get_gem_addr(fb, pstate, 2), + priv->regs + TVE200_V_FRAME_BASE_ADDR); + } + } + + if (event) { + crtc->state->event =3D NULL; + + spin_lock_irq(&crtc->dev->event_lock); + if (crtc->state->active && drm_crtc_vblank_get(crtc) =3D=3D 0) + drm_crtc_arm_vblank_event(crtc, event); + else + drm_crtc_send_vblank_event(crtc, event); + spin_unlock_irq(&crtc->dev->event_lock); + } +} + +static const struct drm_plane_helper_funcs tve200_plane_helper_funcs =3D { + .prepare_fb =3D drm_gem_plane_helper_prepare_fb, + .atomic_check =3D tve200_plane_helper_atomic_check, + .atomic_update =3D tve200_plane_helper_atomic_update, +}; + +static const struct drm_plane_funcs tve200_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 void tve200_crtc_helper_atomic_enable(struct drm_crtc *crtc, + struct drm_atomic_commit *state) { - struct drm_crtc *crtc =3D &pipe->crtc; - struct drm_plane *plane =3D &pipe->plane; struct drm_device *drm =3D crtc->dev; struct tve200_drm_dev_private *priv =3D drm->dev_private; + struct drm_crtc_state *cstate =3D drm_atomic_get_new_crtc_state(state, cr= tc); const struct drm_display_mode *mode =3D &cstate->mode; - struct drm_framebuffer *fb =3D plane->state->fb; + struct drm_plane_state *plane_state =3D priv->plane.state; + struct drm_framebuffer *fb =3D plane_state->fb; struct drm_connector *connector =3D priv->connector; u32 format =3D fb->format->format; u32 ctrl1 =3D 0; @@ -240,9 +320,9 @@ static void tve200_display_enable(struct drm_simple_dis= play_pipe *pipe, drm_crtc_vblank_on(crtc); } =20 -static void tve200_display_disable(struct drm_simple_display_pipe *pipe) +static void tve200_crtc_helper_atomic_disable(struct drm_crtc *crtc, + struct drm_atomic_commit *state) { - struct drm_crtc *crtc =3D &pipe->crtc; struct drm_device *drm =3D crtc->dev; struct tve200_drm_dev_private *priv =3D drm->dev_private; =20 @@ -255,46 +335,8 @@ static void tve200_display_disable(struct drm_simple_d= isplay_pipe *pipe) clk_disable_unprepare(priv->clk); } =20 -static void tve200_display_update(struct drm_simple_display_pipe *pipe, - struct drm_plane_state *old_pstate) -{ - struct drm_crtc *crtc =3D &pipe->crtc; - struct drm_device *drm =3D crtc->dev; - struct tve200_drm_dev_private *priv =3D drm->dev_private; - struct drm_pending_vblank_event *event =3D crtc->state->event; - struct drm_plane *plane =3D &pipe->plane; - struct drm_plane_state *pstate =3D plane->state; - struct drm_framebuffer *fb =3D pstate->fb; - - if (fb) { - /* For RGB, the Y component is used as base address */ - writel(drm_fb_dma_get_gem_addr(fb, pstate, 0), - priv->regs + TVE200_Y_FRAME_BASE_ADDR); - - /* For three plane YUV we need two more addresses */ - if (fb->format->format =3D=3D DRM_FORMAT_YUV420) { - writel(drm_fb_dma_get_gem_addr(fb, pstate, 1), - priv->regs + TVE200_U_FRAME_BASE_ADDR); - writel(drm_fb_dma_get_gem_addr(fb, pstate, 2), - priv->regs + TVE200_V_FRAME_BASE_ADDR); - } - } - - if (event) { - crtc->state->event =3D NULL; - - spin_lock_irq(&crtc->dev->event_lock); - if (crtc->state->active && drm_crtc_vblank_get(crtc) =3D=3D 0) - drm_crtc_arm_vblank_event(crtc, event); - else - drm_crtc_send_vblank_event(crtc, event); - spin_unlock_irq(&crtc->dev->event_lock); - } -} - -static int tve200_display_enable_vblank(struct drm_simple_display_pipe *pi= pe) +static int tve200_crtc_enable_vblank(struct drm_crtc *crtc) { - struct drm_crtc *crtc =3D &pipe->crtc; struct drm_device *drm =3D crtc->dev; struct tve200_drm_dev_private *priv =3D drm->dev_private; =20 @@ -304,22 +346,49 @@ static int tve200_display_enable_vblank(struct drm_si= mple_display_pipe *pipe) return 0; } =20 -static void tve200_display_disable_vblank(struct drm_simple_display_pipe *= pipe) +static void tve200_crtc_disable_vblank(struct drm_crtc *crtc) { - struct drm_crtc *crtc =3D &pipe->crtc; struct drm_device *drm =3D crtc->dev; struct tve200_drm_dev_private *priv =3D drm->dev_private; =20 writel(0, priv->regs + TVE200_INT_EN); } =20 -static const struct drm_simple_display_pipe_funcs tve200_display_funcs =3D= { - .check =3D tve200_display_check, - .enable =3D tve200_display_enable, - .disable =3D tve200_display_disable, - .update =3D tve200_display_update, - .enable_vblank =3D tve200_display_enable_vblank, - .disable_vblank =3D tve200_display_disable_vblank, +static int tve200_crtc_helper_atomic_check(struct drm_crtc *crtc, struct d= rm_atomic_commit *state) +{ + struct drm_crtc_state *crtc_state =3D drm_atomic_get_new_crtc_state(state= , crtc); + int ret; + + 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); +} + +static const struct drm_crtc_helper_funcs tve200_crtc_helper_funcs =3D { + .atomic_check =3D tve200_crtc_helper_atomic_check, + .atomic_enable =3D tve200_crtc_helper_atomic_enable, + .atomic_disable =3D tve200_crtc_helper_atomic_disable, +}; + +static const struct drm_crtc_funcs tve200_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, + .enable_vblank =3D tve200_crtc_enable_vblank, + .disable_vblank =3D tve200_crtc_disable_vblank, +}; + +static const struct drm_encoder_funcs tve200_encoder_funcs =3D { + .destroy =3D drm_encoder_cleanup, }; =20 int tve200_display_init(struct drm_device *drm) @@ -346,13 +415,31 @@ int tve200_display_init(struct drm_device *drm) DRM_FORMAT_YUV420, }; =20 - ret =3D drm_simple_display_pipe_init(drm, &priv->pipe, - &tve200_display_funcs, - formats, ARRAY_SIZE(formats), - NULL, - priv->connector); + ret =3D drm_universal_plane_init(drm, &priv->plane, 0, + &tve200_plane_funcs, + formats, ARRAY_SIZE(formats), + NULL, + DRM_PLANE_TYPE_PRIMARY, NULL); + if (ret) + return ret; + + drm_plane_helper_add(&priv->plane, &tve200_plane_helper_funcs); + + ret =3D drm_crtc_init_with_planes(drm, &priv->crtc, + &priv->plane, NULL, + &tve200_crtc_funcs, NULL); + if (ret) + return ret; + + drm_crtc_helper_add(&priv->crtc, &tve200_crtc_helper_funcs); + + ret =3D drm_encoder_init(drm, &priv->encoder, + &tve200_encoder_funcs, + DRM_MODE_ENCODER_NONE, NULL); if (ret) return ret; =20 + priv->encoder.possible_crtcs =3D drm_crtc_mask(&priv->crtc); + return 0; } diff --git a/drivers/gpu/drm/tve200/tve200_drm.h b/drivers/gpu/drm/tve200/t= ve200_drm.h index 5420b52ea16b..631a9f5d9aa6 100644 --- a/drivers/gpu/drm/tve200/tve200_drm.h +++ b/drivers/gpu/drm/tve200/tve200_drm.h @@ -15,8 +15,6 @@ =20 #include =20 -#include - struct clk; struct drm_bridge; struct drm_connector; @@ -107,7 +105,9 @@ struct tve200_drm_dev_private { struct drm_connector *connector; struct drm_panel *panel; struct drm_bridge *bridge; - struct drm_simple_display_pipe pipe; + struct drm_plane plane; + struct drm_crtc crtc; + struct drm_encoder encoder; =20 void *regs; struct clk *pclk; diff --git a/drivers/gpu/drm/tve200/tve200_drv.c b/drivers/gpu/drm/tve200/t= ve200_drv.c index 562f3f11812a..e2e8346acbb8 100644 --- a/drivers/gpu/drm/tve200/tve200_drv.c +++ b/drivers/gpu/drm/tve200/tve200_drv.c @@ -105,16 +105,21 @@ static int tve200_modeset_init(struct drm_device *dev) goto out_bridge; } =20 - ret =3D drm_simple_display_pipe_attach_bridge(&priv->pipe, - bridge); + priv->panel =3D panel; + priv->connector =3D drm_panel_bridge_connector(bridge); + priv->bridge =3D bridge; + + ret =3D drm_connector_attach_encoder(priv->connector, &priv->encoder); if (ret) { - dev_err(dev->dev, "failed to attach bridge\n"); + dev_err(dev->dev, "failed to attach encoder\n"); goto out_bridge; } =20 - priv->panel =3D panel; - priv->connector =3D drm_panel_bridge_connector(bridge); - priv->bridge =3D bridge; + ret =3D drm_bridge_attach(&priv->encoder, bridge, NULL, 0); + if (ret) { + dev_err(dev->dev, "failed to attach bridge\n"); + goto out_bridge; + } =20 dev_info(dev->dev, "attached to panel %s\n", dev_name(panel->dev)); --=20 2.55.0