From patchwork Wed Feb 19 10:16:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Riesch X-Patchwork-Id: 13981922 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 79B8BC021B4 for ; Wed, 19 Feb 2025 10:45:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Cc:To:In-Reply-To: References:Message-Id:Subject:Date:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=OK0ZHGv707atdPoyxbIiNPtql8j7H6On2KtejcSB/EY=; b=LaJTfybcV5c/GFfMWyJqtqtz/S Ttz8/r71rtgo7wn3qTXAhshAMOYHVhIMfWw86H4RcXUUeq1MLPjYvIWUnp/uvsy0TG/UTq4wNvvv6 Ft8eRS3S0P/5EQch9LphUCoPibIMLdPTaMMw0ylKyngGx78WOutRVbNLef2DJi+u3XHOB0vfwfhQO +WbI3j9bWef1TFMmEyD3K+nbHQ9ADsk+qYDp85Sa0ggiIxoch20OFpdYXQms+2m6DG8UyVqfAx625 oFfEWkC6Kck7htptYOuZ8t0GsdninGjEVfTxMIyctcgt8rGtitxpYiNGiFUAeng+87v21uBplWO6t ZCvq0VSw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tkhZe-0000000CCmf-1mlh; Wed, 19 Feb 2025 10:45:02 +0000 Received: from mail-db8eur05on20721.outbound.protection.outlook.com ([2a01:111:f403:2614::721] helo=EUR05-DB8-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tkh8Q-0000000C5yY-17hC; Wed, 19 Feb 2025 10:16:55 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=mWQD5bO2EnSloBtvW7a5K+V4bkk2XJdyfS8o4SoDW5st5IT+uTAqyLmyT1/Tb6MhJdqAf4eRPW31+94geD0ceuASV821who2ipWBfIHasSfuHClLo+ngvaebdAeejONGj6zxE98ftP7pClW4CV494e2ND1CJdWDuELyuACOQD5S+y/vdz43noyI+Kl1DGAf17/W5itFk2Yj1uuC7l4DUApDxNoUg+446YSVUxvdll5mcVgDdYo5D0SY/Oi/86utXtPyCotsuKG1OsjKNcNbvxwje69sxLtai9YmG6WeIAGGgtMXVq1uJoXGRyJ9Tdr2WZyEI/ttCie+hW4dfVoV55g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=tj6BxCl9fpw5Pry04iUoEkwcUhf418Q3mJRPppiteaU=; b=Vx9cfGeSfI845iFnjzqi+dCixmrdlYhT8OPay1q6iYiWjawpnUmjMOTZlmCfAJXgvPFxs46vixs/aFrCzcjQe/t+/DypTSCe6n7xwGVBv6TciFLv5UudKW3g3DMMzV8hjngA2E31YdPD2pHuVhV5ijKvYe7LneRBB8F46tXrRKEd9MCckAH0b49607fccRL8Ey67ZPnaGYxczCuXKx9ZT7oH6RvlBOl255E11UL+MtpTN/mJE6VV3C+v4L5TIDad0U8RGwctEf1SeDsDjCrmPLMF2pjDYI6IRNYyK9hJxJvGgVnXlFO1onXb7AtlbNs9zZelXQqqMItJebx7AA+wVw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=wolfvision.net; dmarc=pass action=none header.from=wolfvision.net; dkim=pass header.d=wolfvision.net; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=wolfvision.net; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=tj6BxCl9fpw5Pry04iUoEkwcUhf418Q3mJRPppiteaU=; b=JiXN2kMHesBs1WQDKr8sh8G9JWU6f1UQI1VSeESMK0AwsAOVJiQd7DO5ueJ9gB09jwp2RHdx0srwym3I5/Hb6t6JDXwvQp8C0eJJQ23PJQ4rHerejJdADyiGHchEk2mvnd+NOHxQCpxzXq8wKv4VOVv06L3JzoA/xIVHR1zOvU4= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=wolfvision.net; Received: from DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) by DU0PR08MB8138.eurprd08.prod.outlook.com (2603:10a6:10:3ed::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8445.18; Wed, 19 Feb 2025 10:16:41 +0000 Received: from DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d]) by DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d%5]) with mapi id 15.20.8466.015; Wed, 19 Feb 2025 10:16:41 +0000 From: Michael Riesch Date: Wed, 19 Feb 2025 11:16:32 +0100 Subject: [PATCH v4 01/11] media: dt-bindings: media: video-interfaces: add defines for sampling modes Message-Id: <20250219-v6-8-topic-rk3568-vicap-v4-1-e906600ae3b0@wolfvision.net> References: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> In-Reply-To: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> To: Mehdi Djait , Maxime Chevallier , =?utf-8?q?Th=C3=A9o_Leb?= =?utf-8?q?run?= , Gerald Loacker , Thomas Petazzoni , Laurent Pinchart , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiko Stuebner , Kever Yang , Nicolas Dufresne , Sebastian Fricke , Sebastian Reichel , Paul Kocialkowski , Alexander Shiyan , Val Packett , Rob Herring , Philipp Zabel , Sakari Ailus Cc: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Michael Riesch X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1739960197; l=948; i=michael.riesch@wolfvision.net; s=20240405; h=from:subject:message-id; bh=Jwfb9ka7Co1QU4YFQj1bP68YHW3VZLAiB9reUK6eW8Q=; b=OKhYHz4+QCzaXpSdhkorEkpRvpMtP7MzvcayswcXTbosjQAFqmTdmVSfnZh39E6A7SLSS54HX wGMIQoRGVvpDjepRQWBQNRU59+9+h1B4jpLr6wDZGwXxqwd3NoDapEq X-Developer-Key: i=michael.riesch@wolfvision.net; a=ed25519; pk=cSJmgKSH3B6kdCIDCl+IYDW1Pw/Ybc6g9rmnUd/G7Ck= X-ClientProxiedBy: VI1P190CA0041.EURP190.PROD.OUTLOOK.COM (2603:10a6:800:1bb::8) To DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU0PR08MB9155:EE_|DU0PR08MB8138:EE_ X-MS-Office365-Filtering-Correlation-Id: cd10669d-50a8-45fb-0666-08dd50ce80b1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|376014|7416014|1800799024|366016|921020|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?q?q1/Q8Wi/rpc0Mu+uI6PoC+KFRLAza2G?= =?utf-8?q?84OXFYoPKWx2nRmb0tJi3zp4t+05JHF6cKeOwuxpEbAvHw5KwsVh/a/6aImk0m9dB?= =?utf-8?q?KjKGC6fzqsA94p9hv1yQWwUfBTBLMordj0HOlbZdar5EaX+KZTwisIiMPrtD7bs9I?= =?utf-8?q?xi0zuTjD2cvVQEksjDADsag8e7i6hCeASwh6KeBY+49N/ZGVTm2thR8M7ZSGndLNg?= =?utf-8?q?wJCLyWjnTAxKKiUo2aS8mmzO6q1GTmIXme5qyLRXonKtrh95UBLOdK9xqqSlfDCDJ?= =?utf-8?q?rDna5sxeIv02UhidD7NDHMVSYDfPwt4JMEmuval2/qPd9v9aWqkYWB9FWON+4CHzd?= =?utf-8?q?k8lrcGhSp+TysiIgHoBmXbp/9QllN/v2rVutXi2saM4RI840HDAew5Hzptvxwu9Qb?= =?utf-8?q?9WmuqFO6vE4QHNxtjF4/RkJt3McKmei5ECmTMHN2akL0RTS0qimlhXVglHjc45bM4?= =?utf-8?q?cHOdqEBX+GvbULLfPRmSrP/wH3mlUgwO/pD/evooQewWs2NGqNbDJdFdpcQ1futKd?= =?utf-8?q?8duKl6Wc1BtrxSywi1Q+l9+dgVokZDaVDOEFNWTDnX+xKgGG70J9wjf4Iot6XUwej?= =?utf-8?q?aDOlnHLKeUDr7rFr+qiPIqSmswAXVaTaxnIZj964dKkk+NPdneifhbaLPZ2RvkQI/?= =?utf-8?q?hwBTPT9mrzfOk1gfeTgUttLZGXa6tpKui55isqZbDhwKKRK+qbE2rhUQRq41MAJPl?= =?utf-8?q?Zvr0xYBRWr3Rt64woqo/BGpd29TVGQM1KFy7j7XwQ3X35HtqfVAkYJTrZMkhhT+67?= =?utf-8?q?DHOt/h75Bj/kLxAUHqxshxSkEMmNw/yjyj45J6HJmYPtuOicpvNaDM0THOD+6CPaC?= =?utf-8?q?mjFw/AS/xziTQSokLUsJBGPIrPsnNhV9fRR7l+fpmnspnexwemQqPyHRthbAHAGYm?= =?utf-8?q?/XDNvXj3ofVE9tm+Lwud04Qh6z9rfEdAcjoAo/z/HjUrGbupbAq0ew5UehLJjj6bV?= =?utf-8?q?NGsPMpeVjfsYpUSQkTTaAGwv0iWsWA7TUsiHbyCGWwxr9z+RbrAo2TbV4EMJvTegr?= =?utf-8?q?S2KT7tlnPEJSftg2H/Mk+MBikXwCdCn1I6alKCmgU6XWi+qWLTb7VRKfJh9ONzjxL?= =?utf-8?q?pCyN9XpLhBHGBlRjRy8QskZwxCeLbXGrON6gocJIocPU9gnW0VHHRGPDZnjELtjV3?= =?utf-8?q?/SVpMx8M8bUi7eW75HpfMnEbthvGbZ/klc7mDlEfH5IrMblB12XPnBXjzAn7DLmYP?= =?utf-8?q?pQZm2ZLGYgYmtn6B9b4koYjDPH657jf29XJrMp5+xFhQ3vGP9rDWoiu2jPgIDOida?= =?utf-8?q?4QvM7WMr+MDwz0se0xLpwGULKtg8UEthaaD8tDPDntqn3lmAXzSgKF4/M26NT35uc?= =?utf-8?q?HlkJSj57m7G6pXCYIumydTyGSeq3rOC9YhKslCiwQAX+U3qck6R258zP6dcpI1IEO?= =?utf-8?q?I9Q54syNMyGn0NYMZKLHq8eSOJbXVRymw=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DU0PR08MB9155.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(376014)(7416014)(1800799024)(366016)(921020)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?dnzH4oteez031PvQMtrheppQpcRu?= =?utf-8?q?ymdpz1r+wx9NgPJH2bBkxT4F6XFMboJSO5j2oteF11YnVuPYMcyzSJimbb3F8WIlG?= =?utf-8?q?1s3xXfs8zAgg4UOibZOVJFRisWhZczfsJOPcqlKyfQ2ZhDtJn4ECbL+sI0flyQ81Y?= =?utf-8?q?drRdSAJof05YNZ5y2Sq/8rMPvr0Ienuc84/HqGOnHGhSaD0ZaBYsESgwn2QxZQr9K?= =?utf-8?q?tPmqrWyYw/HyICZS/f3TcEeC4BrRhvtv9+klU3CcGvWXY0pzHs/KsINXGz7uJYIQ5?= =?utf-8?q?oZDAIu90Q7vbem1lCpomISZbgHB/EkB3hEPeLkxectpgk+Npkh2qwRjGWzFARpgqG?= =?utf-8?q?5LYFnsyoZXg7M11fv6wbX2OanquLPnpeducni//GDSnWHrJYoHsi0Ldxai+/bOOBp?= =?utf-8?q?UBwrd/ugemlMC/5QtA+mE9H43FxLyVrR8GX/7FBSncre6qNXNPGmvLXy/DVLUNSIn?= =?utf-8?q?7UFZZn+0bZMJgJlwwModQfLle0dAzjxDYpIkh1Aq/L6Gy3JHOmwKnYhQUT8h5JlQ1?= =?utf-8?q?HDg2gkoYZMqQrHceg4geluDqnv+fhuLnXjB1miOl0IcZhzLqtwL4xXifY3o+7Goc1?= =?utf-8?q?zKyk2+8P8f3z25YGWequiml1ktCv3t9DUNxWLaZuFIIbWdN0gu3KCjVw+0fSX0ONS?= =?utf-8?q?aYZAWB5BmUEmXOtN9WMZpmob5i1kzI67hIZe2c7pFFh0HO9FKmBfnFyT3A3NfztTe?= =?utf-8?q?gIMMjU/iKpQt3Cam3GMtmYvz4aVJkwBeD+vi1oXtDwcu03dXni83+es8IkJCjqsHg?= =?utf-8?q?jdP7Iv1XVhaMBDyHjIbJ+HQEg41mWG060zN1b/gFLeP9gH/omSUA2QWZoKHIrgA4k?= =?utf-8?q?VYz6/+khK/zkmxHg2EwZvmXLfbQEtA1gr46jeasu/tU0PxqBkIspB/HTkNv6JQnMx?= =?utf-8?q?valqp47XvWhmE13xRXTTdbyUzIifKGnSeUGlREWSMV9Axqg79ZJOdDGXNFDwCduoK?= =?utf-8?q?6O/RTPQnR7c4ymyJnu4mdv9E3+IrQQRPepd3pfZNzoDFaFMuQFigsG25t/pb4L28M?= =?utf-8?q?Po8sPip0hMlOVxBdnGaU8gi3uIcg9EjSf0toFoGMubLR05/gkvzlLAezCqCmk4wuN?= =?utf-8?q?MyCp5i6g5qFPLMXzMMTMuZFR+4jphu+2NN/gsEPJU+X3NlK2hVMz3Tnwiz/xI9flK?= =?utf-8?q?sf2iTG3iHJ8N7qpnaC5MoXp9Sv6DhY56ja15IHWyHXJg0HLk+dHEFCAZt0lg8nVOU?= =?utf-8?q?yrh3zppe7FdM5jF3C/mBPJ4A6A4YPiGwnNKzEMmjTo7QRzllvhUmLT4D/mQvWApbo?= =?utf-8?q?mGV7K/1Rj0z2P4y2FSQ27QGyEpYmd8RB/9cgRpUpmfMb5Xzj7D+dgCXJiLh8UMnPE?= =?utf-8?q?PMe1Wx74IcJxWA1WKiZcXjRWAtwvjHcJVrGw8oyebqEKhx6WhKQjMJaRAZ86xVOhi?= =?utf-8?q?JgJiJWpWNjcz8pkNUW7HEB9LVe/9kYHhPsXg3oaFD1KRB8+o2VlMtzc6iZ74krRkk?= =?utf-8?q?oMRslyUaOzL/s33cakAbmKcip9t8YZr9a0VH099vOGbJqUPJfG4PdvWj9ywo2CNmm?= =?utf-8?q?UW+nhI1YSRSQNDoczV/oP7TY5I/XQ8HwtQ=3D=3D?= X-OriginatorOrg: wolfvision.net X-MS-Exchange-CrossTenant-Network-Message-Id: cd10669d-50a8-45fb-0666-08dd50ce80b1 X-MS-Exchange-CrossTenant-AuthSource: DU0PR08MB9155.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Feb 2025 10:16:41.0825 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: e94ec9da-9183-471e-83b3-51baa8eb804f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: AFsZOZPSfaXxjVVrDer6Y/FQewzXkbNmLQOy38ATNHHAd/xDoX9rzRO/aI39GK/bXOYyixb096Eq0b5V83Giib8Ua/0QNEUu2EKpsK3NLgM= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB8138 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250219_021654_310046_835D0E73 X-CRM114-Status: UNSURE ( 9.91 ) X-CRM114-Notice: Please train this message. X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org Add defines for the pixel clock sampling modes (rising edge, falling edge, dual edge) for parallel video interfaces. This avoids hardcoded constants in device tree sources. Acked-by: Rob Herring Signed-off-by: Michael Riesch --- include/dt-bindings/media/video-interfaces.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/dt-bindings/media/video-interfaces.h b/include/dt-bindings/media/video-interfaces.h index 88b9d05d8075..0b19c9b2e627 100644 --- a/include/dt-bindings/media/video-interfaces.h +++ b/include/dt-bindings/media/video-interfaces.h @@ -20,4 +20,8 @@ #define MEDIA_BUS_CSI2_CPHY_LINE_ORDER_CAB 4 #define MEDIA_BUS_CSI2_CPHY_LINE_ORDER_CBA 5 +#define MEDIA_PCLK_SAMPLE_FALLING_EDGE 0 +#define MEDIA_PCLK_SAMPLE_RISING_EDGE 1 +#define MEDIA_PCLK_SAMPLE_DUAL_EDGE 2 + #endif /* __DT_BINDINGS_MEDIA_VIDEO_INTERFACES_H__ */ From patchwork Wed Feb 19 10:16:33 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Riesch X-Patchwork-Id: 13981924 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 6081CC021B3 for ; Wed, 19 Feb 2025 10:45:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Cc:To:In-Reply-To: References:Message-Id:Subject:Date:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=Zum/IDSynlwCPmuCv6Xa2UfDNa71Dl1ucNm+YT1M0vE=; b=T9PYPPWl7p7psxEpN9qhNC/XXT WvVaCZbPjKV86TwlS8WMEZzaGCNKyDyKdgxfegFXpAXCeK+yTVTP5BQHEFyUTyx9BRQV8cG2amvTg DkHVXOXlrhlBK1ioV5C91htY32Zin+wp8T7kRTEwZeTokpT6NlMeRM93RLLd2/phnWOMEYYE+GV9R GlJ5Wk6nK2mKcnOGzLqrK2rbSY/MX59OT12meayAxe70MV+sLTj1N38rT5XnA3oO2UXQB0xBlCR7U wRnLk0aeue4i6qvWTdmyAMk7wplgENa4sSqdesnXMFVezijXNiDU590ITKYlQpN4prFTnVPSfNO1t +zWQ21Uw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tkhZc-0000000CCjL-1UFD; Wed, 19 Feb 2025 10:45:00 +0000 Received: from mail-am6eur05on20703.outbound.protection.outlook.com ([2a01:111:f403:2612::703] helo=EUR05-AM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tkh8N-0000000C5uU-2wtA; Wed, 19 Feb 2025 10:16:53 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=bj3q2g1lSe0Pe14z2imwmx/ugOiwUhPDnOO73SHOG7FntOEJqTdlR69pXLBa+Vbfp9VrmCJQFG7Zx6zu2HJ2HaI7AYIbY6eYnwH3reXDV69T7CSKG4KEcA5s+0hTRu+N7adxyk/3hJKKz5QdXisSuZbC7ZiOHeVElIFcMsWqd2IKa6SL1C9ghV+El3DKh/gD/U6Eq9P34X8zfl/u3kLu1qwxN+R3haRl+mRpvWVxRdH8SOynOAngn9Ixop1KQyH/Y6U/5jNW3kfMZ94f95oEq+2E9G52CAVi3FhGcpmyMGJ0o/q6iG6BQqz9ZMgE/FmWtcahwhugVne5pz/1E3w02w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=GAevX8DPPJJwFpeEZsZj9Ll8Xy/l/5Dz9tCfFmx2VLA=; b=kVzm2YqTYBhohHJ0oKhScJY+5wSJMy+zqc9RqiDBuZuZA/p5kHXJjTBE2mF+bsU9boAPawebigsSu1OEGAPsnYUEO0khrSxpbt8ehPxtO/PR5ObYmfk01Vt4mDK+Piaa0pZ/kp+ontK4n4iMzMJc+IqegXKni/d6F25YsXdiBWCeOg0g20ZTDwt/jMqj2fvOJAXpNMIIT/ehQm/WtACE7GjZplivHCVmOAhYWQCWFSX4+KwT78ttAaj3gVN9nbuWnLwmrUTUtjBVjK1VDGVE/j7nYY1tjRsLPzsMHwZ8ZGL/Z3GbBHE4Mi+FRRqUX+F6z3B90fNkvaK5nO5gui44Mw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=wolfvision.net; dmarc=pass action=none header.from=wolfvision.net; dkim=pass header.d=wolfvision.net; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=wolfvision.net; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=GAevX8DPPJJwFpeEZsZj9Ll8Xy/l/5Dz9tCfFmx2VLA=; b=OO7b3PcgjDZzqSR6BvRCJaP26WTWZDvphlyZdpNk0Q6jPuWANlV5b6hKIp69eEcGKVSZfMdSnDCa8aTvXjQh2wYsJ5/VQdbEOjeunGJr9gquk9wOtr9trDnT8WyPuPmeNN0pfMOxROCzLNuYaizDMc5gy8fcOo2L955Sx8xlTRQ= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=wolfvision.net; Received: from DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) by DU0PR08MB8138.eurprd08.prod.outlook.com (2603:10a6:10:3ed::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8445.18; Wed, 19 Feb 2025 10:16:42 +0000 Received: from DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d]) by DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d%5]) with mapi id 15.20.8466.015; Wed, 19 Feb 2025 10:16:42 +0000 From: Michael Riesch Date: Wed, 19 Feb 2025 11:16:33 +0100 Subject: [PATCH v4 02/11] media: dt-bindings: media: add bindings for rockchip px30 vip Message-Id: <20250219-v6-8-topic-rk3568-vicap-v4-2-e906600ae3b0@wolfvision.net> References: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> In-Reply-To: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> To: Mehdi Djait , Maxime Chevallier , =?utf-8?q?Th=C3=A9o_Leb?= =?utf-8?q?run?= , Gerald Loacker , Thomas Petazzoni , Laurent Pinchart , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiko Stuebner , Kever Yang , Nicolas Dufresne , Sebastian Fricke , Sebastian Reichel , Paul Kocialkowski , Alexander Shiyan , Val Packett , Rob Herring , Philipp Zabel , Sakari Ailus Cc: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Michael Riesch , Mehdi Djait X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1739960197; l=4443; i=michael.riesch@wolfvision.net; s=20240405; h=from:subject:message-id; bh=NsTFkcABzB7Oz4O9mN4hbSE8/lW18X7tv64zaWMvP0c=; b=tEjWmYaw9XCfi1mBEFzvx0Z0HEEZcWdbxF5P/5q+NFM6xvyEa1yiqkTb/FxWeGLB4658vt3bg kKrV538z0nKAuFc7+zG4ZecJqLe/PfMI/EXvq7GHzwruxEZITjrzeBC X-Developer-Key: i=michael.riesch@wolfvision.net; a=ed25519; pk=cSJmgKSH3B6kdCIDCl+IYDW1Pw/Ybc6g9rmnUd/G7Ck= X-ClientProxiedBy: VI1P190CA0041.EURP190.PROD.OUTLOOK.COM (2603:10a6:800:1bb::8) To DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU0PR08MB9155:EE_|DU0PR08MB8138:EE_ X-MS-Office365-Filtering-Correlation-Id: 895570b1-3002-466f-0479-08dd50ce81b8 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|376014|7416014|1800799024|366016|921020|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?q?rqgqexPs8WkTdOQSVy7RRKAchtXJ+KN?= =?utf-8?q?NExFabhrFxTceMM/PkwilpdW4iMqRdghKODwpXtqiTHPlKg4UzxErlit6g5aAi3p+?= =?utf-8?q?/BQboknp/pU5XJGg0qDU179nQpPWuZtShoUsdMg7o8sVqeMNSAawCvk1ChL9Uuk4m?= =?utf-8?q?bdxyYhBjziBrM6AwglkjVtCJrBSizo1b5ngMHjYIP5XR48z148LEsZurr9zA39nwR?= =?utf-8?q?Cjn0EfJDqOLzSiMzNuFZ3TmcLtE3TD1aaswmZo+Ai4Eug8LsDdvModG+sUvKa0qEw?= =?utf-8?q?extP8sLZR16Soawoo2esOXF2TAcYwb3ht8bNtIjGu8AgCrHQuK2QifNcfPm9i9y0+?= =?utf-8?q?sFs2Yr3QmAl4vTcA/FkMYXACKJL3NSFh+gs+ruZ0srudfwDNQKJITDh4d9ECvxO53?= =?utf-8?q?yKFTVsuDRte7fx4+nRbr0HR6/2x7YvXW5z5NYgbYrTp/bCJ232KjIIAMFPKVcGVNR?= =?utf-8?q?tPy3iho5e0pUNW0CLo8dF4NQPGkAjJ5C1oLPj0iS2OWm4CdMEk+2qek7L/z2jjICQ?= =?utf-8?q?n2iicisWg1hRMPd52CVT60XMHM710CzCUd8BRt7TPHa98lach4ze1yxqVqLiQWTDk?= =?utf-8?q?HpNh5BVjOCKfeL5F3xCqAmXyxMQVwtuhtAHPV5mO5SD2dlz5ZoQzoPDZrm1viz9cw?= =?utf-8?q?H/Xj9v+BitQs1WU3XNR6POYwt2LBoz0SeIZr4Yv0xCZVEQoImaAVDaavujTFZjgQ1?= =?utf-8?q?Y6Zsmo1V7sc43jMAAr9lPnPNGxOwoWDwWLRccLdHML41xXCexOaVDQfKdBgnTwwTj?= =?utf-8?q?2Ht5u/jlKQS9REOQHqlq5QZHSgfLcrR7AzU6Z10n4Efbp40Q4DGW0ZnCLECgsNSmO?= =?utf-8?q?doBaefOknjKLY2xQBAIB2fCoeP9au1DBii8zMqPRkVZdRxcfW8njUR4I2OvOztW6o?= =?utf-8?q?8PJxukg4s04CNk6sm0QXu8eEotFKs+eEjn/Vwpt3BH1x4+kXbbXMDqaGxTMvY7Vhx?= =?utf-8?q?dFm+C/+PC/W1ZmFoZ8xYW9Fpt8fsJyUXxPOkyYMk043vQ68MccUKxOc++qKE6qnou?= =?utf-8?q?Nqii0g+hMZENhMG69m/v1LQCYpc4r/TkK3+gebdSP8Rhqe03KoaBcAjaTxQK7bbU4?= =?utf-8?q?4cHlo4pANHMDNMSkUsasTl9i42HsKwobxAevkMDh4AHy8/0uaaa32TMyVBK0Wxm/a?= =?utf-8?q?tfoAIArQY5X9UdITyUkAK5rYkfEVE+BbqrkPZF7UPIs7gvd45XPTVyDFxcfGIeBJC?= =?utf-8?q?rlcpxgC0bxqvuCk82n7/pVKRxojDNCGJIPKD8gR8yKjj3p+lobs8U0knOGtGuk5nC?= =?utf-8?q?gl4R42spq3b+mN0Ec7WVIlQh84AiYGRd1JxW61392qHs7oVPOz4voUw4+pjATziDv?= =?utf-8?q?SznekzWk3PLMGUMapFkbsHZ9P7Fm+o6W8A=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DU0PR08MB9155.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(376014)(7416014)(1800799024)(366016)(921020)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?rl2UQd5NgqPYDhU3ubh/PN25t+n3?= =?utf-8?q?ZdO83O5VWMJTf2dGin21B+vMtdsgBeVbf2PdILhMEDjZbLXe9uPsYyA+chC3wTnML?= =?utf-8?q?Ikqt35NciD/AJ0MlX6rP7OtQ6RWh6fpPjnP3DqUfuRT0Oby6jHVKk3HFrao3htYCT?= =?utf-8?q?PT0G/A2Y7rJw6EA3h5bnLyElSnFQDDbiDEvxqXAgZdYWXLJBcv0sUklkyjMDzKR5X?= =?utf-8?q?QlrtNAqW4eRkddoCztz1mGZbASvatj7MbhZBKHSWGUoakBPf93DrYEaSbeWzwtSIC?= =?utf-8?q?v2xCbCTWLDW84IEbImTriDRu0n+d7VM36Akji+PlBIpZOvGMlIC1T2wIL0M77Qx5k?= =?utf-8?q?xt432Z/CtBxIHmRZANPOOVRCofiK5T93Zxu6FgfSvBh6h/7VkWiWunn+18m3rJwFg?= =?utf-8?q?YIdRUCf7iQefvuTfzEzxaHWxa97wlQxH/GeSCMvCTrMvxmRXv81zmD+6zkl96a9bC?= =?utf-8?q?zrdkuBvGHnSA8DV3PSVsOjWtMNG9W/0aVSrNbfver3Mjr/0enEwCE97d+O2ud6f8O?= =?utf-8?q?zfhO2C+2lYOlQT2/WK/kHfkDZmAsp9rjmrivVAvkU4puRHNVhWDECWFELTeoDNjT4?= =?utf-8?q?XbJZsb4jeIy6MprEWP82fJhDUOq9YqMyaHkwzUH4rCBcihq12WNQoSi/xNTpZSrAg?= =?utf-8?q?MFzkh1/Tiup4iL5Bm+uejhNNFz0oGZqlsAD9fOQYJEYP5BUTK0yuXiXOR3TNvHJgn?= =?utf-8?q?fKD2U7EJn33AwvWh/l1HyusEKaFZOfQ3ZlZO9yyQUl8qjezE8jQmBEMleLiCGM+5J?= =?utf-8?q?ECa2NcrtoiH4WpdeO3XLV4rJqcT6Ghxlc/bLb41eZwP6QjWAN/2yoXILUVpmfWkOL?= =?utf-8?q?IvHedJG8pAMGLJdOprB7w6ZdRMCKoAnSBC2cCaLn6jZUPAYTxrENFn6xigYJiaFdU?= =?utf-8?q?maK6vudNY7R/oCdyyZ85kqHmRMM/P/gFCqx8nQdXm5YexfbQm0qbTGZE1qU/guvRK?= =?utf-8?q?vNcl3C6y9skJJ0q6Se3wP6jFlaq/I5Ckk22VOyxzTD21y7Ly/t50qCfPZMx/x/fR8?= =?utf-8?q?Gll0sAi99PtAG/jbctyPzAM9WoSCwq5BUuUQTeMbcEiMeP9w82tCD0Hijp5Du88xE?= =?utf-8?q?YClIuoubQyZJ/KN6Wl3NbsRtcB4ZMlTiHxI1ziShmCL75XEtxFUMKp7tHBMpM6/2J?= =?utf-8?q?sq79zO47kjMxUqqbJBRqZKaXQRGxrj+c75yntUcNYfOHhXTqD6uOhZEXEHMESVjiU?= =?utf-8?q?azYzTzZIU6YhP2YdJE2AtZ8lQkrVo75o9REXVkIDApidAW2xVzm7wgCkCBvqPzqU/?= =?utf-8?q?+myshQ7rDZsiyCqIsGI7MrJ/nvMuDkJCgXR3cFfqKcU0IeqxPKOsfwsFHp5g3pFTX?= =?utf-8?q?rXSwoX70FSv6TDmk5vEriQve/gRFhHHd37qLtkLIeMkO10g61RsnruwOZ8TFqb6nm?= =?utf-8?q?1fjCFtztKCUb5zG5Hvo+UcveQXnauN2lTezouyZhAUsYQupIfEVR/ljLBFHn7uqEP?= =?utf-8?q?79zoG3enFDcqpz4ULEGCWfFymVcNrfw++YxdUxo3T9ZODuoJ7EwZJ5asJqkgSZwBu?= =?utf-8?q?5Nccf24HjxOkY1Uc4sCoYgpyoOLqFQlkBg=3D=3D?= X-OriginatorOrg: wolfvision.net X-MS-Exchange-CrossTenant-Network-Message-Id: 895570b1-3002-466f-0479-08dd50ce81b8 X-MS-Exchange-CrossTenant-AuthSource: DU0PR08MB9155.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Feb 2025 10:16:42.7639 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: e94ec9da-9183-471e-83b3-51baa8eb804f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: XYq2l3RfeEIeUPPxAGPI5QMshctrvx0Sm2BlCBpvic05JRft/5j9zj9LZzc9ONFVjugL79Z7Jedh8XEzwFDK+p78vJ/4HeNIJEBvT6oJvko= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB8138 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250219_021651_756598_3E487995 X-CRM114-Status: GOOD ( 13.83 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org From: Mehdi Djait Add documentation for the Rockchip PX30 Video Input Processor (VIP). Signed-off-by: Mehdi Djait [revised description] Reviewed-by: Rob Herring (Arm) Signed-off-by: Michael Riesch --- .../bindings/media/rockchip,px30-vip.yaml | 123 +++++++++++++++++++++ MAINTAINERS | 7 ++ 2 files changed, 130 insertions(+) diff --git a/Documentation/devicetree/bindings/media/rockchip,px30-vip.yaml b/Documentation/devicetree/bindings/media/rockchip,px30-vip.yaml new file mode 100644 index 000000000000..d34c0974204f --- /dev/null +++ b/Documentation/devicetree/bindings/media/rockchip,px30-vip.yaml @@ -0,0 +1,123 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/media/rockchip,px30-vip.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Rockchip PX30 Video Input Processor (VIP) + +maintainers: + - Mehdi Djait + - Michael Riesch + +description: + The Rockchip PX30 Video Input Processor (VIP) receives the data from a camera + sensor or CCIR656 encoder and transfers it into system main memory by AXI bus. + +properties: + compatible: + const: rockchip,px30-vip + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + + clocks: + items: + - description: ACLK + - description: HCLK + - description: PCLK + + clock-names: + items: + - const: aclk + - const: hclk + - const: pclk + + resets: + items: + - description: AXI + - description: AHB + - description: PCLK IN + + reset-names: + items: + - const: axi + - const: ahb + - const: pclkin + + power-domains: + maxItems: 1 + + ports: + $ref: /schemas/graph.yaml#/properties/ports + + properties: + port@0: + $ref: /schemas/graph.yaml#/$defs/port-base + unevaluatedProperties: false + description: input port on the parallel interface + + properties: + endpoint: + $ref: video-interfaces.yaml# + unevaluatedProperties: false + + properties: + bus-type: + enum: [5, 6] + + required: + - bus-type + + required: + - port@0 + +required: + - compatible + - reg + - interrupts + - clocks + - ports + +additionalProperties: false + +examples: + - | + #include + #include + #include + #include + + parent { + #address-cells = <2>; + #size-cells = <2>; + + video-capture@ff490000 { + compatible = "rockchip,px30-vip"; + reg = <0x0 0xff490000 0x0 0x200>; + interrupts = ; + clocks = <&cru ACLK_CIF>, <&cru HCLK_CIF>, <&cru PCLK_CIF>; + clock-names = "aclk", "hclk", "pclk"; + power-domains = <&power PX30_PD_VI>; + resets = <&cru SRST_CIF_A>, <&cru SRST_CIF_H>, <&cru SRST_CIF_PCLKIN>; + reset-names = "axi", "ahb", "pclkin"; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + + cif_in: endpoint { + remote-endpoint = <&tw9900_out>; + bus-type = ; + }; + }; + }; + }; + }; +... diff --git a/MAINTAINERS b/MAINTAINERS index 896a307fa065..bbfaf35d50c6 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -20401,6 +20401,13 @@ S: Maintained F: Documentation/devicetree/bindings/net/can/rockchip,rk3568v2-canfd.yaml F: drivers/net/can/rockchip/ +ROCKCHIP CIF DRIVER +M: Mehdi Djait +M: Michael Riesch +L: linux-media@vger.kernel.org +S: Maintained +F: Documentation/devicetree/bindings/media/rockchip,px30-vip.yaml + ROCKCHIP CRYPTO DRIVERS M: Corentin Labbe L: linux-crypto@vger.kernel.org From patchwork Wed Feb 19 10:16:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Riesch X-Patchwork-Id: 13981923 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 3F3C3C021B2 for ; Wed, 19 Feb 2025 10:45:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Cc:To:In-Reply-To: References:Message-Id:Subject:Date:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=zrk8KEwrl4ipSg+jX7ORS57Gv02h5dnRbyOuLA4KOL0=; b=hTzn6V8Ht9rrH4gXt4YD5Kn8I9 40U9rzWU2F6t8y1E5YdJdbRgGUifpgAVci4tkSnkzQaiHGExXzNxoyMV1MRb9LK+0R849MU52im1g TLPpftyhQJ0kO9DFzhE5Eh6vx99aPHGjCA/im/QcBkOb15MfjP7V0cq9gXAB2v7G+EVQ7uuYhHPyQ z07Q71I6+pPRIM+Xz6RHj2Te6Aityjn3kGoL9zC2oPDthuHe0v5Tf6cqr3ly+qx9anhfTY1RQUyo3 v79C6imw6yIwRtMy2/h9LlKFjPogJkK6b2/V8Qfm11vRXJehK2LeS8pYADXgDAHPMac9cBDAuvJrL OWzlwhsw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tkhZd-0000000CCl6-1iMu; Wed, 19 Feb 2025 10:45:01 +0000 Received: from mail-am6eur05on20703.outbound.protection.outlook.com ([2a01:111:f403:2612::703] helo=EUR05-AM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tkh8P-0000000C5uU-1y9y; Wed, 19 Feb 2025 10:16:54 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=VQA0ZuxBCB5XZ5oQtITXPzqavx/nkIDggzM1J9pwsRKQCGywwxUyoIPKO7HlHm80nmaoeTRJKoNUk2VlfGDoN/WRB4vbFb/YGays0nodTcoJdEBGzBLzALo//xRo1SwaaUavdK7bxk656QwjXOQLntrsaarj1OUaM5dzVAuFyu6slb3CK9y77vCIX7Qp89iZ2W/de3CNSxOjkNibb2qGt4Hm1LBA+Z+zC4lV59SOeMO4IikxC4qsqTR+tOTyNiG1Djz1Cv55ldQw/9+f2aTl92tCbr5R/7YbQnacJVdxfZmISwTnQQOrau5GUbPE5/N+WqBmbWFBA00NwKXE1sYqZg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=GsKNbYqhhEfds3zYlOEaEzUmOcWkgR6/7ip9ZUzohzA=; b=iCj4cciHCr02umvazlyD8VR/33NilwIv9QlGQxJm1wvc+WzpZj+xtbZFAz15a/n0bzmRaiMZKo/dQvEjw6h8bsu6bvVbe+ra9xkRa+wFle1JrE3a4j/NNlwBcCbdeM5IVE3Kt925uvN5JMoIJK/ZkSBSjcRj5lr3HW4HztMRiyU5r2yKEnVPP7Ekb+JqhnMQswz6SkXRMbWVDjxkcPtdolB6iHljeTSgzF3pEXMA0qOcCdRBhRej+RYhcdU9la8KbfkYRlBHwwuWKkpgICURhQwr2zoPfcviVTK5SDM0QbSBDUXnsR63CouO1YBEGjfsorhkYCiIUYKIMOKtfzGr6g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=wolfvision.net; dmarc=pass action=none header.from=wolfvision.net; dkim=pass header.d=wolfvision.net; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=wolfvision.net; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=GsKNbYqhhEfds3zYlOEaEzUmOcWkgR6/7ip9ZUzohzA=; b=DW2I10eGN2EELMGMhsUPgMhSr5mfu0h+pYn8yrAFk+UVUGwtbNuu17VkYkUwKeJXtozWX0iRppaB2kVWUtE73CiHs3YWXr7o2EnlmWLKvoZv61A/elSV3XNM2M5sAyPMUn0hDYFr5zzcktIb0KdBaB0QeIOVaQ/AiNk+Or+JkXU= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=wolfvision.net; Received: from DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) by DU0PR08MB8138.eurprd08.prod.outlook.com (2603:10a6:10:3ed::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8445.18; Wed, 19 Feb 2025 10:16:45 +0000 Received: from DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d]) by DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d%5]) with mapi id 15.20.8466.015; Wed, 19 Feb 2025 10:16:44 +0000 From: Michael Riesch Date: Wed, 19 Feb 2025 11:16:34 +0100 Subject: [PATCH v4 03/11] media: dt-bindings: media: add bindings for rockchip rk3568 vicap Message-Id: <20250219-v6-8-topic-rk3568-vicap-v4-3-e906600ae3b0@wolfvision.net> References: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> In-Reply-To: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> To: Mehdi Djait , Maxime Chevallier , =?utf-8?q?Th=C3=A9o_Leb?= =?utf-8?q?run?= , Gerald Loacker , Thomas Petazzoni , Laurent Pinchart , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiko Stuebner , Kever Yang , Nicolas Dufresne , Sebastian Fricke , Sebastian Reichel , Paul Kocialkowski , Alexander Shiyan , Val Packett , Rob Herring , Philipp Zabel , Sakari Ailus Cc: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Michael Riesch X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1739960197; l=5785; i=michael.riesch@wolfvision.net; s=20240405; h=from:subject:message-id; bh=1KgRs60YsY5MkPQfV9P23YyKQHKBCw4RhAHsRw+Z8uY=; b=GLVvQDokJMAsTkPlynliDMcs/IiuL93ZH+p2AEmLaXyZJEHMcc8btE6HArgI/HbkQu7twZ3Ig wTbMzJzDPsHAoA3bLtCtw0R8dBzKUAOBxyP+HE0nvQn0NEJrW21MvPi X-Developer-Key: i=michael.riesch@wolfvision.net; a=ed25519; pk=cSJmgKSH3B6kdCIDCl+IYDW1Pw/Ybc6g9rmnUd/G7Ck= X-ClientProxiedBy: VI1P190CA0041.EURP190.PROD.OUTLOOK.COM (2603:10a6:800:1bb::8) To DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU0PR08MB9155:EE_|DU0PR08MB8138:EE_ X-MS-Office365-Filtering-Correlation-Id: 8a670d97-b9ea-420d-f4df-08dd50ce82d7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|376014|7416014|1800799024|366016|921020|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?q?F4foUCbdDjKCqARqGqJXOwvF485BE5t?= =?utf-8?q?RpNWrtpH+VrwWKv4eW/PL1LtJQLmhBsOivp4+svXtqG1y6Yvm3RVDoUkP+uzelcF5?= =?utf-8?q?rmOuWuJuJX+Votl8l2KEkB6mPXVtIwfETwV5Mq5ItzrprqPUuHQzIOmEJd9G4fdve?= =?utf-8?q?PujntW8yFPmj7FWn2m0Yhoo5ihI+vNu9FIi/HL2u4d7tub3DmmQA+TXx2MY5ZZ8q6?= =?utf-8?q?uqHr+sYVXfw1i+rJPb7mknU9M8aOSpEfOBfSSNvrkcCZvojT5huwRPeIVicdZVgEs?= =?utf-8?q?Syrvz0GdENqjkWduGzvDgujyUXyJmXtZ6d1xkqlsJMG9cFAK+Gx4RfJ4Pnma8bJ2t?= =?utf-8?q?iGwJ6QDZmFbVldhgl9EsYDESsEIj7Q5/PBJhwK1FxIloIOQye1Jedowh2AYrZZW+G?= =?utf-8?q?BkCShgs7aP6TyvPkoW7+ZJwWb5w+zQ+KRbBIPgPt4IHK6lLcNh/TpdSm4xt9FL7c5?= =?utf-8?q?ND01SwxYeSskyxZq/A6X9tGkBgx+pECAurwQXYgxq3NXlKI9aZMEoB+8Ym9py3e9s?= =?utf-8?q?FZT84paJ7UfA33w7Ysu4U+lHvgkcJFHFgk2wwSu8BbxpBSdWLMvK83u0fL+uZtplq?= =?utf-8?q?3Lj9543XMLp/PF/bAL5YSwL/fTDNWHzPyvMf66oRdUjj2Py0BDtaBIsRTHhg/UPYD?= =?utf-8?q?O0ixsREuXULmFu1/nSEzOjF06TbW0Iq6+JGd5+wxg4qI3VOmjjZJ3VxtzqsPKa/TK?= =?utf-8?q?Z+4Wc0yuzv4ep2MqcLGBgZsCiW+OkGKf+fQLdNAfLbl9ewIavYS6aFjhwvJ9aLvEU?= =?utf-8?q?Je0OfaTCQatkvFthpVAudvYkhD+fHHzk8p+vRD4acQ+cJzbtiokny/HQrBrQDRe/r?= =?utf-8?q?oETaa3K8Ex6+K9xNAaKODSzeVUKnLYE6hbM1fOq8/B57NXQevdIDN0sTmWi78R/7z?= =?utf-8?q?Za9fYauI1Cv6/dhAVsLc8rBBP6J0iQS08+LvHj344qK+BKIPvZecS0e0+pj5c58pS?= =?utf-8?q?LmMdmh88nIehfavr9UBdTzxAreCfldhiUSbOFd/UOCUtrHDd+GxOTo7jlvcb9lvaO?= =?utf-8?q?wn8bQ/pYuDDSx/FJ5UnZjZsMUMuZaQMDRedYaZjLf69XrO7gKwpZx2/AFwXFMSDSi?= =?utf-8?q?N0oy1PwVps5FeAma0MhxSicG3BiKtSDqyWLhnwM7WEkcG0LM1ejMYhnfXN6GN0CDx?= =?utf-8?q?DvKA7GxfbNvoDNnHgUy86L3SiPLQcHm+skz1eTxeOEjL6RIBMk5HBAWIDqKJCYFkH?= =?utf-8?q?0x+6IF2lcTq57XjrRZulHo49MUfHfctv5HUfC6VAQfupDsNannNy+8YvCJFmWPEHl?= =?utf-8?q?UwMLktU1Bld6Hxgg44WVAnBP8yYpLEvsceUWAzriXhtUUqfc8iopHU1548LEUE3Cp?= =?utf-8?q?92eayjCsA7yzxkrtH9pHk7oCAOi3pOLbRw=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DU0PR08MB9155.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(376014)(7416014)(1800799024)(366016)(921020)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?pazVVMaQ9lIOwyRjdtfh77iwTiPw?= =?utf-8?q?xfxgZodQiLDRb5Fnmgq+E0XgaQmzRLinIZoP8HvGzSFMVW56fpqouDsjwtQwdk4k9?= =?utf-8?q?+EeCJog/AsvasRxS1QaQkjvKe/bkGeO0HrvTXrTCarq65zjDRhBBK19zXLptcnDdi?= =?utf-8?q?h9BgGlZBqGGkvfhBnXktH2zWaNWLhQVQgUL8LCLVzDDeerXUZFaz2tBK8vBEGkneW?= =?utf-8?q?ow8K2hULTf7/MastGM4hBJB/auA9Mn+i6u4sj63cptb29WFTxRDku3qALBC7t3O9w?= =?utf-8?q?y2FDsYd1/h0PiZerbXVe1pVxa8WMEUuCMklmjryMtvM70vmivemWfe+7b0GtowBrs?= =?utf-8?q?igctBxbzIk+FFPbLKqd6guDNbCBIHglBbOoTlnI1+SNxs811L2hhuXB1u6ebFPquk?= =?utf-8?q?R6b0Z474F1QFGQkZGlNN+SSZwDnApgLyJXUU4zQPleGESyFZluvH6s4yNgIoINmO4?= =?utf-8?q?beISl34vvqhkQ8MD593TLOXmaFKf93sA5JPCrm6BSrVd8NZKMMSKF30gdG2mXZHDF?= =?utf-8?q?DhX7EgHIfUWfeI6ezDTeWCcRzBfOMn5eprdZodF/RD4Rto3CKma8j9wVqA9zrDqEw?= =?utf-8?q?ekmnHwcXovSmM0UD4IIHO5OyH6nnyt7CN7vjgJA/b8BIV2FSeGjZyHxhMXgBajtvi?= =?utf-8?q?hBq9GjSj2FQy1Znk4sOcNl7bfsD3UsgN4TVZ6u4Cuw2h5/p1aarvmAaGsH9/Y0RUa?= =?utf-8?q?IF+mu70AycU0G5ChGfLwljTMLICjoepkbFcW2NnaCCNyNOMGJbfviCOZwyId5646V?= =?utf-8?q?cldnvwYynmWgHIItVafpaFYCY3SbwcA/N4vnH9BBLXAV9VnIYh0Jsn2NvdZOIGM0w?= =?utf-8?q?bKGZuVqJ5kdRTnTYM65jhdp/ZGyurSjxNngTaw48uDsAL7O/42QRGg8YqnowJ5xKu?= =?utf-8?q?39oL5E/yUE8WenDtEOhqiuSfHKp44sGDCiB2qmOn3jcKypaXerF8lTf5rjWF45gJy?= =?utf-8?q?juTLGNFLJCvW0C6mlDEDAq6AgCrsJcsw2ldL5it5Xz1J9CEWXusKSAW3CKlUmPEu6?= =?utf-8?q?+cmKElIzwi+AUt55oqqnL3lFPUshMHn94zV8qGauyzaWNDVMja28OI9hvbBi2nB3A?= =?utf-8?q?vpMDaoqkOJ9yU6AFIu6BZoG4c6HcmiLQH3P/veVnm97WFse52UqfGeQmDuaozV6Ia?= =?utf-8?q?ip0gb2MyKx+DnGGehz3mTJ/NV6J24h+0XGjabbmUx8cAt3488LaakBnmJDnxE4+Pa?= =?utf-8?q?+YvoRdDAGRFMRkArbYheBLTqq0I+LuVYrqtleRcdttxb1S+q5EOQFR2+Xu2z/jX1h?= =?utf-8?q?c1tcZSUyWTBiWL2HvkBPxuQeHSowSlF0N1hb5qqNP2RSQ/PZ0aIS/AgOPvE04JYhD?= =?utf-8?q?VGST8MXVZRz8pCpqc+p5y6lBkmIvn1NFaXBc3WC+zWzot1T6DeMScF3UN6HoZA/3Q?= =?utf-8?q?XzJFaHzHZ/NT6Sj54rhOMUodNmF1IKYVWBhO64XefrcfQ/VMWZD0hflys3SLCfm6m?= =?utf-8?q?h749nJ1eWrpl73aYTbOGECShD2Sv5v9IsjPHI2H5XXwZ2aOMIC1MyoSHFXBeiwosZ?= =?utf-8?q?mwSRavZBahedQqm17NIEgf/uDq/w7Bs/BQ=3D=3D?= X-OriginatorOrg: wolfvision.net X-MS-Exchange-CrossTenant-Network-Message-Id: 8a670d97-b9ea-420d-f4df-08dd50ce82d7 X-MS-Exchange-CrossTenant-AuthSource: DU0PR08MB9155.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Feb 2025 10:16:44.6746 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: e94ec9da-9183-471e-83b3-51baa8eb804f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: MXn7+pQGZDbVh3m29UEAkTBNABC6i6+UXNJMth7ZXZH2m6oEVd8YrAiuI2J3XDAWOx3BiX2ocmlbtz0zJsxPnINCt2pW9BBePUarFbcyq2g= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB8138 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250219_021653_664861_921EED66 X-CRM114-Status: GOOD ( 12.40 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org Add documentation for the Rockchip RK3568 Video Capture (VICAP) unit. Signed-off-by: Michael Riesch --- .../bindings/media/rockchip,rk3568-vicap.yaml | 168 +++++++++++++++++++++ MAINTAINERS | 1 + 2 files changed, 169 insertions(+) diff --git a/Documentation/devicetree/bindings/media/rockchip,rk3568-vicap.yaml b/Documentation/devicetree/bindings/media/rockchip,rk3568-vicap.yaml new file mode 100644 index 000000000000..3dc15efeb32e --- /dev/null +++ b/Documentation/devicetree/bindings/media/rockchip,rk3568-vicap.yaml @@ -0,0 +1,168 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/media/rockchip,rk3568-vicap.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Rockchip RK3568 Video Capture (VICAP) + +maintainers: + - Michael Riesch + +description: + The Rockchip RK3568 Video Capture (VICAP) block features a digital video + port (DVP, a parallel video interface) and a MIPI CSI-2 port. It receives + the data from camera sensors, video decoders, or other companion ICs and + transfers it into system main memory by AXI bus. + +properties: + compatible: + const: rockchip,rk3568-vicap + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + + clocks: + items: + - description: ACLK + - description: HCLK + - description: DCLK + - description: ICLK + + clock-names: + items: + - const: aclk + - const: hclk + - const: dclk + - const: iclk + + rockchip,cif-clk-delaynum: + $ref: /schemas/types.yaml#/definitions/uint32 + minimum: 0 + maximum: 127 + description: + Delay the DVP path clock input to align the sampling phase, only valid + in dual edge sampling mode. + + iommus: + maxItems: 1 + + resets: + items: + - description: ARST + - description: HRST + - description: DRST + - description: PRST + - description: IRST + + reset-names: + items: + - const: arst + - const: hrst + - const: drst + - const: prst + - const: irst + + rockchip,grf: + $ref: /schemas/types.yaml#/definitions/phandle + description: + Phandle to general register file used for video input block control. + + power-domains: + maxItems: 1 + + ports: + $ref: /schemas/graph.yaml#/properties/ports + + properties: + port@0: + $ref: /schemas/graph.yaml#/$defs/port-base + unevaluatedProperties: false + description: + The digital video port (DVP, a parallel video interface). + + properties: + endpoint: + $ref: video-interfaces.yaml# + unevaluatedProperties: false + + properties: + bus-type: + enum: [5, 6] + + required: + - bus-type + + port@1: + $ref: /schemas/graph.yaml#/$defs/port-base + unevaluatedProperties: false + description: The MIPI CSI-2 port. + + properties: + endpoint: + $ref: video-interfaces.yaml# + unevaluatedProperties: false + +required: + - compatible + - reg + - interrupts + - clocks + - ports + +additionalProperties: false + +examples: + - | + #include + #include + #include + #include + #include + + parent { + #address-cells = <2>; + #size-cells = <2>; + + vicap: video-capture@fdfe0000 { + compatible = "rockchip,rk3568-vicap"; + reg = <0x0 0xfdfe0000 0x0 0x200>; + interrupts = ; + assigned-clocks = <&cru DCLK_VICAP>; + assigned-clock-rates = <300000000>; + clocks = <&cru ACLK_VICAP>, <&cru HCLK_VICAP>, + <&cru DCLK_VICAP>, <&cru ICLK_VICAP_G>; + clock-names = "aclk", "hclk", "dclk", "iclk"; + iommus = <&vicap_mmu>; + power-domains = <&power RK3568_PD_VI>; + resets = <&cru SRST_A_VICAP>, <&cru SRST_H_VICAP>, + <&cru SRST_D_VICAP>, <&cru SRST_P_VICAP>, + <&cru SRST_I_VICAP>; + reset-names = "arst", "hrst", "drst", "prst", "irst"; + rockchip,grf = <&grf>; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + vicap_dvp: port@0 { + reg = <0>; + + vicap_dvp_input: endpoint { + bus-type = ; + bus-width = <16>; + pclk-sample = ; + remote-endpoint = <&it6801_output>; + }; + }; + + vicap_mipi: port@1 { + reg = <1>; + }; + }; + }; + }; +... diff --git a/MAINTAINERS b/MAINTAINERS index bbfaf35d50c6..cd8fa1afe5eb 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -20407,6 +20407,7 @@ M: Michael Riesch L: linux-media@vger.kernel.org S: Maintained F: Documentation/devicetree/bindings/media/rockchip,px30-vip.yaml +F: Documentation/devicetree/bindings/media/rockchip,rk3568-vicap.yaml ROCKCHIP CRYPTO DRIVERS M: Corentin Labbe From patchwork Wed Feb 19 10:16:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Riesch X-Patchwork-Id: 13981925 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 4DC61C021B1 for ; Wed, 19 Feb 2025 10:45:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Cc:To:In-Reply-To: References:Message-Id:Subject:Date:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=K1aPHtRBGnXvmzac5wRtUs+SbV7OTu/lo7AmGqaaFaM=; b=Qkc+P5YKaqws3Ib0Vlf4FhXLy0 CJNYX8dUpGJ03lGDoXVit1/rCmU4IgkRneaxZa75XWAepJecTQ/1wXn7xUbvfZ3gcP7tTLi9kLK39 0/cxAriBhUXyzimVQxDlZZrKum+ItxquQoXLYQt028N/fItHTqM1jHKecc56dLHX9TTaQgkPJrqCI IUUyVPHI5gR5Vfj5RDNDv76OjX2RleTK6nY7Yi9QgBNV98db6/MKQizRqKmc5cmOxmJQcV3aeYa7c N0owemCN4RFU1ppI3aAGvfGeIskf7QfQKULIKOZbkxEd+bcELj7lJkFGbe6zGZZZGbU0flZVWUJ4V DsrHorbw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tkhZf-0000000CCo6-1v03; Wed, 19 Feb 2025 10:45:03 +0000 Received: from mail-am6eur05on20703.outbound.protection.outlook.com ([2a01:111:f403:2612::703] helo=EUR05-AM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tkh8R-0000000C5uU-174W; Wed, 19 Feb 2025 10:16:56 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=GHHgdESb2uRsVB2R6MP+XeZ3ATVj7cqxxp1R+pROJeMfhB4b608Jl4tox4IsNYuP52gt0K5rDVe7/UarooW3IuX7IoW4oOZ/TQdtXeicEaSeI8e+W5wtwfa9+oMvojFUcK6BIAosEwlYE/18NQ7YZOaWZAQRFVEgznpFDMCx8zt1zXjYfpX3ii1EDYYG4HS+pgxFj4PGcx6QbYc0QDA8G/vwLFxYC8ca+BHaZihaeDKhu/jFD3kEW5SkcwMcgWmQHOGZ2K8RYK9iwJDelnQC0SWyHSOdqazvW7Jnes0MOQrGLevTpA0sBiJDi7FL3tHHfeM5PRGbF0wL0bKwNmRSbg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=QailLYjyDYPffyoSP99sd7pP5p4Eq4dzoUNPP+G4IaQ=; b=s4q5QlZIVHF/vN5z6voGHH3rMXpJjO1JgUVxO/TUH25liu18ih96/EWpJp+BSki5oFrQns9wmUnUmYfEnEQDMDnQQwcJsKJ8oG1oZbuGMNUpr1wStPDUo4ThVnGdcDLqe0HBhSVSwf3XM42Y/7lbFUod/98Ql/Mai5Y3jJlJDrtjwyB1XhcJc9oP96h80hnZJ6yrmU/1KuIecgepQtNPqOMUHUIGdOrQbXN0OTP2xIWpMNSNv/OPxQ1vmXIXorwATQ9U+ZzvZVVeFMTW9dJCoXPyYBw5Pe06PD5eLUFPPgk/VtdajvHQWyDLf2aADtVMm85UO+cfmTg1rz6GzglCrg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=wolfvision.net; dmarc=pass action=none header.from=wolfvision.net; dkim=pass header.d=wolfvision.net; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=wolfvision.net; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=QailLYjyDYPffyoSP99sd7pP5p4Eq4dzoUNPP+G4IaQ=; b=bERxaRUz2B7+Xn9J0U9PnBpTXQoBL3hcqNLDOdX8jCKfgrOPLm6ZRwubWuYYIlH/9Ml/5gTYIxYOha3illu4Nw6lPWZJg5dr5K76VhhBKbogAkK33uyzEI0oE17f8fhMEPIcr6Qmm7/CuysZ0hwe9ah/umfhFJ7yP2zLUOT4460= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=wolfvision.net; Received: from DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) by DU0PR08MB8138.eurprd08.prod.outlook.com (2603:10a6:10:3ed::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8445.18; Wed, 19 Feb 2025 10:16:46 +0000 Received: from DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d]) by DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d%5]) with mapi id 15.20.8466.015; Wed, 19 Feb 2025 10:16:46 +0000 From: Michael Riesch Date: Wed, 19 Feb 2025 11:16:35 +0100 Subject: [PATCH v4 04/11] media: dt-bindings: media: add bindings for rockchip mipi csi host Message-Id: <20250219-v6-8-topic-rk3568-vicap-v4-4-e906600ae3b0@wolfvision.net> References: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> In-Reply-To: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> To: Mehdi Djait , Maxime Chevallier , =?utf-8?q?Th=C3=A9o_Leb?= =?utf-8?q?run?= , Gerald Loacker , Thomas Petazzoni , Laurent Pinchart , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiko Stuebner , Kever Yang , Nicolas Dufresne , Sebastian Fricke , Sebastian Reichel , Paul Kocialkowski , Alexander Shiyan , Val Packett , Rob Herring , Philipp Zabel , Sakari Ailus Cc: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Michael Riesch X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1739960197; l=4104; i=michael.riesch@wolfvision.net; s=20240405; h=from:subject:message-id; bh=bghLJodqati1K+aBvA7Aj+FG17Kj9elUhImEnrgm7jo=; b=rDeUqv3SHPBlLzQnqmdLxw6quZHyHVCXurtSQwNUlwrrYBjlRg286nxLCPm5FfarK51rHfG2v /so5xd7K4SPCw9YSc3T9ISOCiv5UZQySeSaJIEdqa5oRUa6vioQi4xX X-Developer-Key: i=michael.riesch@wolfvision.net; a=ed25519; pk=cSJmgKSH3B6kdCIDCl+IYDW1Pw/Ybc6g9rmnUd/G7Ck= X-ClientProxiedBy: VI1P190CA0041.EURP190.PROD.OUTLOOK.COM (2603:10a6:800:1bb::8) To DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU0PR08MB9155:EE_|DU0PR08MB8138:EE_ X-MS-Office365-Filtering-Correlation-Id: 11cf58e9-787a-4542-19fc-08dd50ce83d4 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|376014|7416014|1800799024|366016|921020|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?q?5Ci4uF8v5uc5jwKm+6Y8JfkZVBEt7L1?= =?utf-8?q?AvYQIRGkXnIn2vtGqZUpNF54UUamwMe8FJXohLxSpx2ePgFAp/46uctUBwqDc9nBc?= =?utf-8?q?UsaRvLVMl48/MDQMTXjHAinZLEDvuvCXc5PP8YcDLxPbrzA2YjMpNYQI3npU3WV+c?= =?utf-8?q?JedE5uaSgplkYDLyHSp3odEh5TAPyAg32idTfEw13VOGufc0cAfKyaOx0tFgxK5SK?= =?utf-8?q?dhHszBT0hehiPMXarZ+esUqWDTeqluKdMXqiVEQcvooDCpyFxXinUKdISzz8/IMxv?= =?utf-8?q?tpXLynSmU1uCjisckZQ9K5cPnGoyaq8eBKoEHD8ix0k6GX2hQXguP3ECp1iQ8e/dS?= =?utf-8?q?JYWFucFZ18b1FhFiROWUSIOflaYmf1kkDX8DqUjlY1aj5BaqZpa5zOvSNpdjBnYoW?= =?utf-8?q?q5y/6NlInxp0t6X+VH5+7wJ2/krH5iKwzISWFQFYgNrkJaduBAHS673n9bYU6YXTt?= =?utf-8?q?w/2CpD/WQlWGYCOL7vtY+T/VyGJcrtCO2VyQY6IkWMN7SD+u59lLr4mCV18VMhE7o?= =?utf-8?q?dNDomgT4lKzPyhUkRPSYaXPy1ZmvBJeFFXYtZ/jcJE6ULy4FTB7O6Fm19IxR+afd1?= =?utf-8?q?PzdUgs1jfrTdyhlotkyuPzhmoIVwNyNW7p7rZPtitgd365xIhW6KAARqRXdXOv9E5?= =?utf-8?q?xK1KYghHxPU4/6UtbW91BduBGT6eD52lIR3ttAdLjTUYn4yi7fZbUTz3IZdcb8p2c?= =?utf-8?q?Om6p1c+Vsq/EAC4wQokdUnCNSAsa66zqoLbIchlmgEZfKfLQITe86A5MRFtx33FlQ?= =?utf-8?q?TAS8PCptPNPGroS86zTUcKzymzSLjj6N9Jmg//9tSBTsO/1O8jxtX3pMH6HZSZSa9?= =?utf-8?q?53zXDWgTdwpw//8r8bFW2Jc26Nm9NO4bsrhmweW9cXAeWSi16G93/FOsf84/jTLnu?= =?utf-8?q?j/EHXjpyq+PPREOuJrhCIKRPAxAlayHHbTnb/9BJRkH3+IsbAbEw6b/Yxmmq+ldYR?= =?utf-8?q?d3ku3si4GTi/IGFEjqi+yzAs8SxVFS+bHZFN4hnWp++Af5l396KgeRD+yejSdCf8l?= =?utf-8?q?3llopGSmo2FQBb2Q4QaMJV0laVmfMHWMOWZdo6CXUbA1Ig77JTcRl6cfy8pc9n51v?= =?utf-8?q?ZyzS06Xn8rDcQPEJIE9yKDHBczf9l8GrgdVOCDpNCU8SwqanJKh4z7/XMZbu2H7Mi?= =?utf-8?q?xh0zAK7rhVTdBq3VYjWY4r1UgKVFxJ3QK76sSzv4yfhby7Y8NYSjsDusMTK8LVkb0?= =?utf-8?q?qw7hv6OBLpmZsrU86Vidd1P/Ffz4CKNGqwy9sfaJVGuH4Svqh3avRteTtusG/XH/K?= =?utf-8?q?EmT4V2zijoEUeZpkwA03u/Zj17GxZULNwawfZkU2igOAosxOEK+0brGJZAFOAmtIR?= =?utf-8?q?9PwtvyVofQfXXkTnIwhNKtqlxHZ0AImwTQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DU0PR08MB9155.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(376014)(7416014)(1800799024)(366016)(921020)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?t2hqGS6klXGz4+rKsu4drAMSIo47?= =?utf-8?q?sFbbsc/c/ENkhqJ4vc+bW7ti/Mlbfy5X6gFffHH8haMnhK+FkWu3Vo2i0mOKqzB6h?= =?utf-8?q?zXRVs/QEdul6qzur7NB2+FGcknG3S8TJ8CGS1nEgQvCbcpvW64t8jz36eKDJTwQAC?= =?utf-8?q?+tP6mVXuAepib2kiNhWBRL0xIzGsobcfUV58okHfCkn6I6GhSimBM9tyboZ50HGhu?= =?utf-8?q?U38MC4zHRJF1O4jhd5O1A3jYd+kj6mqOQMSd7BOZoaNynDO4KWhW4pWRkvsSvLJ8A?= =?utf-8?q?oq0mBlqHBoymOO0y7bYPUED6GO2aL/jnj7htM1Nr6oz+2YjUSsE4MHDOy6TJEI5w5?= =?utf-8?q?hzt88d2njAx8Ez3aQEZwo/jBHNaljUd7IDGD7joYGckIdpZFdEvJJUbaQLdfYLvz7?= =?utf-8?q?Pq0aSLajJZCc4MES70l0YJ7CBw0IaY7150sRSfEc3F6tbtFF6tuwGFx0c36llWHAb?= =?utf-8?q?JD+N8QLbQLKzgb/BUWOP5d0oZHXEJY8zh4+hHctx7HHng5DnIWR6Um5EX7YwLxK/P?= =?utf-8?q?NdHmKj7HjxqVrZOCLCPdPCvt2igCrwb5+3RncR+OJtLzpC2HFCJqPnuN4yGJCv6CI?= =?utf-8?q?kRbeVaAMRaaE2V5E7NHXg4/yZU7thBg94lAMg3LX9gAaq/u4fEiU9Eh4LOmUngrLg?= =?utf-8?q?oZawkk/sys/krgF+7KpylCFZ6NVWwg5ct6NGcMEHAFtxWhDD83sTrBpBKmT7KAZmA?= =?utf-8?q?fpH2DLV6VQ00gJZtSep9GGuuwuibVc9KOW0EEzLiiFhrDiwSP/pOWwq9wP1BlRpbL?= =?utf-8?q?9YHDXK0DlD1SSv0/OQ7YOk/w8JtxYOZ1/dATpCT7jo2CKLD0PEw/mUIsazciejTDA?= =?utf-8?q?aPB7WGWd+lkiNXVhJ20jRBmpjqxIrFUoehMPF0h0rjk5nYOEIQUdlhj6vepdhG/AF?= =?utf-8?q?6r7rYw9szA8KtQSbl3uxKaEt2XNAesbh3EbTLFJOjHRzaEeCn28U+5sWdleZrP14Y?= =?utf-8?q?ScUKdr1JdpP6BKT+IB078IbpGt/ijH2PIrwFqJiUsqYdCuShvZuxFNgeFQsWtRw21?= =?utf-8?q?fjia0arWZ3VrEsv5HqjrfdG0ykJDY8McwssifD+HAoooS09DKG4/AzQkz8st8TY2J?= =?utf-8?q?y7Ouog4aHy1yFO1P/sd+RKLZG+XOsWSulmiM33RRlqgy7rRyFu67NwAbkXmJEP5ga?= =?utf-8?q?X5KtTYn1Qn7iNtvUhYZB2qWdAmY+bDfKX05V02NHfLigpAp+1031apTAFlMCSRdu9?= =?utf-8?q?ohbq28J8H2lJtebm/JEPX8CKXPTr8qIeuLDfvbI/gS0GVZwYbfmRBpqPx3gH3+vz0?= =?utf-8?q?xfJ3PBUKA7svIKipQdz1kih8ADEToIXpHRHULiTcH9UW5upbhGl/Y6GDTNBvZgE0e?= =?utf-8?q?FBG3IN+b9RFrmDaz+968IfmFJt/i8BUdaxCuctOgGigK4TyiHW6NN/LoVaGZystWr?= =?utf-8?q?rXswRWdW8pE52qP7vhk37/Y/OeoIBWw/f6PKFNqm1qX7AJnx/5cM2LyNVooANWKRX?= =?utf-8?q?zd7ytc6sx6eNivsIePxmbmV5pSgcXG69kz5aGaCwbh0IVal6ETtPp9mLao/VQjydy?= =?utf-8?q?Xy0qk65sY7VXuJhEAdsh0m2obZRJkQErWw=3D=3D?= X-OriginatorOrg: wolfvision.net X-MS-Exchange-CrossTenant-Network-Message-Id: 11cf58e9-787a-4542-19fc-08dd50ce83d4 X-MS-Exchange-CrossTenant-AuthSource: DU0PR08MB9155.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Feb 2025 10:16:46.3116 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: e94ec9da-9183-471e-83b3-51baa8eb804f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: R0giWUId/BDOJU/QFG18Ky2H107w+89GaC/RL7Dpr72Rx/70yffVVNFUelhZNDQQPQlDM5m73tyAbl6frnjtkfDtDAk+dSdVmB8TR3kH2DE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB8138 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250219_021655_310966_5748B65B X-CRM114-Status: GOOD ( 14.00 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org Add documentation for the Rockchip RK3568 MIPI CSI-2 Host unit. Signed-off-by: Michael Riesch --- .../bindings/media/rockchip,rk3568-mipi-csi.yaml | 123 +++++++++++++++++++++ MAINTAINERS | 1 + 2 files changed, 124 insertions(+) diff --git a/Documentation/devicetree/bindings/media/rockchip,rk3568-mipi-csi.yaml b/Documentation/devicetree/bindings/media/rockchip,rk3568-mipi-csi.yaml new file mode 100644 index 000000000000..288941686e96 --- /dev/null +++ b/Documentation/devicetree/bindings/media/rockchip,rk3568-mipi-csi.yaml @@ -0,0 +1,123 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/media/rockchip,rk3568-mipi-csi.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Rockchip RK3568 MIPI CSI-2 Host + +maintainers: + - Michael Riesch + +description: + The Rockchip RK3568 MIPI CSI-2 Host is a CSI-2 bridge with one input port + and one output port. It receives the data with the help of an external + MIPI PHY (C-PHY or D-PHY) and passes it to the Rockchip RK3568 Video Capture + (VICAP) block. + +properties: + compatible: + const: rockchip,rk3568-mipi-csi + + reg: + maxItems: 1 + + clocks: + maxItems: 1 + + phys: + maxItems: 1 + description: MIPI C-PHY or D-PHY. + + phy-names: + items: + - const: csiphy + + power-domains: + maxItems: 1 + + resets: + maxItems: 1 + + ports: + $ref: /schemas/graph.yaml#/properties/ports + + properties: + port@0: + $ref: /schemas/graph.yaml#/$defs/port-base + unevaluatedProperties: false + description: + Input port node. Connect to e.g., a MIPI CSI-2 image sensor. + + properties: + endpoint: + $ref: video-interfaces.yaml# + unevaluatedProperties: false + + properties: + bus-type: + enum: [1, 4] + + required: + - bus-type + + port@1: + $ref: /schemas/graph.yaml#/$defs/port-base + unevaluatedProperties: false + description: + Output port node. Connect to RK3568 VICAP MIPI CSI-2 port. + + required: + - port@0 + - port@1 + +required: + - compatible + - reg + - clocks + - phys + - phy-names + - ports + - power-domains + - resets + +additionalProperties: false + +examples: + - | + #include + #include + + parent { + #address-cells = <2>; + #size-cells = <2>; + + csi: csi@fdfb0000 { + compatible = "rockchip,rk3568-mipi-csi"; + reg = <0x0 0xfdfb0000 0x0 0x10000>; + clocks = <&cru PCLK_CSI2HOST1>; + phys = <&csi_dphy>; + phy-names = "csiphy"; + power-domains = <&power RK3568_PD_VI>; + resets = <&cru SRST_P_CSI2HOST1>; + status = "disabled"; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + csi_in: port@0 { + reg = <0>; + }; + + csi_out: port@1 { + reg = <1>; + + csi_output: endpoint { + remote-endpoint = <&vicap_mipi_input>; + }; + }; + }; + }; + }; +... diff --git a/MAINTAINERS b/MAINTAINERS index cd8fa1afe5eb..d83a7762dbe3 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -20407,6 +20407,7 @@ M: Michael Riesch L: linux-media@vger.kernel.org S: Maintained F: Documentation/devicetree/bindings/media/rockchip,px30-vip.yaml +F: Documentation/devicetree/bindings/media/rockchip,rk3568-mipi-csi.yaml F: Documentation/devicetree/bindings/media/rockchip,rk3568-vicap.yaml ROCKCHIP CRYPTO DRIVERS From patchwork Wed Feb 19 10:16:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Riesch X-Patchwork-Id: 13981930 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 3EE86C021B1 for ; Wed, 19 Feb 2025 10:45:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Cc:To:In-Reply-To: References:Message-Id:Subject:Date:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=k/nOe/70ToFu6BNXsnDx6S4M1IAMndmHfszxTDqxpNs=; b=h9NetB38hkjRmhOvfNYe6qPl4i 5hmBJpH2zQWXQDSds9p4fS0umWiCb11UzZ73mF8giNNI0jaGFjaibbwOuDdNYzmZacMKtNnAPKhQ1 wO4Aa/Qq1MKdzEyvAJhXNJl0G4IyA4d6fFwcMFUVjoUJnJfg8mey9icXQ3l891WhUzWOiFJak8OMr qLBBXSJWtb2bQObzaIBZDGIHbtxvaP/q+pDaXb6S+5/XLbUY1RjLqvQcdHM9wXcdsQ6nZpRuvpfN8 zRbe5WVTb27MiiLwwHiREKFUONZjyrAZgpGWh9h8n1zeL8at/5ygJyqOKc7ielYnL77A1s6TXsPoS dg7W6jJw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tkhZi-0000000CCt7-0g3H; Wed, 19 Feb 2025 10:45:06 +0000 Received: from mail-db8eur05on20721.outbound.protection.outlook.com ([2a01:111:f403:2614::721] helo=EUR05-DB8-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tkh8R-0000000C5yY-36bx; Wed, 19 Feb 2025 10:16:58 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=gEVWBAjxCyjeJ5ByG8ewJI4H/G5soXx9Df/OO76EnQXg0pfnISaU7TEw+1E6F2l16zecID8ZfElumUpR8MA+yU2w5MuT3Xgu5/kBWa2D4UsLGOIPoP7/oTc4XF8gIk9poG/j4fJyjm7nLzIbis6oCkof/qJQn2D2d6gnBLLOm2bqpTFWFQZFPBDGBodDQoMy66Vv2tJ+sQH7gVunnO7YCt8MxDJwCdY/ExRhMzLnXyKysO+I9glUb0+MNEGNkUHgK5Lk90IAIsvsS11cUrL10NrneLEr8759VIjD2OmlFg1t0pepA35dcQWg+st8tr3/0eSE24QdnkwclTaJQPyY2g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=tQEVNMT18SBGVNmrE98fknsa5J+Cu2o7iCvrl/FfX4Y=; b=de5mA52zVIN81Puu7wXQhKJAPeGvjlIAwumMZEQlkTGYDUooXf9DYLVjlueuO4QdU0v57qaCUC/rHPwxTNWwSpbPAgHnLkmOhpCEcqiO6InbINpyFWI/ym3H5uZwgmfmVIgRebrGmlMDyeKMyGaLms8UKUgRjGjOfwxSRBjvFRAsrQfo7Kq/8GZHhXE3me3ujiniuFeBMlpfnDzQhQOMb/UjMXkW3TZCt5BV5ZUP3IVr5mjstTJhjlkeqDzeR5JzE89xQMySBvT0NqXw69Rb5gWdBq0TqeK2LalCw0NBUv9xZym/WWjnol4uGfITQNR5B42HjwWBbze3IQJlbA0piQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=wolfvision.net; dmarc=pass action=none header.from=wolfvision.net; dkim=pass header.d=wolfvision.net; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=wolfvision.net; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=tQEVNMT18SBGVNmrE98fknsa5J+Cu2o7iCvrl/FfX4Y=; b=kix3MG06L4gIJmm6qmCSgqcEU6WoZt4mI1VXYnca+m3Q7GDNXq3DPCffJxDzSUMcHPxQgwuIPig+ud6YS071ZZrk8o4NaU0tvsU7Qwn5ujNQ8cxPTgWe3Lgf/tFzyQDE8TJPYL/qeBGqX9k7zAc5KshpYVEBDDrMD1D+IJ0YgEg= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=wolfvision.net; Received: from DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) by DU0PR08MB8138.eurprd08.prod.outlook.com (2603:10a6:10:3ed::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8445.18; Wed, 19 Feb 2025 10:16:49 +0000 Received: from DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d]) by DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d%5]) with mapi id 15.20.8466.015; Wed, 19 Feb 2025 10:16:48 +0000 From: Michael Riesch Date: Wed, 19 Feb 2025 11:16:36 +0100 Subject: [PATCH v4 05/11] media: rockchip: add a driver for the rockchip camera interface Message-Id: <20250219-v6-8-topic-rk3568-vicap-v4-5-e906600ae3b0@wolfvision.net> References: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> In-Reply-To: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> To: Mehdi Djait , Maxime Chevallier , =?utf-8?q?Th=C3=A9o_Leb?= =?utf-8?q?run?= , Gerald Loacker , Thomas Petazzoni , Laurent Pinchart , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiko Stuebner , Kever Yang , Nicolas Dufresne , Sebastian Fricke , Sebastian Reichel , Paul Kocialkowski , Alexander Shiyan , Val Packett , Rob Herring , Philipp Zabel , Sakari Ailus Cc: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Michael Riesch , Mehdi Djait X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1739960197; l=85190; i=michael.riesch@wolfvision.net; s=20240405; h=from:subject:message-id; bh=zr0hV6ksJautPLlyr2lov2f9rfjAfdRtIQfnRssT62E=; b=iUmvEdI6V/UkdHimHvG+E5+AmMHUmbrpO+B7K9h82SmKdNNLyTMhzop6iP4KxRc28fYa0bezJ YEEq0PICEHnC7bh3MVOhHJH4XWwOXDGEbWMVD47sAezIZ1OfbOE632c X-Developer-Key: i=michael.riesch@wolfvision.net; a=ed25519; pk=cSJmgKSH3B6kdCIDCl+IYDW1Pw/Ybc6g9rmnUd/G7Ck= X-ClientProxiedBy: VI1P190CA0041.EURP190.PROD.OUTLOOK.COM (2603:10a6:800:1bb::8) To DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU0PR08MB9155:EE_|DU0PR08MB8138:EE_ X-MS-Office365-Filtering-Correlation-Id: a5e1406c-940a-4784-5599-08dd50ce84d7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|376014|7416014|1800799024|366016|921020|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?q?p3TX9w1S5tWhQEi5CTMS+m6yAhNNAYu?= =?utf-8?q?bftqLpWW+ZvnWe2NfAb4NUyRiWAvLcxTjqGMxbI5yVYzOG7lBkWwE21VtBkRLZIDx?= =?utf-8?q?7z1gRDIlIIfpgOuBlgf6Lghe3W5ODq7/kUhILmLF1YkK0TCW4/yE/FMuXfAw6g4iW?= =?utf-8?q?WSF6DNmxWhuuvrosyzXKTEqg4lwzLzFsXq0G5lvjw+rMLEIE4GRrafxqvZ3Fdjd2+?= =?utf-8?q?ZtQtdeFAjrKLWb8md90mletBTTLaUokTarnm/Wb8rk7uaSS2vcDpOX+M+HXrhJsK3?= =?utf-8?q?4ZEDQZ6ZWbzGSg6KqjOm+NnjjuyDHRAaCOXkOqdNr6opIVrx7gChHdSoxFe5iFzux?= =?utf-8?q?JGp6C6galEMkauKswzRKIALbgPg8xukZdpPylOJ89DSHNcFiOoGWKhtywufDcBBze?= =?utf-8?q?HUqkiPXBIno8VCxX+WvPoayQl11mdrX0wVYNW7KIoG1znT3Yc2Wv0qgeddOwBaKR3?= =?utf-8?q?axmG0jMn+8WBcKq/FpS44jVF8akjP51RtcTUsYozybPMEy58bj7UPMYuYzJMEDG8H?= =?utf-8?q?DMLasGyZwAMOtumME1JDE80ilmWOb7xuLbFG39se/xheB06gl0VE3SMdxRFSn4bTL?= =?utf-8?q?S9d4zaWjE8U7jSdRhArjUiErqzmGsWn5cLZ0Y7345zTl5DZisqSHR61Pdt7wSWOpu?= =?utf-8?q?1sH0jhFFF+8LVTtHXtF8X5o4qCX15wFNBsDWvYRsRgeb4Q9gtM2MbdpV256+7cDRL?= =?utf-8?q?bICTEyA6VfZehKEbLJYO2fdLCvuKyAq10Ju4fV9ug5eU70CL6o5Le7MUAmJIOIrqF?= =?utf-8?q?+4EZm9Z8NMOWVgdfuieZXyLO+7M0EQZ4bF69GzbDktbuGIzdDdJ8ozZaviaaU0TCd?= =?utf-8?q?6kQgF+H0LhaPB9yZi9Qh2uwyVqnhFAOuYhq7N3ib4OpIgz0G54bqt88zPPj05U0WM?= =?utf-8?q?voVYwKeFWuOQVYjRBWc5jii2bGdjaDUZSXNMLTOw1LphbXUervS08jnDFMK1Y38hT?= =?utf-8?q?0cBb3vU07g+tvyuORGI4Naj8ZBqJcq2mZP/XhQL/uYhz9M/AFr+7RPQV6IVB0R8yI?= =?utf-8?q?BSGe0cxVNnsVxkBPyAQGxh5XOKyAdfc/pDTbGDpLSZ/9bFzhmsd7X8MlSLkfr27fV?= =?utf-8?q?De/DORPl2uvpknTxwlyXBnLM2Sswj4XILeoCJ/tPbN49EM1fU8tLQg6q6vKOv8isJ?= =?utf-8?q?zrkvd3V8q4J9N3HN0SReP8VkJXnTMQtVRqoifcg6cywoFikfC6kmV46Wmw1B0QSf6?= =?utf-8?q?hyZ0bclPovWBQOEZBpHdCbVXX1kMsAuMzFK+uSKWjpV7/6SycjJfE4r15EepBWPDI?= =?utf-8?q?kDyo7FRfWGUisPkjgNgN1f/1x/9y7LMb7neGMUgcr7XAAP1HZidjtF27fFLRbtAKm?= =?utf-8?q?jnsAtTidSx+0aJmj7ep2O+2Hb4U9IuJ2h36qxfEfunngsF+PHAzs016ZY7SWOJUyw?= =?utf-8?q?HkaFZLhzzyp0lkxNcmZ6EyR8cV+RVEkdg=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DU0PR08MB9155.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(376014)(7416014)(1800799024)(366016)(921020)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?qmjYQzS5PtlaiO2QXelXWIR0w0Bo?= =?utf-8?q?IZP5Kz0dFor6lkINx4sKbfFhtxc+F8NIUIWR5EUWK55r5r6Q0kYikyblpetQITZ+j?= =?utf-8?q?XpgPZPUXriuODqYiwompg9k/jpyo8kTi7YNljw2BBTp3Ibg3HKrSRFG/r17L13nz2?= =?utf-8?q?93TGdvEgHjbW02QhR2QhNy8XJgm20IXfBCH0Bu53xxGJRQgAgfk27RXxrj/KQGScb?= =?utf-8?q?xdmntD10xsQhutcXcSjQU3EVp8FSJo8IA25YzC01SCxyHUrw2A82/zixkfKnXPP/X?= =?utf-8?q?Di5KX3wGK0HSxFkte93r5IIfIOAeqkQgfwyA0cw6Wd1s/XdgJwPsppyNX1OHPFYjN?= =?utf-8?q?LJMsmjCyqjhMM6cm3B+uR4TwMPsvndwJt/sRDOr679KzSlKSHFbaMTHCsIapU9N5j?= =?utf-8?q?lNn5VR8eZVoT94I0HyYAIfzV1AKaxeY+jilhze9sIAQrALKxPwz8dKu5cO4d34kao?= =?utf-8?q?/W9vLyeDlR/BCvlA3KeO7VCeKiyqX7omZOrLAnLJwtC+AuaMi58CCx+EtlA1ZRSxy?= =?utf-8?q?Rq5P2Ol3kWWzEkATPJTlDjcgUOz524lCwyd1qG0cfvQUktsnzrpimJKGO9SQoO/Bl?= =?utf-8?q?i/SLSdNDRtSPu8v8OAClHhhMrs75XQXF+5aExJSVERNVovhRSMZ6A5O9c+U88s7aV?= =?utf-8?q?RgzJNhUMWUXIXdstTifSVRYVLIv6gNOuXIIvaCoZOUopKILetnUaF0/LZWULOR1A3?= =?utf-8?q?WMCcWd7Ne/b3sqHF6arIUyBkajDv+OLAiVaP10VtPXMlxvqH+w1kxkT1BaGK8wApm?= =?utf-8?q?iCgHQhgtMT8yEHWXFKRN91e3bhM47EEqKKzhsGpP3R+ZmsNoURVIbUw1tLJz5GNym?= =?utf-8?q?CNZY2UkDd6rE/Wu7BdsmOX+a+9X9aNsJWl1KHl0iRskECUumqzNeBSu21uDpvXNyI?= =?utf-8?q?s/NET6cS5ZXqHebo3/9SfLzAeEpOx/HT29IUVgPW5F1A1Ob6DlgIvuIRRKM3BQdX8?= =?utf-8?q?8ySK9a8Q5hQJaq2NDbmD8UWhKhpCTEZtYH+YKGhiyo1XIGU7NsEzfeAXvM5P4cFQC?= =?utf-8?q?M2QXW94zmEvXv9h+r0kizAF6putQMZzgTF1xyoskJcpVhFQp+rBXFCtvhm6EFdWVF?= =?utf-8?q?U3fF9rTIpZ4t0NGTJg8wlyshH+hMJBoUmzUti24FvN1jwMkJrju2j8v+dHhzr6CEE?= =?utf-8?q?IkaCHi5aGnlv/E6DwsLGyYf/KnHumaprpsaQ8Ej4lWKWZpVoJLK3sTk11WJZKLIOK?= =?utf-8?q?daeifw4RM5/vkWksShJHQtwoJs7DO2ATvpIO4+naK51kMyDKDUUQYseJs6FZbBrZD?= =?utf-8?q?W/R8fY9x7mGn+Ri7burqhw3pjdFLHjzr/CLWb7BnNxLnGpzSacwGSPVYNIP3jCYEB?= =?utf-8?q?OHl+ppCmZ9EEQ5mmUonZz2xbJNn9kv6wHUMI7cwfKch81WlquCznJefed1NuiXLKx?= =?utf-8?q?eA2XQBpDf8ZXXqYQaXuNo9qtttLeqbhlV3Fs7p5uT+LYZj/sgTBQ6SMmLmi/sNil8?= =?utf-8?q?cC9VIROIX5gV20ntlPPvjb3W5rmOEfJIaRElR1jU0cvjWk2ad9I9Rk863I5POHcg/?= =?utf-8?q?xJotPq4LW61oeCBoK4svX+FvBP3+rojSAw=3D=3D?= X-OriginatorOrg: wolfvision.net X-MS-Exchange-CrossTenant-Network-Message-Id: a5e1406c-940a-4784-5599-08dd50ce84d7 X-MS-Exchange-CrossTenant-AuthSource: DU0PR08MB9155.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Feb 2025 10:16:48.0684 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: e94ec9da-9183-471e-83b3-51baa8eb804f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: EQZgiCeojl9soqTO27rP4WRrlqusF8P2W7pbmDJ/dzI+/jAOETX48cFfJHKi7apEGgEFqR8e9Kp8NOj19wVS/gH2Q95UrI2TEFo1t8Svo3U= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB8138 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250219_021656_131869_BCD4BD57 X-CRM114-Status: GOOD ( 16.11 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org The Rockchip Camera Interface (CIF) is featured in many Rockchip SoCs in different variations. For example, the PX30 Video Input Processor (VIP) is able to receive video data via the Digital Video Port (DVP, a parallel data interface) and transfer it into system memory using a double-buffering mechanism called ping-pong mode. The RK3568 Video Capture (VICAP) unit, on the other hand, features a DVP and a MIPI CSI-2 receiver that can receive video data independently (both using the ping-pong scheme). The different variants may have additional features, such as scaling and/or cropping. Finally, the RK3588 VICAP unit constitutes an essential piece of the camera interface with one DVP, six MIPI CSI-2 receivers, scale/crop units, and a data path multiplexer (to scaler units, to ISP, ...). Add a basic media controller centric V4L2 driver for the Rockchip CIF with - support for the PX30 VIP - support for the RK3568 VICAP DVP - abstraction for the ping-pong scheme to allow for future extensions - abstraction for the INTERFACE and CROP parts to allow for future extensions [PX30 VIP support v1-v5] Co-developed-by: Maxime Chevallier Signed-off-by: Maxime Chevallier [PX30 VIP support v6-v13] Co-developed-by: Mehdi Djait Signed-off-by: Mehdi Djait [added RK3568 VICAP DVP support] [refactored to media controller centric driver, added mplane support] Co-developed-by: Gerald Loacker Signed-off-by: Gerald Loacker Signed-off-by: Michael Riesch --- MAINTAINERS | 1 + drivers/media/platform/rockchip/Kconfig | 1 + drivers/media/platform/rockchip/Makefile | 1 + drivers/media/platform/rockchip/rkcif/Kconfig | 15 + drivers/media/platform/rockchip/rkcif/Makefile | 7 + .../platform/rockchip/rkcif/rkcif-capture-dvp.c | 858 +++++++++++++++++++++ .../platform/rockchip/rkcif/rkcif-capture-dvp.h | 24 + .../platform/rockchip/rkcif/rkcif-capture-mipi.c | 27 + .../platform/rockchip/rkcif/rkcif-capture-mipi.h | 20 + .../media/platform/rockchip/rkcif/rkcif-common.h | 220 ++++++ drivers/media/platform/rockchip/rkcif/rkcif-dev.c | 306 ++++++++ .../platform/rockchip/rkcif/rkcif-interface.c | 418 ++++++++++ .../platform/rockchip/rkcif/rkcif-interface.h | 30 + drivers/media/platform/rockchip/rkcif/rkcif-regs.h | 132 ++++ .../media/platform/rockchip/rkcif/rkcif-stream.c | 622 +++++++++++++++ .../media/platform/rockchip/rkcif/rkcif-stream.h | 31 + 16 files changed, 2713 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index d83a7762dbe3..e9a648d4fcb4 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -20409,6 +20409,7 @@ S: Maintained F: Documentation/devicetree/bindings/media/rockchip,px30-vip.yaml F: Documentation/devicetree/bindings/media/rockchip,rk3568-mipi-csi.yaml F: Documentation/devicetree/bindings/media/rockchip,rk3568-vicap.yaml +F: drivers/media/platform/rockchip/rkcif/ ROCKCHIP CRYPTO DRIVERS M: Corentin Labbe diff --git a/drivers/media/platform/rockchip/Kconfig b/drivers/media/platform/rockchip/Kconfig index b41d3960c1b4..549f4e9f443e 100644 --- a/drivers/media/platform/rockchip/Kconfig +++ b/drivers/media/platform/rockchip/Kconfig @@ -3,4 +3,5 @@ comment "Rockchip media platform drivers" source "drivers/media/platform/rockchip/rga/Kconfig" +source "drivers/media/platform/rockchip/rkcif/Kconfig" source "drivers/media/platform/rockchip/rkisp1/Kconfig" diff --git a/drivers/media/platform/rockchip/Makefile b/drivers/media/platform/rockchip/Makefile index 4f782b876ac9..6aba32c8830c 100644 --- a/drivers/media/platform/rockchip/Makefile +++ b/drivers/media/platform/rockchip/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0-only obj-y += rga/ +obj-y += rkcif/ obj-y += rkisp1/ diff --git a/drivers/media/platform/rockchip/rkcif/Kconfig b/drivers/media/platform/rockchip/rkcif/Kconfig new file mode 100644 index 000000000000..f53e79a4b42d --- /dev/null +++ b/drivers/media/platform/rockchip/rkcif/Kconfig @@ -0,0 +1,15 @@ +config VIDEO_ROCKCHIP_CIF + tristate "Rockchip Camera Interface (CIF)" + depends on VIDEO_DEV + depends on ARCH_ROCKCHIP || COMPILE_TEST + depends on V4L_PLATFORM_DRIVERS + depends on PM && COMMON_CLK + select MEDIA_CONTROLLER + select VIDEOBUF2_DMA_CONTIG + select V4L2_FWNODE + select VIDEO_V4L2_SUBDEV_API + help + This is a driver for Rockchip Camera Interface (CIF). It is featured + in many Rockchips SoCs in different variations, such as the PX30 + Video Input Processor (VIP, one Digital Video Port (DVP)) or the + RK3568 Video Capture (VICAP, one DVP, one MIPI CSI-2 receiver) unit. diff --git a/drivers/media/platform/rockchip/rkcif/Makefile b/drivers/media/platform/rockchip/rkcif/Makefile new file mode 100644 index 000000000000..818424972c7b --- /dev/null +++ b/drivers/media/platform/rockchip/rkcif/Makefile @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: GPL-2.0 +obj-$(CONFIG_VIDEO_ROCKCHIP_CIF) += rockchip-cif.o +rockchip-cif-objs += rkcif-dev.o \ + rkcif-capture-dvp.o \ + rkcif-capture-mipi.o \ + rkcif-interface.o \ + rkcif-stream.o diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-capture-dvp.c b/drivers/media/platform/rockchip/rkcif/rkcif-capture-dvp.c new file mode 100644 index 000000000000..e164696bad70 --- /dev/null +++ b/drivers/media/platform/rockchip/rkcif/rkcif-capture-dvp.c @@ -0,0 +1,858 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Rockchip Camera Interface (CIF) Driver + * + * Copyright (C) 2018 Rockchip Electronics Co., Ltd. + * Copyright (C) 2020 Maxime Chevallier + * Copyright (C) 2023 Mehdi Djait + * Copyright (C) 2025 Michael Riesch + */ + +#include +#include +#include +#include + +#include "rkcif-capture-dvp.h" +#include "rkcif-common.h" +#include "rkcif-interface.h" +#include "rkcif-regs.h" +#include "rkcif-stream.h" + +static const struct rkcif_output_fmt dvp_out_fmts[] = { + { + .fourcc = V4L2_PIX_FMT_NV16, + .dvp_fmt_val = RKCIF_FORMAT_YUV_OUTPUT_422 | + RKCIF_FORMAT_UV_STORAGE_ORDER_UVUV, + .cplanes = 2, + }, + { + .fourcc = V4L2_PIX_FMT_NV16M, + .dvp_fmt_val = RKCIF_FORMAT_YUV_OUTPUT_422 | + RKCIF_FORMAT_UV_STORAGE_ORDER_UVUV, + .cplanes = 2, + }, + { + .fourcc = V4L2_PIX_FMT_NV61, + .dvp_fmt_val = RKCIF_FORMAT_YUV_OUTPUT_422 | + RKCIF_FORMAT_UV_STORAGE_ORDER_VUVU, + .cplanes = 2, + }, + { + .fourcc = V4L2_PIX_FMT_NV61M, + .dvp_fmt_val = RKCIF_FORMAT_YUV_OUTPUT_422 | + RKCIF_FORMAT_UV_STORAGE_ORDER_VUVU, + .cplanes = 2, + }, + { + .fourcc = V4L2_PIX_FMT_NV12, + .dvp_fmt_val = RKCIF_FORMAT_YUV_OUTPUT_420 | + RKCIF_FORMAT_UV_STORAGE_ORDER_UVUV, + .cplanes = 2, + }, + { + .fourcc = V4L2_PIX_FMT_NV12M, + .dvp_fmt_val = RKCIF_FORMAT_YUV_OUTPUT_420 | + RKCIF_FORMAT_UV_STORAGE_ORDER_UVUV, + .cplanes = 2, + }, + { + .fourcc = V4L2_PIX_FMT_NV21, + .dvp_fmt_val = RKCIF_FORMAT_YUV_OUTPUT_420 | + RKCIF_FORMAT_UV_STORAGE_ORDER_VUVU, + .cplanes = 2, + }, + { + .fourcc = V4L2_PIX_FMT_NV21M, + .dvp_fmt_val = RKCIF_FORMAT_YUV_OUTPUT_420 | + RKCIF_FORMAT_UV_STORAGE_ORDER_VUVU, + .cplanes = 2, + }, + { + .fourcc = V4L2_PIX_FMT_RGB24, + .cplanes = 1, + }, + { + .fourcc = V4L2_PIX_FMT_RGB565, + .cplanes = 1, + }, + { + .fourcc = V4L2_PIX_FMT_BGR666, + .cplanes = 1, + }, + { + .fourcc = V4L2_PIX_FMT_SRGGB8, + .cplanes = 1, + }, + { + .fourcc = V4L2_PIX_FMT_SGRBG8, + .cplanes = 1, + }, + { + .fourcc = V4L2_PIX_FMT_SGBRG8, + .cplanes = 1, + }, + { + .fourcc = V4L2_PIX_FMT_SBGGR8, + .cplanes = 1, + }, + { + .fourcc = V4L2_PIX_FMT_SRGGB10, + .cplanes = 1, + }, + { + .fourcc = V4L2_PIX_FMT_SGRBG10, + .cplanes = 1, + }, + { + .fourcc = V4L2_PIX_FMT_SGBRG10, + .cplanes = 1, + }, + { + .fourcc = V4L2_PIX_FMT_SBGGR10, + .cplanes = 1, + }, + { + .fourcc = V4L2_PIX_FMT_SRGGB12, + .cplanes = 1, + }, + { + .fourcc = V4L2_PIX_FMT_SGRBG12, + .cplanes = 1, + }, + { + .fourcc = V4L2_PIX_FMT_SGBRG12, + .cplanes = 1, + }, + { + .fourcc = V4L2_PIX_FMT_SBGGR12, + .cplanes = 1, + }, + { + .fourcc = V4L2_PIX_FMT_SBGGR16, + .cplanes = 1, + }, + { + .fourcc = V4L2_PIX_FMT_Y16, + .cplanes = 1, + }, +}; + +static const struct rkcif_input_fmt px30_dvp_in_fmts[] = { + { + .mbus_code = MEDIA_BUS_FMT_YUYV8_2X8, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_YUYV, + .fmt_type = RKCIF_FMT_TYPE_YUV, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_YUYV8_2X8, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_YUYV, + .fmt_type = RKCIF_FMT_TYPE_YUV, + .field = V4L2_FIELD_INTERLACED, + }, + { + .mbus_code = MEDIA_BUS_FMT_YVYU8_2X8, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_YVYU, + .fmt_type = RKCIF_FMT_TYPE_YUV, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_YVYU8_2X8, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_YVYU, + .fmt_type = RKCIF_FMT_TYPE_YUV, + .field = V4L2_FIELD_INTERLACED, + }, + { + .mbus_code = MEDIA_BUS_FMT_UYVY8_2X8, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_UYVY, + .fmt_type = RKCIF_FMT_TYPE_YUV, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_UYVY8_2X8, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_UYVY, + .fmt_type = RKCIF_FMT_TYPE_YUV, + .field = V4L2_FIELD_INTERLACED, + }, + { + .mbus_code = MEDIA_BUS_FMT_VYUY8_2X8, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_VYUY, + .fmt_type = RKCIF_FMT_TYPE_YUV, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_VYUY8_2X8, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_VYUY, + .fmt_type = RKCIF_FMT_TYPE_YUV, + .field = V4L2_FIELD_INTERLACED, + }, + { + .mbus_code = MEDIA_BUS_FMT_SBGGR8_1X8, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_8, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SGBRG8_1X8, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_8, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SGRBG8_1X8, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_8, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SRGGB8_1X8, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_8, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_10, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SGBRG10_1X10, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_10, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SGRBG10_1X10, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_10, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SRGGB10_1X10, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_10, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SBGGR12_1X12, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_12, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SGBRG12_1X12, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_12, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SGRBG12_1X12, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_12, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SRGGB12_1X12, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_12, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_RGB888_1X24, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_Y8_1X8, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_8, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_Y10_1X10, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_10, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_Y12_1X12, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_12, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + } +}; + +const struct rkcif_dvp_match_data px30_vip_dvp_match_data = { + .in_fmts = px30_dvp_in_fmts, + .in_fmts_num = ARRAY_SIZE(px30_dvp_in_fmts), + .out_fmts = dvp_out_fmts, + .out_fmts_num = ARRAY_SIZE(dvp_out_fmts), + .has_scaler = true, + .regs = { + [RKCIF_DVP_CTRL] = 0x00, + [RKCIF_DVP_INTEN] = 0x04, + [RKCIF_DVP_INTSTAT] = 0x08, + [RKCIF_DVP_FOR] = 0x0c, + [RKCIF_DVP_LINE_NUM_ADDR] = 0x10, + [RKCIF_DVP_FRM0_ADDR_Y] = 0x14, + [RKCIF_DVP_FRM0_ADDR_UV] = 0x18, + [RKCIF_DVP_FRM1_ADDR_Y] = 0x1c, + [RKCIF_DVP_FRM1_ADDR_UV] = 0x20, + [RKCIF_DVP_VIR_LINE_WIDTH] = 0x24, + [RKCIF_DVP_SET_SIZE] = 0x28, + [RKCIF_DVP_SCL_CTRL] = 0x48, + [RKCIF_DVP_FRAME_STATUS] = 0x60, + [RKCIF_DVP_LAST_LINE] = 0x68, + [RKCIF_DVP_LAST_PIX] = 0x6c, + }, +}; + +static const struct rkcif_input_fmt rk3568_dvp_in_fmts[] = { + { + .mbus_code = MEDIA_BUS_FMT_YUYV8_2X8, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_YUYV, + .fmt_type = RKCIF_FMT_TYPE_YUV, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_YUYV8_2X8, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_YUYV, + .fmt_type = RKCIF_FMT_TYPE_YUV, + .field = V4L2_FIELD_INTERLACED, + }, + { + .mbus_code = MEDIA_BUS_FMT_YVYU8_2X8, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_YVYU, + .fmt_type = RKCIF_FMT_TYPE_YUV, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_YVYU8_2X8, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_YVYU, + .fmt_type = RKCIF_FMT_TYPE_YUV, + .field = V4L2_FIELD_INTERLACED, + }, + { + .mbus_code = MEDIA_BUS_FMT_UYVY8_2X8, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_UYVY, + .fmt_type = RKCIF_FMT_TYPE_YUV, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_UYVY8_2X8, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_UYVY, + .fmt_type = RKCIF_FMT_TYPE_YUV, + .field = V4L2_FIELD_INTERLACED, + }, + { + .mbus_code = MEDIA_BUS_FMT_VYUY8_2X8, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_VYUY, + .fmt_type = RKCIF_FMT_TYPE_YUV, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_VYUY8_2X8, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_VYUY, + .fmt_type = RKCIF_FMT_TYPE_YUV, + .field = V4L2_FIELD_INTERLACED, + }, + { + .mbus_code = MEDIA_BUS_FMT_YUYV8_1X16, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_YUYV | + RKCIF_FORMAT_INPUT_MODE_BT1120 | + RKCIF_FORMAT_BT1120_TRANSMIT_PROGRESS, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_YUYV8_1X16, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_YUYV | + RKCIF_FORMAT_INPUT_MODE_BT1120, + .field = V4L2_FIELD_INTERLACED, + }, + { + .mbus_code = MEDIA_BUS_FMT_YVYU8_1X16, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_YVYU | + RKCIF_FORMAT_INPUT_MODE_BT1120 | + RKCIF_FORMAT_BT1120_TRANSMIT_PROGRESS, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_YVYU8_1X16, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_YVYU | + RKCIF_FORMAT_INPUT_MODE_BT1120, + .field = V4L2_FIELD_INTERLACED, + }, + { + .mbus_code = MEDIA_BUS_FMT_UYVY8_1X16, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_YUYV | + RKCIF_FORMAT_INPUT_MODE_BT1120 | + RKCIF_FORMAT_BT1120_YC_SWAP | + RKCIF_FORMAT_BT1120_TRANSMIT_PROGRESS, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_UYVY8_1X16, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_YUYV | + RKCIF_FORMAT_BT1120_YC_SWAP | + RKCIF_FORMAT_INPUT_MODE_BT1120, + .field = V4L2_FIELD_INTERLACED, + }, + { + .mbus_code = MEDIA_BUS_FMT_VYUY8_1X16, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_YVYU | + RKCIF_FORMAT_INPUT_MODE_BT1120 | + RKCIF_FORMAT_BT1120_YC_SWAP | + RKCIF_FORMAT_BT1120_TRANSMIT_PROGRESS, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_VYUY8_1X16, + .dvp_fmt_val = RKCIF_FORMAT_YUV_INPUT_422 | + RKCIF_FORMAT_YUV_INPUT_ORDER_YVYU | + RKCIF_FORMAT_BT1120_YC_SWAP | + RKCIF_FORMAT_INPUT_MODE_BT1120, + .field = V4L2_FIELD_INTERLACED, + }, + { + .mbus_code = MEDIA_BUS_FMT_SBGGR8_1X8, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_8, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SGBRG8_1X8, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_8, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SGRBG8_1X8, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_8, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SRGGB8_1X8, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_8, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_10, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SGBRG10_1X10, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_10, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SGRBG10_1X10, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_10, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SRGGB10_1X10, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_10, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SBGGR12_1X12, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_12, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SGBRG12_1X12, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_12, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SGRBG12_1X12, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_12, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_SRGGB12_1X12, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_12, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_RGB888_1X24, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_Y8_1X8, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_8, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_Y10_1X10, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_10, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, + { + .mbus_code = MEDIA_BUS_FMT_Y12_1X12, + .dvp_fmt_val = RKCIF_FORMAT_INPUT_MODE_RAW | + RKCIF_FORMAT_RAW_DATA_WIDTH_12, + .fmt_type = RKCIF_FMT_TYPE_RAW, + .field = V4L2_FIELD_NONE, + }, +}; + +static void rk3568_dvp_grf_setup(struct rkcif_device *rkcif) +{ + u32 con1 = RK3568_GRF_WRITE_ENABLE(RK3568_GRF_VI_CON1_CIF_DATAPATH | + RK3568_GRF_VI_CON1_CIF_CLK_DELAYNUM); + + if (!rkcif->grf) + return; + + con1 |= rkcif->interfaces[0].dvp.cif_clk_delaynum & + RK3568_GRF_VI_CON1_CIF_CLK_DELAYNUM; + + if (rkcif->interfaces[0].vep.bus.parallel.flags & + V4L2_MBUS_PCLK_SAMPLE_DUALEDGE) + con1 |= RK3568_GRF_VI_CON1_CIF_DATAPATH; + + regmap_write(rkcif->grf, RK3568_GRF_VI_CON1, con1); +} + +const struct rkcif_dvp_match_data rk3568_vicap_dvp_match_data = { + .in_fmts = rk3568_dvp_in_fmts, + .in_fmts_num = ARRAY_SIZE(rk3568_dvp_in_fmts), + .out_fmts = dvp_out_fmts, + .out_fmts_num = ARRAY_SIZE(dvp_out_fmts), + .setup = rk3568_dvp_grf_setup, + .has_scaler = false, + .regs = { + [RKCIF_DVP_CTRL] = 0x00, + [RKCIF_DVP_INTEN] = 0x04, + [RKCIF_DVP_INTSTAT] = 0x08, + [RKCIF_DVP_FOR] = 0x0c, + [RKCIF_DVP_LINE_NUM_ADDR] = 0x2c, + [RKCIF_DVP_FRM0_ADDR_Y] = 0x14, + [RKCIF_DVP_FRM0_ADDR_UV] = 0x18, + [RKCIF_DVP_FRM1_ADDR_Y] = 0x1c, + [RKCIF_DVP_FRM1_ADDR_UV] = 0x20, + [RKCIF_DVP_VIR_LINE_WIDTH] = 0x24, + [RKCIF_DVP_SET_SIZE] = 0x28, + [RKCIF_DVP_CROP] = 0x34, + [RKCIF_DVP_FRAME_STATUS] = 0x3c, + [RKCIF_DVP_LAST_LINE] = 0x44, + [RKCIF_DVP_LAST_PIX] = 0x48, + }, +}; + +static inline unsigned int cif_dvp_get_addr(struct rkcif_device *rkcif, + unsigned int index) +{ + if (WARN_ON(index >= RKCIF_DVP_REGISTER_MAX)) + return RKCIF_REGISTER_NOTSUPPORTED; + + return rkcif->match_data->dvp->regs[index]; +} + +static inline __maybe_unused void cif_dvp_write(struct rkcif_device *rkcif, + unsigned int index, u32 val) +{ + unsigned int addr = cif_dvp_get_addr(rkcif, index); + + if (addr == RKCIF_REGISTER_NOTSUPPORTED) + return; + + writel(val, rkcif->base_addr + addr); +} + +static inline __maybe_unused u32 cif_dvp_read(struct rkcif_device *rkcif, + unsigned int index) +{ + unsigned int addr = cif_dvp_get_addr(rkcif, index); + + if (addr == RKCIF_REGISTER_NOTSUPPORTED) + return 0; + + return readl(rkcif->base_addr + addr); +} + +static void cif_dvp_queue_buffer(struct rkcif_stream *stream, + unsigned int index) +{ + struct rkcif_device *rkcif = stream->rkcif; + struct rkcif_buffer *buffer = stream->buffers[index]; + u32 frm_addr_y, frm_addr_uv; + + frm_addr_y = index ? RKCIF_DVP_FRM1_ADDR_Y : RKCIF_DVP_FRM0_ADDR_Y; + frm_addr_uv = index ? RKCIF_DVP_FRM1_ADDR_UV : RKCIF_DVP_FRM0_ADDR_UV; + + cif_dvp_write(rkcif, frm_addr_y, buffer->buff_addr[RKCIF_PLANE_Y]); + cif_dvp_write(rkcif, frm_addr_uv, buffer->buff_addr[RKCIF_PLANE_UV]); +} + +static int cif_dvp_start_streaming(struct rkcif_stream *stream) +{ + struct rkcif_device *rkcif = stream->rkcif; + struct rkcif_interface *interface = stream->interface; + struct v4l2_mbus_config_parallel *parallel; + struct v4l2_mbus_framefmt *source_fmt; + struct v4l2_subdev_state *state; + const struct rkcif_input_fmt *active_in_fmt; + const struct rkcif_output_fmt *active_out_fmt; + u32 val = 0; + int ret = -EINVAL; + + state = v4l2_subdev_lock_and_get_active_state(&interface->sd); + source_fmt = v4l2_subdev_state_get_format(state, RKCIF_IF_PAD_SRC, + stream->id); + if (!source_fmt) + goto out; + + active_in_fmt = rkcif_interface_find_input_fmt(interface, false, + source_fmt->code); + active_out_fmt = rkcif_stream_find_output_fmt(stream, false, + stream->pix.pixelformat); + if (!active_in_fmt || !active_out_fmt) + goto out; + + parallel = &interface->vep.bus.parallel; + if (parallel->bus_width == 16 && + (parallel->flags & V4L2_MBUS_PCLK_SAMPLE_DUALEDGE)) + val |= RKCIF_FORMAT_BT1120_CLOCK_DOUBLE_EDGES; + val |= active_in_fmt->dvp_fmt_val; + val |= active_out_fmt->dvp_fmt_val; + cif_dvp_write(rkcif, RKCIF_DVP_FOR, val); + + val = stream->pix.width; + if (active_in_fmt->fmt_type == RKCIF_FMT_TYPE_RAW) + val = stream->pix.width * 2; + cif_dvp_write(rkcif, RKCIF_DVP_VIR_LINE_WIDTH, val); + + val = RKCIF_XY_COORD(stream->pix.width, stream->pix.height); + cif_dvp_write(rkcif, RKCIF_DVP_SET_SIZE, val); + + cif_dvp_write(rkcif, RKCIF_DVP_FRAME_STATUS, RKCIF_FRAME_STAT_CLS); + cif_dvp_write(rkcif, RKCIF_DVP_INTSTAT, RKCIF_INTSTAT_CLS); + if (rkcif->match_data->dvp->has_scaler) { + val = active_in_fmt->fmt_type == RKCIF_FMT_TYPE_YUV ? + RKCIF_SCL_CTRL_ENABLE_YUV_16BIT_BYPASS : + RKCIF_SCL_CTRL_ENABLE_RAW_16BIT_BYPASS; + cif_dvp_write(rkcif, RKCIF_DVP_SCL_CTRL, val); + } + + cif_dvp_write(rkcif, RKCIF_DVP_INTEN, + RKCIF_INTEN_FRAME_END_EN | + RKCIF_INTEN_PST_INF_FRAME_END_EN); + + cif_dvp_write(rkcif, RKCIF_DVP_CTRL, + RKCIF_CTRL_AXI_BURST_16 | RKCIF_CTRL_MODE_PINGPONG | + RKCIF_CTRL_ENABLE_CAPTURE); + + ret = 0; + +out: + v4l2_subdev_unlock_state(state); + return ret; +} + +static void cif_dvp_stop_streaming(struct rkcif_stream *stream) +{ + struct rkcif_device *rkcif = stream->rkcif; + u32 val; + + val = cif_dvp_read(rkcif, RKCIF_DVP_CTRL); + cif_dvp_write(rkcif, RKCIF_DVP_CTRL, + val & (~RKCIF_CTRL_ENABLE_CAPTURE)); + cif_dvp_write(rkcif, RKCIF_DVP_INTEN, 0x0); + cif_dvp_write(rkcif, RKCIF_DVP_INTSTAT, 0x3ff); + cif_dvp_write(rkcif, RKCIF_DVP_FRAME_STATUS, 0x0); + + stream->stopping = false; +} + +static void cif_dvp_reset_stream(struct rkcif_device *rkcif) +{ + u32 ctl = cif_dvp_read(rkcif, RKCIF_DVP_CTRL); + + cif_dvp_write(rkcif, RKCIF_DVP_CTRL, + ctl & (~RKCIF_CTRL_ENABLE_CAPTURE)); + cif_dvp_write(rkcif, RKCIF_DVP_CTRL, ctl | RKCIF_CTRL_ENABLE_CAPTURE); +} + +static void rkcif_dvp_set_crop(struct rkcif_stream *stream, u16 left, u16 top) +{ + struct rkcif_device *rkcif = stream->rkcif; + u32 val; + + val = RKCIF_XY_COORD(left, top); + cif_dvp_write(rkcif, RKCIF_DVP_CROP, val); +} + +irqreturn_t rkcif_dvp_isr(int irq, void *ctx) +{ + struct device *dev = ctx; + struct rkcif_device *rkcif = dev_get_drvdata(dev); + struct rkcif_stream *stream; + u32 intstat, lastline, lastpix, cif_frmst; + irqreturn_t ret = IRQ_NONE; + + if (!rkcif->match_data->dvp) + return ret; + + intstat = cif_dvp_read(rkcif, RKCIF_DVP_INTSTAT); + cif_frmst = cif_dvp_read(rkcif, RKCIF_DVP_FRAME_STATUS); + lastline = RKCIF_FETCH_Y(cif_dvp_read(rkcif, RKCIF_DVP_LAST_LINE)); + lastpix = RKCIF_FETCH_Y(cif_dvp_read(rkcif, RKCIF_DVP_LAST_PIX)); + + if (intstat & RKCIF_INTSTAT_FRAME_END) { + cif_dvp_write(rkcif, RKCIF_DVP_INTSTAT, + RKCIF_INTSTAT_FRAME_END_CLR | + RKCIF_INTSTAT_LINE_END_CLR); + + stream = &rkcif->interfaces[RKCIF_DVP].streams[RKCIF_ID0]; + + if (stream->stopping) { + cif_dvp_stop_streaming(stream); + wake_up(&stream->wq_stopped); + return IRQ_HANDLED; + } + + if (lastline != stream->pix.height) { + v4l2_err(&rkcif->v4l2_dev, + "bad frame, irq:%#x frmst:%#x size:%dx%d\n", + intstat, cif_frmst, lastpix, lastline); + + cif_dvp_reset_stream(rkcif); + } + + rkcif_stream_pingpong(stream); + + ret = IRQ_HANDLED; + } + + return ret; +} + +int rkcif_dvp_register(struct rkcif_device *rkcif) +{ + struct rkcif_interface *interface; + int ret, i; + + if (!rkcif->match_data->dvp) + return 0; + + interface = &rkcif->interfaces[RKCIF_DVP]; + interface->index = RKCIF_DVP; + interface->type = RKCIF_IF_DVP; + interface->in_fmts = rkcif->match_data->dvp->in_fmts; + interface->in_fmts_num = rkcif->match_data->dvp->in_fmts_num; + interface->set_crop = rkcif_dvp_set_crop; + ret = rkcif_interface_register(rkcif, interface); + if (ret) + goto err; + + if (rkcif->match_data->dvp->setup) + rkcif->match_data->dvp->setup(rkcif); + + interface->streams_num = rkcif->match_data->dvp->has_ids ? 4 : 1; + for (i = 0; i < interface->streams_num; i++) { + struct rkcif_stream *stream = &interface->streams[i]; + + stream->id = i; + stream->interface = interface; + stream->out_fmts = rkcif->match_data->dvp->out_fmts; + stream->out_fmts_num = rkcif->match_data->dvp->out_fmts_num; + stream->queue_buffer = cif_dvp_queue_buffer; + stream->start_streaming = cif_dvp_start_streaming; + stream->stop_streaming = cif_dvp_stop_streaming; + + ret = rkcif_stream_register(rkcif, stream); + if (ret) + goto err_streams_unregister; + } + return 0; + +err_streams_unregister: + for (; i >= 0; i--) + rkcif_stream_unregister(&interface->streams[i]); + rkcif_interface_unregister(interface); +err: + return ret; +} + +void rkcif_dvp_unregister(struct rkcif_device *rkcif) +{ + struct rkcif_interface *interface; + int i; + + if (!rkcif->match_data->dvp) + return; + + interface = &rkcif->interfaces[RKCIF_DVP]; + + for (i = 0; i < interface->streams_num; i++) + rkcif_stream_unregister(&interface->streams[i]); + rkcif_interface_unregister(interface); +} diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-capture-dvp.h b/drivers/media/platform/rockchip/rkcif/rkcif-capture-dvp.h new file mode 100644 index 000000000000..be4decfd80bc --- /dev/null +++ b/drivers/media/platform/rockchip/rkcif/rkcif-capture-dvp.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Rockchip Camera Interface (CIF) Driver + * + * Copyright (C) 2018 Rockchip Electronics Co., Ltd. + * Copyright (C) 2023 Mehdi Djait + * Copyright (C) 2025 Michael Riesch + */ + +#ifndef _RKCIF_CAPTURE_DVP_H +#define _RKCIF_CAPTURE_DVP_H + +#include "rkcif-common.h" + +extern const struct rkcif_dvp_match_data px30_vip_dvp_match_data; +extern const struct rkcif_dvp_match_data rk3568_vicap_dvp_match_data; + +int rkcif_dvp_register(struct rkcif_device *rkcif); + +void rkcif_dvp_unregister(struct rkcif_device *rkcif); + +irqreturn_t rkcif_dvp_isr(int irq, void *ctx); + +#endif diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-capture-mipi.c b/drivers/media/platform/rockchip/rkcif/rkcif-capture-mipi.c new file mode 100644 index 000000000000..0c3f7b8cfa18 --- /dev/null +++ b/drivers/media/platform/rockchip/rkcif/rkcif-capture-mipi.c @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Rockchip Camera Interface (CIF) Driver + * + * Copyright (C) 2018 Rockchip Electronics Co., Ltd. + * Copyright (C) 2025 Michael Riesch + */ + +#include "rkcif-capture-mipi.h" +#include "rkcif-common.h" +#include "rkcif-stream.h" + +irqreturn_t rkcif_mipi_isr(int irq, void *ctx) +{ + irqreturn_t ret = IRQ_NONE; + + return ret; +} + +int rkcif_mipi_register(struct rkcif_device *rkcif) +{ + return 0; +} + +void rkcif_mipi_unregister(struct rkcif_device *rkcif) +{ +} diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-capture-mipi.h b/drivers/media/platform/rockchip/rkcif/rkcif-capture-mipi.h new file mode 100644 index 000000000000..ee1a50a59505 --- /dev/null +++ b/drivers/media/platform/rockchip/rkcif/rkcif-capture-mipi.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Rockchip Camera Interface (CIF) Driver + * + * Copyright (C) 2018 Rockchip Electronics Co., Ltd. + * Copyright (C) 2025 Michael Riesch + */ + +#ifndef _RKCIF_CAPTURE_MIPI_H +#define _RKCIF_CAPTURE_MIPI_H + +#include "rkcif-common.h" + +int rkcif_mipi_register(struct rkcif_device *rkcif); + +void rkcif_mipi_unregister(struct rkcif_device *rkcif); + +irqreturn_t rkcif_mipi_isr(int irq, void *ctx); + +#endif diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-common.h b/drivers/media/platform/rockchip/rkcif/rkcif-common.h new file mode 100644 index 000000000000..32f6f0238656 --- /dev/null +++ b/drivers/media/platform/rockchip/rkcif/rkcif-common.h @@ -0,0 +1,220 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Rockchip Camera Interface (CIF) Driver + * + * Copyright (C) 2018 Rockchip Electronics Co., Ltd. + * Copyright (C) 2023 Mehdi Djait + * Copyright (C) 2025 Michael Riesch + */ + +#ifndef _RKCIF_COMMON_H +#define _RKCIF_COMMON_H + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "rkcif-regs.h" + +#define RKCIF_DRIVER_NAME "rockchip-cif" +#define RKCIF_CLK_MAX 4 + +enum rkcif_format_type { + RKCIF_FMT_TYPE_INVALID, + RKCIF_FMT_TYPE_YUV, + RKCIF_FMT_TYPE_RAW, +}; + +enum rkcif_id_index { + RKCIF_ID0, + RKCIF_ID1, + RKCIF_ID2, + RKCIF_ID3, + RKCIF_ID_MAX +}; + +enum rkcif_interface_index { + RKCIF_DVP, + RKCIF_MIPI_BASE, + RKCIF_MIPI1 = RKCIF_MIPI_BASE, + RKCIF_MIPI2, + RKCIF_MIPI3, + RKCIF_MIPI4, + RKCIF_MIPI5, + RKCIF_MIPI6, + RKCIF_MIPI_MAX = RKCIF_MIPI6, + RKCIF_IF_MAX = RKCIF_MIPI_MAX +}; + +enum rkcif_interface_pad_index { + RKCIF_IF_PAD_SINK, + RKCIF_IF_PAD_SRC, + RKCIF_IF_PAD_MAX +}; + +enum rkcif_interface_status { + RKCIF_IF_INACTIVE, + RKCIF_IF_ACTIVE, +}; + +enum rkcif_interface_type { + RKCIF_IF_INVALID, + RKCIF_IF_DVP, + RKCIF_IF_MIPI, +}; + +enum rkcif_plane_index { + RKCIF_PLANE_Y, + RKCIF_PLANE_UV, + RKCIF_PLANE_MAX +}; + +struct rkcif_input_fmt { + u32 mbus_code; + + enum rkcif_format_type fmt_type; + enum v4l2_field field; + + union { + u32 dvp_fmt_val; + }; +}; + +struct rkcif_output_fmt { + u32 fourcc; + u32 mbus_code; + u8 cplanes; + + union { + u32 dvp_fmt_val; + }; +}; + +struct rkcif_buffer { + struct vb2_v4l2_buffer vb; + struct list_head queue; + dma_addr_t buff_addr[VIDEO_MAX_PLANES]; + bool is_dummy; +}; + +struct rkcif_dummy_buffer { + struct rkcif_buffer buffer; + void *vaddr; + u32 size; +}; + +struct rkcif_interface; + +struct rkcif_remote { + struct v4l2_async_connection async_conn; + struct v4l2_subdev *sd; + + struct rkcif_interface *interface; +}; + +struct rkcif_stream { + enum rkcif_id_index id; + struct rkcif_device *rkcif; + struct rkcif_interface *interface; + const struct rkcif_output_fmt *out_fmts; + unsigned int out_fmts_num; + + /* in ping-pong mode, two buffers can be provided to the HW */ + struct rkcif_buffer *buffers[2]; + int frame_idx; + int frame_phase; + + /* in case of no available buffer, HW can write to the dummy buffer */ + struct rkcif_dummy_buffer dummy; + + bool stopping; + wait_queue_head_t wq_stopped; + + /* queue of available buffers plus spinlock that protects it */ + spinlock_t driver_queue_lock; + struct list_head driver_queue; + + /* lock used by the V4L2 core */ + struct mutex vlock; + + struct media_pad pad; + struct media_pipeline pipeline; + struct v4l2_pix_format_mplane pix; + struct vb2_queue buf_queue; + struct video_device vdev; + + void (*queue_buffer)(struct rkcif_stream *stream, unsigned int index); + int (*start_streaming)(struct rkcif_stream *stream); + void (*stop_streaming)(struct rkcif_stream *stream); +}; + +struct rkcif_dvp { + u32 cif_clk_delaynum; +}; + +struct rkcif_interface { + enum rkcif_interface_type type; + enum rkcif_interface_status status; + enum rkcif_interface_index index; + struct rkcif_device *rkcif; + struct rkcif_remote *remote; + struct rkcif_stream streams[RKCIF_ID_MAX]; + unsigned int streams_num; + const struct rkcif_input_fmt *in_fmts; + unsigned int in_fmts_num; + + struct media_pad pads[RKCIF_IF_PAD_MAX]; + struct v4l2_fwnode_endpoint vep; + struct v4l2_subdev sd; + + union { + struct rkcif_dvp dvp; + }; + + void (*set_crop)(struct rkcif_stream *stream, u16 left, u16 top); +}; + +struct rkcif_dvp_match_data { + const struct rkcif_input_fmt *in_fmts; + unsigned int in_fmts_num; + const struct rkcif_output_fmt *out_fmts; + unsigned int out_fmts_num; + void (*setup)(struct rkcif_device *rkcif); + bool has_scaler; + bool has_ids; + unsigned int regs[RKCIF_DVP_REGISTER_MAX]; +}; + +struct rkcif_match_data { + const char *const *clks; + unsigned int clks_num; + const struct rkcif_dvp_match_data *dvp; +}; + +struct rkcif_device { + struct device *dev; + + const struct rkcif_match_data *match_data; + struct clk_bulk_data clks[RKCIF_CLK_MAX]; + unsigned int clks_num; + struct regmap *grf; + struct reset_control *reset; + void __iomem *base_addr; + + struct rkcif_interface interfaces[RKCIF_IF_MAX]; + + struct media_device media_dev; + struct v4l2_device v4l2_dev; + struct v4l2_async_notifier notifier; +}; + +#endif diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-dev.c b/drivers/media/platform/rockchip/rkcif/rkcif-dev.c new file mode 100644 index 000000000000..2adf04e46a37 --- /dev/null +++ b/drivers/media/platform/rockchip/rkcif/rkcif-dev.c @@ -0,0 +1,306 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Rockchip Camera Interface (CIF) Driver + * + * Copyright (C) 2018 Rockchip Electronics Co., Ltd. + * Copyright (C) 2020 Maxime Chevallier + * Copyright (C) 2023 Mehdi Djait + * Copyright (C) 2025 Michael Riesch + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "rkcif-capture-dvp.h" +#include "rkcif-capture-mipi.h" +#include "rkcif-common.h" + +const char *const px30_vip_clks[] = { + "aclk", + "hclk", + "pclk", +}; + +static const struct rkcif_match_data px30_vip_match_data = { + .clks = px30_vip_clks, + .clks_num = ARRAY_SIZE(px30_vip_clks), + .dvp = &px30_vip_dvp_match_data, +}; + +const char *const rk3568_vicap_clks[] = { + "aclk", + "hclk", + "dclk", + "iclk", +}; + +static const struct rkcif_match_data rk3568_vicap_match_data = { + .clks = rk3568_vicap_clks, + .clks_num = ARRAY_SIZE(rk3568_vicap_clks), + .dvp = &rk3568_vicap_dvp_match_data, +}; + +static const struct of_device_id rkcif_plat_of_match[] = { + { + .compatible = "rockchip,px30-vip", + .data = &px30_vip_match_data, + }, + { + .compatible = "rockchip,rk3568-vicap", + .data = &rk3568_vicap_match_data, + }, + {} +}; + +static int rkcif_notifier_bound(struct v4l2_async_notifier *notifier, + struct v4l2_subdev *sd, + struct v4l2_async_connection *asd) +{ + struct rkcif_device *rkcif = + container_of(notifier, struct rkcif_device, notifier); + struct rkcif_remote *remote = + container_of(asd, struct rkcif_remote, async_conn); + struct media_pad *sink_pad = + &remote->interface->pads[RKCIF_IF_PAD_SINK]; + int ret; + + ret = v4l2_create_fwnode_links_to_pad(sd, sink_pad, + MEDIA_LNK_FL_ENABLED); + if (ret) { + dev_err(rkcif->dev, "failed to link source pad of %s\n", + sd->name); + return ret; + } + + remote->sd = sd; + + return 0; +} + +static int rkcif_notifier_complete(struct v4l2_async_notifier *notifier) +{ + struct rkcif_device *rkcif = + container_of(notifier, struct rkcif_device, notifier); + + return v4l2_device_register_subdev_nodes(&rkcif->v4l2_dev); +} + +static const struct v4l2_async_notifier_operations rkcif_notifier_ops = { + .bound = rkcif_notifier_bound, + .complete = rkcif_notifier_complete, +}; + +static int rkcif_register(struct rkcif_device *rkcif) +{ + struct v4l2_async_notifier *ntf = &rkcif->notifier; + int ret; + + v4l2_async_nf_init(ntf, &rkcif->v4l2_dev); + ntf->ops = &rkcif_notifier_ops; + + ret = rkcif_dvp_register(rkcif); + if (ret && ret != -ENODEV) + goto err_notifier_cleanup; + + ret = rkcif_mipi_register(rkcif); + if (ret && ret != -ENODEV) + goto err_dvp_unregister; + + ret = v4l2_async_nf_register(ntf); + if (ret) + goto err_mipi_unregister; + + return 0; + +err_mipi_unregister: + rkcif_mipi_unregister(rkcif); +err_dvp_unregister: + rkcif_dvp_unregister(rkcif); +err_notifier_cleanup: + v4l2_async_nf_cleanup(&rkcif->notifier); + return ret; +} + +static void rkcif_unregister(struct rkcif_device *rkcif) +{ + v4l2_async_nf_unregister(&rkcif->notifier); + rkcif_mipi_unregister(rkcif); + rkcif_dvp_unregister(rkcif); + v4l2_async_nf_cleanup(&rkcif->notifier); +} + +static irqreturn_t rkcif_isr(int irq, void *ctx) +{ + irqreturn_t ret = IRQ_NONE; + + if (rkcif_dvp_isr(irq, ctx) == IRQ_HANDLED) + ret = IRQ_HANDLED; + + if (rkcif_mipi_isr(irq, ctx) == IRQ_HANDLED) + ret = IRQ_HANDLED; + + return ret; +} + +static int rkcif_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct rkcif_device *rkcif; + u32 cif_clk_delaynum = 0; + int ret, irq, i; + + rkcif = devm_kzalloc(dev, sizeof(*rkcif), GFP_KERNEL); + if (!rkcif) + return -ENOMEM; + + rkcif->match_data = of_device_get_match_data(dev); + if (!rkcif->match_data) + return -ENODEV; + + dev_set_drvdata(dev, rkcif); + rkcif->dev = dev; + + rkcif->base_addr = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(rkcif->base_addr)) + return PTR_ERR(rkcif->base_addr); + + irq = platform_get_irq(pdev, 0); + if (irq < 0) + return irq; + + ret = devm_request_irq(dev, irq, rkcif_isr, IRQF_SHARED, + dev_driver_string(dev), dev); + if (ret) + return dev_err_probe(dev, ret, "failed to request irq\n"); + + rkcif->clks_num = rkcif->match_data->clks_num; + for (i = 0; (i < rkcif->clks_num) && (i < RKCIF_CLK_MAX); i++) + rkcif->clks[i].id = rkcif->match_data->clks[i]; + ret = devm_clk_bulk_get(dev, rkcif->clks_num, rkcif->clks); + if (ret) + return dev_err_probe(dev, ret, "failed to get clocks\n"); + + rkcif->reset = devm_reset_control_array_get_exclusive(dev); + if (IS_ERR(rkcif->reset)) + return PTR_ERR(rkcif->reset); + + rkcif->grf = + syscon_regmap_lookup_by_phandle(dev->of_node, "rockchip,grf"); + if (IS_ERR(rkcif->grf)) + rkcif->grf = NULL; + + if (rkcif->match_data->dvp) { + of_property_read_u32(dev->of_node, "rockchip,cif-clk-delaynum", + &cif_clk_delaynum); + rkcif->interfaces[RKCIF_DVP].dvp.cif_clk_delaynum = + cif_clk_delaynum; + } + + pm_runtime_enable(&pdev->dev); + + rkcif->media_dev.dev = dev; + strscpy(rkcif->media_dev.model, RKCIF_DRIVER_NAME, + sizeof(rkcif->media_dev.model)); + media_device_init(&rkcif->media_dev); + + rkcif->v4l2_dev.mdev = &rkcif->media_dev; + ret = v4l2_device_register(dev, &rkcif->v4l2_dev); + if (ret) + goto err_media_dev_cleanup; + + ret = media_device_register(&rkcif->media_dev); + if (ret < 0) { + dev_err(dev, "failed to register media device: %d\n", ret); + goto err_v4l2_dev_unregister; + } + + ret = rkcif_register(rkcif); + if (ret) { + dev_err(dev, "failed to register media entities: %d\n", ret); + goto err_media_dev_unregister; + } + + return 0; + +err_media_dev_unregister: + media_device_unregister(&rkcif->media_dev); +err_v4l2_dev_unregister: + v4l2_device_unregister(&rkcif->v4l2_dev); +err_media_dev_cleanup: + media_device_cleanup(&rkcif->media_dev); + pm_runtime_disable(&pdev->dev); + return ret; +} + +static void rkcif_remove(struct platform_device *pdev) +{ + struct rkcif_device *rkcif = platform_get_drvdata(pdev); + + rkcif_unregister(rkcif); + media_device_unregister(&rkcif->media_dev); + v4l2_device_unregister(&rkcif->v4l2_dev); + media_device_cleanup(&rkcif->media_dev); + pm_runtime_disable(&pdev->dev); +} + +static int rkcif_runtime_suspend(struct device *dev) +{ + struct rkcif_device *rkcif = dev_get_drvdata(dev); + + /* + * Reset CIF (CRU, DMA, FIFOs) to allow a clean resume. + * Since this resets the IOMMU too, we cannot issue this reset when + * resuming. + */ + reset_control_assert(rkcif->reset); + udelay(5); + reset_control_deassert(rkcif->reset); + + clk_bulk_disable_unprepare(rkcif->clks_num, rkcif->clks); + + return 0; +} + +static int rkcif_runtime_resume(struct device *dev) +{ + struct rkcif_device *rkcif = dev_get_drvdata(dev); + int ret; + + ret = clk_bulk_prepare_enable(rkcif->clks_num, rkcif->clks); + if (ret) { + dev_err(dev, "failed to enable clocks\n"); + return ret; + } + + return 0; +} + +static const struct dev_pm_ops rkcif_plat_pm_ops = { + .runtime_suspend = rkcif_runtime_suspend, + .runtime_resume = rkcif_runtime_resume, +}; + +static struct platform_driver rkcif_plat_drv = { + .driver = { + .name = RKCIF_DRIVER_NAME, + .of_match_table = rkcif_plat_of_match, + .pm = &rkcif_plat_pm_ops, + }, + .probe = rkcif_probe, + .remove = rkcif_remove, +}; +module_platform_driver(rkcif_plat_drv); + +MODULE_DESCRIPTION("Rockchip Camera Interface (CIF) platform driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-interface.c b/drivers/media/platform/rockchip/rkcif/rkcif-interface.c new file mode 100644 index 000000000000..5dcbf656073b --- /dev/null +++ b/drivers/media/platform/rockchip/rkcif/rkcif-interface.c @@ -0,0 +1,418 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Rockchip Camera Interface (CIF) Driver + * + * Copyright (C) 2025 Michael Riesch + */ + +#include +#include +#include +#include + +#include "rkcif-common.h" +#include "rkcif-interface.h" + +static inline struct rkcif_interface *to_rkcif_interface(struct v4l2_subdev *sd) +{ + return container_of(sd, struct rkcif_interface, sd); +} + +static const struct media_entity_operations rkcif_interface_media_ops = { + .link_validate = v4l2_subdev_link_validate, + .has_pad_interdep = v4l2_subdev_has_pad_interdep, +}; + +static int rkcif_interface_set_fmt(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + struct v4l2_subdev_format *format) +{ + struct rkcif_interface *interface = to_rkcif_interface(sd); + const struct rkcif_input_fmt *input; + struct v4l2_mbus_framefmt *sink, *src; + + /* the format on the source pad always matches the sink pad */ + if (format->pad == RKCIF_IF_PAD_SRC) + return v4l2_subdev_get_fmt(sd, state, format); + + input = rkcif_interface_find_input_fmt(interface, true, + format->format.code); + format->format.code = input->mbus_code; + + sink = v4l2_subdev_state_get_format(state, format->pad, format->stream); + if (!sink) + return -EINVAL; + + *sink = format->format; + + /* propagate the format to the source pad */ + src = v4l2_subdev_state_get_opposite_stream_format(state, format->pad, + format->stream); + if (!src) + return -EINVAL; + + *src = *sink; + + return 0; +} + +static int rkcif_interface_get_sel(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + struct v4l2_subdev_selection *sel) +{ + struct v4l2_mbus_framefmt *sink; + struct v4l2_rect *crop; + int ret = 0; + + if (sel->pad != RKCIF_IF_PAD_SRC) + return -EINVAL; + + sink = v4l2_subdev_state_get_opposite_stream_format(state, sel->pad, + sel->stream); + if (!sink) + return -EINVAL; + + crop = v4l2_subdev_state_get_crop(state, sel->pad, sel->stream); + if (!crop) + return -EINVAL; + + switch (sel->target) { + case V4L2_SEL_TGT_CROP_DEFAULT: + case V4L2_SEL_TGT_CROP_BOUNDS: + sel->r.left = 0; + sel->r.top = 0; + sel->r.width = sink->width; + sel->r.height = sink->height; + break; + case V4L2_SEL_TGT_CROP: + sel->r = *crop; + break; + default: + ret = -EINVAL; + } + + return ret; +} + +static int rkcif_interface_set_sel(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + struct v4l2_subdev_selection *sel) +{ + struct v4l2_mbus_framefmt *sink, *src; + struct v4l2_rect *crop; + + if (sel->pad != RKCIF_IF_PAD_SRC || sel->target != V4L2_SEL_TGT_CROP) + return -EINVAL; + + sink = v4l2_subdev_state_get_opposite_stream_format(state, sel->pad, + sel->stream); + if (!sink) + return -EINVAL; + + src = v4l2_subdev_state_get_format(state, sel->pad, sel->stream); + if (!src) + return -EINVAL; + + crop = v4l2_subdev_state_get_crop(state, sel->pad, sel->stream); + if (!crop) + return -EINVAL; + + /* only starting point of crop can be specified */ + sel->r.height = sink->height - sel->r.top; + sel->r.width = sink->width - sel->r.left; + *crop = sel->r; + + src->height = sel->r.height; + src->width = sel->r.width; + + return 0; +} + +static int rkcif_interface_set_routing(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + enum v4l2_subdev_format_whence which, + struct v4l2_subdev_krouting *routing) +{ + int ret; + + ret = v4l2_subdev_routing_validate(sd, routing, + V4L2_SUBDEV_ROUTING_ONLY_1_TO_1); + if (ret) + return ret; + + for (unsigned int i = 0; i < routing->num_routes; i++) { + const struct v4l2_subdev_route *route = &routing->routes[i]; + + if (route->source_stream >= RKCIF_ID_MAX) + return -EINVAL; + } + + ret = v4l2_subdev_set_routing(sd, state, routing); + + return ret; +} + +static int rkcif_interface_apply_crop(struct rkcif_stream *stream, + struct v4l2_subdev_state *state) +{ + struct rkcif_interface *interface = stream->interface; + struct v4l2_rect *crop; + + crop = v4l2_subdev_state_get_crop(state, RKCIF_IF_PAD_SRC, stream->id); + if (!crop) + return -EINVAL; + + if (interface->set_crop) + interface->set_crop(stream, crop->left, crop->top); + + return 0; +} + +static int rkcif_interface_enable_streams(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + u32 pad, u64 streams_mask) +{ + struct rkcif_interface *interface = to_rkcif_interface(sd); + struct rkcif_stream *stream; + struct v4l2_subdev_route *route; + struct v4l2_subdev *remote_sd; + struct media_pad *remote_pad; + u64 mask; + + remote_pad = + media_pad_remote_pad_first(&sd->entity.pads[RKCIF_IF_PAD_SINK]); + remote_sd = media_entity_to_v4l2_subdev(remote_pad->entity); + + /* DVP has one crop setting for all IDs */ + if (interface->type == RKCIF_IF_DVP) { + stream = &interface->streams[RKCIF_ID0]; + rkcif_interface_apply_crop(stream, state); + } else { + /* TODO implement for MIPI */ + } + + mask = v4l2_subdev_state_xlate_streams(state, RKCIF_IF_PAD_SINK, + RKCIF_IF_PAD_SRC, &streams_mask); + + return v4l2_subdev_enable_streams(remote_sd, remote_pad->index, mask); +} + +static int rkcif_interface_disable_streams(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + u32 pad, u64 streams_mask) +{ + struct v4l2_subdev *remote_sd; + struct media_pad *remote_pad; + u64 mask; + + remote_pad = + media_pad_remote_pad_first(&sd->entity.pads[RKCIF_IF_PAD_SINK]); + remote_sd = media_entity_to_v4l2_subdev(remote_pad->entity); + + mask = v4l2_subdev_state_xlate_streams(state, RKCIF_IF_PAD_SINK, + RKCIF_IF_PAD_SRC, &streams_mask); + + return v4l2_subdev_disable_streams(remote_sd, remote_pad->index, mask); +} + +static const struct v4l2_subdev_pad_ops rkcif_interface_pad_ops = { + .get_fmt = v4l2_subdev_get_fmt, + .set_fmt = rkcif_interface_set_fmt, + .get_selection = rkcif_interface_get_sel, + .set_selection = rkcif_interface_set_sel, + .set_routing = rkcif_interface_set_routing, + .enable_streams = rkcif_interface_enable_streams, + .disable_streams = rkcif_interface_disable_streams, +}; + +static const struct v4l2_subdev_ops rkcif_interface_ops = { + .pad = &rkcif_interface_pad_ops, +}; + +static int rkcif_interface_init_state(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state) +{ + struct rkcif_interface *interface = to_rkcif_interface(sd); + struct v4l2_subdev_route routes[] = { + { + .sink_pad = RKCIF_IF_PAD_SINK, + .sink_stream = 0, + .source_pad = RKCIF_IF_PAD_SRC, + .source_stream = 0, + .flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE, + }, + }; + struct v4l2_subdev_krouting routing = { + .len_routes = ARRAY_SIZE(routes), + .num_routes = ARRAY_SIZE(routes), + .routes = routes, + }; + const struct v4l2_mbus_framefmt dvp_default_format = { + .width = 3840, + .height = 2160, + .code = MEDIA_BUS_FMT_YUYV8_1X16, + .field = V4L2_FIELD_NONE, + .colorspace = V4L2_COLORSPACE_REC709, + .ycbcr_enc = V4L2_YCBCR_ENC_709, + .quantization = V4L2_QUANTIZATION_LIM_RANGE, + .xfer_func = V4L2_XFER_FUNC_NONE, + }; + const struct v4l2_mbus_framefmt mipi_default_format = { + .width = 3840, + .height = 2160, + .code = MEDIA_BUS_FMT_SRGGB10_1X10, + .field = V4L2_FIELD_NONE, + .colorspace = V4L2_COLORSPACE_RAW, + .ycbcr_enc = V4L2_YCBCR_ENC_601, + .quantization = V4L2_QUANTIZATION_FULL_RANGE, + .xfer_func = V4L2_XFER_FUNC_NONE, + }; + const struct v4l2_mbus_framefmt *default_format; + int ret; + + default_format = (interface->type == RKCIF_IF_DVP) ? + &dvp_default_format : + &mipi_default_format; + + ret = v4l2_subdev_set_routing_with_fmt(sd, state, &routing, + default_format); + + return ret; +} + +static const struct v4l2_subdev_internal_ops rkcif_interface_internal_ops = { + .init_state = rkcif_interface_init_state, +}; + +static int rkcif_interface_add(struct rkcif_interface *interface) +{ + struct rkcif_device *rkcif = interface->rkcif; + struct rkcif_remote *remote; + struct v4l2_async_notifier *ntf = &rkcif->notifier; + struct v4l2_fwnode_endpoint *vep = &interface->vep; + struct device *dev = rkcif->dev; + struct fwnode_handle *ep; + int ret; + + ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(dev), interface->index, + 0, FWNODE_GRAPH_ENDPOINT_NEXT); + if (!ep) + return -ENODEV; + + vep->bus_type = V4L2_MBUS_UNKNOWN; + ret = v4l2_fwnode_endpoint_parse(ep, vep); + if (ret) + goto complete; + + if (interface->type == RKCIF_IF_DVP) { + if (vep->bus_type != V4L2_MBUS_BT656 && + vep->bus_type != V4L2_MBUS_PARALLEL) { + ret = dev_err_probe(dev, -EINVAL, + "unsupported bus type\n"); + goto complete; + } + } + + remote = v4l2_async_nf_add_fwnode_remote(ntf, ep, struct rkcif_remote); + if (IS_ERR(remote)) { + ret = PTR_ERR(remote); + goto complete; + } + + remote->interface = interface; + interface->remote = remote; + interface->status = RKCIF_IF_ACTIVE; + ret = 0; + +complete: + fwnode_handle_put(ep); + + return ret; +} + +int rkcif_interface_register(struct rkcif_device *rkcif, + struct rkcif_interface *interface) +{ + struct media_pad *pads = interface->pads; + struct v4l2_subdev *sd = &interface->sd; + int ret; + + interface->rkcif = rkcif; + + v4l2_subdev_init(sd, &rkcif_interface_ops); + sd->dev = rkcif->dev; + sd->entity.ops = &rkcif_interface_media_ops; + sd->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE; + sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_STREAMS; + sd->internal_ops = &rkcif_interface_internal_ops; + sd->owner = THIS_MODULE; + + if (interface->type == RKCIF_IF_DVP) + snprintf(sd->name, sizeof(sd->name), "rkcif-dvp0"); + else if (interface->type == RKCIF_IF_MIPI) + snprintf(sd->name, sizeof(sd->name), "rkcif-mipi%d", + interface->index - RKCIF_MIPI_BASE); + + pads[RKCIF_IF_PAD_SINK].flags = MEDIA_PAD_FL_SINK; + pads[RKCIF_IF_PAD_SRC].flags = MEDIA_PAD_FL_SOURCE; + ret = media_entity_pads_init(&sd->entity, RKCIF_IF_PAD_MAX, pads); + if (ret) + goto err; + + ret = v4l2_subdev_init_finalize(sd); + if (ret) + goto err_entity_cleanup; + + ret = v4l2_device_register_subdev(&rkcif->v4l2_dev, sd); + if (ret) { + dev_err(sd->dev, "failed to register subdev\n"); + goto err_subdev_cleanup; + } + + ret = rkcif_interface_add(interface); + if (ret) + goto err_subdev_unregister; + + return 0; + +err_subdev_unregister: + v4l2_async_unregister_subdev(sd); +err_subdev_cleanup: + v4l2_subdev_cleanup(sd); +err_entity_cleanup: + media_entity_cleanup(&sd->entity); +err: + return ret; +} + +void rkcif_interface_unregister(struct rkcif_interface *interface) +{ + struct v4l2_subdev *sd = &interface->sd; + + if (interface->status != RKCIF_IF_ACTIVE) + return; + + v4l2_device_unregister_subdev(sd); + v4l2_subdev_cleanup(sd); + media_entity_cleanup(&sd->entity); +} + +const struct rkcif_input_fmt * +rkcif_interface_find_input_fmt(struct rkcif_interface *interface, bool ret_def, + u32 mbus_code) +{ + const struct rkcif_input_fmt *fmt; + unsigned int i; + + WARN_ON(interface->in_fmts_num == 0); + + for (i = 0; i < interface->in_fmts_num; i++) { + fmt = &interface->in_fmts[i]; + if (fmt->mbus_code == mbus_code) + return fmt; + } + if (ret_def) + return &interface->in_fmts[0]; + else + return NULL; +} diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-interface.h b/drivers/media/platform/rockchip/rkcif/rkcif-interface.h new file mode 100644 index 000000000000..5df6cf6e480d --- /dev/null +++ b/drivers/media/platform/rockchip/rkcif/rkcif-interface.h @@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Rockchip Camera Interface (CIF) Driver + * + * Abstraction for the INTERFACE and CROP parts of the different CIF variants. + * They shall be represented as V4L2 subdevice with one sink pad and one + * source pad. The sink pad is connected to a subdevice: either the subdevice + * provided by the driver of the companion chip connected to the DVP, or the + * subdevice provided by the MIPI CSI Host driver in rkcif-mipi-csi-host.c. + * The source pad is connected to an instance of the DMA abstraction in + * rkcif-stream.c. + * + * Copyright (C) 2025 Michael Riesch + */ + +#ifndef _RKCIF_INTERFACE_H +#define _RKCIF_INTERFACE_H + +#include "rkcif-common.h" + +int rkcif_interface_register(struct rkcif_device *rkcif, + struct rkcif_interface *interface); + +void rkcif_interface_unregister(struct rkcif_interface *interface); + +const struct rkcif_input_fmt * +rkcif_interface_find_input_fmt(struct rkcif_interface *interface, bool ret_def, + u32 mbus_code); + +#endif diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-regs.h b/drivers/media/platform/rockchip/rkcif/rkcif-regs.h new file mode 100644 index 000000000000..07fd64174e80 --- /dev/null +++ b/drivers/media/platform/rockchip/rkcif/rkcif-regs.h @@ -0,0 +1,132 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Rockchip Camera Interface (CIF) Driver + * + * Copyright (C) 2018 Rockchip Electronics Co., Ltd. + * Copyright (C) 2023 Mehdi Djait + * Copyright (C) 2025 Michael Riesch + */ + +#ifndef _RKCIF_REGS_H +#define _RKCIF_REGS_H + +enum rkcif_dvp_register_index { + RKCIF_DVP_CTRL, + RKCIF_DVP_INTEN, + RKCIF_DVP_INTSTAT, + RKCIF_DVP_FOR, + RKCIF_DVP_LINE_NUM_ADDR, + RKCIF_DVP_FRM0_ADDR_Y, + RKCIF_DVP_FRM0_ADDR_UV, + RKCIF_DVP_FRM1_ADDR_Y, + RKCIF_DVP_FRM1_ADDR_UV, + RKCIF_DVP_VIR_LINE_WIDTH, + RKCIF_DVP_SET_SIZE, + RKCIF_DVP_SCL_CTRL, + RKCIF_DVP_CROP, + RKCIF_DVP_FRAME_STATUS, + RKCIF_DVP_LAST_LINE, + RKCIF_DVP_LAST_PIX, + RKCIF_DVP_REGISTER_MAX +}; + +#define RKCIF_REGISTER_NOTSUPPORTED 0x420000 + +#define RKCIF_FETCH_Y(VAL) ((VAL) & 0x1fff) + +#define RKCIF_CTRL_ENABLE_CAPTURE BIT(0) +#define RKCIF_CTRL_MODE_PINGPONG BIT(1) +#define RKCIF_CTRL_MODE_LINELOOP BIT(2) +#define RKCIF_CTRL_AXI_BURST_16 (0xf << 12) + +#define RKCIF_INTEN_FRAME_END_EN BIT(0) +#define RKCIF_INTEN_LINE_ERR_EN BIT(2) +#define RKCIF_INTEN_BUS_ERR_EN BIT(6) +#define RKCIF_INTEN_SCL_ERR_EN BIT(7) +#define RKCIF_INTEN_PST_INF_FRAME_END_EN BIT(9) + +#define RKCIF_INTSTAT_CLS 0x3ff +#define RKCIF_INTSTAT_FRAME_END BIT(0) +#define RKCIF_INTSTAT_LINE_END BIT(1) +#define RKCIF_INTSTAT_LINE_ERR BIT(2) +#define RKCIF_INTSTAT_PIX_ERR BIT(3) +#define RKCIF_INTSTAT_DFIFO_OF BIT(5) +#define RKCIF_INTSTAT_BUS_ERR BIT(6) +#define RKCIF_INTSTAT_PRE_INF_FRAME_END BIT(8) +#define RKCIF_INTSTAT_PST_INF_FRAME_END BIT(9) +#define RKCIF_INTSTAT_FRAME_END_CLR BIT(0) +#define RKCIF_INTSTAT_LINE_END_CLR BIT(1) +#define RKCIF_INTSTAT_LINE_ERR_CLR BIT(2) +#define RKCIF_INTSTAT_PST_INF_FRAME_END_CLR BIT(9) +#define RKCIF_INTSTAT_ERR 0xfc + +#define RKCIF_FRAME_STAT_CLS 0x00 +#define RKCIF_FRAME_FRM0_STAT_CLS 0x20 + +#define RKCIF_FORMAT_VSY_HIGH_ACTIVE BIT(0) +#define RKCIF_FORMAT_HSY_LOW_ACTIVE BIT(1) + +#define RKCIF_FORMAT_INPUT_MODE_YUV (0x00 << 2) +#define RKCIF_FORMAT_INPUT_MODE_PAL (0x02 << 2) +#define RKCIF_FORMAT_INPUT_MODE_NTSC (0x03 << 2) +#define RKCIF_FORMAT_INPUT_MODE_BT1120 (0x07 << 2) +#define RKCIF_FORMAT_INPUT_MODE_RAW (0x04 << 2) +#define RKCIF_FORMAT_INPUT_MODE_JPEG (0x05 << 2) +#define RKCIF_FORMAT_INPUT_MODE_MIPI (0x06 << 2) + +#define RKCIF_FORMAT_YUV_INPUT_ORDER_UYVY (0x00 << 5) +#define RKCIF_FORMAT_YUV_INPUT_ORDER_YVYU (0x01 << 5) +#define RKCIF_FORMAT_YUV_INPUT_ORDER_VYUY (0x02 << 5) +#define RKCIF_FORMAT_YUV_INPUT_ORDER_YUYV (0x03 << 5) +#define RKCIF_FORMAT_YUV_INPUT_422 (0x00 << 7) +#define RKCIF_FORMAT_YUV_INPUT_420 BIT(7) + +#define RKCIF_FORMAT_INPUT_420_ORDER_ODD BIT(8) + +#define RKCIF_FORMAT_CCIR_INPUT_ORDER_EVEN BIT(9) + +#define RKCIF_FORMAT_RAW_DATA_WIDTH_8 (0x00 << 11) +#define RKCIF_FORMAT_RAW_DATA_WIDTH_10 (0x01 << 11) +#define RKCIF_FORMAT_RAW_DATA_WIDTH_12 (0x02 << 11) + +#define RKCIF_FORMAT_YUV_OUTPUT_422 (0x00 << 16) +#define RKCIF_FORMAT_YUV_OUTPUT_420 BIT(16) + +#define RKCIF_FORMAT_OUTPUT_420_ORDER_EVEN (0x00 << 17) +#define RKCIF_FORMAT_OUTPUT_420_ORDER_ODD BIT(17) + +#define RKCIF_FORMAT_RAWD_DATA_LITTLE_ENDIAN (0x00 << 18) +#define RKCIF_FORMAT_RAWD_DATA_BIG_ENDIAN BIT(18) + +#define RKCIF_FORMAT_UV_STORAGE_ORDER_UVUV (0x00 << 19) +#define RKCIF_FORMAT_UV_STORAGE_ORDER_VUVU BIT(19) + +#define RKCIF_FORMAT_BT1120_CLOCK_SINGLE_EDGES (0x00 << 24) +#define RKCIF_FORMAT_BT1120_CLOCK_DOUBLE_EDGES BIT(24) +#define RKCIF_FORMAT_BT1120_TRANSMIT_INTERFACE (0x00 << 25) +#define RKCIF_FORMAT_BT1120_TRANSMIT_PROGRESS BIT(25) +#define RKCIF_FORMAT_BT1120_YC_SWAP BIT(26) + +#define RKCIF_SCL_CTRL_ENABLE_SCL_DOWN BIT(0) +#define RKCIF_SCL_CTRL_ENABLE_SCL_UP BIT(1) +#define RKCIF_SCL_CTRL_ENABLE_YUV_16BIT_BYPASS BIT(4) +#define RKCIF_SCL_CTRL_ENABLE_RAW_16BIT_BYPASS BIT(5) +#define RKCIF_SCL_CTRL_ENABLE_32BIT_BYPASS BIT(6) +#define RKCIF_SCL_CTRL_DISABLE_32BIT_BYPASS (0x00 << 6) + +#define RKCIF_INTSTAT_F0_READY BIT(0) +#define RKCIF_INTSTAT_F1_READY BIT(1) + +#define RKCIF_XY_COORD(x, y) (((y) << 16) | (x)) + +/* GRF register offsets */ +#define RK3568_GRF_VI_CON0 0x340 +#define RK3568_GRF_VI_CON1 0x344 +#define RK3568_GRF_VI_STATUS0 0x348 + +#define RK3568_GRF_VI_CON1_CIF_DATAPATH BIT(9) +#define RK3568_GRF_VI_CON1_CIF_CLK_DELAYNUM GENMASK(6, 0) + +#define RK3568_GRF_WRITE_ENABLE(x) ((x) << 16) + +#endif diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-stream.c b/drivers/media/platform/rockchip/rkcif/rkcif-stream.c new file mode 100644 index 000000000000..bfafd76f4494 --- /dev/null +++ b/drivers/media/platform/rockchip/rkcif/rkcif-stream.c @@ -0,0 +1,622 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Rockchip Camera Interface (CIF) Driver + * + * Copyright (C) 2025 Michael Riesch + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "rkcif-common.h" +#include "rkcif-stream.h" + +#define CIF_REQ_BUFS_MIN 8 +#define CIF_MIN_WIDTH 64 +#define CIF_MIN_HEIGHT 64 +#define CIF_MAX_WIDTH 8192 +#define CIF_MAX_HEIGHT 8192 + +static inline struct rkcif_buffer *to_rkcif_buffer(struct vb2_v4l2_buffer *vb) +{ + return container_of(vb, struct rkcif_buffer, vb); +} + +static inline struct rkcif_stream *to_rkcif_stream(struct video_device *vdev) +{ + return container_of(vdev, struct rkcif_stream, vdev); +} + +static struct rkcif_buffer *rkcif_stream_pop_buffer(struct rkcif_stream *stream) +{ + struct rkcif_buffer *buffer = NULL; + unsigned long lock_flags; + + spin_lock_irqsave(&stream->driver_queue_lock, lock_flags); + + if (list_empty(&stream->driver_queue)) + goto err_empty; + + buffer = list_first_entry(&stream->driver_queue, struct rkcif_buffer, + queue); + list_del(&buffer->queue); + +err_empty: + spin_unlock_irqrestore(&stream->driver_queue_lock, lock_flags); + return buffer; +} + +static void rkcif_stream_push_buffer(struct rkcif_stream *stream, + struct rkcif_buffer *buffer) +{ + unsigned long lock_flags; + + spin_lock_irqsave(&stream->driver_queue_lock, lock_flags); + list_add_tail(&buffer->queue, &stream->driver_queue); + spin_unlock_irqrestore(&stream->driver_queue_lock, lock_flags); +} + +static inline void rkcif_stream_return_buffer(struct rkcif_buffer *buffer, + enum vb2_buffer_state state) +{ + struct vb2_v4l2_buffer *vb = &buffer->vb; + + vb2_buffer_done(&vb->vb2_buf, state); +} + +static void rkcif_stream_complete_buffer(struct rkcif_stream *stream, + struct rkcif_buffer *buffer) +{ + struct vb2_v4l2_buffer *vb = &buffer->vb; + + vb->vb2_buf.timestamp = ktime_get_ns(); + vb->sequence = stream->frame_idx; + vb2_buffer_done(&vb->vb2_buf, VB2_BUF_STATE_DONE); + stream->frame_idx++; +} + +void rkcif_stream_pingpong(struct rkcif_stream *stream) +{ + struct rkcif_buffer *buffer; + + buffer = stream->buffers[stream->frame_phase]; + if (!buffer->is_dummy) + rkcif_stream_complete_buffer(stream, buffer); + + buffer = rkcif_stream_pop_buffer(stream); + if (buffer) { + stream->buffers[stream->frame_phase] = buffer; + stream->buffers[stream->frame_phase]->is_dummy = false; + } else { + stream->buffers[stream->frame_phase] = &stream->dummy.buffer; + stream->buffers[stream->frame_phase]->is_dummy = true; + dev_warn(stream->rkcif->dev, + "no buffer available, frame will be dropped\n"); + } + + if (stream->queue_buffer) + stream->queue_buffer(stream, stream->frame_phase); + + stream->frame_phase = 1 - stream->frame_phase; +} + +static int rkcif_stream_init_buffers(struct rkcif_stream *stream) +{ + struct v4l2_pix_format_mplane *pix = &stream->pix; + int i; + + stream->buffers[0] = rkcif_stream_pop_buffer(stream); + if (!stream->buffers[0]) + goto err_buff_0; + + stream->buffers[1] = rkcif_stream_pop_buffer(stream); + if (!stream->buffers[1]) + goto err_buff_1; + + if (stream->queue_buffer) { + stream->queue_buffer(stream, 0); + stream->queue_buffer(stream, 1); + } + + stream->dummy.size = pix->num_planes * pix->plane_fmt[0].sizeimage; + stream->dummy.vaddr = + dma_alloc_attrs(stream->rkcif->dev, stream->dummy.size, + &stream->dummy.buffer.buff_addr[0], GFP_KERNEL, + DMA_ATTR_NO_KERNEL_MAPPING); + if (!stream->dummy.vaddr) + goto err_dummy; + + for (i = 1; i < pix->num_planes; i++) + stream->dummy.buffer.buff_addr[i] = + stream->dummy.buffer.buff_addr[i - 1] + + pix->plane_fmt[i - 1].bytesperline * pix->height; + + return 0; + +err_dummy: + rkcif_stream_return_buffer(stream->buffers[1], VB2_BUF_STATE_QUEUED); + stream->buffers[1] = NULL; + +err_buff_1: + rkcif_stream_return_buffer(stream->buffers[0], VB2_BUF_STATE_QUEUED); + stream->buffers[0] = NULL; +err_buff_0: + return -EINVAL; +} + +static void rkcif_stream_return_all_buffers(struct rkcif_stream *stream, + enum vb2_buffer_state state) +{ + struct rkcif_buffer *buffer; + + if (stream->buffers[0] && !stream->buffers[0]->is_dummy) { + rkcif_stream_return_buffer(stream->buffers[0], state); + stream->buffers[0] = NULL; + } + + if (stream->buffers[1] && !stream->buffers[1]->is_dummy) { + rkcif_stream_return_buffer(stream->buffers[1], state); + stream->buffers[1] = NULL; + } + + while ((buffer = rkcif_stream_pop_buffer(stream))) + rkcif_stream_return_buffer(buffer, state); + + if (stream->dummy.vaddr) { + dma_free_attrs(stream->rkcif->dev, stream->dummy.size, + stream->dummy.vaddr, + stream->dummy.buffer.buff_addr[0], + DMA_ATTR_NO_KERNEL_MAPPING); + stream->dummy.vaddr = NULL; + } +} + +static int rkcif_stream_setup_queue(struct vb2_queue *queue, + unsigned int *num_buffers, + unsigned int *num_planes, + unsigned int sizes[], + struct device *alloc_devs[]) +{ + struct rkcif_stream *stream = queue->drv_priv; + struct v4l2_pix_format_mplane *pix = &stream->pix; + unsigned int i; + + if (*num_planes) { + if (*num_planes != pix->num_planes) + return -EINVAL; + + for (i = 0; i < pix->num_planes; i++) + if (sizes[i] < pix->plane_fmt[i].sizeimage) + return -EINVAL; + } else { + *num_planes = pix->num_planes; + for (i = 0; i < pix->num_planes; i++) + sizes[i] = pix->plane_fmt[i].sizeimage; + } + + return 0; +} + +static int rkcif_stream_prepare_buffer(struct vb2_buffer *vb) +{ + struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); + struct rkcif_buffer *buffer = to_rkcif_buffer(vbuf); + struct rkcif_stream *stream = vb->vb2_queue->drv_priv; + const struct rkcif_output_fmt *fmt; + struct v4l2_pix_format_mplane *pix = &stream->pix; + unsigned int i; + + memset(buffer->buff_addr, 0, sizeof(buffer->buff_addr)); + for (i = 0; i < pix->num_planes; i++) + buffer->buff_addr[i] = vb2_dma_contig_plane_dma_addr(vb, i); + + /* apply fallback for non-mplane formats, if required */ + if (pix->num_planes == 1) { + fmt = rkcif_stream_find_output_fmt(stream, true, + pix->pixelformat); + for (i = 1; i < fmt->cplanes; i++) + buffer->buff_addr[i] = + buffer->buff_addr[i - 1] + + pix->plane_fmt[i - 1].bytesperline * + pix->height; + } + + for (i = 0; i < pix->num_planes; i++) { + unsigned long size = pix->plane_fmt[i].sizeimage; + + if (vb2_plane_size(vb, i) < size) { + dev_err(stream->rkcif->dev, + "user buffer too small (%ld < %ld)\n", + vb2_plane_size(vb, i), size); + return -EINVAL; + } + + vb2_set_plane_payload(vb, i, size); + } + + return 0; +} + +static void rkcif_stream_queue_buffer(struct vb2_buffer *vb) +{ + struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); + struct rkcif_buffer *buffer = to_rkcif_buffer(vbuf); + struct rkcif_stream *stream = vb->vb2_queue->drv_priv; + + rkcif_stream_push_buffer(stream, buffer); +} + +static int rkcif_stream_start_streaming(struct vb2_queue *queue, + unsigned int count) +{ + struct rkcif_stream *stream = queue->drv_priv; + struct rkcif_device *rkcif = stream->rkcif; + u64 mask; + int ret; + + stream->frame_idx = 0; + stream->frame_phase = 0; + + ret = video_device_pipeline_start(&stream->vdev, &stream->pipeline); + if (ret) { + dev_err(rkcif->dev, "failed to start pipeline %d\n", ret); + goto err_out; + } + + ret = pm_runtime_resume_and_get(rkcif->dev); + if (ret < 0) { + dev_err(rkcif->dev, "failed to get runtime pm, %d\n", ret); + goto err_pipeline_stop; + } + + ret = rkcif_stream_init_buffers(stream); + if (ret) + goto err_runtime_put; + + if (stream->start_streaming) { + ret = stream->start_streaming(stream); + if (ret < 0) + goto err_runtime_put; + } + + mask = BIT_ULL(stream->id); + ret = v4l2_subdev_enable_streams(&stream->interface->sd, + RKCIF_IF_PAD_SRC, mask); + if (ret < 0) + goto err_stop_stream; + + return 0; + +err_stop_stream: + if (stream->stop_streaming) + stream->stop_streaming(stream); +err_runtime_put: + pm_runtime_put(rkcif->dev); +err_pipeline_stop: + video_device_pipeline_stop(&stream->vdev); +err_out: + rkcif_stream_return_all_buffers(stream, VB2_BUF_STATE_QUEUED); + return ret; +} + +static void rkcif_stream_stop_streaming(struct vb2_queue *queue) +{ + struct rkcif_stream *stream = queue->drv_priv; + struct rkcif_device *rkcif = stream->rkcif; + u64 mask; + int ret; + + mask = BIT_ULL(stream->id); + v4l2_subdev_disable_streams(&stream->interface->sd, RKCIF_IF_PAD_SRC, + mask); + + stream->stopping = true; + ret = wait_event_timeout(stream->wq_stopped, !stream->stopping, + msecs_to_jiffies(1000)); + + if (!ret && stream->stop_streaming) + stream->stop_streaming(stream); + + pm_runtime_put(rkcif->dev); + + rkcif_stream_return_all_buffers(stream, VB2_BUF_STATE_ERROR); + + video_device_pipeline_stop(&stream->vdev); +} + +static const struct vb2_ops rkcif_stream_vb2_ops = { + .queue_setup = rkcif_stream_setup_queue, + .buf_prepare = rkcif_stream_prepare_buffer, + .buf_queue = rkcif_stream_queue_buffer, + .wait_prepare = vb2_ops_wait_prepare, + .wait_finish = vb2_ops_wait_finish, + .start_streaming = rkcif_stream_start_streaming, + .stop_streaming = rkcif_stream_stop_streaming, +}; + +static int rkcif_stream_try_format(struct file *file, void *fh, + struct v4l2_format *f) +{ + struct rkcif_stream *stream = video_drvdata(file); + struct v4l2_pix_format_mplane *pix = &f->fmt.pix_mp; + const struct rkcif_output_fmt *fmt; + u32 height, width; + + fmt = rkcif_stream_find_output_fmt(stream, true, pix->pixelformat); + height = clamp_t(u32, pix->height, CIF_MIN_HEIGHT, CIF_MAX_HEIGHT); + width = clamp_t(u32, pix->width, CIF_MIN_WIDTH, CIF_MAX_WIDTH); + v4l2_fill_pixfmt_mp(pix, fmt->fourcc, width, height); + + return 0; +} + +static int rkcif_stream_set_format(struct file *file, void *priv, + struct v4l2_format *f) +{ + struct rkcif_stream *stream = video_drvdata(file); + struct v4l2_pix_format_mplane *pix = &f->fmt.pix_mp; + int ret; + + if (vb2_is_busy(&stream->buf_queue)) + return -EBUSY; + + ret = rkcif_stream_try_format(file, priv, f); + if (ret) + return ret; + + stream->pix = *pix; + + return 0; +} + +static int rkcif_stream_get_format(struct file *file, void *fh, + struct v4l2_format *f) +{ + struct rkcif_stream *stream = video_drvdata(file); + + f->fmt.pix_mp = stream->pix; + + return 0; +} + +static int rkcif_stream_enum_formats(struct file *file, void *priv, + struct v4l2_fmtdesc *f) +{ + struct rkcif_stream *stream = video_drvdata(file); + + if (f->index >= stream->out_fmts_num) + return -EINVAL; + + f->pixelformat = stream->out_fmts[f->index].fourcc; + + return 0; +} + +static int rkcif_stream_enum_framesizes(struct file *file, void *fh, + struct v4l2_frmsizeenum *fsize) +{ + if (fsize->index > 0) + return -EINVAL; + + fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE; + fsize->stepwise.min_width = CIF_MIN_WIDTH; + fsize->stepwise.max_width = CIF_MAX_WIDTH; + fsize->stepwise.step_width = 8; + fsize->stepwise.min_height = CIF_MIN_HEIGHT; + fsize->stepwise.max_height = CIF_MAX_HEIGHT; + fsize->stepwise.step_height = 8; + + return 0; +} + +static int rkcif_stream_querycap(struct file *file, void *priv, + struct v4l2_capability *cap) +{ + struct rkcif_stream *stream = video_drvdata(file); + struct device *dev = stream->rkcif->dev; + + strscpy(cap->driver, dev->driver->name, sizeof(cap->driver)); + strscpy(cap->card, dev->driver->name, sizeof(cap->card)); + + return 0; +} + +static const struct v4l2_ioctl_ops rkcif_stream_ioctl_ops = { + .vidioc_reqbufs = vb2_ioctl_reqbufs, + .vidioc_querybuf = vb2_ioctl_querybuf, + .vidioc_create_bufs = vb2_ioctl_create_bufs, + .vidioc_qbuf = vb2_ioctl_qbuf, + .vidioc_expbuf = vb2_ioctl_expbuf, + .vidioc_dqbuf = vb2_ioctl_dqbuf, + .vidioc_prepare_buf = vb2_ioctl_prepare_buf, + .vidioc_streamon = vb2_ioctl_streamon, + .vidioc_streamoff = vb2_ioctl_streamoff, + .vidioc_try_fmt_vid_cap_mplane = rkcif_stream_try_format, + .vidioc_s_fmt_vid_cap_mplane = rkcif_stream_set_format, + .vidioc_g_fmt_vid_cap_mplane = rkcif_stream_get_format, + .vidioc_enum_fmt_vid_cap = rkcif_stream_enum_formats, + .vidioc_enum_framesizes = rkcif_stream_enum_framesizes, + .vidioc_querycap = rkcif_stream_querycap, +}; + +static int rkcif_stream_link_validate(struct media_link *link) +{ + struct video_device *vdev = + media_entity_to_video_device(link->sink->entity); + struct v4l2_mbus_framefmt *source_fmt; + struct v4l2_subdev *sd; + struct v4l2_subdev_state *state; + struct rkcif_stream *stream = to_rkcif_stream(vdev); + int ret = -EINVAL; + + if (!media_entity_remote_source_pad_unique(link->sink->entity)) + return -ENOTCONN; + + sd = media_entity_to_v4l2_subdev(link->source->entity); + + state = v4l2_subdev_lock_and_get_active_state(sd); + + source_fmt = v4l2_subdev_state_get_format(state, link->source->index, + stream->id); + if (!source_fmt) + goto out; + + if (source_fmt->height != stream->pix.height || + source_fmt->width != stream->pix.width) { + dev_dbg(stream->rkcif->dev, + "link '%s':%u -> '%s':%u not valid: %ux%u != %ux%u\n", + link->source->entity->name, link->source->index, + link->sink->entity->name, link->sink->index, + source_fmt->width, source_fmt->height, + stream->pix.width, stream->pix.height); + goto out; + } + + ret = 0; + +out: + v4l2_subdev_unlock_state(state); + return ret; +} + +static const struct media_entity_operations rkcif_stream_media_ops = { + .link_validate = rkcif_stream_link_validate, +}; + +static const struct v4l2_file_operations rkcif_stream_file_ops = { + .open = v4l2_fh_open, + .release = vb2_fop_release, + .unlocked_ioctl = video_ioctl2, + .poll = vb2_fop_poll, + .mmap = vb2_fop_mmap, +}; + +static int rkcif_stream_init_vb2_queue(struct vb2_queue *q, + struct rkcif_stream *stream) +{ + q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; + q->io_modes = VB2_MMAP | VB2_DMABUF; + q->drv_priv = stream; + q->ops = &rkcif_stream_vb2_ops; + q->mem_ops = &vb2_dma_contig_memops; + q->buf_struct_size = sizeof(struct rkcif_buffer); + q->min_queued_buffers = CIF_REQ_BUFS_MIN; + q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; + q->lock = &stream->vlock; + q->dev = stream->rkcif->dev; + + return vb2_queue_init(q); +} + +int rkcif_stream_register(struct rkcif_device *rkcif, + struct rkcif_stream *stream) +{ + struct rkcif_interface *interface = stream->interface; + struct v4l2_device *v4l2_dev = &rkcif->v4l2_dev; + struct video_device *vdev = &stream->vdev; + u32 link_flags = 0; + int ret; + + stream->rkcif = rkcif; + + INIT_LIST_HEAD(&stream->driver_queue); + spin_lock_init(&stream->driver_queue_lock); + + init_waitqueue_head(&stream->wq_stopped); + + mutex_init(&stream->vlock); + + vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE_MPLANE | V4L2_CAP_STREAMING | + V4L2_CAP_IO_MC; + vdev->entity.ops = &rkcif_stream_media_ops; + vdev->fops = &rkcif_stream_file_ops; + vdev->ioctl_ops = &rkcif_stream_ioctl_ops; + vdev->lock = &stream->vlock; + vdev->minor = -1; + vdev->release = video_device_release_empty; + vdev->v4l2_dev = v4l2_dev; + vdev->vfl_dir = VFL_DIR_RX; + video_set_drvdata(vdev, stream); + + stream->pad.flags = MEDIA_PAD_FL_SINK; + + rkcif_stream_init_vb2_queue(&stream->buf_queue, stream); + + vdev->queue = &stream->buf_queue; + if (interface->type == RKCIF_IF_DVP) + snprintf(vdev->name, sizeof(vdev->name), "rkcif-dvp0-id%d", + stream->id); + else if (interface->type == RKCIF_IF_MIPI) + snprintf(vdev->name, sizeof(vdev->name), "rkcif-mipi%d-id%d", + interface->index - RKCIF_MIPI_BASE, stream->id); + + ret = media_entity_pads_init(&vdev->entity, 1, &stream->pad); + if (ret < 0) { + dev_err(rkcif->dev, + "failed to initialize stream media pad: %d\n", ret); + return ret; + } + + ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1); + if (ret < 0) { + dev_err(rkcif->dev, "failed to register video device: %d\n", + ret); + goto err_media_entity_cleanup; + } + + /* enable only stream ID0 by default */ + if (stream->id == RKCIF_ID0) + link_flags |= MEDIA_LNK_FL_ENABLED; + + ret = media_create_pad_link(&interface->sd.entity, RKCIF_IF_PAD_SRC, + &stream->vdev.entity, 0, link_flags); + if (ret) { + dev_err(rkcif->dev, "failed to link stream media pad: %d\n", + ret); + goto err_video_unregister; + } + + v4l2_info(v4l2_dev, "registered %s as /dev/video%d\n", vdev->name, + vdev->num); + + return 0; + +err_video_unregister: + video_unregister_device(&stream->vdev); +err_media_entity_cleanup: + media_entity_cleanup(&stream->vdev.entity); + return ret; +} + +void rkcif_stream_unregister(struct rkcif_stream *stream) +{ + video_unregister_device(&stream->vdev); + media_entity_cleanup(&stream->vdev.entity); +} + +const struct rkcif_output_fmt * +rkcif_stream_find_output_fmt(struct rkcif_stream *stream, bool ret_def, + u32 pixelfmt) +{ + const struct rkcif_output_fmt *fmt; + unsigned int i; + + WARN_ON(stream->out_fmts_num == 0); + + for (i = 0; i < stream->out_fmts_num; i++) { + fmt = &stream->out_fmts[i]; + if (fmt->fourcc == pixelfmt) + return fmt; + } + + if (ret_def) + return &stream->out_fmts[0]; + else + return NULL; +} diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-stream.h b/drivers/media/platform/rockchip/rkcif/rkcif-stream.h new file mode 100644 index 000000000000..e50c9771f1b0 --- /dev/null +++ b/drivers/media/platform/rockchip/rkcif/rkcif-stream.h @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Rockchip Camera Interface (CIF) Driver + * + * Abstraction for the DMA part and the ping-pong scheme (a double-buffering + * mechanism) of the different CIF variants. + * Each stream is represented as V4L2 device whose corresponding media entity + * has one sink pad. + * The sink pad is connected to an instance of the INTERFACE/CROP abstraction + * in rkcif-interface.c. + * + * Copyright (C) 2025 Michael Riesch + */ + +#ifndef _RKCIF_STREAM_H +#define _RKCIF_STREAM_H + +#include "rkcif-common.h" + +void rkcif_stream_pingpong(struct rkcif_stream *stream); + +int rkcif_stream_register(struct rkcif_device *rkcif, + struct rkcif_stream *stream); + +void rkcif_stream_unregister(struct rkcif_stream *stream); + +const struct rkcif_output_fmt * +rkcif_stream_find_output_fmt(struct rkcif_stream *stream, bool ret_def, + u32 pixelfmt); + +#endif From patchwork Wed Feb 19 10:16:37 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Riesch X-Patchwork-Id: 13981926 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2F16BC021AA for ; Wed, 19 Feb 2025 10:45:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Cc:To:In-Reply-To: References:Message-Id:Subject:Date:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=faTEHKyjT4QaSu5EYTOUlqc2z7JkxvEkJbTzzJeLRK4=; b=pAcGScnI/VmgrpdvHnBCKohRfR cFFaNFq1674HdOcI76p2ohYPZKoKu1o2lPCUsi27ZI2Y+Z/C7Enif4P+4gYNrGFr0lCQiQOdUgQmH PRFpvx1Bfmb+hoQhCwOyWskxE/eaqQQPdp1c57NaAup28ozkWmCl5Qpu5je0mkUIc7ou4S/2MiTXH oNGLXV43ACBw6+ll9D6xv0ZglcGPsjNlkg/Teko63qFH13ZAgvw5NHvumtgWU95Mw5M+vVE4SjdXl aki3pZeXTICg2G7yE+mX3yMRXatNoh8zxaXWDPktswR1r9Gh+KmgwV8cPzNkw7Cly+9cDvkbdOtvA oIyX0pVg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tkhZg-0000000CCqr-3yvk; Wed, 19 Feb 2025 10:45:04 +0000 Received: from mail-am6eur05on20703.outbound.protection.outlook.com ([2a01:111:f403:2612::703] helo=EUR05-AM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tkh8S-0000000C5uU-3xIj; Wed, 19 Feb 2025 10:16:58 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=SmdPpf2fWKSmybH+mFfZPkNEk7Cz9M3vyTHfP2EI8SWt1x2Grfc9ohd8D/8ZlNl17718im2ejC8rhlJ3p7684RiTuEIQrf3GIG/Bu36jH7gYCfNVNq2IfLigeIzc1Mchy9jP3JuWtSCTUCRh6FwxlEc2Chf7WXGeQHuW9gJJwvB5wsSgab3mYmx07X1z/vHyPuIqlS4nODe6PekRUraG1nbIz50QbVziN38z47G0PCuS8/CikP1cPgqL6NWY3DY8HJ+sn7lmuEr0w1NtE+va9+ywqmVnfun/+i5v2lWj/mX03UmSsyh2AI708c5nSl3UY7vMyOZrxtLzFX/lMLubxQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=sMVS5NeYk87UXR8+hPDeUJLtc1kE/NMvWLHUJ11raok=; b=rvsWKrWi63ShRgBWy2lzz1edA5HDzlnSAFvmiVc3N5DZS8zbFkmqVjIZYOSM3yqd2LT/vO09pOptS5rOqzWj/cUqfwdYFfuBBHgzvE62uCCZDcCKVOMEk/NaSH7r4/iJ+8a0L0LN+cG/6B+NgapVFf1DcT2t+ipE7nDCg1jp2i0HIS7RzQk6C72PunvUnN/7BZ0qeXqJe6gXY2dI5FxbtBlZgzuoiQWYkV4Luu7kc0H2lLOE4ewQKd75e76tbzPF7UjPqjeUvffaRe2u1A64veWQ8quzKf/NFK1/x/E5EDptGmd8oQN/b+uyvp+xVaZYSgyA0l7RixGKcz4AzlpCSw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=wolfvision.net; dmarc=pass action=none header.from=wolfvision.net; dkim=pass header.d=wolfvision.net; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=wolfvision.net; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=sMVS5NeYk87UXR8+hPDeUJLtc1kE/NMvWLHUJ11raok=; b=DciZSGN8vvWeKS72jgHuy4Y8Mjgl6kZEzgxigbOpmFpW8HgkLzT6AWqhlp6YxsKbmxpzbiXPLmFvWfyxTbcYRxjOxf4/peI4I/NEAH8DUutRSl0ElUEyW3/0wX2XuiAnrZ9NDiwoRP9tOJ/nP7LvpwNQK9K04YqIadYobXY4Pr0= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=wolfvision.net; Received: from DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) by DU0PR08MB8138.eurprd08.prod.outlook.com (2603:10a6:10:3ed::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8445.18; Wed, 19 Feb 2025 10:16:49 +0000 Received: from DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d]) by DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d%5]) with mapi id 15.20.8466.015; Wed, 19 Feb 2025 10:16:49 +0000 From: Michael Riesch Date: Wed, 19 Feb 2025 11:16:37 +0100 Subject: [PATCH v4 06/11] media: rockchip: rkcif: add driver for mipi csi-2 host Message-Id: <20250219-v6-8-topic-rk3568-vicap-v4-6-e906600ae3b0@wolfvision.net> References: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> In-Reply-To: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> To: Mehdi Djait , Maxime Chevallier , =?utf-8?q?Th=C3=A9o_Leb?= =?utf-8?q?run?= , Gerald Loacker , Thomas Petazzoni , Laurent Pinchart , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiko Stuebner , Kever Yang , Nicolas Dufresne , Sebastian Fricke , Sebastian Reichel , Paul Kocialkowski , Alexander Shiyan , Val Packett , Rob Herring , Philipp Zabel , Sakari Ailus Cc: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Michael Riesch X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1739960197; l=20358; i=michael.riesch@wolfvision.net; s=20240405; h=from:subject:message-id; bh=A6bK2fTdCdlrmNVUtFenZWtcU6bEcA5ZZ1M2I6EnNfI=; b=qz2LbOGOYDtTiMKp8EXqUs+S359XzpaxxisKIejmoyBumFO4+QsR8MU8WxZqSeHZNGX/wRsj0 EZQVsoPtv4+Bl4gwKggpgTZ5y0yOirtkP+pvW6MKqYx04kKQTtrz4Jk X-Developer-Key: i=michael.riesch@wolfvision.net; a=ed25519; pk=cSJmgKSH3B6kdCIDCl+IYDW1Pw/Ybc6g9rmnUd/G7Ck= X-ClientProxiedBy: VI1P190CA0041.EURP190.PROD.OUTLOOK.COM (2603:10a6:800:1bb::8) To DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU0PR08MB9155:EE_|DU0PR08MB8138:EE_ X-MS-Office365-Filtering-Correlation-Id: 7aec646f-23fe-4b89-2b44-08dd50ce85db X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|376014|7416014|1800799024|366016|921020|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?q?vEi++l5xoi52zfvoqBOoAoqIzgJHwib?= =?utf-8?q?fRQTas4IhH5nzDW4ZL3JHhVPk2hSC71dTYtTa2EpYDdv82DbXRuY5lh4a8FI5bOCt?= =?utf-8?q?mfwt3EGBmfzSKDc4rE/8LRPXb5i8aMl2Z72WLE2nQ/QaEiUAL1b4BCGUePxSRr8EV?= =?utf-8?q?37hAstWoXOpQ+4dbOWyDzQkEz8QoBS2epNPLwtPslSnHmiPXbkZlhbEHA7XKe1Cou?= =?utf-8?q?bPKJuPO3ib77vlaK8lI6iqO3GMldq5WF6VU3Eq7s1lAOSRelbKl/iUJnvymb/MJL3?= =?utf-8?q?cPQx/hQtCQQkIki53l9sKdpy0DhlQUMPlEzDSyquN4wzWUsyhAuF/QRc3Wekp2bb8?= =?utf-8?q?sffWaDmDRBHGOt9Ddl1NnDHcVuQxViXHVoSWfZphXvUEw3ptLfiOi8/cHwzgDYVpy?= =?utf-8?q?DYgNmR3KBa1Gms0nsQr3UFcDeJ/PACuNkUYBhHjCsJFl3akIyndmFYW8oaUwhjczl?= =?utf-8?q?obQ4Va2g853f0Sl5y8xwdRZfwZPdCZibq/9U44gkKqUhLhL0bfCEJWbf6HS7QUkJI?= =?utf-8?q?VtmiMdPNVLsd5flNl8pt8c1N7hXy3OpC3r35YRxv08mO343pzHWxesx6WHKNMQRTL?= =?utf-8?q?BNUAHDUkLDwv8nNa7KiMcVgqqj4gAuTth8LlZeiaEVZYJOjqI+eNgyH4S2nXwjpYg?= =?utf-8?q?3bL2hxbxjXDjgGoA9zH4pOmzuMzGz4notx8DvRqLDcDJiBJwaT41zv6dXelhMck3X?= =?utf-8?q?dMPlaJH+iqOupxm8WTaYluhZxd66b8ZJJRR5rZWPe2TEu811+Kw7Dr32tjAwrSSEj?= =?utf-8?q?/EeqzBK7ev4w2PPjm9bib/4s5Kq1zIaDnRC/SS34s4Tx7Ca8isbr4k1FfbJmCOL4b?= =?utf-8?q?7c9ulVf2AjsvN8zC4dwBSD6e5/p9y8yqngJ8DImcpXYje8AcyF/nPtsSGn2oARNko?= =?utf-8?q?T6nRcXlm8v78NNT8iyhIA6/FeeOS/WIii+1F/wNrUWyWoTorYQlFEQee1aG4hqExn?= =?utf-8?q?cXjZdMxvt9HGG3Wt+2Szx3YMAGCU5hqmVSYLL1eU0OPx4mFrcqqmBeUyzfwMG7qkV?= =?utf-8?q?jhJC1jeYsHBIG/w1CPVuDGgKSiWelVrJJWqoWzUSl48hszcYq8MSodeiJ/JLrvanP?= =?utf-8?q?8ifiU0h95X+i91OfB4muKtPqAJtVcLpJkWvaaUXgwA6mFScJutjM9qZEhhC7mZHhY?= =?utf-8?q?0tNX5T9Wr6ook960zqdI6vu4mFcMnhmTFqiR8bZ1gO8KgtSSgpKtwiU7jR9HhaauZ?= =?utf-8?q?TT95ny8jph88jpLN3n+wGFTsQExFIUEp4Y9oe9dTAbOftMQ/lQr7q/13b8MtoN9VX?= =?utf-8?q?VMfyzIzOBEmDK7+8yqnVP7S1CilAlYf9k83fnbyKjuI08CYtM3rEzBtvkUEn+BFLu?= =?utf-8?q?Jkce/SDcJr8+COhUUl2EkEcNTN3wr80cuQ9v4c41lr/bGXlVRMtjJADSamFnY5LI9?= =?utf-8?q?H6tG4St92yCoosfiuOuNO/aoCB0hnftCw=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DU0PR08MB9155.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(376014)(7416014)(1800799024)(366016)(921020)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?Pmjr6a6yA4aqKVT1+vf1tCz04H4c?= =?utf-8?q?GUHe1t0QUmGJi6K0UXet9bkVe5me7XrguyQdlK2O4QyfI4ezwq1K4NEwwGIn8KzBh?= =?utf-8?q?2c6P0y2bq2+wVQFBU6RVJNEpL3qxfQeMWKTC884JtJQSwb/ZcVDh6DjQB8DZShQdJ?= =?utf-8?q?EW5+8xl9htqujdhpJs7VwWGSLXSQNW0+kVVakyhBr7GKiWq81f/tJUaLuk6Q2+uWA?= =?utf-8?q?6C0tBi95AnpFkQ6OV6E15qMD5XuxhMc/Tp0zF9sDBXoSvmussg2hnl9vx4oGGANP0?= =?utf-8?q?1n6kyvLLIvLzbug0deHi3CBtogcs0qJsD5KqgoQxGKh5B7VCSu0NUnDdmhgfUxAJV?= =?utf-8?q?OAWog3MekWkgZbIbcZwLjmzxcoV5MfEu6N/BV9Wb1wewFtjwm7zf/a7fAPYx3NlSL?= =?utf-8?q?yIm3+z70L3pUwyEOWQWv/nr15c73pJEGWlweuQc5aRCeNf2BHjSpi8ZA/PRKxcIOl?= =?utf-8?q?IAuAV1sOIUS1TqooSU5JtNfSi3WPQgC/2+GRupbiHOgu9N4xPKASY5opnPOdo1Uyl?= =?utf-8?q?6nsdr6F+ffAZ7wT1E2Cj+dnKxjTrgpjz57PsDyMGz+OGctD82wiZfnD2WMYGB2wlv?= =?utf-8?q?1SSJNMTg0sk7+01ijfeExFpLyv2CumOnmGwXBeiw2agWtKKr8NIN+ezE2ulCiYZGy?= =?utf-8?q?QUNcQvWnlJK5Y406NXHmoFvRtuTR/pfVaBqLJP2yfnJzKGtzKCx06Vi0gU9ACfTdS?= =?utf-8?q?6YFur4ppQLoyKkYQE4KRLvpppedWjUJVn2qiYFS5T4TIbM0mCOBcPOS1nXUoloF5F?= =?utf-8?q?5is60I7TG414F3HaXDlJELRDDX9VYZBaR7SnfiyAlkAHBhBbsbV8BaCIwOAWkC+lk?= =?utf-8?q?KmNwls7J7E7rNs1AZvNuF0dHR4l2q3aUrGsrNq/N5WqJ11eXXi0Lm2S3J0xmEhOy2?= =?utf-8?q?zqkbEGUsDdecDjF+UNNGzLXRoqdoQjgz5oYCMlBTLIKul4mHH2ZqGwn2Rea6sRQvZ?= =?utf-8?q?CGfc9LKaQLH/UeSsydg83hYkEqjt0HAlbkjOLUgEvMceaUdgPxh/H/77ZJZR3+wjY?= =?utf-8?q?hYboXikjpU65B6Cs6J3NBXXCfBUM85XyxWtch+04oo946/ZBtnmDfduPAr5t/SPBw?= =?utf-8?q?97SXqjzg2jxwnq4YBDSK/Q+JuiOEPLeikvyNk0MOZ+8pnBvJnCn1J9iLkaL4i/0LS?= =?utf-8?q?xR2/cROBzt76ntWgfTfEjVNvR0i6A8KFvjJ7ssHgG0om1h/2Hq3wrrmIXdq2XytQk?= =?utf-8?q?bfvyF9vdhW3lXiVwY/EtMwctbQbIF8ZwiW96uiuLDMDcL1tXlOR9jwsPlun5VAOeL?= =?utf-8?q?u1tMRv+DuiAZUvKNVshYletkNX57P/YqUJwuLLxLSgM0S3DXFoc+FIyxjsasCgIK+?= =?utf-8?q?3+MtS4v/41yfdVJ1UzjSPJlmnjAld+U6ydJAB4ED9okAK1bW9MmVYkh3iwn5xp5o4?= =?utf-8?q?janWO4TOx/2nQGYSG6rxOyR6qVuYYgr6eCx2qw+dwqJdXT0ZLEJQxVnmrH957+pG6?= =?utf-8?q?5j4HRzS+2PvRomUpykk9nm3OH9z62ou8G+CWS37YMwIpjjaqA+2LGyYAmfsqylMJz?= =?utf-8?q?p5Gd3Cu8UWWFzETHynYteSHOLZ+/Rg+C4g=3D=3D?= X-OriginatorOrg: wolfvision.net X-MS-Exchange-CrossTenant-Network-Message-Id: 7aec646f-23fe-4b89-2b44-08dd50ce85db X-MS-Exchange-CrossTenant-AuthSource: DU0PR08MB9155.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Feb 2025 10:16:49.7350 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: e94ec9da-9183-471e-83b3-51baa8eb804f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: ZZjxohED9ge9PQYIQFdSoM6lQvvqIjLJm4eM8jWxiwElRmHYZW/ZQyo8trBjalKaLP+4J+qogGARQ2fbchzd8OsSvyRFgwzKoIBY+9+x2yA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB8138 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250219_021657_001658_8614F647 X-CRM114-Status: GOOD ( 15.39 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org The Rockchip RK3568 MIPI CSI-2 Host is a CSI-2 bridge with one input port and one output port. It receives the data with the help of an external MIPI PHY (C-PHY or D-PHY) and passes it to the Rockchip RK3568 Video Capture (VICAP) block. Add a V4L2 subdevice driver for this unit. Signed-off-by: Michael Riesch --- drivers/media/platform/rockchip/rkcif/Makefile | 1 + .../platform/rockchip/rkcif/rkcif-mipi-csi-host.c | 731 +++++++++++++++++++++ 2 files changed, 732 insertions(+) diff --git a/drivers/media/platform/rockchip/rkcif/Makefile b/drivers/media/platform/rockchip/rkcif/Makefile index 818424972c7b..0c18efd1f1b4 100644 --- a/drivers/media/platform/rockchip/rkcif/Makefile +++ b/drivers/media/platform/rockchip/rkcif/Makefile @@ -4,4 +4,5 @@ rockchip-cif-objs += rkcif-dev.o \ rkcif-capture-dvp.o \ rkcif-capture-mipi.o \ rkcif-interface.o \ + rkcif-mipi-csi-host.o \ rkcif-stream.o diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-mipi-csi-host.c b/drivers/media/platform/rockchip/rkcif/rkcif-mipi-csi-host.c new file mode 100644 index 000000000000..fa3f42b2dc55 --- /dev/null +++ b/drivers/media/platform/rockchip/rkcif/rkcif-mipi-csi-host.c @@ -0,0 +1,731 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Rockchip MIPI CSI-2 Host Driver + * + * Copyright (C) 2019 Rockchip Electronics Co., Ltd. + * Copyright (C) 2025 Michael Riesch + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#define CSI2HOST_N_LANES 0x04 +#define CSI2HOST_CSI2_RESETN 0x10 +#define CSI2HOST_PHY_STATE 0x14 +#define CSI2HOST_ERR1 0x20 +#define CSI2HOST_ERR2 0x24 +#define CSI2HOST_MSK1 0x28 +#define CSI2HOST_MSK2 0x2c +#define CSI2HOST_CONTROL 0x40 + +#define SW_CPHY_EN(x) ((x) << 0) +#define SW_DSI_EN(x) ((x) << 4) +#define SW_DATATYPE_FS(x) ((x) << 8) +#define SW_DATATYPE_FE(x) ((x) << 14) +#define SW_DATATYPE_LS(x) ((x) << 20) +#define SW_DATATYPE_LE(x) ((x) << 26) + +#define RKCIF_CSI_CLKS_MAX 1 + +enum { + RKCIF_CSI_PAD_SINK, + RKCIF_CSI_PAD_SRC, + RKCIF_CSI_PAD_MAX, +}; + +struct rkcif_csi_format { + u32 code; + u8 depth; + u8 csi_dt; +}; + +struct rkcif_csi_device { + struct device *dev; + + void __iomem *base_addr; + struct clk_bulk_data *clks; + unsigned int clks_num; + struct phy *phy; + struct reset_control *reset; + + const struct rkcif_csi_format *formats; + unsigned int formats_num; + + struct media_pad pads[RKCIF_CSI_PAD_MAX]; + struct v4l2_async_notifier notifier; + struct v4l2_fwnode_endpoint vep; + struct v4l2_subdev sd; + + struct v4l2_subdev *source_sd; + u32 source_pad; +}; + +const struct v4l2_mbus_framefmt default_format = { + .width = 3840, + .height = 2160, + .code = MEDIA_BUS_FMT_SRGGB10_1X10, + .field = V4L2_FIELD_NONE, + .colorspace = V4L2_COLORSPACE_RAW, + .ycbcr_enc = V4L2_YCBCR_ENC_601, + .quantization = V4L2_QUANTIZATION_FULL_RANGE, + .xfer_func = V4L2_XFER_FUNC_NONE, +}; + +static const struct rkcif_csi_format formats[] = { + /* YUV formats */ + { + .code = MEDIA_BUS_FMT_YUYV8_1X16, + .depth = 16, + .csi_dt = MIPI_CSI2_DT_YUV422_8B, + }, + { + .code = MEDIA_BUS_FMT_UYVY8_1X16, + .depth = 16, + .csi_dt = MIPI_CSI2_DT_YUV422_8B, + }, + { + .code = MEDIA_BUS_FMT_YVYU8_1X16, + .depth = 16, + .csi_dt = MIPI_CSI2_DT_YUV422_8B, + }, + { + .code = MEDIA_BUS_FMT_VYUY8_1X16, + .depth = 16, + .csi_dt = MIPI_CSI2_DT_YUV422_8B, + }, + /* RGB formats */ + { + .code = MEDIA_BUS_FMT_RGB888_1X24, + .depth = 24, + .csi_dt = MIPI_CSI2_DT_RGB888, + }, + { + .code = MEDIA_BUS_FMT_BGR888_1X24, + .depth = 24, + .csi_dt = MIPI_CSI2_DT_RGB888, + }, + /* Bayer formats */ + { + .code = MEDIA_BUS_FMT_SBGGR8_1X8, + .depth = 8, + .csi_dt = MIPI_CSI2_DT_RAW8, + }, + { + .code = MEDIA_BUS_FMT_SGBRG8_1X8, + .depth = 8, + .csi_dt = MIPI_CSI2_DT_RAW8, + }, + { + .code = MEDIA_BUS_FMT_SGRBG8_1X8, + .depth = 8, + .csi_dt = MIPI_CSI2_DT_RAW8, + }, + { + .code = MEDIA_BUS_FMT_SRGGB8_1X8, + .depth = 8, + .csi_dt = MIPI_CSI2_DT_RAW8, + }, + { + .code = MEDIA_BUS_FMT_SBGGR10_1X10, + .depth = 10, + .csi_dt = MIPI_CSI2_DT_RAW10, + }, + { + .code = MEDIA_BUS_FMT_SGBRG10_1X10, + .depth = 10, + .csi_dt = MIPI_CSI2_DT_RAW10, + }, + { + .code = MEDIA_BUS_FMT_SGRBG10_1X10, + .depth = 10, + .csi_dt = MIPI_CSI2_DT_RAW10, + }, + { + .code = MEDIA_BUS_FMT_SRGGB10_1X10, + .depth = 10, + .csi_dt = MIPI_CSI2_DT_RAW10, + }, + { + .code = MEDIA_BUS_FMT_SBGGR12_1X12, + .depth = 12, + .csi_dt = MIPI_CSI2_DT_RAW12, + }, + { + .code = MEDIA_BUS_FMT_SGBRG12_1X12, + .depth = 12, + .csi_dt = MIPI_CSI2_DT_RAW12, + }, + { + .code = MEDIA_BUS_FMT_SGRBG12_1X12, + .depth = 12, + .csi_dt = MIPI_CSI2_DT_RAW12, + }, + { + .code = MEDIA_BUS_FMT_SRGGB12_1X12, + .depth = 12, + .csi_dt = MIPI_CSI2_DT_RAW12, + }, +}; + +static inline struct rkcif_csi_device *to_rkcif_csi(struct v4l2_subdev *sd) +{ + return container_of(sd, struct rkcif_csi_device, sd); +} + +static inline __maybe_unused void +rkcif_csi_write(struct rkcif_csi_device *csi_dev, unsigned int addr, u32 val) +{ + writel(val, csi_dev->base_addr + addr); +} + +static inline __maybe_unused u32 +rkcif_csi_read(struct rkcif_csi_device *csi_dev, unsigned int addr) +{ + return readl(csi_dev->base_addr + addr); +} + +static const struct rkcif_csi_format * +rkcif_csi_find_format(struct rkcif_csi_device *csi_dev, u32 mbus_code) +{ + const struct rkcif_csi_format *format; + + WARN_ON(csi_dev->formats_num == 0); + + for (int i = 0; i < csi_dev->formats_num; i++) { + format = &csi_dev->formats[i]; + if (format->code == mbus_code) + return format; + } + + return NULL; +} + +static int rkcif_csi_start(struct rkcif_csi_device *csi_dev) +{ + enum v4l2_mbus_type bus_type = csi_dev->vep.bus_type; + union phy_configure_opts opts; + s64 link_freq; + u32 lanes = csi_dev->vep.bus.mipi_csi2.num_data_lanes; + u32 control = 0; + + if (lanes < 1 || lanes > 4) + return -EINVAL; + + /* set mult and div to 0, thus completely rely on V4L2_CID_LINK_FREQ */ + link_freq = v4l2_get_link_freq(csi_dev->source_sd->ctrl_handler, 0, 0); + if (link_freq <= 0) + return -EINVAL; + + if (bus_type == V4L2_MBUS_CSI2_DPHY) { + struct phy_configure_opts_mipi_dphy *cfg = &opts.mipi_dphy; + + phy_mipi_dphy_get_default_config_for_hsclk(link_freq * 2, lanes, + cfg); + phy_set_mode(csi_dev->phy, PHY_MODE_MIPI_DPHY); + phy_configure(csi_dev->phy, &opts); + + control |= SW_CPHY_EN(0); + + } else if (bus_type == V4L2_MBUS_CSI2_CPHY) { + control |= SW_CPHY_EN(1); + + /* TODO: implement CPHY configuration */ + } else { + return -EINVAL; + } + + control |= SW_DATATYPE_FS(0x00) | SW_DATATYPE_FE(0x01) | + SW_DATATYPE_LS(0x02) | SW_DATATYPE_LE(0x03); + + rkcif_csi_write(csi_dev, CSI2HOST_N_LANES, lanes - 1); + rkcif_csi_write(csi_dev, CSI2HOST_CONTROL, control); + rkcif_csi_write(csi_dev, CSI2HOST_CSI2_RESETN, 1); + + phy_power_on(csi_dev->phy); + + return 0; +} + +static void rkcif_csi_stop(struct rkcif_csi_device *csi_dev) +{ + phy_power_off(csi_dev->phy); + + rkcif_csi_write(csi_dev, CSI2HOST_CSI2_RESETN, 0); + rkcif_csi_write(csi_dev, CSI2HOST_MSK1, ~0); + rkcif_csi_write(csi_dev, CSI2HOST_MSK2, ~0); +} + +static const struct media_entity_operations rkcif_csi_media_ops = { + .link_validate = v4l2_subdev_link_validate, +}; + +static int rkcif_csi_enum_mbus_code(struct v4l2_subdev *sd, + struct v4l2_subdev_state *sd_state, + struct v4l2_subdev_mbus_code_enum *code) +{ + struct rkcif_csi_device *csi_dev = to_rkcif_csi(sd); + + if (code->pad == RKCIF_CSI_PAD_SRC) { + const struct v4l2_mbus_framefmt *sink_fmt; + + if (code->index) + return -EINVAL; + + sink_fmt = v4l2_subdev_state_get_format(sd_state, + RKCIF_CSI_PAD_SINK); + code->code = sink_fmt->code; + + return 0; + } else if (code->pad == RKCIF_CSI_PAD_SINK) { + if (code->index > csi_dev->formats_num) + return -EINVAL; + + code->code = csi_dev->formats[code->index].code; + return 0; + } + + return -EINVAL; +} + +static int rkcif_csi_set_fmt(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + struct v4l2_subdev_format *format) +{ + struct rkcif_csi_device *csi_dev = to_rkcif_csi(sd); + const struct rkcif_csi_format *fmt; + struct v4l2_mbus_framefmt *sink, *src; + + /* the format on the source pad always matches the sink pad */ + if (format->pad == RKCIF_CSI_PAD_SRC) + return v4l2_subdev_get_fmt(sd, state, format); + + sink = v4l2_subdev_state_get_format(state, format->pad, format->stream); + if (!sink) + return -EINVAL; + + fmt = rkcif_csi_find_format(csi_dev, format->format.code); + if (fmt) + *sink = format->format; + else + *sink = default_format; + + /* propagate the format to the source pad */ + src = v4l2_subdev_state_get_opposite_stream_format(state, format->pad, + format->stream); + if (!src) + return -EINVAL; + + *src = *sink; + + return 0; +} + +static int rkcif_csi_set_routing(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + enum v4l2_subdev_format_whence which, + struct v4l2_subdev_krouting *routing) +{ + int ret; + + ret = v4l2_subdev_routing_validate(sd, routing, + V4L2_SUBDEV_ROUTING_ONLY_1_TO_1); + if (ret) + return ret; + + ret = v4l2_subdev_set_routing_with_fmt(sd, state, routing, + &default_format); + if (ret) + return ret; + + return 0; +} + +static int rkcif_csi_enable_streams(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, u32 pad, + u64 streams_mask) +{ + struct rkcif_csi_device *csi_dev = to_rkcif_csi(sd); + struct v4l2_subdev *remote_sd; + struct media_pad *sink_pad, *remote_pad; + struct device *dev = csi_dev->dev; + u64 mask; + int ret; + + sink_pad = &sd->entity.pads[RKCIF_CSI_PAD_SINK]; + remote_pad = media_pad_remote_pad_first(sink_pad); + remote_sd = media_entity_to_v4l2_subdev(remote_pad->entity); + + mask = v4l2_subdev_state_xlate_streams(state, RKCIF_CSI_PAD_SINK, + RKCIF_CSI_PAD_SRC, + &streams_mask); + + ret = pm_runtime_resume_and_get(dev); + if (ret) + goto err; + + ret = rkcif_csi_start(csi_dev); + if (ret) { + dev_err(dev, "failed to enable CSI hardware\n"); + goto err_pm_runtime_put; + } + + ret = v4l2_subdev_enable_streams(remote_sd, remote_pad->index, mask); + if (ret) + goto err_csi_stop; + + return 0; + +err_csi_stop: + rkcif_csi_stop(csi_dev); +err_pm_runtime_put: + pm_runtime_put_sync(dev); +err: + return ret; +} + +static int rkcif_csi_disable_streams(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, u32 pad, + u64 streams_mask) +{ + struct rkcif_csi_device *csi_dev = to_rkcif_csi(sd); + struct v4l2_subdev *remote_sd; + struct media_pad *sink_pad, *remote_pad; + struct device *dev = csi_dev->dev; + u64 mask; + int ret; + + sink_pad = &sd->entity.pads[RKCIF_CSI_PAD_SINK]; + remote_pad = media_pad_remote_pad_first(sink_pad); + remote_sd = media_entity_to_v4l2_subdev(remote_pad->entity); + + mask = v4l2_subdev_state_xlate_streams(state, RKCIF_CSI_PAD_SINK, + RKCIF_CSI_PAD_SRC, + &streams_mask); + + ret = v4l2_subdev_disable_streams(remote_sd, remote_pad->index, mask); + + rkcif_csi_stop(csi_dev); + + pm_runtime_mark_last_busy(dev); + pm_runtime_put_autosuspend(dev); + + return ret; +} + +static const struct v4l2_subdev_pad_ops rkcif_csi_pad_ops = { + .enum_mbus_code = rkcif_csi_enum_mbus_code, + .get_fmt = v4l2_subdev_get_fmt, + .set_fmt = rkcif_csi_set_fmt, + .set_routing = rkcif_csi_set_routing, + .enable_streams = rkcif_csi_enable_streams, + .disable_streams = rkcif_csi_disable_streams, +}; + +static const struct v4l2_subdev_ops rkcif_csi_ops = { + .pad = &rkcif_csi_pad_ops, +}; + +static int rkcif_csi_init_state(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state) +{ + struct v4l2_subdev_route routes[] = { + { + .sink_pad = RKCIF_CSI_PAD_SINK, + .sink_stream = 0, + .source_pad = RKCIF_CSI_PAD_SRC, + .source_stream = 0, + .flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE, + }, + }; + struct v4l2_subdev_krouting routing = { + .len_routes = ARRAY_SIZE(routes), + .num_routes = ARRAY_SIZE(routes), + .routes = routes, + }; + int ret; + + ret = v4l2_subdev_set_routing_with_fmt(sd, state, &routing, + &default_format); + + return ret; +} + +static const struct v4l2_subdev_internal_ops rkcif_csi_internal_ops = { + .init_state = rkcif_csi_init_state, +}; + +static int rkcif_csi_notifier_bound(struct v4l2_async_notifier *notifier, + struct v4l2_subdev *sd, + struct v4l2_async_connection *asd) +{ + struct rkcif_csi_device *csi_dev = + container_of(notifier, struct rkcif_csi_device, notifier); + int source_pad; + + source_pad = media_entity_get_fwnode_pad(&sd->entity, sd->fwnode, + MEDIA_PAD_FL_SOURCE); + if (source_pad < 0) { + dev_err(csi_dev->dev, "failed to find source pad for %s\n", + sd->name); + return source_pad; + } + + csi_dev->source_sd = sd; + csi_dev->source_pad = source_pad; + + return media_create_pad_link(&sd->entity, source_pad, + &csi_dev->sd.entity, RKCIF_CSI_PAD_SINK, + MEDIA_LNK_FL_ENABLED); +} + +static const struct v4l2_async_notifier_operations rkcif_csi_notifier_ops = { + .bound = rkcif_csi_notifier_bound, +}; + +static int rkcif_register_notifier(struct rkcif_csi_device *csi_dev) +{ + struct v4l2_async_connection *asd; + struct v4l2_async_notifier *ntf = &csi_dev->notifier; + struct v4l2_fwnode_endpoint *vep = &csi_dev->vep; + struct v4l2_subdev *sd = &csi_dev->sd; + struct device *dev = csi_dev->dev; + struct fwnode_handle *ep; + int ret; + + ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(dev), 0, 0, + FWNODE_GRAPH_ENDPOINT_NEXT); + if (!ep) + return dev_err_probe(dev, -ENODEV, "failed to get endpoint\n"); + + vep->bus_type = V4L2_MBUS_UNKNOWN; + ret = v4l2_fwnode_endpoint_parse(ep, vep); + if (ret) { + ret = dev_err_probe(dev, ret, "failed to parse endpoint\n"); + goto out; + } + + if (vep->bus_type != V4L2_MBUS_CSI2_DPHY && + vep->bus_type != V4L2_MBUS_CSI2_CPHY) { + ret = dev_err_probe(dev, -EINVAL, + "invalid bus type of endpoint\n"); + goto out; + } + + v4l2_async_subdev_nf_init(ntf, sd); + ntf->ops = &rkcif_csi_notifier_ops; + + asd = v4l2_async_nf_add_fwnode_remote(ntf, ep, + struct v4l2_async_connection); + if (IS_ERR(asd)) { + ret = PTR_ERR(asd); + goto out; + } + + ret = v4l2_async_nf_register(ntf); + if (ret) { + ret = dev_err_probe(dev, ret, "failed to register notifier\n"); + v4l2_async_nf_cleanup(ntf); + goto out; + } + + ret = 0; + +out: + fwnode_handle_put(ep); + return ret; +} + +static int rkcif_csi_register(struct rkcif_csi_device *csi_dev) +{ + struct media_pad *pads = csi_dev->pads; + struct v4l2_subdev *sd = &csi_dev->sd; + int ret; + + ret = rkcif_register_notifier(csi_dev); + if (ret) + goto err; + + v4l2_subdev_init(sd, &rkcif_csi_ops); + sd->dev = csi_dev->dev; + sd->entity.ops = &rkcif_csi_media_ops; + sd->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE; + sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_STREAMS; + sd->internal_ops = &rkcif_csi_internal_ops; + sd->owner = THIS_MODULE; + snprintf(sd->name, sizeof(sd->name), "rockchip-mipi-csi %s", + dev_name(csi_dev->dev)); + + pads[RKCIF_CSI_PAD_SINK].flags = MEDIA_PAD_FL_SINK | + MEDIA_PAD_FL_MUST_CONNECT; + pads[RKCIF_CSI_PAD_SRC].flags = MEDIA_PAD_FL_SOURCE | + MEDIA_PAD_FL_MUST_CONNECT; + ret = media_entity_pads_init(&sd->entity, RKCIF_CSI_PAD_MAX, pads); + if (ret) + goto err_notifier_unregister; + + ret = v4l2_subdev_init_finalize(sd); + if (ret) + goto err_entity_cleanup; + + ret = v4l2_async_register_subdev(sd); + if (ret) { + dev_err(sd->dev, "failed to register CSI subdev\n"); + goto err_subdev_cleanup; + } + + return 0; + +err_subdev_cleanup: + v4l2_subdev_cleanup(sd); +err_entity_cleanup: + media_entity_cleanup(&sd->entity); +err_notifier_unregister: + v4l2_async_nf_unregister(&csi_dev->notifier); + v4l2_async_nf_cleanup(&csi_dev->notifier); +err: + return ret; +} + +static void rkcif_csi_unregister(struct rkcif_csi_device *csi_dev) +{ + struct v4l2_subdev *sd = &csi_dev->sd; + + v4l2_async_unregister_subdev(sd); + v4l2_subdev_cleanup(sd); + media_entity_cleanup(&sd->entity); + v4l2_async_nf_unregister(&csi_dev->notifier); + v4l2_async_nf_cleanup(&csi_dev->notifier); +} + +static const struct of_device_id rkcif_csi_of_match[] = { + { + .compatible = "rockchip,rk3568-mipi-csi", + }, + {} +}; + +static int rkcif_csi_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct rkcif_csi_device *csi_dev; + int ret; + + csi_dev = devm_kzalloc(dev, sizeof(*csi_dev), GFP_KERNEL); + if (!csi_dev) + return -ENOMEM; + csi_dev->dev = dev; + dev_set_drvdata(dev, csi_dev); + + csi_dev->base_addr = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(csi_dev->base_addr)) + return PTR_ERR(csi_dev->base_addr); + + ret = devm_clk_bulk_get_all(dev, &csi_dev->clks); + if (ret != RKCIF_CSI_CLKS_MAX) + return dev_err_probe(dev, ret, "failed to get clocks\n"); + csi_dev->clks_num = ret; + + csi_dev->phy = devm_phy_get(dev, "csiphy"); + if (IS_ERR(csi_dev->phy)) + return dev_err_probe(dev, PTR_ERR(csi_dev->phy), + "failed to get MIPI CSI PHY\n"); + + csi_dev->reset = devm_reset_control_array_get_exclusive(dev); + if (IS_ERR(csi_dev->reset)) + return dev_err_probe(dev, PTR_ERR(csi_dev->reset), + "failed to get reset\n"); + + csi_dev->formats = formats; + csi_dev->formats_num = ARRAY_SIZE(formats); + + pm_runtime_enable(dev); + + ret = phy_init(csi_dev->phy); + if (ret) { + ret = dev_err_probe(dev, ret, + "failed to initialize MIPI CSI PHY\n"); + goto err_pm_runtime_disable; + } + + ret = rkcif_csi_register(csi_dev); + if (ret) + goto err_phy_exit; + + return 0; + +err_phy_exit: + phy_exit(csi_dev->phy); +err_pm_runtime_disable: + pm_runtime_disable(dev); + return ret; +} + +static void rkcif_csi_remove(struct platform_device *pdev) +{ + struct rkcif_csi_device *csi_dev = platform_get_drvdata(pdev); + struct device *dev = &pdev->dev; + + rkcif_csi_unregister(csi_dev); + phy_exit(csi_dev->phy); + pm_runtime_disable(dev); +} + +static int rkcif_csi_runtime_suspend(struct device *dev) +{ + struct rkcif_csi_device *csi_dev = dev_get_drvdata(dev); + + clk_bulk_disable_unprepare(csi_dev->clks_num, csi_dev->clks); + + return 0; +} + +static int rkcif_csi_runtime_resume(struct device *dev) +{ + struct rkcif_csi_device *csi_dev = dev_get_drvdata(dev); + int ret; + + reset_control_assert(csi_dev->reset); + udelay(5); + reset_control_deassert(csi_dev->reset); + + ret = clk_bulk_prepare_enable(csi_dev->clks_num, csi_dev->clks); + if (ret) { + dev_err(dev, "failed to enable clocks\n"); + return ret; + } + + return 0; +} + +static const struct dev_pm_ops rkcif_csi_pm_ops = { + .runtime_suspend = rkcif_csi_runtime_suspend, + .runtime_resume = rkcif_csi_runtime_resume, +}; + +static struct platform_driver rkcif_csi_drv = { + .driver = { + .name = "rockchip-mipi-csi", + .of_match_table = rkcif_csi_of_match, + .pm = &rkcif_csi_pm_ops, + }, + .probe = rkcif_csi_probe, + .remove = rkcif_csi_remove, +}; +module_platform_driver(rkcif_csi_drv); + +MODULE_DESCRIPTION("Rockchip MIPI CSI-2 Host platform driver"); +MODULE_LICENSE("GPL"); From patchwork Wed Feb 19 10:16:38 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Riesch X-Patchwork-Id: 13981929 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 60483C021B2 for ; Wed, 19 Feb 2025 10:45:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Cc:To:In-Reply-To: References:Message-Id:Subject:Date:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=ezpCqF7HNpZjFuIEkd4XvbUWASgZbO6JOEx6HOvLX/w=; b=hnaWW9C2e/bj09V1Kyp/Chw/J/ EIJyFJPgxeVU1uif5oVU8+v3Exd0zLhdUCdgx5W38ELyvBDS6lGsVXWwoj+PrDRNmv87qdm+wmOQ9 rhJWOcVCh6arcb/DYk/stbVQ31JhyxZWBKANhNcqnF3INKJshoR1Yz8PXK72W4iQSTW+aQLeu6uLV a4uc+nbYhN4YESke9/29UxLyzjkb0uqnRJLCRFt0pSGpMX+k7kDo/XH/C/LDjL0VrZp7XvC9a2ueO w+Sb/LD/9hmMwCzGDz9J+uXzo9+X0OVD2oUhEZlOHkBjAGuadmUhaXQbP0fF3t8lUcVSDIN6P9bRc NzQ9NXaw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tkhZk-0000000CCyV-3v2N; Wed, 19 Feb 2025 10:45:08 +0000 Received: from mail-am6eur05on20703.outbound.protection.outlook.com ([2a01:111:f403:2612::703] helo=EUR05-AM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tkh8U-0000000C5uU-2XdK; Wed, 19 Feb 2025 10:16:59 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=O2ckZJq2UTMSut1tBFW3kf664+0Pi+TT2KfErdRd/KI28CPhKS90daJt7CcspT0Uv+FsbPySvxxp0ardjff7pHqHnyza8mf8nW460dN01o3UBtonMCBuJ+JsumD6jP/G+5VhUrTDF23OwmA5sKNiyEMfMNWTxlguuUQlG7i08b+FR2snjd5eOj6/BhPpnflXU1kaKZ4Z4ErnzkWjfJmrFcJBXg+7UZgTSYr2Ma1kuYvUBh4926aatf12WlinnxHFITipov+b56/UocralQHPEbe0RQurDgcE7LUtcjsb+j8VT9TqqWqumBAR9p9AtoNc21aSVQLxVQuGzur97mVO+w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=7MmC+vttOPClVYEq8kqxqWZzmlFP5TNh88NVLGG+gkM=; b=k4kKEcEHTP7xNdn8c7id/ARMQIbp1c9pXvXdQPKvAidLrP15aGdgXpCnjbgQVBoUVvVhJxLljWkAMj/j/r2JXSuPaMj5c0V9O+gxu/KdoGIV+B9grhJIY30UWcmGQTGVXlVOqhN8XoQSSNJUIzyot+6SWlFWpoPcbe0v86WlLzDdK/e1raciunIE+FUOi2TIw9BNZ9cfub1gKQmqFgQWE6uGiU3WjZOrr/NUY1mwRm69RDzJJ7v+KvTd0Q4r+d168oC9z8ctecMZGOrum1ykYGplpoyhfBs6yXdYFyc1O0OOwNPr71K3EKDSuEApcPXEmd94UriLOd8dZafoTRPIDA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=wolfvision.net; dmarc=pass action=none header.from=wolfvision.net; dkim=pass header.d=wolfvision.net; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=wolfvision.net; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=7MmC+vttOPClVYEq8kqxqWZzmlFP5TNh88NVLGG+gkM=; b=mIhcfoDr/Xn3YZrP5j0pjjgErEg2RQIWL6viB5mkWDMVBuKRy72f/BhW4cKKWDe0eaccVj4cZibXOAg0v89rdTkJyyrw/uYz0TMimnfwQgSoPfb3MH4BTl7NE+NaAqs48rllQHb1TtWZ2yUyvnXDWGrDKU/q6o+CRPGGolegRCs= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=wolfvision.net; Received: from DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) by DU0PR08MB8138.eurprd08.prod.outlook.com (2603:10a6:10:3ed::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8445.18; Wed, 19 Feb 2025 10:16:51 +0000 Received: from DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d]) by DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d%5]) with mapi id 15.20.8466.015; Wed, 19 Feb 2025 10:16:51 +0000 From: Michael Riesch Date: Wed, 19 Feb 2025 11:16:38 +0100 Subject: [PATCH v4 07/11] media: rockchip: rkcif: add support for mipi csi-2 receiver Message-Id: <20250219-v6-8-topic-rk3568-vicap-v4-7-e906600ae3b0@wolfvision.net> References: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> In-Reply-To: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> To: Mehdi Djait , Maxime Chevallier , =?utf-8?q?Th=C3=A9o_Leb?= =?utf-8?q?run?= , Gerald Loacker , Thomas Petazzoni , Laurent Pinchart , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiko Stuebner , Kever Yang , Nicolas Dufresne , Sebastian Fricke , Sebastian Reichel , Paul Kocialkowski , Alexander Shiyan , Val Packett , Rob Herring , Philipp Zabel , Sakari Ailus Cc: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Michael Riesch X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1739960197; l=24428; i=michael.riesch@wolfvision.net; s=20240405; h=from:subject:message-id; bh=8Sv3qzMjLle5B2Db/ntmB6Er3Sh5MdDzsjE02HgBVUY=; b=VwToprCzjkQOR7ppnTwhOZNrPMiqjtxIZ8KQxOf+SS3/NlBgCg6SQvsywJ6B0xwPRnrhcqukV OqWw30IpTWZAUmFSLYvrLSau+dfR90QZEoAch6+HFoh4AOVh36EtDpL X-Developer-Key: i=michael.riesch@wolfvision.net; a=ed25519; pk=cSJmgKSH3B6kdCIDCl+IYDW1Pw/Ybc6g9rmnUd/G7Ck= X-ClientProxiedBy: VI1P190CA0041.EURP190.PROD.OUTLOOK.COM (2603:10a6:800:1bb::8) To DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU0PR08MB9155:EE_|DU0PR08MB8138:EE_ X-MS-Office365-Filtering-Correlation-Id: 9531973b-7ecb-4d20-34df-08dd50ce86dc X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|376014|7416014|1800799024|366016|921020|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?q?/4po+yn0k+a9p/uoTkznRzNRR78HB1f?= =?utf-8?q?J42nni2980DsYa6EFWldidtS6sDCcNZ9eI/6i3YVhFYflYOhZtfZXSAmzcqpygUVI?= =?utf-8?q?hIpQXl1kqlSgKZykh8UDKTF8UuCTTPoHu4ksyPW10qUhnbjXrY7t5sMRZbXuJIJj0?= =?utf-8?q?X1dZV/0TGDPH4qV7qetqwirwqQd06aJRVtsevQb8nVqm6i2S0ipMwxUFJr9+VusBr?= =?utf-8?q?lTLPMXS79LAuoHdmw2m+W/EPs4GOy2KC6l6sojY9GnyuTuT0CqKhP/jhZ5aepHbAr?= =?utf-8?q?2u9IUWJLu6kDlTEIi8Gbclkyn7Cm1ZBDT+G0RT+HQfXLdB9r4gvII3qghaca3Ll5f?= =?utf-8?q?xppAQSvmpheevJP/BuGaT7UXQ7/CL7d8fkaADvLymbaMPWiM1MoPjgtv8wSQYk7Z5?= =?utf-8?q?c8GopuHJL53XH6xxyopTbxWTdt43BGITq0cik3b4Z0wiEivCey7pS/gazag03wXVX?= =?utf-8?q?svJmCuZFTP9MstnwCzWGZM+isrv0Zy2OfZnLs0WKK4z/y5FA45kynIPqPTvkwt38z?= =?utf-8?q?SzKIBpFytob6FxxfIgiMgiqxDff/8fwtKE23y1Oayol7WC9IHeR2dSm4GjxW2XuKb?= =?utf-8?q?DCD6hMmgipMRA0vvg6rRyjFu6WA9LmBZgsqRF3uTWe3XLI9YGtVmqlfU36vuBtyi5?= =?utf-8?q?Neqk2ecGytjQGEkXXh2YWek0PYU50cv0AjsAaRRisY3Lm2+Io6ijWQlb7IypU+HwR?= =?utf-8?q?DNJ0EP9yttn3Ds1w8iInwNLX5Y0mKpN44BRVGKbPgfJilfyoAhMPd3unSol6Z7Q0X?= =?utf-8?q?s/7QGUMvus4imxV/miSPoKt8P2EfO8efZoy4H51Kjrriz8haSnUWRmQ9gW9WSPOae?= =?utf-8?q?ilDJfdf1XzTa4CFpffimfGHKDRLnhQAG6XyefpuhheMuc6z4JEXBrubIStLbkayrE?= =?utf-8?q?oe938qhx+F1LynN1JUKFKdGOJRmRaajgaSZ/p5XVrjnbOawAEkOeoKjTb0ux5qljA?= =?utf-8?q?Q14ztu5mNZ/c62RJVJbkR0IZGEk48VPknzrBIXpIuw6yswyEmywI8lhhLEKCvoZTD?= =?utf-8?q?bxpFGwUZUHjL4GtyYJ0p7HvVk7weJULZngd4VJEqtYrfb203J/sfx6vBZRqgMvvrK?= =?utf-8?q?r+0XUiMrmWdZgxmKcIsGoeBpTPyk7Pw7dlO4kE28Qz8EhP1skiuzrBvnnSDEmsZ+4?= =?utf-8?q?RDBmkv4dN3JDo5KzXvCngvxrqnbextu0RNUmoBo7WJzQG4FUvRk+lCxlVl/DiJ6Ck?= =?utf-8?q?DVj7wZWo0Ey0LIyyhKxgoXIY9+hyeEngQ5Mqwz3CA6hHWrAJJ4lM+K3ZYuFKchPGI?= =?utf-8?q?S684EoCJJ6njmxYqT6Le/xWnMeh/vfUfJ/i9RwJEJ4DsqeBfn4MT6PTB46Z57doSt?= =?utf-8?q?22gEtm7RoQcW5NN/qU6u9ZLgARk4mDww9Rs93re0UPw+jtqhsimMp1x3L+gyT2S3u?= =?utf-8?q?T58FIj9qeXpZJVqYXASIEtCW5N6ylN7ow=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DU0PR08MB9155.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(376014)(7416014)(1800799024)(366016)(921020)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?gBI4zUaWiQYReDxpNgloXQk4HCGl?= =?utf-8?q?YB2XsLvZBW1tfMGAGk+2I08YDK0kFwDm3xsE1GHgdT/K36PBWBHAL+IIUJ4CTfPwX?= =?utf-8?q?6mtX7j4+O9AP6QSPnJugj9wSxMs6w/J/jZSklfQPUr/rMf/v9KaPeCk4qlsiM3/na?= =?utf-8?q?djwJcX606NuGnoi6bZQiBUqjsOdv4atK9Bk3/6rjM7IWOmXZJMpSaoxt4aLdzULqB?= =?utf-8?q?ztkslYC5tRM/7+aqOnvHw6ECPDD9/Shut3tqQjuMwt2nE0uJb23X4vgj94zr1dhVh?= =?utf-8?q?wMKCjb3BtynYHKgVeWD7CuDLeXTqeP/rzMh9BzWp5bmV751mtc3tY5ott/bjTARo1?= =?utf-8?q?FZHSfpRXyW8HZH5hQoKMR6zCQNGikAsBcKvAreCXvi6CCpkjhDt9zHp3odRkGMzVT?= =?utf-8?q?mF8bB9yz6AVuPMp6IZnwNV1nEJqQlO6lViZ+EpoX+/AXBReXuyUoio/V4z6WqJE5C?= =?utf-8?q?/PdMB4VEP401iw/SYIT6DXa2Oyfk8iXHgaXxo2ce2pIkTOcXxOPJC4qto0O/l24bq?= =?utf-8?q?Vg3gNNTRFhs9h/IDk+Px7IeC1li0S0UN25jbQPd2vSDz2LIW+su275721BERt10WZ?= =?utf-8?q?PL8Klii7MiM1aA2hbht/l/OtfCohYkcqLysaQgbb7+D1gz2BQmZE7rCYg5KvLJjxp?= =?utf-8?q?t98ZuqQay9z5Wk5IH3c0V3C0rTeVExy6V0luBcKnyqR75GjXD1urAiVL9mRsBY50U?= =?utf-8?q?Q2H6poBGwIObapG0DYYAyNsOwdmq8fvnKnHF/HS6K40h8FHDrZZdT1m0pm2w0WYRd?= =?utf-8?q?+aZ5w9Lw28jEGDsrsGEt0cb1cz2SKyXnaRa/QIoX+UJakOo9o4phx3iCxoOj7AisO?= =?utf-8?q?UJu+57z0zKnxwZfj32E6W/x+ZwPxYr6IdhQ6+u/Yb0OCv8Q2JWYoKMfLjJfBT9XXB?= =?utf-8?q?fo9v6KTCUqePym9m7xoA0gKYrgnCuhnR7ZJLMRX/H2rcQzZkCNJQ2bb9BrRapt6FW?= =?utf-8?q?Q//3f9bAHqi/AT7uCY5ILDqUZRueq+V2UApVUsSDGmwYtSmRgQJPCMfEc9ftl01F8?= =?utf-8?q?y/XUQy4EmyGhWpdkH422FCBmjAwky/mGrhBexV4bKA2wKYOJRPXVYfwQ4lHYJ7T9Y?= =?utf-8?q?cx/MYh/DJsgtUMnlEUhK7+rlrDfc/waGvPkT/OJ5l8g02Kuom1oIRdJaoSjUuWKLk?= =?utf-8?q?TzxeMIxyDnFFtTBjcDuBeWRUcbcA6zrjuYnAO6EVXxtxlFhzSFvrd+C4Xcy1zhfpH?= =?utf-8?q?Lo10n+gzcj3yIG9/n1nZiwPD4n64zd7qwb8nNSzg26+XIOu04ZzrHztI+NNTHbdiM?= =?utf-8?q?fsDkp0sSxFj6KNA2h4/vNGd0iQwCRaAoUXyZWb1I1/OCkrA4ypq1dardwtsdzvzGE?= =?utf-8?q?W6Hd8zRe4E5Vtgi7riAR2RIxR5UOhAnyoc9f1gCYgUI4SpVLUXHJGkD7nVOkKSwKG?= =?utf-8?q?Xcze7N99p+ZWttKks0K3gNXAcyLTHGL5JDxI2SGmB6ZsRnB1OSqV4M8APo8lB+Pw2?= =?utf-8?q?3CSGccD59+n+db014GmgY26HjIOJ0f+JsijmyYIuIUe/kDh9JGzzZVkYiuHYPF4CV?= =?utf-8?q?QhRsLwOpkQvsL3aPZUsqGD3lGY8rd6kg6g=3D=3D?= X-OriginatorOrg: wolfvision.net X-MS-Exchange-CrossTenant-Network-Message-Id: 9531973b-7ecb-4d20-34df-08dd50ce86dc X-MS-Exchange-CrossTenant-AuthSource: DU0PR08MB9155.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Feb 2025 10:16:51.4399 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: e94ec9da-9183-471e-83b3-51baa8eb804f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: OAsQJXeEzvJNYytPye7GYlkBT2QEy406eomEyD/d8FNPsIaC/C4CZP2+cEQM/E5H9D43m7iXTWDsTUbkVauPbWM60cEnfqPwXBSvjkD5JRQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB8138 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250219_021658_663273_21D47F99 X-CRM114-Status: GOOD ( 13.36 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org The RK3568 Video Capture (VICAP) unit features a MIPI CSI-2 receiver that can receive video data and write it into system memory using the ping-pong scheme. Add support for it. Signed-off-by: Michael Riesch --- .../platform/rockchip/rkcif/rkcif-capture-mipi.c | 688 +++++++++++++++++++++ .../platform/rockchip/rkcif/rkcif-capture-mipi.h | 2 + .../media/platform/rockchip/rkcif/rkcif-common.h | 16 + drivers/media/platform/rockchip/rkcif/rkcif-dev.c | 1 + .../platform/rockchip/rkcif/rkcif-interface.c | 5 +- drivers/media/platform/rockchip/rkcif/rkcif-regs.h | 24 +- 6 files changed, 734 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-capture-mipi.c b/drivers/media/platform/rockchip/rkcif/rkcif-capture-mipi.c index 0c3f7b8cfa18..751a2351cfd2 100644 --- a/drivers/media/platform/rockchip/rkcif/rkcif-capture-mipi.c +++ b/drivers/media/platform/rockchip/rkcif/rkcif-capture-mipi.c @@ -6,22 +6,710 @@ * Copyright (C) 2025 Michael Riesch */ +#include + +#include +#include +#include +#include +#include +#include +#include +#include + #include "rkcif-capture-mipi.h" #include "rkcif-common.h" +#include "rkcif-interface.h" +#include "rkcif-regs.h" #include "rkcif-stream.h" +#define RKCIF_MIPI_CTRL0_COMPACT_EN BIT(6) +#define RKCIF_MIPI_CTRL0_CROP_EN BIT(5) +#define RKCIF_MIPI_CTRL0_TYPE_RAW8 (0 << 1) +#define RKCIF_MIPI_CTRL0_TYPE_RAW10 (1 << 1) +#define RKCIF_MIPI_CTRL0_TYPE_RAW12 (2 << 1) +#define RKCIF_MIPI_CTRL0_TYPE_RGB888 (3 << 1) +#define RKCIF_MIPI_CTRL0_TYPE_YUV422SP (4 << 1) +#define RKCIF_MIPI_CTRL0_TYPE_YUV420SP (5 << 1) +#define RKCIF_MIPI_CTRL0_TYPE_YUV400 (6 << 1) +#define RKCIF_MIPI_CTRL0_CAP_EN BIT(0) + +#define RKCIF_MIPI_INT_FRAME0_END(id) BIT(8 + id * 2 + 0) +#define RKCIF_MIPI_INT_FRAME1_END(id) BIT(8 + id * 2 + 1) + +static const struct rkcif_output_fmt mipi_out_fmts[] = { + /* YUV formats */ + { + .fourcc = V4L2_PIX_FMT_YUYV, + .mbus_code = MEDIA_BUS_FMT_YUYV8_1X16, + .depth = 16, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_YUV422_8B, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW8, + }, + }, + { + .fourcc = V4L2_PIX_FMT_UYVY, + .mbus_code = MEDIA_BUS_FMT_UYVY8_1X16, + .depth = 16, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_YUV422_8B, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW8, + }, + }, + { + .fourcc = V4L2_PIX_FMT_YVYU, + .mbus_code = MEDIA_BUS_FMT_YVYU8_1X16, + .depth = 16, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_YUV422_8B, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW8, + }, + }, + { + .fourcc = V4L2_PIX_FMT_VYUY, + .mbus_code = MEDIA_BUS_FMT_VYUY8_1X16, + .depth = 16, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_YUV422_8B, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW8, + }, + }, + /* RGB formats */ + { + .fourcc = V4L2_PIX_FMT_RGB24, + .mbus_code = MEDIA_BUS_FMT_RGB888_1X24, + .depth = 24, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RGB888, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RGB888, + }, + }, + { + .fourcc = V4L2_PIX_FMT_BGR24, + .mbus_code = MEDIA_BUS_FMT_BGR888_1X24, + .depth = 24, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RGB888, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RGB888, + }, + }, + /* Bayer formats */ + { + .fourcc = V4L2_PIX_FMT_SBGGR8, + .mbus_code = MEDIA_BUS_FMT_SBGGR8_1X8, + .depth = 8, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RAW8, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW8, + }, + }, + { + .fourcc = V4L2_PIX_FMT_SGBRG8, + .mbus_code = MEDIA_BUS_FMT_SGBRG8_1X8, + .depth = 8, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RAW8, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW8, + }, + }, + { + .fourcc = V4L2_PIX_FMT_SGRBG8, + .mbus_code = MEDIA_BUS_FMT_SGRBG8_1X8, + .depth = 8, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RAW8, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW8, + }, + }, + { + .fourcc = V4L2_PIX_FMT_SRGGB8, + .mbus_code = MEDIA_BUS_FMT_SRGGB8_1X8, + .depth = 8, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RAW8, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW8, + }, + }, + { + .fourcc = V4L2_PIX_FMT_SBGGR10, + .mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10, + .depth = 10, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RAW10, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW10, + }, + }, + { + .fourcc = V4L2_PIX_FMT_SBGGR10P, + .mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10, + .depth = 10, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RAW10, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW10 | RKCIF_MIPI_CTRL0_COMPACT_EN, + }, + }, + { + .fourcc = V4L2_PIX_FMT_SGBRG10, + .mbus_code = MEDIA_BUS_FMT_SGBRG10_1X10, + .depth = 10, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RAW10, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW10, + }, + }, + { + .fourcc = V4L2_PIX_FMT_SGBRG10P, + .mbus_code = MEDIA_BUS_FMT_SGBRG10_1X10, + .depth = 10, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RAW10, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW10 | RKCIF_MIPI_CTRL0_COMPACT_EN, + }, + }, + { + .fourcc = V4L2_PIX_FMT_SGRBG10, + .mbus_code = MEDIA_BUS_FMT_SGRBG10_1X10, + .depth = 10, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RAW10, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW10, + }, + }, + { + .fourcc = V4L2_PIX_FMT_SGRBG10P, + .mbus_code = MEDIA_BUS_FMT_SGRBG10_1X10, + .depth = 10, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RAW10, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW10 | RKCIF_MIPI_CTRL0_COMPACT_EN, + }, + }, + { + .fourcc = V4L2_PIX_FMT_SRGGB10, + .mbus_code = MEDIA_BUS_FMT_SRGGB10_1X10, + .depth = 10, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RAW10, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW10, + }, + }, + { + .fourcc = V4L2_PIX_FMT_SRGGB10P, + .mbus_code = MEDIA_BUS_FMT_SRGGB10_1X10, + .depth = 10, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RAW10, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW10 | RKCIF_MIPI_CTRL0_COMPACT_EN, + }, + }, + { + .fourcc = V4L2_PIX_FMT_SBGGR12, + .mbus_code = MEDIA_BUS_FMT_SBGGR12_1X12, + .depth = 12, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RAW12, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW12, + }, + }, + { + .fourcc = V4L2_PIX_FMT_SBGGR12P, + .mbus_code = MEDIA_BUS_FMT_SBGGR12_1X12, + .depth = 12, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RAW12, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW12 | RKCIF_MIPI_CTRL0_COMPACT_EN, + }, + }, + { + .fourcc = V4L2_PIX_FMT_SGBRG12, + .mbus_code = MEDIA_BUS_FMT_SGBRG12_1X12, + .depth = 12, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RAW12, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW12, + }, + }, + { + .fourcc = V4L2_PIX_FMT_SGBRG12P, + .mbus_code = MEDIA_BUS_FMT_SGBRG12_1X12, + .depth = 12, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RAW12, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW12 | RKCIF_MIPI_CTRL0_COMPACT_EN, + }, + }, + { + .fourcc = V4L2_PIX_FMT_SGRBG12, + .mbus_code = MEDIA_BUS_FMT_SGRBG12_1X12, + .depth = 12, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RAW12, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW12, + }, + }, + { + .fourcc = V4L2_PIX_FMT_SGRBG12P, + .mbus_code = MEDIA_BUS_FMT_SGRBG12_1X12, + .depth = 12, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RAW12, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW12 | RKCIF_MIPI_CTRL0_COMPACT_EN, + }, + }, + { + .fourcc = V4L2_PIX_FMT_SRGGB12, + .mbus_code = MEDIA_BUS_FMT_SRGGB12_1X12, + .depth = 12, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RAW12, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW12, + }, + }, + { + .fourcc = V4L2_PIX_FMT_SRGGB12P, + .mbus_code = MEDIA_BUS_FMT_SRGGB12_1X12, + .depth = 12, + .cplanes = 1, + .mipi = { + .dt = MIPI_CSI2_DT_RAW12, + .ctrl0_val = RKCIF_MIPI_CTRL0_TYPE_RAW12 | RKCIF_MIPI_CTRL0_COMPACT_EN, + }, + }, +}; + +static const struct rkcif_input_fmt mipi_in_fmts[] = { + /* YUV formats */ + { + .mbus_code = MEDIA_BUS_FMT_YUYV8_1X16, + }, + { + .mbus_code = MEDIA_BUS_FMT_UYVY8_1X16, + }, + { + .mbus_code = MEDIA_BUS_FMT_YVYU8_1X16, + }, + { + .mbus_code = MEDIA_BUS_FMT_VYUY8_1X16, + }, + /* RGB formats */ + { + .mbus_code = MEDIA_BUS_FMT_RGB888_1X24, + }, + { + .mbus_code = MEDIA_BUS_FMT_BGR888_1X24, + }, + /* Bayer formats */ + { + .mbus_code = MEDIA_BUS_FMT_SBGGR8_1X8, + }, + { + .mbus_code = MEDIA_BUS_FMT_SGBRG8_1X8, + }, + { + .mbus_code = MEDIA_BUS_FMT_SGRBG8_1X8, + }, + { + .mbus_code = MEDIA_BUS_FMT_SRGGB8_1X8, + }, + { + .mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10, + }, + { + .mbus_code = MEDIA_BUS_FMT_SGBRG10_1X10, + }, + { + .mbus_code = MEDIA_BUS_FMT_SGRBG10_1X10, + }, + { + .mbus_code = MEDIA_BUS_FMT_SRGGB10_1X10, + }, + { + .mbus_code = MEDIA_BUS_FMT_SBGGR12_1X12, + }, + { + .mbus_code = MEDIA_BUS_FMT_SGBRG12_1X12, + }, + { + .mbus_code = MEDIA_BUS_FMT_SGRBG12_1X12, + }, + { + .mbus_code = MEDIA_BUS_FMT_SRGGB12_1X12, + }, +}; + +const struct rkcif_mipi_match_data rk3568_vicap_mipi_match_data = { + .mipi_num = 1, + .regs = { + [RKCIF_MIPI_CTRL] = 0x20, + [RKCIF_MIPI_INTEN] = 0xa4, + [RKCIF_MIPI_INTSTAT] = 0xa8, + }, + .regs_id = { + [RKCIF_ID0] = { + [RKCIF_MIPI_CTRL0] = 0x00, + [RKCIF_MIPI_CTRL1] = 0x04, + [RKCIF_MIPI_FRAME0_ADDR_Y] = 0x24, + [RKCIF_MIPI_FRAME0_ADDR_UV] = 0x2c, + [RKCIF_MIPI_FRAME0_VLW_Y] = 0x34, + [RKCIF_MIPI_FRAME0_VLW_UV] = 0x3c, + [RKCIF_MIPI_FRAME1_ADDR_Y] = 0x28, + [RKCIF_MIPI_FRAME1_ADDR_UV] = 0x30, + [RKCIF_MIPI_FRAME1_VLW_Y] = 0x38, + [RKCIF_MIPI_FRAME1_VLW_UV] = 0x40, + [RKCIF_MIPI_CROP_START] = 0xbc, + }, + [RKCIF_ID1] = { + [RKCIF_MIPI_CTRL0] = 0x08, + [RKCIF_MIPI_CTRL1] = 0x0c, + [RKCIF_MIPI_FRAME0_ADDR_Y] = 0x44, + [RKCIF_MIPI_FRAME0_ADDR_UV] = 0x4c, + [RKCIF_MIPI_FRAME0_VLW_Y] = 0x54, + [RKCIF_MIPI_FRAME0_VLW_UV] = 0x5c, + [RKCIF_MIPI_FRAME1_ADDR_Y] = 0x48, + [RKCIF_MIPI_FRAME1_ADDR_UV] = 0x50, + [RKCIF_MIPI_FRAME1_VLW_Y] = 0x58, + [RKCIF_MIPI_FRAME1_VLW_UV] = 0x60, + [RKCIF_MIPI_CROP_START] = 0xc0, + }, + [RKCIF_ID2] = { + [RKCIF_MIPI_CTRL0] = 0x10, + [RKCIF_MIPI_CTRL1] = 0x14, + [RKCIF_MIPI_FRAME0_ADDR_Y] = 0x64, + [RKCIF_MIPI_FRAME0_ADDR_UV] = 0x6c, + [RKCIF_MIPI_FRAME0_VLW_Y] = 0x74, + [RKCIF_MIPI_FRAME0_VLW_UV] = 0x7c, + [RKCIF_MIPI_FRAME1_ADDR_Y] = 0x68, + [RKCIF_MIPI_FRAME1_ADDR_UV] = 0x70, + [RKCIF_MIPI_FRAME1_VLW_Y] = 0x78, + [RKCIF_MIPI_FRAME1_VLW_UV] = 0x80, + [RKCIF_MIPI_CROP_START] = 0xc4, + }, + [RKCIF_ID3] = { + [RKCIF_MIPI_CTRL0] = 0x18, + [RKCIF_MIPI_CTRL1] = 0x1c, + [RKCIF_MIPI_FRAME0_ADDR_Y] = 0x84, + [RKCIF_MIPI_FRAME0_ADDR_UV] = 0x8c, + [RKCIF_MIPI_FRAME0_VLW_Y] = 0x94, + [RKCIF_MIPI_FRAME0_VLW_UV] = 0x9c, + [RKCIF_MIPI_FRAME1_ADDR_Y] = 0x88, + [RKCIF_MIPI_FRAME1_ADDR_UV] = 0x90, + [RKCIF_MIPI_FRAME1_VLW_Y] = 0x98, + [RKCIF_MIPI_FRAME1_VLW_UV] = 0xa0, + [RKCIF_MIPI_CROP_START] = 0xc8, + }, + }, + .blocks = { + { + .offset = 0x80, + }, + }, +}; + +static inline unsigned int rkcif_mipi_get_reg(struct rkcif_interface *interface, + unsigned int index) +{ + struct rkcif_device *rkcif = interface->rkcif; + unsigned int block, offset, reg; + + block = interface->index - RKCIF_MIPI_BASE; + + if (WARN_ON(block > RKCIF_MIPI_MAX - RKCIF_MIPI_BASE) || + WARN_ON(index > RKCIF_MIPI_REGISTER_MAX)) + return RKCIF_REGISTER_NOTSUPPORTED; + + offset = rkcif->match_data->mipi->blocks[block].offset; + reg = rkcif->match_data->mipi->regs[index]; + return offset + reg; +} + +static inline unsigned int rkcif_mipi_id_get_reg(struct rkcif_stream *stream, + unsigned int index) +{ + struct rkcif_device *rkcif = stream->rkcif; + unsigned int block, id, offset, reg; + + block = stream->interface->index - RKCIF_MIPI_BASE; + id = stream->id; + + if (WARN_ON(block > RKCIF_MIPI_MAX - RKCIF_MIPI_BASE) || + WARN_ON(id > RKCIF_ID_MAX) || + WARN_ON(index > RKCIF_MIPI_ID_REGISTER_MAX)) + return RKCIF_REGISTER_NOTSUPPORTED; + + offset = rkcif->match_data->mipi->blocks[block].offset; + reg = rkcif->match_data->mipi->regs_id[id][index]; + return offset + reg; +} + +static inline __maybe_unused void +rkcif_mipi_write(struct rkcif_interface *interface, unsigned int index, u32 val) +{ + unsigned int addr = rkcif_mipi_get_reg(interface, index); + + if (addr == RKCIF_REGISTER_NOTSUPPORTED) + return; + + writel(val, interface->rkcif->base_addr + addr); +} + +static inline __maybe_unused void +rkcif_mipi_stream_write(struct rkcif_stream *stream, unsigned int index, + u32 val) +{ + unsigned int addr = rkcif_mipi_id_get_reg(stream, index); + + if (addr == RKCIF_REGISTER_NOTSUPPORTED) + return; + + writel(val, stream->rkcif->base_addr + addr); +} + +static inline __maybe_unused u32 +rkcif_mipi_read(struct rkcif_interface *interface, unsigned int index) +{ + unsigned int addr = rkcif_mipi_get_reg(interface, index); + + if (addr == RKCIF_REGISTER_NOTSUPPORTED) + return 0; + + return readl(interface->rkcif->base_addr + addr); +} + +static inline __maybe_unused u32 +rkcif_mipi_stream_read(struct rkcif_stream *stream, unsigned int index) +{ + unsigned int addr = rkcif_mipi_id_get_reg(stream, index); + + if (addr == RKCIF_REGISTER_NOTSUPPORTED) + return 0; + + return readl(stream->rkcif->base_addr + addr); +} + +static void rkcif_mipi_queue_buffer(struct rkcif_stream *stream, + unsigned int index) +{ + struct rkcif_buffer *buffer = stream->buffers[index]; + u32 frm_addr_y, frm_addr_uv; + + frm_addr_y = index ? RKCIF_MIPI_FRAME1_ADDR_Y : + RKCIF_MIPI_FRAME0_ADDR_Y; + frm_addr_uv = index ? RKCIF_MIPI_FRAME1_ADDR_UV : + RKCIF_MIPI_FRAME0_ADDR_UV; + + rkcif_mipi_stream_write(stream, frm_addr_y, + buffer->buff_addr[RKCIF_PLANE_Y]); + rkcif_mipi_stream_write(stream, frm_addr_uv, + buffer->buff_addr[RKCIF_PLANE_UV]); +} + +static int rkcif_mipi_start_streaming(struct rkcif_stream *stream) +{ + struct rkcif_interface *interface = stream->interface; + const struct rkcif_output_fmt *active_out_fmt; + struct v4l2_subdev_state *state; + u32 ctrl0 = 0, ctrl1 = 0, int_temp = 0, int_mask = 0, vlw = 0; + u16 height, width; + int ret = -EINVAL; + + state = v4l2_subdev_lock_and_get_active_state(&interface->sd); + + active_out_fmt = rkcif_stream_find_output_fmt(stream, false, + stream->pix.pixelformat); + if (!active_out_fmt) + goto out; + + height = stream->pix.height; + width = stream->pix.width; + /* TODO there may be different factors and/or alignment constraints */ + vlw = ALIGN(width * 2, 8); + + ctrl0 |= active_out_fmt->mipi.dt << 10; + ctrl0 |= active_out_fmt->mipi.ctrl0_val; + ctrl0 |= RKCIF_MIPI_CTRL0_CROP_EN; + ctrl0 |= RKCIF_MIPI_CTRL0_CAP_EN; + + ctrl1 = RKCIF_XY_COORD(width, height); + + int_mask |= RKCIF_MIPI_INT_FRAME0_END(stream->id); + int_mask |= RKCIF_MIPI_INT_FRAME1_END(stream->id); + + int_temp = rkcif_mipi_read(interface, RKCIF_MIPI_INTEN); + int_temp |= int_mask; + rkcif_mipi_write(interface, RKCIF_MIPI_INTEN, int_temp); + + int_temp = rkcif_mipi_read(interface, RKCIF_MIPI_INTSTAT); + int_temp &= ~int_mask; + rkcif_mipi_write(interface, RKCIF_MIPI_INTSTAT, int_temp); + + rkcif_mipi_stream_write(stream, RKCIF_MIPI_FRAME0_VLW_Y, vlw); + rkcif_mipi_stream_write(stream, RKCIF_MIPI_FRAME1_VLW_Y, vlw); + rkcif_mipi_stream_write(stream, RKCIF_MIPI_FRAME0_VLW_UV, vlw); + rkcif_mipi_stream_write(stream, RKCIF_MIPI_FRAME1_VLW_UV, vlw); + rkcif_mipi_stream_write(stream, RKCIF_MIPI_CROP_START, 0x0); + rkcif_mipi_stream_write(stream, RKCIF_MIPI_CTRL1, ctrl1); + rkcif_mipi_stream_write(stream, RKCIF_MIPI_CTRL0, ctrl0); + + ret = 0; + +out: + v4l2_subdev_unlock_state(state); + return ret; +} + +static void rkcif_mipi_stop_streaming(struct rkcif_stream *stream) +{ + struct rkcif_interface *interface = stream->interface; + struct v4l2_subdev_state *state; + u32 int_temp = 0, int_mask = 0; + + state = v4l2_subdev_lock_and_get_active_state(&interface->sd); + + rkcif_mipi_stream_write(stream, RKCIF_MIPI_CTRL0, 0); + + int_mask |= RKCIF_MIPI_INT_FRAME0_END(stream->id); + int_mask |= RKCIF_MIPI_INT_FRAME1_END(stream->id); + + int_temp = rkcif_mipi_read(interface, RKCIF_MIPI_INTEN); + int_temp &= ~int_mask; + rkcif_mipi_write(interface, RKCIF_MIPI_INTEN, int_temp); + + int_temp = rkcif_mipi_read(interface, RKCIF_MIPI_INTSTAT); + int_temp &= ~int_mask; + rkcif_mipi_write(interface, RKCIF_MIPI_INTSTAT, int_temp); + + stream->stopping = false; + + v4l2_subdev_unlock_state(state); +} + +static void rkcif_mipi_set_crop(struct rkcif_stream *stream, u16 left, u16 top) +{ + u32 val; + + val = RKCIF_XY_COORD(left, top); + rkcif_mipi_stream_write(stream, RKCIF_MIPI_CROP_START, val); +} + irqreturn_t rkcif_mipi_isr(int irq, void *ctx) { + struct device *dev = ctx; + struct rkcif_device *rkcif = dev_get_drvdata(dev); irqreturn_t ret = IRQ_NONE; + u32 intstat; + + for (int i = 0; i < rkcif->match_data->mipi->mipi_num; i++) { + enum rkcif_interface_index index = RKCIF_MIPI_BASE + i; + struct rkcif_interface *interface = &rkcif->interfaces[index]; + + intstat = rkcif_mipi_read(interface, RKCIF_MIPI_INTSTAT); + rkcif_mipi_write(interface, RKCIF_MIPI_INTSTAT, intstat); + + for (int j = 0; j < interface->streams_num; j++) { + struct rkcif_stream *stream = &interface->streams[j]; + + if (intstat & RKCIF_MIPI_INT_FRAME0_END(stream->id) || + intstat & RKCIF_MIPI_INT_FRAME1_END(stream->id)) { + rkcif_stream_pingpong(stream); + ret = IRQ_HANDLED; + } + } + } return ret; } int rkcif_mipi_register(struct rkcif_device *rkcif) { + int ret, i; + + if (!rkcif->match_data->mipi) + return 0; + + for (i = 0; i < rkcif->match_data->mipi->mipi_num; i++) { + enum rkcif_interface_index index = RKCIF_MIPI_BASE + i; + struct rkcif_interface *interface = &rkcif->interfaces[index]; + + interface->index = index; + interface->type = RKCIF_IF_MIPI; + interface->in_fmts = mipi_in_fmts; + interface->in_fmts_num = ARRAY_SIZE(mipi_in_fmts); + interface->set_crop = rkcif_mipi_set_crop; + interface->streams_num = 0; + ret = rkcif_interface_register(rkcif, interface); + if (ret) + goto err; + + for (int j = 0; j < 4; j++) { + struct rkcif_stream *stream = &interface->streams[j]; + + stream->id = j; + stream->interface = interface; + stream->out_fmts = mipi_out_fmts; + stream->out_fmts_num = ARRAY_SIZE(mipi_out_fmts); + stream->queue_buffer = rkcif_mipi_queue_buffer; + stream->start_streaming = rkcif_mipi_start_streaming; + stream->stop_streaming = rkcif_mipi_stop_streaming; + ret = rkcif_stream_register(rkcif, stream); + if (ret) + goto err; + interface->streams_num++; + } + } + return 0; + +err: + for (; i >= 0; i--) { + enum rkcif_interface_index index = RKCIF_MIPI_BASE + i; + struct rkcif_interface *interface = &rkcif->interfaces[index]; + + for (int j = 0; j < interface->streams_num; j++) + rkcif_stream_unregister(&interface->streams[j]); + + rkcif_interface_unregister(interface); + } + return ret; } void rkcif_mipi_unregister(struct rkcif_device *rkcif) { + if (!rkcif->match_data->mipi) + return; + + for (int i = 0; i < rkcif->match_data->mipi->mipi_num; i++) { + enum rkcif_interface_index index = RKCIF_MIPI_BASE + i; + struct rkcif_interface *interface = &rkcif->interfaces[index]; + + for (int j = 0; j < interface->streams_num; j++) + rkcif_stream_unregister(&interface->streams[j]); + + rkcif_interface_unregister(interface); + } } diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-capture-mipi.h b/drivers/media/platform/rockchip/rkcif/rkcif-capture-mipi.h index ee1a50a59505..48d04a60c750 100644 --- a/drivers/media/platform/rockchip/rkcif/rkcif-capture-mipi.h +++ b/drivers/media/platform/rockchip/rkcif/rkcif-capture-mipi.h @@ -11,6 +11,8 @@ #include "rkcif-common.h" +extern const struct rkcif_mipi_match_data rk3568_vicap_mipi_match_data; + int rkcif_mipi_register(struct rkcif_device *rkcif); void rkcif_mipi_unregister(struct rkcif_device *rkcif); diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-common.h b/drivers/media/platform/rockchip/rkcif/rkcif-common.h index 32f6f0238656..99249a85048e 100644 --- a/drivers/media/platform/rockchip/rkcif/rkcif-common.h +++ b/drivers/media/platform/rockchip/rkcif/rkcif-common.h @@ -93,9 +93,14 @@ struct rkcif_output_fmt { u32 fourcc; u32 mbus_code; u8 cplanes; + u8 depth; union { u32 dvp_fmt_val; + struct { + u8 dt; + u32 ctrl0_val; + } mipi; }; }; @@ -183,6 +188,16 @@ struct rkcif_interface { void (*set_crop)(struct rkcif_stream *stream, u16 left, u16 top); }; +struct rkcif_mipi_match_data { + unsigned int mipi_num; + unsigned int regs[RKCIF_MIPI_REGISTER_MAX]; + unsigned int regs_id[RKCIF_ID_MAX][RKCIF_MIPI_ID_REGISTER_MAX]; + + struct { + unsigned int offset; + } blocks[RKCIF_MIPI_MAX - RKCIF_MIPI_BASE]; +}; + struct rkcif_dvp_match_data { const struct rkcif_input_fmt *in_fmts; unsigned int in_fmts_num; @@ -198,6 +213,7 @@ struct rkcif_match_data { const char *const *clks; unsigned int clks_num; const struct rkcif_dvp_match_data *dvp; + const struct rkcif_mipi_match_data *mipi; }; struct rkcif_device { diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-dev.c b/drivers/media/platform/rockchip/rkcif/rkcif-dev.c index 2adf04e46a37..98513feaf985 100644 --- a/drivers/media/platform/rockchip/rkcif/rkcif-dev.c +++ b/drivers/media/platform/rockchip/rkcif/rkcif-dev.c @@ -49,6 +49,7 @@ static const struct rkcif_match_data rk3568_vicap_match_data = { .clks = rk3568_vicap_clks, .clks_num = ARRAY_SIZE(rk3568_vicap_clks), .dvp = &rk3568_vicap_dvp_match_data, + .mipi = &rk3568_vicap_mipi_match_data, }; static const struct of_device_id rkcif_plat_of_match[] = { diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-interface.c b/drivers/media/platform/rockchip/rkcif/rkcif-interface.c index 5dcbf656073b..5ee09604fb92 100644 --- a/drivers/media/platform/rockchip/rkcif/rkcif-interface.c +++ b/drivers/media/platform/rockchip/rkcif/rkcif-interface.c @@ -188,7 +188,10 @@ static int rkcif_interface_enable_streams(struct v4l2_subdev *sd, stream = &interface->streams[RKCIF_ID0]; rkcif_interface_apply_crop(stream, state); } else { - /* TODO implement for MIPI */ + for_each_active_route(&state->routing, route) { + stream = &interface->streams[route->sink_stream]; + rkcif_interface_apply_crop(stream, state); + } } mask = v4l2_subdev_state_xlate_streams(state, RKCIF_IF_PAD_SINK, diff --git a/drivers/media/platform/rockchip/rkcif/rkcif-regs.h b/drivers/media/platform/rockchip/rkcif/rkcif-regs.h index 07fd64174e80..3d1f0c45c638 100644 --- a/drivers/media/platform/rockchip/rkcif/rkcif-regs.h +++ b/drivers/media/platform/rockchip/rkcif/rkcif-regs.h @@ -30,7 +30,29 @@ enum rkcif_dvp_register_index { RKCIF_DVP_REGISTER_MAX }; -#define RKCIF_REGISTER_NOTSUPPORTED 0x420000 +enum rkcif_mipi_register_index { + RKCIF_MIPI_CTRL, + RKCIF_MIPI_INTEN, + RKCIF_MIPI_INTSTAT, + RKCIF_MIPI_REGISTER_MAX +}; + +enum rkcif_mipi_id_register_index { + RKCIF_MIPI_CTRL0, + RKCIF_MIPI_CTRL1, + RKCIF_MIPI_FRAME0_ADDR_Y, + RKCIF_MIPI_FRAME0_ADDR_UV, + RKCIF_MIPI_FRAME0_VLW_Y, + RKCIF_MIPI_FRAME0_VLW_UV, + RKCIF_MIPI_FRAME1_ADDR_Y, + RKCIF_MIPI_FRAME1_ADDR_UV, + RKCIF_MIPI_FRAME1_VLW_Y, + RKCIF_MIPI_FRAME1_VLW_UV, + RKCIF_MIPI_CROP_START, + RKCIF_MIPI_ID_REGISTER_MAX +}; + +#define RKCIF_REGISTER_NOTSUPPORTED 0x420000 #define RKCIF_FETCH_Y(VAL) ((VAL) & 0x1fff) From patchwork Wed Feb 19 10:16:39 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Riesch X-Patchwork-Id: 13981927 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 37238C021B0 for ; Wed, 19 Feb 2025 10:45:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Cc:To:In-Reply-To: References:Message-Id:Subject:Date:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=ctqqB4KQAHsS4i3DPY3i3v1//pnJKOE/2KkcgICq2bc=; b=nNlCalHpuoMDKXHvIeAoBYjmF+ Pe0mQ1dFnw7GQIZuSV2vCucF1RtYpTo+Rwql3sDYI582F3+Z9xi3BEuCzMLKJKzeUjUfvQItS1+cp Hn5HmNRWUqneo/FYbn7RTcp9LgkHIiroP4WZ7d5Qo0fU2vaKVAcqvKTicsWf3ezpihAaIicITphEm fNXQfzX4AKB8HCUDF0fu7FE0UIH7ICr5dWkV3F6yVHjxYAXMGUFHVSlGiE1MAMnpjnl2VsbMOpKPe QQiFtz4aKXe0efwUpIfAgjXIjqZLnXbEDOwHBI1HGVB9nuiBAB84b+O1g7ls6BhkBkJ9pnogPWB/z ynwZe+fA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tkhZj-0000000CCvV-1qSN; Wed, 19 Feb 2025 10:45:07 +0000 Received: from mail-db8eur05on20718.outbound.protection.outlook.com ([2a01:111:f403:2614::718] helo=EUR05-DB8-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tkh8T-0000000C60m-2Oho; Wed, 19 Feb 2025 10:16:58 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Jgo37EmL6nW7YfsXSs19N4ESitPjjwwjBtrvkODffuyrJXSgHoJt8ISezR/Bj/Y2PbrqXsRk3Fi9P15Kk4+4ycO95iNqTv//dtMTxr+XciYTMAlXLdJeNt7Cohq7AQTqGc7zJysBjCcAtigBKySN9/U3dSAmiB7E7G5bhrmVk2dVkmhn4Ll0HZIPASIP714ALLFpQ7ORn6eAaDmg9fNcT0I13L9kozshw4dPmKcwb/bhNaDK10RP9qTaaxx9ug2BrDsrCDRHQivhdC/GLJgSJe0CdQwxmjo1mjhwOv1v7ScN++4DS525O1yCKX+lHHPO+vUu0l7aaZCLlWaNPNiEGQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Iu/nfn49C5pEXaXCCGrNWax4dy7On7ZTpZLW1KudVGI=; b=nJl67oSis3RsahJ594VmogdZYhTSKma6dW5jDIgPX3JSNPKGApXS3zMJNxwASdy9Pp6ItUIhDiangjqgY4IjqiZVugcHfCGxLB+E5cFwREPi4TEQxi8r+1Afpt21dy0+jiaU7Nb1Lhj0oCxkPriyY4qYGr6acD27xG5clREj2qo5lalDBg6Dmfp/5t20/tvZhXTo8jDq7qNwaDxTQn3JC3ubVzZf5AcNw8TBkjPguYWFZpYI+Un4j35g8noM/0z4Az4G7VHKY888LXencCQq8RCHvYYYILvtuAaDvG+A9c5axVzGOactUxP/Ek0g/TnMfmTz8pY+5scgyV4gilUiow== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=wolfvision.net; dmarc=pass action=none header.from=wolfvision.net; dkim=pass header.d=wolfvision.net; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=wolfvision.net; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Iu/nfn49C5pEXaXCCGrNWax4dy7On7ZTpZLW1KudVGI=; b=edrQedPjcBXdkzPOTjrh3Bm7DzQcDNH7Fnqb5hWDN6hewOBbkR6bFPklGGuddfwU0NnQfUBceL6epF+BNeR/eSVaiemz43VghM/Y23/D5swHq3eiFlNV5F+F1xLN5UKf2ZKN4rGUDV5hkJwvDRcbQTMMvjPz4iSMBXDJxEKZ3Zw= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=wolfvision.net; Received: from DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) by PR3PR08MB5721.eurprd08.prod.outlook.com (2603:10a6:102:84::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8466.15; Wed, 19 Feb 2025 10:16:53 +0000 Received: from DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d]) by DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d%5]) with mapi id 15.20.8466.015; Wed, 19 Feb 2025 10:16:53 +0000 From: Michael Riesch Date: Wed, 19 Feb 2025 11:16:39 +0100 Subject: [PATCH v4 08/11] arm64: dts: rockchip: add the vip node to px30 Message-Id: <20250219-v6-8-topic-rk3568-vicap-v4-8-e906600ae3b0@wolfvision.net> References: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> In-Reply-To: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> To: Mehdi Djait , Maxime Chevallier , =?utf-8?q?Th=C3=A9o_Leb?= =?utf-8?q?run?= , Gerald Loacker , Thomas Petazzoni , Laurent Pinchart , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiko Stuebner , Kever Yang , Nicolas Dufresne , Sebastian Fricke , Sebastian Reichel , Paul Kocialkowski , Alexander Shiyan , Val Packett , Rob Herring , Philipp Zabel , Sakari Ailus Cc: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Michael Riesch , Mehdi Djait X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1739960197; l=1271; i=michael.riesch@wolfvision.net; s=20240405; h=from:subject:message-id; bh=B4x8zY3KX5X9wBT8dC0eI+dkSq+U/fBGBr32XMjj84I=; b=wJXulz1wTX1KuW+447TaCtfcqu193E1J8SrF4uXOXa+CpPwEjH26HoKHwRUlJVAxlFhEx0Waq E2d+E0H5raLBDiIf3g/Z18jwmPI7BTmWNpFh4ORUR/kwApmulqoWA95 X-Developer-Key: i=michael.riesch@wolfvision.net; a=ed25519; pk=cSJmgKSH3B6kdCIDCl+IYDW1Pw/Ybc6g9rmnUd/G7Ck= X-ClientProxiedBy: VI1P190CA0041.EURP190.PROD.OUTLOOK.COM (2603:10a6:800:1bb::8) To DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU0PR08MB9155:EE_|PR3PR08MB5721:EE_ X-MS-Office365-Filtering-Correlation-Id: 311ddcfa-40d9-497c-756e-08dd50ce87ef X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|1800799024|366016|921020|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?q?WcUYx0aCjoSWt0k8ZB8RhTCcpKVjuAI?= =?utf-8?q?buv5AaKjXAlXlTFmqCUYJO85hd7RftLr68sQCtXQ16fnFQxpcGoqWeeBTC7yxWZ3v?= =?utf-8?q?28J15ATIpiFy+D3C+nbzoY1+nJoF8g/2rT5R54uqdl12/iAJzVHTeXudRqnl/1L/O?= =?utf-8?q?3Nnj79rwHxwr5KT9MfFQlFCZbU9kguDPPrkjXiVV+CilpmXDHEXNd8lBgy7JZG3vN?= =?utf-8?q?0KwhwCw8kTEUkoJAJQzILpyLrf25uo3626IAboip9JfbRJMRtAv9M+nqr9MfTJP5c?= =?utf-8?q?n91xGYOouTK3vvkHljiVLsnAlqYzqUifDYyfVkCA5J/bvTdeHuswxiRXhjopUUjvY?= =?utf-8?q?muxqhrjuNJXaGHtSFnAHRepCUjcUkxCCFQTjD+g/8mLMyUtNh3uPgekgUuMaGUFaz?= =?utf-8?q?jVUsB6/ZozD1uchFS+YLhqkyT8aWwyFgi/GOu2gjbOEomSZEn1WfDSPvedoNLlHHP?= =?utf-8?q?QHJ4y8SvqbJ+/helI2nmwLbAzA436+j0FANStinNXOyV5SgJh1s2ydkwK1y+mYL/k?= =?utf-8?q?2G8V1YBlwktNzoCpUP9rHdvIAkvr4+uRVzhCTDMcbGBLw9mvhd9nHG4stLgljkI/u?= =?utf-8?q?nmfsLUA5jdHxTdHmquukGtuQ2rcOs9NDQDS3mmvAdoTs5LErWDPodeYrh4im3nYH/?= =?utf-8?q?qYKwDF/LUmMSfJLHuj9Q3Oll0wu0qmDkFmEVs7k5gExkUruh+0mR2NUkE5iBxhxr2?= =?utf-8?q?QzlxaE2o/0OibmGgPciycti97DkMJPcQdihANO4bpiYhBPqRMbWhcYD4g0JJMt7dF?= =?utf-8?q?jg75PekAOhFv8gNcUyF5dzoet0jVaIkXu51Hh0o4rqTh/J/9G1VtSHVD3DhDzifDa?= =?utf-8?q?VIScmTtrK/fZyFna4dFFRQsE4flATrZnL8pV+ZsQCYYmwIW325eXJ685DoK5sp0vb?= =?utf-8?q?wzI2mqZqwEqy5/EzJtOa774R/e7PtAkc4Fer/AUDCm57riUYUiQnVNMGLH0YhUnAb?= =?utf-8?q?lyuxtRJz9e0vU0RDcnaKcse53F9mxgw+p9UBnx7o7BCzDGLJhHtJxxTAfG1aqH9EU?= =?utf-8?q?cFpkT6CiTo97kgg1XTAmsUe5LkOcJ8Q4+O5Q2opmQIV+MI5ccLxwMeqvs4CfgC+aL?= =?utf-8?q?VcCOXDwVZE7dp4B+LxeI/RI3iExO6L+aT/4Ey7IvLqMq5CyNSuvrxBpfMUggBPKIi?= =?utf-8?q?KT8ivtp0xtU5YFY2jOrbfQ6xoSYs6nG7u+5VbZjxngK6TpQ6F5MJRDYBZYsWmpQCO?= =?utf-8?q?MTLgG3yRAOg+pAxwZKXwZITCbvDPGczbf6mATvMXFsYdrCGK9vOhzTk9KWnm3yjYN?= =?utf-8?q?bGvs25DxH6sR6Ied2TfzlWfGwwiXpghfHiTL2QJVhjohcLCxdtgNdttcwU8OD7FWL?= =?utf-8?q?SeyZenj6kZ+SCZnIck5RdtA/4kS8JhQvNT/m/gK16571SFo4KSlJLJR2ZUK5NUe/c?= =?utf-8?q?B7LJMVksCosGA4lKbYGxM43mfh+8/wipw=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DU0PR08MB9155.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(1800799024)(366016)(921020)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?OF4j/0HgqMrT2mZLnWhRrwdIDZ9d?= =?utf-8?q?2uIkbYi4vjZjzkPv6gTHwy2dpdLeBwGo/yUuLGfdoUgtCbvoNzNm1+LvpKyAyB0qB?= =?utf-8?q?KYAA6Whl2jSuYzF74TbN9U5FeNMZ6xx20aZ3gVbi049YR/fLKbSD63lCeFR5SMCyH?= =?utf-8?q?AUddHD/rMxMMFBS5YEDgwYI2AB+dnqugSMWYIWk4C9GgJCCxY+kDKDP6LWhlnR53m?= =?utf-8?q?k0CdTC800qSG2+nUa9cZGO1i9lDHQC3eHh54JiEiSe1I2MxWXkFYrAcw1ETg7xzl+?= =?utf-8?q?JdLzCYUH3C1/M+Iw1br6O1VPW2IggQw4i7cJ2mpXPV2wu45NHjmfEJdWB24VZaNy6?= =?utf-8?q?P0TM9j13gsAX4aJXY0+mitmSLsforsiPi7tYPNwjaDHrXF6imm2w+1cgCIIPVqcN9?= =?utf-8?q?qFXA4UkhAyKbqsXq3EB3NwAi5KdHsyCnat6xevdAzI8k4JRiIvIm8jwA3tOY3sdou?= =?utf-8?q?W3X+m14+SIKU93zIbym6RHKavj4d2luB9zvwXQP6pnFIdONqudt5IoahOd30S5ZdN?= =?utf-8?q?rGCeKV/wxb1zRWHPvoywMAh6eJQuPI2t09QLhw2fPEirT7dx9Xk45S5kMlurtUzTB?= =?utf-8?q?r3eNK7QqWrpx7PxHBtqTCKMhb9PR4ORePbgq7teZ3j9nRPx51zU+3xSgPAT4GxU1+?= =?utf-8?q?auaP9JMpdQbJJrc5F+3OieKdUi4LQ2HU4huDeXlQLIIY9DaFNEEArLtX+/gHYu8Oj?= =?utf-8?q?XCxbU6Aujl0k/OT8gJTPSEmfpdF5tbLazAd3gqDAy0VtIc1h1jIQO2N1NqIPTXsmB?= =?utf-8?q?oazesGCaHZG+LVTL1nAnimMN5VkNUsHWdCGS55U1Z1JtfFgeKp7udHys1+ttptiGE?= =?utf-8?q?M+olmPAD4rOuZJOGpV6JQk39MG++Als49mvrfC8GtVq4PydrdhLyR3Qm5c0QKujs5?= =?utf-8?q?mFaTu/0Q+uqb1FksJIEnzMRaIZbM3a/Imqpu01hO1d7jKJB2xcDuqStauxTj9pKxc?= =?utf-8?q?+kZ3cW8C2Jfa7PzW4MIBGRi6A+eudCXz7rDmM6k9bsrlc1c/9iyx/nFsXeHc2+j8n?= =?utf-8?q?TRiCBKKs3HAi5Nm7LHRuTCpt4JEIcH5lK6sEdFUZvpZ7VNo9UN4tlTCa4LFTXt64I?= =?utf-8?q?jnyJSfEVjetw4pPsrBhBQuCu47CYlVPHIJP7KztEiNUe8vVjjVDYBk98aOLuqE4ap?= =?utf-8?q?A+7OeJp/8xPO9WXjyyH34bhL0UaWbuyTzJtc2lE+njOK21A7bZz69eIpecQJAUBN4?= =?utf-8?q?ctO354HmsXKFn6SwTg0vCsqKBF59T3K+PmmznQo8kImpyeDpSIEa9aypmPb7N9JvQ?= =?utf-8?q?A0lZNbmDHub/iP0F5u0ofmIFG4SJrjdTw7nm7hgZvGvh23xaH0CEJmdTffMkZAyCh?= =?utf-8?q?3F9eeeyboOaF9nWWQX0W4FZ3vVUSECqHe29BSrVy/JAAKWhrIR5z9GCFaycl6T+q5?= =?utf-8?q?XWUfDw6CNxsqt0EihnRp6NZRqXPtmww6mo6ojGvxtn2MxOdPIDj7oJNkDGRWYT9oU?= =?utf-8?q?/v80Rjx1gz4de+hHg9jSrz2HbrzcEroHpp6CakkUZTupHN5uA3qynlYh6fy246m+Z?= =?utf-8?q?HEV/m1S6fknMxt+ES8TMRcBr9Dg/9MvboA=3D=3D?= X-OriginatorOrg: wolfvision.net X-MS-Exchange-CrossTenant-Network-Message-Id: 311ddcfa-40d9-497c-756e-08dd50ce87ef X-MS-Exchange-CrossTenant-AuthSource: DU0PR08MB9155.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Feb 2025 10:16:53.2026 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: e94ec9da-9183-471e-83b3-51baa8eb804f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: xmvjHpm5WpgHbDx6+SAWjJkvVwx2vM0qeR0wFjqalg60cy8aIHmbG5vgSTZhdNiU/IQ6VCuCtpM4z/jXviwZ9esdUtJxKKrk/C1Rzhppu2Q= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PR3PR08MB5721 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250219_021657_623257_AA2074B5 X-CRM114-Status: UNSURE ( 9.78 ) X-CRM114-Notice: Please train this message. X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org From: Mehdi Djait Add the device tree node for the PX30 Video Input Processor (VIP). Signed-off-by: Mehdi Djait [added cosmetic changes] Reviewed-by: Michael Riesch Signed-off-by: Michael Riesch --- arch/arm64/boot/dts/rockchip/px30.dtsi | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/px30.dtsi b/arch/arm64/boot/dts/rockchip/px30.dtsi index 9137dd76e72c..c2acf5952d08 100644 --- a/arch/arm64/boot/dts/rockchip/px30.dtsi +++ b/arch/arm64/boot/dts/rockchip/px30.dtsi @@ -1282,6 +1282,18 @@ isp_mmu: iommu@ff4a8000 { #iommu-cells = <0>; }; + cif: video-capture@ff490000 { + compatible = "rockchip,px30-vip"; + reg = <0x0 0xff490000 0x0 0x200>; + interrupts = ; + clocks = <&cru ACLK_CIF>, <&cru HCLK_CIF>, <&cru PCLK_CIF>; + clock-names = "aclk", "hclk", "pclk"; + power-domains = <&power PX30_PD_VI>; + resets = <&cru SRST_CIF_A>, <&cru SRST_CIF_H>, <&cru SRST_CIF_PCLKIN>; + reset-names = "axi", "ahb", "pclkin"; + status = "disabled"; + }; + qos_gmac: qos@ff518000 { compatible = "rockchip,px30-qos", "syscon"; reg = <0x0 0xff518000 0x0 0x20>; From patchwork Wed Feb 19 10:16:40 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Riesch X-Patchwork-Id: 13981928 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id CEBE9C021B0 for ; Wed, 19 Feb 2025 10:45:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Cc:To:In-Reply-To: References:Message-Id:Subject:Date:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=Sj6Np3ZdhDfqcSytIDF8FEd+z3DgRoS3eH04wvedDVE=; b=w/BRdJEml15XGpOidhUdfa2u+F C4sxL3evJkLAycFsKA6ylXRdkqlBlyhtq/4MUnvTHjK1phBIydctUka8rZA8w//31QcC3QCuYLqen tJSmB4EQPSbv/O2wnTqNk++3bXkumb/WvKdOZst58NqOQEOhkjJZGovryTKOWeQicEucS8mExeq5B Ydc9XCNEIsKPg49w2AOeFk+pA4ocfjLIAS5yVPWURzCPJ7ckfnBlPbxl8Ar65vCw+YwW6uvCO02ZO /Dbe5BOgcJ7oRxcgAPQbvVeBG63KyJBjInlX4qKm1CoYtVG2ZoVpUhIVIxMipusyCNfrPCxx1mnMN ewCCryzw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tkhZm-0000000CD1m-1mmt; Wed, 19 Feb 2025 10:45:10 +0000 Received: from mail-db8eur05on20718.outbound.protection.outlook.com ([2a01:111:f403:2614::718] helo=EUR05-DB8-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tkh8V-0000000C60m-0V1L; Wed, 19 Feb 2025 10:17:01 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=PW61TxOdOs6l0M9ItN8E2EjWOr5neMj/i5W97M8Jz+ro9Ne7bgxO67Derqex4JDXk1est4yy+hnLFu2ZneZUagDbtDclKjaU4BI/fjuLpNn+RHRir+LmmVb/k8Fq2qsLc4mp8tDH7uDqfqHtRAy5ZjRdNtvOgIj9begotrb03pS27F45yHIsgDBXQmFhmj+efcopnRCCzWIayp0dHfekoyfXn9KixsXkz3lTGCMmlbPuxu9KCcnsjXzJ7t3cSL/m6Nc9cMzLymtqwkBQeuH/8K58UgOpWta19BTh/7Zqpdb9hfqxmyd8HQq4fBef/8Ty1MUCnx0qlT4JhDEHMuai3Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=8HthD4IvHLA6stKJScMCSkGvaVS45odtvgDWcqH1Zbs=; b=QQUYE6+Bdrc3MIYr4isbT8F804wFELqoPBa/Y4Vt1PL8vKC1GQphAuxauoGlVF5WP3VyCAycgBajQqhbcruLYuZ1VyYpAtQG+pB0XiILZ23ER25hHIcScW8v5gPnFlBu1nRrRu5dtG2HIRFdnsmBTUo5YFN5OwAym/UubTjoR2C1mqmmAQcW3lJEwE/zGTuehKGVctrfMqyqrr/G4snSKM7vyVSfpqXhyt0o5W8vx8FXamyiA7GrKTjGXblWI/eC/n9J9/nzzYk/hxLj4749NOBMgd1X9ta6DqF9uo+HhmWOwYj7lJJ0oM2SGenZKbMgIbz63RSSPDb3HHVKerSJxw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=wolfvision.net; dmarc=pass action=none header.from=wolfvision.net; dkim=pass header.d=wolfvision.net; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=wolfvision.net; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=8HthD4IvHLA6stKJScMCSkGvaVS45odtvgDWcqH1Zbs=; b=bb/mEnltWN3E6ovFlYskWxxsGIQU3JkdKbuKRTtrVaYlFbVXF7XeqGEB/qLdTRf5aHrEkONk5WLXJWl4aaBsnFaucpjQ4EBYcDFh+fab0q1BoOE1VIf/FXZiiQePyoJE0bWcLNAFkmOd4UAtHv0M6DAGEkJk08g8dPYAq+FZ/0A= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=wolfvision.net; Received: from DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) by PR3PR08MB5721.eurprd08.prod.outlook.com (2603:10a6:102:84::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8466.15; Wed, 19 Feb 2025 10:16:54 +0000 Received: from DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d]) by DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d%5]) with mapi id 15.20.8466.015; Wed, 19 Feb 2025 10:16:54 +0000 From: Michael Riesch Date: Wed, 19 Feb 2025 11:16:40 +0100 Subject: [PATCH v4 09/11] arm64: dts: rockchip: add vicap node to rk356x Message-Id: <20250219-v6-8-topic-rk3568-vicap-v4-9-e906600ae3b0@wolfvision.net> References: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> In-Reply-To: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> To: Mehdi Djait , Maxime Chevallier , =?utf-8?q?Th=C3=A9o_Leb?= =?utf-8?q?run?= , Gerald Loacker , Thomas Petazzoni , Laurent Pinchart , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiko Stuebner , Kever Yang , Nicolas Dufresne , Sebastian Fricke , Sebastian Reichel , Paul Kocialkowski , Alexander Shiyan , Val Packett , Rob Herring , Philipp Zabel , Sakari Ailus Cc: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Michael Riesch X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1739960197; l=1988; i=michael.riesch@wolfvision.net; s=20240405; h=from:subject:message-id; bh=Xo9R1USL/z+d4IAQ/+r4od9eFDQsy0jh6o64qDS6lhQ=; b=9lzmLX1X1WhXLP/R2DfIGZWyO+PWi/5KWZihg+PvYXWlRp/mttqgiXCjXIYfOeurBFqKPY2YH +Us03xR+xjsCyRs3JTdfjAg6rTcsQpR3WmeJ0Msg8Gb4QQzCBoJC0Pq X-Developer-Key: i=michael.riesch@wolfvision.net; a=ed25519; pk=cSJmgKSH3B6kdCIDCl+IYDW1Pw/Ybc6g9rmnUd/G7Ck= X-ClientProxiedBy: VI1P190CA0041.EURP190.PROD.OUTLOOK.COM (2603:10a6:800:1bb::8) To DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU0PR08MB9155:EE_|PR3PR08MB5721:EE_ X-MS-Office365-Filtering-Correlation-Id: 0c0daf46-9451-4352-c0ca-08dd50ce88ec X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|1800799024|366016|921020|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?q?DPQczow5hCdRwn5eP01u450JltTC4zr?= =?utf-8?q?YWICQTkoBdfmMVfy6RHaEMTXiESnnKV1ddEtjugdgKvTruJpvT27IwA6AjWpf43Km?= =?utf-8?q?IctoBiFn9OZ4SeuRo/VF/cn8afkdGeYTSRpPmZoL22hPg1Leohogp/7TsvTedfnIJ?= =?utf-8?q?VvY4/MifWP1OxkDTie4T2r3w42QSDKr6AmJR3uWKbMnzf77UPzQwM1wIorJmPrUI4?= =?utf-8?q?hG2NliFu1I60Tfy1q2lK/dsl0nIIsgghUMtslt/ot7XMVlc7hQYu6b+OVlvQMW35t?= =?utf-8?q?weWHmloAtBCXWYSJulXOZIeGHtzpYaM9A/WWLvvz48TgUUc6aAXGMtf2Qof9UAB9L?= =?utf-8?q?iHXujVpO9E/0t+KzVompz0makm/OWjEuzLqyKK/TqbbAhCyfgF4rzTKoUf89BrtLG?= =?utf-8?q?Kn2NagD1j+FnvRDwhTtc5y32dohcfP8oCMm2cvMZflJgL53lJxzsfg01PTZqCRDo6?= =?utf-8?q?ltKhc2nAC2YxhIzBHd58I9Bw1powO3ncm4j63VU+neKZUPPlkFMshzwdSEY4u/kNh?= =?utf-8?q?+X/+XuVN9mnNAcKJvhz47ufCrF6zhqS1JhmXuEEUSfsfNIpkwO9M4zWyszedco4Yw?= =?utf-8?q?lyVaWQobZWipuLNoMiVs9k2Z11c+Vwiz9VC5slorF9gablFqrmqNjVcQSDVOful+T?= =?utf-8?q?fA+naCXt2MUy4N6JjwylazYnqqbeSw8iGdigHSLYcSUElqGsqv+bPbeg3ovxFbjI/?= =?utf-8?q?6GJWVtjQKJoy4xw5W10kEXCr1nzzEsDkBniOu9t0tDF3pndZyWv1/6l14uD2KFn4d?= =?utf-8?q?fg94wLWD/1xWppQrH52VG5o7wDCwrbhi0yq9G39FycvL8WODWd/BM4JMlXRTysztr?= =?utf-8?q?gjy8lpaFsD4DQ/TXPl1wvJnN2bQ5ozyS44zRAJj70HZcYI0QR2i5hrgwshKM5eBBl?= =?utf-8?q?YXOT4YqaxLpoReyqIIKSQ0U2BQIlsgAYKhUkqKhO7FPeXkxdWoDMKH6yNKTgR/hM3?= =?utf-8?q?uiOrdj+9zKOt0lcZ/wXqN8OT6+4GtcdxEnNvQ0aGpY5b9DFk1cCHfRGjeN4fsQjq1?= =?utf-8?q?wa8MZ0p56tYyZfvOSg65ZLawibl0X5+Xe/g4vrJxlSPNROwtm8o/wfXuJG66oknZs?= =?utf-8?q?x9o5izkzHJ8rGu9fBkjYWFv3YAH+ZNDo9vk9rf9vV4AB31Fd0qXgoMC8p/xh3CqDj?= =?utf-8?q?IJCAVtunUiALxnVlRFAZykZa3WS8adm/9kfVQN3tATurx2cjwV69pLLQTnpaHdGAW?= =?utf-8?q?GzubUYSpfEjRXCS7orkQpQLAmcAnkMIuVvzmGoLwyI2SGnHEGFq01Md51eA52cbhg?= =?utf-8?q?5RGMuIwGboizcdGqLFipW1nSHvWzVJFcM7mkaH4gi7g8PtzAPHk+VvX5UxxSjMrSU?= =?utf-8?q?VvRIJcdTgpU071nobd1P+/VNmaiOamGN4nv6DQS2tJoFJ7l5ltatnVJBPb4mD9cUP?= =?utf-8?q?35/ACHZas8e?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DU0PR08MB9155.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(1800799024)(366016)(921020)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?uv6u9lagRc+eGf3+QY/HlyacXH8M?= =?utf-8?q?dayS7C/DCgnpouwJRoSBYHDw/ZeatJxRuJSSrFr+9Jg364dVP0oZ8ZUKUcWUf75oc?= =?utf-8?q?aGbYup7ItRwpCjVdJk+uzQM7Yx3aFnZ/6Sf4re1j8Nsf0syO85nP9anVPKThKJ1th?= =?utf-8?q?Ob0Ra8Ya2EjfM2YTavHgWjkEL8Ik5af0PZjWgQuNSkHcaCPWA3nP8pHDHhe013MKm?= =?utf-8?q?GtZPvIyPRFGikrxCz1OYRi0y65AFJYJYlCndG3QJJAX9qNLkXB5p05dE9i4653Zg2?= =?utf-8?q?V45Vl+eKjYMQ+T3Y1cU4Pcfg72M1RU2/3rCgwhYS8Csc0luKkvSgdVXjIoUsX8TEz?= =?utf-8?q?AldKzmBd5ctQnwAa+yX2ogEFW2p2Xid+HvAqD3YSt24/oti69wpCteQWW4FHbQARR?= =?utf-8?q?bGPCY5vxL0thYjqIPU3NDDaUHBlONM73IezLO9Jn8JVxn/qxNOo3tqZralklPJsPb?= =?utf-8?q?TdaVwnt5WsgJqfFxMTalwQ91h2WahtsayokvoYFJ+twErV3082ReDRer1d54/nkYR?= =?utf-8?q?E196CeyM3xLoR0m4SMh4FpfqazBdRTqdQTu/1wLpLoY2600D1uKhqLyuVHGzxQEnZ?= =?utf-8?q?j1CKJUtVKP74QaRSy/xcun0PE3lKifu+xoWellMKaUsfFcRritU4t0COTM8hwGexf?= =?utf-8?q?kFkPOq7bLkCs1WVZnt12qUbW0wIEZadOLMUelPd4Mpnj67s4vSAozJlrtRogmRD3f?= =?utf-8?q?VQ9xqAWDB1vd6pHDPzdjD97OkEVrzyFDFrze5T8GGwgsdMquwgd/N4DsC4MIQGjJq?= =?utf-8?q?VNd7Ff+3CLf5hxg3YOZoVAsr4jdrbf5ZlNwllDOr4nDlt5ikv2ZygsdwP3QBU7APz?= =?utf-8?q?xsg1kgFtJK+ixcRtaABKp/8zF7QSyKSTo9N3Lf8Xeg0+3AgGXtOrItcKnNIJu32XI?= =?utf-8?q?BNmDmYMRlABLzka84cI7zAqK5gwdbIrH/DMMY4ilUWuWiPNmN4vNTe02xK2HohfTZ?= =?utf-8?q?nx7yBJ8c8VuX0nfKZzLvrhKMDxBvTtOez32sidgJG46rhldekCcvHRXkcH86sZUkk?= =?utf-8?q?J3H+sW27wtvj+u06fPfyRUCU2h+rJh3Xch0TAEcGCz93AjzmphnYCIXK1nrfZc+2W?= =?utf-8?q?JPRzVV5+REUzMiZXyYj0K5CHfjQZ7DM3ekswtoWi/Y4Fl+xesRDtnb1h9tPG+IH6n?= =?utf-8?q?jx8/tzCvVAB8x5vbhC/LIKdM0EIDYELMjnbveDDt8JBbevd7OYFo5nT//yBDcF2zC?= =?utf-8?q?F/qwCubvD70B5CzjtmyFSjPXXKBZAM8wyC+4ZfBwjBxqqBHdoldfF/xo26hoXvyL0?= =?utf-8?q?z8kXvnmUiwTYeeBkHqonNZ7xahICutg8KM212Gok1TNIe/yI4NwBkQ75zQ5VeDvfq?= =?utf-8?q?/5MDGTMdawmRndFaCA/ajp08BRc6Hl9TiV3AFGog/CzPPYREvLfktQ5Gtb+lEGM9O?= =?utf-8?q?j6pHef3HkxGw0lzF0LIOauLo/pg18E72F43NeZpX1IQ86M6Q6y01z6LcYFCj9LUDI?= =?utf-8?q?udGtx1/tk7SN+sXv2R6Ih3chtK4Zsw7ulbu/9mA+cEpgcAw2mJnkngVVmixQv5Mrx?= =?utf-8?q?UI8hl0E0pbuRIuXYK40UkxgRmu4LEbusjA=3D=3D?= X-OriginatorOrg: wolfvision.net X-MS-Exchange-CrossTenant-Network-Message-Id: 0c0daf46-9451-4352-c0ca-08dd50ce88ec X-MS-Exchange-CrossTenant-AuthSource: DU0PR08MB9155.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Feb 2025 10:16:54.8511 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: e94ec9da-9183-471e-83b3-51baa8eb804f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: v+Blgqd2WN6viPJz7uPeCzJu0JNiKlGyTB7KmRUNPPhE3nxTpsJmDvd7DEMBjSe6xFYrF3RyLjr42xdhvqheDAX8xSuxlfTc62ij3RhPFJw= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PR3PR08MB5721 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250219_021659_174533_C51DAB98 X-CRM114-Status: GOOD ( 10.38 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org Add the device tree node for the RK356x Video Capture (VICAP) unit. Signed-off-by: Michael Riesch --- arch/arm64/boot/dts/rockchip/rk356x-base.dtsi | 44 +++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk356x-base.dtsi b/arch/arm64/boot/dts/rockchip/rk356x-base.dtsi index e55390629114..cba5092dbcea 100644 --- a/arch/arm64/boot/dts/rockchip/rk356x-base.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk356x-base.dtsi @@ -553,6 +553,50 @@ gpu: gpu@fde60000 { status = "disabled"; }; + vicap: video-capture@fdfe0000 { + compatible = "rockchip,rk3568-vicap"; + reg = <0x0 0xfdfe0000 0x0 0x200>; + interrupts = ; + assigned-clocks = <&cru DCLK_VICAP>; + assigned-clock-rates = <300000000>; + clocks = <&cru ACLK_VICAP>, <&cru HCLK_VICAP>, + <&cru DCLK_VICAP>, <&cru ICLK_VICAP_G>; + clock-names = "aclk", "hclk", "dclk", "iclk"; + iommus = <&vicap_mmu>; + power-domains = <&power RK3568_PD_VI>; + resets = <&cru SRST_A_VICAP>, <&cru SRST_H_VICAP>, + <&cru SRST_D_VICAP>, <&cru SRST_P_VICAP>, + <&cru SRST_I_VICAP>; + reset-names = "arst", "hrst", "drst", "prst", "irst"; + rockchip,grf = <&grf>; + status = "disabled"; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + vicap_dvp: port@0 { + reg = <0>; + }; + + vicap_mipi: port@1 { + reg = <1>; + }; + }; + }; + + vicap_mmu: iommu@fdfe0800 { + compatible = "rockchip,rk3568-iommu"; + reg = <0x0 0xfdfe0800 0x0 0x100>; + interrupts = ; + clocks = <&cru ACLK_VICAP>, <&cru HCLK_VICAP>; + clock-names = "aclk", "iface"; + #iommu-cells = <0>; + power-domains = <&power RK3568_PD_VI>; + rockchip,disable-mmu-reset; + status = "disabled"; + }; + vpu: video-codec@fdea0400 { compatible = "rockchip,rk3568-vpu"; reg = <0x0 0xfdea0000 0x0 0x800>; From patchwork Wed Feb 19 10:16:41 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Riesch X-Patchwork-Id: 13981932 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 23B40C021B0 for ; Wed, 19 Feb 2025 10:45:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Cc:To:In-Reply-To: References:Message-Id:Subject:Date:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=z6sliKZw+fVMxL0bGQZZfav1S+WFBh3XQj0UHuaoJ90=; b=ZiaGrsVNV10CI+Ls0l/wilg3Z5 sP8qg/8r3SbdPj3RWf0uyGTQ1zHbcfQO13QLcJKOXuW3vTSs+KJxm0hL27L9EJ5Wy3rnD5fMMucXb f1ZZDgME5RCDyqAGqYv9vcRrNOnkrshOgKx3eGFUKgC9DW0bn/8UQply6pSoH9z4R59i/0HiiJLES j0WP4x9atd9qrTkfZ1iBHePfvPm+6KBWQXwWjY5YstTKcv3gncb06BeZ1voeQrttQDkX80N/JjSVC KzpA1895R99wltRLmqYxceyTbNzOeorkWxGbv3RPYO/8x6r+CAsUdxemI/oa8UOlht8fW6Z//p5WW Ox73BKOA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tkhZq-0000000CDBQ-2Xp9; Wed, 19 Feb 2025 10:45:14 +0000 Received: from mail-northeuropeazlp170130004.outbound.protection.outlook.com ([2a01:111:f403:c200::4] helo=DUZPR83CU001.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tkh8Y-0000000C64X-2Ztx; Wed, 19 Feb 2025 10:17:03 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=wuJ0cdhGv0qmKGW6HNhe65GMksE7jZaomEldPNglTaV2on4WdYxS/Imh+UXYI3LEWDrb1SYccc2omzjxjoMc5dsur7/M25le6V9AuUo0JzMBb9lOVwmbFW5WQ96qgb+wvxPNU9Hu1ktI8NTjvyMQvDjfq347R20xsJol/8XrGbSJfn7RgFD9hzi41tEJM4eO88jxYnZnPR7auJZEHl757pl9WwItRMahFNAmmATj3lBeZ7bS2qNFj7OgbPM6LWTD9tJ1tFJtJhR+V9eKT00LCx0z69No368ui/Mo/phwwYNWwOfHtP9R38yZLf0IkfZXVAUfem0lwzt6nnVH2sSByg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=ZFyoioX6467zwq6ZGo9ejTrdS8/9Ksz8xL2PAfJ8Pi0=; b=rK2gB4nKbmQE90M9jOqcSGT1aHtvdkn2lJzehcAghfrgfS8joAb29k4j0MGug7Xl06tr4f8/9ELvQKAnV8hhFg8XE3j6oBpj2SJ6sunvUDRlIOmERxNdR0o9ZllykUGIQi1PGuzJEZBGUuolzvJ04aR3kN/ylI0CssdHkASmfpxpePaD3tvd+UbaWD7V50Chp0aMz3ErdD81IpK+0shEpY0zauRoBdgZCHymXA8wdDf2gSmtrR4Q6DH+9wXWE4M7FDgPni3a19gJ6yJ8ZCTSa70LrE7MMh0+T4ZeRs9mZYtkntjWts46bh0E9akc/+NsRazzdCOBJ/QsQk5UzW63qQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=wolfvision.net; dmarc=pass action=none header.from=wolfvision.net; dkim=pass header.d=wolfvision.net; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=wolfvision.net; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ZFyoioX6467zwq6ZGo9ejTrdS8/9Ksz8xL2PAfJ8Pi0=; b=L7sg80PVh5HTq1ISUsLvL0avxRV4hm+L9I875KUjGYLC+A4ugrpfVlEEyp831vZaMgbt4fFxR7Aymz+I0fAQSmYotpamnWVW3+67ar8JtNNDrWxRZk3l8MOhb5/0zDz1ZalRU5+sv5dMUOkALiqYprtBkj4DnjQHs7C6qDabuv4= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=wolfvision.net; Received: from DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) by AS2PR08MB8384.eurprd08.prod.outlook.com (2603:10a6:20b:55b::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8445.19; Wed, 19 Feb 2025 10:16:56 +0000 Received: from DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d]) by DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d%5]) with mapi id 15.20.8466.015; Wed, 19 Feb 2025 10:16:56 +0000 From: Michael Riesch Date: Wed, 19 Feb 2025 11:16:41 +0100 Subject: [PATCH v4 10/11] arm64: dts: rockchip: add mipi csi host node to rk356x Message-Id: <20250219-v6-8-topic-rk3568-vicap-v4-10-e906600ae3b0@wolfvision.net> References: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> In-Reply-To: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> To: Mehdi Djait , Maxime Chevallier , =?utf-8?q?Th=C3=A9o_Leb?= =?utf-8?q?run?= , Gerald Loacker , Thomas Petazzoni , Laurent Pinchart , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiko Stuebner , Kever Yang , Nicolas Dufresne , Sebastian Fricke , Sebastian Reichel , Paul Kocialkowski , Alexander Shiyan , Val Packett , Rob Herring , Philipp Zabel , Sakari Ailus Cc: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Michael Riesch X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1739960197; l=1478; i=michael.riesch@wolfvision.net; s=20240405; h=from:subject:message-id; bh=0rHJn8xavEahuQRZGeeiAOQU7fRc2kjaBfHUQLOe/bI=; b=PUTH8k/Etcu0yH3aM/0kAAY5BE+evSiPf8VY4SjgYBz/iQz6VYoHk+RdmRPsg81pO2PfNeOvu N6hutZjVbBjAR8u0/ZXfho0iXqs4SDPd7LCHyOXDc16gFDxDmAP36Es X-Developer-Key: i=michael.riesch@wolfvision.net; a=ed25519; pk=cSJmgKSH3B6kdCIDCl+IYDW1Pw/Ybc6g9rmnUd/G7Ck= X-ClientProxiedBy: VI1P190CA0041.EURP190.PROD.OUTLOOK.COM (2603:10a6:800:1bb::8) To DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU0PR08MB9155:EE_|AS2PR08MB8384:EE_ X-MS-Office365-Filtering-Correlation-Id: a54725f0-d47f-4f30-00a7-08dd50ce89e2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|366016|1800799024|921020|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?q?jYreIqu70l6RmHEE/vZVIHSDGjFxzgg?= =?utf-8?q?MqDcAtgnbNac7AAy/IQuN65LGd3n2Z8nnHImW1ul75IXcquZ/B8zFxjBJ0EGsZYi3?= =?utf-8?q?ldknizfUOOb/9wKa0tBUY6ikrBedyBOEhjyiSmZ9ZTyuEFQDqf20ibDHehzzF8mV1?= =?utf-8?q?w5V6tTg2v+Xe6bdqNYjP92vC1/KU2F0wSHJTg9MI2Zx9d7T8BaHwC/B5LHZ50GOHt?= =?utf-8?q?ddXA9dIedF7cHL7oXY5yuC1BEMBEPg3uKbYd7UvEPZG4m6lOPkLDH3trlksa6dmA3?= =?utf-8?q?U4XGaviHL2S2Wkeiopnt0pUatltlSwq2lwSmBJdbGIsAbVjj4IeUY8pW0b6hvuCNk?= =?utf-8?q?Rnn6LB9B1lQBbPsi5L5TmTlG6u5hD8hPf+jrVnEMaFGPA/aOeB/fq9QDkt/x5zMOk?= =?utf-8?q?QJfsHRlIB0uD+BRT4M6aDPzoDpSJSdKSah4WY08ltzWGmfplL6jWIpPybRd0H/ejJ?= =?utf-8?q?iHx7axSWqYrYUBEfkZAr5jE0fGZT0wnrRGZaSldm9lw9p913ru5DCIeBWBY/Af2Dr?= =?utf-8?q?YwXZzuLCZ1QK/yMMKs2suEzFKOPcgo6ftxcFmVMvjT0CjHRKY7M5hfHE/7ydu+wyw?= =?utf-8?q?U3LPUjXWpsdj3SJWmN4SKKR7CfCBxudDreUP09t853qhtroREUq89+ms0AYly2TdG?= =?utf-8?q?DWPK7rf0aW5mtbKIlQTmx4gvYrllFbUb1FfYZ01BIxWWygUV3dqHSPFsTWLqM6IoX?= =?utf-8?q?bezkfB+3xfWWLIlfuLNpgzkXYzkXmDqAVtR9A8KBqTudQNMfZ415wO+bkltGm5Fta?= =?utf-8?q?bblIC91Wz0lirgrUDT8v9qGAiu4NJktV39zwO1iR7wpsAHGMF4PF4EUDU6lmYuS70?= =?utf-8?q?lZ0TDCQlCc/IeMeUNG/wdUiNoFdNWeePoqBsvD1UARkxRNzTgtWYk4GCTHkBt0OK2?= =?utf-8?q?g2NtAFIdCvC/gcGMhMqOBnL8V3B31oJHXpmdPbQneBiKhQjOdCtqLSppe2rBEQQFZ?= =?utf-8?q?H28N8aVJDeNtLkA7I1pcQY7sM5mPhCt69C8rHADiKVyeAIXRTz4ZX+EfWyXjwP60f?= =?utf-8?q?QxO6cBEHsMBhWmW7PLRrrr1zk9J3CH85bO6l5NqOn5evwhC0tcKRqjFbschDJzYgJ?= =?utf-8?q?LarHx2kmvRMX+4i3UTOgifJfgeScn1tvltYjQTV1AGo4lRmWKRMdZKYCjaRVd2WQZ?= =?utf-8?q?Ot5woPP77W5yGMBI5dGGP7N9cj851UJzoO0dkhOzoh4tZaeM8SCGGmdUjwes2Dq8o?= =?utf-8?q?jPXREK7drE8kWiLSZCV18lAx6mHHQE8XSkB/WIIZnJDj7r0Wp/rZoEm0Rn7kJOFPu?= =?utf-8?q?sr3zAgJ7YK7hovyCjUc2dmMwAqKRctmk2tuZPQ57OpvrPE0b59A/1sNkN/k9VuIHe?= =?utf-8?q?LO7/PSvhSIFu9BZeq9PbN/l9O9g0vbn/oeUWOyEYs14c4elmrIkrXveDe2u1UFNlr?= =?utf-8?q?Y+I4zza/CWfQXiEfs0kv9xxYTh0HglnDA=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DU0PR08MB9155.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(366016)(1800799024)(921020)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?mNzVZIb/Mi20gyBvRMzY/pc0GjuC?= =?utf-8?q?IEsKhX2/DgKGlfCO/vRp1coWenUJiGNViJsZpjH4RLRymwyVWY4f19CQX5eLHSLCo?= =?utf-8?q?GYJKDslciJoRgd2CoPrdqK4jLabJS+I2K0z3AlUWBy9QuMZ1vd+jnZ+JcdygultGa?= =?utf-8?q?RwD6cTuSgCzNUsWg3V+xHbeHTM8a67mLidpmUfd7t6SSVoCA3P+SUb3az2amBvP4O?= =?utf-8?q?cYkxBwuTXVMtNSEBjkEc8pbQmpxuKi0HG7SrS0Zgt8u07lHL+QrQ6r6ox8ZMmCsPu?= =?utf-8?q?wxBqfXZoj2/bl0fFOzcL6f0cbOn91BrxoM+cCjzAwoaVyRpHWohIdo1YeXSFt+1n6?= =?utf-8?q?Ve2g/MG9s+PpMusxMMY8v18OOlFwzPzDIH91hj0uXCShGYTtjxQcLpE4/5AjJ/nzA?= =?utf-8?q?+poGBpqxd3PhBIfi1aryngiQVeogmqt6l++Tt+dQKeds90JgHz/KWN7FpOgn9mz5b?= =?utf-8?q?cSfuF7tX8v+fcQLMXZ7+5sS99PiIBwk+HwGQoc1jsazCOXPpUwzslPCb9ryevy8Zt?= =?utf-8?q?n+sgSQP9h0LexJf43KashuJOuN0pAM9mgTYBFQ0G4SsYg/Rm2v8MHPQCb5ZBUqOVo?= =?utf-8?q?trJx5ZzytFMvJsoriLwiu890zyq5m7GAC/sEDA8BXEQZA1+9fnK+Bujk9QfT8ZEvQ?= =?utf-8?q?ysZxvMRe4IffX/11yD/m4HKes1C03QoImLQCQ2d69eMrmlFBlHqp+ZeEDkdDh9FQF?= =?utf-8?q?4UM9VoepQ3aDZr9t3yTwestlOeseN6lRvqo8g6WqM65so67W/Lss0QSpPYVtSYRBf?= =?utf-8?q?fnYB8VKnFviZyZu4/rs78kL9kb0zruxlmsgltKJ2RDwvAkBfF+Oe+u00zURL7Fss+?= =?utf-8?q?4EJEdb4pvXc8l74zWxlCu7bvhqDNa6I9UMGx08Qmcoyr7aEy+c9gIjCs4hudP8iwu?= =?utf-8?q?g40mAShtJU7OTRb7h1zul4h00D6wPycC7C6jeEYinl6xthYVpV4feupz3lZwyS6kS?= =?utf-8?q?cJTxOCYktbkLxFjVA0XLu8Wa4bfSiBrLaVLHUq5331C4XuZKcp8+k8AHFAGZrX8sC?= =?utf-8?q?dQCZY38T2ClWZB5Fx3udbsZqu3r0WL4VhWwHr8MCJdskGxUMz/JwzdEa2lWfsi4c6?= =?utf-8?q?NssNs4nApY8+jcnJ7yJnB1CvFVyeN+txwDuNDMR7fFFIejfFLglxxfu27CFH7K3Rl?= =?utf-8?q?i3tY3HulimpWATsLUL48gZswgzD5SMlCZ3+u5FKDNHHeW/C/OL858tQyeS8kaYjsj?= =?utf-8?q?poIWoYM54Wv1fnlwfTinqkxdcaDelUdWmkZp5MZsJJ2sMzq4N6HZpw6f10PqbQgGs?= =?utf-8?q?2pEodm5tP8Kp9v5795V0yyK7c7+DRLK1UBcdAQou0z7OEYLyNUH2AkPZGgn8A7LO0?= =?utf-8?q?ctmvfYjH26P+NAbQb70RlZvkFXZdZnD4ctp0yU/gAtZBmRk+ikXtQPLZKJnpcxUcb?= =?utf-8?q?84/Fav+Ko1NU8zKXJy+2CTaNo7+4gdcW9ucfTTTemSZtE8Ls5xqNzvoRu90RNxmdA?= =?utf-8?q?hMjAKk89qxvdVe8/+sWvJpFdHC9BcZFPgmo6LZFLLNdVQZLKDKaOrYQwUJrKhp8vv?= =?utf-8?q?8t7FWcPT7Hg5AU9d20wE2wRNFq69np2nBA=3D=3D?= X-OriginatorOrg: wolfvision.net X-MS-Exchange-CrossTenant-Network-Message-Id: a54725f0-d47f-4f30-00a7-08dd50ce89e2 X-MS-Exchange-CrossTenant-AuthSource: DU0PR08MB9155.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Feb 2025 10:16:56.4502 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: e94ec9da-9183-471e-83b3-51baa8eb804f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: p9ABLrPCNONbLQ5WV28FyKv6JyeTLvqV6RymAqBokKCC4LhQFNg8GfyCf/XDhvJ/cKDRmaT8DjV/52WihAUEyg7dt22zO6xp7ymzpUsVm1k= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS2PR08MB8384 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250219_021702_681817_D28FE896 X-CRM114-Status: UNSURE ( 9.93 ) X-CRM114-Notice: Please train this message. X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org Add the device tree node for the RK356x MIPI CSI-2 Host unit. Signed-off-by: Michael Riesch --- arch/arm64/boot/dts/rockchip/rk356x-base.dtsi | 32 +++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk356x-base.dtsi b/arch/arm64/boot/dts/rockchip/rk356x-base.dtsi index cba5092dbcea..5957349ca865 100644 --- a/arch/arm64/boot/dts/rockchip/rk356x-base.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk356x-base.dtsi @@ -553,6 +553,34 @@ gpu: gpu@fde60000 { status = "disabled"; }; + csi: csi@fdfb0000 { + compatible = "rockchip,rk3568-mipi-csi"; + reg = <0x0 0xfdfb0000 0x0 0x10000>; + clocks = <&cru PCLK_CSI2HOST1>; + phys = <&csi_dphy>; + phy-names = "csiphy"; + power-domains = <&power RK3568_PD_VI>; + resets = <&cru SRST_P_CSI2HOST1>; + status = "disabled"; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + csi_in: port@0 { + reg = <0>; + }; + + csi_out: port@1 { + reg = <1>; + + csi_output: endpoint { + remote-endpoint = <&vicap_mipi_input>; + }; + }; + }; + }; + vicap: video-capture@fdfe0000 { compatible = "rockchip,rk3568-vicap"; reg = <0x0 0xfdfe0000 0x0 0x200>; @@ -581,6 +609,10 @@ vicap_dvp: port@0 { vicap_mipi: port@1 { reg = <1>; + + vicap_mipi_input: endpoint { + remote-endpoint = <&csi_output>; + }; }; }; }; From patchwork Wed Feb 19 10:16:42 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Riesch X-Patchwork-Id: 13981931 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id AB4D1C021B4 for ; Wed, 19 Feb 2025 10:45:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Cc:To:In-Reply-To: References:Message-Id:Subject:Date:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=KwAw6NkISwYWCCCPou2/IWy/C8pnbrpAlR4wGi/ii2c=; b=dlvljRblA4L4WO6cVG6yBKwLYd B0Pjtp9uqol8UA7qoDkJSvaq0124UIrWiTQac250u8wtkArkqojWFnrN6zx+NTyIBTjKZXc0GIwbN n2K6jZ2ZYYsSOY1v16E/HjH+AKiNLKuQt1izeIhEvJlL2IScUSfuyPSavcI4Z5RTlz7Uyn5K2TBpZ xmn1RyGWa7H6W/a7z6FLXaLffLY3c297njlcdkGcCPQNyFT5u+cORPCWruGvtpGFvO4fkuczsUM9G mwMJ5azLRJyNz9YOmky+KkTn56wgnhiQIvjZ8ROFxWNVWHCWX+OTLttekyuPVKJT7qt8lSCHL/LU8 xDXc+nHQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tkhZo-0000000CD5d-0UP4; Wed, 19 Feb 2025 10:45:12 +0000 Received: from mail-northeuropeazlp170130004.outbound.protection.outlook.com ([2a01:111:f403:c200::4] helo=DUZPR83CU001.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tkh8X-0000000C64X-0DgH; Wed, 19 Feb 2025 10:17:02 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=b9ZJ0ullV1uoHTYMrpbyd0tsYWdPZ2W2Yfz2ZIlt34tEGy+W7XO8IBaow3zQFNFBK3DDgC2/QnxUD3fLCiba3nyhAFVCu8Gg1mgY16ASUOL0JvcC1whCrSO52f8fBOXoUr2k5o95FnxyEtOMFzvonguRMmrfZoya2cMW74Gq0WjJ1S8F4XHw5rM1BgxKxLSNWgg7d77OGsuu7YG74d5+n6DmSDdt6On/WlCo5vGwTuhQludkC06VmubTX00+sGwgv7bpw93R/w68WRdQDsj6ugWJqNBIVfJcNNXL6p1QQ6xT/6GphkLMMxtYfF9MUcMTMHC5TYxhk3PLgszu0+9G9Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=GADnoYshuvKf8MjgcGBM075hZ+scoIrwJ3loAJXtSZE=; b=OWjGUSodPZB4Q+ZQ1ezeGXZn9d4VzKHX2xuXECgfHQNd4EHXAE7gBs95/gMCEOwqRafSOz/O97jFhPuKOddU+NO+vB/tlF+cXB0TBlI7ZCRfls9uBPUEwArdAGf8xCCeIl+YyJnMR28oAFazXqTRvOVCa0iy3fCA2h/KOuvNQog1nGH/1Gquzf6NSfsBaqt0gJQBy/vCyUccXA1U1UaKowrHmlnpnXM65XMSn4SylMZX2n/eYUskfYliX9ENEY3V4zS2bg+GwCG75eui40QNZ41oFDW0iCTYXZHUgpLq/wxLYJ/hrAkvDjwUcXBbHzi2qdfzEi4HaKzxDmLupj8j6w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=wolfvision.net; dmarc=pass action=none header.from=wolfvision.net; dkim=pass header.d=wolfvision.net; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=wolfvision.net; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=GADnoYshuvKf8MjgcGBM075hZ+scoIrwJ3loAJXtSZE=; b=taXOEF1w6KkdSQbt2FcEssv9S8CCLrqERlphNFHU6wgOoYufuKzdoSZzuuz7ENipFCb3U8QZbU/MNY0pqnTBlWgvrtzOYrXPkoL8BOXDJZsWONS3PQGH207E9+hQYWQSPJJ8Hwil3acllQq/XvaIqMQx6iDcfVruVTL9sIPCsOc= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=wolfvision.net; Received: from DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) by AS2PR08MB8384.eurprd08.prod.outlook.com (2603:10a6:20b:55b::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8445.19; Wed, 19 Feb 2025 10:16:58 +0000 Received: from DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d]) by DU0PR08MB9155.eurprd08.prod.outlook.com ([fe80::4e72:c5d4:488e:f16d%5]) with mapi id 15.20.8466.015; Wed, 19 Feb 2025 10:16:58 +0000 From: Michael Riesch Date: Wed, 19 Feb 2025 11:16:42 +0100 Subject: [PATCH v4 11/11] arm64: dts: rockchip: enable vicap dvp on wolfvision pf5 io expander Message-Id: <20250219-v6-8-topic-rk3568-vicap-v4-11-e906600ae3b0@wolfvision.net> References: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> In-Reply-To: <20250219-v6-8-topic-rk3568-vicap-v4-0-e906600ae3b0@wolfvision.net> To: Mehdi Djait , Maxime Chevallier , =?utf-8?q?Th=C3=A9o_Leb?= =?utf-8?q?run?= , Gerald Loacker , Thomas Petazzoni , Laurent Pinchart , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiko Stuebner , Kever Yang , Nicolas Dufresne , Sebastian Fricke , Sebastian Reichel , Paul Kocialkowski , Alexander Shiyan , Val Packett , Rob Herring , Philipp Zabel , Sakari Ailus Cc: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Michael Riesch X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1739960197; l=1481; i=michael.riesch@wolfvision.net; s=20240405; h=from:subject:message-id; bh=JMzBYOKMxZG1zypK2Xw9X9mgiNJ0ITgNFxK18RCULX4=; b=7WnAg+eHZ+LFC89UteTBJwUT95F7FgBKiuqPvM8Jyzwl45VtH9Ld2S/g9ueLoJImIKTqgCVpY Poe7qkKeeK0CKHy5+h1tzIZ4flJ1gwnU5fuGe+RU7hCDiR2MwRC+dj2 X-Developer-Key: i=michael.riesch@wolfvision.net; a=ed25519; pk=cSJmgKSH3B6kdCIDCl+IYDW1Pw/Ybc6g9rmnUd/G7Ck= X-ClientProxiedBy: VI1P190CA0041.EURP190.PROD.OUTLOOK.COM (2603:10a6:800:1bb::8) To DU0PR08MB9155.eurprd08.prod.outlook.com (2603:10a6:10:416::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU0PR08MB9155:EE_|AS2PR08MB8384:EE_ X-MS-Office365-Filtering-Correlation-Id: f1a1d692-a5ae-4b3c-7128-08dd50ce8ae6 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|366016|1800799024|921020|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?q?6Ehz9SD8iQ/L/oEGdNuMtGAdl9hzXbm?= =?utf-8?q?rJBp4YTsEPe5cpcbFqh2r2orgOQ7iqjZaXjB+OeQI/CVU2puk+vm7eP7APiCwFKXQ?= =?utf-8?q?FqM0FEnJgR1TVPZlfOoHvfYLX4bdVMS/Cy+mfXPtB7uWX5Zs2aRIJZARsXvZ6qOCv?= =?utf-8?q?obpMv/yUWLIZP1is/4vKKfCfJaq4VAjoEA6loR77720BO9SzF5UraHoA+rnvoX+iN?= =?utf-8?q?WR4g79uTqz+JlMqF4iIlSaa1NzQabycO0xJjZXh3kPWjC8ablPJF6J+kuq52+zJu6?= =?utf-8?q?waINicXOMr9zpmffIAG+a0Lg/f7QSI04H8PBfh55F0Hgy/oXXlWAPxaTPaTwge+AS?= =?utf-8?q?EKF7a9CkVWhLK3w3+zhklcigM3ZwnZ+hgjOKbhuZjgtgcytDNts7zTj+Nx+kH+NZR?= =?utf-8?q?uXbAxSR6NH+b7tYmNagzh978yM6GncujjREip7DfCKG9WdwNCYhp0D5/asQ0N+hKj?= =?utf-8?q?LWlHon6AJfWmdqWGxHVs4+3axUkNxHBbEzF6C2/1mI/YkL9NTsKLtajnOSacip+m9?= =?utf-8?q?+iewBNk47kvTwmmIAMP9jLm6X0bpLBuAyevrfDg/51m3TfhLSyziBbCYWTb87i716?= =?utf-8?q?IZE8fFeoZj3FJzRetFOKfKezwBVQEaG+T1Or7Mc5cRq1JdrMTPVbuQFWFoFUfmzfh?= =?utf-8?q?9blje4GauvEAyDKR24itvdoWPKjojldrDHdJiBCuE0zZJFnzvpgKjVS7brkNqlNUi?= =?utf-8?q?yMxiZ6ab9YqUVUHQwQjR+zM87kssRJ4qFAscQPrwT5Ka7q8rlkcKnNu6WGFI76k9e?= =?utf-8?q?aaM41t4oG+LcxSGzN6jQlL+FG1j7bOGNHGkrSg6dUmENvpCYFTG4ozsnv7DfCyR41?= =?utf-8?q?0Cq6wMLkJUakOUsHQr9YFS0lbYn8SPS6JhR3nCHatFJlo1+cQqJR0hus35G7pHAOX?= =?utf-8?q?sFRDm3BVgwKyInhmKYnHqqNrp78gjQzs/tVz64yRyudSaz1wnR8pUEoDFC2573Pc8?= =?utf-8?q?+mYhAdJn5HnRPzXolaDJYRsAqr2vm5IXry50JbEaU+xvbYuYoOPUUDwBXp1WNobj3?= =?utf-8?q?I7I522SCf4qryp6aTYFusbQq7feK0km/dnOZTl1oZttXDf5cgSIhguj4EHrthSWxI?= =?utf-8?q?k2pPu7tp0ghSGJt3wqC3MOvTUQt47sWygHsUdV5SBAmQWpaJRuXVlLDmC8EUNQq2B?= =?utf-8?q?iLYuE+BPqBaSTU4Q8y0p/ofGHuXi5MkBdGfj1rs4Ajhg2RSiHJeOh0QQs8G7Fy5Ms?= =?utf-8?q?lSDMYVtt0LboXAAS7froRvqDXS5ifTiVpr5ymMpnQLNalQLEi//v8bTq/FE5WiqO2?= =?utf-8?q?DYw2uHQcMAgcsb2LXt0unDJS0/no7SRtc3IhEeT6JYiYPGvNUrSpC0zRpYnq5ZkEw?= =?utf-8?q?4vnYuhyA65faT0VxJ4hJcmoovyjLWi5AHBPwODPuJ3iAa78uesvGibCQc8uLoEZ7E?= =?utf-8?q?vnI9c8/BmY5DQHaVyIDW6Z37KH7syUJAw=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DU0PR08MB9155.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(366016)(1800799024)(921020)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?8Z0l0Zw1IsUF1Ru8Qh26GfA4N3AK?= =?utf-8?q?69LbCneZsWrI+FYrzZ6irV2faMx7qy2Haep/x8AmwZFYjS4l73EcAL1SfTlniY5KH?= =?utf-8?q?aaNt+fvKhW7u62r53OQM5SSTm0FltGgnKcUOibwi3LiuYsnKGvHkVtzYWFKm5CqlT?= =?utf-8?q?f2jb80krF4Gi/oPZ4mee1OBs9M52KfcsLaFUdyNVYen3iaLsjftntB7gBfNeSJ5Rr?= =?utf-8?q?O1bfOUVlmQBFSQAozKfh7F7RrpRvlXU2RE8B51WKskY6DwMRR+Tfik6ZGJam4COEX?= =?utf-8?q?ZQ25FTn0PC5h6DTnjqNYe79GtQifmPZJ18vc9dXZk/z6HWjDMh7X09+oMZzGyiLID?= =?utf-8?q?1e+qwGxApWkCXnjr6KvTV2REJWNDO4FOIitxOYMj5Dxxw7EcsJECDxMP5Y4ZGCIid?= =?utf-8?q?jDTpVqGPkF/4+AJ98e0mwpGcKVQLCzKiX+pQIkjukgdyKPmt0r69X4RPfF20E4kfv?= =?utf-8?q?jlTsPzRtnOLEo57DWLNTnx9xLh7IylyNQ92sVgzmE+Cz+iG1wn5ok0M3/dITvprSu?= =?utf-8?q?0TGfZC5aq4y8ZOKXP9cOOo5CE8gnjf8UNABY6cKI1NzsE8JnrHE2+uMwJFraR1/kj?= =?utf-8?q?Zb8QQDTN+j9NQkveNlUAGHyyWb98M8iCdR5dSRRo2x+FOoo2NH3LY5X8axjodS32W?= =?utf-8?q?+PND38xNH/69zrt8j5T4VBtPrS6v3OkdCe4UI8QaPtbjRUXYfVWoMLok49aWs94pD?= =?utf-8?q?0TcO8EPzqnQlnnL608cyg0rCJ5JCGLZ++261vWRtcrVaEWlaQu4DAPxyKRTEzPxXG?= =?utf-8?q?A73jTHu93qJAWxpKYewyD1+UsAd8s6QzLo83KAM3agVamiwxoj63wAJT/ZYIK/Xtl?= =?utf-8?q?fSGqpZio004C1sPdI8qorGHz+M2MDRsFYcj2iQxJ9aMCiyps9AF4RVM04l9ubSUa9?= =?utf-8?q?y2LiBkeqg0Wu1CR04EuGX7pt1XfZ7CI2mVFKvZQcJPth1pMGI/awt0So6Srzi2tdx?= =?utf-8?q?QhcybJQBdGSJ4Dvap6jgKRivVrACCCmAtyHqCaXIgJbb5cJ1UFglGxomndp8Tm56i?= =?utf-8?q?z4Kp4RztDy/r1d7gyzaPmkIMN8wtjg31B+zcY9PUmuTJKYIANEfDPSWktjhFL86ak?= =?utf-8?q?A82Uq+0PWBt4eTOo+eCK2+TkXXJm77cZQduwr72WR1+dSpRpKUPVj94EBr02+p9mO?= =?utf-8?q?DN6ZMr1IcW/Uba5YPGbE3ft2oUAxmwUHLAZ/Xwf59t2Aqr/ScZdMvQ3mUVzqV9++/?= =?utf-8?q?HXLUve7mWx/ICka7jr/bn5dHqtmXD47//DqG7t/tOK+P5Vpeuy3A7kVKwWBBVjB9U?= =?utf-8?q?DgYCq7owcw2WmMaSHCVTzUGSGiDaCbQnJsps2ZsK3usKRwQMQO5m5hDdZlE0nS9Dv?= =?utf-8?q?cUT0uB5FjMF78Dlp3kFJ84BBsplnnEdf5OhHoWdRcCk5yUpUtKKdns4eAApEQrmIF?= =?utf-8?q?org4+SF2GnCW/PQb//JoY8KS0Q8Izy7McnJNza4XUMw267ifzPmggpIW3/GlFGPaQ?= =?utf-8?q?aAv0/o8YlK8L76Q9NfndEI+XZolBaJpJfTqmPlMoHPYAcVVHNirToGKePkMDagCL+?= =?utf-8?q?Jo+IOnfWHZvw/GosotZHtZtjkajv7d+pcA=3D=3D?= X-OriginatorOrg: wolfvision.net X-MS-Exchange-CrossTenant-Network-Message-Id: f1a1d692-a5ae-4b3c-7128-08dd50ce8ae6 X-MS-Exchange-CrossTenant-AuthSource: DU0PR08MB9155.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Feb 2025 10:16:58.1973 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: e94ec9da-9183-471e-83b3-51baa8eb804f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: CAkq7sbLU1JG0jM0JYpKIj30b+S4CuhBkYxUllDxqh6nK3KQXhtFI7FEUNt06v++q1HFhVfaKOY+tvadNsTiYeZycy9A78bZvbcLEUiRHuk= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS2PR08MB8384 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250219_021701_103896_E8825867 X-CRM114-Status: GOOD ( 10.68 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org The Digital Video Port (DVP, the 16-bit variant) of the RK3568 VICAP is broken out to the PF5 mainboard expansion header. Enable it in the device tree overlay for the WolfVision PF5 IO Expander board. Signed-off-by: Michael Riesch --- .../rockchip/rk3568-wolfvision-pf5-io-expander.dtso | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3568-wolfvision-pf5-io-expander.dtso b/arch/arm64/boot/dts/rockchip/rk3568-wolfvision-pf5-io-expander.dtso index 048933de2943..411b06b534f8 100644 --- a/arch/arm64/boot/dts/rockchip/rk3568-wolfvision-pf5-io-expander.dtso +++ b/arch/arm64/boot/dts/rockchip/rk3568-wolfvision-pf5-io-expander.dtso @@ -11,6 +11,7 @@ #include #include #include +#include #include &{/} { @@ -134,3 +135,22 @@ &usb2phy0_host { phy-supply = <&usb_host_vbus>; status = "okay"; }; + +&vicap { + pinctrl-names = "default"; + pinctrl-0 = <&cif_clk &cif_dvp_clk &cif_dvp_bus16>; + rockchip,cif-clk-delaynum = <10>; + status = "okay"; +}; + +&vicap_dvp { + vicap_dvp_input: endpoint { + bus-type = ; + bus-width = <16>; + pclk-sample = ; + }; +}; + +&vicap_mmu { + status = "okay"; +};