From patchwork Mon Feb 26 05:54:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Carlos Song X-Patchwork-Id: 13571313 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 4CC1EC48BF6 for ; Mon, 26 Feb 2024 05:54:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=IMIaZHzgGIvn2IzBJ9LtZI7iGxy/n6wEvCYsOefgP4s=; b=kUp69cDVrEeYvA qYfE5syReNaYFTsw4kpwC6JK0nI4qCRUDrQ1UO+RVNYv3PZIKvSvDZ/m0YCLNe3JodRDP1C2/pk1G jyu3Wdkz/nMe3cLoXdf17TaKVWD7CDNThmhsP+hTCQ13T46lsDX27Cu1q64612w+DcJO81nD8/+Jj IDH8wn1rL+jKziOXPkBFHX+Sfbwy04+o7u5QMGbMxdcThLEhkgdb2UCpheqJF7iL9VhF85qYZ1yit ezYhlVvxD4dXNyIorZTcJF0fOE7/S09TYZFIzjmq9xZ+ruoBApDRpxIXF4lJOxMqjdHG/u9Ek9pHr KZ/LH+1nwoZ+zqwXon0g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1reTwe-0000000GaTS-0YsU; Mon, 26 Feb 2024 05:54:32 +0000 Received: from mail-am6eur05on20600.outbound.protection.outlook.com ([2a01:111:f403:2612::600] helo=EUR05-AM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1reTwc-0000000GaRW-0nID for linux-arm-kernel@lists.infradead.org; Mon, 26 Feb 2024 05:54:31 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=UH75WvNf2WGfdBm9LstA9qJCWp3PJIF1kUzztLxQPooLcYoNvnigxRtSc0mMvEFF5oBDTNf1luNZzbsrP/Ry1W87jozGCFvXkvRhMdCcqi3cb5M+F8UCy+a8DxTVj7PLnkWh/hpcoR+nvq72wnFENT7VAGZq/+u1iv4eEFKKLx9hlLaSpVe6vmUL+HgIGTuUpl43/Q+HhEEGnez8q8Rq7pASqABNYDxSZyXWiLkgXZ/rm9LWYyoJl4K1vAQCGuwWsAcuSUdRqs3ynNoe2zZyWT9OKWh+B+V7bq+cj+jCNa8ccyz9PnQhpxq+PSepqXwSnOafydRKp8p/6T56PpxZTw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=BYp0lvzJm1hP5C1USdVkpI1UKlYu3pQ3aRAiZNbMsJA=; b=MCWptj5vHbn1sDXbotJY7WmWA4xWMrwwqiTtvSSOVfSR7WrxiKAcu1Wrv334MhLvvyvYErDGcegAhHPfnUjyj3vGtNzadafXOMtZaYVrpcD6fI6bLdtXASWb3iYm1vjN8xqaAohlGh8EHrgQVJNEx21CkQB6U0EbG5OZ7ffjIKjSBpQceJXWDBr3snFa8thpWE6ceQEDuQZrRYwzqxdrD94SH5z+7Bl/UizIpMpW1uQUlNO7qQHTH0L1ujqk1PU+8PaJh28FX6gpHsXYbBF7mC5WSVwLGHeaai8Y+msDsR65gJS6o5nJpQYSy1CYk8u2qf/kYfZKMdheMBBL1NbqWQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=BYp0lvzJm1hP5C1USdVkpI1UKlYu3pQ3aRAiZNbMsJA=; b=eSZ3zZ5LBT3mrcJP3Mqj23HYKZy2l3E0JtQE4W2jSiNLciuIeaBOJFfXDa30s/f4TSLW2OdcEzuhVcW8MszlNMIAF9wh0pTGFrTDu5OXWQ0nWYGNzg0BXhK6qyttG+1WgHz8fUWx76QJnjuwyA3YWoyFXd19yO6yHqam5gsZwkU= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from VI1PR04MB5005.eurprd04.prod.outlook.com (2603:10a6:803:57::30) by DU2PR04MB9068.eurprd04.prod.outlook.com (2603:10a6:10:2f3::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7316.34; Mon, 26 Feb 2024 05:54:23 +0000 Received: from VI1PR04MB5005.eurprd04.prod.outlook.com ([fe80::e906:b7e4:26c0:5ed9]) by VI1PR04MB5005.eurprd04.prod.outlook.com ([fe80::e906:b7e4:26c0:5ed9%7]) with mapi id 15.20.7316.034; Mon, 26 Feb 2024 05:54:23 +0000 From: carlos.song@nxp.com To: andi.shyti@kernel.org, aisheng.dong@nxp.com, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com Cc: carlos.song@nxp.com, xiaoning.wang@nxp.com, haibo.chen@nxp.com, linux-imx@nxp.com, linux-i2c@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH] i2c: imx-lpi2c: add generic GPIO recovery for LPI2C Date: Mon, 26 Feb 2024 13:54:18 +0800 Message-Id: <20240226055418.3314913-1-carlos.song@nxp.com> X-Mailer: git-send-email 2.34.1 X-ClientProxiedBy: SG2PR02CA0041.apcprd02.prod.outlook.com (2603:1096:3:18::29) To VI1PR04MB5005.eurprd04.prod.outlook.com (2603:10a6:803:57::30) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI1PR04MB5005:EE_|DU2PR04MB9068:EE_ X-MS-Office365-Filtering-Correlation-Id: ba1431cb-ba31-4e20-7ae6-08dc368f61cf X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ZJ+8GGe4WUPjpxZki7YcQDk242LNZGtpxNkwNI8JlREfpF3fXZpBrbZCDTkRGtKfp1dZQ4J643XpZayOd8ayVZo97Zv9nbSI+69Li/4JRbhbNl50N8O3jimgu6D0WNvD7bdCUBo4exx0MVRrEU2EeidNXiYL6TT4C54vsjIY3eobSg9NKSKVUcLG9Kzo4U4yLvtSTQles1QHl4G8XO1Et4sqDqmcvXrnm5e2jLPq9sLlFnOHl3tVWFjgc+yA4N9AjYeqTFcb5+9YC6R+9ickLYp//GhV5ICwckGi2gBLuXchD5KVB8bPy1vbeKVbiukm65gwT3GxdgMqvDcT8Wkz5JjXuZn5eq6sFX/dLIxJDOIYnRu/UMhQyGXJZCfIJ/jNdyHTn7D9ih3NLuv3UMmeFrqIoPmtZ8pEmjF0L58l/qOIbsD1CK1CTp2xFbgsGVQsFnsEPkpIRoichU6N/TXm0AWYeOYTpCkluSZ69XMWlG6Cp0ttc30EggCaAH1zeuKHKInzy8NtTxnO1vrhf4nFJy3ES5xOv6tAH41Mi+A5TXaCEyjJkvLo3B5jN3GLu8AUntEQfGxYCYtNpv7ENdVLJMbqDU3AeB1VF9NMyv/8Id+rGPJL5JKJ/hnQj77TdBF3ZtwZp+2RcrGBMXjk0Oyffsh1kGsxAbkxUyK1y/MJ6xuQOiI+9nhLcAX2McHnCBkoLHhwPCcInSM60P95Ina8Z5YxxD62q8ZF+k7GYLwQwBQ= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI1PR04MB5005.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(38350700005);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: +42pfFuE/RA06d4VMApfRZ6udx2SXm+kuI6j1G5m6LNDgFGn6Iz0wIa6PUV82Np4HzuSkUUSc2TUD8NQSWSbT99RX9m/TqtyzNIGfglDQR2zt2AW/nUjqfcScPIjlpDycE1oFp+gsiywxFf0z5f9mtCht/GoOe4walBt2ZbDzGt1ULHSzdATgw0SzVW9G2bThwV8AQ9csEsx+PYlxtDvja/I4dUcpvZv2ebaILFc4+QmMD4yYG52mCQ9QsroB1GMFG63gZkzjrnNhVe8fxTI/iMk1PlwyEzWe7+pXLt2fxnSiypRyoD2JTHzmlbvaC75/5ZAIaSrE2he5W9L9FRSrIcHpkINR2WuqoZWOl9yUeLLSF4Xolzio7bkl9sJnpOdLvsAVFLvlpWwtmaEVBSADph+K2oz9W8M02UfscDAS9bARUcCEAWZH+mz9BNCVAe9aG+EfsII3OnZV4GQ2jEEFsb6+/L9Sm2RU/UyPS+c7arLDWTLLavlJI49W730faHt4eAsR6fFAeXsBX0M5pA14MjH52czF4qPZJyMRDZM3z2tCLUyHMWFg2ktFrh8ZuLJ3IFqLv9Nb94XiHq5lRLWD8WFPdMkkta4jfMHNL7gwLqagSeoudXb/0acclGSEI7vsBcubxXi3AU8hFfEQNu1qNEMrT7RzpE/nhNbC1yJwOvbVm8azDkgpBUIPIhyZu1gwejSPPKCQOnZ6I9Egm/exql2XOjZBFKWgNViTqp4xeRD8WDaPnYpVmuvx4yqLANlYXouDGMXXJFhY6eRHQtvOu1uRCC5O1Hkikb0PmB2vKX311r0N6qDv+YOUSIG9F0tOwtbdaZVt+0jhuOSUa/ZIdTeIrk734/aEAVELN5kNS1yip0sqM9Ju2xpn6NC4hokOb1k9rsL2we9C9/t/0qzXLvPyB3/n0tsMQmD7kMRd9FnFjb06uAtNdexoQjXNQkp3MPOzYv3qo+5ciOKaFcGaWa40QbWocBjQsLY0elV1JFGiRNOzsQLmUCaa8V+BUQ9b2LK2x2MhZJirYRcSw1F07+BYEUUVkPuyGkaJ6KFmd/U8BRoek/a+8k2l+5/yKfwUlL6jCFnALQJPIgASacd4SEGiGOtitk9wcscRpoLIX40E+D3dQnxmcja+5KaNS2nfjqe+NsSBJ0U+SXjU8L2F00938c9mJsYEP8XcpanogWCmB01x2wYswswhIAf6npqyeBtj6b6WAzlNTp7zerFmpVlrXhUsg7E+nyXI9WLzkj78ZBKbXF2u4Xa7uHQP1/5vrGpA4Yq94FmcdB+q6fgEpq5tARatoEJgc7r6g2ZOB2xa9Sn5uMClhT0fHDA+vZaRYQZGvxsb/BQnM+2Hh0GK9fcyZPUfPVBSSVQNHvn9C9Xd6ftWxy8eTdFQ3DwTTlEwnQ+ShKH6JIasKcFCaEu0CY5o51nArZJpplTr6MGnHBS/3M5Q4oLctf2/C6dMxvUY06mSWpHxqR9kVO2r+owBOhWtDQn74RrcO40VY0AMjbRhKsTyZVCWGR7OSPlrgc85PaHvOitI87UPdf+SVKCOvfOT45+yAEx1gI12ZNtHGMx823QpGBWx063byWPKdKc X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: ba1431cb-ba31-4e20-7ae6-08dc368f61cf X-MS-Exchange-CrossTenant-AuthSource: VI1PR04MB5005.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Feb 2024 05:54:23.0739 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: cKcws288pTMGanAELZ67pOVTH+5uePeZrGnH4Dqz1OZy3f4C6aJLRelKEyKTdI9yOMBJDGikp3OF5KuUbX0jQg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU2PR04MB9068 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240225_215430_258422_F7975208 X-CRM114-Status: GOOD ( 14.69 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org From: Carlos Song This adds i2c bus recovery to the lpi2c driver. Uses the generic recovery function setting the SCL/SDA pads as GPIO pins and sending 9 clocks to try and recover the bus. Signed-off-by: Carlos Song Reviewed-by: Clark Wang Reviewed-by: Dong Aisheng --- drivers/i2c/busses/i2c-imx-lpi2c.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/drivers/i2c/busses/i2c-imx-lpi2c.c b/drivers/i2c/busses/i2c-imx-lpi2c.c index 678b30e90492..6d72e4e126dd 100644 --- a/drivers/i2c/busses/i2c-imx-lpi2c.c +++ b/drivers/i2c/busses/i2c-imx-lpi2c.c @@ -106,6 +106,7 @@ struct lpi2c_imx_struct { unsigned int txfifosize; unsigned int rxfifosize; enum lpi2c_imx_mode mode; + struct i2c_bus_recovery_info rinfo; }; static void lpi2c_imx_intctrl(struct lpi2c_imx_struct *lpi2c_imx, @@ -133,6 +134,8 @@ static int lpi2c_imx_bus_busy(struct lpi2c_imx_struct *lpi2c_imx) if (time_after(jiffies, orig_jiffies + msecs_to_jiffies(500))) { dev_dbg(&lpi2c_imx->adapter.dev, "bus not work\n"); + if (lpi2c_imx->adapter.bus_recovery_info) + i2c_recover_bus(&lpi2c_imx->adapter); return -ETIMEDOUT; } schedule(); @@ -190,6 +193,8 @@ static void lpi2c_imx_stop(struct lpi2c_imx_struct *lpi2c_imx) if (time_after(jiffies, orig_jiffies + msecs_to_jiffies(500))) { dev_dbg(&lpi2c_imx->adapter.dev, "stop timeout\n"); + if (lpi2c_imx->adapter.bus_recovery_info) + i2c_recover_bus(&lpi2c_imx->adapter); break; } schedule(); @@ -325,6 +330,8 @@ static int lpi2c_imx_txfifo_empty(struct lpi2c_imx_struct *lpi2c_imx) if (time_after(jiffies, orig_jiffies + msecs_to_jiffies(500))) { dev_dbg(&lpi2c_imx->adapter.dev, "txfifo empty timeout\n"); + if (lpi2c_imx->adapter.bus_recovery_info) + i2c_recover_bus(&lpi2c_imx->adapter); return -ETIMEDOUT; } schedule(); @@ -526,6 +533,20 @@ static irqreturn_t lpi2c_imx_isr(int irq, void *dev_id) return IRQ_HANDLED; } +static int lpi2c_imx_init_recovery_info(struct lpi2c_imx_struct *lpi2c_imx, + struct platform_device *pdev) +{ + struct i2c_bus_recovery_info *bri = &lpi2c_imx->rinfo; + + bri->pinctrl = devm_pinctrl_get(&pdev->dev); + if (IS_ERR(bri->pinctrl)) + return PTR_ERR(bri->pinctrl); + + lpi2c_imx->adapter.bus_recovery_info = bri; + + return 0; +} + static u32 lpi2c_imx_func(struct i2c_adapter *adapter) { return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | @@ -600,6 +621,12 @@ static int lpi2c_imx_probe(struct platform_device *pdev) lpi2c_imx->txfifosize = 1 << (temp & 0x0f); lpi2c_imx->rxfifosize = 1 << ((temp >> 8) & 0x0f); + /* Init optional bus recovery function */ + ret = lpi2c_imx_init_recovery_info(lpi2c_imx, pdev); + /* Give it another chance if pinctrl used is not ready yet */ + if (ret == -EPROBE_DEFER) + goto rpm_disable; + ret = i2c_add_adapter(&lpi2c_imx->adapter); if (ret) goto rpm_disable;