From nobody Fri Oct 3 16:46:07 2025 Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com [209.85.128.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6AAF62FFDF6; Wed, 27 Aug 2025 17:14:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756314867; cv=none; b=sOmWUOX5VAgCJ9BEDgkrLCpMokzptNACvHhth+Xsf5gU8AkmRdMhzd5wu4FRz3SChInW6FT3T6UnVZXn8clM8O1iHESyF26uAydV3aUZwMPkuP1Pm2XffAtOtnGsLvsu1cIaW2Sf6Od9GalytsJT7woBmjrjdwmE+7NiFNAtiTc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756314867; c=relaxed/simple; bh=mODA++ZTfdF2gwxfNJ8uMV9AcRZ62KJGPZV+apzvLWY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nwbn4XrL3HT+Mf3yXDfB8Itc2Aw+37jtUfmNyU1HPANiizo1pThxq8orDtlG0IfgekTF0RFrOTkeVR3lZEW61bQTdE25SoU15I2IME1NBXE3c6MDr3Z2V/PbkB1rqrW37xQiq7rq4dUYefkDhimK15qIeWNYj6Zu5hDlU0BK5Ks= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=SRJEmWno; arc=none smtp.client-ip=209.85.128.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="SRJEmWno" Received: by mail-wm1-f42.google.com with SMTP id 5b1f17b1804b1-45b629c8035so135505e9.3; Wed, 27 Aug 2025 10:14:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756314863; x=1756919663; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=PT0DXhXRplrJw52i8Fj3GYlgwoA1mKFpUTHY07GBlv4=; b=SRJEmWnoFScXUGB5loNEn3tyqTcOBrutxKjAz5iHbyMakYiWV3+nkyEiFjV1RZfBsn ZAbg04LGM+iEefTMGZ5J9sDCJBEFFM4ZPGf3VzEtR6ZNzZITbp7KS8YrZ6fvnPM+/WFQ 9tY5pnmjuqjOkqzqMAAC11sKCkKPesu2yJiwTw2XOQndYOqsNCB8oLVSGiaG7kXObdBW 9MibnofYjl1NUl0r2dSEUqaI4F38p1RyUJmu+Fq2hBDdk6Je/AQb40fahiQy00HkRmtP TZThiIKj+kTnorIQdhgBuUqMRU/u5lVxnKTYlPo+6KdQwvrTx72PWgbscVqpqLiyHCj1 APYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756314863; x=1756919663; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=PT0DXhXRplrJw52i8Fj3GYlgwoA1mKFpUTHY07GBlv4=; b=ARRbWg+SPFkNjnTSPi//wXyMwV1dzjriMQm7MeyvLWpavqQ6usRUcoTPjeRkIj14KD /d+NgTVSglB7oJv5IKB4Tfw4HdSu5+caArI13pe76AkI6NE2JqX8Lod1iQJwffiANsmU jlUNS9ROcRrkzIQLERDpQla9WYPNeJI/VUeWcNcZZOsmQdxMS0evDn8S0Nui2Qfo3E38 v/qrnWdQy+0Pr788he3WpT9aC9W24C5Moi6kEj8yTJIcLEX2ZgdWiR1jGwm3EYV0b5Md OGkV0BXuXfgOGsvCH6gzqzUYnExXTKYXvFloo0O4Z3Qro+H4U3L6vSweqKTlEXW+EqVc 1nNw== X-Forwarded-Encrypted: i=1; AJvYcCV1UYAGEuplbQLBX4Jea/yvOLeNwJoDw8IPNLlpyydPJUExDe8rOeB3pfYqnx7bCwxiEb8rHhEI@vger.kernel.org, AJvYcCVELgxeHlmO8T7q3lmsvx+yPqjQT3fFaEjL5NinAd5zNAIGK8OcoaCG60Qxj9uCwGqt9wEb+eF2ISglPjFh@vger.kernel.org, AJvYcCVpekZ5iMeGaSuRUXCjNEiLCTjL1ld8H7Ai2TXFQMzOLN18qunIOfV6OnCMjBeRA12mf8MJS0UpSiM=@vger.kernel.org X-Gm-Message-State: AOJu0Yze4TKCXel8RMnJ0ptxN8++3TB2215xw4KLA5zHuDfEwaUZUf/R 6dYTeFAy9b7omqcgrt2ButogsPFWrowzI74IeZ8TTV8xwicAoQnvJSiqXtd+vQ== X-Gm-Gg: ASbGnctAirnJowvrNrpQH2ZK0u6j05LzEW4mKvb78mB0sYz5moXagQav1rTopx3KnsX lyN46SxgHRxLShqfUzPgqtsPcosewIoysfggnWOYHBSITPM1UXmePzzSnI/dmj9etlGQhZDgZNT xEOFDkYs5qZrgb/bzfELetWw5W8lsblz8ISODU4csaW1TuvDFA0Ma4uoSDx0W4mAsBi9MTl4SqE 8DSAg1evZEj3mvnsQhQOpBIiO/PR7pPpZ0BEXNdWY9OlDdoRFGaod873xb2ZvjmSGot9UTTpLjA 4zeczw89jbe+RF0XcTgOhoyennBYM67FV6453A+Y8UTYLqD5oHlR/Yywcvrvt68kKBn5zlLVFIs YGjlaxzCcxpHIK29r+cBHcoDIvqBJ5PLrsg42gqtlboHEP2witgQ= X-Google-Smtp-Source: AGHT+IGX8S2LLnbQSlxaUpZMAgFZh0mRyIm+QfdT71UA9bzgkN27ugYZRhxwwy0GRoAlORtkGkQV1w== X-Received: by 2002:a05:600c:8b47:b0:456:19eb:2e09 with SMTP id 5b1f17b1804b1-45b521ca71emr197311705e9.8.1756314862304; Wed, 27 Aug 2025 10:14:22 -0700 (PDT) Received: from [192.168.0.253] (5D59A51C.catv.pool.telekom.hu. [93.89.165.28]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-3c7113fdacfsm21272365f8f.35.2025.08.27.10.14.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Aug 2025 10:14:21 -0700 (PDT) From: Gabor Juhos Date: Wed, 27 Aug 2025 19:13:58 +0200 Subject: [PATCH v3 1/2] i2c: pxa: defer reset on Armada 3700 when recovery is used Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250827-i2c-pxa-fix-i2c-communication-v3-1-052c9b1966a2@gmail.com> References: <20250827-i2c-pxa-fix-i2c-communication-v3-0-052c9b1966a2@gmail.com> In-Reply-To: <20250827-i2c-pxa-fix-i2c-communication-v3-0-052c9b1966a2@gmail.com> To: Wolfram Sang , Wolfram Sang , Andi Shyti , Andy Shevchenko , Russell King , Andrew Lunn , Hanna Hawa Cc: Robert Marko , Linus Walleij , Russell King , linux-i2c@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Gabor Juhos , stable@vger.kernel.org X-Mailer: b4 0.14.2 The I2C communication is completely broken on the Armada 3700 platform since commit 0b01392c18b9 ("i2c: pxa: move to generic GPIO recovery"). For example, on the Methode uDPU board, probing of the two onboard temperature sensors fails ... [ 7.271713] i2c i2c-0: using pinctrl states for GPIO recovery [ 7.277503] i2c i2c-0: PXA I2C adapter [ 7.282199] i2c i2c-1: using pinctrl states for GPIO recovery [ 7.288241] i2c i2c-1: PXA I2C adapter [ 7.292947] sfp sfp-eth1: Host maximum power 3.0W [ 7.299614] sfp sfp-eth0: Host maximum power 3.0W [ 7.308178] lm75 1-0048: supply vs not found, using dummy regulator [ 32.489631] lm75 1-0048: probe with driver lm75 failed with error -121 [ 32.496833] lm75 1-0049: supply vs not found, using dummy regulator [ 82.890614] lm75 1-0049: probe with driver lm75 failed with error -121 ... and accessing the plugged-in SFP modules also does not work: [ 511.298537] sfp sfp-eth1: please wait, module slow to respond [ 536.488530] sfp sfp-eth0: please wait, module slow to respond ... [ 1065.688536] sfp sfp-eth1: failed to read EEPROM: -EREMOTEIO [ 1090.888532] sfp sfp-eth0: failed to read EEPROM: -EREMOTEIO After a discussion [1], there was an attempt to fix the problem by reverting the offending change by commit 7b211c767121 ("Revert "i2c: pxa: move to generic GPIO recovery""), but that only helped to fix the issue in the 6.1.y stable tree. The reason behind the partial succes is that there was another change in commit 20cb3fce4d60 ("i2c: Set i2c pinctrl recovery info from it's device pinctrl") in the 6.3-rc1 cycle which broke things further. The cause of the problem is the same in case of both offending commits mentioned above. Namely, the I2C core code changes the pinctrl state to GPIO while running the recovery initialization code. Although the PXA specific initialization also does this, but the key difference is that it happens before the controller is getting enabled in i2c_pxa_reset(), whereas in the case of the generic initialization it happens after that. Change the code to reset the controller only before the first transfer instead of before registering the controller. This ensures that the controller is not enabled at the time when the generic recovery code performs the pinctrl state changes, thus avoids the problem described above. As the result this change restores the original behaviour, which in turn makes the I2C communication to work again as it can be seen from the following log: [ 7.363250] i2c i2c-0: using pinctrl states for GPIO recovery [ 7.369041] i2c i2c-0: PXA I2C adapter [ 7.373673] i2c i2c-1: using pinctrl states for GPIO recovery [ 7.379742] i2c i2c-1: PXA I2C adapter [ 7.384506] sfp sfp-eth1: Host maximum power 3.0W [ 7.393013] sfp sfp-eth0: Host maximum power 3.0W [ 7.399266] lm75 1-0048: supply vs not found, using dummy regulator [ 7.407257] hwmon hwmon0: temp1_input not attached to any thermal zone [ 7.413863] lm75 1-0048: hwmon0: sensor 'tmp75c' [ 7.418746] lm75 1-0049: supply vs not found, using dummy regulator [ 7.426371] hwmon hwmon1: temp1_input not attached to any thermal zone [ 7.432972] lm75 1-0049: hwmon1: sensor 'tmp75c' [ 7.755092] sfp sfp-eth1: module MENTECHOPTO POS22-LDCC-KR rev= 1.0 sn MNC208U90009 dc 200828 [ 7.764997] mvneta d0040000.ethernet eth1: unsupported SFP module: no = common interface modes [ 7.785362] sfp sfp-eth0: module Mikrotik S-RJ01 rev= 1.0 sn 61B103C55C58 dc 201022 [ 7.803426] hwmon hwmon2: temp1_input not attached to any thermal zone Link: https://lore.kernel.org/r/20230926160255.330417-1-robert.marko@sartur= a.hr #1 Cc: stable@vger.kernel.org # 6.3+ Fixes: 20cb3fce4d60 ("i2c: Set i2c pinctrl recovery info from it's device p= inctrl") Signed-off-by: Gabor Juhos --- Changes in v3: - rebase on tip of i2c/for-current - rework the patch and use a different approach which does not requires modification in the I2C core code and update commit description acccordingly - remove Imre's SoB tag, it should have been a Reviewed-by tag, but due to the rework this is an entirely different patch so that does not apply anyway - use Link tag for the URL of the referenced LKML thread - Link to v2: https://lore.kernel.org/r/20250811-i2c-pxa-fix-i2c-communic= ation-v2-2-ca42ea818dc9@gmail.com Changes in v2: - rebase and retest on tip of i2c/for-current - Link to v1: https://lore.kernel.org/r/20250511-i2c-pxa-fix-i2c-communic= ation-v1-2-e9097d09a015@gmail.com --- drivers/i2c/busses/i2c-pxa.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c index 968a8b8794dac3398a68d827c567aa5bb73ae3d7..70acf33e1d573231f84a1f09cff= b376a8277351d 100644 --- a/drivers/i2c/busses/i2c-pxa.c +++ b/drivers/i2c/busses/i2c-pxa.c @@ -268,6 +268,7 @@ struct pxa_i2c { struct pinctrl *pinctrl; struct pinctrl_state *pinctrl_default; struct pinctrl_state *pinctrl_recovery; + bool reset_before_xfer; }; =20 #define _IBMR(i2c) ((i2c)->reg_ibmr) @@ -1144,6 +1145,11 @@ static int i2c_pxa_xfer(struct i2c_adapter *adap, { struct pxa_i2c *i2c =3D adap->algo_data; =20 + if (i2c->reset_before_xfer) { + i2c_pxa_reset(i2c); + i2c->reset_before_xfer =3D false; + } + return i2c_pxa_internal_xfer(i2c, msgs, num, i2c_pxa_do_xfer); } =20 @@ -1521,7 +1527,16 @@ static int i2c_pxa_probe(struct platform_device *dev) } } =20 - i2c_pxa_reset(i2c); + /* + * Skip reset on Armada 3700 when recovery is used to avoid + * controller hang due to the pinctrl state changes done by + * the generic recovery initialization code. The reset will + * be performed later, prior to the first transfer. + */ + if (i2c_type =3D=3D REGS_A3700 && i2c->adap.bus_recovery_info) + i2c->reset_before_xfer =3D true; + else + i2c_pxa_reset(i2c); =20 ret =3D i2c_add_numbered_adapter(&i2c->adap); if (ret < 0) --=20 2.50.1 From nobody Fri Oct 3 16:46:07 2025 Received: from mail-wr1-f51.google.com (mail-wr1-f51.google.com [209.85.221.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D3CF030C367; Wed, 27 Aug 2025 17:14:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756314867; cv=none; b=WGl/i7X1AiwP+gquUZnXqk8Y2Yke4Fetf+K8bh9ucnxzCxWGHFsye9xHKijLnkrsQgwrMMEZSQoBiGWvF9BOkl0Bp+jzbudJbyDv9/aTM+WYl9gNrax6a7XpLgtzdaUKmeK6ecQ6TBN7UolntOpf+bQz3H01WdFgzqnonTU8GPk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756314867; c=relaxed/simple; bh=CXDcZQ0Se7Zr++g/D9aafksWpOAhnUBq9vUM6z+CdtQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mqJgXh+VFArJj5VSLuFN4YizTelzBgqahU21gL288fjeoMMySfW8k1baXkF9QypSIUBHJBtLjy5RvXU3DUytmW/cnnx+T2XpoNBxpXUow5DgXZs2pjo8xGzW+GYGkN85Xl6M7ha0aHkbKdDuZ1wQGIbu6JYtwVun0N6BpgrIaEw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=DjfNtCQE; arc=none smtp.client-ip=209.85.221.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="DjfNtCQE" Received: by mail-wr1-f51.google.com with SMTP id ffacd0b85a97d-3c79f0a604aso27370f8f.2; Wed, 27 Aug 2025 10:14:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756314864; x=1756919664; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=fPU4UG0shymed19kC5QQuX+JC22baf0fpM1+kwSIVDw=; b=DjfNtCQEOg1XGVdQ7+5UCbNT9KZGToMaV5jT2XrrzMkLvwHQLPlMFktcY9f6SEGSSG tMfyPcg++zCh4XJI1Uzaw5/DRaUDfiOTMHoWN0MNp3vlveCzGTHEbREXCPEXSIVarP9E l9lK5Fr/Un8WukxTl0GUF4W6PUkLlqwOpFi4oG7f0xqOZ59csyUYtCb/twpqjTePzyL9 cDUxjfyawRkgXFnt2Y7QDvi+2d5i5306b3sP+SwhyHF08hNNW9Mj97AKHTRUP4pawLEW ynJaSUhKQoT6on0R822N3/2MowCRmH2SoenqlFLv4qOJJ1WlXQr8/LFRgOOumR2p7iO5 x4sg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756314864; x=1756919664; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=fPU4UG0shymed19kC5QQuX+JC22baf0fpM1+kwSIVDw=; b=IEewcQ708Pa8iYih0PgHQCzuzu9MvNA4lGSsQirInx6CnMWp0jFOw6Mpa80WoNzNaH Q+tDwDZX74tC7BH25w50+FzsIxo1dXhTbMd352eLlnlrtIVhoWA8wUGrtN/9GXAo/M8X CBpW21gx7RqQYI1ElEDbS7AVDspx/sjuv0VmNAoWaQQN/Q/TtMALFVR8CZpiY1cRelkM 8aI02Wn6RWFJPaNyvL5Vzkq3xT2AaQZBLg43tvSbvJ14T3je1Q+eBRRDu0CYo7dN37oJ /0Cy906iIIRKyQO0B3Ht81jZ9uAtzdTWQoWhHCXpWb6yXP1cWJnvj088YMzfYWFbEuLE aDQg== X-Forwarded-Encrypted: i=1; AJvYcCUwGK4QetgxhmQPHuYhpK1GBfskVvSz4daktiWUTowX4S6awM9zg5HetZ/cKC6jHm8RVmgo0QSBISGaNq2r@vger.kernel.org, AJvYcCV1/Udclo18JngbTli83KoEWwVjdnJLx4qsBgU6hfiFYD/ayNOjkiMuWTDZb0YCCgw734Se4DTd@vger.kernel.org, AJvYcCWemF1ctQhYlIs1/fZZR/YQy/Hh5Z5qaT2HBc7w2mtZOkyeEkyDNPJkl/nXWCqofh7gMrJOW1a3Iv8=@vger.kernel.org X-Gm-Message-State: AOJu0Yxz+qJK/KQQMMV1nuPw9RKsCDUrlcXHilU42okC2guw69c/p2W0 F9K0r2F/fuGc3dk74PdScRZKt/0/6FTBNty6Ul/GFvgoy5ZtacFZAk/W7nCpig== X-Gm-Gg: ASbGncvLym8Rey+13glIfrTK46cDjjGNF+BsJwxyCH8iNIUrGpx72qQ5Y7626N4HcmG 7bFQgaTwRsMpTl7UgJHro6Gmh0xZF8u4W/IyQTgrTAE8VOiJoiYEb2LcnBgKwbkTHxNnI8BC12g nN3CYiCYIJWNUuQPRwy5qpSZMoy8FT0ehMRjZgaaJUo/o3GqC1VsMwhmulfHy9o3+BJplJ1qprn evrBjibXJyw8ElqtYd5hqwHxvueaX1ggfC2eGHV1jZcJ1WNoAOu/uy9txOlaZtYsMg6nK4MnS7N FRUgRcImLOhz5IgjgOJzXfEaQyTqVFlBj+pcc/+4/VzJamm6Q8EOnC0/5mfiYiCdhF17lkyqx3k ZqbtPALmt4kNG7WgRHRZlAehNdo0fG2PDUOXg4vOmxYYW4fGmuPE= X-Google-Smtp-Source: AGHT+IGkGgu/zepDaclUovYHbHFUPlfCtylJkPVDNcl1jkGqRtflyZavEYXbWDBRApoSMNQfSS+G0g== X-Received: by 2002:adf:8bd4:0:b0:3cc:a507:80d4 with SMTP id ffacd0b85a97d-3cca507822amr1650176f8f.7.1756314863975; Wed, 27 Aug 2025 10:14:23 -0700 (PDT) Received: from [192.168.0.253] (5D59A51C.catv.pool.telekom.hu. [93.89.165.28]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-3c7113fdacfsm21272365f8f.35.2025.08.27.10.14.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Aug 2025 10:14:23 -0700 (PDT) From: Gabor Juhos Date: Wed, 27 Aug 2025 19:13:59 +0200 Subject: [PATCH v3 2/2] i2c: pxa: handle 'Early Bus Busy' condition on Armada 3700 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250827-i2c-pxa-fix-i2c-communication-v3-2-052c9b1966a2@gmail.com> References: <20250827-i2c-pxa-fix-i2c-communication-v3-0-052c9b1966a2@gmail.com> In-Reply-To: <20250827-i2c-pxa-fix-i2c-communication-v3-0-052c9b1966a2@gmail.com> To: Wolfram Sang , Wolfram Sang , Andi Shyti , Andy Shevchenko , Russell King , Andrew Lunn , Hanna Hawa Cc: Robert Marko , Linus Walleij , Russell King , linux-i2c@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Gabor Juhos , stable@vger.kernel.org, Imre Kaloz X-Mailer: b4 0.14.2 Under some circumstances I2C recovery fails on Armada 3700. At least on the Methode uDPU board, removing and replugging an SFP module fails often, like this: [ 36.953127] sfp sfp-eth1: module removed [ 38.468549] i2c i2c-1: i2c_pxa: timeout waiting for bus free [ 38.486960] sfp sfp-eth1: module MENTECHOPTO POS22-LDCC-KR rev= 1.0 sn MNC208U90009 dc 200828 [ 38.496867] mvneta d0040000.ethernet eth1: unsupported SFP module: no = common interface modes [ 38.521448] hwmon hwmon2: temp1_input not attached to any thermal zone [ 39.249196] sfp sfp-eth1: module removed ... [ 292.568799] sfp sfp-eth1: please wait, module slow to respond ... [ 625.208814] sfp sfp-eth1: failed to read EEPROM: -EREMOTEIO Note that the 'unsupported SFP module' messages are not relevant. The module is used only for testing the I2C recovery funcionality, because the error can be triggered easily with this specific one. Enabling debug in the i2c-pxa driver reveals the following: [ 82.034678] sfp sfp-eth1: module removed [ 90.008654] i2c i2c-1: slave_0x50 error: timeout with active message [ 90.015112] i2c i2c-1: msg_num: 2 msg_idx: 0 msg_ptr: 0 [ 90.020464] i2c i2c-1: IBMR: 00000003 IDBR: 000000a0 ICR: 000007e0 ISR= : 00000802 [ 90.027906] i2c i2c-1: log: [ 90.030787] This continues until the retries are exhausted ... [ 110.192489] i2c i2c-1: slave_0x50 error: exhausted retries [ 110.198012] i2c i2c-1: msg_num: 2 msg_idx: 0 msg_ptr: 0 [ 110.203323] i2c i2c-1: IBMR: 00000003 IDBR: 000000a0 ICR: 000007e0 ISR= : 00000802 [ 110.210810] i2c i2c-1: log: [ 110.213633] ... then the whole sequence starts again ... [ 115.368641] i2c i2c-1: slave_0x50 error: timeout with active message ... while finally the SFP core gives up: [ 671.975258] sfp sfp-eth1: failed to read EEPROM: -EREMOTEIO When we analyze the log, it can be seen that bit 1 and 11 is set in the ISR (Interface Status Register). Bit 1 indicates the ACK/NACK status, but the purpose of bit 11 is not documented in the driver code unfortunately. The 'Functional Specification' document of the Armada 3700 SoCs family however says that this bit indicates an 'Early Bus Busy' condition. The document also notes that whenever this bit is set, it is not possible to initiate a transaction on the I2C bus. The observed behaviour corresponds to this statement. Unfortunately, I2C recovery does not help as it never runs in this special case. Although the driver checks the busyness of the bus at several places, but since it does not consider the A3700 specific bit in these checks it can't determine the actual status of the bus correctly which results in the errors above. In order to fix the problem, add a new member to struct 'i2c_pxa' to store a controller specific bitmask containing the bits indicating the busy status, and use that in the code while checking the actual status of the bus. This ensures that the correct status can be determined on the Armada 3700 based devices without causing functional changes on devices based on other SoCs. With the change applied, the driver detects the busy condition, and runs the recovery process: [ 742.617312] i2c i2c-1: state:i2c_pxa_wait_bus_not_busy:449: ISR=3D0000= 0802, ICR=3D000007e0, IBMR=3D03 [ 742.626099] i2c i2c-1: i2c_pxa: timeout waiting for bus free [ 742.631933] i2c i2c-1: recovery: resetting controller, ISR=3D0x00000802 [ 742.638421] i2c i2c-1: recovery: IBMR 0x00000003 ISR 0x00000000 This clears the EBB bit in the ISR register, so it makes it possible to initiate transactions on the I2C bus again. After this patch, the SFP module used for testing can be removed and replugged numerous times without causing the error described at the beginning. Previously, the error happened after a few such attempts. The patch has been tested also with the following kernel versions: 5.10.240, 5.15.189, 6.1.148, 6.6.102, 6.12.42, 6.14.11, 6.15.10, 6.16.1 It improves recovery on all of them. Cc: stable@vger.kernel.org # 5.10+ Reviewed-by: Imre Kaloz Signed-off-by: Gabor Juhos --- Changes in v3: - rebase on tip of i2c/for-current - use Reviewed-by tag for Imre - remove Fixes tag as the problem is not caused by the previously mention= ed commit, simply it is not handled by the code yet - update list of tested kernels - Link to v2: https://lore.kernel.org/r/20250811-i2c-pxa-fix-i2c-communic= ation-v2-3-ca42ea818dc9@gmail.com Changes in v2: - rebase and retest on tip of i2c/for-current - Link to v1: https://lore.kernel.org/r/20250511-i2c-pxa-fix-i2c-communic= ation-v1-3-e9097d09a015@gmail.com --- drivers/i2c/busses/i2c-pxa.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c index 70acf33e1d573231f84a1f09cffb376a8277351d..19f5da08def11ded1d3de968f50= fa5b5851066f5 100644 --- a/drivers/i2c/busses/i2c-pxa.c +++ b/drivers/i2c/busses/i2c-pxa.c @@ -71,6 +71,7 @@ #define ISR_GCAD (1 << 8) /* general call address detected */ #define ISR_SAD (1 << 9) /* slave address detected */ #define ISR_BED (1 << 10) /* bus error no ACK/NAK */ +#define ISR_A3700_EBB (1 << 11) /* early bus busy for armada 3700 */ =20 #define ILCR_SLV_SHIFT 0 #define ILCR_SLV_MASK (0x1FF << ILCR_SLV_SHIFT) @@ -263,6 +264,7 @@ struct pxa_i2c { bool highmode_enter; u32 fm_mask; u32 hs_mask; + u32 busy_mask; =20 struct i2c_bus_recovery_info recovery; struct pinctrl *pinctrl; @@ -430,7 +432,7 @@ static int i2c_pxa_wait_bus_not_busy(struct pxa_i2c *i2= c) =20 while (1) { isr =3D readl(_ISR(i2c)); - if (!(isr & (ISR_IBB | ISR_UB))) + if (!(isr & i2c->busy_mask)) return 0; =20 if (isr & ISR_SAD) @@ -467,7 +469,7 @@ static int i2c_pxa_wait_master(struct pxa_i2c *i2c) * quick check of the i2c lines themselves to ensure they've * gone high... */ - if ((readl(_ISR(i2c)) & (ISR_UB | ISR_IBB)) =3D=3D 0 && + if ((readl(_ISR(i2c)) & i2c->busy_mask) =3D=3D 0 && readl(_IBMR(i2c)) =3D=3D (IBMR_SCLS | IBMR_SDAS)) { if (i2c_debug > 0) dev_dbg(&i2c->adap.dev, "%s: done\n", __func__); @@ -488,7 +490,7 @@ static int i2c_pxa_set_master(struct pxa_i2c *i2c) if (i2c_debug) dev_dbg(&i2c->adap.dev, "setting to bus master\n"); =20 - if ((readl(_ISR(i2c)) & (ISR_UB | ISR_IBB)) !=3D 0) { + if ((readl(_ISR(i2c)) & i2c->busy_mask) !=3D 0) { dev_dbg(&i2c->adap.dev, "%s: unit is busy\n", __func__); if (!i2c_pxa_wait_master(i2c)) { dev_dbg(&i2c->adap.dev, "%s: error: unit busy\n", __func__); @@ -514,7 +516,7 @@ static int i2c_pxa_wait_slave(struct pxa_i2c *i2c) dev_dbg(&i2c->adap.dev, "%s: %ld: ISR=3D%08x, ICR=3D%08x, IBMR=3D%02x\n= ", __func__, (long)jiffies, readl(_ISR(i2c)), readl(_ICR(i2c)), readl(_IB= MR(i2c))); =20 - if ((readl(_ISR(i2c)) & (ISR_UB|ISR_IBB)) =3D=3D 0 || + if ((readl(_ISR(i2c)) & i2c->busy_mask) =3D=3D 0 || (readl(_ISR(i2c)) & ISR_SAD) !=3D 0 || (readl(_ICR(i2c)) & ICR_SCLE) =3D=3D 0) { if (i2c_debug > 1) @@ -1177,7 +1179,7 @@ static int i2c_pxa_pio_set_master(struct pxa_i2c *i2c) /* * Wait for the bus to become free. */ - while (timeout-- && readl(_ISR(i2c)) & (ISR_IBB | ISR_UB)) + while (timeout-- && readl(_ISR(i2c)) & i2c->busy_mask) udelay(1000); =20 if (timeout < 0) { @@ -1322,7 +1324,7 @@ static void i2c_pxa_unprepare_recovery(struct i2c_ada= pter *adap) * handing control of the bus back to avoid the bus changing state. */ isr =3D readl(_ISR(i2c)); - if (isr & (ISR_UB | ISR_IBB)) { + if (isr & i2c->busy_mask) { dev_dbg(&i2c->adap.dev, "recovery: resetting controller, ISR=3D0x%08x\n", isr); i2c_pxa_do_reset(i2c); @@ -1479,6 +1481,10 @@ static int i2c_pxa_probe(struct platform_device *dev) i2c->fm_mask =3D pxa_reg_layout[i2c_type].fm; i2c->hs_mask =3D pxa_reg_layout[i2c_type].hs; =20 + i2c->busy_mask =3D ISR_UB | ISR_IBB; + if (i2c_type =3D=3D REGS_A3700) + i2c->busy_mask |=3D ISR_A3700_EBB; + if (i2c_type !=3D REGS_CE4100) i2c->reg_isar =3D i2c->reg_base + pxa_reg_layout[i2c_type].isar; =20 --=20 2.50.1