From nobody Sat Feb 7 16:00:02 2026 Received: from DM5PR21CU001.outbound.protection.outlook.com (mail-centralusazon11011016.outbound.protection.outlook.com [52.101.62.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 7D3B334F476; Wed, 21 Jan 2026 15:30:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.62.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769009457; cv=fail; b=hjlegEX9FksGApc3klgv+nJ9PuPitOUMNXxPl8MTedQiz24qwAuKVl9QQQMqn+PhkHOGvVv1OYprpr1xPWCxvQWAjgfZDYk5j+DsJlBqTgDqU0lwSILNjqn/aXAiVaHZ+SQNgh9czSMief8w6ZS334F7N5jymxLL05XbDRE3cPM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769009457; c=relaxed/simple; bh=wvKBrYil3lJv1ZjUk6HE0tJoURZd2wnCX258RYfOJM4=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=WqNLGSw/pxP081xh/yY78JA8V5+suQO5KiHypUiUWIOj+uzL8yTQEBdfuqFYMVpdXCxy1fqoV1drLp5sfDt4C7UO+NdtvP92yC8weIdjanlall+FBmdew37jrwyeE6/miUEv0CMTunAZ5Wko1K96iYuQAFfZ7ZSlBQcgSEd0L4I= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=QdTZxWZ4; arc=fail smtp.client-ip=52.101.62.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="QdTZxWZ4" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=VnXj+NtaPxAEUbds1ZMNHi2TkD025nP2c+z+kVf6RWmJXb0Jfdv729XGlcpUtTctbZ91AlubbE8Q0tI3NngLFptdDuHD2d2CmbrK+ZujgqRdRetrorAjhiLubNcZbYgvV0rKHhTk5AIONY62vvxKZNfdXdVtxi/rIAi1aoagU4cDj9rwQSLG3lrokxrZgOKf8hwriye2fTGoVubukx2Svs6cVaJsD2i2HV4nUMLcWAWSl1lxk1JuQCKI2HkkiQWMJQGHaYZH4LLgHWdkvahuqaIh5NMcjW8efkM0arbDGJzrA7vCzr3bqswoRKHFBPH6IluL4IE3fMdcSz2T0IYHaA== 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=b/4MxM0v9Q8nvavAj6lDMKiYujcnbDBrIp8y4RrY/vo=; b=n2Zmt4uinKjyVUMuCLjkNBEEjgFtByjzzcCQ5KBb6dkiYbJlDPcZ3yifY4HHIN9EPzB3s3DEjDIYlhoGsfz4LcYPn4Rvt7o+McQlw8ZPCyOYZvt5ZLEFel4vxTeMInPGYdm45j+LRXNWx45RUvedbZ2pTIq1upZFXZF7EFh0Xpt9MB6SqiHtbvFy8pqjHJOjTMQLIvpbnFlJMwEk08JSAp5HiND3jeoSDD36QXXvyIfbRJpwobcNFontcxaVHVrS3hwzBVO7LCY8KSWps9y2lJ+cs2jVeRfY+6m4BN9eo76eAj46PXpOYxLAPieBoD6t+Sx0OTeKXKpL0vmEYaTavQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=gmail.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=b/4MxM0v9Q8nvavAj6lDMKiYujcnbDBrIp8y4RrY/vo=; b=QdTZxWZ47S0S4EeEqkI9ERuxnuYK11OWghoPbcw8wMAPKW3YSPid7f5WSAGIctdNlIFSMAthX2+KifcB7MZ75ttNhkY/z+9E9d+1ahvlLordrFPm95P5vgPHqAM2fJYAa7vvkVBMJSHDWCjkSnDk3RnggMPXv5wrHQqiARr0Ed4PK43nQhxqdkmD6o/rK+hAqt/sxsM/sXwlVCtbXlKn1wmd1vQ9eMhe4FXfGqhtLSO/O4jD9M8EKM6Rj72QPW9mg80uUK2sW3O/Q/ctGtcAyxNKdQvrEJAuohZ6cYuFY5ZX3mPnqbOe3yyePot9h7qo1yLWw+NDg2/n0SM7nrWHKQ== Received: from BN0PR02CA0055.namprd02.prod.outlook.com (2603:10b6:408:e5::30) by CH3PR12MB9028.namprd12.prod.outlook.com (2603:10b6:610:123::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9542.9; Wed, 21 Jan 2026 15:30:51 +0000 Received: from BN2PEPF000044A2.namprd02.prod.outlook.com (2603:10b6:408:e5:cafe::b4) by BN0PR02CA0055.outlook.office365.com (2603:10b6:408:e5::30) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9542.9 via Frontend Transport; Wed, 21 Jan 2026 15:30:47 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by BN2PEPF000044A2.mail.protection.outlook.com (10.167.243.153) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9542.4 via Frontend Transport; Wed, 21 Jan 2026 15:30:50 +0000 Received: from rnnvmail205.nvidia.com (10.129.68.10) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 21 Jan 2026 07:30:22 -0800 Received: from rnnvmail203.nvidia.com (10.129.68.9) by rnnvmail205.nvidia.com (10.129.68.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 21 Jan 2026 07:30:21 -0800 Received: from kkartik-desktop.nvidia.com (10.127.8.13) by mail.nvidia.com (10.129.68.9) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 21 Jan 2026 07:30:18 -0800 From: Kartik Rajput To: , , , , , , , , , CC: Kartik Rajput Subject: [PATCH v9 1/4] i2c: tegra: Introduce tegra_i2c_variant to identify DVC and VI Date: Wed, 21 Jan 2026 21:00:08 +0530 Message-ID: <20260121153012.92243-2-kkartik@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260121153012.92243-1-kkartik@nvidia.com> References: <20260121153012.92243-1-kkartik@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN2PEPF000044A2:EE_|CH3PR12MB9028:EE_ X-MS-Office365-Filtering-Correlation-Id: 0687355b-48e0-4bca-7e79-08de59020f1c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|1800799024|36860700013|82310400026|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?JZylLoenw9MN2700OMHc0hp4hn6eUkf+oEPgQ5mTuJ1NwBj46oLQzd/ex4qd?= =?us-ascii?Q?tTySE3XDdPwOB/MPOcDg8UxmIGE4ACDlVCXyDrH6+YbX7QJSQWYBnX8e8awb?= =?us-ascii?Q?/zbxL3q6kBWOeoYyJgH00uwi1X/NjVpGDJ78JqHjwLvHmRQjrUHZ1lCKQ8VI?= =?us-ascii?Q?JxkvKlvfHBGn6cpvA1vaCfhTFseq/min6L4sVymFTKrjzR4f0akGVhf7RLNX?= =?us-ascii?Q?4Z4duTb/Xk1mW9dNAXaxNEWIE53lhvj0QmRzuPcURedIvIFl7V2s2j5GdX4l?= =?us-ascii?Q?TREKcqMiTFwpXbOixTcXYmjS925+pQByDLwrebJW5VVR1wdQ51cng+1KEdn6?= =?us-ascii?Q?/YGuU/8V+I8FKljVG38OsCWigGmbu7UDXVLaR8IkuTcuLwQ9hGwk1J0+AdMv?= =?us-ascii?Q?zG4ZoLID0EqNVLW5FhdWS6npUMm6iz0ZnpOsDzCqxQ9sxxTV8IHmq60aBLtv?= =?us-ascii?Q?tbGDuHhYrTvngWXMD9SPyaeipjWecf/PU2ZUJJmxNF0AXv49Y2f+8eXR4WJA?= =?us-ascii?Q?5jBCkh3Cu5T4V2BiVoyf9GX1C0PZjFubEYudqkQBCc29K6LDr4QcAw+xF+kD?= =?us-ascii?Q?S4jCDe5Ae4Df0GzhUwPK8194vmQ6HQHT8VBTsWS/da02VV1VJeFO7Whg9Dfz?= =?us-ascii?Q?wcgFFhu+23P71QwcvbprkBOwlpeN0h9qH/UW40yW6nZVccx8L8AG74rya6tu?= =?us-ascii?Q?gy8fH5T5uOTbjAJfeatF9MSCV4i2/C6UqT1cxR7BwOcoPl/pud97VflWvvB1?= =?us-ascii?Q?C6+xjVCniVhTohAVPMgJVOUQiSXZxbw0UKWtNnLFCY/eU2yDkIP19Mr8Ya1Y?= =?us-ascii?Q?Z0a0KSF3AU7+vYk+DSwkwzrCpcHlzSmcy2chZsjeW1XsRb+CVh+HRSYg7AaR?= =?us-ascii?Q?03otSRTl54UGTRGJ+ngnOHZnFr00Xzu/7We71IrwumrTehWh9HQSfy9mfgUR?= =?us-ascii?Q?Ofq3OScdWRtQ9OdAzNx50Vk/tTjbw2yOwNq4+BaydNfRzwq4Lkbf4PqPMgDa?= =?us-ascii?Q?+kiaxXLMhonhvZNOeWBrT9+WqTmkkYU53+QL/ybVqJcQzP/eNU5TdPmjFLbc?= =?us-ascii?Q?Ji0107p2qo+GKEbWZuHmt6J8R+IbjnxpXbyXuZW4V676qXyMIOILJ7o/xxWU?= =?us-ascii?Q?00cp0nMLZ8vyG49JYmixCcqvoaTG+4fNULRtupJRIqopafBe9e/S72oOCCvQ?= =?us-ascii?Q?m7GwQi+gGBAMd7zEnreCsJjcgh0EG2RDsqKLiskNORxFTDYffYdoJ3oHMXzL?= =?us-ascii?Q?vMDrWF+e3TqBOqgEPGwfH5Q1yBmsV3FUSCimtAbxDIcHBGnufvKUn2hs97k+?= =?us-ascii?Q?VWgphp9YrmmstQtkEzH0tBPJO1Kl6/cKv72Y0XdGhAAfKhL2+x7sfYU5G2sn?= =?us-ascii?Q?wJl/EcnGt5x1Zh1UnM1LXc0FGl3lHlqPZEfqzGBe4hSBFezUl/8XAJKdU2mf?= =?us-ascii?Q?fBxEnaysWT9yX0jSbhhEhg2paOG7YvJdiOM8VbRNTHwyRmObKAR3XZLuzMXH?= =?us-ascii?Q?dRdnSDV1gHrpCCHWx0gJm3WQbfh7+O4lTravaP5+zZW+XqwR+U4NfBPSbvGC?= =?us-ascii?Q?kLNAzvQ1Xh49Joa+a1N9f+5+aMyZXO78I5yw7Lg+3rDFvoDBrNHqfvUQMMjn?= =?us-ascii?Q?i8xXmGQKZj7Wev1o8akPVEJM8Np3+OEcUaWbl8pQL1YZ3OUrpeYYu6i+E4MK?= =?us-ascii?Q?T9vnsLxvFAovLeDNQitdslbdDZw=3D?= X-Forefront-Antispam-Report: CIP:216.228.117.160;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge1.nvidia.com;CAT:NONE;SFS:(13230040)(376014)(1800799024)(36860700013)(82310400026)(921020);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Jan 2026 15:30:50.9745 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 0687355b-48e0-4bca-7e79-08de59020f1c X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.160];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN2PEPF000044A2.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR12MB9028 Content-Type: text/plain; charset="utf-8" Replace the per-instance boolean flags with an enum tegra_i2c_variant since DVC and VI are mutually exclusive. Update IS_DVC/IS_VI and variant initialization accordingly. Suggested-by: Jon Hunter Signed-off-by: Kartik Rajput Reviewed-by: Jon Hunter --- drivers/i2c/busses/i2c-tegra.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index bec619b9af4e..c2c60ba4fe5e 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c @@ -171,6 +171,18 @@ enum msg_end_type { MSG_END_CONTINUE, }; =20 +/* + * tegra_i2c_variant: Identifies the variant of I2C controller. + * @TEGRA_I2C_VARIANT_DEFAULT: Identifies the default I2C controller. + * @TEGRA_I2C_VARIANT_DVC: Identifies the DVC I2C controller, has a differ= ent register layout. + * @TEGRA_I2C_VARIANT_VI: Identifies the VI I2C controller, has a differen= t register layout. + */ +enum tegra_i2c_variant { + TEGRA_I2C_VARIANT_DEFAULT, + TEGRA_I2C_VARIANT_DVC, + TEGRA_I2C_VARIANT_VI, +}; + /** * struct tegra_i2c_hw_feature : per hardware generation features * @has_continue_xfer_support: continue-transfer supported @@ -268,8 +280,7 @@ struct tegra_i2c_hw_feature { * @base_phys: physical base address of the I2C controller * @cont_id: I2C controller ID, used for packet header * @irq: IRQ number of transfer complete interrupt - * @is_dvc: identifies the DVC I2C controller, has a different register la= yout - * @is_vi: identifies the VI I2C controller, has a different register layo= ut + * @variant: This represents the I2C controller variant. * @msg_complete: transfer completion notifier * @msg_buf_remaining: size of unsent data in the message buffer * @msg_len: length of message in current transfer @@ -321,12 +332,13 @@ struct tegra_i2c_dev { bool atomic_mode; bool dma_mode; bool msg_read; - bool is_dvc; - bool is_vi; + enum tegra_i2c_variant variant; }; =20 -#define IS_DVC(dev) (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC) && (dev)->is_dvc) -#define IS_VI(dev) (IS_ENABLED(CONFIG_ARCH_TEGRA_210_SOC) && (dev)->is_vi) +#define IS_DVC(dev) (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC) && \ + (dev)->variant =3D=3D TEGRA_I2C_VARIANT_DVC) +#define IS_VI(dev) (IS_ENABLED(CONFIG_ARCH_TEGRA_210_SOC) && \ + (dev)->variant =3D=3D TEGRA_I2C_VARIANT_VI) =20 static void dvc_writel(struct tegra_i2c_dev *i2c_dev, u32 val, unsigned int reg) @@ -1913,13 +1925,15 @@ static void tegra_i2c_parse_dt(struct tegra_i2c_dev= *i2c_dev) multi_mode =3D device_property_read_bool(i2c_dev->dev, "multi-master"); i2c_dev->multimaster_mode =3D multi_mode; =20 + i2c_dev->variant =3D TEGRA_I2C_VARIANT_DEFAULT; + if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC) && of_device_is_compatible(np, "nvidia,tegra20-i2c-dvc")) - i2c_dev->is_dvc =3D true; + i2c_dev->variant =3D TEGRA_I2C_VARIANT_DVC; =20 if (IS_ENABLED(CONFIG_ARCH_TEGRA_210_SOC) && of_device_is_compatible(np, "nvidia,tegra210-i2c-vi")) - i2c_dev->is_vi =3D true; + i2c_dev->variant =3D TEGRA_I2C_VARIANT_VI; } =20 static int tegra_i2c_init_clocks(struct tegra_i2c_dev *i2c_dev) --=20 2.43.0 From nobody Sat Feb 7 16:00:02 2026 Received: from SN4PR0501CU005.outbound.protection.outlook.com (mail-southcentralusazon11011045.outbound.protection.outlook.com [40.93.194.45]) (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 A270135773A; Wed, 21 Jan 2026 15:31:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.194.45 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769009474; cv=fail; b=iOuXabLq5bX9eJVE1dWy8M5qxXsf6jXBsgxD2LYmvp/c0BJkM84bOCIOIBZtVpaPtBlSlbxemeK23XRpKo7yCZG0OEhCm2BWUXxHv3r5uaO3rbu6a0ib/a9YHMWd1aYWFHGPplr/r0YqRBhVwR3vpEdJIwHeKfTFR9MYaj8iQKA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769009474; c=relaxed/simple; bh=GKb6P06nPBL+4WFccWc5JBVNJUGfvPhJbxM9caxCLGk=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=bGdNqKfIe7rDgSlzVKrSQ2JsJnuxqvLAhESFPKuKsg5F9/1f4tPx24eNtdnYLEkEhsXTwzUxTIxq62vumj57IsdG+aGGEeALzM77rRVoQftuV0G4FfHcyvm2ZVcadQo+vUFm9mXDRyVfNviAOROLELm38YIiopULrlD08GKjbXY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=AeAz2jRv; arc=fail smtp.client-ip=40.93.194.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="AeAz2jRv" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=MqivaUyZ6j1KQ7zudsHyJ1bj/YUedghb3UxFxHnm7FGj4IfafaiQPBhIs7lWOCexEeCLXCTdMnAjdVdap8BcPO2A8m8NH07t8SOa+92Q6yVRZIXGGWrPkdsnO1os3xR+NVwK7F7TvdPCjcmDhxbi57+Pwh3EVzEqZ5lXVxOsZQDat8Q6ZCy1/7cSQKD1bqcvHYLFmwthh0tYtPcP/gcTWbFCoTE+ACXKKBGETn6847ZTbXebwhVYyYuBVfZEKu6vrE5Vgi2Q8Qbzw7PYTnUsWCvTxUnQ0rgdg1b0bIdFX/nd1r4GEFAbErXpuyWelWccIQ8UnkV4CjS+9dx3nBb+YA== 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=0/C6H9rjMdSCZN2wB8ng96XTIwUwp4rCysLOAXl2kHE=; b=k4ljaPneJB6+LU7AIWGReBm0V74W48RMHzaWnn88AmAU5y1h6Jvx85aIMEfAEqG5qveBsy+vvo+vNNGVc0wHOTyMxl21ozga7Ru5yI2a1lmZGUNrkAQpGxaB8XoVA5TsXlRrVQP16IBfQa4OTx9BJDmyd0llkJYBYOsC6E37GZQ2XcotAcGKDdaOdlHrWjLuuOXe6mhNtBJfkQCQLPZiOy+6GVJ+bVW/hfKBY5HG+x+GoXrLIQxxejRCfMWaSpPhAtFKJxg4GTUeqOGfM8upQ9HdhJa5J9gEJlaZrHCdOC5slqdBWqO4DZ413/uFIJQEpsaKCxT+mJcC8cEj8Cv+8w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=gmail.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=0/C6H9rjMdSCZN2wB8ng96XTIwUwp4rCysLOAXl2kHE=; b=AeAz2jRvhA9/dGE2ifi9dOj0ERjN5ekxEoF7G8IiM63+ajtMnYGR/J1DwqTbyX8DISoxBJmxzsTw3pDUVpMEDr0ELBaUsV0e8jzhShN86MPNJdrftgto5Ggyh3ZwkFZKEsH6O5q1Mtem+1bhdF9G84MZNJvVzN/n0h2KXI5fcnauCXAgW2+3/DO/OmFs+sdZ2RVolTT9krXlhAob8KhEpUvR3BqIM2UA53ADeQzFtpPQWZcC6eHPEZOiOR2IftWanPiryzHlNKJ8FQoNN7jcQTaG+9pUOQGme7tYbiVLE0NNn0SXSnzpwytf7YovHTPEE2Y5quECUb0yqaGxSN8gAg== Received: from BYAPR08CA0030.namprd08.prod.outlook.com (2603:10b6:a03:100::43) by LV8PR12MB9335.namprd12.prod.outlook.com (2603:10b6:408:1fc::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9542.9; Wed, 21 Jan 2026 15:30:57 +0000 Received: from MWH0EPF000A672E.namprd04.prod.outlook.com (2603:10b6:a03:100:cafe::b1) by BYAPR08CA0030.outlook.office365.com (2603:10b6:a03:100::43) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9542.10 via Frontend Transport; Wed, 21 Jan 2026 15:30:57 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by MWH0EPF000A672E.mail.protection.outlook.com (10.167.249.20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9542.4 via Frontend Transport; Wed, 21 Jan 2026 15:30:57 +0000 Received: from rnnvmail204.nvidia.com (10.129.68.6) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 21 Jan 2026 07:30:26 -0800 Received: from rnnvmail203.nvidia.com (10.129.68.9) by rnnvmail204.nvidia.com (10.129.68.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 21 Jan 2026 07:30:25 -0800 Received: from kkartik-desktop.nvidia.com (10.127.8.13) by mail.nvidia.com (10.129.68.9) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 21 Jan 2026 07:30:22 -0800 From: Kartik Rajput To: , , , , , , , , , CC: Kartik Rajput Subject: [PATCH v9 2/4] i2c: tegra: Move variant to tegra_i2c_hw_feature Date: Wed, 21 Jan 2026 21:00:09 +0530 Message-ID: <20260121153012.92243-3-kkartik@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260121153012.92243-1-kkartik@nvidia.com> References: <20260121153012.92243-1-kkartik@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MWH0EPF000A672E:EE_|LV8PR12MB9335:EE_ X-MS-Office365-Filtering-Correlation-Id: 2110405a-3d5e-4bca-5051-08de590212e8 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|36860700013|376014|82310400026|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?kiedoVRFebfW3cH9Te7E+59koU9hPYYIfKsmx/EGiIJYJ7E/uBZPGpetxgPy?= =?us-ascii?Q?5HcnJht10U07kRnv7UH/R47wOVeOoFdSYx8usF9vS/catfuyYnB/Rfdeasxr?= =?us-ascii?Q?S6L42G2iabTLL7rNKARxfsk08tr0WM5pkOySWdQHQLoszJjQWsOQNTfAgwaE?= =?us-ascii?Q?S6ioH4fySOeNAjhq6FGpOxImgMntFIFqA6z+X7bv0BxXlk8sm+Zp75OepBu0?= =?us-ascii?Q?dlerlsK+lu1Jppero030jb7aAI4656pOlpM6toKH3DD6ym3u+sjcLskWWzhJ?= =?us-ascii?Q?QDDKZeg2Jn5huzxgGHsu+l/U03X0ulRHcTChzlASg38DwEP0Ax5hHmROLhWs?= =?us-ascii?Q?9uDooQBDhIkcoumvxHCX15QptO2n/frfA50tsdjDGh2mDJjPxTlEqObmhSFi?= =?us-ascii?Q?iPISNTTI267vNb83VaT+Xn2um7Iy5v1I0SZcvqlPXFFKwa7FCjmWXLNSljyL?= =?us-ascii?Q?7oRrx7kiOuve+twuz90RTn1WKm3Wp9JsZynsZIknZNzT2eBBhYVKMkkIBz4W?= =?us-ascii?Q?tD9+jnsrprFkzVP1RJhYPsiXVwGnsNW9iu8vs7J/tp/p1KWlBhqmD+AthftG?= =?us-ascii?Q?4AQQvBSt0NDwT+Z2nym7azRaVXDwtRZ5784WMZJLfnugFqTB9TyxBK6QyLJV?= =?us-ascii?Q?eIdscF5H8BHplGIFGJv5jrT4tLHqRv3xNJuiFwc1wJkt6aMrt+PZgb3uYYyp?= =?us-ascii?Q?2EOe3sKb3AuJVBcg2fQ6E0b/mMGNYwV0uWeS8c+8KCTYuwpNH4pJ+hoSFv3m?= =?us-ascii?Q?CNfVWCSknuRazB5hgbhWbFbuf4envKIbj+vxP57LIuqcLMID2J7Y+TgifwCy?= =?us-ascii?Q?noZZsobq1y/AK9jgfaaYHNGKHJsFGf6XSVT3HsQnzycp+qhYvpCS2FIDn/MA?= =?us-ascii?Q?7YI8CJ20Zigv7dUYA1MhKSgVJz+Lg74UE981HdaH3h1jcx6DKjQz5pejDDnn?= =?us-ascii?Q?clfyOYprtLZ1R+nlpHJLK2x24C5qHOJMUJrj/B0SnSJACUz7KaoToafY2p2h?= =?us-ascii?Q?pNWdlIIuJc0lOYOuueMZxG2U9Ik3mKAVErIlrAb8KMhyp22tLZ2lgnM8PBle?= =?us-ascii?Q?Oe0rABDlbCXLZX31MM9TANHofmRGsTBV5YbiZXnyp0+3in8HdeJCBDR3dASz?= =?us-ascii?Q?ys4Opc4EDs38kVqDqk/FQIIcHYGw416WmK5NeNt0/wM+I3iPDV04eknXasqK?= =?us-ascii?Q?lnmz26S9DsQPAYf0oP50AyMUS+y6KlLI4Yuoiulk/9VHcXprG1R556xtId0I?= =?us-ascii?Q?QwPK01oEMa/qOzzJZfkCQSTZw+CtV3m+t4WIX3JSI1xb/mKMiAJfofs8S9SP?= =?us-ascii?Q?Nxh2bdEXmsJxCcXTDiINnk1+3yEE2x5aFQ0Ftf9EXQGOHcGwy0WFegabBMuq?= =?us-ascii?Q?9UC2ZFVjntDzqfcwbLziTAqMI+AX2bckoLRlWlc6mNKbCNViKLyJi5XwmHWj?= =?us-ascii?Q?0owuI29tvmmzqmxASuEH/eqHePGT8dj3o5uGuYnBTgo0NGphUyVKv0jxW+Yv?= =?us-ascii?Q?jMw5LCw6vynFkjwWnF07tIYswiBu5K2JyXYEYkE9HLufXJ72b6XxzJ2ygiML?= =?us-ascii?Q?6nlf0B1DS5z3XCAckaFeVyDgK1ESUFiRktcOtWvPPABuVti2kLRVVPr7MMH0?= =?us-ascii?Q?3yFw5CTuzJEAgd5YLEQBDcZ2YTSCEd+MGbNEo00x+quRtqtwNZUXoQi8dzPm?= =?us-ascii?Q?PPdt4ZtOrPEi1WqbLGd8QGley74=3D?= X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(1800799024)(36860700013)(376014)(82310400026)(921020);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Jan 2026 15:30:57.3786 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2110405a-3d5e-4bca-5051-08de590212e8 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: MWH0EPF000A672E.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV8PR12MB9335 Content-Type: text/plain; charset="utf-8" Move the variant field into tegra_i2c_hw_feature and populate it for all SoCs. Add dedicated SoC data for "nvidia,tegra20-i2c-dvc" and "nvidia,tegra210-i2c-vi" compatibles. Drop the compatible-string checks from tegra_i2c_parse_dt to initialize the Tegra I2C variant. Signed-off-by: Kartik Rajput Reviewed-by: Jon Hunter --- Changes in v5: * Updated commit message. Changes in v4: * Reverted the change to remove config checks from IS_DVC and IS_VI macros. --- drivers/i2c/busses/i2c-tegra.c | 98 ++++++++++++++++++++++++++++------ 1 file changed, 81 insertions(+), 17 deletions(-) diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index c2c60ba4fe5e..2ef5fba66b0f 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c @@ -235,6 +235,7 @@ enum tegra_i2c_variant { * timing settings. * @enable_hs_mode_support: Enable support for high speed (HS) mode transf= ers. * @has_mutex: Has mutex register for mutual exclusion with other firmware= s or VMs. + * @variant: This represents the I2C controller variant. */ struct tegra_i2c_hw_feature { bool has_continue_xfer_support; @@ -266,6 +267,7 @@ struct tegra_i2c_hw_feature { bool has_interface_timing_reg; bool enable_hs_mode_support; bool has_mutex; + enum tegra_i2c_variant variant; }; =20 /** @@ -280,7 +282,6 @@ struct tegra_i2c_hw_feature { * @base_phys: physical base address of the I2C controller * @cont_id: I2C controller ID, used for packet header * @irq: IRQ number of transfer complete interrupt - * @variant: This represents the I2C controller variant. * @msg_complete: transfer completion notifier * @msg_buf_remaining: size of unsent data in the message buffer * @msg_len: length of message in current transfer @@ -332,13 +333,12 @@ struct tegra_i2c_dev { bool atomic_mode; bool dma_mode; bool msg_read; - enum tegra_i2c_variant variant; }; =20 #define IS_DVC(dev) (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC) && \ - (dev)->variant =3D=3D TEGRA_I2C_VARIANT_DVC) + (dev)->hw->variant =3D=3D TEGRA_I2C_VARIANT_DVC) #define IS_VI(dev) (IS_ENABLED(CONFIG_ARCH_TEGRA_210_SOC) && \ - (dev)->variant =3D=3D TEGRA_I2C_VARIANT_VI) + (dev)->hw->variant =3D=3D TEGRA_I2C_VARIANT_VI) =20 static void dvc_writel(struct tegra_i2c_dev *i2c_dev, u32 val, unsigned int reg) @@ -1647,8 +1647,42 @@ static const struct tegra_i2c_hw_feature tegra20_i2c= _hw =3D { .has_interface_timing_reg =3D false, .enable_hs_mode_support =3D false, .has_mutex =3D false, + .variant =3D TEGRA_I2C_VARIANT_DEFAULT, }; =20 +#if IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC) +static const struct tegra_i2c_hw_feature tegra20_dvc_i2c_hw =3D { + .has_continue_xfer_support =3D false, + .has_per_pkt_xfer_complete_irq =3D false, + .clk_divisor_hs_mode =3D 3, + .clk_divisor_std_mode =3D 0, + .clk_divisor_fast_mode =3D 0, + .clk_divisor_fast_plus_mode =3D 0, + .has_config_load_reg =3D false, + .has_multi_master_mode =3D false, + .has_slcg_override_reg =3D false, + .has_mst_fifo =3D false, + .has_mst_reset =3D false, + .quirks =3D &tegra_i2c_quirks, + .supports_bus_clear =3D false, + .has_apb_dma =3D true, + .tlow_std_mode =3D 0x4, + .thigh_std_mode =3D 0x2, + .tlow_fast_mode =3D 0x4, + .thigh_fast_mode =3D 0x2, + .tlow_fastplus_mode =3D 0x4, + .thigh_fastplus_mode =3D 0x2, + .setup_hold_time_std_mode =3D 0x0, + .setup_hold_time_fast_mode =3D 0x0, + .setup_hold_time_fastplus_mode =3D 0x0, + .setup_hold_time_hs_mode =3D 0x0, + .has_interface_timing_reg =3D false, + .enable_hs_mode_support =3D false, + .has_mutex =3D false, + .variant =3D TEGRA_I2C_VARIANT_DVC, +}; +#endif + static const struct tegra_i2c_hw_feature tegra30_i2c_hw =3D { .has_continue_xfer_support =3D true, .has_per_pkt_xfer_complete_irq =3D false, @@ -1677,6 +1711,7 @@ static const struct tegra_i2c_hw_feature tegra30_i2c_= hw =3D { .has_interface_timing_reg =3D false, .enable_hs_mode_support =3D false, .has_mutex =3D false, + .variant =3D TEGRA_I2C_VARIANT_DEFAULT, }; =20 static const struct tegra_i2c_hw_feature tegra114_i2c_hw =3D { @@ -1707,6 +1742,7 @@ static const struct tegra_i2c_hw_feature tegra114_i2c= _hw =3D { .has_interface_timing_reg =3D false, .enable_hs_mode_support =3D false, .has_mutex =3D false, + .variant =3D TEGRA_I2C_VARIANT_DEFAULT, }; =20 static const struct tegra_i2c_hw_feature tegra124_i2c_hw =3D { @@ -1737,6 +1773,7 @@ static const struct tegra_i2c_hw_feature tegra124_i2c= _hw =3D { .has_interface_timing_reg =3D true, .enable_hs_mode_support =3D false, .has_mutex =3D false, + .variant =3D TEGRA_I2C_VARIANT_DEFAULT, }; =20 static const struct tegra_i2c_hw_feature tegra210_i2c_hw =3D { @@ -1767,8 +1804,42 @@ static const struct tegra_i2c_hw_feature tegra210_i2= c_hw =3D { .has_interface_timing_reg =3D true, .enable_hs_mode_support =3D false, .has_mutex =3D false, + .variant =3D TEGRA_I2C_VARIANT_DEFAULT, }; =20 +#if IS_ENABLED(CONFIG_ARCH_TEGRA_210_SOC) +static const struct tegra_i2c_hw_feature tegra210_vi_i2c_hw =3D { + .has_continue_xfer_support =3D true, + .has_per_pkt_xfer_complete_irq =3D true, + .clk_divisor_hs_mode =3D 1, + .clk_divisor_std_mode =3D 0x19, + .clk_divisor_fast_mode =3D 0x19, + .clk_divisor_fast_plus_mode =3D 0x10, + .has_config_load_reg =3D true, + .has_multi_master_mode =3D false, + .has_slcg_override_reg =3D true, + .has_mst_fifo =3D false, + .has_mst_reset =3D false, + .quirks =3D &tegra_i2c_quirks, + .supports_bus_clear =3D true, + .has_apb_dma =3D true, + .tlow_std_mode =3D 0x4, + .thigh_std_mode =3D 0x2, + .tlow_fast_mode =3D 0x4, + .thigh_fast_mode =3D 0x2, + .tlow_fastplus_mode =3D 0x4, + .thigh_fastplus_mode =3D 0x2, + .setup_hold_time_std_mode =3D 0, + .setup_hold_time_fast_mode =3D 0, + .setup_hold_time_fastplus_mode =3D 0, + .setup_hold_time_hs_mode =3D 0, + .has_interface_timing_reg =3D true, + .enable_hs_mode_support =3D false, + .has_mutex =3D false, + .variant =3D TEGRA_I2C_VARIANT_VI, +}; +#endif + static const struct tegra_i2c_hw_feature tegra186_i2c_hw =3D { .has_continue_xfer_support =3D true, .has_per_pkt_xfer_complete_irq =3D true, @@ -1797,6 +1868,7 @@ static const struct tegra_i2c_hw_feature tegra186_i2c= _hw =3D { .has_interface_timing_reg =3D true, .enable_hs_mode_support =3D false, .has_mutex =3D false, + .variant =3D TEGRA_I2C_VARIANT_DEFAULT, }; =20 static const struct tegra_i2c_hw_feature tegra194_i2c_hw =3D { @@ -1829,6 +1901,7 @@ static const struct tegra_i2c_hw_feature tegra194_i2c= _hw =3D { .has_interface_timing_reg =3D true, .enable_hs_mode_support =3D true, .has_mutex =3D false, + .variant =3D TEGRA_I2C_VARIANT_DEFAULT, }; =20 static const struct tegra_i2c_hw_feature tegra256_i2c_hw =3D { @@ -1861,6 +1934,7 @@ static const struct tegra_i2c_hw_feature tegra256_i2c= _hw =3D { .has_interface_timing_reg =3D true, .enable_hs_mode_support =3D true, .has_mutex =3D true, + .variant =3D TEGRA_I2C_VARIANT_DEFAULT, }; =20 static const struct tegra_i2c_hw_feature tegra264_i2c_hw =3D { @@ -1893,6 +1967,7 @@ static const struct tegra_i2c_hw_feature tegra264_i2c= _hw =3D { .has_interface_timing_reg =3D true, .enable_hs_mode_support =3D true, .has_mutex =3D true, + .variant =3D TEGRA_I2C_VARIANT_DEFAULT, }; =20 static const struct of_device_id tegra_i2c_of_match[] =3D { @@ -1901,7 +1976,7 @@ static const struct of_device_id tegra_i2c_of_match[]= =3D { { .compatible =3D "nvidia,tegra194-i2c", .data =3D &tegra194_i2c_hw, }, { .compatible =3D "nvidia,tegra186-i2c", .data =3D &tegra186_i2c_hw, }, #if IS_ENABLED(CONFIG_ARCH_TEGRA_210_SOC) - { .compatible =3D "nvidia,tegra210-i2c-vi", .data =3D &tegra210_i2c_hw, }, + { .compatible =3D "nvidia,tegra210-i2c-vi", .data =3D &tegra210_vi_i2c_hw= , }, #endif { .compatible =3D "nvidia,tegra210-i2c", .data =3D &tegra210_i2c_hw, }, { .compatible =3D "nvidia,tegra124-i2c", .data =3D &tegra124_i2c_hw, }, @@ -1909,7 +1984,7 @@ static const struct of_device_id tegra_i2c_of_match[]= =3D { { .compatible =3D "nvidia,tegra30-i2c", .data =3D &tegra30_i2c_hw, }, { .compatible =3D "nvidia,tegra20-i2c", .data =3D &tegra20_i2c_hw, }, #if IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC) - { .compatible =3D "nvidia,tegra20-i2c-dvc", .data =3D &tegra20_i2c_hw, }, + { .compatible =3D "nvidia,tegra20-i2c-dvc", .data =3D &tegra20_dvc_i2c_hw= , }, #endif {}, }; @@ -1917,23 +1992,12 @@ MODULE_DEVICE_TABLE(of, tegra_i2c_of_match); =20 static void tegra_i2c_parse_dt(struct tegra_i2c_dev *i2c_dev) { - struct device_node *np =3D i2c_dev->dev->of_node; bool multi_mode; =20 i2c_parse_fw_timings(i2c_dev->dev, &i2c_dev->timings, true); =20 multi_mode =3D device_property_read_bool(i2c_dev->dev, "multi-master"); i2c_dev->multimaster_mode =3D multi_mode; - - i2c_dev->variant =3D TEGRA_I2C_VARIANT_DEFAULT; - - if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC) && - of_device_is_compatible(np, "nvidia,tegra20-i2c-dvc")) - i2c_dev->variant =3D TEGRA_I2C_VARIANT_DVC; - - if (IS_ENABLED(CONFIG_ARCH_TEGRA_210_SOC) && - of_device_is_compatible(np, "nvidia,tegra210-i2c-vi")) - i2c_dev->variant =3D TEGRA_I2C_VARIANT_VI; } =20 static int tegra_i2c_init_clocks(struct tegra_i2c_dev *i2c_dev) --=20 2.43.0 From nobody Sat Feb 7 16:00:02 2026 Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11013037.outbound.protection.outlook.com [40.107.201.37]) (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 ED72C35770A; Wed, 21 Jan 2026 15:31:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.201.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769009476; cv=fail; b=EjcXAwssdS9cR2+r0WWtG34UPi212WjL5Mu0plkEWthhi/oPT3TB0RjVQM/W6rhcuwZKgquGtSny0UX8BEjfjq+mI+OaPOXKHcl6w7O9pySphAekNs6mtGm+j9oW+PnLynY6TWEqTvdWH35hXK+T+XOXpI/oz845pQzIjD5sj+k= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769009476; c=relaxed/simple; bh=lF1bXxKcpA2cuNPGzIJcFZMT+h0CoQNA0guTSAxE0Pc=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=fdS10DQ9fY10fZPJep8X/Nh4peTKdrw7WRbC/Fghn8JoaQthMXpcsy+QrIMKp7oD4vDoNB5mkcy9C4MYnbPLd1zrpI4MDjufTa2+UlmAxp2pDGBMTlHNjhnzU8akvS0f82XR+Acob6bReSIeCF9yTf3PcZPaL1mfuz3ukom0fS4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=fu0TcsXS; arc=fail smtp.client-ip=40.107.201.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="fu0TcsXS" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=K2X+1lruOqP+StidV184LvXguECLS/t/6xXy5BBzHi184o3kCPXaP63deKpYHBh7gBFiBO9I7lVoEdJRm+qY3xVNGcNQw8q64Jpv1OMoxL7DZ9cLytNF0mr0oN77tNYwJeTR9xIyJu5ggO3AN7qfPQRdyEE4zU5Q1Mr3cVMrLWIKF0LAFf/yQ1b3iAs7LFdJUAyQkXvSILZseQOP8EhOmUJdubM6KxRp8T5YRF98lp9BFQxSI5f6rayX/8jjNz3FfETKbd6KkB/6pgXwKI2vFFsLtgxSqxhESMtx8cnX4olt6vrPVtguDzCywQdBEpXylelnEu1Z4y+8FzJ+gV075A== 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=cUhnPIG7l5ITlIzFJbP5ENhysYWUrPd3bkQrPU1g1A4=; b=YgVCwUXbp+coKjMI55i0QD/OE/GlZgP7NLVQDMn74c7q1Z17qAJGQ2Idaqc4xM5BSQ7FsdK4bwcxZrcwBLIrIQNoWK6ar02jgxSNgpOKCtrdTb0nWE/TPK1BgEt9N1/2idxj+onept5c0dhlijc8M8bbZLN2NbiSuLYi196cUFXkmL3mYt5O2hNfgF+l7sDT+iGfF61yF/G+QL4yg4vioMrDQjjNk+6+dv5m04ZkLiHqH0pOisx6DBPWHQyvR4qR9w5BjkzUxfz3amy71gIhjMUSrZWOK6dyJfL0vqEOhOeodarHkIgXQlLMM9xqlhJccapVJLWZCjVVlzdwa37uFw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=gmail.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=cUhnPIG7l5ITlIzFJbP5ENhysYWUrPd3bkQrPU1g1A4=; b=fu0TcsXSx/0uOEyjx0seerqVeyxWX82gmgQtIgsNU/4tIdUgp/zffGqd1Ieom2LtaRSqnEW66C0o95LeXFL0pD0Pi//XFOLebFnlHrMIeRftLsJfH4+BfHQnuq3FD6cjet8yphHVB/COf1gA/axo9lvXKYZD4BlZdPhEYNUmqaawwOUS3YicPXmyw+cColaN8/uA1g1JdnfXfuN/Q4Wl37TrXXPZ5dtjrXmRLwLjVARhppqBwM7Hjmha0Z8uD88GCU/fevUnD29CdCy2i9gDbO8lL0phEgmQg8YP88qNHGaCuLjlEOYJ1SConI9YqdlhLhpm9xbKM/2it/i1zI3mVg== Received: from BN9PR03CA0492.namprd03.prod.outlook.com (2603:10b6:408:130::17) by BL1PR12MB5995.namprd12.prod.outlook.com (2603:10b6:208:39b::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9542.9; Wed, 21 Jan 2026 15:31:00 +0000 Received: from BN2PEPF000044A0.namprd02.prod.outlook.com (2603:10b6:408:130:cafe::5f) by BN9PR03CA0492.outlook.office365.com (2603:10b6:408:130::17) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9542.9 via Frontend Transport; Wed, 21 Jan 2026 15:30:58 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by BN2PEPF000044A0.mail.protection.outlook.com (10.167.243.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9542.4 via Frontend Transport; Wed, 21 Jan 2026 15:30:59 +0000 Received: from rnnvmail203.nvidia.com (10.129.68.9) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 21 Jan 2026 07:30:30 -0800 Received: from rnnvmail203.nvidia.com (10.129.68.9) by rnnvmail203.nvidia.com (10.129.68.9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 21 Jan 2026 07:30:29 -0800 Received: from kkartik-desktop.nvidia.com (10.127.8.13) by mail.nvidia.com (10.129.68.9) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 21 Jan 2026 07:30:26 -0800 From: Kartik Rajput To: , , , , , , , , , CC: Kartik Rajput Subject: [PATCH v9 3/4] i2c: tegra: Add logic to support different register offsets Date: Wed, 21 Jan 2026 21:00:10 +0530 Message-ID: <20260121153012.92243-4-kkartik@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260121153012.92243-1-kkartik@nvidia.com> References: <20260121153012.92243-1-kkartik@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN2PEPF000044A0:EE_|BL1PR12MB5995:EE_ X-MS-Office365-Filtering-Correlation-Id: ea7ba011-f9bc-4f34-bf15-08de5902147a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|376014|1800799024|36860700013|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?X9nNVsx1jK7ObJT9r/RUuFsROKbRVDGQ15Gk95lRGOO8DZvOcq4eiH9fjC0u?= =?us-ascii?Q?PtYenIFMiF7/kWhCZo3xWW2CAw42fPJntoK9fuVhMtSieNIhIo03E4Y7Cbeu?= =?us-ascii?Q?d86IJxHq+GLBIMBSsha+USQUQDgM8iBQ1vXIvV4O6CZfDbnOQx0shnA314Vw?= =?us-ascii?Q?vpo8w0rrLPc/9L1+CnPVOFaMbRCGl+yvW3lCl7miYzuuhi05WLvb31o3FP0L?= =?us-ascii?Q?M14Knf3q8egb+XVzt/+qSLHuZdPA0/7Rhc25xnDbn9uTHTl3dnvEKxEf5UPK?= =?us-ascii?Q?f3AVl87vFJeLZUs7/u/n5/6IIvcReD+wZRVzfwkcc25XAnvAzNhDGAzZ+KnJ?= =?us-ascii?Q?NY3mfQqtqibBR0JA7NoDXrcFlW2diXMUYaQjy2HhQqF0/D6SIO+zfQU1vrzE?= =?us-ascii?Q?HHAu623eCeDNGNpMv7AOA9RfhSs/vRCy/S9CMT1EOjmFp69H0mszgKyR59Bc?= =?us-ascii?Q?FD03Wau2KsnK26ZpA8iDsfSTN4wBzFUecSHWHgLyA/gl+ldg8RoQb3B0yncH?= =?us-ascii?Q?TZOJ+M2juloHzFTQk1623uf4OJO3BGJ43WgMOMEgm0bhY2YBmn1riD6k49Cx?= =?us-ascii?Q?cPNoQsRkY8VSSpn26Gjq0mTJ8h8p0gMtVLq1JFaJa3tMGwVsPk+iIp4s1I/7?= =?us-ascii?Q?7ILhZCORsyQpx+CI2uB/fEppCQ1I04DxiDmD+qNsgV4pKOiDsvkAlhqvMsjQ?= =?us-ascii?Q?ecdLGpuPzM6S62tVwg/CdH2VObTI37ilHXmyuthtp58FhUqjzoG+7mUsNLzZ?= =?us-ascii?Q?sb/mU0MgRLdBuo/b8fZnbkRN/wduoJd7rJ/PNosjZoawmxabqMCZ/7+D5kbm?= =?us-ascii?Q?9qaO96WvYekPX3zkkP8iYNqEDAYnVu8+MBeYS4PPOrnQ0g6XviUDGf7XMev/?= =?us-ascii?Q?mGl5MUhXktG4Q/deMqjRtQlfazy1NON8HCLm2p59DwowmDEkZVycf4gPTBLJ?= =?us-ascii?Q?MvwgA3AFvr+rJugJxVOEO4oUUSWLeld/M/zzxYY9MakzdOwdCzZwQXcYrxjy?= =?us-ascii?Q?4vFRrUY6dr9jc6XYnMrOD1HBLQxfg2Sk/Ow6wpeoQ0iaRQ7/7IdXp1p0NFem?= =?us-ascii?Q?EBKdrnw5rpSgDV+VpYXml8eKR55xY/JDGFIQiw2WtFFyQNJ9g7en1xORsM1F?= =?us-ascii?Q?ft/Dom41xM2/BcoBWgW8ZbVsH79U8XVNX03sxF38aJa/RYD+wLFmDRkL52PQ?= =?us-ascii?Q?ZOgf4tfCGMR/6COdo0K0/Qx0R8DtmYCg2xQYJepnX1kyJEIstfCvC5g2w7Nn?= =?us-ascii?Q?lEXGxNlJdptU20aVPFZT0mob46u8A/qN23E192/9Dxy0Q1L1WPrajXTfy9Bk?= =?us-ascii?Q?FWzKviWviRt7bDqUmaeqlfoFk8InN4h4XS6Kp6WuBzgMAl9dg31Bah4UauMk?= =?us-ascii?Q?T9LR1ZoHhy6vmGU3ssGtuvyRk5E5ubYtXfsLGDt18PEcNETci4NMOrrEuP/f?= =?us-ascii?Q?kdFtfU2wh8LkFC0wKF8I9+rZzky2x1GEmThVRs0Gli9b+oG1uXUZhJuWyuk9?= =?us-ascii?Q?1EFVtUOJjc6g4M+R8A3YaqWC2onWdjofus6BU0tH1Fz2E0vfManecKXwqGz2?= =?us-ascii?Q?ORILWrAReT+jdvsVeIln+5c9rRmDH0KwTioXAQqhzOujb9I4vqs7mGSB0Dmp?= =?us-ascii?Q?EUWjyRh72xNfHTlb3Etr43/b/5AeQ2dGh1+YdVPalRm8qX6B5zpM0P56TnWm?= =?us-ascii?Q?sqndjDvpzmJlAK4/llbOspTEN+U=3D?= X-Forefront-Antispam-Report: CIP:216.228.117.160;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge1.nvidia.com;CAT:NONE;SFS:(13230040)(82310400026)(376014)(1800799024)(36860700013)(921020);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Jan 2026 15:30:59.9722 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: ea7ba011-f9bc-4f34-bf15-08de5902147a X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.160];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN2PEPF000044A0.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL1PR12MB5995 Content-Type: text/plain; charset="utf-8" Tegra410 use different offsets for existing I2C registers, update the logic to use appropriate offsets per SoC. As the register offsets are now defined in the SoC-specific tegra_i2c_regs structures, the tegra_i2c_reg_addr() function is no longer needed to translate register offsets and has been removed. Signed-off-by: Kartik Rajput Reviewed-by: Jon Hunter --- Changes in v9: * Do not remove dvc_writel() and dvc_readl() calls. Changes in v8: * Replace usage of dvc_writel() with writel_relaxed(). * Remove dvc_writel(). Changes in v7: * Fix Tegra256 reg offsets, change it to tegra264_i2c_regs as it supports SW mutex. Changes in v6: * Do not remove dvc_writel(). * Keep DVC registers defined as a macro. * Correct Tegra20 DVC register offsets. * Remove sl_cnfg, sl_addr1 and sl_addr2 registers for DVC and VI as they are not used. Changes in v2: * Replace individual is_dvc and is_vi flags with an I2C variant. * Add tegra20_dvc_i2c_hw and tegra210_vi_i2c_hw in a separate patch. * Use calculated offsets for tegra20_dvc_i2c_regs and tegra210_vi_i2c_regs. * Initialize registers only if they are used on the given SoC. --- drivers/i2c/busses/i2c-tegra.c | 359 ++++++++++++++++++++++----------- 1 file changed, 237 insertions(+), 122 deletions(-) diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index 2ef5fba66b0f..d845b8782f4f 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c @@ -30,38 +30,29 @@ =20 #define BYTES_PER_FIFO_WORD 4 =20 -#define I2C_CNFG 0x000 #define I2C_CNFG_DEBOUNCE_CNT GENMASK(14, 12) #define I2C_CNFG_PACKET_MODE_EN BIT(10) #define I2C_CNFG_NEW_MASTER_FSM BIT(11) #define I2C_CNFG_MULTI_MASTER_MODE BIT(17) -#define I2C_STATUS 0x01c -#define I2C_SL_CNFG 0x020 + #define I2C_SL_CNFG_NACK BIT(1) #define I2C_SL_CNFG_NEWSL BIT(2) -#define I2C_SL_ADDR1 0x02c -#define I2C_SL_ADDR2 0x030 -#define I2C_TLOW_SEXT 0x034 -#define I2C_TX_FIFO 0x050 -#define I2C_RX_FIFO 0x054 -#define I2C_PACKET_TRANSFER_STATUS 0x058 -#define I2C_FIFO_CONTROL 0x05c + #define I2C_FIFO_CONTROL_TX_FLUSH BIT(1) #define I2C_FIFO_CONTROL_RX_FLUSH BIT(0) #define I2C_FIFO_CONTROL_TX_TRIG(x) (((x) - 1) << 5) #define I2C_FIFO_CONTROL_RX_TRIG(x) (((x) - 1) << 2) -#define I2C_FIFO_STATUS 0x060 + #define I2C_FIFO_STATUS_TX GENMASK(7, 4) #define I2C_FIFO_STATUS_RX GENMASK(3, 0) -#define I2C_INT_MASK 0x064 -#define I2C_INT_STATUS 0x068 + #define I2C_INT_BUS_CLR_DONE BIT(11) #define I2C_INT_PACKET_XFER_COMPLETE BIT(7) #define I2C_INT_NO_ACK BIT(3) #define I2C_INT_ARBITRATION_LOST BIT(2) #define I2C_INT_TX_FIFO_DATA_REQ BIT(1) #define I2C_INT_RX_FIFO_DATA_REQ BIT(0) -#define I2C_CLK_DIVISOR 0x06c + #define I2C_CLK_DIVISOR_STD_FAST_MODE GENMASK(31, 16) #define I2C_CLK_DIVISOR_HSMODE GENMASK(15, 0) =20 @@ -94,50 +85,38 @@ #define I2C_HEADER_CONTINUE_XFER BIT(15) #define I2C_HEADER_SLAVE_ADDR_SHIFT 1 =20 -#define I2C_BUS_CLEAR_CNFG 0x084 #define I2C_BC_SCLK_THRESHOLD GENMASK(23, 16) #define I2C_BC_STOP_COND BIT(2) #define I2C_BC_TERMINATE BIT(1) #define I2C_BC_ENABLE BIT(0) -#define I2C_BUS_CLEAR_STATUS 0x088 + #define I2C_BC_STATUS BIT(0) =20 -#define I2C_CONFIG_LOAD 0x08c #define I2C_MSTR_CONFIG_LOAD BIT(0) =20 -#define I2C_CLKEN_OVERRIDE 0x090 #define I2C_MST_CORE_CLKEN_OVR BIT(0) =20 -#define I2C_INTERFACE_TIMING_0 0x094 -#define I2C_INTERFACE_TIMING_THIGH GENMASK(13, 8) -#define I2C_INTERFACE_TIMING_TLOW GENMASK(5, 0) -#define I2C_INTERFACE_TIMING_1 0x098 -#define I2C_INTERFACE_TIMING_TBUF GENMASK(29, 24) -#define I2C_INTERFACE_TIMING_TSU_STO GENMASK(21, 16) -#define I2C_INTERFACE_TIMING_THD_STA GENMASK(13, 8) -#define I2C_INTERFACE_TIMING_TSU_STA GENMASK(5, 0) - -#define I2C_HS_INTERFACE_TIMING_0 0x09c -#define I2C_HS_INTERFACE_TIMING_THIGH GENMASK(13, 8) -#define I2C_HS_INTERFACE_TIMING_TLOW GENMASK(5, 0) -#define I2C_HS_INTERFACE_TIMING_1 0x0a0 -#define I2C_HS_INTERFACE_TIMING_TSU_STO GENMASK(21, 16) -#define I2C_HS_INTERFACE_TIMING_THD_STA GENMASK(13, 8) -#define I2C_HS_INTERFACE_TIMING_TSU_STA GENMASK(5, 0) - -#define I2C_MST_FIFO_CONTROL 0x0b4 +#define I2C_INTERFACE_TIMING_THIGH GENMASK(13, 8) +#define I2C_INTERFACE_TIMING_TLOW GENMASK(5, 0) +#define I2C_INTERFACE_TIMING_TBUF GENMASK(29, 24) +#define I2C_INTERFACE_TIMING_TSU_STO GENMASK(21, 16) +#define I2C_INTERFACE_TIMING_THD_STA GENMASK(13, 8) +#define I2C_INTERFACE_TIMING_TSU_STA GENMASK(5, 0) + +#define I2C_HS_INTERFACE_TIMING_THIGH GENMASK(13, 8) +#define I2C_HS_INTERFACE_TIMING_TLOW GENMASK(5, 0) +#define I2C_HS_INTERFACE_TIMING_TSU_STO GENMASK(21, 16) +#define I2C_HS_INTERFACE_TIMING_THD_STA GENMASK(13, 8) +#define I2C_HS_INTERFACE_TIMING_TSU_STA GENMASK(5, 0) + #define I2C_MST_FIFO_CONTROL_RX_FLUSH BIT(0) #define I2C_MST_FIFO_CONTROL_TX_FLUSH BIT(1) #define I2C_MST_FIFO_CONTROL_RX_TRIG(x) (((x) - 1) << 4) #define I2C_MST_FIFO_CONTROL_TX_TRIG(x) (((x) - 1) << 16) =20 -#define I2C_MST_FIFO_STATUS 0x0b8 #define I2C_MST_FIFO_STATUS_TX GENMASK(23, 16) #define I2C_MST_FIFO_STATUS_RX GENMASK(7, 0) =20 -#define I2C_MASTER_RESET_CNTRL 0x0a8 - -#define I2C_SW_MUTEX 0x0ec #define I2C_SW_MUTEX_REQUEST GENMASK(3, 0) #define I2C_SW_MUTEX_GRANT GENMASK(7, 4) #define I2C_SW_MUTEX_ID_CCPLEX 9 @@ -159,6 +138,143 @@ */ #define I2C_PIO_MODE_PREFERRED_LEN 32 =20 +struct tegra_i2c_regs { + unsigned int cnfg; + unsigned int status; + unsigned int sl_cnfg; + unsigned int sl_addr1; + unsigned int sl_addr2; + unsigned int tlow_sext; + unsigned int tx_fifo; + unsigned int rx_fifo; + unsigned int packet_transfer_status; + unsigned int fifo_control; + unsigned int fifo_status; + unsigned int int_mask; + unsigned int int_status; + unsigned int clk_divisor; + unsigned int bus_clear_cnfg; + unsigned int bus_clear_status; + unsigned int config_load; + unsigned int clken_override; + unsigned int interface_timing_0; + unsigned int interface_timing_1; + unsigned int hs_interface_timing_0; + unsigned int hs_interface_timing_1; + unsigned int master_reset_cntrl; + unsigned int mst_fifo_control; + unsigned int mst_fifo_status; + unsigned int sw_mutex; +}; + +static const struct tegra_i2c_regs tegra20_i2c_regs =3D { + .cnfg =3D 0x000, + .status =3D 0x01c, + .sl_cnfg =3D 0x020, + .sl_addr1 =3D 0x02c, + .sl_addr2 =3D 0x030, + .tx_fifo =3D 0x050, + .rx_fifo =3D 0x054, + .packet_transfer_status =3D 0x058, + .fifo_control =3D 0x05c, + .fifo_status =3D 0x060, + .int_mask =3D 0x064, + .int_status =3D 0x068, + .clk_divisor =3D 0x06c, + .bus_clear_cnfg =3D 0x084, + .bus_clear_status =3D 0x088, + .config_load =3D 0x08c, + .clken_override =3D 0x090, + .interface_timing_0 =3D 0x094, + .interface_timing_1 =3D 0x098, + .hs_interface_timing_0 =3D 0x09c, + .hs_interface_timing_1 =3D 0x0a0, + .master_reset_cntrl =3D 0x0a8, + .mst_fifo_control =3D 0x0b4, + .mst_fifo_status =3D 0x0b8, +}; + +#if IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC) +static const struct tegra_i2c_regs tegra20_dvc_i2c_regs =3D { + .cnfg =3D 0x040, + .status =3D 0x05c, + .tx_fifo =3D 0x060, + .rx_fifo =3D 0x064, + .packet_transfer_status =3D 0x068, + .fifo_control =3D 0x06c, + .fifo_status =3D 0x070, + .int_mask =3D 0x074, + .int_status =3D 0x078, + .clk_divisor =3D 0x07c, + .bus_clear_cnfg =3D 0x094, + .bus_clear_status =3D 0x098, + .config_load =3D 0x09c, + .clken_override =3D 0x0a0, + .interface_timing_0 =3D 0x0a4, + .interface_timing_1 =3D 0x0a8, + .hs_interface_timing_0 =3D 0x0ac, + .hs_interface_timing_1 =3D 0x0b0, + .master_reset_cntrl =3D 0x0b8, + .mst_fifo_control =3D 0x0c4, + .mst_fifo_status =3D 0x0c8, +}; +#endif + +#if IS_ENABLED(CONFIG_ARCH_TEGRA_210_SOC) +static const struct tegra_i2c_regs tegra210_vi_i2c_regs =3D { + .cnfg =3D 0x0c00, + .status =3D 0x0c70, + .tlow_sext =3D 0x0cd0, + .tx_fifo =3D 0x0d40, + .rx_fifo =3D 0x0d50, + .packet_transfer_status =3D 0x0d60, + .fifo_control =3D 0x0d70, + .fifo_status =3D 0x0d80, + .int_mask =3D 0x0d90, + .int_status =3D 0x0da0, + .clk_divisor =3D 0x0db0, + .bus_clear_cnfg =3D 0x0e10, + .bus_clear_status =3D 0x0e20, + .config_load =3D 0x0e30, + .clken_override =3D 0x0e40, + .interface_timing_0 =3D 0x0e50, + .interface_timing_1 =3D 0x0e60, + .hs_interface_timing_0 =3D 0x0e70, + .hs_interface_timing_1 =3D 0x0e80, + .master_reset_cntrl =3D 0x0ea0, + .mst_fifo_control =3D 0x0ed0, + .mst_fifo_status =3D 0x0ee0, +}; +#endif + +static const struct tegra_i2c_regs tegra264_i2c_regs =3D { + .cnfg =3D 0x000, + .status =3D 0x01c, + .sl_cnfg =3D 0x020, + .sl_addr1 =3D 0x02c, + .sl_addr2 =3D 0x030, + .tx_fifo =3D 0x050, + .rx_fifo =3D 0x054, + .packet_transfer_status =3D 0x058, + .fifo_control =3D 0x05c, + .fifo_status =3D 0x060, + .int_mask =3D 0x064, + .int_status =3D 0x068, + .clk_divisor =3D 0x06c, + .bus_clear_cnfg =3D 0x084, + .bus_clear_status =3D 0x088, + .config_load =3D 0x08c, + .clken_override =3D 0x090, + .interface_timing_0 =3D 0x094, + .interface_timing_1 =3D 0x098, + .hs_interface_timing_0 =3D 0x09c, + .hs_interface_timing_1 =3D 0x0a0, + .master_reset_cntrl =3D 0x0a8, + .mst_fifo_control =3D 0x0b4, + .mst_fifo_status =3D 0x0b8, + .sw_mutex =3D 0x0ec, +}; + /* * msg_end_type: The bus control which needs to be sent at end of transfer. * @MSG_END_STOP: Send stop pulse. @@ -236,6 +352,7 @@ enum tegra_i2c_variant { * @enable_hs_mode_support: Enable support for high speed (HS) mode transf= ers. * @has_mutex: Has mutex register for mutual exclusion with other firmware= s or VMs. * @variant: This represents the I2C controller variant. + * @regs: Register offsets for the specific SoC variant. */ struct tegra_i2c_hw_feature { bool has_continue_xfer_support; @@ -268,6 +385,7 @@ struct tegra_i2c_hw_feature { bool enable_hs_mode_support; bool has_mutex; enum tegra_i2c_variant variant; + const struct tegra_i2c_regs *regs; }; =20 /** @@ -351,40 +469,26 @@ static u32 dvc_readl(struct tegra_i2c_dev *i2c_dev, u= nsigned int reg) return readl_relaxed(i2c_dev->base + reg); } =20 -/* - * If necessary, i2c_writel() and i2c_readl() will offset the register - * in order to talk to the I2C block inside the DVC block. - */ -static u32 tegra_i2c_reg_addr(struct tegra_i2c_dev *i2c_dev, unsigned int = reg) -{ - if (IS_DVC(i2c_dev)) - reg +=3D (reg >=3D I2C_TX_FIFO) ? 0x10 : 0x40; - else if (IS_VI(i2c_dev)) - reg =3D 0xc00 + (reg << 2); - - return reg; -} - static void i2c_writel(struct tegra_i2c_dev *i2c_dev, u32 val, unsigned in= t reg) { - writel_relaxed(val, i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg)); + writel_relaxed(val, i2c_dev->base + reg); =20 /* read back register to make sure that register writes completed */ - if (reg !=3D I2C_TX_FIFO) - readl_relaxed(i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg)); + if (reg !=3D i2c_dev->hw->regs->tx_fifo) + readl_relaxed(i2c_dev->base + reg); else if (IS_VI(i2c_dev)) - readl_relaxed(i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, I2C_INT_STATUS= )); + readl_relaxed(i2c_dev->base + i2c_dev->hw->regs->int_status); } =20 static u32 i2c_readl(struct tegra_i2c_dev *i2c_dev, unsigned int reg) { - return readl_relaxed(i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg)); + return readl_relaxed(i2c_dev->base + reg); } =20 static void i2c_writesl(struct tegra_i2c_dev *i2c_dev, void *data, unsigned int reg, unsigned int len) { - writesl(i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg), data, len); + writesl(i2c_dev->base + reg, data, len); } =20 static void i2c_writesl_vi(struct tegra_i2c_dev *i2c_dev, void *data, @@ -405,12 +509,12 @@ static void i2c_writesl_vi(struct tegra_i2c_dev *i2c_= dev, void *data, static void i2c_readsl(struct tegra_i2c_dev *i2c_dev, void *data, unsigned int reg, unsigned int len) { - readsl(i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg), data, len); + readsl(i2c_dev->base + reg, data, len); } =20 static bool tegra_i2c_mutex_acquired(struct tegra_i2c_dev *i2c_dev) { - unsigned int reg =3D tegra_i2c_reg_addr(i2c_dev, I2C_SW_MUTEX); + unsigned int reg =3D i2c_dev->hw->regs->sw_mutex; u32 val, id; =20 val =3D readl(i2c_dev->base + reg); @@ -421,7 +525,7 @@ static bool tegra_i2c_mutex_acquired(struct tegra_i2c_d= ev *i2c_dev) =20 static bool tegra_i2c_mutex_trylock(struct tegra_i2c_dev *i2c_dev) { - unsigned int reg =3D tegra_i2c_reg_addr(i2c_dev, I2C_SW_MUTEX); + unsigned int reg =3D i2c_dev->hw->regs->sw_mutex; u32 val, id; =20 val =3D readl(i2c_dev->base + reg); @@ -459,7 +563,7 @@ static int tegra_i2c_mutex_lock(struct tegra_i2c_dev *i= 2c_dev) =20 static int tegra_i2c_mutex_unlock(struct tegra_i2c_dev *i2c_dev) { - unsigned int reg =3D tegra_i2c_reg_addr(i2c_dev, I2C_SW_MUTEX); + unsigned int reg =3D i2c_dev->hw->regs->sw_mutex; u32 val, id; =20 if (!i2c_dev->hw->has_mutex) @@ -482,16 +586,16 @@ static void tegra_i2c_mask_irq(struct tegra_i2c_dev *= i2c_dev, u32 mask) { u32 int_mask; =20 - int_mask =3D i2c_readl(i2c_dev, I2C_INT_MASK) & ~mask; - i2c_writel(i2c_dev, int_mask, I2C_INT_MASK); + int_mask =3D i2c_readl(i2c_dev, i2c_dev->hw->regs->int_mask) & ~mask; + i2c_writel(i2c_dev, int_mask, i2c_dev->hw->regs->int_mask); } =20 static void tegra_i2c_unmask_irq(struct tegra_i2c_dev *i2c_dev, u32 mask) { u32 int_mask; =20 - int_mask =3D i2c_readl(i2c_dev, I2C_INT_MASK) | mask; - i2c_writel(i2c_dev, int_mask, I2C_INT_MASK); + int_mask =3D i2c_readl(i2c_dev, i2c_dev->hw->regs->int_mask) | mask; + i2c_writel(i2c_dev, int_mask, i2c_dev->hw->regs->int_mask); } =20 static void tegra_i2c_dma_complete(void *args) @@ -635,34 +739,34 @@ static void tegra_i2c_vi_init(struct tegra_i2c_dev *i= 2c_dev) =20 value =3D FIELD_PREP(I2C_INTERFACE_TIMING_THIGH, 2) | FIELD_PREP(I2C_INTERFACE_TIMING_TLOW, 4); - i2c_writel(i2c_dev, value, I2C_INTERFACE_TIMING_0); + i2c_writel(i2c_dev, value, i2c_dev->hw->regs->interface_timing_0); =20 value =3D FIELD_PREP(I2C_INTERFACE_TIMING_TBUF, 4) | FIELD_PREP(I2C_INTERFACE_TIMING_TSU_STO, 7) | FIELD_PREP(I2C_INTERFACE_TIMING_THD_STA, 4) | FIELD_PREP(I2C_INTERFACE_TIMING_TSU_STA, 4); - i2c_writel(i2c_dev, value, I2C_INTERFACE_TIMING_1); + i2c_writel(i2c_dev, value, i2c_dev->hw->regs->interface_timing_1); =20 value =3D FIELD_PREP(I2C_HS_INTERFACE_TIMING_THIGH, 3) | FIELD_PREP(I2C_HS_INTERFACE_TIMING_TLOW, 8); - i2c_writel(i2c_dev, value, I2C_HS_INTERFACE_TIMING_0); + i2c_writel(i2c_dev, value, i2c_dev->hw->regs->hs_interface_timing_0); =20 value =3D FIELD_PREP(I2C_HS_INTERFACE_TIMING_TSU_STO, 11) | FIELD_PREP(I2C_HS_INTERFACE_TIMING_THD_STA, 11) | FIELD_PREP(I2C_HS_INTERFACE_TIMING_TSU_STA, 11); - i2c_writel(i2c_dev, value, I2C_HS_INTERFACE_TIMING_1); + i2c_writel(i2c_dev, value, i2c_dev->hw->regs->hs_interface_timing_1); =20 value =3D FIELD_PREP(I2C_BC_SCLK_THRESHOLD, 9) | I2C_BC_STOP_COND; - i2c_writel(i2c_dev, value, I2C_BUS_CLEAR_CNFG); + i2c_writel(i2c_dev, value, i2c_dev->hw->regs->bus_clear_cnfg); =20 - i2c_writel(i2c_dev, 0x0, I2C_TLOW_SEXT); + i2c_writel(i2c_dev, 0x0, i2c_dev->hw->regs->tlow_sext); } =20 static int tegra_i2c_poll_register(struct tegra_i2c_dev *i2c_dev, u32 reg, u32 mask, u32 delay_us, u32 timeout_us) { - void __iomem *addr =3D i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg); + void __iomem *addr =3D i2c_dev->base + reg; u32 val; =20 if (!i2c_dev->atomic_mode) @@ -681,11 +785,11 @@ static int tegra_i2c_flush_fifos(struct tegra_i2c_dev= *i2c_dev) if (i2c_dev->hw->has_mst_fifo) { mask =3D I2C_MST_FIFO_CONTROL_TX_FLUSH | I2C_MST_FIFO_CONTROL_RX_FLUSH; - offset =3D I2C_MST_FIFO_CONTROL; + offset =3D i2c_dev->hw->regs->mst_fifo_control; } else { mask =3D I2C_FIFO_CONTROL_TX_FLUSH | I2C_FIFO_CONTROL_RX_FLUSH; - offset =3D I2C_FIFO_CONTROL; + offset =3D i2c_dev->hw->regs->fifo_control; } =20 val =3D i2c_readl(i2c_dev, offset); @@ -708,9 +812,9 @@ static int tegra_i2c_wait_for_config_load(struct tegra_= i2c_dev *i2c_dev) if (!i2c_dev->hw->has_config_load_reg) return 0; =20 - i2c_writel(i2c_dev, I2C_MSTR_CONFIG_LOAD, I2C_CONFIG_LOAD); + i2c_writel(i2c_dev, I2C_MSTR_CONFIG_LOAD, i2c_dev->hw->regs->config_load); =20 - err =3D tegra_i2c_poll_register(i2c_dev, I2C_CONFIG_LOAD, 0xffffffff, + err =3D tegra_i2c_poll_register(i2c_dev, i2c_dev->hw->regs->config_load, = 0xffffffff, 1000, I2C_CONFIG_LOAD_TIMEOUT); if (err) { dev_err(i2c_dev->dev, "failed to load config\n"); @@ -731,10 +835,10 @@ static int tegra_i2c_master_reset(struct tegra_i2c_de= v *i2c_dev) * SW needs to wait for 2us after assertion and de-assertion of this soft * reset. */ - i2c_writel(i2c_dev, 0x1, I2C_MASTER_RESET_CNTRL); + i2c_writel(i2c_dev, 0x1, i2c_dev->hw->regs->master_reset_cntrl); fsleep(2); =20 - i2c_writel(i2c_dev, 0x0, I2C_MASTER_RESET_CNTRL); + i2c_writel(i2c_dev, 0x0, i2c_dev->hw->regs->master_reset_cntrl); fsleep(2); =20 return 0; @@ -776,8 +880,8 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev) if (i2c_dev->hw->has_multi_master_mode) val |=3D I2C_CNFG_MULTI_MASTER_MODE; =20 - i2c_writel(i2c_dev, val, I2C_CNFG); - i2c_writel(i2c_dev, 0, I2C_INT_MASK); + i2c_writel(i2c_dev, val, i2c_dev->hw->regs->cnfg); + i2c_writel(i2c_dev, 0, i2c_dev->hw->regs->int_mask); =20 if (IS_VI(i2c_dev)) tegra_i2c_vi_init(i2c_dev); @@ -822,12 +926,12 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_d= ev) clk_divisor =3D FIELD_PREP(I2C_CLK_DIVISOR_HSMODE, i2c_dev->hw->clk_divisor_hs_mode) | FIELD_PREP(I2C_CLK_DIVISOR_STD_FAST_MODE, non_hs_mode); - i2c_writel(i2c_dev, clk_divisor, I2C_CLK_DIVISOR); + i2c_writel(i2c_dev, clk_divisor, i2c_dev->hw->regs->clk_divisor); =20 if (i2c_dev->hw->has_interface_timing_reg) { val =3D FIELD_PREP(I2C_INTERFACE_TIMING_THIGH, thigh) | FIELD_PREP(I2C_INTERFACE_TIMING_TLOW, tlow); - i2c_writel(i2c_dev, val, I2C_INTERFACE_TIMING_0); + i2c_writel(i2c_dev, val, i2c_dev->hw->regs->interface_timing_0); } =20 /* @@ -835,7 +939,7 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev) * Otherwise, preserve the chip default values. */ if (i2c_dev->hw->has_interface_timing_reg && tsu_thd) - i2c_writel(i2c_dev, tsu_thd, I2C_INTERFACE_TIMING_1); + i2c_writel(i2c_dev, tsu_thd, i2c_dev->hw->regs->interface_timing_1); =20 /* Write HS mode registers. These will get used only for HS mode*/ if (i2c_dev->hw->enable_hs_mode_support) { @@ -845,8 +949,8 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev) =20 val =3D FIELD_PREP(I2C_HS_INTERFACE_TIMING_THIGH, thigh) | FIELD_PREP(I2C_HS_INTERFACE_TIMING_TLOW, tlow); - i2c_writel(i2c_dev, val, I2C_HS_INTERFACE_TIMING_0); - i2c_writel(i2c_dev, tsu_thd, I2C_HS_INTERFACE_TIMING_1); + i2c_writel(i2c_dev, val, i2c_dev->hw->regs->hs_interface_timing_0); + i2c_writel(i2c_dev, tsu_thd, i2c_dev->hw->regs->hs_interface_timing_1); } =20 clk_multiplier =3D (tlow + thigh + 2) * (non_hs_mode + 1); @@ -859,12 +963,12 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_d= ev) } =20 if (!IS_DVC(i2c_dev) && !IS_VI(i2c_dev)) { - u32 sl_cfg =3D i2c_readl(i2c_dev, I2C_SL_CNFG); + u32 sl_cfg =3D i2c_readl(i2c_dev, i2c_dev->hw->regs->sl_cnfg); =20 sl_cfg |=3D I2C_SL_CNFG_NACK | I2C_SL_CNFG_NEWSL; - i2c_writel(i2c_dev, sl_cfg, I2C_SL_CNFG); - i2c_writel(i2c_dev, 0xfc, I2C_SL_ADDR1); - i2c_writel(i2c_dev, 0x00, I2C_SL_ADDR2); + i2c_writel(i2c_dev, sl_cfg, i2c_dev->hw->regs->sl_cnfg); + i2c_writel(i2c_dev, 0xfc, i2c_dev->hw->regs->sl_addr1); + i2c_writel(i2c_dev, 0x00, i2c_dev->hw->regs->sl_addr2); } =20 err =3D tegra_i2c_flush_fifos(i2c_dev); @@ -872,7 +976,7 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev) return err; =20 if (i2c_dev->multimaster_mode && i2c_dev->hw->has_slcg_override_reg) - i2c_writel(i2c_dev, I2C_MST_CORE_CLKEN_OVR, I2C_CLKEN_OVERRIDE); + i2c_writel(i2c_dev, I2C_MST_CORE_CLKEN_OVR, i2c_dev->hw->regs->clken_ove= rride); =20 err =3D tegra_i2c_wait_for_config_load(i2c_dev); if (err) @@ -893,9 +997,9 @@ static int tegra_i2c_disable_packet_mode(struct tegra_i= 2c_dev *i2c_dev) */ udelay(DIV_ROUND_UP(2 * 1000000, i2c_dev->timings.bus_freq_hz)); =20 - cnfg =3D i2c_readl(i2c_dev, I2C_CNFG); + cnfg =3D i2c_readl(i2c_dev, i2c_dev->hw->regs->cnfg); if (cnfg & I2C_CNFG_PACKET_MODE_EN) - i2c_writel(i2c_dev, cnfg & ~I2C_CNFG_PACKET_MODE_EN, I2C_CNFG); + i2c_writel(i2c_dev, cnfg & ~I2C_CNFG_PACKET_MODE_EN, i2c_dev->hw->regs->= cnfg); =20 return tegra_i2c_wait_for_config_load(i2c_dev); } @@ -915,10 +1019,10 @@ static int tegra_i2c_empty_rx_fifo(struct tegra_i2c_= dev *i2c_dev) return -EINVAL; =20 if (i2c_dev->hw->has_mst_fifo) { - val =3D i2c_readl(i2c_dev, I2C_MST_FIFO_STATUS); + val =3D i2c_readl(i2c_dev, i2c_dev->hw->regs->mst_fifo_status); rx_fifo_avail =3D FIELD_GET(I2C_MST_FIFO_STATUS_RX, val); } else { - val =3D i2c_readl(i2c_dev, I2C_FIFO_STATUS); + val =3D i2c_readl(i2c_dev, i2c_dev->hw->regs->fifo_status); rx_fifo_avail =3D FIELD_GET(I2C_FIFO_STATUS_RX, val); } =20 @@ -927,7 +1031,7 @@ static int tegra_i2c_empty_rx_fifo(struct tegra_i2c_de= v *i2c_dev) if (words_to_transfer > rx_fifo_avail) words_to_transfer =3D rx_fifo_avail; =20 - i2c_readsl(i2c_dev, buf, I2C_RX_FIFO, words_to_transfer); + i2c_readsl(i2c_dev, buf, i2c_dev->hw->regs->rx_fifo, words_to_transfer); =20 buf +=3D words_to_transfer * BYTES_PER_FIFO_WORD; buf_remaining -=3D words_to_transfer * BYTES_PER_FIFO_WORD; @@ -943,7 +1047,7 @@ static int tegra_i2c_empty_rx_fifo(struct tegra_i2c_de= v *i2c_dev) * when (words_to_transfer was > rx_fifo_avail) earlier * in this function. */ - val =3D i2c_readl(i2c_dev, I2C_RX_FIFO); + val =3D i2c_readl(i2c_dev, i2c_dev->hw->regs->rx_fifo); val =3D cpu_to_le32(val); memcpy(buf, &val, buf_remaining); buf_remaining =3D 0; @@ -968,10 +1072,10 @@ static int tegra_i2c_fill_tx_fifo(struct tegra_i2c_d= ev *i2c_dev) u32 val; =20 if (i2c_dev->hw->has_mst_fifo) { - val =3D i2c_readl(i2c_dev, I2C_MST_FIFO_STATUS); + val =3D i2c_readl(i2c_dev, i2c_dev->hw->regs->mst_fifo_status); tx_fifo_avail =3D FIELD_GET(I2C_MST_FIFO_STATUS_TX, val); } else { - val =3D i2c_readl(i2c_dev, I2C_FIFO_STATUS); + val =3D i2c_readl(i2c_dev, i2c_dev->hw->regs->fifo_status); tx_fifo_avail =3D FIELD_GET(I2C_FIFO_STATUS_TX, val); } =20 @@ -1002,9 +1106,9 @@ static int tegra_i2c_fill_tx_fifo(struct tegra_i2c_de= v *i2c_dev) i2c_dev->msg_buf =3D buf + words_to_transfer * BYTES_PER_FIFO_WORD; =20 if (IS_VI(i2c_dev)) - i2c_writesl_vi(i2c_dev, buf, I2C_TX_FIFO, words_to_transfer); + i2c_writesl_vi(i2c_dev, buf, i2c_dev->hw->regs->tx_fifo, words_to_trans= fer); else - i2c_writesl(i2c_dev, buf, I2C_TX_FIFO, words_to_transfer); + i2c_writesl(i2c_dev, buf, i2c_dev->hw->regs->tx_fifo, words_to_transfer= ); =20 buf +=3D words_to_transfer * BYTES_PER_FIFO_WORD; } @@ -1026,7 +1130,7 @@ static int tegra_i2c_fill_tx_fifo(struct tegra_i2c_de= v *i2c_dev) i2c_dev->msg_buf_remaining =3D 0; i2c_dev->msg_buf =3D NULL; =20 - i2c_writel(i2c_dev, val, I2C_TX_FIFO); + i2c_writel(i2c_dev, val, i2c_dev->hw->regs->tx_fifo); } =20 return 0; @@ -1038,13 +1142,13 @@ static irqreturn_t tegra_i2c_isr(int irq, void *dev= _id) struct tegra_i2c_dev *i2c_dev =3D dev_id; u32 status; =20 - status =3D i2c_readl(i2c_dev, I2C_INT_STATUS); + status =3D i2c_readl(i2c_dev, i2c_dev->hw->regs->int_status); =20 if (status =3D=3D 0) { dev_warn(i2c_dev->dev, "IRQ status 0 %08x %08x %08x\n", - i2c_readl(i2c_dev, I2C_PACKET_TRANSFER_STATUS), - i2c_readl(i2c_dev, I2C_STATUS), - i2c_readl(i2c_dev, I2C_CNFG)); + i2c_readl(i2c_dev, i2c_dev->hw->regs->packet_transfer_status), + i2c_readl(i2c_dev, i2c_dev->hw->regs->status), + i2c_readl(i2c_dev, i2c_dev->hw->regs->cnfg)); i2c_dev->msg_err |=3D I2C_ERR_UNKNOWN_INTERRUPT; goto err; } @@ -1087,7 +1191,7 @@ static irqreturn_t tegra_i2c_isr(int irq, void *dev_i= d) } } =20 - i2c_writel(i2c_dev, status, I2C_INT_STATUS); + i2c_writel(i2c_dev, status, i2c_dev->hw->regs->int_status); if (IS_DVC(i2c_dev)) dvc_writel(i2c_dev, DVC_STATUS_I2C_DONE_INTR, DVC_STATUS); =20 @@ -1125,7 +1229,7 @@ static irqreturn_t tegra_i2c_isr(int irq, void *dev_i= d) if (i2c_dev->hw->supports_bus_clear) tegra_i2c_mask_irq(i2c_dev, I2C_INT_BUS_CLR_DONE); =20 - i2c_writel(i2c_dev, status, I2C_INT_STATUS); + i2c_writel(i2c_dev, status, i2c_dev->hw->regs->int_status); =20 if (IS_DVC(i2c_dev)) dvc_writel(i2c_dev, DVC_STATUS_I2C_DONE_INTR, DVC_STATUS); @@ -1148,9 +1252,9 @@ static void tegra_i2c_config_fifo_trig(struct tegra_i= 2c_dev *i2c_dev, int err; =20 if (i2c_dev->hw->has_mst_fifo) - reg =3D I2C_MST_FIFO_CONTROL; + reg =3D i2c_dev->hw->regs->mst_fifo_control; else - reg =3D I2C_FIFO_CONTROL; + reg =3D i2c_dev->hw->regs->fifo_control; =20 if (i2c_dev->dma_mode) { if (len & 0xF) @@ -1161,7 +1265,7 @@ static void tegra_i2c_config_fifo_trig(struct tegra_i= 2c_dev *i2c_dev, dma_burst =3D 8; =20 if (i2c_dev->msg_read) { - reg_offset =3D tegra_i2c_reg_addr(i2c_dev, I2C_RX_FIFO); + reg_offset =3D i2c_dev->hw->regs->rx_fifo; =20 slv_config.src_addr =3D i2c_dev->base_phys + reg_offset; slv_config.src_addr_width =3D DMA_SLAVE_BUSWIDTH_4_BYTES; @@ -1172,7 +1276,7 @@ static void tegra_i2c_config_fifo_trig(struct tegra_i= 2c_dev *i2c_dev, else val =3D I2C_FIFO_CONTROL_RX_TRIG(dma_burst); } else { - reg_offset =3D tegra_i2c_reg_addr(i2c_dev, I2C_TX_FIFO); + reg_offset =3D i2c_dev->hw->regs->tx_fifo; =20 slv_config.dst_addr =3D i2c_dev->base_phys + reg_offset; slv_config.dst_addr_width =3D DMA_SLAVE_BUSWIDTH_4_BYTES; @@ -1215,7 +1319,7 @@ static unsigned long tegra_i2c_poll_completion(struct= tegra_i2c_dev *i2c_dev, ktime_t ktimeout =3D ktime_add_ms(ktime, timeout_ms); =20 do { - u32 status =3D i2c_readl(i2c_dev, I2C_INT_STATUS); + u32 status =3D i2c_readl(i2c_dev, i2c_dev->hw->regs->int_status); =20 if (status) tegra_i2c_isr(i2c_dev->irq, i2c_dev); @@ -1274,14 +1378,14 @@ static int tegra_i2c_issue_bus_clear(struct i2c_ada= pter *adap) =20 val =3D FIELD_PREP(I2C_BC_SCLK_THRESHOLD, 9) | I2C_BC_STOP_COND | I2C_BC_TERMINATE; - i2c_writel(i2c_dev, val, I2C_BUS_CLEAR_CNFG); + i2c_writel(i2c_dev, val, i2c_dev->hw->regs->bus_clear_cnfg); =20 err =3D tegra_i2c_wait_for_config_load(i2c_dev); if (err) return err; =20 val |=3D I2C_BC_ENABLE; - i2c_writel(i2c_dev, val, I2C_BUS_CLEAR_CNFG); + i2c_writel(i2c_dev, val, i2c_dev->hw->regs->bus_clear_cnfg); tegra_i2c_unmask_irq(i2c_dev, I2C_INT_BUS_CLR_DONE); =20 time_left =3D tegra_i2c_wait_completion(i2c_dev, &i2c_dev->msg_complete, = 50); @@ -1292,7 +1396,7 @@ static int tegra_i2c_issue_bus_clear(struct i2c_adapt= er *adap) return -ETIMEDOUT; } =20 - val =3D i2c_readl(i2c_dev, I2C_BUS_CLEAR_STATUS); + val =3D i2c_readl(i2c_dev, i2c_dev->hw->regs->bus_clear_status); if (!(val & I2C_BC_STATUS)) { dev_err(i2c_dev->dev, "un-recovered arbitration lost\n"); return -EIO; @@ -1317,14 +1421,14 @@ static void tegra_i2c_push_packet_header(struct teg= ra_i2c_dev *i2c_dev, if (i2c_dev->dma_mode && !i2c_dev->msg_read) *dma_buf++ =3D packet_header; else - i2c_writel(i2c_dev, packet_header, I2C_TX_FIFO); + i2c_writel(i2c_dev, packet_header, i2c_dev->hw->regs->tx_fifo); =20 packet_header =3D i2c_dev->msg_len - 1; =20 if (i2c_dev->dma_mode && !i2c_dev->msg_read) *dma_buf++ =3D packet_header; else - i2c_writel(i2c_dev, packet_header, I2C_TX_FIFO); + i2c_writel(i2c_dev, packet_header, i2c_dev->hw->regs->tx_fifo); =20 packet_header =3D I2C_HEADER_IE_ENABLE; =20 @@ -1352,7 +1456,7 @@ static void tegra_i2c_push_packet_header(struct tegra= _i2c_dev *i2c_dev, if (i2c_dev->dma_mode && !i2c_dev->msg_read) *dma_buf++ =3D packet_header; else - i2c_writel(i2c_dev, packet_header, I2C_TX_FIFO); + i2c_writel(i2c_dev, packet_header, i2c_dev->hw->regs->tx_fifo); } =20 static int tegra_i2c_error_recover(struct tegra_i2c_dev *i2c_dev, @@ -1473,7 +1577,7 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i= 2c_dev, =20 tegra_i2c_unmask_irq(i2c_dev, int_mask); dev_dbg(i2c_dev->dev, "unmasked IRQ: %02x\n", - i2c_readl(i2c_dev, I2C_INT_MASK)); + i2c_readl(i2c_dev, i2c_dev->hw->regs->int_mask)); =20 if (i2c_dev->dma_mode) { time_left =3D tegra_i2c_wait_completion(i2c_dev, @@ -1648,6 +1752,7 @@ static const struct tegra_i2c_hw_feature tegra20_i2c_= hw =3D { .enable_hs_mode_support =3D false, .has_mutex =3D false, .variant =3D TEGRA_I2C_VARIANT_DEFAULT, + .regs =3D &tegra20_i2c_regs, }; =20 #if IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC) @@ -1680,6 +1785,7 @@ static const struct tegra_i2c_hw_feature tegra20_dvc_= i2c_hw =3D { .enable_hs_mode_support =3D false, .has_mutex =3D false, .variant =3D TEGRA_I2C_VARIANT_DVC, + .regs =3D &tegra20_dvc_i2c_regs, }; #endif =20 @@ -1712,6 +1818,7 @@ static const struct tegra_i2c_hw_feature tegra30_i2c_= hw =3D { .enable_hs_mode_support =3D false, .has_mutex =3D false, .variant =3D TEGRA_I2C_VARIANT_DEFAULT, + .regs =3D &tegra20_i2c_regs, }; =20 static const struct tegra_i2c_hw_feature tegra114_i2c_hw =3D { @@ -1743,6 +1850,7 @@ static const struct tegra_i2c_hw_feature tegra114_i2c= _hw =3D { .enable_hs_mode_support =3D false, .has_mutex =3D false, .variant =3D TEGRA_I2C_VARIANT_DEFAULT, + .regs =3D &tegra20_i2c_regs, }; =20 static const struct tegra_i2c_hw_feature tegra124_i2c_hw =3D { @@ -1774,6 +1882,7 @@ static const struct tegra_i2c_hw_feature tegra124_i2c= _hw =3D { .enable_hs_mode_support =3D false, .has_mutex =3D false, .variant =3D TEGRA_I2C_VARIANT_DEFAULT, + .regs =3D &tegra20_i2c_regs, }; =20 static const struct tegra_i2c_hw_feature tegra210_i2c_hw =3D { @@ -1805,6 +1914,7 @@ static const struct tegra_i2c_hw_feature tegra210_i2c= _hw =3D { .enable_hs_mode_support =3D false, .has_mutex =3D false, .variant =3D TEGRA_I2C_VARIANT_DEFAULT, + .regs =3D &tegra20_i2c_regs, }; =20 #if IS_ENABLED(CONFIG_ARCH_TEGRA_210_SOC) @@ -1837,6 +1947,7 @@ static const struct tegra_i2c_hw_feature tegra210_vi_= i2c_hw =3D { .enable_hs_mode_support =3D false, .has_mutex =3D false, .variant =3D TEGRA_I2C_VARIANT_VI, + .regs =3D &tegra210_vi_i2c_regs, }; #endif =20 @@ -1869,6 +1980,7 @@ static const struct tegra_i2c_hw_feature tegra186_i2c= _hw =3D { .enable_hs_mode_support =3D false, .has_mutex =3D false, .variant =3D TEGRA_I2C_VARIANT_DEFAULT, + .regs =3D &tegra20_i2c_regs, }; =20 static const struct tegra_i2c_hw_feature tegra194_i2c_hw =3D { @@ -1902,6 +2014,7 @@ static const struct tegra_i2c_hw_feature tegra194_i2c= _hw =3D { .enable_hs_mode_support =3D true, .has_mutex =3D false, .variant =3D TEGRA_I2C_VARIANT_DEFAULT, + .regs =3D &tegra20_i2c_regs, }; =20 static const struct tegra_i2c_hw_feature tegra256_i2c_hw =3D { @@ -1935,6 +2048,7 @@ static const struct tegra_i2c_hw_feature tegra256_i2c= _hw =3D { .enable_hs_mode_support =3D true, .has_mutex =3D true, .variant =3D TEGRA_I2C_VARIANT_DEFAULT, + .regs =3D &tegra264_i2c_regs, }; =20 static const struct tegra_i2c_hw_feature tegra264_i2c_hw =3D { @@ -1968,6 +2082,7 @@ static const struct tegra_i2c_hw_feature tegra264_i2c= _hw =3D { .enable_hs_mode_support =3D true, .has_mutex =3D true, .variant =3D TEGRA_I2C_VARIANT_DEFAULT, + .regs =3D &tegra264_i2c_regs, }; =20 static const struct of_device_id tegra_i2c_of_match[] =3D { --=20 2.43.0 From nobody Sat Feb 7 16:00:02 2026 Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazon11010047.outbound.protection.outlook.com [52.101.193.47]) (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 0D4004218AF; Wed, 21 Jan 2026 15:31:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.193.47 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769009480; cv=fail; b=L7cNY3p6Dpu8QuAuG2sm0I/dfaNmh/ERU/cYNmZ51vR1TLITwLS+WlVceo+FEd9Ri5iMnO9rGlIsoejM6p7LM/y/2BLJ/QQDHxs0UpG4wq0np9Bf2ODiihbhu26rcslRbl4UyCMq/HDQifD3YjCSffVOxweIGCBigd97EidXkWk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769009480; c=relaxed/simple; bh=55n+AfspH9ZpjwtPE47qkrGgxJRU8jG9SnH866MykQk=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ToEiQRy7tCkGlDTxH8CjuKK7A+xC9N5uw+Ffl43TtagtOvUTapeusq86YvfLkcDuxOKr+pTABmTibMGnY35rYopEYPbr4WasoJ/B1NxJTfm/7Xz7wvzviIGnedFG42lFiAnAPWHC/HU0MbnpcLO3c+sk6S1z+VexBR0GUZ2fKck= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=cyfozQ/r; arc=fail smtp.client-ip=52.101.193.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="cyfozQ/r" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=NqAkxvVBIZGhzpLGGaPMdQ36922XdJqdSNwgHYvOTz9tcjF6XJYKGIoeLbW+PvCmu5VsNZuOl6G9WJYeBWob+/fiqi5rLHLS2tD7PB4dZNsDa7I7xKANdPe3FlVLGO6Rtpxvmdd3x4Mkpya5HbaUTQa17SEcuXxzrqvDNoxPrmGsX3vnCJAwveV+BuOWkg0C22ZhrxWqpjqe+MWk3Oul1FuQ1TtmiTNC3sit4bxaVCvsMyW2KXCi+rxqJy+P8G1ggJwLYNo73uXlYnPJjkWe2SXK+UPwQQ+01HU3tURJHOS55Z0YNRZhr67F8NdD5ej7PqPRwQ4+JggFN+KK5hV9rA== 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=JeP8N+4U74LCL1IozxMk+ueXVHALF/l+BffP9S3FspE=; b=osLSW4Ii03sahQe2V0KDpYggmMP5evvkXv0rNVk/usRzhTX80IPekK398835gwu0ifCEsmbxszLQl/10WEtCwTId9pfdUsEkLTqFHMP9wDppSYl7nXTFAjwajpdu04TY8nHdEtS8oQWn+NdEoJ8pVxEBfd8Eu3WXIrTvFSEH5jnhD3W1vM0UHchoFLqTvetRMWa9zu3uXUTYYt8hK7lHYOrv7ICb2HRI2E+In8K2yc8xWx0DmmqtAjpzxZbtajGwMEn/UiV7+Sb2G2LCioWnOGKzkJ0Ec2bC4TutFHTUgfoD/88S8UHLvdKcR2/GSsPd7t14eiSL59tYGJCCz2ADIw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=gmail.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=JeP8N+4U74LCL1IozxMk+ueXVHALF/l+BffP9S3FspE=; b=cyfozQ/rpvidYQEBfkxthYVBfIqHBeHzd5pZp+9QWUc6JbFQE5pZhAuIipKjpn0MxuYnDVd9FnxuOUKqL25JrhzC5FJG+ewJWUJrAvAgjss2spkNprAyAfOmoM6hCCcTgIRXQhvlRpF4XtrSXWHoxVHbKbRpFt7ohBREoKCW1TFSy9Bplgjf/emwcd2BkPFbZ812MIDEy3kIw5gjqDpNFHvHquvpfFuXwp+zMvFQgxizyrK9cLK0ww03FHqYeXd3akGrOqXYqvUHRDtR/ZTUq9uXdgS4kRGwvkAYpqVIHx3i0a021+H4ScRiqxEz7FohgfOt9t9ZynlJaRudZu1bXA== Received: from SJ0PR03CA0194.namprd03.prod.outlook.com (2603:10b6:a03:2ef::19) by IA1PR12MB6162.namprd12.prod.outlook.com (2603:10b6:208:3ea::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9542.9; Wed, 21 Jan 2026 15:31:09 +0000 Received: from MWH0EPF000A6732.namprd04.prod.outlook.com (2603:10b6:a03:2ef:cafe::f0) by SJ0PR03CA0194.outlook.office365.com (2603:10b6:a03:2ef::19) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9542.9 via Frontend Transport; Wed, 21 Jan 2026 15:31:09 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by MWH0EPF000A6732.mail.protection.outlook.com (10.167.249.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9542.4 via Frontend Transport; Wed, 21 Jan 2026 15:31:08 +0000 Received: from rnnvmail204.nvidia.com (10.129.68.6) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 21 Jan 2026 07:30:34 -0800 Received: from rnnvmail203.nvidia.com (10.129.68.9) by rnnvmail204.nvidia.com (10.129.68.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 21 Jan 2026 07:30:33 -0800 Received: from kkartik-desktop.nvidia.com (10.127.8.13) by mail.nvidia.com (10.129.68.9) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 21 Jan 2026 07:30:30 -0800 From: Kartik Rajput To: , , , , , , , , , CC: Kartik Rajput Subject: [PATCH v9 4/4] i2c: tegra: Add support for Tegra410 Date: Wed, 21 Jan 2026 21:00:11 +0530 Message-ID: <20260121153012.92243-5-kkartik@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260121153012.92243-1-kkartik@nvidia.com> References: <20260121153012.92243-1-kkartik@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MWH0EPF000A6732:EE_|IA1PR12MB6162:EE_ X-MS-Office365-Filtering-Correlation-Id: 1f82bc9f-b0f0-4e23-ee65-08de59021999 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|1800799024|82310400026|376014|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?gS4/JYX2LgBXYNevRlRKYbZsDsRD1x+PcV9mnhLFBI2IjXTsw6oYYB6W7pPT?= =?us-ascii?Q?jvu4KlTQpUJ/GXTnChFfiLoXbdPqwxcMhHtAyRfFhzvbImQJPakkV3DsrzWo?= =?us-ascii?Q?JI+j/x7POih8IFrw1SqJR8nAJ34DJ52MMYVgNNkT01xIyihBZ2Sr2mXLqG58?= =?us-ascii?Q?yAmz4/zKWxwsshLtbiXiOEzOWnsaiJM26AFfwgHZYvYYj38iX8S85d561br8?= =?us-ascii?Q?Z+0N4u4Vl5VcufqOoaGc2OnuqjNSEXJ1/CaBnyjLAdqddtUfimn71K06gb4I?= =?us-ascii?Q?+fQfcCclkALJC9I9ZViAZV2tWyTFRqajq7gzJ0NMB+afzseaicXYm96BXG66?= =?us-ascii?Q?pSsdb9fKtoXkK78kwnp4Vpa4XmI7iYhoLQ0Z8M6nMlje2eAXTQNGYNsqNkS9?= =?us-ascii?Q?kCO5+iQDRxjK4eL4Z1krszjEJvGKN71EVrqR+n3uqHDT+Y2VyrA2tTxzEqKp?= =?us-ascii?Q?DmKE5WR97j4+pp1ocRgcIn0HODIxs2oFOvy7px/o80vkE+zN3k0C5DZ8T1da?= =?us-ascii?Q?VtMcJxYNn0XNjyGxQiF9V8VfWNfJzQzfDYFEBpie7wqcGbmDzQIPTJ1L+fAz?= =?us-ascii?Q?05uzRIKPief5F8XS7juMloWjh52PJ7vhdbITTiYbRlOtgF98Y5A8TeTcL8/3?= =?us-ascii?Q?mBKmDV+Li1//kkuMRZcQV65V+dNh/C63xrYfDLS944UAEuD7oRMnv6RRPO1o?= =?us-ascii?Q?M05VHDOvkvokj9nqliLyMkoOdBCoQZ8GWspqwoCYKFb6nSwSjaEjAr02tq2h?= =?us-ascii?Q?Q2OPSnaGFW2JoByYawjZEvyJrZcEUEt1r3jo40LiIKshdrtFO9YiB7QdXL+/?= =?us-ascii?Q?nbSTgjZgO7FpQ93nBzIdaiFQWy6ogrd9+u3o8XDM+RDJ6s5kjUtu3ihtzHs6?= =?us-ascii?Q?/ZWHmy+FuyIXGkcBuss2aZJawOKI+DxfmnHrn7SlvNRbYqn2GH2juB2AnuI6?= =?us-ascii?Q?v14SCir44L2Ug5/KAH/cqIq3xxOIMhxAm1ZNuFgby/+VeJNOSHfGAoslVIBs?= =?us-ascii?Q?Y+NA+8Gt9CkLjPlio8rJ0x7XbNtuyET876LhQGQh9rLLQAvVF8/Xnj7CRQoD?= =?us-ascii?Q?VbbN+Na/UupwEiT/f+IF2kuyCLMQ2BcToJXE6NFUTYTe7i6yrq7AzaQG/xlr?= =?us-ascii?Q?w2BIHVppo6jqev6jEAby/QY/7CancsdZ2YSgYAXr7c3KAnt5Eu4mF7fJpyMf?= =?us-ascii?Q?z4eo+TldMH5zn8ofmpomeyKhM8siKc1Tx+OgwqPmikkszRuQhhyXhNAdSs4A?= =?us-ascii?Q?PhYMIcK8wnhNiDYkS5Zdo10GnQ5g26hsLu7NCYH0/gOA0499Hq4L1cD8lwOM?= =?us-ascii?Q?IEAnkH4DqL9omBx/oyOx6dSbbkiNKuTwdJSQOelqpVN8K241IVmmlMlXSHOP?= =?us-ascii?Q?pqY8dDOP9KsmvXXA0JLf+V93+PfRthUn68RB+A9MtsPIIriEGQyb1JwA3SOh?= =?us-ascii?Q?S6lZh/Va7Rv4sQKBazqFqrl6rP79B/91TKxg1LcFFwn5wIl8j2m/TEMc2Ntz?= =?us-ascii?Q?TVgUYIWjUUQX1PE8KA37Qcj642e2eZ9b3wVsrlC6pmQCFgr83V1B+7acengA?= =?us-ascii?Q?D4NCR0OccaU8SI7RJCHmfy/L3ycmjO988B+dIT43Ps1FYs+KA2zjqcuWPuWr?= =?us-ascii?Q?0zHy3ReER7g8exQQ77JDYMfcVohZdmzK2bSdWUqXXEdfPqZwn3HniRkGH+lO?= =?us-ascii?Q?QUywmVbbaOmFMDCpzwVGOApqcmE=3D?= X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(36860700013)(1800799024)(82310400026)(376014)(921020);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Jan 2026 15:31:08.5940 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1f82bc9f-b0f0-4e23-ee65-08de59021999 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: MWH0EPF000A6732.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR12MB6162 Content-Type: text/plain; charset="utf-8" Add support for the Tegra410 SoC, which has 4 I2C controllers. The controllers are feature-equivalent to Tegra264; only the register offsets differ. Signed-off-by: Kartik Rajput Reviewed-by: Jon Hunter --- Changes in v3: * Updated timing parameters for Tegra410. --- drivers/i2c/busses/i2c-tegra.c | 63 ++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index d845b8782f4f..3c672f05373c 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c @@ -275,6 +275,34 @@ static const struct tegra_i2c_regs tegra264_i2c_regs = =3D { .sw_mutex =3D 0x0ec, }; =20 +static const struct tegra_i2c_regs tegra410_i2c_regs =3D { + .cnfg =3D 0x000, + .status =3D 0x01c, + .sl_cnfg =3D 0x020, + .sl_addr1 =3D 0x02c, + .sl_addr2 =3D 0x030, + .tx_fifo =3D 0x054, + .rx_fifo =3D 0x058, + .packet_transfer_status =3D 0x05c, + .fifo_control =3D 0x060, + .fifo_status =3D 0x064, + .int_mask =3D 0x068, + .int_status =3D 0x06c, + .clk_divisor =3D 0x070, + .bus_clear_cnfg =3D 0x088, + .bus_clear_status =3D 0x08c, + .config_load =3D 0x090, + .clken_override =3D 0x094, + .interface_timing_0 =3D 0x098, + .interface_timing_1 =3D 0x09c, + .hs_interface_timing_0 =3D 0x0a0, + .hs_interface_timing_1 =3D 0x0a4, + .master_reset_cntrl =3D 0x0ac, + .mst_fifo_control =3D 0x0b8, + .mst_fifo_status =3D 0x0bc, + .sw_mutex =3D 0x0f0, +}; + /* * msg_end_type: The bus control which needs to be sent at end of transfer. * @MSG_END_STOP: Send stop pulse. @@ -2085,6 +2113,40 @@ static const struct tegra_i2c_hw_feature tegra264_i2= c_hw =3D { .regs =3D &tegra264_i2c_regs, }; =20 +static const struct tegra_i2c_hw_feature tegra410_i2c_hw =3D { + .has_continue_xfer_support =3D true, + .has_per_pkt_xfer_complete_irq =3D true, + .clk_divisor_hs_mode =3D 1, + .clk_divisor_std_mode =3D 0x3f, + .clk_divisor_fast_mode =3D 0x2c, + .clk_divisor_fast_plus_mode =3D 0x11, + .has_config_load_reg =3D true, + .has_multi_master_mode =3D true, + .has_slcg_override_reg =3D true, + .has_mst_fifo =3D true, + .has_mst_reset =3D true, + .quirks =3D &tegra194_i2c_quirks, + .supports_bus_clear =3D true, + .has_apb_dma =3D false, + .tlow_std_mode =3D 0x8, + .thigh_std_mode =3D 0x7, + .tlow_fast_mode =3D 0x2, + .thigh_fast_mode =3D 0x2, + .tlow_fastplus_mode =3D 0x2, + .thigh_fastplus_mode =3D 0x2, + .tlow_hs_mode =3D 0x8, + .thigh_hs_mode =3D 0x6, + .setup_hold_time_std_mode =3D 0x08080808, + .setup_hold_time_fast_mode =3D 0x02020202, + .setup_hold_time_fastplus_mode =3D 0x02020202, + .setup_hold_time_hs_mode =3D 0x0b0b0b, + .has_interface_timing_reg =3D true, + .enable_hs_mode_support =3D true, + .has_mutex =3D true, + .variant =3D TEGRA_I2C_VARIANT_DEFAULT, + .regs =3D &tegra410_i2c_regs, +}; + static const struct of_device_id tegra_i2c_of_match[] =3D { { .compatible =3D "nvidia,tegra264-i2c", .data =3D &tegra264_i2c_hw, }, { .compatible =3D "nvidia,tegra256-i2c", .data =3D &tegra256_i2c_hw, }, @@ -2395,6 +2457,7 @@ static const struct acpi_device_id tegra_i2c_acpi_mat= ch[] =3D { {.id =3D "NVDA0101", .driver_data =3D (kernel_ulong_t)&tegra210_i2c_hw}, {.id =3D "NVDA0201", .driver_data =3D (kernel_ulong_t)&tegra186_i2c_hw}, {.id =3D "NVDA0301", .driver_data =3D (kernel_ulong_t)&tegra194_i2c_hw}, + {.id =3D "NVDA2017", .driver_data =3D (kernel_ulong_t)&tegra410_i2c_hw}, { } }; MODULE_DEVICE_TABLE(acpi, tegra_i2c_acpi_match); --=20 2.43.0