From patchwork Wed Sep 11 10:38:50 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Manikanta Guntupalli X-Patchwork-Id: 827555 Received: from NAM10-MW2-obe.outbound.protection.outlook.com (mail-mw2nam10on2057.outbound.protection.outlook.com [40.107.94.57]) (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 6F016184555; Wed, 11 Sep 2024 10:39:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.94.57 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726051150; cv=fail; b=UXYI8CjZmUX0MGyUYoMDbTfzPQ4fdBg3TfVHVnb5uJxJsjza84yVRNeIEvaAI+yd8Rea8gzzijbUjy5RxxFQ/cx0anb+Get4/U4BCr98F/NmZQfEmp+q0JiPahCrf7BlzvJEmIQfo/HgRWx1SYrC6jhAOjXgM/c95U5ITn4P334= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726051150; c=relaxed/simple; bh=X7JE3jz8OkImS1RLo4VKLN5/YJbPLuJ8JS6i3zD7hE4=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=TgTIy+0fRlAXlOD4CCnxJT+TE8udjlS7lPZ6EpvXgfKZeBdjXVLTvDrm5U/wpB3Ixy2kPvsGhcL6jLmd3aCXemET9bvzlr9z3gfB1a2ayIi07kfQfg4fCYq2MLTNXoy5vAJ1gIZ8ZBccLbRnP2BChFT3bLP+0jtcVI+EFE5oWyY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=evtVQkD1; arc=fail smtp.client-ip=40.107.94.57 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="evtVQkD1" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=AsP/z7bs4iACpAXvZc17RYV5uf61193yEQ7Eiy1dxdnq71cDQobSa+Zcqc2/w8Kbj3iADRKd5OGzBgJwe6uiwP6EJX5BU75FGifGhDeTEXqTjfrTMp1PdFzbdOOn42H3pWEkOVYd3XUtMDseBCjSyBiJeasoilA6A4LD7hCBvL8z1zUxX7maQnYwXRWjuUICx/gSC8/mIAzIs45VpGhPSIGsjARHN6MQc01WbxHvSXNn1bvobpibOSRwnjtyMOVqBHLfqtVvZhDdk+MhlEPAOFK6w8tbWiiTKAwq3BA8xJMnjc9vo8CppsAT6Pw9ZfhFXjqqDD1ot1LTM9TUnxYoeg== 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=VAXUc+ks8G2fFWunSNjtxS13J93MOyH3ZzNqUNBwFUM=; b=QAq3enNIOeuQuDL1LTlRKtHdEyuSVx/kgMCXMg/doWirUKCILoscMXsDIavVoQe83ML9pfZJexx3vBVu2ZcID/E6lAmBH7aL8fSEdm3Byk7GlgiGE74xUbH4U1/9XoMvbmBOuVJWGdAp9GnEZoofDCvUQjH9uaQwcOetTaCgye/bcWiDh22p5voIlZgDGQNFqIvpaFESAQ3EiBzt/kCRldD/Xvbl5ZShE27N6GGEjuCxMmIRlaxKhKEbsW5Y80EKrAWLHWHZbP5fYxzriSo9LfhiZ60sU6XeCGs0yDgW10fyERvFDoN22BcJR7Z4tepp6ESS4Yn4Osw+uQP+OKFDBg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=VAXUc+ks8G2fFWunSNjtxS13J93MOyH3ZzNqUNBwFUM=; b=evtVQkD1ZfxjCvgI3WC6Qtv81muJCf5M2MvCR6Lut067RhIjpE26iqqZMRPTPB8AGUWac/jONIDwrfV++6IGZlNJcMjbQ4CBfpvhtHtzFnGqEMAW0m/KPjQ4TuAkwktwuaEAEnND3O5f8Xu68fOE6idwyN7MwcEF0GZOEsaUet0= Received: from BYAPR08CA0059.namprd08.prod.outlook.com (2603:10b6:a03:117::36) by BY1PR12MB8448.namprd12.prod.outlook.com (2603:10b6:a03:534::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7939.24; Wed, 11 Sep 2024 10:39:05 +0000 Received: from SJ1PEPF00002324.namprd03.prod.outlook.com (2603:10b6:a03:117:cafe::8a) by BYAPR08CA0059.outlook.office365.com (2603:10b6:a03:117::36) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7939.25 via Frontend Transport; Wed, 11 Sep 2024 10:39:05 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by SJ1PEPF00002324.mail.protection.outlook.com (10.167.242.87) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.7918.13 via Frontend Transport; Wed, 11 Sep 2024 10:39:05 +0000 Received: from SATLEXMB06.amd.com (10.181.40.147) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Wed, 11 Sep 2024 05:39:04 -0500 Received: from SATLEXMB04.amd.com (10.181.40.145) by SATLEXMB06.amd.com (10.181.40.147) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Wed, 11 Sep 2024 05:39:03 -0500 Received: from xhdsneeli40.xilinx.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server id 15.1.2507.39 via Frontend Transport; Wed, 11 Sep 2024 05:39:00 -0500 From: Manikanta Guntupalli To: , , , , , CC: , , , , Manikanta Guntupalli Subject: [PATCH V2 1/3] i2c: cadence: Relocate cdns_i2c_runtime_suspend and cdns_i2c_runtime_resume to facilitate atomic mode Date: Wed, 11 Sep 2024 16:08:50 +0530 Message-ID: <20240911103852.162234-2-manikanta.guntupalli@amd.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240911103852.162234-1-manikanta.guntupalli@amd.com> References: <20240911103852.162234-1-manikanta.guntupalli@amd.com> Precedence: bulk X-Mailing-List: linux-i2c@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF00002324:EE_|BY1PR12MB8448:EE_ X-MS-Office365-Filtering-Correlation-Id: 67b6a601-8a8f-4477-f21c-08dcd24df591 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|36860700013|82310400026|376014|1800799024; X-Microsoft-Antispam-Message-Info: eD7pcTE6O+LkGHUvYKg2JqZKXkMqW1YPGlp6nvQW0xKL9E7IZDGLS7NGvwwesqhhR/XSjRRktAMWc9UGAMy5mGGB+IAskxT7r3eeEaL16RzUIcZ9rW0kukqRRtQhRnprxpSoJZyGDj4/b0bICGI1gYNdZc5ry5ZA/svzsVG14NDKB6qgoqLmUU+8fbC1p57GjOqehcXYKQeYC83LKzSbsigoJfIBJo7y2lZbnsvOVNIZMHyUHUU7Gf41/DUGttJnR9wV/PYERel8tSJ5grh5vK6zgiRnSLip4Sq99aRE2d5CBKHiyKicpUzLgQ+u4rDlAMefDmvFbPACZ9lSrmpu7AoZTnR/dYhLtFQ/zMW9KFhz6vg2kwv6ypzqXM5zIKDMsFzChJ6l6X4/V5MN9ggyA6YFTVYmtWoJkeMOggNkn1f1u5AQVBgHIc3+zZNClBt4u4H1Mqr6DDaduwe5gKMXhBmI27yKvAi/pLuhUQ2l+ZAKFM7pLBCxdsSxSCSnA4MhhRR34fy14AJIZ9lOOL0WXDanQ9VPv2zbx3bWj+wWPqQjkkuW9ZxM36x2JTmrAiXYYCR3lm1dbckHuOX8BhsUx7xuEIeOs5ADjPOD05SMwxpnIWTIPsCgf7jH/DxdI+xF5Ow5ZGe/zLMLUAGQMvRSNURozNxVX8g5xkD7aUoTvB9Zzk77RXaGD3Qp9JarAh88H4jxhvx1YI+1vvnQTtzXBFJvZ+kwRqhxbQ83RUZVFj+fN6iog6kHKOvhArrZPOhZhdRn0X89UEb3xh/BQQqCRIn1ds5tsIambXe6o/rBjDOI/tEnZ41ZFbLdukvSGHanX1n7g4IlhvC01oRUKRhglk3qqTi/nwMIERg0nGquOTO3t8NJnzpL7VUIYfh1AIz/DBTg2i6O0bRVL9mxXN+V795xMCuwpw6viW1SCu66Otg1cdSxjJfJJpCeQRUCjKcWFly5LvqsvgDk2ugTA0qUF1CAB3RU6oBr9V0bE05BLhIPQP9hiJG+GOjTAzfhAFlCZH4u8Xe5plTBoAqHo6d/Q+ByRJEhwhwqjiRf/8+ZFSaIMLDZ169jgzG+4O/UnzC8SkEOzC2BR0W4Va8JlYu9ENzFlwEl425ve+7uQExnciaH8dXlRhrwy8SmhRcsV0c4iwcP7GQz0ab9PVMNXbML4U41K5nBgWiNybsGeG1BN8xtm3w8OrYxJp1rNzNIbN1vgiIkKH+BW1JFuD6TtmieLlXIEPUwv6WO0wweyGB6VL9iAzI48iB9J9UM/MvBM3gnDBmOvEebEv27QT73PLaZLhvU50vwJwKA+rflttCN8ZKlSt4onHJ8E7msrJd144KPS1QelLGIB0u59Q6/YlhH36dv809Oo+Vh0j4Dej4YjNWiT4/dUPE+V7VvXBvBejtYWaa5E8/MPhV5mb0kmqCOFSAJoPxwJ4rhefBluughSaQlDhw0K607bXX/IOJQVI/g X-Forefront-Antispam-Report: CIP:165.204.84.17; CTRY:US; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:SATLEXMB04.amd.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230040)(36860700013)(82310400026)(376014)(1800799024); DIR:OUT; SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Sep 2024 10:39:05.2502 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 67b6a601-8a8f-4477-f21c-08dcd24df591 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17]; Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF00002324.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR12MB8448 Relocate cdns_i2c_runtime_suspend, cdns_i2c_runtime_resume and cdns_i2c_init functions to avoid prototype statement in atomic mode changes. Signed-off-by: Manikanta Guntupalli Reviewed-by: Andi Shyti --- Changes for V2: Added review signature. --- drivers/i2c/busses/i2c-cadence.c | 120 +++++++++++++++---------------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/drivers/i2c/busses/i2c-cadence.c b/drivers/i2c/busses/i2c-cadence.c index 87b9ba95b2e1..d3f6ca2cb4d7 100644 --- a/drivers/i2c/busses/i2c-cadence.c +++ b/drivers/i2c/busses/i2c-cadence.c @@ -228,6 +228,66 @@ struct cdns_platform_data { #define to_cdns_i2c(_nb) container_of(_nb, struct cdns_i2c, \ clk_rate_change_nb) +/** + * cdns_i2c_init - Controller initialisation + * @id: Device private data structure + * + * Initialise the i2c controller. + * + */ +static void cdns_i2c_init(struct cdns_i2c *id) +{ + cdns_i2c_writereg(id->ctrl_reg, CDNS_I2C_CR_OFFSET); + /* + * Cadence I2C controller has a bug wherein it generates + * invalid read transaction after HW timeout in master receiver mode. + * HW timeout is not used by this driver and the interrupt is disabled. + * But the feature itself cannot be disabled. Hence maximum value + * is written to this register to reduce the chances of error. + */ + cdns_i2c_writereg(CDNS_I2C_TIMEOUT_MAX, CDNS_I2C_TIME_OUT_OFFSET); +} + +/** + * cdns_i2c_runtime_suspend - Runtime suspend method for the driver + * @dev: Address of the platform_device structure + * + * Put the driver into low power mode. + * + * Return: 0 always + */ +static int __maybe_unused cdns_i2c_runtime_suspend(struct device *dev) +{ + struct cdns_i2c *xi2c = dev_get_drvdata(dev); + + clk_disable(xi2c->clk); + + return 0; +} + +/** + * cdns_i2c_runtime_resume - Runtime resume + * @dev: Address of the platform_device structure + * + * Runtime resume callback. + * + * Return: 0 on success and error value on error + */ +static int __maybe_unused cdns_i2c_runtime_resume(struct device *dev) +{ + struct cdns_i2c *xi2c = dev_get_drvdata(dev); + int ret; + + ret = clk_enable(xi2c->clk); + if (ret) { + dev_err(dev, "Cannot enable clock.\n"); + return ret; + } + cdns_i2c_init(xi2c); + + return 0; +} + /** * cdns_i2c_clear_bus_hold - Clear bus hold bit * @id: Pointer to driver data struct @@ -1158,23 +1218,6 @@ static int cdns_i2c_clk_notifier_cb(struct notifier_block *nb, unsigned long } } -/** - * cdns_i2c_runtime_suspend - Runtime suspend method for the driver - * @dev: Address of the platform_device structure - * - * Put the driver into low power mode. - * - * Return: 0 always - */ -static int __maybe_unused cdns_i2c_runtime_suspend(struct device *dev) -{ - struct cdns_i2c *xi2c = dev_get_drvdata(dev); - - clk_disable(xi2c->clk); - - return 0; -} - static int __maybe_unused cdns_i2c_suspend(struct device *dev) { struct cdns_i2c *xi2c = dev_get_drvdata(dev); @@ -1187,49 +1230,6 @@ static int __maybe_unused cdns_i2c_suspend(struct device *dev) return 0; } -/** - * cdns_i2c_init - Controller initialisation - * @id: Device private data structure - * - * Initialise the i2c controller. - * - */ -static void cdns_i2c_init(struct cdns_i2c *id) -{ - cdns_i2c_writereg(id->ctrl_reg, CDNS_I2C_CR_OFFSET); - /* - * Cadence I2C controller has a bug wherein it generates - * invalid read transaction after HW timeout in master receiver mode. - * HW timeout is not used by this driver and the interrupt is disabled. - * But the feature itself cannot be disabled. Hence maximum value - * is written to this register to reduce the chances of error. - */ - cdns_i2c_writereg(CDNS_I2C_TIMEOUT_MAX, CDNS_I2C_TIME_OUT_OFFSET); -} - -/** - * cdns_i2c_runtime_resume - Runtime resume - * @dev: Address of the platform_device structure - * - * Runtime resume callback. - * - * Return: 0 on success and error value on error - */ -static int __maybe_unused cdns_i2c_runtime_resume(struct device *dev) -{ - struct cdns_i2c *xi2c = dev_get_drvdata(dev); - int ret; - - ret = clk_enable(xi2c->clk); - if (ret) { - dev_err(dev, "Cannot enable clock.\n"); - return ret; - } - cdns_i2c_init(xi2c); - - return 0; -} - static int __maybe_unused cdns_i2c_resume(struct device *dev) { struct cdns_i2c *xi2c = dev_get_drvdata(dev); From patchwork Wed Sep 11 10:38:52 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Manikanta Guntupalli X-Patchwork-Id: 827554 Received: from NAM04-DM6-obe.outbound.protection.outlook.com (mail-dm6nam04on2077.outbound.protection.outlook.com [40.107.102.77]) (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 546281802DD; Wed, 11 Sep 2024 10:39:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.102.77 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726051163; cv=fail; b=cqYGqlOQBgbSENtNrehYONoQqVvQM3odt+27ja7mDncnOg1hhH1BbunfPqwxHt1t4QKhK+sX7C4zqP1S6WUIpTl7V9X+ibfIV7A9rOibSWUzD0bHLQELrXXDJXIsGmoNqhptaKhWBQ2lEv5ZM7uCJGAhqnom8K/mLkskoYdBEC4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726051163; c=relaxed/simple; bh=+wkzh+NtJWiOS0/VMQLr5fNvPZYwb9AiyIiHahxhMGg=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ql6s2RIefxoga0Uh+I7YWrht9TaS+qBAKO4Z+6ZwYBYzrJrJh7nPOsQ9Eoai9azyJdOwJ91OACi4O9LTd+pAAaIqJoEr1suOjypPfa8RHquhqtAkaz48zQGtai8M1mgy9EHBdT7stH0FjMDGW7voKxhFFNnc9ATBM/xuhPQbDLo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=R+Si6XT5; arc=fail smtp.client-ip=40.107.102.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="R+Si6XT5" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=csApQnEHh9NYypbkSB8lL3YNCas/WxW2frvotqzCYJ5/hJFNqp0Pg1zhcU/27pUK42EPIZ9pPqg9XAqtbm8SD3/YArl7z+K/9fGGkDmRsFHJVtt5ZbKnGZIqEKjGMSgegFixpwJ5mM4j8NaCpPYaSLeN+dEwX5OEB+eDGUmocIqBtV/MBS2fgOqjrkQ/C/kCBduSsJaOiREqhResos0RiVx05TkN0Z5EkoPhHxtqjkTCubgVqVtqp/wSVHSEKUUK0Thez67Y3RnVaU46dBgjWIRYoPzYgyBY8yfr8NRXxBezbZCQRdiXAYnbWvUidfw6FIZhcbrP/iIftUL+V6qWuA== 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=+lieyS3zhN+2TrfPn0LCyk9zmNfPncEGKS4E6VL1Lcw=; b=S2ta88dDUHn1XiizEZgTzunS3F4mPeF4t+MBb+VTyGImtB8z8hjQI1aeg5ibpKnda79JQ2anuZInA12qWlaYp2+NfDYR9QJQ3Ukc6ES2/TSTnRM8Q0tJAVimcQBypytuYmm20lLR2cqQbQF0FRvdTMn6l3ZpwmgzptZuD/0+sHVCeBqc8crdin9jzSfLa1v9XfYSqVaiH2qBNr4MXgxE8q9UIpeAyZuutB2LKgfFSbea5BzI0CrITuNwTDRlwG7Z5eMNYLs2i05PGfXH+8t6ITQvzqJlGVBOpRwKndNSbAbybCBIU9FR6X1rPSG3ER9XsL1o1+zHYDhSM1gxWaYGCA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+lieyS3zhN+2TrfPn0LCyk9zmNfPncEGKS4E6VL1Lcw=; b=R+Si6XT5ulCIMf7yvou8qos/74IojWPHEvPAsFjktn7AsXGD9hbfOUbsLF3zfzuamVieYCmSpkh8dy6XDnrZxSQw6jD3DQP6eC8cVnrw98rkvWAClKnXrrMqJZKwaS7pfdp8eEnneg0GGAOYgeATIix4/903G3HkSAv5kVXyXUQ= Received: from BYAPR07CA0007.namprd07.prod.outlook.com (2603:10b6:a02:bc::20) by SJ1PR12MB6361.namprd12.prod.outlook.com (2603:10b6:a03:455::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7939.25; Wed, 11 Sep 2024 10:39:16 +0000 Received: from SJ1PEPF00002321.namprd03.prod.outlook.com (2603:10b6:a02:bc:cafe::f2) by BYAPR07CA0007.outlook.office365.com (2603:10b6:a02:bc::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7719.32 via Frontend Transport; Wed, 11 Sep 2024 10:39:16 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by SJ1PEPF00002321.mail.protection.outlook.com (10.167.242.91) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.7918.13 via Frontend Transport; Wed, 11 Sep 2024 10:39:16 +0000 Received: from SATLEXMB04.amd.com (10.181.40.145) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Wed, 11 Sep 2024 05:39:14 -0500 Received: from xhdsneeli40.xilinx.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server id 15.1.2507.39 via Frontend Transport; Wed, 11 Sep 2024 05:39:11 -0500 From: Manikanta Guntupalli To: , , , , , CC: , , , , Manikanta Guntupalli Subject: [PATCH V2 3/3] i2c: cadence: Add atomic transfer support for controller version 1.4 Date: Wed, 11 Sep 2024 16:08:52 +0530 Message-ID: <20240911103852.162234-4-manikanta.guntupalli@amd.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240911103852.162234-1-manikanta.guntupalli@amd.com> References: <20240911103852.162234-1-manikanta.guntupalli@amd.com> Precedence: bulk X-Mailing-List: linux-i2c@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Received-SPF: None (SATLEXMB04.amd.com: manikanta.guntupalli@amd.com does not designate permitted sender hosts) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF00002321:EE_|SJ1PR12MB6361:EE_ X-MS-Office365-Filtering-Correlation-Id: 501ef58d-c553-44a5-94e1-08dcd24dfbff X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|1800799024|82310400026|36860700013|376014; X-Microsoft-Antispam-Message-Info: Z5V/OAlk/nAFtcAgeRriST/eY5hhSEWQRA6vNn+kP7Jk2UqwqHImtB0JXrkrdONhzabTcoE5s7AzxmuMs4xomuoyCsjsDKIjXqtvXgVY9pClrAgcx+5vXWraS4kZ+0RsXdAFMSuzoGxBfPBp+L4y1FzQ5GR+u6zedzZCNhW0I/h9db1n6dKN07DDVZILo301FQl3TOB3RegMSHPKlJQGhBGjlz1JCfbzeo24iUsDkU3Ax6ttGBbwUhTrVETYlNP6pBH4SYwZHlHVStZWxeYdCIprQqcJULiOeTN3GLsltp/MiXAsLToLek4OaH+6bEeZlSI4I549Z+dy3lY/Ws/+iS0qq4lhre0BIGmJx3iNSw8a9ZAfF7VcBTRRJkldiWxRP6M8zfiuUvknHVvGYYRnijm/9mNKsZYv/01ODGlKqAKGmlBl9ykY7NljOE8Buy7+LpKZdQsjtuDvCL7p/YDI80N0OnU7MP4zhUBwcALr893Dz+beYG/9agBWqx4Bz5XniAU8vzx/s+Vifx1CLgAyHMmZEcHtk41x4/nKfazapuedB4H5Zvt9lFeYmPFDJ26SpDh087+65I371zQX1Qja2H3dJko1JnIBf00sUhhgLO6JOwuotiLWwt3IBDdakcchQ7dyTChfnLGZBbLITvGBJKnRaA+fnRmBNyyEPmTl5dD3Aji+h6OJE+A061brv3zmvYlEEkxTQZ4nPFuUnp9JIsQgcwGufoONz5mcpOa1WwqO/4BTEAoMxGZ3NwWwv29t6pH+R5fquII8iTsw9fz3mMbFMAfLSFoyDnxMVG1iKAI8GaWgwB4JZ4tqCLvp/rDfkmGt1Qh853NwvnDOH9Y5oOYMZ5pKyzElnXPdTLr0dtNBqFOpRjp9jRntUV0+YplSVZzg6czKzbVDpz+HosahCZ8YsAXwfwZreMTEiIiUAbVLWnHY2PCxN+H5DopQ+XuUC4tosKx71c8ONlRHm7jQsqHwpHICfUKGUsSsG9Bgrf7U/s1I/CW1KDyN3NXOqh2yE1A8LxwUB5R9LWCeqwnGll6sZxBThW+gVVaKtK+yRe3r7SWJwnnx6M211zqHobS+sCtV/CIGWsr7tyJXjg8H/SGz3eFK5R6h3+fnqgyX/9Kr96QBM8T34Upzqv/hS5F/4xFHPhY6Y/D3kiLVH9P8st+4dWhP3I8jelx9L8RZNBN/U8OZNUxyDgm3GzZRyuiRVEm65g3pNk/O4NST63T9Ce4zfzu++uFXDgIVIUS8YV3HdWh8p2NwDiR0eEL41gSz4TLOkOOTOQvHkHvplKcV6ze0p5qIkYMHNkgwfW6SHXqQz3QSMjP1jbDsS3c2GcGQtu8zGxjUO5DnA1+i66HeLAhFSn003/ZjvX4gJM4hFHiTzG5oO2AGucsIMunLjlFh9hl2/7pS9iamDRmmkVorasH/JfiCxe3jfpkI0AgJ9orMDIL1yuheePUIMC5h9g7G X-Forefront-Antispam-Report: CIP:165.204.84.17; CTRY:US; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:SATLEXMB04.amd.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230040)(1800799024)(82310400026)(36860700013)(376014); DIR:OUT; SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Sep 2024 10:39:16.0351 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 501ef58d-c553-44a5-94e1-08dcd24dfbff X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17]; Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF00002321.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ1PR12MB6361 Rework the read and write code paths in the driver to support operation in atomic contexts in master mode. This change does not apply to slave mode because there is no way to handle interruptions in that context. Adjust the message timeout to include some extra time. For non-atomic contexts, 500 ms is added to the timeout. For atomic contexts, 2000 ms is added because transfers happen in polled mode, requiring more time to account for the polling overhead. Similar changes have been implemented in other drivers, including: commit 3a5ee18d2a32 ("i2c: imx: implement master_xfer_atomic callback") commit 445094c8a9fb ("i2c: exynos5: add support for atomic transfers") commit ede2299f7101 ("i2c: tegra: Support atomic transfers") commit fe402bd09049 ("i2c: meson: implement the master_xfer_atomic callback") Signed-off-by: Manikanta Guntupalli --- Changes for V2: Simplify the return statement of cdns_i2c_error_check(). Update description. Remove unnecessary typecast. Update if-else to reduce a level of indentation. Expand *id->p_recv_buf++ to have clear operation precedence. Move variables to inside while block in cdns_i2c_mrecv_atomic() and cdns_i2c_msend_rem_atomic(). --- drivers/i2c/busses/i2c-cadence.c | 207 ++++++++++++++++++++++++++++--- 1 file changed, 192 insertions(+), 15 deletions(-) diff --git a/drivers/i2c/busses/i2c-cadence.c b/drivers/i2c/busses/i2c-cadence.c index e689448d229f..ee2f32cd54ce 100644 --- a/drivers/i2c/busses/i2c-cadence.c +++ b/drivers/i2c/busses/i2c-cadence.c @@ -129,6 +129,7 @@ #define CDNS_I2C_BROKEN_HOLD_BIT BIT(0) #define CDNS_I2C_POLL_US 100000 +#define CDNS_I2C_POLL_US_ATOMIC 10 #define CDNS_I2C_TIMEOUT_US 500000 #define cdns_i2c_readreg(offset) readl_relaxed(id->membase + offset) @@ -189,6 +190,8 @@ enum cdns_i2c_slave_state { * @slave_state: I2C Slave state(idle/read/write). * @fifo_depth: The depth of the transfer FIFO * @transfer_size: The maximum number of bytes in one transfer + * @atomic: Mode of transfer + * @err_status_atomic: Error status in atomic mode */ struct cdns_i2c { struct device *dev; @@ -219,6 +222,8 @@ struct cdns_i2c { #endif u32 fifo_depth; unsigned int transfer_size; + bool atomic; + int err_status_atomic; }; struct cdns_platform_data { @@ -256,7 +261,7 @@ static void cdns_i2c_init(struct cdns_i2c *id) * * Return: 0 always */ -static int __maybe_unused cdns_i2c_runtime_suspend(struct device *dev) +static int cdns_i2c_runtime_suspend(struct device *dev) { struct cdns_i2c *xi2c = dev_get_drvdata(dev); @@ -273,7 +278,7 @@ static int __maybe_unused cdns_i2c_runtime_suspend(struct device *dev) * * Return: 0 on success and error value on error */ -static int __maybe_unused cdns_i2c_runtime_resume(struct device *dev) +static int cdns_i2c_runtime_resume(struct device *dev) { struct cdns_i2c *xi2c = dev_get_drvdata(dev); int ret; @@ -621,6 +626,89 @@ static irqreturn_t cdns_i2c_isr(int irq, void *ptr) return cdns_i2c_master_isr(ptr); } +static bool cdns_i2c_error_check(struct cdns_i2c *id) +{ + unsigned int isr_status; + + id->err_status = 0; + + isr_status = cdns_i2c_readreg(CDNS_I2C_ISR_OFFSET); + cdns_i2c_writereg(isr_status & CDNS_I2C_IXR_ERR_INTR_MASK, CDNS_I2C_ISR_OFFSET); + + id->err_status = isr_status & CDNS_I2C_IXR_ERR_INTR_MASK; + + return !!id->err_status; +} + +static void cdns_i2c_mrecv_atomic(struct cdns_i2c *id) +{ + while (id->recv_count > 0) { + bool updatetx; + + /* + * Check if transfer size register needs to be updated again for a + * large data receive operation. + */ + updatetx = id->recv_count > id->curr_recv_count; + + while (id->curr_recv_count > 0) { + if (cdns_i2c_readreg(CDNS_I2C_SR_OFFSET) & CDNS_I2C_SR_RXDV) { + *id->p_recv_buf = cdns_i2c_readreg(CDNS_I2C_DATA_OFFSET); + id->p_recv_buf++; + id->recv_count--; + id->curr_recv_count--; + + /* + * Clear the hold bit that was set for FIFO control, + * if the remaining RX data is less than or equal to + * the FIFO depth, unless a repeated start is selected. + */ + if (id->recv_count <= id->fifo_depth && !id->bus_hold_flag) + cdns_i2c_clear_bus_hold(id); + } + if (cdns_i2c_error_check(id)) + return; + if (cdns_is_holdquirk(id, updatetx)) + break; + } + + /* + * The controller sends NACK to the slave/target when transfer size + * register reaches zero without considering the HOLD bit. + * This workaround is implemented for large data transfers to + * maintain transfer size non-zero while performing a large + * receive operation. + */ + if (cdns_is_holdquirk(id, updatetx)) { + /* wait while fifo is full */ + while (cdns_i2c_readreg(CDNS_I2C_XFER_SIZE_OFFSET) != + (id->curr_recv_count - id->fifo_depth)) + ; + + /* + * Check number of bytes to be received against maximum + * transfer size and update register accordingly. + */ + if ((id->recv_count - id->fifo_depth) > + id->transfer_size) { + cdns_i2c_writereg(id->transfer_size, + CDNS_I2C_XFER_SIZE_OFFSET); + id->curr_recv_count = id->transfer_size + + id->fifo_depth; + } else { + cdns_i2c_writereg(id->recv_count - + id->fifo_depth, + CDNS_I2C_XFER_SIZE_OFFSET); + id->curr_recv_count = id->recv_count; + } + } + } + + /* Clear hold (if not repeated start) */ + if (!id->recv_count && !id->bus_hold_flag) + cdns_i2c_clear_bus_hold(id); +} + /** * cdns_i2c_mrecv - Prepare and start a master receive operation * @id: pointer to the i2c device structure @@ -715,7 +803,34 @@ static void cdns_i2c_mrecv(struct cdns_i2c *id) cdns_i2c_writereg(addr, CDNS_I2C_ADDR_OFFSET); } - cdns_i2c_writereg(CDNS_I2C_ENABLED_INTR_MASK, CDNS_I2C_IER_OFFSET); + if (!id->atomic) + cdns_i2c_writereg(CDNS_I2C_ENABLED_INTR_MASK, CDNS_I2C_IER_OFFSET); + else + cdns_i2c_mrecv_atomic(id); +} + +static void cdns_i2c_msend_rem_atomic(struct cdns_i2c *id) +{ + while (id->send_count) { + unsigned int avail_bytes; + unsigned int bytes_to_send; + + avail_bytes = id->fifo_depth - cdns_i2c_readreg(CDNS_I2C_XFER_SIZE_OFFSET); + if (id->send_count > avail_bytes) + bytes_to_send = avail_bytes; + else + bytes_to_send = id->send_count; + + while (bytes_to_send--) { + cdns_i2c_writereg((*id->p_send_buf++), CDNS_I2C_DATA_OFFSET); + id->send_count--; + } + if (cdns_i2c_error_check(id)) + return; + } + + if (!id->send_count && !id->bus_hold_flag) + cdns_i2c_clear_bus_hold(id); } /** @@ -778,7 +893,10 @@ static void cdns_i2c_msend(struct cdns_i2c *id) cdns_i2c_writereg(id->p_msg->addr & CDNS_I2C_ADDR_MASK, CDNS_I2C_ADDR_OFFSET); - cdns_i2c_writereg(CDNS_I2C_ENABLED_INTR_MASK, CDNS_I2C_IER_OFFSET); + if (!id->atomic) + cdns_i2c_writereg(CDNS_I2C_ENABLED_INTR_MASK, CDNS_I2C_IER_OFFSET); + else if (id->send_count > 0) + cdns_i2c_msend_rem_atomic(id); } /** @@ -818,7 +936,8 @@ static int cdns_i2c_process_msg(struct cdns_i2c *id, struct i2c_msg *msg, id->p_msg = msg; id->err_status = 0; - reinit_completion(&id->xfer_done); + if (!id->atomic) + reinit_completion(&id->xfer_done); /* Check for the TEN Bit mode on each msg */ reg = cdns_i2c_readreg(CDNS_I2C_CR_OFFSET); @@ -840,14 +959,31 @@ static int cdns_i2c_process_msg(struct cdns_i2c *id, struct i2c_msg *msg, /* Minimal time to execute this message */ msg_timeout = msecs_to_jiffies((1000 * msg->len * BITS_PER_BYTE) / id->i2c_clk); - /* Plus some wiggle room */ - msg_timeout += msecs_to_jiffies(500); + + /* + * Plus some wiggle room. + * For non-atomic contexts, 500 ms is added to the timeout. + * For atomic contexts, 2000 ms is added because transfers happen in polled + * mode, requiring more time to account for the polling overhead. + */ + if (!id->atomic) + msg_timeout += msecs_to_jiffies(500); + else + msg_timeout += msecs_to_jiffies(2000); if (msg_timeout < adap->timeout) msg_timeout = adap->timeout; - /* Wait for the signal of completion */ - time_left = wait_for_completion_timeout(&id->xfer_done, msg_timeout); + if (!id->atomic) { + /* Wait for the signal of completion */ + time_left = wait_for_completion_timeout(&id->xfer_done, msg_timeout); + } else { + /* 0 is success, -ETIMEDOUT is error */ + time_left = !readl_poll_timeout_atomic(id->membase + CDNS_I2C_ISR_OFFSET, + reg, (reg & CDNS_I2C_IXR_COMP), + CDNS_I2C_POLL_US_ATOMIC, msg_timeout); + } + if (time_left == 0) { cdns_i2c_master_reset(adap); return -ETIMEDOUT; @@ -876,11 +1012,16 @@ static int cdns_i2c_master_common_xfer(struct i2c_adapter *adap, bool hold_quirk; /* Check if the bus is free */ - - ret = readl_relaxed_poll_timeout(id->membase + CDNS_I2C_SR_OFFSET, - reg, - !(reg & CDNS_I2C_SR_BA), - CDNS_I2C_POLL_US, CDNS_I2C_TIMEOUT_US); + if (!id->atomic) + ret = readl_relaxed_poll_timeout(id->membase + CDNS_I2C_SR_OFFSET, + reg, + !(reg & CDNS_I2C_SR_BA), + CDNS_I2C_POLL_US, CDNS_I2C_TIMEOUT_US); + else + ret = readl_poll_timeout_atomic(id->membase + CDNS_I2C_SR_OFFSET, + reg, + !(reg & CDNS_I2C_SR_BA), + CDNS_I2C_POLL_US_ATOMIC, CDNS_I2C_TIMEOUT_US); if (ret) { ret = -EAGAIN; if (id->adap.bus_recovery_info) @@ -926,7 +1067,7 @@ static int cdns_i2c_master_common_xfer(struct i2c_adapter *adap, return ret; /* Report the other error interrupts to application */ - if (id->err_status) { + if (id->err_status || id->err_status_atomic) { cdns_i2c_master_reset(adap); if (id->err_status & CDNS_I2C_IXR_NACK) @@ -992,6 +1133,41 @@ static int cdns_i2c_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, return ret; } +/** + * cdns_i2c_master_xfer_atomic - The i2c transfer function in atomic mode + * @adap: pointer to the i2c adapter driver instance + * @msgs: pointer to the i2c message structure + * @num: the number of messages to transfer + * + * Return: number of msgs processed on success, negative error otherwise + */ +static int cdns_i2c_master_xfer_atomic(struct i2c_adapter *adap, struct i2c_msg *msgs, + int num) +{ + int ret; + struct cdns_i2c *id = adap->algo_data; + + ret = cdns_i2c_runtime_resume(id->dev); + if (ret) + return ret; + + if (id->quirks & CDNS_I2C_BROKEN_HOLD_BIT) { + dev_warn(id->adap.dev.parent, + "Atomic xfer not supported for version 1.0\n"); + return 0; + } + + id->atomic = true; + ret = cdns_i2c_master_common_xfer(adap, msgs, num); + if (!ret) + ret = num; + + id->atomic = false; + cdns_i2c_runtime_suspend(id->dev); + + return ret; +} + /** * cdns_i2c_func - Returns the supported features of the I2C driver * @adap: pointer to the i2c adapter structure @@ -1056,6 +1232,7 @@ static int cdns_unreg_slave(struct i2c_client *slave) static const struct i2c_algorithm cdns_i2c_algo = { .master_xfer = cdns_i2c_master_xfer, + .master_xfer_atomic = cdns_i2c_master_xfer_atomic, .functionality = cdns_i2c_func, #if IS_ENABLED(CONFIG_I2C_SLAVE) .reg_slave = cdns_reg_slave,