From nobody Sat Feb 7 19:04:23 2026 Received: from CH5PR02CU005.outbound.protection.outlook.com (mail-northcentralusazon11012009.outbound.protection.outlook.com [40.107.200.9]) (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 E235434C9B5; Wed, 7 Jan 2026 14:27:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.200.9 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767796044; cv=fail; b=oZLDo3+cTlsw1mo4rbKu5K67hF8ZxOB/TD4T/Kdl2H3PHfKfXrdlB+QE9kk/ntwcXbn7YcnroLkStsnZpoc0lz16o2btU31uxqpr6MJQZlz9QYzVIHYRKdUVPf0f6bs2tKo0eQr8HF+oUYxdtQlWf0OeCPEWYSmv9Asl85b8vT8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767796044; c=relaxed/simple; bh=Gefb5u4ND+xHQIaOGg8sK9WocwhXImHLyAi0AYUCuVQ=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=fA+MQ+Xv9Hhvoza66+rNrvGksgOl1phBSb9K0TLO7XjEvkNjZOYrdH5oFL5p6JmzIZzuXmxYmZROhYqTw+Ea3a9eJ56Ycp293ZeOXEfdTI/yFkwj3u2rvhTkCPVjv/6PifaAKrNRhfT63wJPEyIK10clFWxPsnrgerK7Uwctauk= 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=umkzmGuq; arc=fail smtp.client-ip=40.107.200.9 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="umkzmGuq" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=V3650cp4XSkGOd2hEKnBO59o+CY4H9wG0BAXPa+HKdE25cJoQhoZW7hqCXIMopukNPo+XrVfxOdZ+5XAfcvAhI/05y+RTk85VuhqNIkMBioOxn68jZoXIvt7loISSotgIkgek7N8xyzkHUcxeCc/njJmcumPPrbYxpRh3FKEfibJ/Tjzg5zqLTSiQ/mEm0Enatm6ZqnHlszSyTMBCBKmN/68NCmF5n1hDEIOcODwFXyRyhnUagsRd7mWrnFf3u7ldbSh8ap6GgLZQ5jabN/GuyXE5xs4A1v5+kY+Wz7Y1DoTj0O+ZpLGCwZ5RGSOTOGQpMFYzsRjmj6gQj3t4Z1BZg== 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=wTYT6/ojseOosIBH1Asu8ri6UO68D/EWH72BQhod3RU=; b=j3J9cHckqpIlEB7P1gyZgXcfAdsVCpmjnKJ8TBu604HFczF/qsh3mPKwURm9dmAABI4S4xv6viQ6CPCFt3+EyVZwDYrmfB7OqpBxN9o38T1jYonIMJb0dNWrGf2IHin4ypA7UZT47DaQJmc7Anv8mqgjRAAFl0/4kselUCnP6o3qjp5QKYBz7Q7gK8saV6G46QAuhfYwJepRCvOJJFNzjkgsbjDrANDxwBNpc3cN2ymsNw2SOoBxwUVRTSVV/KKSKDxtWQbUXgJcZq1a9R6OZSKzV0faGq8zGvVUCzEK6e4bLKW4sm/Wi+l4OHQirWCFxp1gFE4O1dSGG/ZDGJJO4Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.232) 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=wTYT6/ojseOosIBH1Asu8ri6UO68D/EWH72BQhod3RU=; b=umkzmGuqe/KOjqdWgmX52a6fiBWSJrfDon5t3xSmwqq77uYoDOQ33v+nZkbICDfU2iA/vmQBV4Hr+2oIbEV4vTnRyVAdWt/e6XvA42uGtWqn/imTaiLq5/YIsFJWXuJp9HS37YPpj02ohupg/t+HU+3Ct5X8wm5VEPtNBRaK2bCnwKR9qfuztuIpwZCbahVc7f3cdoP8jgsyg0FtyIu4zY/UlDTEJ+Pern+h8XHFK5o2hrBqIZq2+z1fbA3XqCcj4PhY1JuLTyQMB74dmr399pXlBKweum0bZ6RJVblmChsQML42bVMbgdwztvU4Gi/ks7qY9nVwx7p1KiwekQ4fMw== Received: from CY5P221CA0108.NAMP221.PROD.OUTLOOK.COM (2603:10b6:930:9::39) by IA1PR12MB6210.namprd12.prod.outlook.com (2603:10b6:208:3e6::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9499.2; Wed, 7 Jan 2026 14:27:16 +0000 Received: from CY4PEPF0000EDD4.namprd03.prod.outlook.com (2603:10b6:930:9:cafe::f4) by CY5P221CA0108.outlook.office365.com (2603:10b6:930:9::39) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9499.2 via Frontend Transport; Wed, 7 Jan 2026 14:27:15 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.232) 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.118.232 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.232; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.232) by CY4PEPF0000EDD4.mail.protection.outlook.com (10.167.241.200) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9499.1 via Frontend Transport; Wed, 7 Jan 2026 14:27:15 +0000 Received: from drhqmail201.nvidia.com (10.126.190.180) by mail.nvidia.com (10.127.129.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 7 Jan 2026 06:26:59 -0800 Received: from drhqmail202.nvidia.com (10.126.190.181) by drhqmail201.nvidia.com (10.126.190.180) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 7 Jan 2026 06:26:59 -0800 Received: from kkartik-desktop.nvidia.com (10.127.8.13) by mail.nvidia.com (10.126.190.181) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 7 Jan 2026 06:26:56 -0800 From: Kartik Rajput To: , , , , , , , , , CC: Kartik Rajput Subject: [PATCH v5 1/4] i2c: tegra: Introduce tegra_i2c_variant to identify DVC and VI Date: Wed, 7 Jan 2026 19:56:46 +0530 Message-ID: <20260107142649.14917-2-kkartik@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260107142649.14917-1-kkartik@nvidia.com> References: <20260107142649.14917-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: CY4PEPF0000EDD4:EE_|IA1PR12MB6210:EE_ X-MS-Office365-Filtering-Correlation-Id: 8bdb633f-ff00-4974-53df-08de4df8db53 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|82310400026|36860700013|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?84x7fcYkyxahzxNlz4+7hH4UgfJ5oJ0cxNwZAEunO2tLVafhciczl3UXobaX?= =?us-ascii?Q?NVprTtpbIcOxl9h6XKHG7/zc/aSV918i/gX7pZjXYIWhU6W/IUp02IeeGs2r?= =?us-ascii?Q?N3Bf3YQrAqiA4XmdzOBe3/nMqf3w93pHx4DVEM0LMnL+os7FK18NjzbRRdOe?= =?us-ascii?Q?divz2Lo/GaJBV6Z1S7bTxYgkZDdU9i1qj/vIkIF0+i2+P/IeTb39BhuPSA4i?= =?us-ascii?Q?5ufrDPhDGviOfbGe+HbAwH07Khh2cckMDGtFg1Oq3Yvf2dIt+Lsps51OsCFU?= =?us-ascii?Q?DLHSptDjAT8MMCQMuLXYkq00VinNnqODyCCJCw19M458j++pfgevGwQ6Rx7j?= =?us-ascii?Q?zV3JYBLi71SQEJNZ/utVlpRkWRYH7xr3wMYAVxlXJAJx4FyMy6mk8HJxYiXK?= =?us-ascii?Q?XMyAVo9feapUMqrMc6MO0GBw+uaYIfNyJnjQGsWWoTpmVKd3AoqdKjexwWYx?= =?us-ascii?Q?T1xLaGSwQluzxPs0rq5zoFan8i8fykiRtSTTpwAsRcIc+xn2bxMNX/X2tUyq?= =?us-ascii?Q?KUEhUYhoqd58BmmZ/nY5bVHCv4MtMyHLW+CjzFTug2lkoyHtbFu632DeA7U1?= =?us-ascii?Q?W9poViPKp+IQDIo4relXYsw1jIJdynK6QDNo926mzugvu8WPLxkDUYQ3C/J8?= =?us-ascii?Q?+tgV1fDfFhSqOD5jyb0LeobPsXg41W9DvmiYmkCjKVS2U/4T3sbSjiOKYvuN?= =?us-ascii?Q?LrkTBb1ALU1xEMeb28tLUKlG2NzWKB1c3QkYQvFFImY5TIuipTfy5vIvpCYb?= =?us-ascii?Q?KbtSfiZPjBw0oCTU7SDMZRke8dadpUSvcoqucIzq1DSLze9wh1yJZuAZh1nz?= =?us-ascii?Q?3zONWT00T+11hIAqGkNMygpAVy+5lE031TtqQXO64pkIqmb0KFK3c1KNxplz?= =?us-ascii?Q?A2kZXpgi8JIXO+6UegbAPJpUnTz+Vq3zFFHOnqhUjSht2nYpJPfh4n+VbrGE?= =?us-ascii?Q?MUEK5s9edRd177d/B0R29ot3qDfsqpJv/jFOAY9Wxcs4BdJNkXbUeG5kfLuT?= =?us-ascii?Q?gB1+4Zt7Ow6Ph9MbGnwHoj+pA9Y/rwhLJe6sCY6Oy+PIUEcdTJTlEwYd70he?= =?us-ascii?Q?WjMznDJTZ1kXP9l88v4YSptP5VD2G15nTA+q5Y23LijtDMio4CDSDE2Cu6hi?= =?us-ascii?Q?bD0OAcxPTbiDt86z7/nnZMKBHvR5bdQyet1bm9SibTTs5Hd6KhT6xISn3+wo?= =?us-ascii?Q?gUlUhHlDpTc1vURJ3ACOl+2Y9Lp00tDeFs7fBtUgda53x/bdbkmE2p9in+SZ?= =?us-ascii?Q?tN7ezaTa8ca/FuN18vvdn8T2GBQdGcL06sArqYgyonZFbACsrfziflocifVC?= =?us-ascii?Q?jBFw/UYYJe78t66yJtRWBnwLCaKeYxjgQ+IH6CCjEcKE2zx7dBhhWMXWcgyB?= =?us-ascii?Q?KdylGaojChPkn4tP7k/OHI15ppB4VBiRVJPF4dUxaT/Xs7Mu6WmnFi9yjYDB?= =?us-ascii?Q?0rmHZkna/+a1SqT2kmKQQkFkPr1d3HoOKPm/ctiAj6AbPpumCFX5MgpAKSJy?= =?us-ascii?Q?1O27pxtG6zCVBL3rzcwREXIXwqWGpinFg9bnGjpRtsAN+2DY7xwDLqNM4si/?= =?us-ascii?Q?kBOdX5UnsLxcm6ss0L/7vBQ28rrZb653qFGzf+yx?= X-Forefront-Antispam-Report: CIP:216.228.118.232;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc7edge1.nvidia.com;CAT:NONE;SFS:(13230040)(376014)(82310400026)(36860700013)(1800799024)(921020);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2026 14:27:15.9162 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8bdb633f-ff00-4974-53df-08de4df8db53 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.118.232];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CY4PEPF0000EDD4.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR12MB6210 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 --- 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 d05015ef425d..9a09079dcc9c 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 @@ -269,8 +281,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 @@ -323,12 +334,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) @@ -1915,13 +1927,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 19:04:23 2026 Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazon11010059.outbound.protection.outlook.com [52.101.193.59]) (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 D50CE34CFBE; Wed, 7 Jan 2026 14:27:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.193.59 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767796047; cv=fail; b=uGtXI6HUygbYk35eCO+yODHzTBViPxuVjVYWBc9wDxdOU/bQZk8p+ENzevu1Vlr2cWWiXpkU2oNiV8kUunsQjKN8uofpBh+2j/W/0N5G4Sy0P0Hdf59MUOAN1/mvmXPbWBC1c2NMb/UZlAUBr1Df1FJW2ZCVYxXbiD2yutuw+SA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767796047; c=relaxed/simple; bh=kV7d2X5pXkyhYP8Xy9+fvDZvADM4WqCV1b3c1j+nzrc=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=TIheGi3yXmMGy07qJfEkXmNKRD6UyMY5gi2/+oPY0LAK2q+ZQ9fK23h+0rJn/6ntmnrJ37ChzpxPIhj0dvMfa4qMwrkhr6NsDpDUnn7jkBQ6LrXmMG8lOCQSqfIfsV/45nGapFZcbBZlM59yjSL8uP16CFzcn0rZCiy02EPvUc4= 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=RNmXscU8; arc=fail smtp.client-ip=52.101.193.59 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="RNmXscU8" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ll91L6BssaOYErx5nxeJWtRte8rtRFvLi1PJVUzJe4Xd6Tjr8DxqEI8H9Lo6kcaOxkr3LiFDAsfIBzKIFNdjAkIWsHXBLw4n8XzsSiMQV2YBXX1TEHPMuAfUY6wtjCoImuiUnxoq3DP4qU276gtvzYjZaG9nugr7K/bvEE5vfZnHBswocc62XB9RoHSofl53pLPFcJ+SbEU76rUQsEB+WI41SdXGEOUu1RCkMuFfOAj3trs+iQraPxAxgerYbW2ikP7N6O++XUXfaaVmx5uIoZ2uTc0DgTdtYV+BgS8h6zbpmfSCbhgLC7P+YVNED1eCD7gswg9yIBBaAddksBcqZA== 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=xuGzSKV2QpW8honuj1viVJJWClZAIk68F23b+f5ho0w=; b=HfjAPiuxeYWA+YybriANGqPigd4GJ5vb0ka4MjikRwqRDliPv+2Eu083S3t/QeCTC+Nuf+gzPyEIW/oOalb2xVXzjGFM1Zkk2AEioUZiYDgwRkMkTGDFC+6qQv6WJWf1JU30a4kyrrtCWI0tckccaff+sBiLYQUagv59kYxfBLLC/ee84YNV6+pyXEolO306gFnD8dkjFoKhBKcVrAxnMeqXFoOBHivl0eIzQDaQsZAX44knrP6ssGtzOugGQaBSsugVQ0dJEQCod+zY787+8yRyEIfEhdjTzSQGWZi4m2Mz9mwkX8dbBgV54omhjnK4kwoZBwtWZMrvtRJxPsCRCg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.232) 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=xuGzSKV2QpW8honuj1viVJJWClZAIk68F23b+f5ho0w=; b=RNmXscU8kydd9j+EiKmKv38hD0+ykZBNvnRjA62ro1RBDw9CjIke23OIhT5f52XzTYrNRiZ0QCQ5OHiNGVym9QZPiNhgKe0nj87dSLv4n9kamvy4aZldy75MxLe58xChaEZA+WOeLAvGt+FnL/qQWQ6ciEyeyygr4cGPzViV1l275/Dz+nbRwzEg4DQs79Xbzqijsnp8wj/yurEH1yAf9/ktNf+ROxS66QOJbYcVrTzX/lRgdT5SGJCAQZeCh1zwAF/Sm2Tho7Y20Lc14jsiB16OHSa6lf6N/du99F7hGquoZbvIASKw8gUjnR4USkMwNTAMnFqdkXgOFlXJOelZkQ== Received: from PH3PEPF000040AB.namprd05.prod.outlook.com (2603:10b6:518:1::4d) by DM4PR12MB5867.namprd12.prod.outlook.com (2603:10b6:8:66::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9499.2; Wed, 7 Jan 2026 14:27:20 +0000 Received: from CY4PEPF0000EDD0.namprd03.prod.outlook.com (2a01:111:f403:f912::1) by PH3PEPF000040AB.outlook.office365.com (2603:1036:903:49::3) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9520.0 via Frontend Transport; Wed, 7 Jan 2026 14:27:19 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.232) 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.118.232 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.232; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.232) by CY4PEPF0000EDD0.mail.protection.outlook.com (10.167.241.196) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9499.1 via Frontend Transport; Wed, 7 Jan 2026 14:27:19 +0000 Received: from drhqmail201.nvidia.com (10.126.190.180) by mail.nvidia.com (10.127.129.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 7 Jan 2026 06:27:03 -0800 Received: from drhqmail202.nvidia.com (10.126.190.181) by drhqmail201.nvidia.com (10.126.190.180) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 7 Jan 2026 06:27:03 -0800 Received: from kkartik-desktop.nvidia.com (10.127.8.13) by mail.nvidia.com (10.126.190.181) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 7 Jan 2026 06:27:00 -0800 From: Kartik Rajput To: , , , , , , , , , CC: Kartik Rajput Subject: [PATCH v5 2/4] i2c: tegra: Move variant to tegra_i2c_hw_feature Date: Wed, 7 Jan 2026 19:56:47 +0530 Message-ID: <20260107142649.14917-3-kkartik@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260107142649.14917-1-kkartik@nvidia.com> References: <20260107142649.14917-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: CY4PEPF0000EDD0:EE_|DM4PR12MB5867:EE_ X-MS-Office365-Filtering-Correlation-Id: 8cc24dc1-fb38-48d8-8b6a-08de4df8dd72 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|36860700013|1800799024|376014|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?pYnrXFVo70ONXYZWYsbisweuVsmTyVXBLin46cGEnUlY/xTdDS7dgYgiDbW1?= =?us-ascii?Q?F7yDLY7HrbQBJwoiPZ4Woi/Swbka/b842b9U58OWVy8uAHMCFZlA2qguWFO1?= =?us-ascii?Q?lJjXk0MUJpjHARUueBNArwigq8l+04VC6qo5g8FoSGkeXtlVHW0EX/fnNbWD?= =?us-ascii?Q?GFb5H5ALPI2m/kEV0YUCznQjctjpI6aJrAhzvzp8MGkN8hCw0d5FLf2XKIeI?= =?us-ascii?Q?SNTTlCG7n7E7h4CvB5T6sTsqZ38K6OgYeOihzt18UjdIuA0dZpTeAVL+31qi?= =?us-ascii?Q?WfGvazHAfsRE/kQg+aXMIQ1YjWAZWk3GTVWj463/xU9TSXI+0hiLM9hGTs0k?= =?us-ascii?Q?SdGiZVZbRKhvB6e8UEzj/l9BxDaBRgjOh+uOHlfCiMQCON0+IJUP+MpnIrjF?= =?us-ascii?Q?C+JMbaqXruTyKpJ9k+DqC4MgcVRtT9UI887Ddf59PPYbmMYXXd52a35S6VMU?= =?us-ascii?Q?HTh8l2S58WaSSrV7eDN77Yksq8hLHva8O+q++0tv+UjPu3O3XKq/92sWAYc0?= =?us-ascii?Q?RnzSSd4RGkSmE9ANDa9tKUc8fCPnjvpK60zZ0CJS+xPBeX41GwhKWbYHaWkf?= =?us-ascii?Q?NdEtQvf7tkeZSLwo75Ax1TtSHBPYtNJQO4ThN//fRbnGJtOxI44ok7PMBDTg?= =?us-ascii?Q?CTBUBF1Puah5g4lQRFeYWSbTAfau4t6qRmpLc/oUhf1Jfi98qRklqoNoEABP?= =?us-ascii?Q?IYwvHykTLim/gbCW+fmTMt6ZbipU6H+nW1vJ0u9Xioi0/RKKpmGk4/MI8bT4?= =?us-ascii?Q?KvHJFug5eHxLWdLes8tA3unJRL3wW7o7PI3+AWKOpLND6NoaMaTPoRJLIyqK?= =?us-ascii?Q?Z2erypJeiZv9bH/Lm71A+pj/Eqq0MXX4FIvgK8CUba5F8jzKNP596tP9D+Z/?= =?us-ascii?Q?rAMHOz8ALspWIbHQyN26s0jFmRBt93jPAWtIuJ9LA9OyRZKzFkoRVDeimy1d?= =?us-ascii?Q?JicnciWY/mA0y1H4A89324Wfez36AKuFsHlfopiwlPnCSqxdOt8zbZFwl3gX?= =?us-ascii?Q?52fStP5pA8pShaxQshEgT0+mVb4DUF6lAbCr4NCCDp3bTWDZ9wd3m/yaGhM6?= =?us-ascii?Q?rkKnz5yGYEIYZGUlb45WvHoqrdJol02RQIOa+/MouIhGwUffA9HxO3hYl4Gd?= =?us-ascii?Q?FXTiYBruxFqmjEPUonUJzze7YUFgiQucSaDR8NLm7DWYYeSP0EUdpHnI69UB?= =?us-ascii?Q?xi93AMLt3x02nYdcMGahjUXLqz4nG4pUuirOi+dXQoM9bbjaO8j0oH0Tfs8q?= =?us-ascii?Q?JiIUceBlvIvE0g/1lZgiQ6quLU23pDOMNO+jEHFBpKOyCeE0pMZ/IoEhYZ0L?= =?us-ascii?Q?YPNpz9oKoaYHTVlKPDw3/ytzgAQJkPvJ+IthbOuFmDLhHr0DmyJylkiEcXCX?= =?us-ascii?Q?ZUXgTI+T1hoPksykMddjvL4ejXpd4olHBnOSAkcmhl3baoMvAc7ytkILUMBb?= =?us-ascii?Q?OmvsZ0qSO4EvfLOD36AA09wnvQgVeZvlwLrI9k5xXcUoAwTOmiP059YccgbO?= =?us-ascii?Q?2+Lp7ghJcemN74kfjeuOrcNs4LH4rHwgevOHiSBoaI6PbKDQxOyrbRgLwDcY?= =?us-ascii?Q?kfaZUD3sVExfvsQpAvSp4j+kDSZCHYc5A2GK4ows?= X-Forefront-Antispam-Report: CIP:216.228.118.232;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc7edge1.nvidia.com;CAT:NONE;SFS:(13230040)(82310400026)(36860700013)(1800799024)(376014)(921020);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2026 14:27:19.5228 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8cc24dc1-fb38-48d8-8b6a-08de4df8dd72 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.118.232];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CY4PEPF0000EDD0.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR12MB5867 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 --- 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 9a09079dcc9c..cb6455fb3ee1 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 /** @@ -281,7 +283,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 @@ -334,13 +335,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) @@ -1649,8 +1649,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, @@ -1679,6 +1713,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 { @@ -1709,6 +1744,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 { @@ -1739,6 +1775,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 { @@ -1769,8 +1806,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, @@ -1799,6 +1870,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 { @@ -1831,6 +1903,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 { @@ -1863,6 +1936,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 { @@ -1895,6 +1969,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 { @@ -1903,7 +1978,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, }, @@ -1911,7 +1986,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 {}, }; @@ -1919,23 +1994,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 19:04:23 2026 Received: from CO1PR03CU002.outbound.protection.outlook.com (mail-westus2azon11010019.outbound.protection.outlook.com [52.101.46.19]) (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 CB9DB34CFA7; Wed, 7 Jan 2026 14:27:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.46.19 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767796063; cv=fail; b=eOhneXORut4BXNhKxSfOvR6GEw/olJIVcXBJLckYNvSk0MwWggUJtSbAcv1Pa/T9TYT4ZCnFjd9hW9+0STkM/Ud3r89E6IRHPOQ+cpmGQmVpClPj5SlSTnCZnatcC0IyYr+HwziokMYzT6IRk96o+UZ780SyPATk5ZV9y74hXXI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767796063; c=relaxed/simple; bh=mQGwH8M55kLSaL/jvm7fukiwhURzaTfTW5S6ayZ+Wps=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=VL4eUjMHABaC2hjJsIcOGiPvrp74RNHp1wW1FEr8JZziJ27crunVc5S0W0sY5Yj1f1eNCP4CeYsb8f6KtxDbHTNLLuDsJ+bUfQFcfvwhZ2B+1XA0zmi9xa9PiEqB4LBtg6IfvxL/baVFeS0YidB+WDNCKqDjV1ABdpgM2mnOnEc= 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=kcX3wrCp; arc=fail smtp.client-ip=52.101.46.19 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="kcX3wrCp" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=VfFMdDfzousqQJqhzfJC6S+C35cDtXrhlLELwGPcnkmjFymSUmvE9cIcEPXv9TdCqxVJjdBXgUJj0GxxePlyzYmgpfLeP2yIrjdIKFhUUNG3EpBb3hQjBQR5CfljaGfWO7H2quZSCOYREteVLnOPo7XkGRxzpTAej0CTVf6OSFy+0+LV9nES3/wk3SIMXrHmcbbOE6ZfGkpYK2D5sySVJ6vjoeOVJxAl67cbDXwMzpcKu7vfB1gDfwshJae3NGq5dyvg/1XtmTcoW/ASqfDi2cSYda4MMNaQF8hb9P5zXKbnmHufGbtiAlLKbgg7EuC+GoYIKCOL1YH3TZALrR/PIw== 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=USa9lDkoLxV0hddRnnQcz38GCilgGXN0IllX+dVzBqg=; b=CFkFkwsQ4ziauRRz01eheKcgmb7Rm+8H34cZ7pbYz6icPreR1zDUGHy9HtoI4y3w0uPsmKUErm8VrVAsXdPehRqATVfeC4CljNeG+YeJe1rWCUSWsZVVgtqYeiaKw6KhFyLosx9hK8nEkPR1W4I+aX6smTl70qw1UgKLLtnbSPL9/3EGNCr7rP+yxQr0oT91/2gvwDMS/1zrsnnJg6be62gg1WPkf8UDxg5fSHQpNjyPmy1Sr0Zoiv9g0zNo/GyVfCZlUMFHfwbBqd//CApy7DwdUx8imtcTO7MBghy+6oTmSybGWF23VyiJRKjpA6+B+rGug80zfldWv/CANZaTQA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.233) 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=USa9lDkoLxV0hddRnnQcz38GCilgGXN0IllX+dVzBqg=; b=kcX3wrCpyZM6GwrFDQjypCZuJEU67rzQy4wiXzVTh7LQwPmBQhz73cDsP1WMNk9JQ73qdf9vJsk7GxruGMQa+Gy+WjsJmoHuUju9XATkd6gSXRQ2pOQRnqzIJRFK3BDKy1my/czAwTqq244zGyD+jmbLktr0QP39eH+hBRLHyC25/Upjx/iLyD1oCo3KEjT1kzKSZZp+5P4WMC/NFfGEDrUKoeNblH8ZI0N3TqmENGBJYWVPt4ccGBc0gS2QH3JtD5nVN0fL4SHIoUjruKSpJDCKxiJYXwVqnB8RZLQZ3cHuCZpfmqfSay/1Ib+KPAArWLtJeaSKQD8LRA131yUupg== Received: from BL1PR13CA0434.namprd13.prod.outlook.com (2603:10b6:208:2c3::19) by SN7PR12MB6957.namprd12.prod.outlook.com (2603:10b6:806:263::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9478.4; Wed, 7 Jan 2026 14:27:25 +0000 Received: from BL02EPF0001A107.namprd05.prod.outlook.com (2603:10b6:208:2c3:cafe::e5) by BL1PR13CA0434.outlook.office365.com (2603:10b6:208:2c3::19) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9520.0 via Frontend Transport; Wed, 7 Jan 2026 14:27:24 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.233) 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.118.233 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.233; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.233) by BL02EPF0001A107.mail.protection.outlook.com (10.167.241.136) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9499.1 via Frontend Transport; Wed, 7 Jan 2026 14:27:24 +0000 Received: from drhqmail202.nvidia.com (10.126.190.181) by mail.nvidia.com (10.127.129.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 7 Jan 2026 06:27:07 -0800 Received: from drhqmail202.nvidia.com (10.126.190.181) by drhqmail202.nvidia.com (10.126.190.181) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 7 Jan 2026 06:27:06 -0800 Received: from kkartik-desktop.nvidia.com (10.127.8.13) by mail.nvidia.com (10.126.190.181) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 7 Jan 2026 06:27:03 -0800 From: Kartik Rajput To: , , , , , , , , , CC: Kartik Rajput Subject: [PATCH v5 3/4] i2c: tegra: Add logic to support different register offsets Date: Wed, 7 Jan 2026 19:56:48 +0530 Message-ID: <20260107142649.14917-4-kkartik@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260107142649.14917-1-kkartik@nvidia.com> References: <20260107142649.14917-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: BL02EPF0001A107:EE_|SN7PR12MB6957:EE_ X-MS-Office365-Filtering-Correlation-Id: d116785d-ef03-4537-28f6-08de4df8e04f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|36860700013|1800799024|376014|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?IU65DhY08eknCYpsmOf0G2ReckDDjTJRUghYgLd/5zULk322KxUmLYoSC3sh?= =?us-ascii?Q?8/be6MIjdFJDi1n7f1YTgVZyVT00KkLE/18f4xub0/XDs+AR5RuMpZ9ezNya?= =?us-ascii?Q?RCO7OzNKReBXlbZOKfckXPePni44hJaRBzo7u9tvhD+chfXjywYb5reUWqUp?= =?us-ascii?Q?fBYOLFupE0fD2CUUyRuYf5oUmpE1Wwu2chvYNEzlutk9hx8ADo6TcB8uqXpP?= =?us-ascii?Q?FNruaKVyUGLKC8/iccULErfu8sfvf6V+2Xl2/iNUcfLlZD2ej6YecYuCWkEO?= =?us-ascii?Q?d+fYXML8F89x7zcvn8LtqmdJar5F+w8ugRWQ5WM7QOE9L+XuyqhSjx8rUIOs?= =?us-ascii?Q?5dOYiIlVY9McfFY7HoXIX/m4/xcYgspOdSB1O6tRx4zuruyA7J/dQHXzWenW?= =?us-ascii?Q?bxFMLicJggRCDnb7i7KFAnr9dmIyQc0MMUMwgSFO03KpVEy6wt0bELF1rAYG?= =?us-ascii?Q?AbZ4k13274Lyaj2SGUI2rPOglRvOyCf/i+1gATZunKrv2sBiobvogqphZGTD?= =?us-ascii?Q?wYGHe2gRdMLfi0bS1U6irvozdjLOSW0jiVVAE68YFzG2cpLIg2AEfpf978QG?= =?us-ascii?Q?Q/GDcDfSpfaCcX7g/Uh5Csi34xU19FgZBqHTQqzwmctanFwSHUld/Z9W3aZJ?= =?us-ascii?Q?UoORP1Jb/cClwWO+w7ImhlEViiKaN+WVjAlMT3ph01AGxFiCvyUDE+FOlQpH?= =?us-ascii?Q?Fnc3sKOaXeG64tD38pKC+kr0IGAHxUub4lBX12JSEyAA5PFj8i8r0INFc1Uz?= =?us-ascii?Q?FsifvK87rpsPfq8EM0rIyft8NWd87weCWJ2LQbJkn6t8eZmd4my1GGjBb48Y?= =?us-ascii?Q?olWya6v2o4OrDiJ3x8xRlNGaOYvrES+6Dc0ha5LQBg32n4Mfx74jL+umJKK/?= =?us-ascii?Q?vP+EA/hUl0DZRmWYVQD/rHgKZ4uRrMAtTD+SKtJ2HKJxV7JXMGW1CGp17baE?= =?us-ascii?Q?+yz9mWSc2To/9soqpfIn/6ebXY4bj1V9wfJ/RI5/pgc72XB0wWbjWycRHrme?= =?us-ascii?Q?WelcbcIBlm2rNWgvSsCi90kfAhOmapZjbUHYUam2ody8pJfV4gyoKhAbl87z?= =?us-ascii?Q?RrCqdeEhUKAFoBhH+IA0EmouUm32fpmNmyxMhgYpJP2SHHAIV19A3jGctOjO?= =?us-ascii?Q?yWkX8TvTC1EBsvQjcG/WCU3BQX7luWst9GqMtVZoaqso4XID8XhJdvENs8nZ?= =?us-ascii?Q?d+HNBHsW3P9XvmFF7PeovieiqU4rCCmJYz331gQZQennfPF8OH6s8c1sZDYI?= =?us-ascii?Q?RmpQHBAreeWYvu7F6H4lzrHjfEurvlAQ0mNiG5TsssSouWHcZgwC11CY2r+f?= =?us-ascii?Q?S9B/JV9NWSr8vn7K9J78kCt3FcGPko4tmK1nJVyUSbWh+DUwlh0dZTdZHKXl?= =?us-ascii?Q?37AgaC2OLY1U/P5ngWo3JIA/ndWb9Bpu+IqX/nEefIrrmS3Yti1y1a2RcGZ5?= =?us-ascii?Q?H9uwLYRxQvx7sJWOxhT/ZWWcBfb1FNKxVklISY0SYuRYEwFdZ9nUMdjra8uN?= =?us-ascii?Q?unF81bx+KHlX7l01w0R/4kzkTwIut1NeVn02m0YOp1DVtUG68NC8knGrJrGH?= =?us-ascii?Q?hbjSP521hTctQf0FVFNBZVrBb/j/xKA/PWOImjYZ?= X-Forefront-Antispam-Report: CIP:216.228.118.233;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc7edge2.nvidia.com;CAT:NONE;SFS:(13230040)(82310400026)(36860700013)(1800799024)(376014)(921020);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2026 14:27:24.1988 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d116785d-ef03-4537-28f6-08de4df8e04f X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.118.233];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BL02EPF0001A107.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR12MB6957 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 registers offsets are now also defined for dvc and vi, following function are not required and they are removed: - tegra_i2c_reg_addr(): No translation required. - dvc_writel(): Replaced with i2c_writel() with DVC check. - dvc_readl(): Replaced with i2c_readl(). Signed-off-by: Kartik Rajput --- 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 | 393 +++++++++++++++++++++------------ 1 file changed, 251 insertions(+), 142 deletions(-) diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index cb6455fb3ee1..821e7627e56e 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c @@ -30,47 +30,37 @@ =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 -#define DVC_CTRL_REG1 0x000 #define DVC_CTRL_REG1_INTR_EN BIT(10) -#define DVC_CTRL_REG3 0x008 + #define DVC_CTRL_REG3_SW_PROG BIT(26) #define DVC_CTRL_REG3_I2C_DONE_INTR_EN BIT(30) -#define DVC_STATUS 0x00c + #define DVC_STATUS_I2C_DONE_INTR BIT(30) =20 #define I2C_ERR_NONE 0x00 @@ -94,50 +84,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 +137,149 @@ */ #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; + unsigned int dvc_ctrl_reg1; + unsigned int dvc_ctrl_reg3; + unsigned int dvc_status; +}; + +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 { + .dvc_ctrl_reg1 =3D 0x000, + .dvc_ctrl_reg3 =3D 0x008, + .dvc_status =3D 0x00c, + .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 0x0c4, + .bus_clear_status =3D 0x0c8, + .config_load =3D 0x0cc, + .clken_override =3D 0x0d0, + .interface_timing_0 =3D 0x0d4, + .interface_timing_1 =3D 0x0d8, + .hs_interface_timing_0 =3D 0x0dc, + .hs_interface_timing_1 =3D 0x0e0, + .master_reset_cntrl =3D 0x0e8, + .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 +357,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 +390,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 /** @@ -342,51 +465,26 @@ struct tegra_i2c_dev { #define IS_VI(dev) (IS_ENABLED(CONFIG_ARCH_TEGRA_210_SOC) && \ (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) -{ - writel_relaxed(val, i2c_dev->base + reg); -} - -static u32 dvc_readl(struct tegra_i2c_dev *i2c_dev, unsigned int reg) -{ - return readl_relaxed(i2c_dev->base + reg); -} - -/* - * 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 (!IS_DVC(i2c_dev) && 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, @@ -407,12 +505,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); @@ -423,7 +521,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); @@ -461,7 +559,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) @@ -484,16 +582,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) @@ -621,14 +719,14 @@ static void tegra_dvc_init(struct tegra_i2c_dev *i2c_= dev) { u32 val; =20 - val =3D dvc_readl(i2c_dev, DVC_CTRL_REG3); + val =3D i2c_readl(i2c_dev, i2c_dev->hw->regs->dvc_ctrl_reg3); val |=3D DVC_CTRL_REG3_SW_PROG; val |=3D DVC_CTRL_REG3_I2C_DONE_INTR_EN; - dvc_writel(i2c_dev, val, DVC_CTRL_REG3); + i2c_writel(i2c_dev, val, i2c_dev->hw->regs->dvc_ctrl_reg3); =20 - val =3D dvc_readl(i2c_dev, DVC_CTRL_REG1); + val =3D i2c_readl(i2c_dev, i2c_dev->hw->regs->dvc_ctrl_reg1); val |=3D DVC_CTRL_REG1_INTR_EN; - dvc_writel(i2c_dev, val, DVC_CTRL_REG1); + i2c_writel(i2c_dev, val, i2c_dev->hw->regs->dvc_ctrl_reg1); } =20 static void tegra_i2c_vi_init(struct tegra_i2c_dev *i2c_dev) @@ -637,34 +735,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) @@ -683,11 +781,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); @@ -710,9 +808,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"); @@ -733,10 +831,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; @@ -778,8 +876,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); @@ -824,12 +922,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 /* @@ -837,7 +935,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) { @@ -847,8 +945,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); @@ -861,12 +959,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); @@ -874,7 +972,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) @@ -895,9 +993,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); } @@ -917,10 +1015,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 @@ -929,7 +1027,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; @@ -945,7 +1043,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; @@ -970,10 +1068,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 @@ -1004,9 +1102,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; } @@ -1028,7 +1126,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; @@ -1040,13 +1138,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; } @@ -1089,9 +1187,9 @@ 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); + i2c_writel(i2c_dev, DVC_STATUS_I2C_DONE_INTR, i2c_dev->hw->regs->dvc_sta= tus); =20 /* * During message read XFER_COMPLETE interrupt is triggered prior to @@ -1127,10 +1225,10 @@ static irqreturn_t tegra_i2c_isr(int irq, void *dev= _id) 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); + i2c_writel(i2c_dev, DVC_STATUS_I2C_DONE_INTR, i2c_dev->hw->regs->dvc_sta= tus); =20 if (i2c_dev->dma_mode) { dmaengine_terminate_async(i2c_dev->dma_chan); @@ -1150,9 +1248,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) @@ -1163,7 +1261,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; @@ -1174,7 +1272,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; @@ -1217,7 +1315,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); @@ -1276,14 +1374,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); @@ -1294,7 +1392,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; @@ -1319,14 +1417,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 @@ -1354,7 +1452,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, @@ -1475,7 +1573,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, @@ -1650,6 +1748,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) @@ -1682,6 +1781,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 @@ -1714,6 +1814,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 { @@ -1745,6 +1846,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 { @@ -1776,6 +1878,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 { @@ -1807,6 +1910,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) @@ -1839,6 +1943,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 @@ -1871,6 +1976,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 { @@ -1904,6 +2010,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 { @@ -1937,6 +2044,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 &tegra20_i2c_regs, }; =20 static const struct tegra_i2c_hw_feature tegra264_i2c_hw =3D { @@ -1970,6 +2078,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 19:04:23 2026 Received: from PH8PR06CU001.outbound.protection.outlook.com (mail-westus3azon11012059.outbound.protection.outlook.com [40.107.209.59]) (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 33E1E34C80D; Wed, 7 Jan 2026 14:27:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.209.59 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767796054; cv=fail; b=gRGIDgSlDxPynEu/eC31ZLwUBbQWyisa0btNjEGMLgOEFXuXFr8+NeoFLpC4/Dp2p1lmsbbzfhAq7s0w8M/yCiZkU6iwmqtW5gOX7+OEPNyjoV0HxOmgjuc82dl7NyzK7osCCWajJZS0Ryuomj4oTb7skYsSnDp2lCNyxwAAf2E= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767796054; c=relaxed/simple; bh=/m6iouFazO4ePER2+xrSJJ3CwuAMEy+bLO98nZxbYrE=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=gYrYYlMcAtw4DpDdjuQQok8mtH04yN1xX6DCeUNfE0aLEOAOFJwESGYGv5lD2ci7K2vQpKufAqfHKhWRNfYtkHmJ+8a820TfECGJYh39i3KggBBciv0eUp9zu3EgQBSM5bnMoA6NW2gzr6VqGhNqhU7EAUnRF5ssDgdLUfiqgCE= 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=NhzGBcv6; arc=fail smtp.client-ip=40.107.209.59 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="NhzGBcv6" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=rorpMxVMMwF7gY9YvBRATSfHLT0l7TGoyOdELXHaxdL4AL+E8y+7Pmptp4h7tjWBDGnzD7ZMVuHFWrJDZtpItGvW6Cf/AdVLpRAcogRgJIBLKPyb0GOVRWNuypZ6tlOfhaVUHwXSzIn3wW+yWsWkeC3FtlFTg3GvEGHnNSvIX9BVzTbS5Nccqw9ZwLXsVayzXjmuW8lk0C41AlfwLVkpbjDppvJCjH4JZNGw5cqH43swX7kds5MTuJsuvxQCad2DGv9V1HB5Az1WGLRhr2f+HhlRJJIt5qJ50TUh6zs5i0oWkgmRsj+q5HEUoXJoJIwi7DLQFbWKa61bQfUrmJ9ZVA== 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=3rxP2xmMyuqs6tLl9QdY3Ic/sV2ebK4cTI1HIEL9tog=; b=WjDM1X38VtWyTpXXYPoljCut7OrzT50+SA5T6nAYS1BFZg8tX1OKz+DUaRo9BSA9Ew0Cch+hOZ7SLeGEQEaLzknvEg/WKbyTYGDiEBERiCUU35wnexhzW3/ZTfaVr6ZFSCBEC0KtD3QZz6fVbLiZdRLr5aKBpC9/nxYWcqUVuJMse4PE+ZKAT+o9s616RZRqBO77ytOXZKikANYwFV76/LZtr8S3iTogh/nROu/zvYKBA5lzeWQrVRvIQLiWvkVjkCxXHOnYdl/UEXzIvV6tjL8YZG705mkmVbZQRbxpBXij/PFz6rofs6ASHsMxMZHpptWZ2IbvNQ21cwIq196IjA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.232) 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=3rxP2xmMyuqs6tLl9QdY3Ic/sV2ebK4cTI1HIEL9tog=; b=NhzGBcv6DdfcpNPabw7S9POEa03FCnwH3OFNsyG88mqvlI+JGdNKkeVDPi1v7PjaIpMyEVlM8AtZDgLiAK0/RZq5GA6Q/lZrZ8wqgJB1ITfcwVUtRR6CgXYoPyA48dGW58ig0SoKT6XGxvehaHpBB4ZmWc6QhCa0jbkZiD+njwl+2Xk0Sx2X3apoa5YefuwD6Yfz2iTWge1eidqcFzdTVYG5gKJJUk6sMaZ0XJtPn96ksRN0UxbeKduHX2QGmmoVSRQXJ2xkma8vo81fYK9xCT4vvVX4kqnLKX7cxvH/60XVyJMQUu78NgzderI+f/7Ic+rhT42K5Mli5iG6dRv6ww== Received: from PH7P220CA0009.NAMP220.PROD.OUTLOOK.COM (2603:10b6:510:326::14) by LV2PR12MB5944.namprd12.prod.outlook.com (2603:10b6:408:14f::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9478.4; Wed, 7 Jan 2026 14:27:27 +0000 Received: from CY4PEPF0000EDD6.namprd03.prod.outlook.com (2603:10b6:510:326:cafe::4f) by PH7P220CA0009.outlook.office365.com (2603:10b6:510:326::14) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9499.2 via Frontend Transport; Wed, 7 Jan 2026 14:27:26 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.232) 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.118.232 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.232; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.232) by CY4PEPF0000EDD6.mail.protection.outlook.com (10.167.241.202) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9499.1 via Frontend Transport; Wed, 7 Jan 2026 14:27:27 +0000 Received: from drhqmail201.nvidia.com (10.126.190.180) by mail.nvidia.com (10.127.129.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 7 Jan 2026 06:27:11 -0800 Received: from drhqmail202.nvidia.com (10.126.190.181) by drhqmail201.nvidia.com (10.126.190.180) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Wed, 7 Jan 2026 06:27:10 -0800 Received: from kkartik-desktop.nvidia.com (10.127.8.13) by mail.nvidia.com (10.126.190.181) with Microsoft SMTP Server id 15.2.2562.20 via Frontend Transport; Wed, 7 Jan 2026 06:27:07 -0800 From: Kartik Rajput To: , , , , , , , , , CC: Kartik Rajput Subject: [PATCH v5 4/4] i2c: tegra: Add support for Tegra410 Date: Wed, 7 Jan 2026 19:56:49 +0530 Message-ID: <20260107142649.14917-5-kkartik@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260107142649.14917-1-kkartik@nvidia.com> References: <20260107142649.14917-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: CY4PEPF0000EDD6:EE_|LV2PR12MB5944:EE_ X-MS-Office365-Filtering-Correlation-Id: 23b0dad8-8375-439d-928b-08de4df8e206 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|36860700013|82310400026|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?aTnkN1Zp1bLee152E1fT2p50A9V7zVdPfmB29Ij6Aqw4U1Rn9HP9G7LOeBZl?= =?us-ascii?Q?QvScbBtaI0iDKj5znca1j2szN4wMlo6rsaxE7E3Oy3aKP2XOZjiz1xMz76Ak?= =?us-ascii?Q?A7v1udlUTXZOPGKGAbikPAy8NpWUOZ2MNux3jkDym1lK9rmAAzLeCTiHgd/m?= =?us-ascii?Q?2RpmLxUfgd7qyWbU1FVZNFSzOTKNbW9HEVTLgw43YxkmRWx4j6m2jmJW/f6J?= =?us-ascii?Q?ui9rS/xuYjeqmKHCcfRrZtMDWL8kS9ble2AgHpEGZrJ8IFJPL/1RCI05FTf6?= =?us-ascii?Q?1aOK2n4uLzpWVni7vYkEvGsDukWDo0ZuBba9Q1IbwalrkwTRqgRGCyi0vhFg?= =?us-ascii?Q?dFF2hBA8HuosvxU1sry1YfcdX/8HhTUZjUcdwMXnWtsQh5Lmjvvt2CI8Z1L/?= =?us-ascii?Q?7rn/yhr/UT5GeVQQD8GYaGQvjv8VHeJKUfqS/R/wz5hdKK9IBye9YcgBMn7m?= =?us-ascii?Q?i+nocvu5gtu97KSn26W0qFmTg9PUD6b5rFXL++udCJcemqFX1lJCurlL/8ix?= =?us-ascii?Q?zmq6rx0PuchF7Balp4ikPw89iocmUT1AdTybMybX3zJy6doDvhrUHxPy9Dpv?= =?us-ascii?Q?59KsahwKQt+TUw6Xbx4/byL3etyfur7KRPQ5jh6lAEyS71Z21eTc9BPM/3Af?= =?us-ascii?Q?zThspi0rLBCcCMmwQQ5I70rN6TvZEg8rEL/cJ+9MfG5VcnjteVIl9KyRtcrg?= =?us-ascii?Q?HCGFPwEW0y6uU0y0NNUCTVLUNSMz+P5mtNwAzVLIKWzB6DH6xtfw83hTIvWa?= =?us-ascii?Q?l/doEZ6tqDpVm3/vYBh7iu4o1Nx4fkB5qXckxbu4LmY0nnVhrtCL2B/8xzNK?= =?us-ascii?Q?1aGWwoAQGWTr5iaGTLoF3hJ/G4B3qMvhBUL7+N1R8VYlFL4Qf/roaFq0pG7s?= =?us-ascii?Q?JteGLgqVUB1SHjxfmO3BKijKU94yRtFluQoZSYmHJPJOWpDZuS+gBRfj7ao+?= =?us-ascii?Q?3mZViW96XxEPnx0VLcN6MFih6+5btq3EuLS0bbEs8syTRa/Eea6T7P7jKcT2?= =?us-ascii?Q?ini0sQ3Noe+e7Bnujb1QosKEKUCO05BbsXlt6CYzQ4hi/SvwZ/tDSw9L1qKb?= =?us-ascii?Q?qVfnM3Cw+VNUJ/9rxvepfh84D/7H54rOqt4d4MCzeG7LuHTCG8/t81ib5kHA?= =?us-ascii?Q?PvLUgvMmoywlrk4Zg114wEui2tb9SNKFFbLHSqkycNb5KNjg6k/po5usUle8?= =?us-ascii?Q?JT9XrHhv+uOQNw92QQ54ix6T0V0onlOOQIYljy6xGF/IqxMMWdZ3eG6g+RSk?= =?us-ascii?Q?2GdTRK2A9dg15bGSU1iBqrLXLVQSOIiit29BZJzvKdRNwKK4cUmFiZK6Dzk8?= =?us-ascii?Q?7Ojs62h3i8Dc+loPJnETVtgl1upOuHlllzhSmQ3hMNxdMp8K5d6pCn8ABxjb?= =?us-ascii?Q?zeSvolV4WFXJ1+WFhlf5wDwa2jLxNnPN01uu4+UVqkTe7i6TBlbTdfwTblmD?= =?us-ascii?Q?b+yGpYAvRZAb45bECjbD7phgKjKsG1+bDoQJ15m3qhfASTkD+imtMEuPPjpx?= =?us-ascii?Q?4/Sc5LcewAkBhdsnbgwdUhR3lIRyN6KRo+DIvRPI/hVmEyAeFSLThp77JEQO?= =?us-ascii?Q?WalRu0u23186enuh9ySYjOqvjGThlozpK7Ru9xua?= X-Forefront-Antispam-Report: CIP:216.228.118.232;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc7edge1.nvidia.com;CAT:NONE;SFS:(13230040)(1800799024)(376014)(36860700013)(82310400026)(921020);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2026 14:27:27.1476 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 23b0dad8-8375-439d-928b-08de4df8e206 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.118.232];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CY4PEPF0000EDD6.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV2PR12MB5944 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 --- Changes in v3: * Updated timing parameters for Tegra410. --- drivers/i2c/busses/i2c-tegra.c | 64 ++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index 821e7627e56e..44afef32d656 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c @@ -280,6 +280,35 @@ 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, + .tlow_sext =3D 0x034, + .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. @@ -2081,6 +2110,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, }, @@ -2391,6 +2454,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