From patchwork Fri Jan 31 16:33:55 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurentiu Palcu X-Patchwork-Id: 13955544 Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11013016.outbound.protection.outlook.com [40.107.159.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C50641F03D4; Fri, 31 Jan 2025 16:34:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.159.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341274; cv=fail; b=U/1j4zJQPsBZ+zAg1ZAUePtcocnuqzcDzdg0N6y21b8vEANkDZdrJnNjc7ydKgJD5EW4o1hKLFbNPho9HlYMaFBZ63j0+hXt23eNc0Id/5qtPNuChgWu9Uqdtw1YhW7gzbmvovXo/EU12FXIW/h9K4zgpNTVsad3HlfjMD4q9jY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341274; c=relaxed/simple; bh=uMGnWazdw4yzMf10XZFI+JXETxKT1vyy2UNrn6LaO2c=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=DxEAMzBAx/kDTO8rKErm9h91GFiEDkjj9IV+xicmRbEyrD3/f+naIwEDM4uCoxp+sB54DcY740Yd0DABR8Krh5Rkc2MwZmttsZM8r1iEMUFaxWtgQgyDXbnWZN7OvMzwT5aPtUDSPG6wp4b0yXkgw1NJM/b2X0DQN2/3WMvFXcY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=p+tzEiC3; arc=fail smtp.client-ip=40.107.159.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="p+tzEiC3" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=dRJP4W07ZechUv+3xUs1hVdsHVPhdv/tlfFNhhyEJlHakU7n1FjBxVs+gI/EqxbXE0fqMKpZzEIh/Ilsy/y86e6/w/awAM5jrdUm0PeoK0aOY3Cyo1yjSbxKJws195N1pFqCmQ50r5k+y9Bq+F65Cs7jb1j/JnnZuBymAx4l/AM1RKmOxHI6lUBU6pvuEk9I+CpyAicY1YY47X5RYHwXWPYMujLY0I8PBstRxHGXYrxlxAMoKLfwsA1iK+QpzNIous5V4a/aXI/Q8wi25+xxYS4b7fBN9rmw/Te0MlvWcR0a8bTzhYnF4gp9NHFZIY0ZpoN+22YN0jHr0Yf9aAxFoA== 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=DkeoquS2GY5W2kC4bmCtoAwABXdEm/40yU391U4VFm4=; b=wPJcR5wbu4ZYlihCKbY9Q5XQ/15Lvwk646eeDUJIvxwEoatLGOBCczMV5hxcz3gHwme6kd4JkJwDAfpZZ0CSbC0VqjjvmYT+X4fRNls2baz851l0tRgHV2yk+kIcA337P71jXm7dA1VuprwkU2Ry6Rkp6swIupUiCzTGfTeoxLJhYldZS+17OkpA9o7/PDR83eABSnbwr8zqUKBQfywr4BWqj+5j/p7ZxTMaA+aMOb9wmtRwoeDbr1Q19+XwthFTyChciMnkXcFe0vhp3gSG+1PMfUpLypMDSRuplX6wC1X+I6Wt0m/QPV+5X+WrR+BhKyw1jJqUhxY33+vRT4Pxiw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=DkeoquS2GY5W2kC4bmCtoAwABXdEm/40yU391U4VFm4=; b=p+tzEiC3UfxzL3w46zxnxFaOhcHLdH9ygWERxtZF3Y8S3s3YiuEg56PCALP1l2UNxKYEZou2xzCgnGVsO/U/DXkEDGyZIs121bTn+UMFiDiyNaImbnbq9hNVnHlte6FiRr7gf3j+f9L1DHScq+Z28Led+jjVpo+DX12wxtdoyVhV2W9pBayLSq4cPYnGoomVkNBs3RPU8t478tG/RoR3lnYDNqlbbzIqQZbzaNZ6y1HEyj2am0XMc2RJKfrAM0e0hb3n/ZmcjubKz1F9Ex6Qmxa/Rzq3LpG2MzmKFfBw+ghk9zoc3yAlWzxQl2d8urHc62iDQWdaV+1yjvdIFjFDYg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) by AS8PR04MB8529.eurprd04.prod.outlook.com (2603:10a6:20b:420::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8398.20; Fri, 31 Jan 2025 16:34:28 +0000 Received: from AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30]) by AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30%6]) with mapi id 15.20.8398.017; Fri, 31 Jan 2025 16:34:28 +0000 From: Laurentiu Palcu To: Mauro Carvalho Chehab , Sakari Ailus , Laurent Pinchart Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org Subject: [RFC 01/12] media: mc: Add INTERNAL pad flag Date: Fri, 31 Jan 2025 18:33:55 +0200 Message-Id: <20250131163408.2019144-2-laurentiu.palcu@oss.nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> References: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> X-ClientProxiedBy: AS4P189CA0012.EURP189.PROD.OUTLOOK.COM (2603:10a6:20b:5d7::15) To AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS4PR04MB9576:EE_|AS8PR04MB8529:EE_ X-MS-Office365-Filtering-Correlation-Id: c50ebcdc-0a31-483e-0fdc-08dd42152182 X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-LD-Processed: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: o8iX2BWau1VF8D6AXHZdeWZuPXFw7H8UmIWH+3UC+8I4c6iu/DWpBO7FIC1pAHRkhDJkwyep3unTZjoMtdpTMiGXhGInpIxo/atOHnyzbKj5A6mRxJ3UcXaMArIV+zpzAvj2GLiL6yI+TuWbR4g8lqS+lU/vjcaBp1vPbVkKv8G1sznFnge499hMehULCwp3iqLRAtzci8dP9biG55pim34xRHDuIvgUCN50tnfENEFZiIMa4Wnt1h4hAaPddlOmhul20xwOiIjppfdgcJqjGZKJakoCFtlHsDi8A+gk/OJQRTVT/XsNEAhdFkmLxfcoNCdwvt9jAzDj5NiO7V1ky1z45TstykluYcQj00uduHu5BnJvcSDNENaDW1CitY2nyvmrJ8HNmnN7A5NvSbZUN7FZQD95pM3TYnFugN0gJGQxQYMNU5oKfhYrSpN7x2naGnNJkhfkudo/toctgZadGretGghE5N2MtbvL7i9kcyNC/I1yikW5J6q2G2z4zHD8Td6QLL/nZgnbUNo1w/JRl6iXa7uewng6DdS0xp2wUcGUeQKsf0gMl6Amdv7Ay+Qz1y/6EAS+aIFWQDXEFXnJo0cEwrDHI2QIDpomXVqPWiBBgcY3CKAjpZeBKAsMvwjgzSLfzsVazVG+Eyt4kRm18EScmzCdxjvHgIVZvg8JE/Vsq82VllT/VBdjD/ynsHYmXO91MTg9THgF3bfGsc5Gl6RJ3kc/30LKb4BMtp2mijXU8l/6Wp7qyXtOb4PPLUdCisGjc+9Zu3Ol1Qf4KFGxRFwO3zw71UjycEaVSxwxEjpvMOgbOOH23OiFtKefHawzznTpajngdUZUKIlS4S7JZnz9BOUDZSDrS07N4IaaIvsNvRmF6VL6aqrPJ26JWy/T87yzhqocWoeSn8ONAgl92O/zFPldzUzvWjShazf73QNWnk2hFF0V3OAiApzNf1h2K6U7DKDd+GsbitvCT0t9zl5IjuJ/tkI/qdQPHaoscwZqAKzIgL+VfmIyis7DkA2XyZNg6HJoC2cJJwqJR4xemBgNq6u+LNrvjwOpRxkZp0MbXd3RV52DlucONjFlWlXC34SBXlwU7AEraHEk32yZpkHdZQAk/++CRzZtC1G0sbAc5D6kElsRyihyKFP6t9hUH5jx9gw7PG7RWxXvVCoEBlMZFEvsfPJa5TSkfZJ/IYerr17xiYD53P49QM0DykRL6FT7/4AI5Grds7/Gnr8lWx1+r4QsjO2ncKZZhalFO4qr10bDJWGlgcsN9wCYIulQbGltRK3uMOP77uYHChU/VnWQOuheeUqMiZQW9PXsrsGXX91LnI/xlhabL7Li/gJQKHW1+glEH0fFfdmVnYv7OR/V8C1c/A2m4LZyuG/TSKDk+WGm5B+FdVed0Pn320a8 X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS4PR04MB9576.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 68TlGe3HfeXyEmPXcEXlBbyYGfvp0sZJCu6xSTpJeqBG1GuZ3li6edhdn7sy99z0ua11HuqwLnhqJt6DB/WWgVDEtrnBzTO7B8j+zVemDafP3GvvKXy6w9Z+Rm+66MMpK5eihGrUJk2pLW/YDWlHgnshbfqrFBdlARyetwQ7JSXx6h6j5aHQhen3wQk7iiH9fLYho3/YrQ4h/sdsOn0bbf0HRmdym9JfVLgnOfbxuFuUl9Bs8BbvIfj3Axomia+hS97a7S2TML6jsObsZj9MLVkvDQ3qZeiGo4y73/Vba2Xf7AUFbiYbdI6Y4aD1u+0ug+7WlRU7+hS70E/wjhBgq/F4HzCaoP0qaA28WFFGMl1fQGNJSbQmdzqTMyOIfTbQ4HnIiTIO+2WBPSgjxa3xXD0E047FNJL7r1IFOfuc8c8J2adQy+pJQFmigW0uZ4ZSgdewxMzHlkDodEXwefMJZoU66EPqBxV7JUbRTDJKeMBOkuCnFR6xHEBeGYMmFqY/PHThvPikPQg74Hxd51CacgltH7PpuPW25xK+75TGhxpmfreEnMMJ38oStwexxde/L5uwYfgbDIbonraIpLhbOuropdskS6zFAF1HEwfAWTjVNQ0XU4KKV96aH/P1pdyCA5rcOkSvtnU19PfG0+zOx9/OrlWN21xEI2D/iGoevcDV94JDvfHmcteWufm360WybnKZjkrkul7tqXLsPNbHqHcKOmNbgyrXjWbGekrnJD44B6cnOjzp3Roj3ghEdNEsxdBLrfNUGJCr+YRvR5+tRl5fqkYFwWTZ4V+wdhMl684MPNrXvXkx46gfK2XqR1PGT1ZaCQ2jlxNepxVbmyXq9DcWSYEq5reaXOJZQ3MbRCjf9ajN5VRpsOuNbHjdtK7ZNnQZzUESFQbSyVu/QPlhxq5/TfX/oMh6Ge+7GqTExgEq6HihXMxKCjoFs444V4D+5KVjMirF9yAipEcrGnCfrtT8N/IQnr5LzG+0aGSVHR+VbVUzQDLK5+qFNaCPGqKODaUi2AuCoeoC1F7E/Si+TjgtigL/6B+ab6UYXm/9MQKxHB00PBvlCXhqr7r1WtJ1u2GglH+ptueJRWyahrfFeAa/PdIN4HhI3hc1K6iJzNfFQvnApedLZnsKKy5aP/VHjBfYutu0HwYnP9S326+Gl7Ugbp+VfhXmZ8ziWWTmWH1RXQPreuCAqvulpV42sks+Z2h6af34RLdo8SufoDevPaSVbh1YkVuSCtkjiySdPaA0pY5aP2JoOQKd5SNf4Oz//GV2hshC3gOjtNCxjU4U1Q452bysXh+zRCcBpiZwCuvjSduhab0oQBpD9XRTd9IFvzvR8ahdWC6bgwDOigAkDHBbHY7erTsI8QVulg8xOvYB2D7t94Yyv65iu6aNEos34inBvfvrwE2mlkn87VKiSL0VVNOdDQOmPkJRhcH8kw6UU5Eq84tr6DGjnvjr90A1+nNuCj5qljYdmXWI5RxKOOKETBNW53UpXQIoIXQDL2gfq8dNKKXX3Neo6namtthyUtaeUg0Lm45oS/Nhehku0ObQfLz8N8cTGDlvOdN35n0v1tK8WZzFDh/XI/+XVsU056u4CkDJOpt4JOgtIlSmDQ== X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: c50ebcdc-0a31-483e-0fdc-08dd42152182 X-MS-Exchange-CrossTenant-AuthSource: AS4PR04MB9576.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Jan 2025 16:34:28.2555 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: wYmehKpVO1UR92y0NaaDqC8+Cf3jUqT/ZTQZlGh30IWZB5ajwv6rqCJwJRnBdY4tmcoOewwmED4xXo7vT95Dcw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB8529 From: Sakari Ailus Internal source pads will be used as routing endpoints in V4L2 [GS]_ROUTING IOCTLs, to indicate that the stream begins in the entity. Internal source pads are pads that have both SINK and INTERNAL flags set. Also prevent creating links to pads that have been flagged as internal and initialising SOURCE pads with INTERNAL flag set. Signed-off-by: Sakari Ailus --- .../userspace-api/media/mediactl/media-types.rst | 8 ++++++++ drivers/media/mc/mc-entity.c | 10 ++++++++-- include/uapi/linux/media.h | 1 + 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Documentation/userspace-api/media/mediactl/media-types.rst b/Documentation/userspace-api/media/mediactl/media-types.rst index 6332e8395263b..f55ef055bcf85 100644 --- a/Documentation/userspace-api/media/mediactl/media-types.rst +++ b/Documentation/userspace-api/media/mediactl/media-types.rst @@ -361,6 +361,7 @@ Types and flags used to represent the media graph elements .. _MEDIA-PAD-FL-SINK: .. _MEDIA-PAD-FL-SOURCE: .. _MEDIA-PAD-FL-MUST-CONNECT: +.. _MEDIA-PAD-FL-INTERNAL: .. flat-table:: Media pad flags :header-rows: 0 @@ -381,6 +382,13 @@ Types and flags used to represent the media graph elements enabled links even when this flag isn't set; the absence of the flag doesn't imply there is none. + * - ``MEDIA_PAD_FL_INTERNAL`` + - The internal flag indicates an internal pad that has no external + connections. Such a pad shall not be connected with a link. + + The internal flag may currently be present only in a source pad where + it indicates that the :ref:``stream `` + originates from within the entity. One and only one of ``MEDIA_PAD_FL_SINK`` and ``MEDIA_PAD_FL_SOURCE`` must be set for every pad. diff --git a/drivers/media/mc/mc-entity.c b/drivers/media/mc/mc-entity.c index 0455909055820..d1feacc608072 100644 --- a/drivers/media/mc/mc-entity.c +++ b/drivers/media/mc/mc-entity.c @@ -213,7 +213,9 @@ int media_entity_pads_init(struct media_entity *entity, u16 num_pads, iter->index = i++; if (hweight32(iter->flags & (MEDIA_PAD_FL_SINK | - MEDIA_PAD_FL_SOURCE)) != 1) { + MEDIA_PAD_FL_SOURCE)) != 1 || + (iter->flags & MEDIA_PAD_FL_INTERNAL && + !(iter->flags & MEDIA_PAD_FL_SINK))) { ret = -EINVAL; break; } @@ -1118,7 +1120,8 @@ int media_get_pad_index(struct media_entity *entity, u32 pad_type, for (i = 0; i < entity->num_pads; i++) { if ((entity->pads[i].flags & - (MEDIA_PAD_FL_SINK | MEDIA_PAD_FL_SOURCE)) != pad_type) + (MEDIA_PAD_FL_SINK | MEDIA_PAD_FL_SOURCE | + MEDIA_PAD_FL_INTERNAL)) != pad_type) continue; if (entity->pads[i].sig_type == sig_type) @@ -1148,6 +1151,9 @@ media_create_pad_link(struct media_entity *source, u16 source_pad, return -EINVAL; if (WARN_ON(!(sink->pads[sink_pad].flags & MEDIA_PAD_FL_SINK))) return -EINVAL; + if (WARN_ON(source->pads[source_pad].flags & MEDIA_PAD_FL_INTERNAL) || + WARN_ON(sink->pads[sink_pad].flags & MEDIA_PAD_FL_INTERNAL)) + return -EINVAL; link = media_add_link(&source->links); if (link == NULL) diff --git a/include/uapi/linux/media.h b/include/uapi/linux/media.h index 1c80b1d6bbaf3..80cfd12a43fc1 100644 --- a/include/uapi/linux/media.h +++ b/include/uapi/linux/media.h @@ -208,6 +208,7 @@ struct media_entity_desc { #define MEDIA_PAD_FL_SINK (1U << 0) #define MEDIA_PAD_FL_SOURCE (1U << 1) #define MEDIA_PAD_FL_MUST_CONNECT (1U << 2) +#define MEDIA_PAD_FL_INTERNAL (1U << 3) struct media_pad_desc { __u32 entity; /* entity ID */ From patchwork Fri Jan 31 16:33:56 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurentiu Palcu X-Patchwork-Id: 13955545 Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11013016.outbound.protection.outlook.com [40.107.159.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 71A601F2C5B; Fri, 31 Jan 2025 16:34:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.159.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341276; cv=fail; b=A3k06QjycIe8g3NScx2GqFDpbUe2Dxyf5tQjbO5dioQHcsh0MKKl8E47hYz1BaDwfglwvflwJt3zebmPvshlB3D3V6hFphCpIKEX9FlzcpPwyDarZaJAaDpKjdsY7UMoKje4Z2vuP9IKWiGeecMkH2KRYL4Wf/EVHXOpj2mGWco= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341276; c=relaxed/simple; bh=LtDzLy16sKf9e9KLaID6gsEQtuZx3XwfGmwrjuf8uvQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=CnsO/HOrK7AsnRbrg5hfb+1Khf/5/esFSd/D2nHlFQc8ar6tXW+LIT7UeWDW10SAV5vhO896huvR3gotHBlsge3nvumDuNEb7eHiF7HP+HsVDNi1QNRZ21mgDnC7f8sYZozrGqIyDLjbLKlGaoRps5i+G+KAPI2gFr3mvToBofU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=PBo//0gJ; arc=fail smtp.client-ip=40.107.159.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="PBo//0gJ" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=MhQrhhhSELkS+N/Z5eaXrp0/qIvWPzRhgNnKm7SW94jU2XzaEA/8/KmcR5EoPiVBPhs9gG1Koi3UCfpDvlZbFSo+K8CkNs7pjZTh5ch1BjYm85RW77rjjfp47t3o76dCZwNfb2InKCvMg0vz3rmtnNf8xSSMBj7oyahcazwuXUB43uR1UeJEdfKXmRaM34Dp05Gr2LaXuK5VT65eB1D12OBjoTVelXMhKTpvSBl7CtUheg/Ic9Hptp/FfV7y+aaSW9SCTKtR0yOCggezwTVeuAd0JSIBfloS/qnu0YQpA4kZlIEVqYXkxgwXIJnpTVgb2ruNQUtpi37I5qVq/cU8UA== 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=zN0lYccTmUd8XK8t0ve3fyUBpYkTPy1IvSRvyTXpf/o=; b=UWMPD3YulibdyV1GRQYJdhCI/NPZKkDQGWsk6HTMwAtU1uRP88E3cSUk7xdVXuDiqmuMcGGSQG1w1dAf1AWE+7wzYbM1U/rO0QV8zbGD3LVrWZToDSpwiVlLZanqzHRx+OQVneYGZUYph4VEFaZnly7xvoEzOqvNVux7FkSfcFk2C2ZmAIhJwD2enQL01ZXs76H1PuD/cC43QTPb8enC2CSLKPG45kQnFFFt90RxZVWsG6Z/7UlwWzWon2XcGxq1MXDurB4fPGo+kafZehmE7J0dLuf/KvIaZMr7F7e1G70iH/S8Fpbf45etO1aFD4CV6oeP/mvXrTE8DoOA3zyqLw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zN0lYccTmUd8XK8t0ve3fyUBpYkTPy1IvSRvyTXpf/o=; b=PBo//0gJt9BdWnJC2YL3V5We4dNQbLfnjILJ9uVkHFbfagf/dkmG4kWXUUw/EsMyz+R1iJydOyZdMRo3jHploQdFiho+EjqFuEbBmvS12noEDop8/jZAtHihxuwwBmgBXXt4UVp4Q27KTHhCEzQRPqVp3XuVNZBAt4JGfTW/kldFgpeHp6DSaW252MXip+uoByNQorhzqnMNcCwcVfXH2Ki+zvGTnfYBtVzpC0wU9U3NRk8R74QtFqrxXJGn9dg+lV5+IrL2x8tNCqWcLRykl9yu6EWXJfglpdbJTTalHTzdxWckOH7oeKkddjekXKLzysR/KV+s5UL+crl3uPOQsQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) by AS8PR04MB8529.eurprd04.prod.outlook.com (2603:10a6:20b:420::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8398.20; Fri, 31 Jan 2025 16:34:30 +0000 Received: from AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30]) by AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30%6]) with mapi id 15.20.8398.017; Fri, 31 Jan 2025 16:34:30 +0000 From: Laurentiu Palcu To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Laurentiu Palcu , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, =?utf-8?q?Niklas?= =?utf-8?q?_S=C3=B6derlund?= Subject: [RFC 02/12] dt-bindings: i2c: maxim,max96712: add a couple of new properties Date: Fri, 31 Jan 2025 18:33:56 +0200 Message-Id: <20250131163408.2019144-3-laurentiu.palcu@oss.nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> References: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> X-ClientProxiedBy: AM9P192CA0028.EURP192.PROD.OUTLOOK.COM (2603:10a6:20b:21d::33) To AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS4PR04MB9576:EE_|AS8PR04MB8529:EE_ X-MS-Office365-Filtering-Correlation-Id: da647c7d-5ea1-419c-186f-08dd42152300 X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: WUg2EEV1DY+RQEGoA6C5o7CVv24HrIQX477KsDMXelvuvvtkCN3XzpZiPAGu9JyA14BSKfZ3YBAKiKP5ts4aXgNQAGzvQ655hILbg5yeNJw90X6Niu7Iddqm+bQK7adeDZsTx5m0XcZhow827qlDHtssakIEWvR1qhwx94R8vHfulF0I0frQlbsUgSDrF/Bkls4DBXTmjiaYjDs0svqc2epczkw1sor+HHHiB06rFmHE+8AJUQdT2+TMlBd8+gOABtLnoq6MYA7djPUGx9RNabqlgj2/c+/Pdv8NtaxqPoJ1BZuyqZVYg6P3bhBo5poralYkbZvqrufxNAD0/SOv56MD42GGIgfWi3xL7jpbUQaGGv6us9LAmvLVtlFjuI3pHtsURBPgGAA9c+gMFlHTMe3q0GLesQcNPiAfpsnJ117tdXo23U5ikpZ6bqhHkuJOwpO5FZCJGte89ZxA/3F8k/1Aznnx+V43WeN/QsTpRIb19CAUCe1GAolAhjpDsKqAkgzq4gmBaHiAUrfjp0iFeE+BB8XVvM6lX2BwtTfuSckPjYi9cXHAHoEil0XJ6RTWLl15Aa7BQ9a+mRPWjAk6NCPT6dziHUgjdniMtKvmoYruZYItT3kvLneUCri/gZq4ZW9ZAqs3yUsC+WISofRkyS11oedn4Wdxw7GZbcX8eVcFsIys8i4B/yS8BhI17eCBM9U/oXUhkZqU6lQB/4uzmAcWD3EVVC4cYQexlIswrPUP5E8rGrwLJ1f0GgOL1dTiXiQoaq+lXuTzipTt16LnaHOSpzfqRVQlnmSuUPKkbYV+OnHU+IkRidCm9LXd46cqr8Ji+57Mm7suM3Xdlqf5pFfrlFa42bWTy+B/38SChS4lsmjT6nbeXHpojj1ZSmwidH1op6cLsgtSbZYnRMWFCiGV2UybkxAGLw/QTGsAcYCkc0hcZh8SoO71YimqJNq45YwvVnIh19h4sIiwMhCqRnQDnBJvx0OdT/SqcEFkuEnNv+fxkOXUraGIOKP0fJr7U7d2sYIZ7KqVNTjzpzA6E+m9/mo0IG2zOoxqKbZ2I4gUnXJ67qWy1lvQe5AJzjxMRkr5gl1s2rfjWoHew0fSHFWwMr+YyFOnHO80KtUWRrJ9uSV/ZZomLQ4Ig36akGwNI1p251ZAwdl49xtziK+3MXC+HG0m71zMYJF8KZPTcrr8GEPhwelxsGvigK12wg23fnKxLPvHdhO7d2D5OEbI/4yEgIIN5bTAeq+dlddocMfpd5YF8PDI7ozpSY9mjSH/o8ps6vWpYp9oIp/V/7o8g2qOTbHUYVf/vhJw1ogch72LrdHO/tJghrfRD5Iq/KMOuID3WrSLt2QMfAlDM7eOoYL1PZDuFoNxpQfQ4wnmkDpgEGnnzQtZz25feHjwbuTD X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS4PR04MB9576.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: GaWb3qpS/ALlJfxpf+0/s03+k14hfCFAWhqhYrDf0KLcgBo7N/TvxH99jeNJBOHe3d8DToveYTkhvpYyAsRsp9m895qlMYCMSu2YHgtvEOZmmF85Clr2pUR/imbC6TsVVgGeBsx8A8nsXmSQ1EzTLtc5K6DrpNOUc6W+hTrXNcEpXmSi09ogTrbA1MtBthDFFR+O4QNh/Q1U0IAuCFKqwvrSjkKywx9nlCqPg/WZrTY6QH/Jc458LNstF/8kmaPPpZBzpLfcC3qnY0VWY6hg6875g2DwIEWCXkBs3QddlRINf5AltFzpRdjG01mcJ/+mQJweUN+Bu29HI20FdHdBlBjE2P/okihwYHMX7UIpYCvcHRonlyh1bUc33nRhZxuxJ+TBraP4s0KZHjea0aoB/AiKGrQg+MQQ85H46WtTyjvL+GLmFJhXfn7BnaaiR1ZghkJgk+c6n3cwWQQV+HMOc2UPboQmXM9a6X6BEenJVK92GC8Z8E7wqKWnxSvHsQRSpgFplSMbwd0asQSh6yx0MxCi1n/PO/ojuDWFc6A71W/tE7r8382wg1qMAN9t6w82NNwV4AO0YvN1yHROypyXe/kaW3WyZ6z3dToPMN46cRs1A0Lvr9TmKoCQhKhh6MZ8Prkn9TwHlGzuoE2PgN1/hCiqzmxulPjKMTZe+0v0+Xm3Foip5zQH18W8kx9r/LC0MLl9zV1XvLSv9cc+8EASxSJgdWccQd84WXys/mOdXMGmehRG+4wqkUhkXKBUEaBQ6y/slvCVR2pLPEt6/Zhd/zgWBQ/WcbF0qJSP2vS0OegSOIXFqHTghE2OuU51S9l5GPlu5eE1G1QLP7NTZW2yvVl30Ij/cyZnRWLHoHWgc4JGTblEU2VjGdF2lL7rOw5T8WAaCB5W51+bEsJFQMNurd2GXC3E3gJNZGX19YbQtmAersVLXu/MQ7nHBsMz3VsI2BdkeddkLZlzEtCnIrOSqSwqgrsuY7C+lyT9aJoMIpQcOmdgcvUmfrrCu/+UlfNfPIefXDa329xYVcCvlOuolMYi6ctpd5ZynwOSlTbuRuHuZ9lqIzpZcG8La8MSxj6XSbaxXc1YVXwz9TxqlI9vWmSwlxBip303WNp6QrVRb6aC/HPYXF29SL3PCXAx2IudF7GU4qqU3qCZHw/tvloO6dX4pgyJdaiatjby929qQq9XNTyNdjlV2Ea0Kh3DEf/yzlqusFPF6kuwigMT5iKp3cLRCrQlZg3BJEWy5+5oWWF0B/0W2pcGl033vViJdrU59mlrh8tB0o3xeoBOv44l7Sb2v7Usbi+CA93kOnwPoEPNzyLnp+E3cMgkHs300Tp03Tj6cH7AqLbU/vQY596Hf6Ss7ku7ZXvxCWOZUNenBESDaboypRJd1XqT/oE5V51im5EDO8RHYyn8kklHufiT7V9n01m/P9sQZwgVfnzMxzR+G+NW/TVkl7DzRKlT1Wy6bmN6XJUgz/aKQ+l4OmfptQCOyOQETuIwUnZ27JWY2bH5IGpR5vygGLRB6OP2cJhkAU6CfAHJwwKGbVd8F8iNvDBhJi4H/nFwqBxJE5NB8yIHTXw/1KhK90bBpefmT6spj8mXmfxR4TJfthA4VMbLjQ== X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: da647c7d-5ea1-419c-186f-08dd42152300 X-MS-Exchange-CrossTenant-AuthSource: AS4PR04MB9576.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Jan 2025 16:34:30.7171 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: lW6D4LjSAMdqxbitwIVVjuvk65WhOTVAzGMLxrHmUICS1HD8faTvMVoErD2iQXX18KVYr14EsZ/ySzy0FmeNMw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB8529 Add new properties for configuring FSYNC functionality and operation mode, as the chip can support both tunneling and pixel modes. While at it, add the maxim,max96724 compatible to the bindings since it was already added in the driver some time back. Signed-off-by: Laurentiu Palcu --- .../bindings/media/i2c/maxim,max96712.yaml | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml b/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml index 26f85151afbd3..410004f3a032f 100644 --- a/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml +++ b/Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml @@ -36,6 +36,48 @@ properties: enable-gpios: true + '#gpio-cells': + const: 2 + description: | + First cell is the GPIO pin number, second cell is the flags. The GPIO pin + number must be in range of [0, 11]. + + gpio-controller: true + + maxim,operation-mode: + description: | + Deserializer mode of operation: 0 - tunneling mode, 1 - pixel mode + $ref: /schemas/types.yaml#/definitions/uint32 + enum: [0, 1] + default: 0 + + maxim,fsync-config: + description: | + Frame synchronization (FSYNC) is used to align images sent from multiple + sources in surround-view applications and is required for concatenation. + In FSYNC mode, the deserializer sends a sync signal to each serializer; + the serializers then send the signal to the connected sensor. + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 2 + items: + - description: | + FSYNC mode: + 0 - off, no FSYNC generation + 1 - internal, GPIO is not used as input or output + 2 - master, GPIO pin is used to drive a slave deserializer + 3 - slave, GPIO pin is used as FSYNC input driven by a master device + enum: [0, 1, 2, 3] + default: 0 + - description: | + FSYNC TX ID: GPIO ID used for transmitting FSYNC signal + minimum: 0 + maximum: 31 + default: 0 + - description: | + FSYNC pin: 0 - MFP0, 1 - MFP7. Not used for internal mode. + enum: [0, 1] + default: 0 + ports: $ref: /schemas/graph.yaml#/properties/ports @@ -92,6 +134,9 @@ examples: #include #include + maxim,operation-mode = <0>; + maxim,fsync-config = <1 0>; + i2c@e6508000 { #address-cells = <1>; #size-cells = <0>; From patchwork Fri Jan 31 16:33:57 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurentiu Palcu X-Patchwork-Id: 13955546 Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11013016.outbound.protection.outlook.com [40.107.159.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E72A41F3D24; Fri, 31 Jan 2025 16:34:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.159.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341279; cv=fail; b=fef9mDyfhJoubQgOKqRex4hPN+3HDqworz3UvTL6/GPjil1MbiJB/gGPWp9dAb7/LcL0q+v3MnO8mlBYH1sd+ApwoxL64ZWTgzMOAzpkyVXHJ3n8hAexOLuA4YmvgXHznrJw+3CzaTQ6jsbBdSaHr1mHlyXrheG1tJfPLSzs0nA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341279; c=relaxed/simple; bh=0L6AP5OqHs7iZtlI4niQM+FgMvW1e4iphoVJbXOUXUI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=XHNyD3L8foZpfxU96LhOkJDruWpIdQwTLxg/2UrYkp9n6vLqaLYijsdEMFwAl8Oaq+XrZ9WnPGwoxRtC/OrTOzz1pXHS+1rtgghFm8676+6VUOXnpeO6GtDa9jn16hIHfWdljVROpzgid45dKDwvqHrZHlkePbtTVylJOpGqhzM= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=oypUF9h/; arc=fail smtp.client-ip=40.107.159.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="oypUF9h/" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=MaZ/gnNj/nYIgwbe1rnDipxwZwl5Oo1EOHAXfwmHUA1UX3WxPp5d6SwOCIoQJJkvBX/g3GZM26F1O58PgJDhMtOeWyxtYO5UCeTZ4zZ56hG43tgj970C4CV/vC/CbMPnEB/YV8XQ2jQ/YZAysV+ZYQT9sYPuYc6LaBn5bBrpsVm1v3zGV0V5JhCgxCMa9cpVqRIdUzyfShKL6N7/7c/cQLStNobO0V7tlTETzxEITw6nKwm8HAmmYV14Ij9AH7PZ4hTu8g8lg0pWklUDxU4Pk3/NkUz9zZFhUaq0CskXZQ7uysyVQZSdH8Q/9S5bYOuGPE2U6fYyCfer2v13s2y6Ag== 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=HWU5/XBDyTBVXhHWFqQtcuSVFXOSDkAyN/L7zhGL4JU=; b=p+sOMJeA83aiL7fwoRW+Z40VCuNSKAuVlKDMHGJoWL3C+qKK2lnsimuKPzTRcIPNTqZrBDO7M6Yc4xmgEeVn99ZpJteG4t4tnCIL9DLIU2Qw8iBM67HfdknxZsnqriJVg7OGezOuRqqEASAo5/Lr3z6TxpG5aQj1viWnsV9qbrIoNE8IMnQafNLjYa0t74E3ExaYW9CNu9Zbw5hVaR5F4LCZC7ncVKWtMsoMpZrVZx6s7AwjPFaQXNa7T5986mLmXrviSTPdj1AsrZU+urPxlu2GbvdhdySGuItao3wL56jp486g20kmpYarpnQeVoKX3dliOFSgY2Rh/d0IAOw7wg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=HWU5/XBDyTBVXhHWFqQtcuSVFXOSDkAyN/L7zhGL4JU=; b=oypUF9h/I0f/p0dj98m+dseb97fQZDgSQctdF2UApZmqPRgQ5Btp0jpd+b4gjaBdlouM+OYbDltKFLr8GgOa5sNYC/4xhd+Sb7Ykl+09fNGTgsPS/xkekRAuBfEtOaCQ0mI0i2xaDhTjjwRkPM9lb2qstW+QUCL51wUScBfbHdbl4m7orCnEVxysgnIChXll1F3GwT/BqBF1bj0rIbGsXd9xlpGsHGSfUkQfADQ2qjnUhn1l+xmK5xaHVxOIscBFYTRJzqJdTzkTUlKhZuia/wKkJZ6WaLh8TNPUeRCBE9qp+mAW6T6X3Y4qFp+/5urtRdabnXh8gr2HFrulA07uIw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) by AS8PR04MB8529.eurprd04.prod.outlook.com (2603:10a6:20b:420::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8398.20; Fri, 31 Jan 2025 16:34:33 +0000 Received: from AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30]) by AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30%6]) with mapi id 15.20.8398.017; Fri, 31 Jan 2025 16:34:33 +0000 From: Laurentiu Palcu To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Greg Kroah-Hartman Cc: Laurentiu Palcu , linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-staging@lists.linux.dev Subject: [RFC 03/12] staging: media: max96712: convert to using CCI register access helpers Date: Fri, 31 Jan 2025 18:33:57 +0200 Message-Id: <20250131163408.2019144-4-laurentiu.palcu@oss.nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> References: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> X-ClientProxiedBy: AM0PR05CA0086.eurprd05.prod.outlook.com (2603:10a6:208:136::26) To AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS4PR04MB9576:EE_|AS8PR04MB8529:EE_ X-MS-Office365-Filtering-Correlation-Id: 99f744b2-bb31-40c7-5e79-08dd4215246b X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: Nwsbwbvse/IJqDoZgsLYQqiSbuo9Rp1hHZtDXvdf4s0/h/7gt036pd2N5GU6kH8kCDOjLEeiyq1SRaYu6SzBjVLT/y1ORScve+kZZ0suInlP94CEI0nC7/4YZTr2t/bJxq+sQFp1j4iFNvGmzIpGFGkPPBAn3s3ON7RldGY5BN2aev55Ud5Ym4mVHW8IsfnoKKowGrFOT1ygzwyNwkJk8RyB7t7pqI7yu1b0JBHqRjDSkHqAqS1LYRfN4cC4nvscIHLYsRYybAHrFpRU0zwCabbgfS/G76Fkgp0YdWM12onzxBTV/eVjDQ1mdO9Nr7bWXJ8Dz2/3e0Guuljc+wvzhIAXAWlgH+gbVUNXgR282oqyayx7OvQVG64Koftw/WkWk4LTtqBY8HSr8JC1/le/BKY6fqpKW+4flHWcrB3a3QZNPcZy0ObGLaatWxWz/ifnxwf9bgiG4LyEa5fs/IS7axBzd69KVIqF0JiQRni4TCgp5Cx70bm3wBcsbT+i2ExzRph2eJQF+AXErJykDbUWm9fd7oAm08ivQ4Hf5yQzH5OvtwtobOjWbQuSYL1kXHm6tuWJc9C4//7Ku473O9i3jAMsPiOl8ekfgpi07RtvGM4T0c4GHIFcxiAc3MUoOhaJGDtsGQwgUPH9m8anI9G59UW5gV9TLgMDYmmPQjfZk9O/ZVin3XQHNHpBlErd6Hz4sDwiki/1WPVgjiSYK+QfBTIjcDRuKiq5h0CrxSLlc+jMbMiZZrK3N5odXZLemR7ao9nhDORbeblUv4hz9gEzerr9m5QlpyQnGRcs9Zb73MVX0Yib+dTFKttW3tjZKgA8TN5LHMVWShwFD0ZBto+imSILx8B0VP30opKRLla2KZggEEMk0E8hu5QT2TrUvTDzdr/wjHBpGlsI0VJMquvchirsbtQKCbbewPrOEE9IcQsw/8Xozvyn5tzCFWM7uiTmo9WPmS9I96lmopXnpj68t7BxpRqG69a5U005Ia/ulfrm97eNoUIdlCU5a+Guvt8pb4XMdef50FR60VxxLWis7nhQVmmNYGY3sCZNsqyy104Y7fUope39sfU5FgIbTWuWLUhNlh38uA8eUI6TQADXJcH13Z+NB7VFJEO29TrueBMVJAQ3+wyVQgSfG4+zaW97qJnapmy2VZ9TFQeFYavVG97ZHEE/C5fY6Z2CFWA4AiSHUSqhWzhhCuIrRgweVDdSjFX3XjHfFgzK4iN37Ep4Rsv1mray9cn9qn70tMxRLRxA0RjEl/lG9B+WhDMXyu7g7pjM2/zsTgLKUjEClcZQWW0zJim1C4FxKxeTpSRu2i8AHXbQNisbibIE1u0D+GoFlmbluhxGuOChapwNCCXI3xy0xSV3ohuNDWSAdGkwwMkVXD9gFK32acisXE/6U500 X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS4PR04MB9576.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: RnN0WZ3PafGOMZE3jKfzJc6Zz9JmZcHSBkihv8QON1iRcI2TVQ8aZ1OwYOg3YT61hkk2xbqU7XqleuL3QRhWc+72bMevQQ5CsWTAa5IJXx5lFO5gWIkSmaOGGrDwQZ0SpSQsofncOUf2Mms0G3KU+uDWy9rlud3asU6nZ5lALlLy9kp076zOD3vSkPxF8BtMdV0HYIu5TaI12fyxe8P0I+a6dy+3V34+Td2gpIo5xYMCzObcl2UVbiZgeF1Y9lLVS9QYKg37mezUY82FxaqviLgeiob+hGzV4SKHBYDvbOw5KVbJN6AieQQMiJFYrix1hyA2TDiHlpbZWCBRbX44EkXN+8BisWwI9Y0FLhuqNDnwYWu+fMUZF3drkdsxfSIBKrDugg7PYoHtHLY/EvBj9M8tfaqxylU11EBKaMB04VSaZdJLXjul5gMcIV3g77f39vVOYTS+KMot8kKltDZdtFL2gehlKKLRsGTprhXrN1SANvtlquuCfOyK2ENy7y+YVQJMysY9zBqMIqbGbmOlaTRMLD2x/VXtopMOWpIBG3JKEbGFkzEkufyfDFtuPY0/rk57t/SrrON0BNkn9qEHlsrr+JGlGzFDj0Ha+44pUc4DYTAf+ZEtYzOn9WVkuG6y9FZxqhPMldR+4wY/gNIXRWtMGnahvmVGNZp8aWiUkw7W64CY3hsRo4Eiq4+Cx0sNXA4nHglk9xdPeMr8GPwGhr/G7TFH7cpgMUrNabpTPIy1eNOnJAYMNoNMSFEyKBLmr2oQUmYnlotAYCqIQ1z+s18CJJT6wvPqxN8a0D8IzJ0+bx3ni95PM26RbyuIUuRPOApivbwAVTR8RzdPZ89K1dqCqlFVWZDgAV8UCt9yrLQ10IyzqcBPwR4gSbrN+8997larAjPIC09QH1qgcHzCPns6H3MurmZAf9+s5y+Qt68I0f/oq2CSB0thY5B7XasTL/m/0zNpXl/j8EoseM5c+sgCqM4L+jCHjup2KP2mKqwgBYcwM6HviqeKPS7sH5cbEUPaWO2ADhZrXaG3HqIOBtkjlLqpf+Kn8P5dSyf0q5hdqXV56dGYHqpNPkoAxDVb2GIJc8Xrm1mTXIRikEraQPEzrBFlrp3ibSaijq0pRmykv7VBN8rs/Eli5od0veixEGDE9UfpGuHIxQpt+0//9amHwdxCD9Z334loqJVnkZKR9N0mCNwB9USVDc/+wdntd7KYJ9Ln75fYIcmKi15aWrpcP3VsOiZOPlbv6Re2paaV1IPQ338ev595jmfDJ4zbePp/aKi/cFh5lFf2wcsn/7+qIyWUDVQZHKiRS0P18Bt3fBgLkRF1IVfT2OJOfThen7MOZxlySIX38QynD4b0wikyjhE5zfotec9kGiKw5cVs+kKw2skHoRxBpTsf/8V0tiU4AEl0VU/jbqnyN1sVtDQgb2BE9/mAOraljg5Blj6U0AOzphz5vAFSk8L2I7pfVAeU1PJO1Ub8Oba7c8hlF74UWh8YNgztgoEfYgpHUn8IJLPvpveXTnHrhJjIkL413ZUWAiq1Khma+yJmJlZ7/HZ0Tsvxyn8BNz07xOb2ybOQl6X1PAgAOeMmsHNDkYOaG35ywuL16+yYfjsVdrtv2g== X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 99f744b2-bb31-40c7-5e79-08dd4215246b X-MS-Exchange-CrossTenant-AuthSource: AS4PR04MB9576.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Jan 2025 16:34:33.1015 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: MUc/eycoRbx8eafFr4n/g7O8NXQn5u/m4q7IZ0kJ/Gac1YiUYoRITRLinq5IE+zRASQEfiVhXAVMjc+mfmOAZg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB8529 Use the CCI register access helpers instead of regmap's. Signed-off-by: Laurentiu Palcu --- drivers/staging/media/max96712/max96712.c | 126 +++++++++------------- 1 file changed, 51 insertions(+), 75 deletions(-) diff --git a/drivers/staging/media/max96712/max96712.c b/drivers/staging/media/max96712/max96712.c index 47842facec125..cf39f5243cd6d 100644 --- a/drivers/staging/media/max96712/max96712.c +++ b/drivers/staging/media/max96712/max96712.c @@ -12,24 +12,25 @@ #include #include +#include #include #include #include /* TOP_CTRL */ -#define MAX96712_DEBUG_EXTRA_REG 0x0009 +#define MAX96712_DEBUG_EXTRA_REG CCI_REG8(0x0009) #define DEBUG_EXTRA_PCLK_25MHZ 0x00 #define DEBUG_EXTRA_PCLK_75MHZ 0x01 -#define MAX96724_TOP_CTRL_PWR1 0x0013 +#define MAX96724_TOP_CTRL_PWR1 CCI_REG8(0x0013) #define RESET_ALL BIT(6) /* BACKTOP0 */ -#define MAX96712_BACKTOP0_12 0x040b +#define MAX96712_BACKTOP0_12 CCI_REG8(0x040b) #define CSI_OUT_EN BIT(1) #define SOFT_BPP_0_MASK GENMASK(7, 3) #define SOFT_BPP_0_SHIFT 3 -#define MAX96712_BACKTOP0_22 0x0415 -#define MAX96712_BACKTOP0_25 0x0418 +#define MAX96712_BACKTOP0_22 CCI_REG8(0x0415) +#define MAX96712_BACKTOP0_25 CCI_REG8(0x0418) #define PHY_CSI_TX_DPLL_PREDEF_FREQ_MASK GENMASK(4, 0) #define PHY_CSI_TX_DPLL_PREDEF_FREQ_SHIFT 0 #define PHY_CSI_TX_DPLL_FB_FRACTION_PREDEF_EN BIT(5) @@ -37,7 +38,7 @@ #define OVERRIDE_BPP_VC_DT_1_3 BIT(7) /* MIPI_PHY */ -#define MAX96712_MIPI_PHY_0 0x08a0 +#define MAX96712_MIPI_PHY_0 CCI_REG8(0x08a0) #define PHY_4X2 BIT(0) #define PHY_2X4 BIT(2) #define PHY_1X4A_22 BIT(3) @@ -45,7 +46,7 @@ #define FORCE_CLK0_EN BIT(5) #define FORCE_CLK3_EN BIT(6) #define FORCE_CSI_OUT_EN BIT(7) -#define MAX96712_MIPI_PHY_2 0x08a2 +#define MAX96712_MIPI_PHY_2 CCI_REG8(0x08a2) #define T_HS_TRAIL_MASK GENMASK(1, 0) #define T_HS_TRAIL_SHIFT 0 #define T_LPX_MASK GENMASK(3, 2) @@ -56,22 +57,22 @@ #define PHY1_EN BIT(5) #define PHY2_EN BIT(6) #define PHY3_EN BIT(7) -#define MAX96712_MIPI_PHY_3 0x08a3 +#define MAX96712_MIPI_PHY_3 CCI_REG8(0x08a3) #define PHY0_LANE_MAP_MASK GENMASK(3, 0) #define PHY0_LANE_MAP_SHIFT 0 #define PHY1_LANE_MAP_MASK GENMASK(7, 4) #define PHY1_LANE_MAP_SHIFT 4 -#define MAX96712_MIPI_PHY_5 0x08a5 +#define MAX96712_MIPI_PHY_5 CCI_REG8(0x08a5) #define PHY0_POL_MAP_MASK GENMASK(2, 0) #define PHY0_POL_MAP_SHIFT 0 #define PHY1_POL_MAP_MASK GENMASK(5, 3) #define PHY1_POL_MAP_SHIFT 3 #define T_CLK_PREP_MASK GENMASK(7, 6) #define T_CLK_PREP_SHIFT 6 -#define MAX96712_MIPI_PHY_13 0x08ad +#define MAX96712_MIPI_PHY_13 CCI_REG8(0x08ad) #define T_T3_PREBEGIN_MASK GENMASK(5, 0) #define T_T3_PREBEGIN_SHIFT 0 -#define MAX96712_MIPI_PHY_14 0x08ae +#define MAX96712_MIPI_PHY_14 CCI_REG8(0x08ae) #define T_T3_PREP_MASK GENMASK(1, 0) #define T_T3_PREP_SHIFT 0 #define T_T3_PREP_40NS 0 @@ -82,7 +83,7 @@ #define T_T3_POST_SHIFT 2 /* MIPI_TX: 0 <= phy < 4 */ -#define MAX96712_MIPI_TX_10(phy) (0x090a + (phy) * 0x40) +#define MAX96712_MIPI_TX_10(phy) CCI_REG8(0x090a + (phy) * 0x40) #define CSI2_TWAKEUP_H_MASK GENMASK(2, 0) #define CSI2_TWAKEUP_H_SHIFT 0 #define CSI2_VCX_EN BIT(4) @@ -91,7 +92,7 @@ #define CSI2_LANE_CNT_SHIFT 6 /* VRX_PATGEN */ -#define MAX96712_VRX_PATGEN_0 0x1050 +#define MAX96712_VRX_PATGEN_0 CCI_REG8(0x1050) #define VTG_MODE_MASK GENMASK(1, 0) #define VTG_MODE_SHIFT 0 #define VTG_MODE_VS_TRACKING 0 @@ -104,30 +105,30 @@ #define GEN_DE BIT(5) #define GEN_HS BIT(6) #define GEN_VS BIT(7) -#define MAX96712_VRX_PATGEN_1 0x1051 +#define MAX96712_VRX_PATGEN_1 CCI_REG8(0x1051) #define VS_TRIG BIT(0) #define PATGEN_MODE_MASK GENMASK(5, 4) #define PATGEN_MODE_SHIFT 4 #define PATGEN_MODE_CHECKERBOARD (1 << PATGEN_MODE_SHIFT) #define PATGEN_MODE_GRADIENT (2 << PATGEN_MODE_SHIFT) #define GRAD_MODE BIT(7) -#define MAX96712_VRX_PATGEN_VS_DLY 0x1052 -#define MAX96712_VRX_PATGEN_VS_HIGH 0x1055 -#define MAX96712_VRX_PATGEN_VS_LOW 0x1058 -#define MAX96712_VRX_PATGEN_V2H 0x105b -#define MAX96712_VRX_PATGEN_HS_HIGH 0x105e -#define MAX96712_VRX_PATGEN_HS_LOW 0x1060 -#define MAX96712_VRX_PATGEN_HS_CNT 0x1062 -#define MAX96712_VRX_PATGEN_V2D 0x1064 -#define MAX96712_VRX_PATGEN_DE_HIGH 0x1067 -#define MAX96712_VRX_PATGEN_DE_LOW 0x1069 -#define MAX96712_VRX_PATGEN_DE_CNT 0x106b -#define MAX96712_VRX_PATGEN_GRAD_INCR 0x106d -#define MAX96712_VRX_PATGEN_CHKR_COLOR_A 0x106e -#define MAX96712_VRX_PATGEN_CHKR_COLOR_B 0x1071 -#define MAX96712_VRX_PATGEN_CHKR_RPT_A 0x1074 -#define MAX96712_VRX_PATGEN_CHKR_RPT_B 0x1075 -#define MAX96712_VRX_PATGEN_CHKR_ALT 0x1076 +#define MAX96712_VRX_PATGEN_VS_DLY CCI_REG24(0x1052) +#define MAX96712_VRX_PATGEN_VS_HIGH CCI_REG24(0x1055) +#define MAX96712_VRX_PATGEN_VS_LOW CCI_REG24(0x1058) +#define MAX96712_VRX_PATGEN_V2H CCI_REG16(0x105b) +#define MAX96712_VRX_PATGEN_HS_HIGH CCI_REG16(0x105e) +#define MAX96712_VRX_PATGEN_HS_LOW CCI_REG16(0x1060) +#define MAX96712_VRX_PATGEN_HS_CNT CCI_REG16(0x1062) +#define MAX96712_VRX_PATGEN_V2D CCI_REG24(0x1064) +#define MAX96712_VRX_PATGEN_DE_HIGH CCI_REG16(0x1067) +#define MAX96712_VRX_PATGEN_DE_LOW CCI_REG16(0x1069) +#define MAX96712_VRX_PATGEN_DE_CNT CCI_REG16(0x106b) +#define MAX96712_VRX_PATGEN_GRAD_INCR CCI_REG8(0x106d) +#define MAX96712_VRX_PATGEN_CHKR_COLOR_A CCI_REG24(0x106e) +#define MAX96712_VRX_PATGEN_CHKR_COLOR_B CCI_REG24(0x1071) +#define MAX96712_VRX_PATGEN_CHKR_RPT_A CCI_REG8(0x1074) +#define MAX96712_VRX_PATGEN_CHKR_RPT_B CCI_REG8(0x1075) +#define MAX96712_VRX_PATGEN_CHKR_ALT CCI_REG8(0x1076) enum max96712_pattern { MAX96712_PATTERN_CHECKERBOARD = 0, @@ -155,11 +156,11 @@ struct max96712_priv { enum max96712_pattern pattern; }; -static int max96712_write(struct max96712_priv *priv, unsigned int reg, u8 val) +static int max96712_write(struct max96712_priv *priv, unsigned int reg, u64 val) { int ret; - ret = regmap_write(priv->regmap, reg, val); + ret = cci_write(priv->regmap, reg, val, NULL); if (ret) dev_err(&priv->client->dev, "write 0x%04x failed\n", reg); @@ -167,42 +168,17 @@ static int max96712_write(struct max96712_priv *priv, unsigned int reg, u8 val) } static int max96712_update_bits(struct max96712_priv *priv, unsigned int reg, - u8 mask, u8 val) + u64 mask, u64 val) { int ret; - ret = regmap_update_bits(priv->regmap, reg, mask, val); + ret = cci_update_bits(priv->regmap, reg, mask, val, NULL); if (ret) dev_err(&priv->client->dev, "update 0x%04x failed\n", reg); return ret; } -static int max96712_write_bulk(struct max96712_priv *priv, unsigned int reg, - const void *val, size_t val_count) -{ - int ret; - - ret = regmap_bulk_write(priv->regmap, reg, val, val_count); - if (ret) - dev_err(&priv->client->dev, "bulk write 0x%04x failed\n", reg); - - return ret; -} - -static int max96712_write_bulk_value(struct max96712_priv *priv, - unsigned int reg, unsigned int val, - size_t val_count) -{ - unsigned int i; - u8 values[4]; - - for (i = 1; i <= val_count; i++) - values[i - 1] = (val >> ((val_count - i) * 8)) & 0xff; - - return max96712_write_bulk(priv, reg, &values, val_count); -} - static void max96712_reset(struct max96712_priv *priv) { max96712_update_bits(priv, MAX96724_TOP_CTRL_PWR1, RESET_ALL, RESET_ALL); @@ -293,19 +269,19 @@ static void max96712_pattern_enable(struct max96712_priv *priv, bool enable) max96712_write(priv, MAX96712_DEBUG_EXTRA_REG, DEBUG_EXTRA_PCLK_75MHZ); /* Configure Video Timing Generator for 1920x1080 @ 30 fps. */ - max96712_write_bulk_value(priv, MAX96712_VRX_PATGEN_VS_DLY, 0, 3); - max96712_write_bulk_value(priv, MAX96712_VRX_PATGEN_VS_HIGH, v_sw * h_tot, 3); - max96712_write_bulk_value(priv, MAX96712_VRX_PATGEN_VS_LOW, - (v_active + v_fp + v_bp) * h_tot, 3); - max96712_write_bulk_value(priv, MAX96712_VRX_PATGEN_V2H, 0, 3); - max96712_write_bulk_value(priv, MAX96712_VRX_PATGEN_HS_HIGH, h_sw, 2); - max96712_write_bulk_value(priv, MAX96712_VRX_PATGEN_HS_LOW, h_active + h_fp + h_bp, 2); - max96712_write_bulk_value(priv, MAX96712_VRX_PATGEN_HS_CNT, v_tot, 2); - max96712_write_bulk_value(priv, MAX96712_VRX_PATGEN_V2D, - h_tot * (v_sw + v_bp) + (h_sw + h_bp), 3); - max96712_write_bulk_value(priv, MAX96712_VRX_PATGEN_DE_HIGH, h_active, 2); - max96712_write_bulk_value(priv, MAX96712_VRX_PATGEN_DE_LOW, h_fp + h_sw + h_bp, 2); - max96712_write_bulk_value(priv, MAX96712_VRX_PATGEN_DE_CNT, v_active, 2); + max96712_write(priv, MAX96712_VRX_PATGEN_VS_DLY, 0); + max96712_write(priv, MAX96712_VRX_PATGEN_VS_HIGH, v_sw * h_tot); + max96712_write(priv, MAX96712_VRX_PATGEN_VS_LOW, + (v_active + v_fp + v_bp) * h_tot); + max96712_write(priv, MAX96712_VRX_PATGEN_V2H, 0); + max96712_write(priv, MAX96712_VRX_PATGEN_HS_HIGH, h_sw); + max96712_write(priv, MAX96712_VRX_PATGEN_HS_LOW, h_active + h_fp + h_bp); + max96712_write(priv, MAX96712_VRX_PATGEN_HS_CNT, v_tot); + max96712_write(priv, MAX96712_VRX_PATGEN_V2D, + h_tot * (v_sw + v_bp) + (h_sw + h_bp)); + max96712_write(priv, MAX96712_VRX_PATGEN_DE_HIGH, h_active); + max96712_write(priv, MAX96712_VRX_PATGEN_DE_LOW, h_fp + h_sw + h_bp); + max96712_write(priv, MAX96712_VRX_PATGEN_DE_CNT, v_active); /* Generate VS, HS and DE in free-running mode. */ max96712_write(priv, MAX96712_VRX_PATGEN_0, @@ -320,8 +296,8 @@ static void max96712_pattern_enable(struct max96712_priv *priv, bool enable) max96712_write(priv, MAX96712_VRX_PATGEN_CHKR_ALT, 0x3c); /* Set checkerboard pattern colors. */ - max96712_write_bulk_value(priv, MAX96712_VRX_PATGEN_CHKR_COLOR_A, 0xfecc00, 3); - max96712_write_bulk_value(priv, MAX96712_VRX_PATGEN_CHKR_COLOR_B, 0x006aa7, 3); + max96712_write(priv, MAX96712_VRX_PATGEN_CHKR_COLOR_A, 0xfecc00); + max96712_write(priv, MAX96712_VRX_PATGEN_CHKR_COLOR_B, 0x006aa7); /* Generate checkerboard pattern. */ max96712_write(priv, MAX96712_VRX_PATGEN_1, PATGEN_MODE_CHECKERBOARD); From patchwork Fri Jan 31 16:33:58 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurentiu Palcu X-Patchwork-Id: 13955547 Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11013016.outbound.protection.outlook.com [40.107.159.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A9F571F3D5D; Fri, 31 Jan 2025 16:34:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.159.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341281; cv=fail; b=M9s0YEp0SzTpDvW9WsDBiCthi+mb100+xtrS/+v6rDpNGa0fLTF5vj2z6pc7mDYsf61J1hBHrWi+BmUrxkD9cwaQeSiQGE/fQTTsWNUn5ug6hVSO1u+dWGe9+PCZhAUtLso3Gio7hWK0nEzeFjur1xSeYFgzSLVEXQeL3zm6HEM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341281; c=relaxed/simple; bh=6+goBM3cDCo+o0NR9c6uGzcCul677phDo9F7ZrxX9R4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=Kix8w+GbhXrOKHVLMyWLrtx+Ms3s+8vYR/GpETyAy0jBkdIDkbqmsMKEGPehnFHemrEi67o9iPXCRFzGiP2p/8zAfqoY+M27/Jr165JWGCjntPYuuvTKhQDHDdp0QEbrzuqca04XNT/RVYVxoZTd3uyfkVbKAH1V/KqhdrnEdZE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=bQnywLlY; arc=fail smtp.client-ip=40.107.159.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="bQnywLlY" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=FkaX0FbXOo3s5Ktnzs0S7+s/DEvMYSy5hOS0uee5kl+DT68Tz6BRptw+hjlAaHHrLFTBRIhrs61AQWqutiOtG6v8IZ0jEeYNxEw6KDuvjVANYlKeFqgnw7ZV/AtElYQKd/Y/zXDq88AhBB+l9kx9gOlR2hu+5GReNpmVE72c/BwBjLBQ+4kaaI3cthwzyzSOwkq2n0szXGsZtTPrR5GzNq/xbIWFZCjexMWPIPBDZ8thsWKfsam6sm0I20oLxx3I8Nsmh1IBnA3A1+LU1cB8KmTT9r2qHRa1T1BoD4QLJIzz1exK9Ld7Dhh3XZetBfsdQ6Ug3Ep1KuiE7oyCl1RJ6A== 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=99jk/BeQH4XmYIzpWSWDLFnMvyGMdJSvwYvOWpYubF4=; b=jr987mAYXN7fvqAYy/z7xt4QYmv35k3VVsTUpZtnA7g3fwGUd88BnH4cXaNDxoZh1cJCJ6BsZQ4A8m1OopFmDIlzN6Ke2WtF2TjPN0EmJ8pkSpu7RQu3lLk1m5vntcjGDjutn9uIZX4B96sp70qP0R1JdGNT1L2K9XK/UmYRtDybWfFV7J4F1YQVjq0zqzWkyTpHtRW/JGlk3jZfmOweJI/Q/fvpv/jLP7OMpeJCP9HXhzZ+1pz4nCgGxV+j+skirbqByv/lcCVIqDSvnZiijZOfsa6LcYmHXiZzrKhBbwWvSOHOMo8RvO8zGIrk7Tw6XLYO3aTMeByf6KhlQy8aSg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=99jk/BeQH4XmYIzpWSWDLFnMvyGMdJSvwYvOWpYubF4=; b=bQnywLlYfbPLlKck1VemzMRUq+k4Yq1OSHEhZKIMeswI2UP+hMw0nEJsNlwt/dd6zeCRmZ8qF8AgcgAJtULVfqBfs6AJlm/+RRm2kcT7VqsTgVCd1/jY9Jb5amZTZ1akwzJnGRdElmtBszYepEdbfB+cr+Yy5j03H5c6OohP01SmL6jyRhEa/tzuMs6fEgApjrDs+jlhp/jlFeu7AtIbeJx54eaU+650xsvXHgFSjbnZdyjWuKv1thHQp4MPUgbnLGd9ja/39tPgczz5Rb8UPakMRap5OHciGWUS7tC4xWRHThoShXXJ0uNvuDWu2HynjMZufSJFvWcWQOOWTzgftw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) by AS8PR04MB8529.eurprd04.prod.outlook.com (2603:10a6:20b:420::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8398.20; Fri, 31 Jan 2025 16:34:35 +0000 Received: from AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30]) by AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30%6]) with mapi id 15.20.8398.017; Fri, 31 Jan 2025 16:34:35 +0000 From: Laurentiu Palcu To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Greg Kroah-Hartman Cc: Laurentiu Palcu , linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-staging@lists.linux.dev Subject: [RFC 04/12] staging: media: max96712: change DT parsing routine Date: Fri, 31 Jan 2025 18:33:58 +0200 Message-Id: <20250131163408.2019144-5-laurentiu.palcu@oss.nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> References: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> X-ClientProxiedBy: AM0PR10CA0008.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:208:17c::18) To AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS4PR04MB9576:EE_|AS8PR04MB8529:EE_ X-MS-Office365-Filtering-Correlation-Id: 3ac01bbc-be04-4e8b-c134-08dd421525dc X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: CncF1e/e+RE/nnEoosb22/m+TXi2Iok+XvSn4nKzzzgO3F65juJ6hxceIY7ce/JrGg3egzaTy1ydrc58PdhWf39RBosf8/eBMs6sPsMmLr2tWHGbmIqFE2RS4/fRXjvbqFNNFGxor12ASl4WtHHf6uj5sK5GnvReYXIkQ6AA1ciMycuYRNvW27RZawyqsX/yQ655SnGslIjRWpJObWQuSZtJNR4OYim6TCLKEw4cGGLX1OFR9cDPCzyXowTfmpXnx13wZgiKZwTQFWkTEvupN7551WLPifBdCYfgAVTFMO3OAexcexds5LBEBd/GHo57iAcbJQdqVPHTt9UbB6Ui8LQBKiV53VicSqM4kQxFCfWWAEmbJ+UrGORXFjm3jCcwrSVKf5Zeo1Yaz9zqbJ3j8ftYsuDzWMPJtAEkyrvdpZgrJUgiyvUa3R4ePo40oWLDX+0dyHd7HWZLL+nqSnqsPJuNZI8LYKft1y0e3WUbyy9S/waBulNbCMrXuhBQ9mHbUsI4oFen+BKIIGkibqG3c03iJx7Smt+uU8isOkLxDjClWbK/h2QkoaKtUSIEU9+lb0mPl4NpOJtkwZ21hwhJ04hCXaS4RZ23qR4NMq1qsfrlEr038hcAiy9YxSysgIeq/OorAYawRXhz5nA2rPctyIBMO8vsCNsAECwd2Go7m7dx5h7Qcm+vo3mfvNbgxZsfImO3eZQP0alZRsqo4M8iX9kP2imrCja7pTBDgyrycFsKRSencHg8x9NYYpq1fsfL9Zq5FLJxzDOucfhJK+edWWTajA0l1ikC7C8HVGPE8C9T96jWacWhoaWlsVkRvYsxQNUCiSh+t5+HdwERx+8iqwxqWjq5S4xKUhqt9R8n4BSRUiW7cmX1miLBjCr0VbtMzXC2V6RaxF5QNUwhGbN9jJahmJ8OxBcYp1seFKnavX1y+lHxnazvkusBTuBLi4k2fWWr0X/PGRTxh/pX59GUGw57vW1j4Ao2gLjcb1JJ50zSz1mSaauPR24PglTH/yaoVPTcARLVFoX+wVp0i+FFwbgkZ2ADdHlGZJN8n70lU8Ktg0yfXnstVBNmuTda51rE0QsvQWThOr2MgL7qFgvdUvBUJWe6Pe1DBCbDSjVE8Qj71GWWu9b4WbLtLPrYpCTRqlRYCNkAjplTPZvE4R3WKjTDcrzDzfgSSWBclsMDgLcis8b8xt4Ot10xZK5u+N7HQ2J5/fjqA2mmKoQA1IO4pcC0I3ZCo9Ra027rL6aUuqYwWTqCZVtzyA+OJhyVNyplv/IYb0kfuT9GjWjzllcsx0utO7ON+j3NYunUllEMbWej9PSAOizP9MJ53bOjat3z02eRPn3fZqLKcO2t6lq14/rZ7PURJCnMdhYeKlthDV/mBx0uo6Snx0HFhK6t8M3z X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS4PR04MB9576.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: iZVFU8BpbVZRAGK7R4Vn13G0VQDORt/I67Njc/sx+azocuyfK4m+gW8pVWQVmSh+fpM7SAOJyPNe3Jm/ci8g/rlvETbUAkHqdc5taQMH+gXoVyBbhJRqGKdzBACiQmCBaZ9hAIMULjdt4eVxXMNSR76NTVs6VY/bZGecRifJlitfgg12n8yZ2F23mUJoAaf/I78YsQFDe71gDvLG+AExhg9knLYdGCNns1aeXu5tL6ASb7vIz1x9gtwVuHrQRbWuipmG3aNfMwHe0jNbhSe/B8FrWCPjGmDRjvu8Rim6tqQ4A6fBbuim/nJc93HZqCyx3YBs5w6QKK1SAVH47x1NjdFuxc1o1Yy6jx2YK1wayKhYPrKeyTHCOvWCwf7BfroktUUtpK7pT5DmynO7Mde1h1+RKe8OyrAWKVO58KDfCpjmHJCiGyPN3gqa4ldUcjKm2RRUSts45GGIgQSZcPAq7GD3qXh5VspiB8gxHhglLtffe4s3GjY1jLcNJtTzHu6jFTQF8cNCqw3WSzRB89hJ83v7tM047GF4/g8W6zCu8EhuBv3+/CdWCOfuckwYhyIIddVwoZWA8FtRMWarHIBy7i5uYXS43aGMjsNdM1Yqkw/LOk8NxMJobkflH5M8CYg5Jdx6HHKzovvd1prTFgzGF4RTt+sFZK7ro0gXNDEV4qwu1qISUJM2PrpikoGiHpetQpNeOhLAblRGwR9BC6V2hR7y2+tYSrMxWyLtCOqWrWgTWlYnaJLyHSTYS0em78U5DJIM48QnqQDZuquKME3znF9edTBIJRCoRIo3o9Ky2U+rX8FBP3BgE9yqb/UHIk7Zdwcvd/cGRssyKpY3if46xtK762XR/fahA9DuysN2KAEVefMjLtm1Gv78x26UUskVjyRnO0D1PWvj3JCtTRVNd3ixrIpeZl6M5aNexuwjcjRGVKYfB5/PEvaoqhq4rvaRgFa1rSpKIDQhxmeOYj49OHhXHJ3iV2tuKqGDQD4ijPjbrHuyPWOYyq6GYOWCOYY5eHEfcLhDKIYOUFxtHWtYIXwi0FZM1Q6K1rLY5gily+OdMv/VH+H16XqfbxprCMJKJ+PVJhZyY+hffb6QWnBxsyPXgSLIbH9oILehemwbS6A3/r1nTFjH5TRf/KEJdAFvgqAKXY2bxsXVCcEReuqKIRcx/xLlEkvh5FI3Q+0MR+Xn+zQyLE2kT2jCZgToDbEEzZp8+JlUn1samBNYLqE1kU3HpvYUE6j3u4ULcV/uyj7HdyFr38xmABE3DCgJIiuOXOBm8/RzhE063yAYqOLbMFPXRUaH+8JvVqI9Gec+BS94nxn1myMFxs0jtp2+068pGojFU9Ef7hZvEx56GvebRakY3PgPera8wYNyTZkhZmcP3qvsvw+7X7Qd6cLOPerE4vwqCmHsC7I2CVsulvmviOzEJ+Sf2wCg/pFd2kjBmzSUr15MgN/6bUUrIsOo7rjlCzlY0VVExPkj36EPEI0YD4vslhWRVv1/0FM1V9INXJCCszDXtwAwjbJsKTjAZmy9C90jq8A3t9xDlkvjfgDkG0svp+67ouTdOqIltoVGJJdtQ4Dbbk2rmdlOG5Lx5XVPIUPV3YPYY8rTnSmy/O1G4g== X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3ac01bbc-be04-4e8b-c134-08dd421525dc X-MS-Exchange-CrossTenant-AuthSource: AS4PR04MB9576.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Jan 2025 16:34:35.5252 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: SdMSXWRj2RX70oKrqOZhBXgHdmDgTLnUw5v19cs7BK5kVfNlgXQTYv7J3QtyphvxpnQWPE7UDUjPhlTbfsGvQw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB8529 Currently, the driver supports only one source media pad. In order to be able to use the driver with other serializers we need sink media pads as well. This patch adds support for parsing the source endpoints and create the corresponding sink pads associated with the endpoints in DT. The driver functionality is not changed at this point: only sink and source pads are created. However, since the first source pad index is 4, the user needs to make sure to link the source pad correctly to the next downstream node. Signed-off-by: Laurentiu Palcu --- drivers/staging/media/max96712/max96712.c | 122 +++++++++++++++++++--- 1 file changed, 106 insertions(+), 16 deletions(-) diff --git a/drivers/staging/media/max96712/max96712.c b/drivers/staging/media/max96712/max96712.c index cf39f5243cd6d..9c255979932d6 100644 --- a/drivers/staging/media/max96712/max96712.c +++ b/drivers/staging/media/max96712/max96712.c @@ -130,6 +130,13 @@ #define MAX96712_VRX_PATGEN_CHKR_RPT_B CCI_REG8(0x1075) #define MAX96712_VRX_PATGEN_CHKR_ALT CCI_REG8(0x1076) +#define MAX96712_MAX_RX_PORTS 4 +#define MAX96712_MAX_TX_PORTS 2 +#define MAX96712_MAX_VPG_PORTS 1 +#define MAX96712_MAX_PORTS (MAX96712_MAX_RX_PORTS + \ + MAX96712_MAX_TX_PORTS + \ + MAX96712_MAX_VPG_PORTS) + enum max96712_pattern { MAX96712_PATTERN_CHECKERBOARD = 0, MAX96712_PATTERN_GRADIENT, @@ -139,6 +146,11 @@ struct max96712_info { unsigned int dpllfreq; }; +struct max96712_rx_port { + struct v4l2_subdev *sd; + struct fwnode_handle *fwnode; +}; + struct max96712_priv { struct i2c_client *client; struct regmap *regmap; @@ -151,7 +163,11 @@ struct max96712_priv { struct v4l2_subdev sd; struct v4l2_ctrl_handler ctrl_handler; - struct media_pad pads[1]; + struct media_pad pads[MAX96712_MAX_PORTS]; + + struct max96712_rx_port rx_ports[MAX96712_MAX_RX_PORTS]; + unsigned int rx_port_mask; + unsigned int n_rx_ports; enum max96712_pattern pattern; }; @@ -343,9 +359,12 @@ static int max96712_init_state(struct v4l2_subdev *sd, .xfer_func = V4L2_XFER_FUNC_DEFAULT, }; struct v4l2_mbus_framefmt *fmt; + int i; - fmt = v4l2_subdev_state_get_format(state, 0); - *fmt = default_fmt; + for (i = 0; i < MAX96712_MAX_PORTS; i++) { + fmt = v4l2_subdev_state_get_format(state, i); + *fmt = default_fmt; + } return 0; } @@ -392,6 +411,7 @@ static int max96712_v4l2_register(struct max96712_priv *priv) { long pixel_rate; int ret; + int i; priv->sd.internal_ops = &max96712_internal_ops; v4l2_i2c_subdev_init(&priv->sd, priv->client, &max96712_subdev_ops); @@ -418,8 +438,14 @@ static int max96712_v4l2_register(struct max96712_priv *priv) if (ret) goto error; - priv->pads[0].flags = MEDIA_PAD_FL_SOURCE; - ret = media_entity_pads_init(&priv->sd.entity, 1, priv->pads); + for (i = 0; i < MAX96712_MAX_RX_PORTS + MAX96712_MAX_TX_PORTS; i++) + priv->pads[i].flags = i < MAX96712_MAX_RX_PORTS ? + MEDIA_PAD_FL_SINK : MEDIA_PAD_FL_SOURCE; + + /* The last pad is the VPG pad. */ + priv->pads[i].flags = MEDIA_PAD_FL_SINK | MEDIA_PAD_FL_INTERNAL; + + ret = media_entity_pads_init(&priv->sd.entity, MAX96712_MAX_PORTS, priv->pads); if (ret) goto error; @@ -443,24 +469,53 @@ static int max96712_v4l2_register(struct max96712_priv *priv) return ret; } -static int max96712_parse_dt(struct max96712_priv *priv) +static int max96712_parse_rx_ports(struct max96712_priv *priv, struct device_node *node, + struct of_endpoint *ep) +{ + struct device *dev = &priv->client->dev; + struct max96712_rx_port *source; + struct fwnode_handle *remote_port_parent; + + if (priv->rx_ports[ep->port].fwnode) { + dev_info(dev, "Multiple port endpoints are not supported: %d", ep->port); + return 0; + } + + source = &priv->rx_ports[ep->port]; + source->fwnode = fwnode_graph_get_remote_endpoint(of_fwnode_handle(node)); + if (!source->fwnode) { + dev_info(dev, "Endpoint %pOF has no remote endpoint connection\n", ep->local_node); + return 0; + } + + remote_port_parent = fwnode_graph_get_remote_port_parent(of_fwnode_handle(node)); + + if (!fwnode_device_is_available(remote_port_parent)) { + dev_dbg(dev, "Skipping port %d as remote port parent is disabled.\n", + ep->port); + source->fwnode = NULL; + goto fwnode_put; + } + + priv->rx_port_mask |= BIT(ep->port); + priv->n_rx_ports++; + +fwnode_put: + fwnode_handle_put(remote_port_parent); + fwnode_handle_put(source->fwnode); + return 0; +} + +static int max96712_parse_tx_ports(struct max96712_priv *priv, struct device_node *node, + struct of_endpoint *ep) { - struct fwnode_handle *ep; struct v4l2_fwnode_endpoint v4l2_ep = { .bus_type = V4L2_MBUS_UNKNOWN, }; unsigned int supported_lanes; int ret; - ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(&priv->client->dev), 4, - 0, 0); - if (!ep) { - dev_err(&priv->client->dev, "Not connected to subdevice\n"); - return -EINVAL; - } - - ret = v4l2_fwnode_endpoint_parse(ep, &v4l2_ep); - fwnode_handle_put(ep); + ret = v4l2_fwnode_endpoint_parse(of_fwnode_handle(node), &v4l2_ep); if (ret) { dev_err(&priv->client->dev, "Could not parse v4l2 endpoint\n"); return -EINVAL; @@ -492,6 +547,41 @@ static int max96712_parse_dt(struct max96712_priv *priv) return 0; } +static int max96712_parse_dt(struct max96712_priv *priv) +{ + struct device *dev = &priv->client->dev; + struct device_node *node = NULL; + int ret = 0; + + for_each_endpoint_of_node(dev->of_node, node) { + struct of_endpoint ep; + + of_graph_parse_endpoint(node, &ep); + + if (ep.port >= MAX96712_MAX_PORTS) { + dev_err(dev, "Invalid endpoint %s on port %d", + of_node_full_name(ep.local_node), ep.port); + continue; + } + + if (ep.port >= MAX96712_MAX_RX_PORTS) { + ret = max96712_parse_tx_ports(priv, node, &ep); + if (ret) + goto exit; + + continue; + } + + ret = max96712_parse_rx_ports(priv, node, &ep); + if (ret) + goto exit; + } + +exit: + of_node_put(node); + return ret; +} + static const struct regmap_config max96712_i2c_regmap = { .reg_bits = 16, .val_bits = 8, From patchwork Fri Jan 31 16:33:59 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurentiu Palcu X-Patchwork-Id: 13955548 Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11013016.outbound.protection.outlook.com [40.107.159.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 468CC1F3FE4; Fri, 31 Jan 2025 16:34:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.159.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341286; cv=fail; b=TIygwwrQyLUOed1kk6CFmk8YHG3XNrJO0URoWpuVrcLlv2kJGpRTx7+Wh49pHUv+EplSS83Ziqx0ERB8/MV865prveXtoC0Sb0p1V2C3F2WRhAlpB8logpW9Zh1erfKCHoFZs2SJU7z+VpQSyZtxnajfx7uKknjV2GBBAMCA8Io= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341286; c=relaxed/simple; bh=xN7mKk0e4D5yI3zux/rvI87HzLOdyYbz1vf7YIlL00Y=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=JOjRMC81NLArbte/Lm+GsZjw37q9gKxnSaYe+38ZzyXm0IZcDzIJ2GaEg7CkHicEwOqc9jqfbSL/gmJ0j0LlZ/5DyokpoZmxcmOIzUwTmyk+/Kf9jzIcQyWGb7rvWq48GLIMWOxKdhkdOHRH98wZPcu/pyKexeb/yrNjhOk+mtg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=e2UQkjXj; arc=fail smtp.client-ip=40.107.159.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="e2UQkjXj" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=NKPn0wbmq1OeHreTAMkFSy46xu6lLqbkmajoMhn42ncqIM2/TmMdY06E9emcoWjdIl/s8HW1ZI9D6bbu8hHS6B7aa5WFMwoDSUpaQAq6MqzJ/m3TVjZkx8Fw/OFxD92eFVuPu1sKDbptz3sOtSRnpt8TBe1mQcOxFJgahOf6R6V5nv7AF2WvFYlnf/YnDTyGN1eARFrGJYhxWu599mV11o5cUNylIdlhm5+2xujTxJDivI1QEO633FwguNdKfjpesn79QqxHozUrlIYsKp4x2/cVEo/8JYOrxTxSa0S/HyudWHxXXelT3X1MRyfrApYC6n4GhZ44DpD/GDTXppW+Rw== 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=v0hgAqAg5QZs4n4zHj3ymCXDESQ2BybMl9OjrA5/qBE=; b=sayFWIo8Sc9CIOusBMGcU05/eLnNfXcvXjwOJ1tAsAky+rTHUZD6QKJRnHJX1ySfKqu2R1jnm2oM5jHERp7wWUzUmU4DElXtmkT/n/PWcSE6jJEMRWQ54UCETpJOOTL2p63UlCKa+ROPd1UYfynyr8cv2US+vtx7Yi/jjsdUE3gzRvBoAJ5D/Q2yHAz+7kWRdI3HRb6iynA376NC5vkbYmcmtuK8SGrfd07otiOTa+Lx/AcGK22+J2jvswMv13czW6Cu2tEwK4MGKi5io1bJidCne3XXUhX3ZRPb0MKKk5DKiX/S0HQdNP9ovYbuw32Z37kEGKEBro5tyUvYw3SVNQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=v0hgAqAg5QZs4n4zHj3ymCXDESQ2BybMl9OjrA5/qBE=; b=e2UQkjXjIPv6Ua2hTOm+GkJULOx+DzGJTJVht2yZGlmN8dWZxW8p6yWivHjRogtJctbiguTcHj2eEtwSvsFa5kR+v86DSyGVyRTLY/aAtD+ZZNf6jWX+sGdIrYXFbHy9/Le2AfTgXxdc0v0TQJNa4X7B0XyMkOqTFNJPK1UanPlhnSST5k0kMfsDSwMQURyxZ4gnIgQS16GKDyaTvIoPK7/KjAvY8XyheFPI8FP4GLuI3nGUJBvfub4zQrQisGO+Eb8gLpR0ssUSAx+2MbSRyjYZiF5yeAK9fWGygUqSKt09uuGDsrpJHoZE4zQoOPk+U4vfmdrTNmCRHiApz7fDzw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) by AS8PR04MB8529.eurprd04.prod.outlook.com (2603:10a6:20b:420::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8398.20; Fri, 31 Jan 2025 16:34:38 +0000 Received: from AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30]) by AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30%6]) with mapi id 15.20.8398.017; Fri, 31 Jan 2025 16:34:38 +0000 From: Laurentiu Palcu To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Greg Kroah-Hartman Cc: Laurentiu Palcu , linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-staging@lists.linux.dev Subject: [RFC 05/12] staging: media: max96712: add link frequency V4L2 control Date: Fri, 31 Jan 2025 18:33:59 +0200 Message-Id: <20250131163408.2019144-6-laurentiu.palcu@oss.nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> References: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> X-ClientProxiedBy: AM0PR01CA0151.eurprd01.prod.exchangelabs.com (2603:10a6:208:aa::20) To AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS4PR04MB9576:EE_|AS8PR04MB8529:EE_ X-MS-Office365-Filtering-Correlation-Id: 7ea9961e-8e01-4df2-016e-08dd42152756 X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: CfopW1DAwhret72PqjFmIkKuLBN/OJSClEOF65YDokuJBvpJ7K6JtQ4DkcrSg1OQadrOZcY7ApIOVOjnhcKuIZWBl3gRZwiqlxj8tMoimNsdwW7S7/jOdtOLkUXMJavdhiBBZ6JrkUAEH32N/l+yXRZo/ln11YllFy8ub3DV+Me+baYPj2NZbvgkj7jEVdXGvt3fUY80Xv1+8QzCOwOsQlg4RMeREXTY54MdL1x65tTbgwmZ8h6ejMgYWAlfTvWIVLOClYlgLIJ1F4q16GsWMdYzVbeZd2u4Nc+q2cRo/ERfK23tQpIQwnLxfXjdkJRCSeQkJLCFUHRxv+lyaDsNDJkegoYhDrkgtj9M8CHOwVwoQXFX1X3ciNo61Zca4Z1tcMlGrSY4VAHGkR6D+Rhyynq+fNrPVL/VXLthFDqPcG2ONz2VjSuJoAYPzUcrZR91BgaCujmRkbHUazICO15uAtwkXpH/f0KYRkYSJ0Y1uyvCV1gDLiOf2eWYGrRQiyCMp2GguT+d0EzapXz+Xdsjzg+Yi8l7mUV3ss/nFbJedYsRIwuplx9mOIrospYQUgKGGFIF3FX2gua3C4TxouIRVV0m9e0UaYbSdx9p77dDRYh3l9iH2tskOVwP2tDVXzWxsAEYKV5hI/v1cASYHioqT1J5mDmDWqmSPe18B9yPoCrbQSOzvi4Pyf+0fgmfmjy6vPTUFXzSqBEX3sR+GSdTve/AeIjqMhbSNGS5rmQ3mNG8xc5Je+RTxOpJo+OOLsdVRGMBwADTtrmL1m5VhuZrNLx/iovhvhYeYm0GXKoRmiYjSSmIQOiSXgdHIk3h0t5FPsyTOyUKyaNbp+HZhLvT6F2b8KW8BXoHA4bjWsKAVxy1Xqfq1gv9XunN+9UyxBJuelBy/3324mF4Q2NjicfXZonZh4qqa7hSQ8rCkGZYgNIYoMivluip4y3TUlTNeJPYuSFnUWRaC/5t6gOd5iRhKjgKJrueNBrmGqKmtI6GYhfdr28/6Iqd7X/YO39j3ld9raxP6shj5gAsz605Miy9ubOi6UQCnS7HTLFiDAJNkrwVAJ1mToOw1wkhnP0VoKxIFUz0TF7QM5xQQxRmLChirtxX/fU3/vxqKkI8RnwmXdpuODhSLn7TmlbQGeOjtlX5yEYfjxG5zDxBieHvC2aWlDo1iZEXRA5yRTWHUp6Bg4M8WU+vVEkAisXclqeUV66p5uhVQ2xMaEf6UHiwB8xSN8deTDXPMpM6a9sZs9rENW1KV5sOTurIo2XMdbRtZHaG7+l4yNi3o5lI+JZKN+nE5pT1dD8JsCqYaamtbwhsCI+CUpVvJwxTW+aDMxsI4bZYEs5VE4AyXeB67b7n2BudAGAIbmfuHftjiZHOGBHOlGW2zqqBPz0DHUvBonJ2CJrq X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS4PR04MB9576.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: TDOZkFJUgFYyNhqkoZxk+arIAPbA/5y1TZLCiVANMIlYfrekzYlKRQaRzW0IO88iUBiRVB4lT1/LH2aFzvtFhPLy3cCZTImNUbfU+nzLREyWyN74tfRorTvW+xVrHzUW4ZZP0BQFcjBy6MNfO2Ds45FOrh1VvN1REF3FJk2VUMwiE6IAP7hJFD0an3YyuEEdehwCBE38rl3dSFIvuNWhv4h2S/r46XpHIb+lrzkMZ97syY0zAxYOjuNfWopBhowmKwYGKRGqXCD++5qdrX1nQvbhrW0M+OAqtJUxSA4hquFx3MR5n5DVwyJHMbiDAUbMSC77D4noUP9Uy+lJ6IaI5jFJ4/OjrzeFcgP1ZHZLj97EZKV2cs+xnHTo5FWd1RcmDQiHD3Vb/wthUqji3+lgeSGsf5zMO5rIk/d3FyaQk8Hbwa9N6wBz6oN/uQyDt66ZrcWQp6ZQh7CXL2PTm3izEWbUkXvBr6r6HSKYDEHlpC14LciEh/BQ51RPrPIx2+KBKIAsboV6f8lg2ZiZbDr4T8G/IBxRqkJzkjeH3VdwpOn/WVHnYwodO4Te8zJB+o2EVteawugNCvtpgF/UENSX4/sSTlf740moXGrHnT4abYu9yefxYBltj1n1THkiwli4h1CcqaqZIYqs3ToOoXeiUdgaerjYY7dDfR03YS66qthIetrWnE20qa54GbTXGhvJHXgNoEfXyzT2VBgLPigDb+eWm9RLv+ZiCga5Bu6Fh1pwJGcYcCOG9A1xgYeOypuSCDj8meh0gQcr62jxxxgXBBTOOBB05k5JAnC1KD2KtIX73C5q6jaPVwLTuYZu1kUT8HhBnaGQwa/adRPe81xwnTE/EXa0BLWmdSBdVa6h41CfPSVZS17/P9NEWhJ6IIz3U34M/0QrzXi8jwnTuUqjS31yn74dd0DPlF1jE7QwnIwl9a2atYhFKQDy8rR1F1w+MnJtZ0jjOOWH05wvH6wGLTKqzFDSx7/yIE6d7xb5cdw6byz4gNCJeZz8gDMQU3x2SqoOppucdiLn+rl5GLcAFRxuBO7LCyzKcBQP53dVr8tkRaaS53AV8aCcb9/upu4fqYvT2GXutG1LGX0scAP66xcRbnT05LjSTyUgSYZ9TbA3qS68dR+2oYA/U4y6xBFCYPuqyhhAyI+eAx/ms/T62WL9ohRXE3g7CAiYXa6/BodSA8S33Z0R9fZC+XANIvz4wgDHhPMEJexpH96JmUfvNLQfxE4xnTMinmVfCetJRCh4QOM9XEDqiKcDb9zPugNna2zmAzOPoaWCaLJsNdzhOR9uQNxgZySUY8kv05kCfyUqxGrKU9S5HFmyFcIe7nHR9WIGmHdAvhgUk4GOHkOwqquJh8u1ubCNy2Q/HpD2ltXH57Oi/L46yvy2L+NUeTrmmb8d497gxPMORcZWB1okMyfHzUf9FhtV08+2y5xlynfaZfJqNw2bGQDw6ow0YawlRCPkoVBErT55iI+jp9+xEbMVSUNN6s4Gf0sioel7exmG6POJEN90Am0tsrw7bJknk/398SaUvbsLGnqC5plTFHeiJ0Hr4wTYsLUzToYahuHdWkQS37T26xt7hNdAb10G8egDhoQPE+yjMHHPqAN47w== X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7ea9961e-8e01-4df2-016e-08dd42152756 X-MS-Exchange-CrossTenant-AuthSource: AS4PR04MB9576.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Jan 2025 16:34:37.9842 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: P87Vfl43a9rHjGyAImeA9mYpRM0yiubYmDbZXPFja/XxW6DZYp+5Uu0vuqWI+b2VnXxh2hFfwmtmbEU5MgDQsQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB8529 The downstream nodes can use the V4L2_CID_PIXEL_RATE control to estimate the link frequency but this can result in innacurate rates. Instead, implement the V4L2_CID_LINK_FREQ control and pass the link frequency from DT. If link-frequency DT property is missing fallback to using the platform info DPLL value to compute the link frequency. Also, remove the pixel rate control since it's not needed anymore. Signed-off-by: Laurentiu Palcu --- drivers/staging/media/max96712/max96712.c | 79 +++++++++++++++++------ 1 file changed, 60 insertions(+), 19 deletions(-) diff --git a/drivers/staging/media/max96712/max96712.c b/drivers/staging/media/max96712/max96712.c index 9c255979932d6..546660e4b3d1e 100644 --- a/drivers/staging/media/max96712/max96712.c +++ b/drivers/staging/media/max96712/max96712.c @@ -83,7 +83,11 @@ #define T_T3_POST_SHIFT 2 /* MIPI_TX: 0 <= phy < 4 */ -#define MAX96712_MIPI_TX_10(phy) CCI_REG8(0x090a + (phy) * 0x40) +#define MAX96712_MIPI_TX_DESKEW_INIT(phy) CCI_REG8(0x0903 + (phy) * 0x40) +#define DPHY_DESKEW_AUTO_INIT_EN BIT(7) +#define MAX96712_MIPI_TX_DESKEW_PER(phy) CCI_REG8(0x0904 + (phy) * 0x40) +#define PERIODIC_DESKEW_CALIBRATION_EN BIT(7) +#define MAX96712_MIPI_TX_10(phy) (0x090a + (phy) * 0x40) #define CSI2_TWAKEUP_H_MASK GENMASK(2, 0) #define CSI2_TWAKEUP_H_SHIFT 0 #define CSI2_VCX_EN BIT(4) @@ -137,6 +141,8 @@ MAX96712_MAX_TX_PORTS + \ MAX96712_MAX_VPG_PORTS) +#define MHZ(f) ((f) * 1000000U) + enum max96712_pattern { MAX96712_PATTERN_CHECKERBOARD = 0, MAX96712_PATTERN_GRADIENT, @@ -160,6 +166,7 @@ struct max96712_priv { bool cphy; struct v4l2_mbus_config_mipi_csi2 mipi; + s64 link_freq; struct v4l2_subdev sd; struct v4l2_ctrl_handler ctrl_handler; @@ -252,12 +259,28 @@ static void max96712_mipi_configure(struct max96712_priv *priv) PHY_CSI_TX_DPLL_FB_FRACTION_PREDEF_EN | PHY_CSI_TX_DPLL_PREDEF_FREQ_MASK, PHY_CSI_TX_DPLL_FB_FRACTION_PREDEF_EN | - ((priv->info->dpllfreq / 100) & 0x1f)); + (((priv->link_freq * 2) / MHZ(100)) & 0x1f)); max96712_update_bits(priv, MAX96712_BACKTOP0_25, PHY_CSI_TX_DPLL_FB_FRACTION_PREDEF_EN | PHY_CSI_TX_DPLL_PREDEF_FREQ_MASK, PHY_CSI_TX_DPLL_FB_FRACTION_PREDEF_EN | - ((priv->info->dpllfreq / 100) & 0x1f)); + (((priv->link_freq * 2) / MHZ(100)) & 0x1f)); + + /* disable deskew on PHY0 and PHY1 if D-PHY is used and DPLL <= 1500MHz */ + if (!priv->cphy) { + u32 dpll = priv->link_freq * 2; + u8 auto_deskew_en = dpll > MHZ(1500) ? DPHY_DESKEW_AUTO_INIT_EN : 0; + u8 auto_deskew_calib_en = dpll > MHZ(1500) ? PERIODIC_DESKEW_CALIBRATION_EN : 0; + + max96712_update_bits(priv, MAX96712_MIPI_TX_DESKEW_INIT(0), + DPHY_DESKEW_AUTO_INIT_EN, auto_deskew_en); + max96712_update_bits(priv, MAX96712_MIPI_TX_DESKEW_PER(0), + PERIODIC_DESKEW_CALIBRATION_EN, auto_deskew_calib_en); + max96712_update_bits(priv, MAX96712_MIPI_TX_DESKEW_INIT(1), + DPHY_DESKEW_AUTO_INIT_EN, auto_deskew_en); + max96712_update_bits(priv, MAX96712_MIPI_TX_DESKEW_PER(1), + PERIODIC_DESKEW_CALIBRATION_EN, auto_deskew_calib_en); + } /* Enable PHY0 and PHY1 */ max96712_update_bits(priv, MAX96712_MIPI_PHY_2, PHY_STDBY_N_MASK, PHY0_EN | PHY1_EN); @@ -409,7 +432,7 @@ static const struct v4l2_ctrl_ops max96712_ctrl_ops = { static int max96712_v4l2_register(struct max96712_priv *priv) { - long pixel_rate; + struct v4l2_ctrl *link_freq_ctrl; int ret; int i; @@ -420,18 +443,15 @@ static int max96712_v4l2_register(struct max96712_priv *priv) v4l2_ctrl_handler_init(&priv->ctrl_handler, 2); - /* - * TODO: Once V4L2_CID_LINK_FREQ is changed from a menu control to an - * INT64 control it should be used here instead of V4L2_CID_PIXEL_RATE. - */ - pixel_rate = priv->info->dpllfreq / priv->mipi.num_data_lanes * 1000000; - v4l2_ctrl_new_std(&priv->ctrl_handler, NULL, V4L2_CID_PIXEL_RATE, - pixel_rate, pixel_rate, 1, pixel_rate); + v4l2_ctrl_new_int_menu(&priv->ctrl_handler, NULL, V4L2_CID_LINK_FREQ, + 0, 0, &priv->link_freq); - v4l2_ctrl_new_std_menu_items(&priv->ctrl_handler, &max96712_ctrl_ops, - V4L2_CID_TEST_PATTERN, - ARRAY_SIZE(max96712_test_pattern) - 1, - 0, 0, max96712_test_pattern); + link_freq_ctrl = v4l2_ctrl_new_std_menu_items(&priv->ctrl_handler, &max96712_ctrl_ops, + V4L2_CID_TEST_PATTERN, + ARRAY_SIZE(max96712_test_pattern) - 1, + 0, 0, max96712_test_pattern); + if (link_freq_ctrl) + link_freq_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; priv->sd.ctrl_handler = &priv->ctrl_handler; ret = priv->ctrl_handler.error; @@ -515,7 +535,7 @@ static int max96712_parse_tx_ports(struct max96712_priv *priv, struct device_nod unsigned int supported_lanes; int ret; - ret = v4l2_fwnode_endpoint_parse(of_fwnode_handle(node), &v4l2_ep); + ret = v4l2_fwnode_endpoint_alloc_parse(of_fwnode_handle(node), &v4l2_ep); if (ret) { dev_err(&priv->client->dev, "Could not parse v4l2 endpoint\n"); return -EINVAL; @@ -533,18 +553,39 @@ static int max96712_parse_tx_ports(struct max96712_priv *priv, struct device_nod default: dev_err(&priv->client->dev, "Unsupported bus-type %u\n", v4l2_ep.bus_type); - return -EINVAL; + ret = -EINVAL; + goto free_v4l2_ep; } if (v4l2_ep.bus.mipi_csi2.num_data_lanes != supported_lanes) { dev_err(&priv->client->dev, "Only %u data lanes supported\n", supported_lanes); - return -EINVAL; + ret = -EINVAL; + goto free_v4l2_ep; + } + + if (v4l2_ep.nr_of_link_frequencies != 1) { + dev_info(&priv->client->dev, + "No link frequencies provided in DT, use platform info.\n"); + priv->link_freq = MHZ(priv->info->dpllfreq) / 2; + } else { + priv->link_freq = v4l2_ep.link_frequencies[0]; + + if (priv->link_freq < MHZ(100) || priv->link_freq > MHZ(1250) || + priv->link_freq % MHZ(50)) { + dev_err(&priv->client->dev, + "Link frequency must be a multiple of 50MHz.\n"); + ret = -EINVAL; + goto free_v4l2_ep; + } } priv->mipi = v4l2_ep.bus.mipi_csi2; - return 0; +free_v4l2_ep: + v4l2_fwnode_endpoint_free(&v4l2_ep); + + return ret; } static int max96712_parse_dt(struct max96712_priv *priv) From patchwork Fri Jan 31 16:34:00 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurentiu Palcu X-Patchwork-Id: 13955549 Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11013016.outbound.protection.outlook.com [40.107.159.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E7B041F428A; Fri, 31 Jan 2025 16:34:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.159.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341289; cv=fail; b=ega1jEnV9q1dcOfvS7G5HkpYrgFOOImdgh8TgV5Ur8x5z/DIFDNQGqNt4282/zMfnOVVfBKH7HzNOnaAB4jmPxpFuuAbG55NaHmucwtYMePxmPrRIHlOBfaIuXibuxZX+5t7HXJCWUt9ip8Y2TJCN97r/acPFUe81Q0E+GPCCT4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341289; c=relaxed/simple; bh=kjXGl1nboS1KtVQgnxjQt6+VIXXS57CWAoVkg70RZvY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=uEl6nHzB/TRulZXIdovE8E6BrxmxEdYX4k1ZdBMJ1Ems8gi3xi/vCUwAMsPJUS7xhjTeIPoQuNCLcGjLPBYICWc7c0a9eSfCy4pw1IzojLNDoY6Bb7ikd4jm6zT4vqD1VVBabmZ1EYH3vxJyc0Kqw+pSTpX1kTJrReHWkEfaQtQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=vsaYsWGK; arc=fail smtp.client-ip=40.107.159.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="vsaYsWGK" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=bWhQRi6bJ483hg4qqrtXiLGlLkwCx5KMhyvh3pqbdj5u/q5AchxPmJQxdPgBUNi3cavcJPfNCGZcT86LGJANExCbyAzwALm6yNec/ZNv3NCUMf0qgTuCGwxe++0BwjK9JhzXcODuk+Q+muRnWDnyA9qZMcbZiwoObo4EMaASmENJtR+3+MkUvLdPY5kjRtdBU4fNup9Jdj7bGzLca07yzMIztVvaSeFS59BVPTXeC3gCnaV5Flwep+G9k4DShE0ZsucWIJ7aRsucz682DsCTl+w1FIaLJA7AgOamp5R49rcIAwU5s4T87tiWuaQ7b/1KBq2yyQSkmLhuwkwZB80PUw== 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=dRMEfm/Uz738s147ZR674pJ4A6gFH768PVVCAC1MqNs=; b=LuQesP79JTSUrrEawVqnz0yqKEIjJhe+ORcjdJBYnSQ+EkiMvzugQgd/sbOuWfX28V2B1Ampzb34ytuiizDIC1eqGgpUJxcW/lkSbReuYHRQLpkpxay68l+ko3M099FmZ5zIojwSneCLNMK24wTXWKsqFE9rybcWnKv9dRi2AeskToxXa+sFTyiDRt0Xj6ir/hkBCrdQnc8mnXmpihn6DvwJ1Oz+CCrZw8s7x4BV02X8NL0zRgSHn5tjz2eN1xA+U+0Rrj4s77aMAnFofnOkEZntk7/LLWt1TlW/eI+iPZ8dKFw5l/g4XP07w9jh2KptwppYHr3ryPT8S4enwOLJ+g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=dRMEfm/Uz738s147ZR674pJ4A6gFH768PVVCAC1MqNs=; b=vsaYsWGKSad1wpZGfvgehGJiGc2+gS0tE1RxIXwUoJoBYzJf2B++7oR3TawY9lvCKtwGwoL4gzVWELiC7jmRvwvFtcld7QxTTcDR+Q/QVnpC6U60WUO/x2anbsu1axzPRLWQpZzDRX6nKOdOVgVCPmG9orMtZgPPQMGVrz/aPYsW1DGVyD8BaibdISikEe61vZXrswj8YaspEPKeuUD4WGhERFfYDcsxWtdJzg7CB7MjQZywI0c+MoaikTXsaDOBgTMC/X0pkwuAchjSHgMg+uis58B4LKpaLMIcMfD6PS2o6BWCSwKils3nTJa/2mCkBeT94mNrl1woxzQMNRmAVw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) by AS8PR04MB8529.eurprd04.prod.outlook.com (2603:10a6:20b:420::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8398.20; Fri, 31 Jan 2025 16:34:40 +0000 Received: from AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30]) by AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30%6]) with mapi id 15.20.8398.017; Fri, 31 Jan 2025 16:34:40 +0000 From: Laurentiu Palcu To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Greg Kroah-Hartman Cc: Laurentiu Palcu , linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-staging@lists.linux.dev Subject: [RFC 06/12] staging: media: max96712: add I2C mux support Date: Fri, 31 Jan 2025 18:34:00 +0200 Message-Id: <20250131163408.2019144-7-laurentiu.palcu@oss.nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> References: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> X-ClientProxiedBy: AM0PR08CA0024.eurprd08.prod.outlook.com (2603:10a6:208:d2::37) To AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS4PR04MB9576:EE_|AS8PR04MB8529:EE_ X-MS-Office365-Filtering-Correlation-Id: 623466d2-61e4-42f5-a8be-08dd421528bb X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: pt1OBMsBJuv4+3C0oxfciD8KuTKGy9609CJy7mpwJ44lrV/R051262BcjtyDBIcEGmqBWILUBacb1T2K4CxDrK9MF93lhQaKi6QB5nWcDlttaeJvOEIkLuvsp9GK3OnDeW5+tQn7IJgmx9XniVHdxLnqLbK9qz8ljqXxzFX0Xp3fDoll3G9LUh/gyeHds/4mfRphETyxzk+g4oh8uFFojHGw4wlJaHleXgZFj7IrIlqV9He7bjzeX91+QejzY/9M/JIaLPxDnm99rtYHou7h4Lx5zBjJXa6l7CyU7XzEAXosVcborsActxoYCfy21uV+ixMXXrMV5lIYQC4vhWpgWPPS9GSGrM7+fxi6tdkAUIPUpWsvmHe5/NlFZYfD2c4GIb2sOe9YfgcEqpArn8rMp4AdVs4bR4JBRO3FCU3CkQy+Bw4RieCY6bn5XUQer0QjQFVk0c6Inm2zOFdd+qpcu9MVuLQY6+cpL3FL+RRX3M0x6dlixNhlHCia6GbBw3Ds7dnp35J6j90E8hMrwQjkfgsl+inwwYrFEuV09uQvDq19p1+EJ9sDavGVYTNGKkScuhPiYcIMYpgG+8S7XhVB3CS1S3Wv6fSLAdD73M8B3AJCLyypY4IsrLFVDvmAVzIPWpqRcvFUluVM1NB6UOgrydUbGg3TSKDQIJsHDtC1HXC1WntAt+eKCf3MgfWxAN+hvwZ+zNQ8s65gjBxveKeV1IXjFaXmzxeY9nV6kYHYqQmA68U2/ZSJf1gsdPUgxNs6coGNdzvuwECSAPY18uRzMOjM4QeZakKg9LqRYZPtDLK6UUQV8H+VtBMzKhVqPwvS+iXzhaHMrApj2lVtX/7XOd8Hy/H19g2ltFEf8YLl41G00lmwCMCyuB8lDC8EJsmIyWCIqkp06g0PjkUu8YJV4yGVVQY3V5oNhVPNHA3kYtbWVHpZqwdf8nZgmwGwmGIg5aXSMkzyitOU2t3aQUU5K7QF9dtK+H20Gtjd5W9bRVIEn2Bj8XibYGqd1xUVDcjevpNOpQGdezbfOFzyMQGkWXaNNucpod/f+M5BH26r6oHu/Z+XeSFkmLUXEGkMhQQc7qfDu2Nx6QVeJXmGfHORUieGYGVlI0TY/mCXrIL3K8tb+UG3WJMDa7+qRi9eJA6tCMRIyMWDHgwSywuQvKz7iGLg0jJf7koE2exIuE46xL9sOGhtmroj241vLli5GAvCuLDqteKouu04HQTrniJn3mC1Gt1DUbyiCPUEpKvoXHa04dGhYNY/RA5Omy6L+gjyKzbTbPWpxrJIm++xVUMINpxfYhyTz16egPeZ4N3D210pvW01rvhGhnVVsqUYkKlEmZSdB8mHQvyGnRnfK4hWaCyJEn+dcbKa09CL9G+L4Wzn258ztobHQBwmDLD4t0sM X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS4PR04MB9576.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 8gsEwgaobpZCCLmj1xFD2+ZIKuOGcj3heOl9N3jUwEC2/LRRiexIttknPkaXkOm7ZBkdDX+iX6mGBvJcj7dcr9/hCv3aHhdCteXEDMiS7sk/Utdi6/8A8X23/2s/Ucwwm6B5jwTcTol3icRojF7f0sJpDITYZBOCP9QozRfwsBV34gYtNOYjq6MVzI0PUhmADXn4jaLi2KjpPIPehWNbSfGTBfT+1YhivQzX9aO0hElPleBauMDXJRMHQDC4RANZvgg2xlN3oDvqF+04B1W0moBoPwSW9Nx24OWJXIaJ15YTprqZVFR4/oo2ZNWq2h3LnHq8uL+Xqp4BLes5aXsm2QjhCMN4rAfQYNoWrTCW2rdiROjrXqFI9W+Zta0UpU6BSRT0gBDEopw/3AdKuY2xv97YAubJSLOL5hiZnVXSKJhQ+i0hsw/TxxfBWeRq9ageu4vgi6j53wWSit5MLdIL5vs1RLLs7+zHZgjEtgnuSSYNj52MZ4gBtR/dzkPCJ6VO1td0xUOG45mQbUwew5lcbW4kre4tUq8zlGOiDUtyoDQ5DuudJoEn6BHwSewmZgOHsPKoN/G2H5yFdJShIzxZTenzgCGSch02ITqa3oJROYsu3VR6IJIUlISd5x/UrslBMPgrSS72H6KWV/MYDZnrjjOK9lqB1Y2h5NnZjwn9ifvPxz4hoHCw6o9kVn/558tS6IvUsRA1ayXf2K6EhUR8h90D7UljU30bNQhvTXNGBuDoyJ/I5gYwkPpMTuSygPD2PBK7H+dYubDrUGId7s2tGpBXuYbaIOibWURGiLgGYNS8G25dEhbet3N1cGtWWzH5dRwJqAbm1KP/qNWR5K6XEHyen0J0LzrDanh95W/Zwm/OiX2jUrQiIf4tEmgXntWpv0lO1Pl8Oyk1TF2I+qqlCFX57BjW9Hs1J9nOQeS8+N3YtCGIHcTiuLjdCrw/Q/7zApkWxVSXFkdX5fvu9G2gk2WXvb5okyFIR8Jj/0bjsApnm0pj/9SZWuzie0hRoS5aykcrEnZ4TcqWNMwcsrl8KzbR6AsEU322duzjFsblKA0vFSPO5MwH+wLqDvMylS+QiC3bzs6ZjmGessjHAyARCzZ+Ns6Kkxi74dbOJ0Ytk+7+mEaBWPHQ9Z/ab+cgzwQdh9X0NNTU3qOlIwP5x8W2eXcEiaEp+tcLUtCmzMyWdxjdj1aeMkZG/mBpzMbZL2YaxnrG0I8sdGqd6tQWJ6UTS/UommxUUsJr9HN/0ON3hEdYUcNHyfxZqlNQghUl2IO0PWjKaqtu/65SZAm3BQGQ2lidMBDMF2Nz6+kaJOO7cDrjE5a2fl8F1lMJwhxZzCMiC8V7WT8mKeqNpswQh1yr1K+VXTQu98FB1ZauHahYmbmbaFqwfA2j95RKIQ5OizEw6zDqck4DQOV437d3HZ2HK6kyfHY8g6AxOWyf8KLXXcxP78tsR2BcGRvjEFCHGjy4yHxjGs3/IXZUF3Cq/F/HLpBowua/K9mcPaSyXx8nOCjLTlb3rkFyCwjqtyVuGRKhbN0ZycLybBoF1yyH3OBUeruf3VNsc+0+Lwu9KY7QmyoTiAZspQUZ5QEc/mpR3PEJUjerlgwDqA7F2HmegUSulw== X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 623466d2-61e4-42f5-a8be-08dd421528bb X-MS-Exchange-CrossTenant-AuthSource: AS4PR04MB9576.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Jan 2025 16:34:40.3276 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: +mMa+WIQztTbTbaUU50Odbvjt1jaIREQe2ISS5iDo3tiVhcH+CicEG/r4uX9J3UFQyxgnEfpKKbOOm5zdJyc0Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB8529 The deserializer chip allows communicating with remote serializers over an I2C control channel within the GMSL link. However, to avoid address collisions, we need to enable only the I2C CC corresponding to a certain GMSL link and disable the other ones. Hence, add support for I2C multiplexer which will allow us to do just that. Signed-off-by: Laurentiu Palcu --- drivers/staging/media/max96712/max96712.c | 76 ++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/drivers/staging/media/max96712/max96712.c b/drivers/staging/media/max96712/max96712.c index 546660e4b3d1e..f68a1d241b846 100644 --- a/drivers/staging/media/max96712/max96712.c +++ b/drivers/staging/media/max96712/max96712.c @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -17,6 +18,17 @@ #include #include +/* DEV */ +#define MAX96712_DEV_REG3 CCI_REG8(0x0003) +#define DIS_REM_CC_A_MASK GENMASK(1, 0) +#define DIS_REM_CC_A_SHIFT 0 +#define DIS_REM_CC_B_MASK GENMASK(3, 2) +#define DIS_REM_CC_B_SHIFT 2 +#define DIS_REM_CC_C_MASK GENMASK(5, 4) +#define DIS_REM_CC_C_SHIFT 4 +#define DIS_REM_CC_D_MASK GENMASK(7, 6) +#define DIS_REM_CC_D_SHIFT 6 + /* TOP_CTRL */ #define MAX96712_DEBUG_EXTRA_REG CCI_REG8(0x0009) #define DEBUG_EXTRA_PCLK_25MHZ 0x00 @@ -162,6 +174,9 @@ struct max96712_priv { struct regmap *regmap; struct gpio_desc *gpiod_pwdn; + struct i2c_mux_core *mux; + int mux_chan; + const struct max96712_info *info; bool cphy; @@ -489,6 +504,61 @@ static int max96712_v4l2_register(struct max96712_priv *priv) return ret; } +static int max96712_i2c_mux_select(struct i2c_mux_core *muxc, u32 chan) +{ + struct max96712_priv *priv = i2c_mux_priv(muxc); + u8 val = 0xff; + + if (priv->mux_chan == chan) + return 0; + + val &= ~(0x3 << (chan * 2)); + val |= 0x2 << (chan * 2); + max96712_write(priv, MAX96712_DEV_REG3, val); + + priv->mux_chan = chan; + + return 0; +} + +static int max96712_i2c_init(struct max96712_priv *priv) +{ + int link; + int ret; + + if (!i2c_check_functionality(priv->client->adapter, I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) + return -ENODEV; + + priv->mux_chan = -1; + + priv->mux = i2c_mux_alloc(priv->client->adapter, &priv->client->dev, + priv->n_rx_ports, 0, I2C_MUX_LOCKED, + max96712_i2c_mux_select, NULL); + if (!priv->mux) { + dev_err(&priv->client->dev, "Could not alloc I2C multiplexer.\n"); + return -ENOMEM; + } + + priv->mux->priv = priv; + + for (link = 0; link < MAX96712_MAX_RX_PORTS; link++) { + if (!(priv->rx_port_mask & BIT(link))) + continue; + + ret = i2c_mux_add_adapter(priv->mux, 0, link); + if (ret < 0) { + dev_err(&priv->client->dev, "Could not add I2C mux adapter.\n"); + goto error; + } + } + + return 0; + +error: + i2c_mux_del_adapters(priv->mux); + return ret; +} + static int max96712_parse_rx_ports(struct max96712_priv *priv, struct device_node *node, struct of_endpoint *ep) { @@ -665,7 +735,11 @@ static int max96712_probe(struct i2c_client *client) max96712_mipi_configure(priv); - return max96712_v4l2_register(priv); + ret = max96712_v4l2_register(priv); + if (ret) + return ret; + + return max96712_i2c_init(priv); } static void max96712_remove(struct i2c_client *client) From patchwork Fri Jan 31 16:34:01 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurentiu Palcu X-Patchwork-Id: 13955550 Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11013016.outbound.protection.outlook.com [40.107.159.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 947951F4E52; Fri, 31 Jan 2025 16:34:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.159.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341292; cv=fail; b=Z0E/jYuaFzWVeGRrOsV1+DEBoHezuze+kW1E0C3ZvAF1xUJXL6JrDJqmZNjG5Hp47jmM+zth0y/qiOSRoALJga3rt2q4lj73RhmExEA7mkRuUh5l1jSrheZanmtaG41aHU0Jdx1pmc6UdTYYaySch2pK2PErf/gTp98vh6SYSHc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341292; c=relaxed/simple; bh=WzJNASaAyqTw40nhxOqyg0Vs6gPQxfk+3aVs3/7tMbg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=qHdyc4T7aTpKFzDEeqyCc1QySkzdMA1xForUs8fbLCzL1cu9gXJ4yfZoklpEY2HTQDbpixRRcWrqzo1L9TRft88f7msy9c2ATB6Nq/IrSTjcpCRXVIskV7BGsQ5aJiT5eWhHWQF0PFX9EZwdnCbXgRbWm7pGsZyZd6akcNVX13w= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=dAAihuDY; arc=fail smtp.client-ip=40.107.159.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="dAAihuDY" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=AfRVJQVucqN8X9A5ijQlHWcBkXHT8S5RrhxLv1ciKR0M5BK93o6SyTLUmxUNfeArgRhMiEEUloOaje1OM1AVEjURYNv27y/jNAYRaY859iwlEeGOiSi5uBIheB3wZVmCwsVX5nsp34HA8aK873LPW8xof0sE7/MDRwP/ZT3uguXLUHdVR920Fs5MSGrigJOfiZbJnEj4i2mccpj6jhqquZx8f0QVwEhAN1JSbRDgIRavX/BfBrS5AunxXGh7FPIrju5VoEV+t32Z9TMTde5fMw28uykn6Wm5rbefpQZXg49YmI4y9xZR0u/M2pAaEQIWFaSVXRNhpsd4vjxONGPm9Q== 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=JZSjDZKxZoP/9q0aJBxwZjcP0Jc3EyFsW7qHS2lKeoo=; b=kUG9nm/NChBNn/OmkObQmUvi77EqK7mE+g6gjZGYaFgULYJlMmetx/ueV+cT8ZlQEjXj49pVlo3dxtmPjhN0StsDWb3R61cXTFWCcgWKnVYAa7aWOTNvgPQ36hVmFK4xk18PfGoqXDJ639c+r/DDC350DnJNhkhqT+RGIepOva0mi1TRSZWJwZlFdJODrWq8xKXEBveAQqFoQK3cLnSCw+R9CvkQ9QYBHHsWnSeBm1tknmJJPf8HV0uy0K8nhLnHCp1HRjLu/0whGVXMWPS5+uWedKUHUR3HlocMka7bt1KjIpiYzywwamHuyBpfNg4h/RjIPF8Xx3vMu2/e12+gNw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=JZSjDZKxZoP/9q0aJBxwZjcP0Jc3EyFsW7qHS2lKeoo=; b=dAAihuDYuT6BMVse1qBIFlhYDKB1IuChdDVCUwIxJ1HF3M6I624q5cwaD2jLMUXtQ4gH3k6omsEqveSZlrWYCu2aTJDfftL5jCIEthb/bFjANzuyyM5bUQQ7K6bbtsmu6dqwyA1jdfbSkvCLmGXZhtKBo0tqR7nlKlCrTXzbkZcDoF7mUZVmoPqf9mLkPT1LfDfHZxoHS1iDfjj1AUlqqGmUmPJNJPewgqSspRvquTlMlaPz1ieY+DkCsfMe5cZM0AvgNYgCsJJCrlIiUTWKtaUXPLBP+W15P8+USLfJsKSnbywfX7luOTzQD6adUN9tNLOiJrmBnU/byv0+RGlVRQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) by AS8PR04MB8529.eurprd04.prod.outlook.com (2603:10a6:20b:420::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8398.20; Fri, 31 Jan 2025 16:34:43 +0000 Received: from AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30]) by AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30%6]) with mapi id 15.20.8398.017; Fri, 31 Jan 2025 16:34:43 +0000 From: Laurentiu Palcu To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Greg Kroah-Hartman Cc: Laurentiu Palcu , linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-staging@lists.linux.dev Subject: [RFC 07/12] staging: media: max96712: add support for streams Date: Fri, 31 Jan 2025 18:34:01 +0200 Message-Id: <20250131163408.2019144-8-laurentiu.palcu@oss.nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> References: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> X-ClientProxiedBy: AM0PR08CA0020.eurprd08.prod.outlook.com (2603:10a6:208:d2::33) To AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS4PR04MB9576:EE_|AS8PR04MB8529:EE_ X-MS-Office365-Filtering-Correlation-Id: 9ae0564a-a4df-4a14-2818-08dd42152a3b X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: Qdi2upsIG6zA5UaIUMCa+UC8a/7TuUQOs1Aq0KvYtAOIw6moU7GeCXzBW7/HhoG1/fJlgfnD1VmqhGk/chzDmuts5MUw0OoavLMA+uloOX0WMbIhaV27k0q4vC5RTUlNLy2lm4dnpfIBB6YQbo57l8jH182sagtSEhLntQLdpqSQ0enJZwu3n+pXdYACUhnrQ3ootP52NKoUmD/crqXCUaztXAaZJhOlYaqK41LHpvHtBMvbqLiMmICj+lKxQne+Bi0piVWp7YLhcmOr9znmykn5bxUfzkX4zwSJYnUwLmZ2+gkQ092N0wHgIZ7uxZaEpflQeeVk6Agnjps+X581i72aIbsxdt1jyDzTiWnz62ScCu3TfoUPKGT3KP4VSy/9794aYFwx2HPFn9LdDZ9klfY+iiIj8R7ymn8sASY4rlp3G3/kwOzydsUZwLEpADCI4mnOf+cKO1N4/Excpo3O42kSWe8C1CaDMV/cd0AWpytEO43nrVY+wOuNE6YQnyEu2ByCCBv6r7J8PmExDBHFSV0s95JATMCVKe0Ma9uO/VZ2s70FSmKNsZvlnIniWU3bFfUL9WAgIQgEJdNDQtJvpY16Tgk2+EZQMnjKRVBH6Oc+1eq+GQI98ZdVTqdA289T4RTmRjSY9nIPetVguJnm0wji9DBSeGKSopgGvwICCRS5atUICaC23kk977fq+VqbLXE8iyhRVbRmhctuzMYn8aPpCdxLKDxVlhuUwPnAV2Zz24+aPXVQcjUwdIYqrizSzeytR2AIGXvg3qnFBfVUVWEj0EggntPutS1BplVhS7N0vtikyveSctRkmJIJwsAOzzThJ01cWKwm/EsZrD5LkmlgkvvlsLtfQReHc0cvwoOfq1LFe880HkXZCtnjkIKrtIOD1B1U8rNs5o+QNr2NjycJeKnPtTQO8yd92VajLtd/lUEYawAFd7fbU2XRfBWH8A1Cv2TvZyCtaGtxgbcz8H7QixuwSENFuxmGHQD4ECtyAG0jvtS7cK1VbnDskrlMf5eQPp+R/4Iv1NN/f+XGdifezpCr6Mu4P7tG2RcI70pXGtYi28X5r7zDWf9fXcX3PMY9HUHXV8JKwPZrC9lbRAYhvbfSoRMqp9utzbkbHgeY/Ra5XNvLkE8qviYCWivwJhNsNU07Z5lHlg8U96kXDaH5RatmGSNsKpFPOIoeMysmQ/T6uWOj9PGGDEtH2YXKhtiVw5IkRULWqOjhNGOyC1xtnlVKu6nEjzRs7LZTmN4r4DuNfR9TNISHO0kM4mWzLV7rsQFONULbOX44PP0j8lCoTZCtrIuSX526xr4DH/MRm3XH+oAx/oYtRJ/Iazh5jNBHjPVNltgyZxVuzJEd4Wprmm0q/oax8bZK6MRXgXLEcaK9l+/JL2trrjpu9xFn X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS4PR04MB9576.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: S7qR0Y5thErn1F3OiA3RyqyqhqLlLDZGItWOrlIFn7q2JL/Ni1rA4ejs5t0ml6kD+TbATE+s9e7yXHOApZ1+3Km4u98XODweztdo0dmhTtw9hute5WCRi9rVEq+bqeAtz7SlQMJKOjeQ70YxkkY0daBz/Dd2wdEBpfRgxNHhTiXjN8y90b6n3yj9i2MqFxHGqKsQIDoHfFShSwB9NkAYdZgeM9uZ9xxVZ+iGsLnUSf8uFxSVldNM+6OwGYDQW9Wk2CBQn7NBP0qk4LfrT4rBvCOpR2PD3MIpVI5pO9WNasa66mMg8Z3lzmtyT8/w7PNVURy3B7XfBUhoN0Sp8dhdm4BSyO86YmD0GR61/Rx46yMMc43rJKnfxm/tzOROmCy21Ai9iS2dvIpj0+sSPpXmmojI27+WMpcNZt9xWM4BjARS+Y9p0FIzFr/xG0yCMM5WJ0GgwfooWuV/oIv5gK328p+w76/VuXeAA3IERo6yobIwJs5IYu6xqRdejecHWJ7FIc4UKK9VwgDp0PvIrK2KiVehp04Axc05hQIYscKtOnJvthxN9I7p5C2SCv51aMlXCTRSqcCXkE4fhx1X84p/VYQsnUNlr2Cjf2FGBWcVX261V0f9ut38j7cHP25+Wnj+oV89cSnpgeVXkVGLWP0L+XXc7Hz083MzHrSn+WZRsSJtk0ZqhtpngGpKdhrhlh8UPdh1z9CzFlOswB8va4YvZJGxv9UAwm+vBqqbowk4MMDdAAsmvZrPNZkmHSSbzE5rFOWvGQIUsqceYVGS7BPO/MjhsK9ivwQHFFa1g8XSLuBxXursLJmv7ympu29EMkYccoYf5RJytZsQ2LCwBi5MZ+uOL2XNcpTe+6iN+WtphK8soTu8a/31YZMwiX/UvhvfroXdcz4HuVglmjCPatOwWvqiKz2hOcT5KMQwbiyeRofc16bsdcntZ5wHUr0lvogyJgfJ4RaDSLcY7ekq0sLlNnmFoGtSSFk1V0Ep1vS5Ymjwj8B2m1UvWiJr3b0+UfBGvESFNJbmEItkSh/j2xjt3phijbOsD9sUBZzh5ycWNTmVQvW3jkLc591Wf8FpmKhNiwaHSVt/aEgs2lYEztcQWObSnQP6dp9yFLYPN2Z+qoCWhIxKLE6Uv4rRGch7RX4HVTZJy6aG+36yhMjLvI9jvI9JdjrqpNetqt9HkNYFsXuoXokHh3GSIiL5B1vaf8gdueOdPlhwELvAq2U3Lm8F0eS5LYvHrz55ZT+sgj+GrPkBzVCI/IcL7fagCZikOIlsFimidXeI5pMjp4FFIuRHyJ+4gFQzk5ipOEbo2tEjUZa8C8meG+Mj8rPui9/Aa1M+wmkVJYdk5QJcAvFz048+B1dv4y8bcJ+xwyJNZoFkPtojSjJulTy0cNC6h3jLAYkfzsvoUyHl3GgwDf4Uhsb8S0BVAlq8R2yOfIXIY4ZLwbFNRE14q09/HMceA3CgKwIa2SrM07n+KvKABC3M9kcxlqDgqnJmGlTG6tphQRDybu9hBJvR6gKxAsw6i6uV++U/GuOWJYPRiOjvVnbzNwKaa2iBDYjcp796UNlacYxDbu7HSmi7uW+7MnNlG23PZF9YunBAGY9tscSG8VrNPfX/5g== X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9ae0564a-a4df-4a14-2818-08dd42152a3b X-MS-Exchange-CrossTenant-AuthSource: AS4PR04MB9576.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Jan 2025 16:34:42.8459 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: iImW4zRKbdEP60rtAygTFAuiKq4rQQ/+jZ15RebaFo0dq8Oq3PXzZrPnV7ODZBjwes2vPdv97jexF/0Jfr/QxA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB8529 Since the chip supports 4 incoming GMSL links allowing for 4 sensors to be connected, we need to add support for streams if we are to use more than one sensor with this deserializer. Signed-off-by: Laurentiu Palcu --- drivers/staging/media/max96712/max96712.c | 177 +++++++++++++++++++--- 1 file changed, 158 insertions(+), 19 deletions(-) diff --git a/drivers/staging/media/max96712/max96712.c b/drivers/staging/media/max96712/max96712.c index f68a1d241b846..a078e4c67c360 100644 --- a/drivers/staging/media/max96712/max96712.c +++ b/drivers/staging/media/max96712/max96712.c @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -153,6 +154,10 @@ MAX96712_MAX_TX_PORTS + \ MAX96712_MAX_VPG_PORTS) +#define MAX96712_FIRST_SOURCE_PAD MAX96712_MAX_RX_PORTS +#define MAX96712_VPG_PAD (MAX96712_FIRST_SOURCE_PAD + \ + MAX96712_MAX_TX_PORTS) + #define MHZ(f) ((f) * 1000000U) enum max96712_pattern { @@ -194,6 +199,16 @@ struct max96712_priv { enum max96712_pattern pattern; }; +static inline bool max96712_pad_is_sink(u32 pad) +{ + return pad < MAX96712_FIRST_SOURCE_PAD || pad == MAX96712_VPG_PAD; +} + +static inline bool max96712_pad_is_source(u32 pad) +{ + return pad >= MAX96712_FIRST_SOURCE_PAD && pad < MAX96712_VPG_PAD; +} + static int max96712_write(struct max96712_priv *priv, unsigned int reg, u64 val) { int ret; @@ -364,27 +379,119 @@ static void max96712_pattern_enable(struct max96712_priv *priv, bool enable) } } -static int max96712_s_stream(struct v4l2_subdev *sd, int enable) +static int max96712_get_frame_desc(struct v4l2_subdev *sd, unsigned int pad, + struct v4l2_mbus_frame_desc *fd) { - struct max96712_priv *priv = v4l2_get_subdevdata(sd); + struct max96712_priv *priv = container_of(sd, struct max96712_priv, sd); + struct device *dev = &priv->client->dev; + struct v4l2_subdev_state *state; + struct v4l2_subdev_route *route; + struct media_pad *remote_pad; + int ret = 0; + int i; - if (enable) { - max96712_pattern_enable(priv, true); - max96712_mipi_enable(priv, true); - } else { - max96712_mipi_enable(priv, false); - max96712_pattern_enable(priv, false); + if (!max96712_pad_is_source(pad)) + return -EINVAL; + + memset(fd, 0, sizeof(*fd)); + + fd->type = V4L2_MBUS_FRAME_DESC_TYPE_CSI2; + + state = v4l2_subdev_lock_and_get_active_state(sd); + + for_each_active_route(&state->routing, route) { + struct v4l2_mbus_frame_desc_entry *source_entry = NULL; + struct v4l2_mbus_frame_desc source_fd = {0}; + + if (route->source_pad != pad) + continue; + + if (route->sink_pad == MAX96712_VPG_PAD) { + fd->entry[fd->num_entries].stream = route->source_stream; + fd->entry[fd->num_entries].pixelcode = MEDIA_BUS_FMT_RGB888_1X24; + fd->entry[fd->num_entries].bus.csi2.vc = 0; + fd->entry[fd->num_entries].bus.csi2.dt = MIPI_CSI2_DT_RGB888; + fd->num_entries++; + continue; + } + + remote_pad = media_pad_remote_pad_first(&priv->pads[route->sink_pad]); + if (!remote_pad) { + dev_dbg(dev, "no remote pad found for sink pad\n"); + ret = -EPIPE; + goto unlock_state; + } + + ret = v4l2_subdev_call(priv->rx_ports[route->sink_pad].sd, pad, get_frame_desc, + remote_pad->index, &source_fd); + if (ret) { + dev_err(dev, "Failed to get source frame desc for pad %u\n", + route->sink_pad); + + goto unlock_state; + } + + for (i = 0; i < source_fd.num_entries; i++) { + if (source_fd.entry[i].stream == route->sink_stream) { + source_entry = &source_fd.entry[i]; + break; + } + } + + if (!source_entry) { + dev_err(dev, "Failed to find stream from source frame desc\n"); + + ret = -EPIPE; + goto unlock_state; + } + + fd->entry[fd->num_entries].stream = route->source_stream; + fd->entry[fd->num_entries].flags = source_entry->flags; + fd->entry[fd->num_entries].length = source_entry->length; + fd->entry[fd->num_entries].pixelcode = source_entry->pixelcode; + fd->entry[fd->num_entries].bus.csi2.vc = source_entry->bus.csi2.vc; + fd->entry[fd->num_entries].bus.csi2.dt = source_entry->bus.csi2.dt; + + fd->num_entries++; } +unlock_state: + v4l2_subdev_unlock_state(state); + + return ret; +} + +static int max96712_enable_streams(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + u32 source_pad, u64 streams_mask) +{ + struct max96712_priv *priv = v4l2_get_subdevdata(sd); + + max96712_pattern_enable(priv, true); + max96712_mipi_enable(priv, true); + + return 0; +} + +static int max96712_disable_streams(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + u32 source_pad, u64 streams_mask) +{ + struct max96712_priv *priv = v4l2_get_subdevdata(sd); + + max96712_mipi_enable(priv, false); + max96712_pattern_enable(priv, false); + return 0; } static const struct v4l2_subdev_video_ops max96712_video_ops = { - .s_stream = max96712_s_stream, + .s_stream = v4l2_subdev_s_stream_helper, }; -static int max96712_init_state(struct v4l2_subdev *sd, - struct v4l2_subdev_state *state) +static int _max96712_set_routing(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + struct v4l2_subdev_krouting *routing) { static const struct v4l2_mbus_framefmt default_fmt = { .width = 1920, @@ -396,15 +503,43 @@ static int max96712_init_state(struct v4l2_subdev *sd, .quantization = V4L2_QUANTIZATION_DEFAULT, .xfer_func = V4L2_XFER_FUNC_DEFAULT, }; - struct v4l2_mbus_framefmt *fmt; - int i; + int ret; - for (i = 0; i < MAX96712_MAX_PORTS; i++) { - fmt = v4l2_subdev_state_get_format(state, i); - *fmt = default_fmt; - } + ret = v4l2_subdev_routing_validate(sd, routing, V4L2_SUBDEV_ROUTING_ONLY_1_TO_1); + if (ret) + return ret; - return 0; + return v4l2_subdev_set_routing_with_fmt(sd, state, routing, &default_fmt); +} + +static int max96712_set_routing(struct v4l2_subdev *sd, struct v4l2_subdev_state *state, + enum v4l2_subdev_format_whence which, + struct v4l2_subdev_krouting *routing) +{ + if (which == V4L2_SUBDEV_FORMAT_ACTIVE && media_entity_is_streaming(&sd->entity)) + return -EBUSY; + + return _max96712_set_routing(sd, state, routing); +} + +static int max96712_init_state(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state) +{ + struct v4l2_subdev_route routes[] = { + { + .sink_pad = MAX96712_VPG_PAD, + .sink_stream = 0, + .source_pad = MAX96712_FIRST_SOURCE_PAD, + .source_stream = 0, + .flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE, + }, + }; + struct v4l2_subdev_krouting routing = { + .num_routes = ARRAY_SIZE(routes), + .routes = routes, + }; + + return _max96712_set_routing(sd, state, &routing); } static const struct v4l2_subdev_internal_ops max96712_internal_ops = { @@ -414,6 +549,10 @@ static const struct v4l2_subdev_internal_ops max96712_internal_ops = { static const struct v4l2_subdev_pad_ops max96712_pad_ops = { .get_fmt = v4l2_subdev_get_fmt, .set_fmt = v4l2_subdev_get_fmt, + .enable_streams = max96712_enable_streams, + .disable_streams = max96712_disable_streams, + .set_routing = max96712_set_routing, + .get_frame_desc = max96712_get_frame_desc, }; static const struct v4l2_subdev_ops max96712_subdev_ops = { @@ -453,7 +592,7 @@ static int max96712_v4l2_register(struct max96712_priv *priv) priv->sd.internal_ops = &max96712_internal_ops; v4l2_i2c_subdev_init(&priv->sd, priv->client, &max96712_subdev_ops); - priv->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; + priv->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_STREAMS; priv->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE; v4l2_ctrl_handler_init(&priv->ctrl_handler, 2); From patchwork Fri Jan 31 16:34:02 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurentiu Palcu X-Patchwork-Id: 13955551 Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11013016.outbound.protection.outlook.com [40.107.159.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 21A521F541C; Fri, 31 Jan 2025 16:34:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.159.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341295; cv=fail; b=KHATpiDJ8lep8P+Y/N6MBopJ/pY4Y4HCbhekv+Ocmk1dM8SAGcio6fCavTT5Ito2Li+oWDcxNPe1nbH3cM5gmb26XkKrXBN4gQMcvABxa22frIZExIhrzUE31Atj61jJB1ng+wsWI2vINZWviE/UFgnPq1k/3kPkByOJXavYzXg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341295; c=relaxed/simple; bh=BIxAODCRT4b/RqMBpSEuVPU+i4KH9OQ05l3UxK4xrZc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=NsmPaUsRWk8YH1U+d/M8Sg+iC0EfSYvWZWtTyta89j/CqOPV+vWJI0NWBTchkBleuUMOx4Q4q1KDbVqtN/uu0+VcFZfULexir1PBjKvkMOEG7BcRUPhIf6Z9xvBOG6WUU7sH8sunutjFJnaqiARO0JkCvOlJ4xUHA47hVp9SzrA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=Ko4AyG0A; arc=fail smtp.client-ip=40.107.159.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="Ko4AyG0A" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=LhyvtbrqiUXiaCROC6H55QC8OYtFXlRTmExEySm9TDQFtAps1vbNl/WeD7yFFyLOt8x+XKP6Dk7S+h1x5aX+vMl/F5W4fTtFMw9EO8M7slp0wyo8yJOHh1dESw2UaS8cZsgmwbw8niwKxfvO7afHU0b+uV90AGoz1DliET4RHE48to1sbcFC6D9yiRk6o4Ek6h3z7DcwCjwqeO13uot5swZXYz+J5/XMuwCntYTzw9xuOp59fs+YGXii/f019i28OjJl65zXo/edTdAMYJ1up17fJR5BNF/OmT1K2uu0IR1Le3Dd9ec+q1ooIIIadakOv7vu/VFN+a4/SBTEIJPSKA== 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=RY2ml1UZkSQulwbOkIY2vnPRiKe6V6H0gDP0qog4774=; b=fzHctqWnxgikEbQ94Tmqv5oMEPNQudsiuD/9/L/8I+g+wqohCtC72Rh2m6z/uidnBWTxhKRE0RoMrkPo3Kw2thN7wCNC9aTqqjT2fkYtx5BgZqXbdXjqHPqWbM7B4aLvOawUOy1ElFo4kLQECu1/1W7q3h/vCW7ydw+/MboaXvE1JPmDmL9rhjt1yaHersR0RBoKSu9PKCxw/eLuvvmhePUwo9TLLOIKsWlvSOKoiAuDAJEhz7CzsmlIi4PXGWr2ttIS0Ln2H06yvGzYeMzRR8CJ2EkR7N0emZjDkMAudvki/Obx6/vGu/dDMRNt17Rm/7Rq2Jty9lG48f6t+8nw7w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=RY2ml1UZkSQulwbOkIY2vnPRiKe6V6H0gDP0qog4774=; b=Ko4AyG0AFevE6/TUk8kJ3mticp82psl8PN1xgi9Ly9mLLWkQT2faD+yNWyYVmE8/nZwkOsfPtelVRJ2gv+6To9tYrgqX7cdVl2wgoqE/z7zsEl3PV9CrbDD5UuTFRQ4K1owxUzUUyl2qMu6rEUngequo8fbrnIf3smBZvnhRW9FeV2DhDFevPMoO903WMKQvdpb+2uzGWtRFoXicPRKQhOJeyu6wrQPTpbHma/WFu4fecd4wjkZsPj40u4TEp+Jiph+1IYaBEvBecVoEaotFdnoyzNuac3hmPZoxs5tmpcPDuV/ojdQHhekHWy31fcSYDh6k2d8skh3vRG/QAGFL4Q== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) by AS8PR04MB8529.eurprd04.prod.outlook.com (2603:10a6:20b:420::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8398.20; Fri, 31 Jan 2025 16:34:45 +0000 Received: from AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30]) by AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30%6]) with mapi id 15.20.8398.017; Fri, 31 Jan 2025 16:34:45 +0000 From: Laurentiu Palcu To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Greg Kroah-Hartman Cc: Laurentiu Palcu , linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-staging@lists.linux.dev Subject: [RFC 08/12] staging: media: max96712: allow enumerating MBUS codes Date: Fri, 31 Jan 2025 18:34:02 +0200 Message-Id: <20250131163408.2019144-9-laurentiu.palcu@oss.nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> References: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> X-ClientProxiedBy: AM0PR08CA0013.eurprd08.prod.outlook.com (2603:10a6:208:d2::26) To AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS4PR04MB9576:EE_|AS8PR04MB8529:EE_ X-MS-Office365-Filtering-Correlation-Id: d3afddb2-ff42-46a6-4cef-08dd42152bbb X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: CG5YKZw3ACO0sU7U1qrzXq5ipM+NDg4kXLilJc4EL7cI8egBW6DY921+uZSlZcXa85PS1rvl4UCeCcnCwzv08mBGU509l8IgvEMokt1puDkg63qNkT1WzSS/+eRPg2pzoVFk5JMgxg+uKCwWQRyhWsbQaJuxNkMUZNdVerE6dfOk2sBuMUQ3THTiRzJwvuP4L+VS6k0vcLW4xjhNmVw/N73Hur4hYgey6586QTXWNWP5CcWfXuHLTXFXtlJNSwtjqwTxXcxHFLxQncuTrfwHNFgRldgx8gYMilCpujqYxL7Y4CnRh1vwfboWwF1+PSh7G5swP8no4YHrb4wkgfncoyClYLoDlgdJX5HPr//oXShsYd2n+YF6XJGHZruoKZZ3RqUpOEhNOzEW4+UrOnZRwKuVKMrysnksHJbm7bBGkkwj2RZ3KdrzK/ZT52Pf4TC55CmCDQGbYRK8+iHhiIPabUR+iNTQ6L5YCElvnQwiCEt19beJsUvCb1cZh5rf4RSBCMMFnt4yrI7Ncy3dmxmbKokzcMi8ncvE6B2j5/Isv3XfLExFGxiZ859vOBYEh7vv/QAIPiyQt063p8pxDuGrXw14FeXQwnFKOn6woLK72CyQR2lRYzsYoNt51C9dOkfngeqgj5yfkv7b16OpZ4Q0sfBk03jHZwjZB/C6H1fXJNT9Bs4I5hB5c6bsc0avMk6YQ+fwvQuFoqR2Hk7p0FbwhOw5mnJ389ld6JUWDNHSQ5v5g2JjwaZ1RM7gFvfNvZ9Ow52nZs3GFyEADO26DjPBdqJVos8hVKfrcjhZwZcnaqbQDI5MN5a9xarP6VqpZVoI6yv18aDO0lAllq8mRcI8POD97VlU6XyJMsdI/q+pczFb58Ro3WLqOugtvyT9iQXfi4Y217tuN4GXOwm3L2rKqK1/ECeFZMrLmsCnat6qFDdpADRWaRrx987ZDaBxku3RhEMDqW0Kixyp+YQFuQR5ty9yv4PvcdNWTEnB6lqrG31fokZ18f58NQpgmGMwau/A+enZyObaSsAXHTI6C0UeWV/+nl7Pw4FZAdIa5LWsqOxRCCjVB1jCro/hinsJO8iFqbDtlyd38HzdSwGLaEyuvuAtxyijod35VMCRwnD0va5VdcLlTyLvqRdl4kJby3GxANXBbN5pWTZiddF/SQoy5c8TmcNGf7GaV/zLuYCEyCNrVnH5PfmQSHpzYUZK4g674RZpNhWv+6v3nFmoZYeHznNPt+YGxtVHfyxoMFDwVjq1kfhhsRa7TQI5Td7g1XDw73GvstsvSdlPbW4tvfxMIDTg2WXjmkaFP4hTIeEq9CS5vyNLoHmkvp7CJJlF8vpTuQqYAOV529jG9822DdgfdN4jA9A/672cVkFtuAoTNLohSUWg/aJj0/hVLVG+Lbim X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS4PR04MB9576.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 7Ka1J5b1lEz8gYf/H6KOBoFY4egPFROxZOQcKd5Eq5HScqxoEVxIcMbJajntgjCJcOfI9ipaEmzFWiKoT6nBEbxB1jT677S+V+dh+eL4FwRYB5144wRGv6DNjehCmtqosMCLL2AQWoDItv83/tZyUK0Qwo6Wm1Ycofe8y12/XcrFbLLfYzzp4nP7YSX7oeAw67F2k2NiKGem9kPtxuX81cMpyxiLerfQQGX3t3uaqW5asLdBZj1i3PCbLpyIPwXIQiwpW8s2rX7RE1blrPmscui0nPWx5iv8q1N4NAOFXlnY1NPdqMzOPIq023UVF7BlmTLFqlIKkqyH+9bfbAlr3CILDcEj7vfpvrkrRBWlPYIy4b5vQwDDcjq8LRpAkkN/0sp9HMmcpk4mLmk87Gt8Q9XKz2v5e3LKe6BKtOuZX2L86ymDIsVEsqPBBnl+VQVSHf4q3qZz/xpykTvLm8bLiSzyIACQ7vtQLmy5adlItCGilfN75tMFS7yUtWp6o3RCzsRQW/qCHLxDDxeg/QqscwPkQmYEDvhYT6Dm6cEhhvqgkkWA2fPKHVsTj+C306gUIAJYZokEHJZlVtKrU4Tz1dsQC0M0D/Wo9k26xT5RKyeRNVQkCKOjir91DSUEfNWJ/k5XGXTYbW9Zoc47dSyRBrRt6YbAVYURdoJItMyFjfHHB8M6w3KkQgMZGTu8uSnnCelCsUY09sLzpNECZ5eC50r+rEAoyar+cfdFlB+G3Npjd9vXxGDEs2VmR/79KRz9Xc5Kw18G11ss9z2kfBOO4UfdETefdiAr7UqQWntaQJH0xJqPofO3PthQF/wfmVXhPj1EMV4qJDNcGvCOXb8K683Wo6S4n8lKVGlsVLQZf0WWRg5kcy0Xg4rd/k4yXIirJywdr6aCOoWk1LcpwWFUisCf7ndDeCydvddAYktJXgsil5hKUdZPQuebBFGQzRM14dQqmFdz0HR76Xke8uAG1DzSDdFmdmrRihIF31dElyBww2G9R4sH/92Nn9+T1pJwES2wbceRX+cyc4okwlzRqSuon1OSa97zdc/RYxC9Dyife8thIXCnfjPHJCP+aMjjLRTfjEputWEgdGuwxOe9iJDssUmxaGb0CSgMX09KNZKSLPznS7JDk17Bu8UsqZZ2Cyinl5uso1oYXt2jRXE9L6KkH6ZIf6xfI8PsDlQVKdOTk0Z3xCXVWOOhCPN8jpKn0WX0ai4zHdEroXOeJyxXpvi1Durf53wWkzVyCBt5lc6eyuQZgY1L5Sr6bdXR95/YCWeyOgZZpEM+11rjV0eLbydt/xyN6B0M/2EkzCGhjtiIYhab9CsgbdIsWoNn7214qsqdf+8lZWgODyHaLzHNh0SLxL7L2nMW/DfI79qZaj6DmPGpxpuckmKzrlpMSnrMDC/Y4DkBpmJAR9vR2fyxRK6wRcfC7hbtrlO70RGNksNeICznULaG3793z43ZCrv1l1xwsPpVlX9dhpxyZT9iUEz243jmUJ1ftWSyezCJ04Zn+9cywD2CEKI17d+mAkbAM+qWsYxpzBW/p16I427NXQzTGOk/T8oH/l2zYA2IVBhg3xj3CdwACy4OblljTnSHC/a8muVfcbeA0aDWWDrUbw== X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: d3afddb2-ff42-46a6-4cef-08dd42152bbb X-MS-Exchange-CrossTenant-AuthSource: AS4PR04MB9576.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Jan 2025 16:34:45.3626 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: YawDTQGpv/UJYUcaejk/TEWrEJLLkBBa8oK1RBBw9wviYiqgEiqjDqI/Bs9BUWc7/Dsy2kKQUe2Bg5r0auXEzA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB8529 This would allow apps to enumerate the supported MBUS formats available on a certain pad. Signed-off-by: Laurentiu Palcu --- drivers/staging/media/max96712/max96712.c | 142 ++++++++++++++++++++++ 1 file changed, 142 insertions(+) diff --git a/drivers/staging/media/max96712/max96712.c b/drivers/staging/media/max96712/max96712.c index a078e4c67c360..d735798effa5c 100644 --- a/drivers/staging/media/max96712/max96712.c +++ b/drivers/staging/media/max96712/max96712.c @@ -199,6 +199,107 @@ struct max96712_priv { enum max96712_pattern pattern; }; +struct max96712_format_info { + u32 code; + u8 data_type; +}; + +static const struct max96712_format_info max96712_formats[] = { + /* YUV formats */ + { + .code = MEDIA_BUS_FMT_UYVY8_1X16, + .data_type = MIPI_CSI2_DT_YUV422_8B, + }, { + .code = MEDIA_BUS_FMT_VYUY8_1X16, + .data_type = MIPI_CSI2_DT_YUV422_8B, + }, { + .code = MEDIA_BUS_FMT_YUYV8_1X16, + .data_type = MIPI_CSI2_DT_YUV422_8B, + }, { + .code = MEDIA_BUS_FMT_YVYU8_1X16, + .data_type = MIPI_CSI2_DT_YUV422_8B, + }, { + .code = MEDIA_BUS_FMT_UYVY10_1X20, + .data_type = MIPI_CSI2_DT_YUV422_10B, + }, { + .code = MEDIA_BUS_FMT_VYUY10_1X20, + .data_type = MIPI_CSI2_DT_YUV422_10B, + }, { + .code = MEDIA_BUS_FMT_YUYV10_1X20, + .data_type = MIPI_CSI2_DT_YUV422_10B, + }, { + .code = MEDIA_BUS_FMT_YVYU10_1X20, + .data_type = MIPI_CSI2_DT_YUV422_10B, + }, + /* RGB formats */ + { + .code = MEDIA_BUS_FMT_RGB565_1X16, + .data_type = MIPI_CSI2_DT_RGB565, + }, { + .code = MEDIA_BUS_FMT_BGR888_1X24, + .data_type = MIPI_CSI2_DT_RGB888, + }, { + .code = MEDIA_BUS_FMT_RGB888_1X24, + .data_type = MIPI_CSI2_DT_RGB888, + }, { + .code = MEDIA_BUS_FMT_RBG888_1X24, + .data_type = MIPI_CSI2_DT_RGB888, + }, { + .code = MEDIA_BUS_FMT_GBR888_1X24, + .data_type = MIPI_CSI2_DT_RGB888, + }, + /* RAW formats */ + { + .code = MEDIA_BUS_FMT_SBGGR8_1X8, + .data_type = MIPI_CSI2_DT_RAW8, + }, { + .code = MEDIA_BUS_FMT_SGBRG8_1X8, + .data_type = MIPI_CSI2_DT_RAW8, + }, { + .code = MEDIA_BUS_FMT_SGRBG8_1X8, + .data_type = MIPI_CSI2_DT_RAW8, + }, { + .code = MEDIA_BUS_FMT_SRGGB8_1X8, + .data_type = MIPI_CSI2_DT_RAW8, + }, { + .code = MEDIA_BUS_FMT_SBGGR12_1X12, + .data_type = MIPI_CSI2_DT_RAW12, + }, { + .code = MEDIA_BUS_FMT_SGBRG12_1X12, + .data_type = MIPI_CSI2_DT_RAW12, + }, { + .code = MEDIA_BUS_FMT_SGRBG12_1X12, + .data_type = MIPI_CSI2_DT_RAW12, + }, { + .code = MEDIA_BUS_FMT_SRGGB12_1X12, + .data_type = MIPI_CSI2_DT_RAW12, + }, { + .code = MEDIA_BUS_FMT_SBGGR14_1X14, + .data_type = MIPI_CSI2_DT_RAW14, + }, { + .code = MEDIA_BUS_FMT_SGBRG14_1X14, + .data_type = MIPI_CSI2_DT_RAW14, + }, { + .code = MEDIA_BUS_FMT_SGRBG14_1X14, + .data_type = MIPI_CSI2_DT_RAW14, + }, { + .code = MEDIA_BUS_FMT_SRGGB14_1X14, + .data_type = MIPI_CSI2_DT_RAW14, + }, { + .code = MEDIA_BUS_FMT_SBGGR16_1X16, + .data_type = MIPI_CSI2_DT_RAW16, + }, { + .code = MEDIA_BUS_FMT_SGBRG16_1X16, + .data_type = MIPI_CSI2_DT_RAW16, + }, { + .code = MEDIA_BUS_FMT_SGRBG16_1X16, + .data_type = MIPI_CSI2_DT_RAW16, + }, { + .code = MEDIA_BUS_FMT_SRGGB16_1X16, + .data_type = MIPI_CSI2_DT_RAW16, + }, +}; + static inline bool max96712_pad_is_sink(u32 pad) { return pad < MAX96712_FIRST_SOURCE_PAD || pad == MAX96712_VPG_PAD; @@ -379,6 +480,46 @@ static void max96712_pattern_enable(struct max96712_priv *priv, bool enable) } } +static int max96712_enum_mbus_code(struct v4l2_subdev *sd, struct v4l2_subdev_state *sd_state, + struct v4l2_subdev_mbus_code_enum *code) +{ + if (code->pad > MAX96712_VPG_PAD) + return -EINVAL; + + if (max96712_pad_is_source(code->pad)) { + struct v4l2_mbus_framefmt *fmt; + + if (code->index > 0) + return -EINVAL; + + fmt = v4l2_subdev_state_get_opposite_stream_format(sd_state, code->pad, + code->stream); + if (!fmt) + return -EINVAL; + + code->code = fmt->code; + + return 0; + } + + /* Internal VPG pad only supprts RGB888 */ + if (code->pad == MAX96712_VPG_PAD) { + if (code->index > 0) + return -EINVAL; + + code->code = MEDIA_BUS_FMT_RGB888_1X24; + + return 0; + } + + if (code->index >= ARRAY_SIZE(max96712_formats)) + return -EINVAL; + + code->code = max96712_formats[code->index].code; + + return 0; +} + static int max96712_get_frame_desc(struct v4l2_subdev *sd, unsigned int pad, struct v4l2_mbus_frame_desc *fd) { @@ -547,6 +688,7 @@ static const struct v4l2_subdev_internal_ops max96712_internal_ops = { }; static const struct v4l2_subdev_pad_ops max96712_pad_ops = { + .enum_mbus_code = max96712_enum_mbus_code, .get_fmt = v4l2_subdev_get_fmt, .set_fmt = v4l2_subdev_get_fmt, .enable_streams = max96712_enable_streams, From patchwork Fri Jan 31 16:34:03 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurentiu Palcu X-Patchwork-Id: 13955552 Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11013016.outbound.protection.outlook.com [40.107.159.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8DFCA1F5435; Fri, 31 Jan 2025 16:34:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.159.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341297; cv=fail; b=MLJFyo9e2pZstzNPquhlTgUQjZjDuyDmzFgnDG2ikcYSb0FWntqDTsz5r9keqYgXHUDTBwU2BHIXUnpXqL6+ezUV51lEBJazQ0rJC1MwhHpDAyYlSvF/VGRwNL+MJUTMw5c/aFjkdbupUghuaxwRJrpjM8rhGepTnhe2cYN9r3M= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341297; c=relaxed/simple; bh=fRNHTWxDFYyTsrv0QYiefZZYb2AVArN5438n1axWlyE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=pZse5PNZ/Z62bbyKSQ8mK5bqMkXPd+irU8mV4BD8OBNGaOTg9bo0N9C6BoK2GZz3QnSGWcG5OVnYxLXESnwScXMJTdwWrLw1uMaYeBvNjYe92Lui1RfwfyLM2o2dXEAV5cZ1iHd85HywjeVmJ1zUflTGLgb0aaSa+Z7eD1i32tk= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=neazvYEU; arc=fail smtp.client-ip=40.107.159.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="neazvYEU" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=hK2vicD+BH5Cj8L+j6un7iEMHKmhLlwHvrHJ8S6UEuzo3GWca6QGE04jVRE+NWXiuL9S66uqpRpW9YvlZfwElVNlW0DNVBdUWukPdz0bgHXBwvwQgwP7FXejXlRy8zFhXoFdNe1im46lZ8ceFox0RM5XMeknstlrcVeoEoWOsa+GjGXyPEyblaizVMyoqxhYOJcAHnXlV4zoF2slQZlDMMYPacT5kq00kub5mpqK5YOXYlxzS4FOl8HlE9xTo0hsWdEhORiKBTXGfWXILb3o+t9QwPfjuM+8KEANws3KaiyC2ihYeXOSQN2v6GM9kVSy1fpXTKElBkRa+967GTWFHw== 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=aSW0G4OXovQaBEsBShWAmHq4Q7Up1gDrLIl6BdRgZbQ=; b=bsFnGwICVB7h0XakYuTkdxLUpB4D6O9dqjr4uklIKDkZ0fgV6+eI8y20jqEioOL5HwCgKo5rp7VLBVKWlZM3s6U2YEHwtDIuvOLyUDYNxwRXmgBcDx0t+6ck0JQILzAUtOiLx9qlU7sZz+t0IIwjN3SLAX77QK5PwbnR3PqmivPlDuaMUEhAIfA9MNNJ8bynP5EMBBqvy39/1j58jdzSCvLke64cM/W942kQcbVlVTgVZRoPBJdcKbctiBnqayvpz151dO7i4cPqOVpSeL2EOXKC4o0chuv6i5+lfOTGA7RwFetDPVi67pBtWnScN1B+SpnF7wk5+4Q34yg4w9XQEw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=aSW0G4OXovQaBEsBShWAmHq4Q7Up1gDrLIl6BdRgZbQ=; b=neazvYEUN5XwHXRyPFYIwIOg11Hc7MeQd/UMUGPG1A9VIKgPCQ3YVxxF0gUeroSESiJbmk2ZMPuQvrGDVtxg9hiZVAZwUuKWLwPG4LnzuFzUh8yUAVNXHDbXeRmC8WpNw6Zz6FMgeXQy8k9fKzJNGL4LRMws2akf7DKxGmmbqUGzrN2e40siYx+BSHF68hOwjDcvhZ0GQNdV7AL8PhnCy2wG7Lfmy8DU/V89bS5yRh9aAVZyff2jbLE4TqmrSugRPH5F5jtT4HhaLVb2ESfxRclV9qlLOz9oELXt1KlylGId8TKwNTj2PbzaGmzT+QCeSzxRIjTUUtUtvgXUgRnvIw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) by AS8PR04MB8529.eurprd04.prod.outlook.com (2603:10a6:20b:420::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8398.20; Fri, 31 Jan 2025 16:34:47 +0000 Received: from AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30]) by AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30%6]) with mapi id 15.20.8398.017; Fri, 31 Jan 2025 16:34:47 +0000 From: Laurentiu Palcu To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Greg Kroah-Hartman Cc: Laurentiu Palcu , linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-staging@lists.linux.dev Subject: [RFC 09/12] staging: media: max96712: add set_fmt routine Date: Fri, 31 Jan 2025 18:34:03 +0200 Message-Id: <20250131163408.2019144-10-laurentiu.palcu@oss.nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> References: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> X-ClientProxiedBy: AM0PR06CA0122.eurprd06.prod.outlook.com (2603:10a6:208:ab::27) To AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS4PR04MB9576:EE_|AS8PR04MB8529:EE_ X-MS-Office365-Filtering-Correlation-Id: 33a0f83f-aa17-4247-1d61-08dd42152d1f X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: Nn6ghpo0r4OzulyHPZ2vu4ztw9KnAcaVHUou9ysRzN8y89eFrq7AsZ/Zgx4UED0dWCK9lTRjsiMAUS6M90uk7Hfglw7A5qz75vRE9WBz8JwKYphRw3V10ItcdaTzJ+AkawNbloBFm2zJZ8hapLenTfmpTdHp20UuUKWpnSxhV9hgM4neY8MmC9J4uW0i2RxbeP3CwHVrQxxTDfheZvCzd6vMlvoOAfnxRPj0noBp1ZyvF9Fr/9bw+2HswPxZx7xate/z7J6AVvC24OnqeYEKpN0/tBo5w2iF6udeK9B/oWtW3JaBlay+piwL3nPolxGRQMkMNBqc8U8aaxXx9Gh8AmDDqDhZdk/roe9WUhv+tFIea4SszTC67iDMgivbTTHoFtiJBK77EglKaktNIyFceJRiqZPE7mo5dSNQJ4bxgJmsIfWEIoWb1PQ+hDhMoFzylZmd5oThJbys+WpvLbErl6hfx505P5M4w2dsJvYp0iZnwOguOhe1PSa1qlF2U6SIolP6QGOq+Ci7y3llr3FFiD3BpfSAG5LSumaSWU9qszr7EVjZEwuEBvcTxWlrXdPkIbKcyN8RZnbEVegZGbZcW/RXj2B6uLRu44LUjSC18DFMfYSosQdcPrXyBTDWXAOK81XmF7xGthl8DT6nxShFbH3ibg+BgJeVa9G9y54wMuPDdd1yrW3A1Kn20EHECzr2+ulBd4NNHUEcmkEfIGRNnf/hUO45wYugR1vXFrsa5b7uUEJ9mM1UeEL/mUoPjMAfTsJO8gDYBkn1kIy8q329dO1tFucI+hK8AHuUdKaTKV9dUmmcmIg2U9/gybrNgBARvliQrNKk3cAhhyFKANol/gQrU3DOK/WyHIp7HyfLtXvtEi6nvzMw+js8Q156olFIwwMZT79ucjzrKPbh8Cu5QOZoFGRKMbfideu7+UPlk3VYccy4QRsm4E57Sg9D46F5wfI9Zw4hDcDPU/eYyL7g9Sf4Qdb+ZF86u0AcQGiVD9cu77ISxZ6Ga2vCPpMca+W+2nd8TVbSEKKjXK6qWijU4Y35YyvqCGZrEidaOwxQ9CEo8bXbkRyvnilVFCO79M0cMBGj8/1N09I8o95iOWWt0GadPkFJd9Z6vNFbMp0Rg44ue0w0AxbevWVv460pooS9L/Oou1vyG47wrh0cPRUu20mzGBk+7CKs/kMWOZjvSTLeh+hFbZvsnAiet2ME9bPW/5d52t3AxYGuHP7pZDDJuAS+pluy0Oou2sKnBtygfG4YZ9SFE984UqPaEC6+FqI8qJyi9954dOEoDr8pytUTEtE1MDvblkHWt37Q5Ri43ttWCX+SXX+hyLhqHwBd8QTPDgfn4bygCSU9uLpWwpmanaP28wxrjNKEwZ0W7Jr4ytvV42BldDPdQcg6cpC8Gli7 X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS4PR04MB9576.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 8A0Zpcz3EYFNtyzSu/uuyIBV295syE2fitbXCVaBAPY/Fjm4xC/8NLMhIdIt11hocpynoyAQhHox3EZuRbiKdK4WrpYrzA3pNzjbRI+QnbvgHmUtbTyuK26bhrKJ5Kx22JBVrBrKapr1jYEIBxvhvCmovVLniTkRgLvcIxfl96NMhK3A9EXn9Cb5U/a48c6rAnUFvI5ZM656iZY2M7X8EnqPVN/zx8W6BNkvcfUE0r6SoeswZLNnWnL80gc7yg4KI5RRsetTyasDcKSqT/2EtbfS8qUUzJy1XGQCbqEFRucV0QM3tuZFtnfddxyEv/ViJ3068XkgLrscTru1CO3/6wDrU4PJdGd9RGTQSMVIJ9TwDuStjzh6ABJQmh4kqVyBwQc1rBXCr2unNrPUdDUywF5DudczIA9Wt177J2VijHqWM3zDXQWKBrBq+aXuGfQhQWiy03lnGLG168xq+tSIObGyBnUTRJTGXY74Gv6sK6jRrH5wEaPjWtIaIpMcvRec1KTrGK9xUggMQpUkk3UQ4Xiwuwf4ZynPo5jnmp9ARhZIW97FPgFnPn3mkUnHPUVpw56tPBtd6Mx8Dpm1jmzjpZsGq4JSY88JcPdQcnHRLc9OvukL2UpqpyPn7tiSaTPLwB0w1zQBqM2diSqABxRgOMqwdb+81dHMOHK5fQp6thQO+ALsn6f7nr2J93pyO/ffo7C3XZANrmvA2XgnNp/mDTrfggqxrfwgBKqlvGywycvonEYmI5MCKZK0rlPR+Tzln95mCVkB6Q7gRGtKuMIKCbCv9U6nnd/3/nISOkRAXV2yR/cuWBP5yUtECbYwVnaXkzVXLwrA9NYpwCSWzSx4G3oH9iLJmmMLI+YGV44Qf6biCBDt2L/ob39SHkfovJYFk8QnzSArz025vebpwFhJfLkM9Q4CymPDlklyGAqYTdr9rUxe5iusJfvK0G15m0CGIcUO00KNljaXpJxkmeJ9QIDvIoKNOojJjTpTnSFOsVaItJte+J07T9Pl/Rt0RZOS630BcXuzeBXlh2EH0MS6wj0NJ+oAaNh3mm86baOqtK3wJjfzThYVAKXWdHmU3fNx8QiqmOYVEwljqs1J8HPnsmkY7qRd6ezqe9vF6NV1rT2VhMt2nqHl4r8CL4vkdWLhghKEQU9ZVuDojVmDB8MzZesuUqEtWLNMYyvUO3wW+kkZS5dEYzq9GWoRp52MNZJ7Wg+L1hWrzCzKeZ7NyL7fF1T6TFzpyAvVSg3RCRigQ0x78BfuIJP/qTAWBxJflL7l0/FbG58OqqhCPT2nvkBkuqv/USR/RozWB71WNCymcpITgkydX/1xRINZS6JCiFIQfRygiugC6GotC4bWVWU+4WKXIGR9d2qfonx6J5fXChE6JIzY0jqF51VGb1+Z7T6Pql+g1srMRLUraoXf3S0fKoBJwx3YQpIcx7w5mCb0fvoRI97ark1lBUuXFsF7g9YjIxfRmSoHGIZYA4bp3+/gt+ecQj/OINO/NT+1Ejeae0UueM1Rv9TadHBwK5yzoKgHzuUtYIHgdBWcm5EjyaYsl+ugi6rmBpXn8aLhgLy7yYRbYBkW02XtvdBVODrONhaCmb+ZNtuGBQ1S7N4JERKEew== X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 33a0f83f-aa17-4247-1d61-08dd42152d1f X-MS-Exchange-CrossTenant-AuthSource: AS4PR04MB9576.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Jan 2025 16:34:47.6793 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: oyP41MtJHuS99C4xqefCJvf96FFLpqjha50PLkpULQkAY9c08Kqw/jyzNKK9Cw7E+VQMzFNB6e799puAZQtbtA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB8529 Allow apps to change the format of the pads. Also, use the provided width and height when generating the test pattern. Signed-off-by: Laurentiu Palcu --- drivers/staging/media/max96712/max96712.c | 57 ++++++++++++++++++++--- 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/drivers/staging/media/max96712/max96712.c b/drivers/staging/media/max96712/max96712.c index d735798effa5c..ed1d46ea98cb9 100644 --- a/drivers/staging/media/max96712/max96712.c +++ b/drivers/staging/media/max96712/max96712.c @@ -417,15 +417,18 @@ static void max96712_mipi_configure(struct max96712_priv *priv) max96712_update_bits(priv, MAX96712_MIPI_PHY_2, PHY_STDBY_N_MASK, PHY0_EN | PHY1_EN); } -static void max96712_pattern_enable(struct max96712_priv *priv, bool enable) +static void max96712_pattern_enable(struct max96712_priv *priv, struct v4l2_subdev_state *state, + bool enable) { - const u32 h_active = 1920; + struct v4l2_mbus_framefmt *fmt = v4l2_subdev_state_get_format(state, MAX96712_VPG_PAD); + + const u32 h_active = fmt->width; const u32 h_fp = 88; const u32 h_sw = 44; const u32 h_bp = 148; const u32 h_tot = h_active + h_fp + h_sw + h_bp; - const u32 v_active = 1080; + const u32 v_active = fmt->height; const u32 v_fp = 4; const u32 v_sw = 5; const u32 v_bp = 36; @@ -608,7 +611,7 @@ static int max96712_enable_streams(struct v4l2_subdev *sd, { struct max96712_priv *priv = v4l2_get_subdevdata(sd); - max96712_pattern_enable(priv, true); + max96712_pattern_enable(priv, state, true); max96712_mipi_enable(priv, true); return 0; @@ -621,7 +624,7 @@ static int max96712_disable_streams(struct v4l2_subdev *sd, struct max96712_priv *priv = v4l2_get_subdevdata(sd); max96712_mipi_enable(priv, false); - max96712_pattern_enable(priv, false); + max96712_pattern_enable(priv, state, false); return 0; } @@ -663,6 +666,48 @@ static int max96712_set_routing(struct v4l2_subdev *sd, struct v4l2_subdev_state return _max96712_set_routing(sd, state, routing); } +static int max96712_set_fmt(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + struct v4l2_subdev_format *format) +{ + struct v4l2_mbus_framefmt *fmt; + int i; + + if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE && media_entity_is_streaming(&sd->entity)) + return -EBUSY; + + /* No transcoding, source and sink formats must match. */ + if (max96712_pad_is_source(format->pad)) + return v4l2_subdev_get_fmt(sd, state, format); + + /* Validate the format. */ + for (i = 0; i < ARRAY_SIZE(max96712_formats); ++i) { + if (max96712_formats[i].code == format->format.code) + break; + } + + if (i == ARRAY_SIZE(max96712_formats)) + format->format.code = max96712_formats[12].code; + + if (format->pad == MAX96712_VPG_PAD && format->format.code != MEDIA_BUS_FMT_RGB888_1X24) + return -EINVAL; + + fmt = v4l2_subdev_state_get_format(state, format->pad, format->stream); + if (!fmt) + return -EINVAL; + + *fmt = format->format; + + fmt = v4l2_subdev_state_get_opposite_stream_format(state, format->pad, + format->stream); + if (!fmt) + return -EINVAL; + + *fmt = format->format; + + return 0; +} + static int max96712_init_state(struct v4l2_subdev *sd, struct v4l2_subdev_state *state) { @@ -690,7 +735,7 @@ static const struct v4l2_subdev_internal_ops max96712_internal_ops = { static const struct v4l2_subdev_pad_ops max96712_pad_ops = { .enum_mbus_code = max96712_enum_mbus_code, .get_fmt = v4l2_subdev_get_fmt, - .set_fmt = v4l2_subdev_get_fmt, + .set_fmt = max96712_set_fmt, .enable_streams = max96712_enable_streams, .disable_streams = max96712_disable_streams, .set_routing = max96712_set_routing, From patchwork Fri Jan 31 16:34:04 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurentiu Palcu X-Patchwork-Id: 13955570 Received: from PA4PR04CU001.outbound.protection.outlook.com (mail-francecentralazon11013049.outbound.protection.outlook.com [40.107.162.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4D7451F1300; Fri, 31 Jan 2025 16:35:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.162.49 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341330; cv=fail; b=oB4i8cv+MEjz+Ay0h0B0RwDJGPdnvM1Dl2y4jwB3p/JNk2sncxkmPkTCddGi2IZGvsI4GQDkKl+Z2VH6Eiy3FnH1Swiw7o7CNF5kL2pMLli3vF24g21cKMq+9n4WFkoGG7wwk8RxyhdtPwoaYKT9JRnEvO52YWoNnXCZYwh5B9Y= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341330; c=relaxed/simple; bh=ScbIN9E6UvPErbTjewPQawKMhn7RGAdVDugBxka+uhI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=EXzgrZ+tC+O97GHD4Pr6VbwtoQ83HxDsJhQ5udLr2DrAu3+KGsGtN7YnZaGrDA1wBW0qrqitOz/mvwNfUGCUgUxWlmTfXh9glFJ6g1bUIDRybch/QV/RsCx1p5jkDE7mghWE/W3TqqOi6c+9C7/vjwyOYoOa9oSWwSaeq7mdDWA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=aev9DyKe; arc=fail smtp.client-ip=40.107.162.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="aev9DyKe" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=kG/eYg9C6eQDO6ToeuMEDEKqSZC7//6QzEnG3e7pK8LIQT64vHLlV/GCcQISFOJq027emrien/zJXjou+Q9nEY1cakf9PBBDDtvFsHhZOZw9X4BDVMpioDWBFu98uvKqo7iCK0O2T3X5jQKdQxT6aCvnV58ejHALfyWmkyYogK1A5GEP5AEDrd6Z22+cySc/MLbj7qFXpzPbmvCVS9fid4oPR5DqT19EPLKzeMhLwrehT9TsPkJoiWgwoIZfSJHH00kdRPxlzvEtig+UejNc3gLdhPEqH0dsfhw9t58BAzbIdjo+AyhABRpwxnx+JHPbaWLq77E0HDxABrvdAb8Tog== 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=wttD6joR26DBTP2Qmp+TYvMnlNC3uk887WLbKZNMnfA=; b=kwAsLBgU7QQQ27b7z96Ks40JbW1Dqt3BI6YoehXj0JZDcyOD1Z6Jqs/7gmcH3Ar4bGaBCv0bM2iyVGF3NWQSPmQaawuCvLqKlkwKZq4m6OVZLRGzLnCzuae+GnVOjEDZhabt+BlxRq32U6ju1+PBo6dKNNqLncw1DW5xwNWsKoQ/FvTSm8lJEODQl0/+SkBnyIBjHFTjSKSXstt9OxDCoUu3IkVALs95ThUtyOH8E/SwoSELLKKlqm0BVsdmYV4AWSE38T7c2VlynWM9tPy1U1twWGImV8qC9tzn5eaJe1GPzrLWcNlYBI2bFoct5wAonFWyPZANIyW8W+JQJU9D1g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=wttD6joR26DBTP2Qmp+TYvMnlNC3uk887WLbKZNMnfA=; b=aev9DyKeZJFtE6QJISMd5dLNi19/HwV9+lyOFmWzASJOlrXs2LvwtdDC4LufjYSg0Wa/L1Kn15XxOd3atDwlYijGu9DTRMeQIBC42QMOnpieBnn0qVH8diJjm5pyhfQy3JCExE4RiQEOtYruSh6TkTBBEgnicBiaSNemeJ/cUU0wNxMhj+hmC8fUloju3NQ18jsEcX4JxX0u29xar0JUsL6ZXjiMcZaCslHa7dzyOfqFzExf0dZbQAImzcZAk8c+vnC7EHRMOlKdP0CwCNCYwkZ67qx/u176CYceb+nXuabw6UsEh+bKUdLiOFGhIiZ9V4rakmsyhS6OOfNd37WfrQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) by AS8PR04MB8529.eurprd04.prod.outlook.com (2603:10a6:20b:420::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8398.20; Fri, 31 Jan 2025 16:34:50 +0000 Received: from AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30]) by AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30%6]) with mapi id 15.20.8398.017; Fri, 31 Jan 2025 16:34:50 +0000 From: Laurentiu Palcu To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Greg Kroah-Hartman , Linus Walleij , Bartosz Golaszewski Cc: Laurentiu Palcu , linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-staging@lists.linux.dev Subject: [RFC 10/12] staging: media: max96712: add gpiochip functionality Date: Fri, 31 Jan 2025 18:34:04 +0200 Message-Id: <20250131163408.2019144-11-laurentiu.palcu@oss.nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> References: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> X-ClientProxiedBy: AM8P190CA0015.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:219::20) To AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS4PR04MB9576:EE_|AS8PR04MB8529:EE_ X-MS-Office365-Filtering-Correlation-Id: 74961cd7-17ba-415d-4969-08dd42152e94 X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: Ae9+1W0fg0OTBAO0+coC/nAU+UHiJfrSqzC9aRj98tfQW1+k+OQO8oqkuA52xkQoBY6JO6PhJvkE32OUZeGAhRVJbmuxcTAcvQE8LDRKw6/b4QDMgaqEgdjfBkQOGQdumZ0bu3zye98V8FphInC9tjlEmiwf/Dy4Ts1iRX7eYJn90U4jQ6PfGKmsSYfIr5E/9WYMyzDtXXTnTaGWQIEY/t4TifymJhUYxltzn1XKgCvU+7r/RjPLLXzxtQpdZB5Nw5+szmw3rtXMvbbm1rdn+xkppqXcMcIgim6JOcVaIPk1v2NSXTJR3aKxfdeApAV6zevLgfmY39UCEuxXKiJaAbps8fZYXY69olq3VappS3Lo48VRblAWuLPNgTjsyvuZtRoD0O7d+aQcEOINZzY5iZg0hAXpdtLSHM9aG56yWJIqZlyUpdD3XWMHC+xKXKeWco2jAlS9QqNzGITHvcNNJl4VvZngidW0ZT+ap3d03ZNTvhz45c/uapwL5Q4tLXP9j+8E9tsCEOFUtlQF9PUhpKqz68BJohYpRUEhms54RURpUbiHq0MaaFtiNUm7qdil3W4AChWv8RUNSF0FoWlBozsfgkep+g3jQkHFu6Mugmxcwbn+xa1t2TC+rVBKbzaHI7q1EIGy/7Emy0Pm2LzSPBYdeGe6K5pInnTauAQSniryYoDF3H2+3SLmwlnnFevezqCzrnhldXLuZLtQsZBv/B2W38NZyZmRMkCk+0/rs7jp1e9M8bKTJLOU2Ubkqn9I11M9dxtuQwGmykaQroDfdrjqpabjlb79QCG5XBkDZfylYRXChXvEeSfdtm81m35Q0SsyE5/h9JCTGrPxNxuvCq1nBpJzW/VN9kO0GyDQ/mrvmzGGvFkvXe8SN1z5D9wamkq5aU6/4yPRP3NESjaN+Xdc21w/71AAFGyGAZ/xR0DSxD5/WYCqfHV4KwulxaOpji42O3ZOUg459JiCrSLFdqYzQ4ourGl7AEDheoQUw7625zdud4WyaUMU/jnXEEG+aedOR7e31cwOHQzIJTgY7C3AeKUz7MRFvi99MS8c3tvd7vqmByf90Vmk7+cujFtrTIFJoDO6H4iC8L40obOlv0fgdnr/hxq5yswV7Pn4iLmNUzDBNu3hso9kPSaTf8inFhJaSnhyharwycKkHLFZjORQYF3c6rnj/IMgSxGz626m/CyYXNrvJOdaO4W0l8XSzvc6sB9Rs0449GPn92sGVWiJBkuya2Cm+Z/kCgOvwThANpazhCuMFnZKtb8XGDjO2t6hUO7Ud/1wPYzC6USkIA+pUS5pmQ81EcAvF82AwpgnaFCUCAmzuAHaef9NkglrJVHk1ed4HpPGXOQ4LNY4MVzfa93+aSdd8FCp/KKDn0i/wkuVp3m463GsGe4DaEzf X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS4PR04MB9576.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: LFF+JQjb7LeZ1DAhI3cjxzjIrkSq31UXWGU38jaOAnm8EzRh3L5a+YTH8SnVzB9946uOnhDtoedWiAkr25HOm8QQmBV2ekmKTnjIX68MVT08e6ovu+6Fp+qi5NpbXBqMtnrT6hlp3VjQYTfd6Ht+J3snk4OwQyyRB2KHOJp3618sspTWcMc09pVQFt0VNJrxxM1wSih1xNXkda3igus8kIMomzXgQ/Zo912jSRzp5DFe/yLBWmLyOdBWhLE71lThnC5Tv3/yHW3IpGMiMWmXiMc3zZxy6XHl9EqIkX7cZdLH05ujGBBr/dZtF8NdT5HGf9/W8a2BiL12yy9w98FjGz0cQoIDD3VOtolTYlQypj3zR2gjIwUlUA9VABaJTi9Q/Az5jLDU1Dm4DNXBgSr/UCxA4hsgN+pTIpZ6wZ04LURqUQXY33y7VT5ZiS0mpe8J0bjz13BGvfOvstA8D0CEltfLzYoDg+wYOp9nOvFM2q08Tx+/oNftPX5EQqVr4VrdufC1pLxC7uylAW4mOPt+LTIX21jda3w0HKyerYzRtTiHRJdemXIXulmE4heeMuEqgtbP/zRlq97GHKpeOZcqey59J1lkLoPQv0JGPJsVFRl7NmXyPm1lw1qXQR+Mxi4AqHyeFUTjIox8SWFVAVid8Wfzlss3gGoXu4PEOgAMy4rVRq5PjNN7mjx4RPZmfqrRsg2bEtjHftoreCZnndtpjBctBGPzXlQR1tWZsuebr3D2NMQjicAAQjLnzoAnc4qC3zpEulJGri1iQXXaIKnm4qbYRcYduMTArnvdfTg/3kNceyRr61vW7ozAm84QsnRC25V3tU06fwVlaWUsd9iezrDC3xMhgYrUCS06N+cuAZ0pLv8X1vMPhkT1Ke4uvPu447O/+HidFlzgYJSYKpirto7afoVeNYcLIkLznK5y7Mg1nATaxdZVwJiy/ayA5g2RYRGWpkwK6HCnPNs3PCM4trqvegs2WmtN8wzGI0TvV5MoNdjHHrAAL+TMq53rOy3VpNsfsimTdu+uETicNseC5ZmvPPs77g9Gof0/RZvYon5k/ENrPWVa1CKX5tFPQmDbb70hmzm2k/L+6Xk4WfxiTwbULJK0d8NDYWscQ70cfIZnZG7ry/awjz0wDhHg6ksoC8u5gK+3GaoQSMG/ZAfYGZltpMkeESDSyFUeHuIcicIdRLb8Vca6whv+9yND5HDcNEuVD3Grm4Z+ZMWyleQeyKvQ+o2lycrjOnJ9Hk+f5sFr3zgz1oTYPxuYJ+8wO3faQ9Lkc3a4FQaJ1oA6DVemJQvEleKkd4VQWpg0+qHU56sxKTDg44h6kuGdITafLJCWjiamBUV6CRQJ4Ml7o6HU5stocOKbMU+eRXI5zz3kU4zI19kdAicgoatNI5h9GN44wRRT5Szv5BY/ZMrDkbpHQ2cmpPZgei9d+ZUnuyrP4LyViIv3YBylrnSLzDgQASSWNeUjOQZNhff2oHxGEz/BWUimzNDd4z0rH8aMfhYjDhwTsZsTSrXX55hYRQo56a+f7PO74v00Nsd2HV3U9E5qE/HpKry1Q/XERYS+EPjbcmCfL0ZPlRGVuA0cgzRDV/y96BkQQTia326tJGpOKZBmlA== X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 74961cd7-17ba-415d-4969-08dd42152e94 X-MS-Exchange-CrossTenant-AuthSource: AS4PR04MB9576.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Jan 2025 16:34:50.1329 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: hS1hFSAwCLtaUzEexipXpBU7fbqR63hU3len48bafvKKslMtGNI7Jckc0fbaugevhjzc610fevvTSDM5iiEbGw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB8529 The deserializer has GPIOs that can be used for various purposes. Add support for gpiochip. Signed-off-by: Laurentiu Palcu --- drivers/staging/media/max96712/max96712.c | 140 ++++++++++++++++++++++ 1 file changed, 140 insertions(+) diff --git a/drivers/staging/media/max96712/max96712.c b/drivers/staging/media/max96712/max96712.c index ed1d46ea98cb9..307b2f1d3a6be 100644 --- a/drivers/staging/media/max96712/max96712.c +++ b/drivers/staging/media/max96712/max96712.c @@ -7,6 +7,7 @@ */ #include +#include #include #include #include @@ -108,6 +109,41 @@ #define CSI2_LANE_CNT_MASK GENMASK(7, 6) #define CSI2_LANE_CNT_SHIFT 6 +/* GPIO_A: 0 <= gpio < 11 */ +#define MAX96712_GPIO_A_A(gpio) CCI_REG8(0x0300 + (gpio) * 0x03) +#define GPIO_OUT_DIS BIT(0) +#define GPIO_TX_EN_A BIT(1) +#define GPIO_RX_EN_A BIT(2) +#define GPIO_IN BIT(3) +#define GPIO_OUT BIT(4) +#define TX_COMP_EN_A BIT(5) +#define RES_CFG BIT(7) +#define MAX96712_GPIO_A_B(gpio) CCI_REG8(0x0301 + (gpio) * 0x03) +#define GPIO_TX_ID_A_MASK GENMASK(4, 0) +#define GPIO_TX_ID_A_SHIFT 0 +#define OUT_TYPE BIT(5) +#define PULL_UPDN_SEL_MASK GENMASK(7, 6) +#define PULL_UPDN_SEL_SHIFT 6 +#define MAX96712_GPIO_A_C(gpio) CCI_REG8(0x0302 + (gpio) * 0x03) +#define GPIO_RX_ID_A_MASK GENMASK(4, 0) +#define GPIO_RX_ID_A_SHIFT 0 +#define GPIO_RECVED_A BIT(6) +#define OVR_RES_CFG BIT(7) + +/* GPIO_B, GPIO_C, GPIO_D: 0 <= gpio < 11, link: 1, 2, 3 */ +#define MAX96712_GPIO_B(gpio) CCI_REG8(0x0301 + (link) * 0x36 + \ + (gpio) * 0x03) +#define GPIO_TX_ID_MASK GENMASK(4, 0) +#define GPIO_TX_ID_SHIFT 0 +#define GPIO_TX_EN BIT(5) +#define TX_COMP_EN BIT(6) +#define MAX96712_GPIO_C(gpio) CCI_REG8(0x0302 + (link) * 0x36 + \ + (gpio) * 0x03) +#define GPIO_RX_ID_MASK GENMASK(4, 0) +#define GPIO_RX_ID_SHIFT 0 +#define GPIO_RX_EN BIT(5) +#define GPIO_RECVED BIT(6) + /* VRX_PATGEN */ #define MAX96712_VRX_PATGEN_0 CCI_REG8(0x1050) #define VTG_MODE_MASK GENMASK(1, 0) @@ -160,6 +196,8 @@ #define MHZ(f) ((f) * 1000000U) +#define MAX96712_NUM_GPIO 12 + enum max96712_pattern { MAX96712_PATTERN_CHECKERBOARD = 0, MAX96712_PATTERN_GRADIENT, @@ -179,6 +217,8 @@ struct max96712_priv { struct regmap *regmap; struct gpio_desc *gpiod_pwdn; + struct gpio_chip gpio_chip; + struct i2c_mux_core *mux; int mux_chan; @@ -830,6 +870,7 @@ static int max96712_v4l2_register(struct max96712_priv *priv) return ret; } +/* I2C Mux section */ static int max96712_i2c_mux_select(struct i2c_mux_core *muxc, u32 chan) { struct max96712_priv *priv = i2c_mux_priv(muxc); @@ -885,6 +926,101 @@ static int max96712_i2c_init(struct max96712_priv *priv) return ret; } +/* GPIO chip section */ +static int max96712_gpiochip_get(struct gpio_chip *gpiochip, + unsigned int offset) +{ + struct max96712_priv *priv = gpiochip_get_data(gpiochip); + unsigned int val; + int ret; + + ret = regmap_read(priv->regmap, MAX96712_GPIO_A_A(offset), &val); + if (ret) + return ret; + + if (val & GPIO_OUT_DIS) + return !!(val & GPIO_IN); + else + return !!(val & GPIO_OUT); +} + +static void max96712_gpiochip_set(struct gpio_chip *gpiochip, + unsigned int offset, int value) +{ + struct max96712_priv *priv = gpiochip_get_data(gpiochip); + + regmap_update_bits(priv->regmap, MAX96712_GPIO_A_A(offset), GPIO_OUT, + GPIO_OUT); +} + +static int max96712_gpio_get_direction(struct gpio_chip *gpiochip, + unsigned int offset) +{ + struct max96712_priv *priv = gpiochip_get_data(gpiochip); + unsigned int val; + int ret; + + ret = regmap_read(priv->regmap, MAX96712_GPIO_A_A(offset), &val); + if (ret < 0) + return ret; + + return !!(val & GPIO_OUT_DIS); +} + +static int max96712_gpio_direction_out(struct gpio_chip *gpiochip, + unsigned int offset, int value) +{ + struct max96712_priv *priv = gpiochip_get_data(gpiochip); + + return regmap_update_bits(priv->regmap, MAX96712_GPIO_A_A(offset), + GPIO_OUT_DIS | GPIO_OUT, + value ? GPIO_OUT : 0); +} + +static int max96712_gpio_direction_in(struct gpio_chip *gpiochip, + unsigned int offset) +{ + struct max96712_priv *priv = gpiochip_get_data(gpiochip); + + return regmap_update_bits(priv->regmap, MAX96712_GPIO_A_A(offset), + GPIO_OUT_DIS, GPIO_OUT_DIS); +} + +static int max96712_gpiochip_probe(struct max96712_priv *priv) +{ + struct device *dev = &priv->client->dev; + struct gpio_chip *gc = &priv->gpio_chip; + int i, ret = 0; + + gc->label = dev_name(dev); + gc->parent = dev; + gc->owner = THIS_MODULE; + gc->ngpio = MAX96712_NUM_GPIO; + gc->base = -1; + gc->can_sleep = true; + gc->get_direction = max96712_gpio_get_direction; + gc->direction_input = max96712_gpio_direction_in; + gc->direction_output = max96712_gpio_direction_out; + gc->request = gpiochip_generic_request; + gc->set = max96712_gpiochip_set; + gc->get = max96712_gpiochip_get; + gc->of_gpio_n_cells = 2; + + /* Disable GPIO forwarding */ + for (i = 0; i < gc->ngpio; i++) + regmap_update_bits(priv->regmap, MAX96712_GPIO_A_A(i), + GPIO_RX_EN_A | GPIO_TX_EN_A, 0); + + ret = devm_gpiochip_add_data(dev, gc, priv); + if (ret) { + dev_err(dev, "Unable to create gpio_chip\n"); + return ret; + } + + return 0; +} + +/* DT parsing section */ static int max96712_parse_rx_ports(struct max96712_priv *priv, struct device_node *node, struct of_endpoint *ep) { @@ -1061,6 +1197,10 @@ static int max96712_probe(struct i2c_client *client) max96712_mipi_configure(priv); + ret = max96712_gpiochip_probe(priv); + if (ret) + return ret; + ret = max96712_v4l2_register(priv); if (ret) return ret; From patchwork Fri Jan 31 16:34:05 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurentiu Palcu X-Patchwork-Id: 13955569 Received: from PA4PR04CU001.outbound.protection.outlook.com (mail-francecentralazon11013049.outbound.protection.outlook.com [40.107.162.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EB8801F03CC; Fri, 31 Jan 2025 16:35:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.162.49 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341327; cv=fail; b=az4k2pw9kCNqMsIvFcrnlrcUcEwW8QY5tdKak6ss2NB6MZ2tBWHKX4/rYNpAt/2proOLHRGu8hcNB/gNRuSshH/v9BBQpl2l7gOFv8aTT93W1nsyb7Bxk6dqvEIs9z8A+BlhIWGOGoDuswpC59vAKJ/i2Dag5fOSoajXMrkwM9I= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341327; c=relaxed/simple; bh=BCIUwP+J62pB8iR0wXPlqWgVn8OnaGK6CtH4pYGSPDk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=S1EByLNoK3/J1W+Ib2HP90qMOLlcx8dyzo9XhAl806Zk4eb3WOzSPfp8+0fWgFVGxjsySnpU2OkMLXLGUeOU5hIthrn5+mtMKXRPE2KYtpHqqTlQRA/VfZmcjqCoVjVzBAcXtSJVkd1ayUqYKqoXtUauvEypcD4lrUkQsvBNFks= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=sl7vjvES; arc=fail smtp.client-ip=40.107.162.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="sl7vjvES" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=SaVkkp5Gf3nIki3w75fJuOkSINeSuMwX9IBa+STdnLTbCNiIThk8Ohc937JpHTLMFx/bDry6V3LeWOTuRIAxMectISxCJ3sYW1Ne+TmWaG9mseC9gUsM6OyyV5dAbxs8DiODyOE0etE6m+ztIs3UUbtqBDutiWQczyt3NViQky6vR1/1rkJBijj0lNf0O+Gts9nMp94EhbSo8XLXj6Ar3RcpMRZwQkMj5MQeGvxL3FsZZxbDAi4iiby5g+BqrhHJrPjSmKHuw5/MgSu4U1sYL/sa/SrlU+LovkF66aH8qwSnW6oVuOFI5nRMZ7pfWnqv+RqF1W+p27Hi7fH7ZvisAQ== 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=mTfkrxsvLGQq9nUjHIOiSjjUQgC/1WYEKm/0T0MUWPQ=; b=hXKf83H78cGpN3unlBLoB44Jg16YsGn3/dMJS8mFA5s2YHXR5pB1vqngDCOgQ7vlrW6BXZDXnhGlaos8o8epEgXX68M6/0xR8t0Z54+9N1kn+O6WbMZADehG74MrrUKM3WNTHrAi7mZNpi2er1wUR+WkA0FrFrrXFAPUd4bgsG7HHUjpa4DcLOZX/cbzEf6dSkU7UAWyIsh3Bns0h8ufnNSsWtwPjj0c1qyL7nfB3T51ujkp77j0l0wINgTLDbBXeNC8ZO0icbajAsruvCP/s633h76PpckH4ln9mnkUyWtWcXGktQpj6iDg/H7nz4mpL5g7wNVvDxfuodU1ZlmNyg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=mTfkrxsvLGQq9nUjHIOiSjjUQgC/1WYEKm/0T0MUWPQ=; b=sl7vjvES9dV4tNOHgnPkwN3iUB8GrrQX66cTMtgRkU3dJ4LOGh3wiIyFdAJNBR8lhYuktlxusmAesyZQy7IvohUczntU1eeLsBBBUwLIFGg5bFT5fmiRh2QmpIcVXruZyR9UMDRkK/yvOInDx6X2LdCe20hW82YKEFt0C7vJhEVbNkgvn9grr4qnaEjECGMEvi8JSn27Goiv11u+v0UXDCvdY6Rvv5iwrqneSiF2kau2FWKQJZv+Ve3MnQPH21/BvP6BXS+6uzv7ss2v2xbTDGKcUv4LcNmS50QPEpwUmLGVIyS5UtM6BKSBHbWu9WlrcV1DYRvt/b2nHF3e2J5Kdg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) by AS8PR04MB8529.eurprd04.prod.outlook.com (2603:10a6:20b:420::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8398.20; Fri, 31 Jan 2025 16:34:52 +0000 Received: from AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30]) by AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30%6]) with mapi id 15.20.8398.017; Fri, 31 Jan 2025 16:34:52 +0000 From: Laurentiu Palcu To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Greg Kroah-Hartman Cc: Laurentiu Palcu , linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-staging@lists.linux.dev Subject: [RFC 11/12] staging: media: max96712: add fsync support Date: Fri, 31 Jan 2025 18:34:05 +0200 Message-Id: <20250131163408.2019144-12-laurentiu.palcu@oss.nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> References: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> X-ClientProxiedBy: AS4P191CA0013.EURP191.PROD.OUTLOOK.COM (2603:10a6:20b:5d5::8) To AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS4PR04MB9576:EE_|AS8PR04MB8529:EE_ X-MS-Office365-Filtering-Correlation-Id: 29da4582-0584-46a9-12fe-08dd42153007 X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: StyB0wkv9NAqOhjWJbKmR/gitQ5P/RFKGxuBwNBnzx/ftQD2XlTEl8+D1IahE1zrI/kRGqqApJCHD9DlFbXuKRSY+obT4RQs1UuYBYveoAR5p535xgJVpewlbchJNzSjaeH59C9GjnMp5LFdcudH8deymepn5tNg5pdA45ZHGDq6PKq5qmyoiNCN4ogRvTh0XhT9wEV3ug6ahuYtUfWo6L3zvWG4S35V+bpjZmL2v1pOlHhamZ1SKAtV07M2d9iDBE/EwP7olgMTtFl84sC4A4zcY1aUF6osABNvb/bZLBD20ucakdgnHZ1k/cb+xamKJH9NJBJk2wsJ1wopG5fuBQWreFZWzfQiD+AK/jh5cF32tX+BIA7pVBJYj4rGq+s86WwtbaQtZhjOfcVxNjBHU1qL7wLu9n6kcloyZTWDfmGfuRh+VxTU9IlS/VKcixG2zzwQQP+2N1fwvVrGNBjkkD3Kz1pn65uEcfWPSYoXZHqonYCeE4rbt02oiUCvuh0bnif2P33ypxzDqWHxub/iDeSkIG9W5ocs1sw6kwMGCAIsREzGUWw7fPLjpNZ7VpEtHlqnfgG5TThXg5etjzRq/27CLz+XxYGKUoZcyHY2LX06x9jXUMXcXW1wfxNOv9KbmqzJbJiW2vQmZIfo+IoytKLOTEETGwLziItYQxO21SBAy3u46DvPaoMUUCTof2IoPXVbV/h9KeZ56EdyWqfu5aK5AneaWTXqCE4ozFuPV13EsGK7005yBh+Qw1xI/T15PlL8PJfbM6lIIJUvZd/ptMUl4sj9tot85zRJkAXHEI+XjnZEUuLrldKODPPYBz/jU6hOw8TO5vG2xM41XW56ALM/fk/j6Dh//xnljAp0XFJGhlfTBYYHJwkFG9ocTPXAE3uUR1ytAtxaGOcY0DsPJ+VzicectQX7rpF7rFiWpj1JJux6OkER7kqBGHELpZZMW715XvbmobV7/OhxXnrckIF4ryIoPkQt5MXxDC9ZopIGw3nkNDOcvzBJsQQoBDYvYlgagHUQ0BrUELLijOPxftOUMTDYUw/b8q8+UfkQsZfR+n5PI8I7WlSn5mq2DiYC7b2IGVham4teH2SWMQ15mvLgmqX79ZZFQZLgwVwBP3umG/bNzHrGh610VupPd7OnfozrRpg0aejY/nV8yQ/SBJ8G6AcAg9M6Cr9er39HhE1tS3g90YL9FiEcaSD5RkIyb5qpjZnAFoamaZ7uR6KApVAhrPL8w0C6Le6v179z40i8qvMhue6/u7HEdYX4eoVZvd6qvFqk+EQMjF+uKa9NNGDlZSFkTJYLtOQ5FiCLQr1M7R9FCVH6kN16A/wkg++dZeFUC1hd6RP/T8xirUgIRHxL/Bv0vM8zgKYx20Y6xWCjKlNLViEkoeXhuliGWAmK X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS4PR04MB9576.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Nn6+HUGqGzQAC1mZOdvOUWQEpzFzGNAUeyfVjPnJgLtSmMJXb5I0QkQRrz0ivPwsY9mRoWAILIWLwFHUjYMDk+UJfviBld/EuXBRRKCC3H8ddKT01RUmIlqjmSVy8aCOiJF0sZ6f5CvFDPvk08BiXmgZSQZh21OUHBKjtSdPs5furhCb/bDZ6cn/vYEtwd0t3f8CvxLJ8Hq7afxfv+dlr7wCtPAKHCpa5XcEClUOuD8nzFxP6gh6iNA0yZ5NtKs/DmIvmfruUadgd+pWWKv/IFjIo2J3HUrtl7H5bM1x+ahU0iP955noF/NTgrxJY2iYO7CRfq2szd1COAfpqEic7azSvLghDqJvtfTutR8R+IgSPjOOIEsdU0tfYrgGnMyOJ5w/iD55hv2y54l2mDGR09u0J3pn1K4MZ4RgS5/g1P9VzG6+YFdgxtzU+Ti13fVroq4NSE5prm/Q52LAfpIKAwQt1oWtiM+LE+WwgOcHfoFuwzqVeeLom+/7MaH6ldTveqGQnrPNb0OPhvawWh/Y3j+MP46j4x6dZGPnLnAkNZjUnAHqzqk6w8aaqNTOgeD4ou4I+/6Vp3JMKAx8+dZAhBvJTs0vi1v2XDgnAwQ1KCuOoJVNKU8LMqGKMWhsbMBn9PA0wm2hSdlrNRHyB8WGwXQmSCdvXGhfxjyUBkYfxpVnzfLrYtcxG2NqJCms2B0Z5aBR3kzSwP6DWE94zuilcJaCo+q7GrmItxTPamUevEMjURtjWArAd28bs25VL62rUBaXMSFBa+Izda0gaisayS5cQb3jiq6XbA4HHo6f9IVGTayZk4TSDHkqI+v6N6yvRl2QfVLJF98HVHAWr5MgTGXqRm/Wm3CUj2D3jGY+Wn3OG+eaM0CsayqMnlddc1cE+HqY8ruLK7YHO6UC/uQcnW8jgY1ALGAhWq672qfkZVOHwi4ClRERgashlzVSmxXySDAzgNN388blsLThjlgeYIir4/EWW1ti7FznAlQRv17q66/KcJfl5Un75IhNkGj77zxcbvklJeH+GFhKOoki7zy+RDeiAvjZEU/9Oel534P3XQvLzXFWdSA4/nmmYr+j+zRfkLjpiDOgan+kXCXxwN+2Z35C8z9PSocuor7OQ2jDhSFvTtHDbTsCrOobz1WfP7Itv5+qBMekq6w6J5Zr4XWlE11k37U88SsaIPfM9E4TaJBc1L0HiQ7+OkIhsn3iSxTlgkjTJTjC+fVmCGBiHOmNajmMdvbQBhCN0xlerQ2jRAIjMTnx7R4hiUCO9EVlVXD74pmXzKPy2x4oSCRnoQvKtONkRYDuc0oedDi+/g1K0LM4xHdop2//ITn0ktJ9mFZu7u4lEzxn70OU6w2D420jXi8wFWk8PU7qn6hSmj6XXJYV1vbrei9N8JM8HuDz6hJI89tjChtJ401p1bZClnH92A+NKVlIDCWL5mCv1lRcJWCmjmJaQUMReUKdTr3Ily0XfKMvgK7w8MoBh+vu+wifsWEdQaVgHNcgChY8Ul6Oa0kbhUyu/AzM7u6WS3P246/XugxOd8ZqZG4YkUXwbkRS3yes2Butt4BWZ1siyEKVksLpIlpNnE3B+4Ybip3dqlKCP4+WBTQKFeR9C3Pitw== X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 29da4582-0584-46a9-12fe-08dd42153007 X-MS-Exchange-CrossTenant-AuthSource: AS4PR04MB9576.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Jan 2025 16:34:52.5689 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 3JXJ5VqPjL5skbCjzYO11eKC4X07XcFh3lOfvfaooH305/mY1QzD7Wea1mq9NezB5JoF9f2wmIMZrOM9xOTSbA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB8529 FSYNC is used to align images sent from multiple sensors. Signed-off-by: Laurentiu Palcu --- drivers/staging/media/max96712/max96712.c | 119 +++++++++++++++++++++- 1 file changed, 118 insertions(+), 1 deletion(-) diff --git a/drivers/staging/media/max96712/max96712.c b/drivers/staging/media/max96712/max96712.c index 307b2f1d3a6be..0112052171b06 100644 --- a/drivers/staging/media/max96712/max96712.c +++ b/drivers/staging/media/max96712/max96712.c @@ -51,6 +51,21 @@ #define OVERRIDE_BPP_VC_DT_0_2 BIT(6) #define OVERRIDE_BPP_VC_DT_1_3 BIT(7) +/* FSYNC */ +#define MAX96712_FSYNC_0 CCI_REG8(0x04a0) +#define FSYNC_METH_MASK GENMASK(1, 0) +#define FSYNC_METH_SHIFT 0 +#define FSYNC_MODE_MASK GENMASK(3, 2) +#define FSYNC_MODE_SHIFT 2 +#define EN_VS_GEN BIT(4) +#define FSYNC_OUT_PIN BIT(5) +#define MAX96712_FSYNC_PERIOD CCI_REG24_LE(0x04a5) +#define MAX96712_FSYNC_17 CCI_REG8(0x04b1) +#define FSYNC_ERR_THR_MASK GENMASK(2, 0) +#define FSYNC_ERR_THR_SHIFT 0 +#define FSYNC_TX_ID_MASK GENMASK(7, 3) +#define FSYNC_TX_ID_SHIFT 3 + /* MIPI_PHY */ #define MAX96712_MIPI_PHY_0 CCI_REG8(0x08a0) #define PHY_4X2 BIT(0) @@ -194,6 +209,7 @@ #define MAX96712_VPG_PAD (MAX96712_FIRST_SOURCE_PAD + \ MAX96712_MAX_TX_PORTS) +#define MAX96712_XTAL_CLOCK 25000000ULL #define MHZ(f) ((f) * 1000000U) #define MAX96712_NUM_GPIO 12 @@ -207,6 +223,19 @@ struct max96712_info { unsigned int dpllfreq; }; +enum max96712_fsync_mode { + MAX96712_FSYNC_OFF = 0, + MAX96712_FSYNC_INTERNAL, + MAX96712_FSYNC_MASTER, + MAX96712_FSYNC_SLAVE, +}; + +struct max96712_fsync { + int pin; + enum max96712_fsync_mode mode; + int tx_id; +}; + struct max96712_rx_port { struct v4l2_subdev *sd; struct fwnode_handle *fwnode; @@ -237,6 +266,9 @@ struct max96712_priv { unsigned int n_rx_ports; enum max96712_pattern pattern; + + struct max96712_fsync fsync; + struct v4l2_fract interval; }; struct max96712_format_info { @@ -523,6 +555,68 @@ static void max96712_pattern_enable(struct max96712_priv *priv, struct v4l2_subd } } +static int __maybe_unused max96712_fsync_set(struct max96712_priv *priv) +{ + u32 fsync; + int ret; + u8 mode_map[4] = {3, 0, 1, 2}; + + if (priv->fsync.mode == MAX96712_FSYNC_OFF) + return 0; + + if (!priv->interval.numerator || !priv->interval.denominator) + return max96712_update_bits(priv, MAX96712_FSYNC_0, + FSYNC_METH_MASK | FSYNC_MODE_MASK, + 0x3 << FSYNC_MODE_SHIFT); + + /* + * According to Max96724 users guide, "sync signal frequency must be specified in terms of + * the onboard crystal clock (25MHz)" + */ + fsync = div_u64(MAX96712_XTAL_CLOCK * priv->interval.numerator, priv->interval.denominator); + + ret = max96712_write(priv, MAX96712_FSYNC_PERIOD, fsync); + + ret |= max96712_update_bits(priv, MAX96712_FSYNC_0, + FSYNC_OUT_PIN | FSYNC_METH_MASK | FSYNC_MODE_MASK, + (priv->fsync.pin ? FSYNC_OUT_PIN : 0) | + (0x0 << FSYNC_METH_SHIFT) | + (mode_map[priv->fsync.mode] << FSYNC_MODE_SHIFT)); + + ret |= max96712_update_bits(priv, MAX96712_FSYNC_17, FSYNC_TX_ID_MASK, + priv->fsync.tx_id << FSYNC_TX_ID_SHIFT); + + return ret ? -EIO : 0; +} + +static int max96712_get_frame_interval(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + struct v4l2_subdev_frame_interval *interval) +{ + struct max96712_priv *priv = container_of(sd, struct max96712_priv, sd); + + if (!max96712_pad_is_source(interval->pad)) + return -EINVAL; + + interval->interval = priv->interval; + + return 0; +} + +static int max96712_set_frame_interval(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + struct v4l2_subdev_frame_interval *interval) +{ + struct max96712_priv *priv = container_of(sd, struct max96712_priv, sd); + + if (!max96712_pad_is_source(interval->pad)) + return -EINVAL; + + priv->interval = interval->interval; + + return 0; +} + static int max96712_enum_mbus_code(struct v4l2_subdev *sd, struct v4l2_subdev_state *sd_state, struct v4l2_subdev_mbus_code_enum *code) { @@ -780,6 +874,8 @@ static const struct v4l2_subdev_pad_ops max96712_pad_ops = { .disable_streams = max96712_disable_streams, .set_routing = max96712_set_routing, .get_frame_desc = max96712_get_frame_desc, + .get_frame_interval = max96712_get_frame_interval, + .set_frame_interval = max96712_set_frame_interval, }; static const struct v4l2_subdev_ops max96712_subdev_ops = { @@ -1124,7 +1220,28 @@ static int max96712_parse_dt(struct max96712_priv *priv) { struct device *dev = &priv->client->dev; struct device_node *node = NULL; - int ret = 0; + int ret = 0, count; + u32 dt_val[3]; + + count = fwnode_property_count_u32(dev_fwnode(dev), "maxim,fsync-config"); + if (count > 0) { + ret = fwnode_property_read_u32_array(dev_fwnode(dev), "maxim,fsync-config", + dt_val, count); + if (ret) { + dev_err(dev, "Unable to read FSYNC config from DT.\n"); + return ret; + } + + priv->fsync.mode = dt_val[0]; + priv->fsync.tx_id = priv->fsync.mode ? dt_val[1] : 0; + + if (priv->fsync.mode >= MAX96712_FSYNC_MASTER && count == 2) { + dev_err(dev, "No FSYNC pin provided in DT for the given mode.\n"); + return -EINVAL; + } + + priv->fsync.pin = dt_val[2]; + } for_each_endpoint_of_node(dev->of_node, node) { struct of_endpoint ep; From patchwork Fri Jan 31 16:34:06 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurentiu Palcu X-Patchwork-Id: 13955571 Received: from PA4PR04CU001.outbound.protection.outlook.com (mail-francecentralazon11013049.outbound.protection.outlook.com [40.107.162.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0B6D51F4279; Fri, 31 Jan 2025 16:35:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.162.49 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341333; cv=fail; b=LqV6R2DKf7H/2gbFckz4KmiG+yEYg7oswdO6y7wMhS643OhTKb+OHebJuPcm6c4suaeLUxUDRfYh3UUAubev16XFqIb9gyaQRXkwW4up2BAHKNIA8uUX5ycI8Laf5fgvAxae0IM3nPBe0QNCzh7kVo0At8VGNve+IFvyX6yzKbs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738341333; c=relaxed/simple; bh=nNlTq79HvT1PULImcohpknc0qTS7kfvufS0+4ZrLP3s=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=uhxBimCYpRUtB8X2/6UzvL9VPA/ECweBv7F8xOn/eXFPhqMkilKkTdUMSEn72/AAHGBOy4xleC8wNcJM1LlnB6rPEnfLbkJUoxb9E8hSV/PPSfNJvA+6/K2YaNkIDsQyzo8TV9QJsevgJSaxq0Xgt1JZGXVprAyRmWVhfUVuUkg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com; spf=pass smtp.mailfrom=oss.nxp.com; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b=p+Ma7rMY; arc=fail smtp.client-ip=40.107.162.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com header.b="p+Ma7rMY" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=H/JQ3zmRUhFR/Jvzxnyz0uNK0KCueMIrtH3ecLZo3ucY/WH5jhajG5xFhCn/cbCdO3mShro+s7fs5CiIusMCp5IEGSEyDPMwIYOqGlpfj6WUjINSaHOqV56mrwGHEv3y3fvWox62fr+lqyypo6+QfWRj+1XQIhC3yewNrPt89aR0iIUP5lduZJit7AP5TDAIYg6JBT5Ooj1uuqcGqEWGL7frAgrPxbv42Hxm8QvKAXX3WFA4sZv9qzluNF/cnxCUfo6VbNEPEoJPrKDN3bQ5yicJMI1HjW9eJaeA4T3zF13E1M+5DZxZlR13uUouURekg7XzihjQTOFdjOn8lGDbnw== 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=yYQ4SI3WwCA6esk9QGlp6Vu/8j+T4S4bwrhZk/DP4hY=; b=oTDopISdvis7ry19JoM7w6F63lKlYxIEV5AR5M0ulnTGDrUJ6FIMqNZ3F+Pcf5qWzFB8D4JsNRwMWrUvyl/Hq2FqQW4tGhg2ae2ukDxBcMQ1b+nUehaWvPtZ8yuN6/lfgI0x5H3rum+nPCjwiITVl94L8X99qi0fuc0we7Dg4DQPhUOOF1+A8VIO/hNoRkkxWOoYr69In1vEFbrKj1hiKaZW1OlS5m55e2ew34LUSt1X5F7+W8tzC8S93tyCD97y36y3a/ErQGoefpYGHAufG/8yT8ac29FwT+gSay7dTfOTS0YzJOa6S25KHdyt0Kh5ibvhCSwHQJbHSo9pfCDpLw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector1-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=yYQ4SI3WwCA6esk9QGlp6Vu/8j+T4S4bwrhZk/DP4hY=; b=p+Ma7rMYYsy1RQpoRjeBAXQ29FxpWLLBDr14V/aBwt5VUqtEbFDRny2hAIdfCkcUUE5IwY4aCfwYa6Mm57J3HmPxnYYNn/F5HO8+6RqTMT7f+yeGnMOYNPBwcBMGvZMFvNJjVGnthTCCZJwoRuNM7NP4mNYDBXQoS/tN2uRvzkGu3jkuHlrQQU7VV7HBbtjeq0eZQ1ardab8eITfFyNwtJbbXJPKKrTMkVcukqe6bdGIMkRykorXGMxBHWJO6o+KJCNU+W8CI/gB4CvMvDY8/A7wvi+FFMgIdrXArx9NEgZBblnbHENUNt88+rVtNKXtFMaYjJAGAIMlPa8Y2YcJJA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) by AS8PR04MB8529.eurprd04.prod.outlook.com (2603:10a6:20b:420::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8398.20; Fri, 31 Jan 2025 16:34:55 +0000 Received: from AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30]) by AS4PR04MB9576.eurprd04.prod.outlook.com ([fe80::9cf2:8eae:c3d1:2f30%6]) with mapi id 15.20.8398.017; Fri, 31 Jan 2025 16:34:55 +0000 From: Laurentiu Palcu To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Mauro Carvalho Chehab , Greg Kroah-Hartman Cc: Laurentiu Palcu , linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-staging@lists.linux.dev Subject: [RFC 12/12] staging: media: max96712: allow streaming from connected sensors Date: Fri, 31 Jan 2025 18:34:06 +0200 Message-Id: <20250131163408.2019144-13-laurentiu.palcu@oss.nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> References: <20250131163408.2019144-1-laurentiu.palcu@oss.nxp.com> X-ClientProxiedBy: AM8P190CA0023.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:219::28) To AS4PR04MB9576.eurprd04.prod.outlook.com (2603:10a6:20b:4fe::12) Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS4PR04MB9576:EE_|AS8PR04MB8529:EE_ X-MS-Office365-Filtering-Correlation-Id: dd82e91c-be5b-48c5-5cf4-08dd4215319e X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: =?utf-8?q?uB2Nm+jYo5zXP/Xz8YDqX7+Wf36o5NT?= =?utf-8?q?neM7MG2NfyLrqHX8c7kWq0vsuAYwZIfvO2G1i5mZe7BU4bfUxOrBpkHEMR/mczjiG?= =?utf-8?q?YNmNq1MFP2+47lXBKz3OG6sMtjPMDG4n8Eu7t/TlMXXD3Zg3jkEWRuAcI3uAdrefM?= =?utf-8?q?pFmsrudMyF8Gk89mO4X0qLebFDYUNubo+UjjKlVqd5wa1ne3rx3QhHXhx1lBGmMnH?= =?utf-8?q?TZbgdNSCvdPyla43Rxw/+exY3ZIUyfch/1IREcukT0soYMBC5okR6JJlHhHjLg0wN?= =?utf-8?q?I4TxZOE3dIVLRvyIXfnXN2wJy12KA5rv1EhtvcLBz66oEGJ6za5zwt3HUXR6PG1qG?= =?utf-8?q?i8ZO4YxY7bGqxc/vOUoyLdTVzBXq/HKe2+RSbpl8CRgqONW7b/LrZRNJ9ROddH7et?= =?utf-8?q?hgJJfCL7bUxRcM5HyJSq2Ztne8H8LdM9u1eDVwl/HM7QtRWgNqIPbuL7sVsTUqOiv?= =?utf-8?q?EY4BA95f3if5HG+UogUVYfxQXttZXo+oDgB0/CURCVYZfyB4A5A06OqDOi6fa5Oyw?= =?utf-8?q?ez0bTyrnMIQPzlfs8O92rxehwImSbUJNSZatbZUZ7S+7MOppqxAe4u4MWetCfMHLJ?= =?utf-8?q?778cwyYbkhi9aQSObeyELeHm801OHWEziafets26rDYeDUxMAtPzG82zvUqR1AhD+?= =?utf-8?q?N+URTu6BeX9oRv3qwdP2PkLlL/aVH31UAKHgUEbrivg+48u08McjhsGqekUcGT7bh?= =?utf-8?q?gTuRiqjZ4qiS0XzIruRwKU+LYngOD9Y8KQo/iGzOalkZ075xqpX3PmlPgd445AeHq?= =?utf-8?q?K9IIkzWIHHMGGOU1xMiwtBPx6N/Yav94/s+bfzJQOCGxaGpzh06EyiRyFfCibq4oD?= =?utf-8?q?YC5bwkrqDUdkqQcDpnnOKkumaSs0++nsVWCLLTCs5OANrkaE/NsWLGsiMIcl0Fj3K?= =?utf-8?q?ahxmpyZWlXvTb9kpcNgon8EXpw79aOm2eSxoZCbE75VUnkerVohYzfQoZMltixbEG?= =?utf-8?q?cQh8L67ir6oUxa8/qjxyFYcu33PjT6suKiSVs1+M5jIaKqpzNiqCYm0t7BpIg6vvT?= =?utf-8?q?b02mRxFGk8tO/JHw+kjJsQCLu1ewO4lOrG+DOPrtzVoAY3UL+itbDeC+h4WSQjegO?= =?utf-8?q?N8XRfmwEceUW6H0g88hZMB/9zn5utMb0LF/3u1U+T1LKuGPJ9NfBbIiQTUWsfED/w?= =?utf-8?q?9XzvPsBoqcIAQSLI1Ry0AQFzoXK4GjdwXVgHY9USXkq4NXHJWTLzOcxDK36nIhQM7?= =?utf-8?q?entSRoWHbsSLgPKTYbDhaQhe0c+EykrmqH/LZqVJvl/dkkrKCdKBCxbYgvRGP0lKU?= =?utf-8?q?ZymkK9FW3T4due0tiFxwtm/fRNRX1lFo5/Ujc4pP/oBHojIVNX02hUWlXBs7VJwsA?= =?utf-8?q?i5uTAlH7UOov?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS4PR04MB9576.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?rR6JHH44VqrPyJwFBBOrGz7XHTh/?= =?utf-8?q?xxaadKr021vVTxHHQJFOPieWokR0fe8mcxfu0xxzVtb4R5EbJHIwbS6epB6B8kV/+?= =?utf-8?q?OR4PdEl+Ri1uiEKWitgRuEBon+8cPcm0PUsgcelI/caqU7dCf2tSVeR3eB717vxHt?= =?utf-8?q?UrnB8KzIbLBDAg1V2RivthXvIrZoYAEIo4BccXAmYwUy2hpiml0xaoYr+JkTGZgKS?= =?utf-8?q?jTDJx9w2upLLwWBNJj4Hh/YWaA911CwsAGdxRK6aEU/3gvezEb+6fJYGO6PksD+CP?= =?utf-8?q?a1vliQYMzVORaTuNDO+I8WddgTgUM9RSnUf0azxeNLffbpRFSkMjn0yoCv+O6FJpV?= =?utf-8?q?O0r1nfhpNhhe4CP+aZhtsVZNgomEJcmZocWcKNVWOFzN/0zj08u+lt7IxSUx9JROM?= =?utf-8?q?gby6vRA24wdmklvqC2Qijo1sAf7u0P5lIkunnVbyi9fWRsnZ0emXT+9bo5+3jKlQV?= =?utf-8?q?EGfGhmL0RnQFy978Rwufj/dmfjLuo+l9hU1PANA+GpU5i6j96oTSKrLGw6r/BjOuT?= =?utf-8?q?apQpLCzQSfrElR1kkAqirffZjf+ydT9akRJyHHuEvqlThBYnZ54AT5vVhShh5p0kS?= =?utf-8?q?r0MBvZtHPZp/xGUJKXWqUtzJS9FoUKBvH8i0VhqunI+QYAYMmz6TcTSJkEnCXwIIc?= =?utf-8?q?OhdeePaVmf2nqEg+GWQHFgD7EeIGZ5YWsDdt+A7M3M9oheZS0ApTKw6jjDXL87JOx?= =?utf-8?q?ti25RHf5fh6y1cKQtBucjjqaCgKX0k5H1aultdN6F8nF/vk1pmw9sJNLRDPYID14s?= =?utf-8?q?ZTw7KH9spOSWGc6KAeD13FZW0h9snAdfrmmQYfXMqXyMopg8EsGJyDMMIxqk3i4JJ?= =?utf-8?q?q4tuXwXtyNc4PPgKqt37gQ/YpwFkvJC0ajZG3KCJYveP/5Rx3Xndpn+DndMAUUMpe?= =?utf-8?q?AMrdpenGjd8QbLMUFW19HsCpY0POskmMNQA3JJ2dlU+dUZs00pjy9VYIZxC8z392N?= =?utf-8?q?FMoO6kc06Of0rKJro3qpisULM4yJIZRu7gDQG5b+xStrZwKRElVzAZCoqgSGqRGVy?= =?utf-8?q?QKXp9KsWONcPwNHumLIaW4JqA4qRkD18NNqNtkkwJEyxZv2z0ONDbndM1FYBXZOVc?= =?utf-8?q?UgeY+BPHsAkSPZT/le2zcGu290ee90MoiMQ9DBJ45n/WFqb7NpCZH3+Qb4HJnzFoW?= =?utf-8?q?OY/3cpqXFmfgnHJYYXi8KOxCjwI4TXPE24/Tc2cRJy5Go+JsL09kW7TrAr4BFPLeA?= =?utf-8?q?CNXaI2M1b13eOGz28mjTAmZCD4Dot+azjtfcJzEJj5oKTVBdnomdR9ZNC/wa8TW+g?= =?utf-8?q?fC1FFwBOSDF7vhbjS07vTkLLvFgLuM/ooKZ+Me1JRf4Bb/0GxpOkWJsg5nZo6IUP5?= =?utf-8?q?uSRl7sqWgYs6+TCg/12v8T/LrnKi9ySznNwIEc2QS/jER4OgQKwdravgGyeX7I2jR?= =?utf-8?q?Jo2ZCHamfRWTChkdW3zXupfI4TRYl5EXdAuQ+AsHUMz2qmVC5in34fYsMsklJfr4K?= =?utf-8?q?u0f0eWikIAPHfVX6yFkNeUjkmDdGJdBvwqQf6cilEVXRopxZmm90Eelw4kWuxXsuZ?= =?utf-8?q?j4b+Vw9246FWTlYOAXuXhphwALW4pOwnyA=3D=3D?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: dd82e91c-be5b-48c5-5cf4-08dd4215319e X-MS-Exchange-CrossTenant-AuthSource: AS4PR04MB9576.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Jan 2025 16:34:55.2604 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Czk4OBp2I3w6DnzkuuacWj3ZY8tSnSRz3dKf5Q6/ANIIVv5tv+LH2tKzqlSIif9quVM/oNnGeFpdL4VjvoW0mA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB8529 This adds support for starting/stopping streaming from connected sensors as well. The user can also switch over to testing the test pattern by configuring the routes accordingly. Use the 'maxim,operation-mode' DT setting to allow the user to select which operation mode the deserializer should run in, though only tunneling mode is supported currently. Signed-off-by: Laurentiu Palcu --- drivers/staging/media/max96712/max96712.c | 426 +++++++++++++++++++++- 1 file changed, 418 insertions(+), 8 deletions(-) diff --git a/drivers/staging/media/max96712/max96712.c b/drivers/staging/media/max96712/max96712.c index 0112052171b06..b4c3d1d3c9539 100644 --- a/drivers/staging/media/max96712/max96712.c +++ b/drivers/staging/media/max96712/max96712.c @@ -4,6 +4,7 @@ * * Copyright (C) 2021 Renesas Electronics Corporation * Copyright (C) 2021 Niklas Söderlund + * Copyright 2025 NXP */ #include @@ -30,6 +31,12 @@ #define DIS_REM_CC_C_SHIFT 4 #define DIS_REM_CC_D_MASK GENMASK(7, 6) #define DIS_REM_CC_D_SHIFT 6 +#define MAX96712_DEV_CTRL12 CCI_REG8(0x000a) +#define LOCKED_B BIT(3) +#define MAX96712_DEV_CTRL13 CCI_REG8(0x000b) +#define LOCKED_C BIT(3) +#define MAX96712_DEV_CTRL14 CCI_REG8(0x000c) +#define LOCKED_D BIT(3) /* TOP_CTRL */ #define MAX96712_DEBUG_EXTRA_REG CCI_REG8(0x0009) @@ -37,6 +44,11 @@ #define DEBUG_EXTRA_PCLK_75MHZ 0x01 #define MAX96724_TOP_CTRL_PWR1 CCI_REG8(0x0013) #define RESET_ALL BIT(6) +#define MAX96712_TOP_CTRL_CTRL3 CCI_REG8(0x001a) +#define LOCK_PIN BIT(0) +#define CMU_LOCKED BIT(1) +#define ERROR BIT(2) +#define LOCKED_A BIT(3) /* BACKTOP0 */ #define MAX96712_BACKTOP0_12 CCI_REG8(0x040b) @@ -110,6 +122,15 @@ #define T_T3_PREP_86_7NS 3 #define T_T3_POST_MASK GENMASK(6, 2) #define T_T3_POST_SHIFT 2 +#define MAX96712_MIPI_PHY_MIPI_CTRL_SEL CCI_REG8(0x08ca) +#define MIPI_CTRL_SEL_0_MASK GENMASK(1, 0) +#define MIPI_CTRL_SEL_0_SHIFT 0 +#define MIPI_CTRL_SEL_1_MASK GENMASK(3, 2) +#define MIPI_CTRL_SEL_1_SHIFT 2 +#define MIPI_CTRL_SEL_2_MASK GENMASK(5, 4) +#define MIPI_CTRL_SEL_2_SHIFT 4 +#define MIPI_CTRL_SEL_3_MASK GENMASK(7, 6) +#define MIPI_CTRL_SEL_3_SHIFT 6 /* MIPI_TX: 0 <= phy < 4 */ #define MAX96712_MIPI_TX_DESKEW_INIT(phy) CCI_REG8(0x0903 + (phy) * 0x40) @@ -123,6 +144,22 @@ #define CSI2_CPHY_EN BIT(5) #define CSI2_LANE_CNT_MASK GENMASK(7, 6) #define CSI2_LANE_CNT_SHIFT 6 +#define MAX96712_MIPI_TX_54(phy) CCI_REG8(0x0936 + (phy) * 0x40) +#define TUN_EN BIT(0) +#define DESKEW_TUN_SRC_MASK GENMASK(2, 1) +#define DESKEW_TUN_SRC_SHIFT 1 +#define TUN_SER_LANE_NUM_MASK GENMASK(4, 3) +#define TUN_SER_LANE_NUM_SHIFT 3 +#define DESKEW_TUN_MASK GENMASK(6, 5) +#define DESKEW_TUN_SHIFT 5 +#define TUN_NO_CORR BIT(7) +#define MAX96712_MIPI_TX_57(phy) CCI_REG8(0x0939 + (phy) * 0x40) +#define TUN_DPHY_TO_CPHY_CONV_OVRD BIT(1) +#define TUN_DPHY_TO_CPHY_CONV BIT(2) +#define TUN_DEST_MASK GENMASK(5, 4) +#define TUN_DEST_SHIFT 4 +#define DIS_AUTO_TUN_DET BIT(6) +#define DIS_AUTO_SER_LANE_DET BIT(7) /* GPIO_A: 0 <= gpio < 11 */ #define MAX96712_GPIO_A_A(gpio) CCI_REG8(0x0300 + (gpio) * 0x03) @@ -241,6 +278,16 @@ struct max96712_rx_port { struct fwnode_handle *fwnode; }; +struct max96712_asc { + struct v4l2_async_connection base; + struct max96712_rx_port *rx_port; +}; + +enum max96712_operation_mode { + MAX96712_TUNNEL_MODE, + MAX96712_PIXEL_MODE, +}; + struct max96712_priv { struct i2c_client *client; struct regmap *regmap; @@ -253,6 +300,8 @@ struct max96712_priv { const struct max96712_info *info; + enum max96712_operation_mode operation_mode; + bool cphy; struct v4l2_mbus_config_mipi_csi2 mipi; s64 link_freq; @@ -260,12 +309,15 @@ struct max96712_priv { struct v4l2_subdev sd; struct v4l2_ctrl_handler ctrl_handler; struct media_pad pads[MAX96712_MAX_PORTS]; + struct v4l2_async_notifier notifier; + u32 enabled_streams; struct max96712_rx_port rx_ports[MAX96712_MAX_RX_PORTS]; unsigned int rx_port_mask; unsigned int n_rx_ports; enum max96712_pattern pattern; + bool vpg_started; struct max96712_fsync fsync; struct v4l2_fract interval; @@ -382,6 +434,17 @@ static inline bool max96712_pad_is_source(u32 pad) return pad >= MAX96712_FIRST_SOURCE_PAD && pad < MAX96712_VPG_PAD; } +static int max96712_read(struct max96712_priv *priv, unsigned int reg, u64 *val) +{ + int ret; + + ret = cci_read(priv->regmap, reg, val, NULL); + if (ret) + dev_err(&priv->client->dev, "read 0x%04x failed\n", reg); + + return ret; +} + static int max96712_write(struct max96712_priv *priv, unsigned int reg, u64 val) { int ret; @@ -422,6 +485,14 @@ static void max96712_mipi_enable(struct max96712_priv *priv, bool enable) } } +static void max96712_tunneling_enable(struct max96712_priv *priv, bool enable) +{ + int i; + + for (i = 0; i < 4; i++) + max96712_update_bits(priv, MAX96712_MIPI_TX_54(i), TUN_EN, enable ? TUN_EN : 0); +} + static void max96712_mipi_configure(struct max96712_priv *priv) { unsigned int i; @@ -485,14 +556,26 @@ static void max96712_mipi_configure(struct max96712_priv *priv) PERIODIC_DESKEW_CALIBRATION_EN, auto_deskew_calib_en); } + if (priv->operation_mode == MAX96712_TUNNEL_MODE) { + int i; + /* + * Disable tunnel auto-detection for all phys, will enable tunnelling + * explicitly when needed. + */ + for (i = 0; i < 4; i++) + max96712_update_bits(priv, MAX96712_MIPI_TX_57(i), + DIS_AUTO_TUN_DET, DIS_AUTO_TUN_DET); + } + /* Enable PHY0 and PHY1 */ max96712_update_bits(priv, MAX96712_MIPI_PHY_2, PHY_STDBY_N_MASK, PHY0_EN | PHY1_EN); } -static void max96712_pattern_enable(struct max96712_priv *priv, struct v4l2_subdev_state *state, - bool enable) +static int max96712_pattern_enable(struct max96712_priv *priv, struct v4l2_subdev_state *state, + bool enable) { struct v4l2_mbus_framefmt *fmt = v4l2_subdev_state_get_format(state, MAX96712_VPG_PAD); + struct device *dev = &priv->client->dev; const u32 h_active = fmt->width; const u32 h_fp = 88; @@ -506,9 +589,16 @@ static void max96712_pattern_enable(struct max96712_priv *priv, struct v4l2_subd const u32 v_bp = 36; const u32 v_tot = v_active + v_fp + v_sw + v_bp; + priv->vpg_started = enable; + if (!enable) { max96712_write(priv, MAX96712_VRX_PATGEN_1, 0x00); - return; + return 0; + } + + if (priv->enabled_streams) { + dev_err(dev, "Cannot enable VPG when other streams are enabled.\n"); + return -EINVAL; } max96712_write(priv, MAX96712_DEBUG_EXTRA_REG, DEBUG_EXTRA_PCLK_75MHZ); @@ -553,14 +643,44 @@ static void max96712_pattern_enable(struct max96712_priv *priv, struct v4l2_subd /* Generate gradient pattern. */ max96712_write(priv, MAX96712_VRX_PATGEN_1, PATGEN_MODE_GRADIENT); } + + return 0; +} + +static u8 max96712_get_link_status(struct max96712_priv *priv) +{ + u32 link_lock_addr[4] = { + MAX96712_TOP_CTRL_CTRL3, + MAX96712_DEV_CTRL12, + MAX96712_DEV_CTRL13, + MAX96712_DEV_CTRL14 + }; + int nport; + u8 link_status_mask = 0; + + for (nport = 0; nport < MAX96712_MAX_RX_PORTS; nport++) { + u64 reg_val = 0; + + max96712_read(priv, link_lock_addr[nport], ®_val); + + link_status_mask |= reg_val & BIT(3) ? (1 << nport) : 0; + } + + return link_status_mask; } -static int __maybe_unused max96712_fsync_set(struct max96712_priv *priv) +static int max96712_fsync_enable(struct max96712_priv *priv, bool enable) { u32 fsync; int ret; u8 mode_map[4] = {3, 0, 1, 2}; + if (!enable) { + max96712_update_bits(priv, MAX96712_FSYNC_0, + FSYNC_MODE_MASK, 0x3 << FSYNC_MODE_SHIFT); + return 0; + } + if (priv->fsync.mode == MAX96712_FSYNC_OFF) return 0; @@ -739,14 +859,117 @@ static int max96712_get_frame_desc(struct v4l2_subdev *sd, unsigned int pad, return ret; } +static struct v4l2_subdev *max96712_xlate_streams(struct max96712_priv *priv, + struct v4l2_subdev_state *state, u32 src_pad, + u64 src_streams, u32 sink_pad, u64 *sink_streams, + u32 *remote_pad) +{ + struct device *dev = &priv->client->dev; + u64 streams; + struct v4l2_subdev *remote_sd; + struct media_pad *pad; + + streams = v4l2_subdev_state_xlate_streams(state, src_pad, sink_pad, &src_streams); + if (!streams) + dev_dbg(dev, "no streams found on sink pad\n"); + + pad = media_pad_remote_pad_first(&priv->pads[sink_pad]); + if (!pad) { + dev_dbg(dev, "no remote pad found for sink pad\n"); + return ERR_PTR(-EPIPE); + } + + remote_sd = media_entity_to_v4l2_subdev(pad->entity); + if (!remote_sd) { + dev_dbg(dev, "no entity connected to CSI2 input\n"); + return ERR_PTR(-EPIPE); + } + + *sink_streams = streams; + *remote_pad = pad->index; + + return remote_sd; +} + +static int max96712_enable_remote_stream(struct max96712_priv *priv, + struct v4l2_subdev_state *state, + u32 source_pad, u32 stream, u32 sink_pad, + bool enable) +{ + struct device *dev = &priv->client->dev; + struct v4l2_subdev *remote_sd; + u64 sink_streams = 0; + u32 remote_pad = 0; + int ret = 0; + + if (enable && priv->vpg_started) { + dev_err(dev, "Cannot enable remote streams while VPG is enabled.\n"); + return -EINVAL; + } + + remote_sd = max96712_xlate_streams(priv, state, source_pad, BIT(stream), sink_pad, + &sink_streams, &remote_pad); + if (IS_ERR(remote_sd)) + return PTR_ERR(remote_sd); + + ret = enable ? v4l2_subdev_enable_streams(remote_sd, remote_pad, 0x1) : + v4l2_subdev_disable_streams(remote_sd, remote_pad, 0x1); + + if (ret) + dev_err(&priv->client->dev, "failed to %s streams 0x%llx on '%s':%u: %d\n", + enable ? "enable" : "disable", + sink_streams, remote_sd->name, remote_pad, ret); + + return ret; +} + static int max96712_enable_streams(struct v4l2_subdev *sd, struct v4l2_subdev_state *state, u32 source_pad, u64 streams_mask) { struct max96712_priv *priv = v4l2_get_subdevdata(sd); + u64 sources_mask = streams_mask; + u32 sink_pad, sink_stream; + int ret = 0; + + if (!priv->enabled_streams) + max96712_mipi_enable(priv, true); + + while (true) { + int pos = ffs(sources_mask) - 1; - max96712_pattern_enable(priv, state, true); - max96712_mipi_enable(priv, true); + if (pos == -1) + break; + + ret = v4l2_subdev_routing_find_opposite_end(&state->routing, + source_pad, pos, + &sink_pad, &sink_stream); + if (ret) + return ret; + + if (sink_pad == MAX96712_VPG_PAD && sink_stream == 0) { + /* need to have tunneling disabled for VPG to work */ + max96712_tunneling_enable(priv, false); + + ret = max96712_pattern_enable(priv, state, true); + } else { + if (!priv->enabled_streams) { + max96712_fsync_enable(priv, true); + if (priv->operation_mode == MAX96712_TUNNEL_MODE) + max96712_tunneling_enable(priv, true); + } + + ret = max96712_enable_remote_stream(priv, state, source_pad, pos, + sink_pad, true); + } + + if (ret) + return ret; + + sources_mask &= ~BIT(pos); + } + + priv->enabled_streams |= streams_mask; return 0; } @@ -756,9 +979,42 @@ static int max96712_disable_streams(struct v4l2_subdev *sd, u32 source_pad, u64 streams_mask) { struct max96712_priv *priv = v4l2_get_subdevdata(sd); + u64 sources_mask = streams_mask; + u32 sink_pad, sink_stream; + int ret = 0; - max96712_mipi_enable(priv, false); - max96712_pattern_enable(priv, state, false); + while (true) { + int pos = ffs(sources_mask) - 1; + + if (pos == -1) + break; + + ret = v4l2_subdev_routing_find_opposite_end(&state->routing, + source_pad, pos, + &sink_pad, &sink_stream); + if (ret) + return ret; + + max96712_update_bits(priv, MAX96712_MIPI_PHY_0, FORCE_CSI_OUT_EN, 0x00); + + if (sink_pad == MAX96712_VPG_PAD && sink_stream == 0) + ret = max96712_pattern_enable(priv, state, false); + else + ret = max96712_enable_remote_stream(priv, state, source_pad, pos, + sink_pad, false); + + if (ret) + return ret; + + sources_mask &= ~BIT(pos); + } + + priv->enabled_streams &= ~streams_mask; + + if (!priv->enabled_streams) { + max96712_fsync_enable(priv, false); + max96712_mipi_enable(priv, false); + } return 0; } @@ -842,6 +1098,104 @@ static int max96712_set_fmt(struct v4l2_subdev *sd, return 0; } +#define to_index(priv, rx_port) ((rx_port) - &(priv)->rx_ports[0]) + +static int max96712_notify_bound(struct v4l2_async_notifier *notifier, + struct v4l2_subdev *subdev, + struct v4l2_async_connection *asc) +{ + struct max96712_priv *priv = container_of(notifier->sd, struct max96712_priv, sd); + struct max96712_asc *async_conn = container_of(asc, struct max96712_asc, base); + struct max96712_rx_port *rx_port = async_conn->rx_port; + unsigned int index = to_index(priv, rx_port); + struct device *dev = &priv->client->dev; + unsigned int src_pad; + int ret; + + ret = media_entity_get_fwnode_pad(&subdev->entity, rx_port->fwnode, MEDIA_PAD_FL_SOURCE); + if (ret < 0) { + dev_err(dev, "Failed to find pad for %s\n", subdev->name); + return ret; + } + + rx_port->sd = subdev; + src_pad = ret; + + ret = media_create_pad_link(&rx_port->sd->entity, src_pad, &priv->sd.entity, index, 0); + if (ret) { + dev_err(dev, "Unable to link %s:%u -> %s:%u\n", + rx_port->sd->name, src_pad, priv->sd.name, index); + return ret; + } + + dev_dbg(dev, "Bound %s pad: %u on index %u\n", subdev->name, src_pad, index); + + return 0; +} + +static void max96712_notify_unbind(struct v4l2_async_notifier *notifier, + struct v4l2_subdev *subdev, + struct v4l2_async_connection *asc) +{ + struct max96712_asc *async_conn = container_of(asc, struct max96712_asc, base); + struct max96712_rx_port *rx_port = async_conn->rx_port; + + rx_port->sd = NULL; +} + +static const struct v4l2_async_notifier_operations max96724_notify_ops = { + .bound = max96712_notify_bound, + .unbind = max96712_notify_unbind, +}; + +static int max96712_v4l2_notifier_register(struct max96712_priv *priv) +{ + int i, ret; + struct device *dev = &priv->client->dev; + struct max96712_rx_port *rx_port = NULL; + u32 rx_port_mask = priv->rx_port_mask; + + if (!priv->n_rx_ports) + return 0; + + v4l2_async_subdev_nf_init(&priv->notifier, &priv->sd); + + while (true) { + int pos = ffs(rx_port_mask) - 1; + struct max96712_asc *asc; + + if (pos == -1) + break; + + rx_port = &priv->rx_ports[pos]; + rx_port_mask &= ~BIT(pos); + + if (!rx_port->fwnode) + continue; + + asc = v4l2_async_nf_add_fwnode(&priv->notifier, rx_port->fwnode, + struct max96712_asc); + if (IS_ERR(asc)) { + dev_err(dev, "Failed to add subdev for source %u: %ld", i, PTR_ERR(asc)); + v4l2_async_nf_cleanup(&priv->notifier); + return PTR_ERR(asc); + } + + asc->rx_port = rx_port; + } + + priv->notifier.ops = &max96724_notify_ops; + + ret = v4l2_async_nf_register(&priv->notifier); + if (ret) { + dev_err(dev, "Failed to register subdev_notifier"); + v4l2_async_nf_cleanup(&priv->notifier); + return ret; + } + + return 0; +} + static int max96712_init_state(struct v4l2_subdev *sd, struct v4l2_subdev_state *state) { @@ -862,6 +1216,37 @@ static int max96712_init_state(struct v4l2_subdev *sd, return _max96712_set_routing(sd, state, &routing); } +static int max96712_log_status(struct v4l2_subdev *sd) +{ + struct max96712_priv *priv = container_of(sd, struct max96712_priv, sd); + struct device *dev = &priv->client->dev; + u8 gmsl_link_status_mask; + char hdr[64]; + int nport; + + gmsl_link_status_mask = max96712_get_link_status(priv); + + dev_info(dev, "Deserializer status:\n"); + + dev_info(dev, "RX ports:\n"); + + for (nport = 0; nport < MAX96712_MAX_RX_PORTS; nport++) { + struct max96712_rx_port *rx_port = &priv->rx_ports[nport]; + + sprintf(hdr, "\t* RX %d:", nport); + + if (!rx_port->fwnode) { + dev_info(dev, "%s Not Configured\n", hdr); + continue; + } + + dev_info(dev, "%s Link %s\n", hdr, + gmsl_link_status_mask & BIT(nport) ? "locked" : "not locked"); + } + + return 0; +} + static const struct v4l2_subdev_internal_ops max96712_internal_ops = { .init_state = max96712_init_state, }; @@ -878,8 +1263,13 @@ static const struct v4l2_subdev_pad_ops max96712_pad_ops = { .set_frame_interval = max96712_set_frame_interval, }; +static const struct v4l2_subdev_core_ops max96712_subdev_core_ops = { + .log_status = max96712_log_status, +}; + static const struct v4l2_subdev_ops max96712_subdev_ops = { .video = &max96712_video_ops, + .core = &max96712_subdev_core_ops, .pad = &max96712_pad_ops, }; @@ -907,6 +1297,10 @@ static const struct v4l2_ctrl_ops max96712_ctrl_ops = { .s_ctrl = max96712_s_ctrl, }; +static const struct media_entity_operations max96712_v4l2_media_ops = { + .link_validate = v4l2_subdev_link_validate, +}; + static int max96712_v4l2_register(struct max96712_priv *priv) { struct v4l2_ctrl *link_freq_ctrl; @@ -917,6 +1311,7 @@ static int max96712_v4l2_register(struct max96712_priv *priv) v4l2_i2c_subdev_init(&priv->sd, priv->client, &max96712_subdev_ops); priv->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_STREAMS; priv->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE; + priv->sd.entity.ops = &max96712_v4l2_media_ops; v4l2_ctrl_handler_init(&priv->ctrl_handler, 2); @@ -953,6 +1348,12 @@ static int max96712_v4l2_register(struct max96712_priv *priv) if (ret) goto error; + ret = max96712_v4l2_notifier_register(priv); + if (ret) { + dev_err(&priv->client->dev, "Unable to register v4l2 async notifiers\n"); + goto error; + } + ret = v4l2_async_register_subdev(&priv->sd); if (ret < 0) { dev_err(&priv->client->dev, "Unable to register subdevice\n"); @@ -960,6 +1361,7 @@ static int max96712_v4l2_register(struct max96712_priv *priv) } return 0; + error: v4l2_ctrl_handler_free(&priv->ctrl_handler); @@ -1223,6 +1625,14 @@ static int max96712_parse_dt(struct max96712_priv *priv) int ret = 0, count; u32 dt_val[3]; + if (!fwnode_property_read_u32(dev_fwnode(dev), "maxim,operation-mode", &dt_val[0])) + priv->operation_mode = dt_val[0]; + + if (priv->operation_mode != MAX96712_TUNNEL_MODE) { + dev_err(dev, "Unsupported mode, only tunneling mode is supported currently.\n"); + return -EINVAL; + } + count = fwnode_property_count_u32(dev_fwnode(dev), "maxim,fsync-config"); if (count > 0) { ret = fwnode_property_read_u32_array(dev_fwnode(dev), "maxim,fsync-config",