From nobody Fri Oct 3 18:01:17 2025 Received: from smtpbguseast3.qq.com (smtpbguseast3.qq.com [54.243.244.52]) (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 891EE31A063; Wed, 27 Aug 2025 07:40:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.243.244.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756280442; cv=none; b=ktfKBhdQ5GrVVuhaHndjSwxz4qsJsVEMjFhKBk/AA/DKVWNbyVIdKyyzA8/TelIdwsIb+Sa2Q8LOQMtW9dbIijZ0u4A7FO5zLc6wSEnbYuXQo3COrYBL1lPhpfXBly4xHRQZK7PlEsWTRy0EmnsHPe83+z9tWcDsrEYkIHTe7ZE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756280442; c=relaxed/simple; bh=O2naaLl5Cs0DMQ9yfCsYpaouL4CksC9CM4vilFzvkyE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YdiRqjnXGtWxptrbk0TYGgiebhGhBoQbgQDLwYZqVFxGCoKXEMirXx+Clp3BAwOJKtGvs0Bi+5QCnxaNKOOwpMlOvmuNsV35EGoEFhu63NShsDXR9qkqbynu9nXbK1Eu4F4jGMcnTt3BkVH/GEK4Rehcq7poq8psb6ZYwgCV0H4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com; spf=none smtp.mailfrom=linux.spacemit.com; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b=wpRyVp7p; arc=none smtp.client-ip=54.243.244.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b="wpRyVp7p" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.spacemit.com; s=mxsw2412; t=1756280368; bh=Hyx3ymaEGNzBK4ghZhgbXN2uPhad45k6Uk8y3I6pyjI=; h=From:Date:Subject:MIME-Version:Message-Id:To; b=wpRyVp7pbXZQrxlVCxcAVxo82mwG8M7btdd1oXaPJYMK2A1Uuc75cKJ43pYN0k/5g DDt7iKr5HRMeO2WH/AyLIgcB+4QIDd8ZGwgkw+sGmRZJLGETD3OnOu8orKb7YEe4hp ztYtY9i9lMTgOL93M327aogdkDwFMn0+nT2eo2+o= X-QQ-mid: esmtpgz16t1756280361t7ea55d28 X-QQ-Originating-IP: tcnkU3el7is/5fUg3mVsc3eUfHeY/KFA8ijvRn1EyI8= Received: from = ( [61.145.255.150]) by bizesmtp.qq.com (ESMTP) with id ; Wed, 27 Aug 2025 15:39:20 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 4976485597783889117 EX-QQ-RecipientCnt: 9 From: Troy Mitchell Date: Wed, 27 Aug 2025 15:39:08 +0800 Subject: [PATCH 1/6] i2c: spacemit: ensure bus release check runs when wait_bus_idle() fails 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-k1-i2c-atomic-v1-1-e59bea02d680@linux.spacemit.com> References: <20250827-k1-i2c-atomic-v1-0-e59bea02d680@linux.spacemit.com> In-Reply-To: <20250827-k1-i2c-atomic-v1-0-e59bea02d680@linux.spacemit.com> To: Andi Shyti , Yixun Lan , Alex Elder , Troy Mitchell Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, Troy Mitchell X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1756280357; l=1318; i=troy.mitchell@linux.spacemit.com; s=20250710; h=from:subject:message-id; bh=O2naaLl5Cs0DMQ9yfCsYpaouL4CksC9CM4vilFzvkyE=; b=dhv6YDTotdlXwSY6VBfyfnMkAC83C/xlrMYrEQsEuUbvIoxzhr5l8Fn508+HCtvTsr6U0lyAR rYanvaW44ksAsj7RgVne5XldNicQPyGUDPBPd4GGUi0afj4gedXtwyJ X-Developer-Key: i=troy.mitchell@linux.spacemit.com; a=ed25519; pk=lQa7BzLrq8DfZnChqmwJ5qQk8fP2USmY/4xZ2/MSsXc= X-QQ-SENDSIZE: 520 Feedback-ID: esmtpgz:linux.spacemit.com:qybglogicsvrsz:qybglogicsvrsz3a-0 X-QQ-XMAILINFO: NhTe9p7tQP4gmwaIF09oB5LgKGXsdFKTYDLGDqFK/Ut/fbgJshsLzspC t7LpguV0Q/zHpaBBuwe1IuhKVWYkF/uekP60nDVA/54cms3H8AytN7QYzN5bJZArpDKKJUl zowVTef9kpZwS4QwgXipRgiagYFhkV/NhhQAMAEW/qb/gZBbaW4KagzeJ/NBfeKT5o7/4QZ G9WZwSwUo2DsJQk3XnBPus70nP52S/p+O+uPPt/voNxTbNMikyJtyAepSCy6odZQd3nk0sL ZwZ9n2Papp26Qz9iMIvriF3xxr+uwIGZ6o+3tAEdc5mnFVVFdC7I+ZmH2tbYWDPbT2dp25b RTtbH3fXB22t8cSvg3zpcO7EsGdVlVPrxVwdbRcPxBkKSXm2PGMnWmV/WpwRv0KD0OhpdlS 3TkWr5AVBM5gCH/0MRO5WgOh9Dx3NlTwLpERSaGwDCcV1RdqBAZ9jE14uWkBcSog5XubD1c sWtHfIDu7sf6JTZyB+G5sWgMsIG0La6BrnOWx4PfFxUyySwh1VLovcg0Bp0XppQlH/GLy9h Te82ohaj0PN0q9tw0pnx7leZe29Fa8n4O3NLyuljBhlz1mqYMolLOZ+tqDnlAbZgIcBxGTm eBhDQES4KU5Hof4dQX7RIzs6c/ZjWr5qBax/ozYdJCSTl5xbypIzbJqRTIS3V1ixGufxYAX WB5ibrcM9HzeHcFok4+IP/gc8QE+V03q5LhhxHlF5B6E2uDU+PDhPWlnZMrdW97ai5sSzne keRxGqlAEZO8+Zf+wZS0P3AtIXrUs1baHx9Ap40cR1+9iH2tW2UIUhYzsZF8SAwmdgp0a2D n6yzqPy2MBbyKcqofhel+InEqqlBVL0/+mM6atzVYjYEWwYuwVOBNvm5BwwH8F65WsnE9YA kFMDBRA2CUCuX9a2KR6m/2lIhbnrDIMeGx6T2XVhHvxY0MWAwYkwDOOwcxz6x62XN4+8K2R TPpxNkMpUcxyfNP9oxoP8b0+KbEQ3TH4nAG7ClrlSre1Lx7sPrrTilPm5mWAH57iWivooGZ Kq/hPjWallDZBvT9srFF2m93D48agyA8JFkyMnDJ9T7Yex4hPtTUEM8TD733sjQjyQT9onI hz/yKCleadlfk6d/vT7oMO8gZ19bB173GT1LwGKzgRq X-QQ-XMRINFO: Nq+8W0+stu50PRdwbJxPCL0= X-QQ-RECHKSPAM: 0 spacemit_i2c_wait_bus_idle() only returns 0 on success or a negative error code on failure. Since 'ret' can never be positive, the final 'else' branch was unreachable, and spacemit_i2c_check_bus_release() was never called. This commit guarantees we attempt to release the bus whenever waiting for an idle bus fails. Fixes: 5ea558473fa31 ("i2c: spacemit: add support for SpacemiT K1 SoC") Signed-off-by: Troy Mitchell Reviewed-by: Aurelien Jarno --- drivers/i2c/busses/i2c-k1.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/i2c/busses/i2c-k1.c b/drivers/i2c/busses/i2c-k1.c index b68a21fff0b56b59fe2032ccb7ca6953423aad32..ee08811f4087c8e709d25dd3148= 54ed643cc5a47 100644 --- a/drivers/i2c/busses/i2c-k1.c +++ b/drivers/i2c/busses/i2c-k1.c @@ -476,12 +476,13 @@ static int spacemit_i2c_xfer(struct i2c_adapter *adap= t, struct i2c_msg *msgs, in spacemit_i2c_enable(i2c); =20 ret =3D spacemit_i2c_wait_bus_idle(i2c); - if (!ret) + if (!ret) { ret =3D spacemit_i2c_xfer_msg(i2c); - else if (ret < 0) - dev_dbg(i2c->dev, "i2c transfer error: %d\n", ret); - else + if (ret < 0) + dev_dbg(i2c->dev, "i2c transfer error: %d\n", ret); + } else { spacemit_i2c_check_bus_release(i2c); + } =20 spacemit_i2c_disable(i2c); =20 --=20 2.50.1 From nobody Fri Oct 3 18:01:17 2025 Received: from smtpbgjp3.qq.com (smtpbgjp3.qq.com [54.92.39.34]) (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 6360531A540; Wed, 27 Aug 2025 07:40:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.92.39.34 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756280445; cv=none; b=J+5qDalg1BrQEKodj0ljKLvH44MaL9LZ9zPaUjWk9tc72zGRIN/PkJHbZclb2sUrni4rKmMp0k4jt4/DaWc/C59DjKOSn9Deu3gTRFKVXMxlB+dCFZhlYsrN9QtqidbBKGdshc6thWQZOl8fX3w/pZrJvBlxGGH4bQxjD5Gsq5M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756280445; c=relaxed/simple; bh=rXhS9GnD2Dk1OWu3Ph2ZYZuY8+SqPjIYTr2qGnagdnI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jbvId6zO49MIPcX0Ir5u6WKoj84RT6XJ9aIxkltjuDGx0UZ21P15LFTiyBL5FsmLs3UJ/KVipPt3FZqC3q+pVQDmGtf/LAOCGNYDoTh8lriPkItNxF0Bk3O0ONbsuyia2zxy5qHHB57kks0d4EomDreIxXK+bvUeE/Pw9/GkH/Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com; spf=none smtp.mailfrom=linux.spacemit.com; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b=eXO7hR97; arc=none smtp.client-ip=54.92.39.34 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b="eXO7hR97" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.spacemit.com; s=mxsw2412; t=1756280371; bh=r62LRLONQ4ixRFoVK2WGOsYnOv0IReYh5Qvofm9lB8o=; h=From:Date:Subject:MIME-Version:Message-Id:To; b=eXO7hR97dfNyuHfagG6Sme/Y+/BgxMc6gHADJ+NopsfYGu07SdoZtlzZim7pI6mGV k39H8YGRpo/Dt6MCmsM053l6fYRAf6NQvibMOU0mIj7vYmEH+1CA6IOwWmkpO1xNAZ 8QIbMYDz4bu3FaqN9nYFqIKnfPQrzdXSvaavIr6M= X-QQ-mid: esmtpgz13t1756280364td1fd4c27 X-QQ-Originating-IP: j6HUiQphb1uXSips00AFbpxD2qsvOt6geCUe1Vnr4+k= Received: from = ( [61.145.255.150]) by bizesmtp.qq.com (ESMTP) with id ; Wed, 27 Aug 2025 15:39:23 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 11585140463096144350 EX-QQ-RecipientCnt: 9 From: Troy Mitchell Date: Wed, 27 Aug 2025 15:39:09 +0800 Subject: [PATCH 2/6] i2c: spacemit: remove stop function to avoid bus error 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-k1-i2c-atomic-v1-2-e59bea02d680@linux.spacemit.com> References: <20250827-k1-i2c-atomic-v1-0-e59bea02d680@linux.spacemit.com> In-Reply-To: <20250827-k1-i2c-atomic-v1-0-e59bea02d680@linux.spacemit.com> To: Andi Shyti , Yixun Lan , Alex Elder , Troy Mitchell Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, Troy Mitchell X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1756280357; l=2481; i=troy.mitchell@linux.spacemit.com; s=20250710; h=from:subject:message-id; bh=rXhS9GnD2Dk1OWu3Ph2ZYZuY8+SqPjIYTr2qGnagdnI=; b=WjcgZ/94u/DDSuZGRjbfrpgiUdbLCUQAsF2f0B2SWZN1q1ipHqnMJeIr0+TDv3zdanCvKGmZm Krc4FIjj4ruDxLP6/O11VP0NuJv7Z2atZ+pGFldHiGepX8jonw7iQPP X-Developer-Key: i=troy.mitchell@linux.spacemit.com; a=ed25519; pk=lQa7BzLrq8DfZnChqmwJ5qQk8fP2USmY/4xZ2/MSsXc= X-QQ-SENDSIZE: 520 Feedback-ID: esmtpgz:linux.spacemit.com:qybglogicsvrsz:qybglogicsvrsz3a-0 X-QQ-XMAILINFO: NK5b7h72e0qHzF2QF+s7kSizN3qr3KH08pr9thEkI/GKZIq1wBj0pqHM HnWdP1V9zIbASO5vN5h6hi1KrD6HRwkFzuokDgqRR2Vz4cydhSGtNaLgOg4xdodjbqXuoPO jLZfVoU20sbmuMbBxF6GDZTdgE1Ceh7L+4qk92tXkfoRTY2lmZ9nDESy/tu/gv8QqsNevou T7kmihZf/94cHpZ3UTXYET2wBwD5+NNqejgzUIY1HLKUrt7aeUvDWiyRK6U5TU/iBmg9xMH D/WpuEjQzWNDcUxUJIOtwCfHnXId9XpwLz8J+xUjH7RtXHU0inardZnqTjK4d5PXeNo6uj8 xWylVFU8OLW+cORclKYuetCOJoUm5Q6jNvuJjLRd3gPOD/8eYW63SDe2/O2FdeMSD2LlvSt sD6GXYI3W8uoZe7NOPibumqfYegrKU6De91CsSP2O8518+DfobfwTpFHhsgK9SbUt1b/BhG 0jH1egX7DNIeTgRLs3080wfiqpd1NnoJzE4stMWrLKjo4tFpjpoI6AaDyKHo9CmLuxkdjQg ouBEjb7OKeB7LfnXzSfdgmtsMMggZA2BYp42HtLMb8pUV4Xoa1yyBIEPwApp2o2tIMKuqIu Nhr0x9Z5PLKrbAUglaoL6z5r3myW7MxHJF9pzIU8VjhudJ430jpMcNyQyty8eTRjQm7K2Jn UnNlNhqzYOJGTI6AjMhfrHbjrNrNommAzY7CJ/+56jdY4bjmBTHkUkt9HuuiL0QFBwZZg3t EaYjjlQSCRzA4aiw+HYuYWSjNuWcsBR6rJcfvDnouPeFu8cYczmH4IpN8iGs5sSWN0y5rF0 cFVMAteyMHe8cTCsOkrcO+21kyCePLbExqZfo6kE18vBwymXqCeX0ORPyaNPw6JAmYauJSc RCov2jpayGmVJL7/7FNQa1OJEm7HvPq1+qY2ltW70+5KZt6fOVk0N0WSsTNKSSyfzgGPzVd 4xcZojwPRvo4jYwAddDLfWGApgBppP0oS2ld+zpOMuVd2vK6eYzCu87f3CHShlu2Unwes9a vzz4uDAEK4wKIrGhV9+1eVz05kUMM029jaXhFsDfRtwB7VFopXEjBUc6w8aMXecsOMB/r6Z GNc787BP9qJELOm03eK24qP8J5NZJg+3c3lIQgQBvWcVaCUIKVVeobAdm5hhowexxNI/yL3 /U7J X-QQ-XMRINFO: Nq+8W0+stu50PRdwbJxPCL0= X-QQ-RECHKSPAM: 0 Previously, STOP handling was split into two separate steps: 1) clear TB/STOP/START/ACK bits 2) issue STOP by calling spacemit_i2c_stop() This left a small window where the control register was updated twice, which can confuse the controller. While this race has not been observed with interrupt-driven transfers, it reliably causes bus errors in PIO mode. Inline the STOP sequence into the IRQ handler and ensure that control register bits are updated atomically in a single writel(). Fixes: 5ea558473fa31 ("i2c: spacemit: add support for SpacemiT K1 SoC") Signed-off-by: Troy Mitchell --- drivers/i2c/busses/i2c-k1.c | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/drivers/i2c/busses/i2c-k1.c b/drivers/i2c/busses/i2c-k1.c index ee08811f4087c8e709d25dd314854ed643cc5a47..d342752030d077953adf84a2886= 211de96e843c4 100644 --- a/drivers/i2c/busses/i2c-k1.c +++ b/drivers/i2c/busses/i2c-k1.c @@ -267,19 +267,6 @@ static void spacemit_i2c_start(struct spacemit_i2c_dev= *i2c) writel(val, i2c->base + SPACEMIT_ICR); } =20 -static void spacemit_i2c_stop(struct spacemit_i2c_dev *i2c) -{ - u32 val; - - val =3D readl(i2c->base + SPACEMIT_ICR); - val |=3D SPACEMIT_CR_STOP | SPACEMIT_CR_ALDIE | SPACEMIT_CR_TB; - - if (i2c->read) - val |=3D SPACEMIT_CR_ACKNAK; - - writel(val, i2c->base + SPACEMIT_ICR); -} - static int spacemit_i2c_xfer_msg(struct spacemit_i2c_dev *i2c) { unsigned long time_left; @@ -412,7 +399,6 @@ static irqreturn_t spacemit_i2c_irq_handler(int irq, vo= id *devid) =20 val =3D readl(i2c->base + SPACEMIT_ICR); val &=3D ~(SPACEMIT_CR_TB | SPACEMIT_CR_ACKNAK | SPACEMIT_CR_STOP | SPACE= MIT_CR_START); - writel(val, i2c->base + SPACEMIT_ICR); =20 switch (i2c->state) { case SPACEMIT_STATE_START: @@ -429,14 +415,18 @@ static irqreturn_t spacemit_i2c_irq_handler(int irq, = void *devid) } =20 if (i2c->state !=3D SPACEMIT_STATE_IDLE) { + val |=3D SPACEMIT_CR_TB; + if (i2c->is_pio) + val |=3D SPACEMIT_CR_ALDIE; + if (spacemit_i2c_is_last_msg(i2c)) { /* trigger next byte with stop */ - spacemit_i2c_stop(i2c); - } else { - /* trigger next byte */ - val |=3D SPACEMIT_CR_ALDIE | SPACEMIT_CR_TB; - writel(val, i2c->base + SPACEMIT_ICR); + val |=3D SPACEMIT_CR_STOP; + + if (i2c->read) + val |=3D SPACEMIT_CR_ACKNAK; } + writel(val, i2c->base + SPACEMIT_ICR); } =20 err_out: --=20 2.50.1 From nobody Fri Oct 3 18:01:17 2025 Received: from smtpbguseast3.qq.com (smtpbguseast3.qq.com [54.243.244.52]) (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 8917A319879; Wed, 27 Aug 2025 07:40:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.243.244.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756280442; cv=none; b=bQ4/MQ36ul9U6Ktc6sE67rOrERdYJ/BPVIhFFbCY5AjXTe9xIQN0+nGx8LWc3mn60U6D3vSNG9moJkCrqso3R0LI9ChEHMYslj8Uor462iZBD+H05SHMWua4AqltVw4a/XsFq2aWOL8IPOQUJI5Q/fWT9kFCzO8ucA2pt+w87s0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756280442; c=relaxed/simple; bh=XOadE6q3hu9FC4+hTj5B4E1CAH50HQ7DCsTZxRN6P5w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=m0xOv/PMGuteIL+Nza8tEOO5sEUWYNDZnctQeg/nugWxnpReYGH4QUtXpsDp04XzGNJyE1caE2cz95jbdqTHxi2L+ddEoE2igzxl3dtv4FYsmlihLnI5NPohIoDP24Zh+qyrxiAgphNTmqW8f6rMLvHo69RFpIr9K6TGsyhtXWI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com; spf=none smtp.mailfrom=linux.spacemit.com; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b=KnA0Opp0; arc=none smtp.client-ip=54.243.244.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b="KnA0Opp0" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.spacemit.com; s=mxsw2412; t=1756280373; bh=nKPBFDqV4arLHxi9pnW8A0Xaua5oHEAMsVmNRknIIhU=; h=From:Date:Subject:MIME-Version:Message-Id:To; b=KnA0Opp0Y2oPPj2kRutvUvQQwpR7MQdNwQxA7S0Q5TS1jkAG18e9fkAP0+YO9jpfo 6UlOvnNn9wrl99dveSLPXm8aPoxvKFTcUl7S8pV6V14N3OwTeGeIekhpyqlevVni/a urxwiWJIw0V08IHDu/QgHGi9sLAVnV9ZSmTDewnQ= X-QQ-mid: esmtpgz13t1756280367t3f9802a7 X-QQ-Originating-IP: Gt/FPg+zJdLaLf1gU3G30sXjbP02MyYwIclFs2aVKNY= Received: from = ( [61.145.255.150]) by bizesmtp.qq.com (ESMTP) with id ; Wed, 27 Aug 2025 15:39:25 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 2985033504381610877 EX-QQ-RecipientCnt: 9 From: Troy Mitchell Date: Wed, 27 Aug 2025 15:39:10 +0800 Subject: [PATCH 3/6] i2c: spacemit: disable SDA glitch fix to avoid restart delay 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-k1-i2c-atomic-v1-3-e59bea02d680@linux.spacemit.com> References: <20250827-k1-i2c-atomic-v1-0-e59bea02d680@linux.spacemit.com> In-Reply-To: <20250827-k1-i2c-atomic-v1-0-e59bea02d680@linux.spacemit.com> To: Andi Shyti , Yixun Lan , Alex Elder , Troy Mitchell Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, Troy Mitchell X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1756280357; l=2255; i=troy.mitchell@linux.spacemit.com; s=20250710; h=from:subject:message-id; bh=XOadE6q3hu9FC4+hTj5B4E1CAH50HQ7DCsTZxRN6P5w=; b=Y9zQihml6SFgzLnNFvIYUCpA939k2Lzx7ML2GodAd0uKVXap/b6Ez47Q1y4B/U9tU8+wDNoK2 aTOGsgN494GCFus4VUCGlCjGEwRSQHzOsUm10u3OjlutLh+l17Xn7T4 X-Developer-Key: i=troy.mitchell@linux.spacemit.com; a=ed25519; pk=lQa7BzLrq8DfZnChqmwJ5qQk8fP2USmY/4xZ2/MSsXc= X-QQ-SENDSIZE: 520 Feedback-ID: esmtpgz:linux.spacemit.com:qybglogicsvrsz:qybglogicsvrsz3a-0 X-QQ-XMAILINFO: OW4JKxETGMY2QhaCakBTCB0FjQaqcoMM1c7I9ZPm44zlRnzzVP87jDti VUKuVVXZVX0C6OGD2Ghkl+2xAZY+XuE/QUYxJRgXCEuqtM+RRv1/dzSND8Bk5O0LsyDIUdG iWpuzWj+/bhVKu5biftADdtHD8RMRflttEV+rfwuHf1cwrb9MHSWbD6/0bUyYkwXL/kpu9w RlnIb00jfsChiJt5+j3Q3rULDkFTIrNFqvDoO6msmDJ8ydUiP1kPKAqcpSxHW4Ng3hQMV7N /DauvBnxT2isMHGzXHddt4zGU7UaLgACaxUa2fmJSXlzKcy3LCw1KsdeDJxIm0oy1uicXLM E5/JRfZRGRvm8Ia1yrCkCm8nNfaMbS2DAHAQN2L+yMyeDEQ6BklgF/HkJh3SJVSPxJKPVqX sLItFZG78YHYSdy6jAt/675dBNyTP4UszOVpxPhXyODek5ALmDWXDRtRmQjpsP3f4WbMvcx uBBTk3agLCFae8DRvAGJ5BScmoUfJMaDw0BggxWs20VNc1/0ULsXzpLSxj8fxL+F3gN6O9L mjklHjZ1djI/jJfVW8rMzX3HmgBC3rZNofUapSbe6278zfBKg0iOK5tOl9iDt1cMcglZlO2 rKJnMXMhdD2f+wp/6gP2fgnGoGr8QbnUx36W/+lXOwCZgGBh+YRuz0Hkbs3dNx0+Dl/vp2i +/W3F5rc8Nh3MiIKZyjMJDMdyWG5J/9+bcH0ujqMovyL8kr08TArOHbLTNyTEgPSHRflMFR 0vqywq2pKX4ButIbKvDTV4xK8j4R04KWQK+XqgvvNSgkoGs7MHQRwJdL7nqQMozsLTQRGu5 Geh3c0XJZoutQ+V1XDpG8x/aSdPvms99AHlQ6wU89hig0o1mIxOwQaY3gQq0+F4HlJ9bsHK 0V+OAjNZh2Xw1zpodKlpr+L5+a31MWRxHnhV6XbRMv37REFoJfcnrJN4l1EbWd0y5bYrvgz TuFYwb1xpIAFKY8zWTGrHqY1RVTE4y3uCqV3n3V4eTqJYGLL1QpUbEo84FVQLt+1J2C1MV5 W1pxAM0EAQxvhWlPxjRVR/PU5BlvCuP15kMDou3w2f7rYW2xQwPAGh//AKyUZVxyumzJkLI uWbRcg4LrPZwNt5i13AjkaHLy166NB7Dg== X-QQ-XMRINFO: MSVp+SPm3vtS1Vd6Y4Mggwc= X-QQ-RECHKSPAM: 0 The K1 I2C controller has an SDA glitch fix that introduces a small delay on restart signals. While this feature can suppress glitches on SDA when SCL =3D 0, it also delays the restart signal, which may cause unexpected behavior in some transfers. The glitch itself does not affect normal I2C operation, because the I2C specification allows SDA to change while SCL is low. To ensure correct transmission for every message, we disable the SDA glitch fix by setting the RCR.SDA_GLITCH_NOFIX bit during initialization. This guarantees that restarts are issued promptly without unintended delays. Fixes: 5ea558473fa31 ("i2c: spacemit: add support for SpacemiT K1 SoC") Signed-off-by: Troy Mitchell Reviewed-by: Aurelien Jarno --- drivers/i2c/busses/i2c-k1.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/i2c/busses/i2c-k1.c b/drivers/i2c/busses/i2c-k1.c index d342752030d077953adf84a2886211de96e843c4..c1656b78f1681729ccc2ebca6e2= 90259d14889d9 100644 --- a/drivers/i2c/busses/i2c-k1.c +++ b/drivers/i2c/busses/i2c-k1.c @@ -14,6 +14,7 @@ #define SPACEMIT_ICR 0x0 /* Control register */ #define SPACEMIT_ISR 0x4 /* Status register */ #define SPACEMIT_IDBR 0xc /* Data buffer register */ +#define SPACEMIT_IRCR 0x18 /* Reset cycle counter */ #define SPACEMIT_IBMR 0x1c /* Bus monitor register */ =20 /* SPACEMIT_ICR register fields */ @@ -76,6 +77,8 @@ SPACEMIT_SR_GCAD | SPACEMIT_SR_IRF | SPACEMIT_SR_ITE | \ SPACEMIT_SR_ALD) =20 +#define SPACEMIT_RCR_SDA_GLITCH_NOFIX BIT(7) /* bypass the SDA glitch fi= x */ + /* SPACEMIT_IBMR register fields */ #define SPACEMIT_BMR_SDA BIT(0) /* SDA line level */ #define SPACEMIT_BMR_SCL BIT(1) /* SCL line level */ @@ -237,6 +240,14 @@ static void spacemit_i2c_init(struct spacemit_i2c_dev = *i2c) val |=3D SPACEMIT_CR_MSDE | SPACEMIT_CR_MSDIE; =20 writel(val, i2c->base + SPACEMIT_ICR); + + /* + * The glitch fix in the K1 I2C controller introduces a delay + * on restart signals, so we disable the fix here. + */ + val =3D readl(i2c->base + SPACEMIT_IRCR); + val |=3D SPACEMIT_RCR_SDA_GLITCH_NOFIX; + writel(val, i2c->base + SPACEMIT_IRCR); } =20 static inline void --=20 2.50.1 From nobody Fri Oct 3 18:01:17 2025 Received: from smtpbgjp3.qq.com (smtpbgjp3.qq.com [54.92.39.34]) (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 342D831AF13; Wed, 27 Aug 2025 07:40:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.92.39.34 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756280447; cv=none; b=Bw05bcMd4xCK2UhP3B83dyrnteaKWk8Yn+y9yAxEt0GWW67OFeeLwl97+thrZXyYOYb/KWm+iXE+dCLzbk752+gF/ichVzjIexf70nGicd5st1EAHNj7HPcfFv2ybcZ3cSY6H1B7Me5YmMtb2BjpbKkAIx2OnKCivfcJjFIa+ts= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756280447; c=relaxed/simple; bh=PS5Zvw9vCBoK2sxY5564TXob7NjC4x5wDGBxan0GwME=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kK4be77sYAVZ57mcH8rtRrjRLsEDTEU1I89R08J2n2hly8gl04wlpf8pj1zdNM8gczHs9lkoNDyIkmGLKLUBQZo3LycY8C9HahG0ZYNWkM3dU8J+nAieHQJ35XVdpjv/JpUWtWdgCHM1YO3zKip0wCYM1WUxBHkCqlOPI/Y2x6s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com; spf=none smtp.mailfrom=linux.spacemit.com; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b=SpOC/U8m; arc=none smtp.client-ip=54.92.39.34 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b="SpOC/U8m" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.spacemit.com; s=mxsw2412; t=1756280377; bh=e5+owk1uAYBTF93PFpAJK0JqY6PBkAe/4DC7iS4iir8=; h=From:Date:Subject:MIME-Version:Message-Id:To; b=SpOC/U8mN7WSwZwCPRFV/4rG3tEwau48BTNV9mmaO7iqNBl8UBPI770rSa58GV76z 3F1VSHuHu+70V9vp2ZPZoWqKO/GPrpiY1bDcu/yHwxE1fvJIBRSWtwHHNMhVWHTHf6 edZ3TEe52u4L9zoaU/w6DmafPsItRmscf+T+05MU= X-QQ-mid: esmtpsz17t1756280370t76cd2e64 X-QQ-Originating-IP: 4KxmlR3k18jrmUU1/A7Vxlrw7fyygkaJunOhRTtTDAE= Received: from = ( [61.145.255.150]) by bizesmtp.qq.com (ESMTP) with id ; Wed, 27 Aug 2025 15:39:28 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 5378607378161519260 EX-QQ-RecipientCnt: 9 From: Troy Mitchell Date: Wed, 27 Aug 2025 15:39:11 +0800 Subject: [PATCH 4/6] i2c: spacemit: check SDA instead of SCL after bus reset 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-k1-i2c-atomic-v1-4-e59bea02d680@linux.spacemit.com> References: <20250827-k1-i2c-atomic-v1-0-e59bea02d680@linux.spacemit.com> In-Reply-To: <20250827-k1-i2c-atomic-v1-0-e59bea02d680@linux.spacemit.com> To: Andi Shyti , Yixun Lan , Alex Elder , Troy Mitchell Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, Troy Mitchell X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1756280357; l=1289; i=troy.mitchell@linux.spacemit.com; s=20250710; h=from:subject:message-id; bh=PS5Zvw9vCBoK2sxY5564TXob7NjC4x5wDGBxan0GwME=; b=DfQOA5jSSX/MOSAzQ5/dhpQsXjTWoVaHkWimnwdpNKX29NSLOC4e0lV+lilOWxcI1Yg/7BW/J tIZ7zLI9g7GB+eBoskxop7iYcmL8U7eD6yIdKtbmocVkGTeN6rH96Gz X-Developer-Key: i=troy.mitchell@linux.spacemit.com; a=ed25519; pk=lQa7BzLrq8DfZnChqmwJ5qQk8fP2USmY/4xZ2/MSsXc= X-QQ-SENDSIZE: 520 Feedback-ID: esmtpsz:linux.spacemit.com:qybglogicsvrsz:qybglogicsvrsz3a-0 X-QQ-XMAILINFO: NqN/wpVFVRYXUPmS2RiyfcIGsRvjDIfV9l+tOIQLlYCUG7f2p/wnus+y YZmF6piUbAg320DS0zSSr8HXmZyAWQAY4kvgl12GRTBE7VsaESImF358MXQlyrvaSG7+5UP LJf1prqvWLLZWaJcEa8F7prye6tw+PnRiocAAm8GFDNqMXWLufD/38wO/EcAx87zEYKHeXC wtfRw5hgzF8uc472SJPpKrIcihFBq5Kags34O8rPfd5vyGoeZ7ueK2ReXk4hNE5Gfv+o+uO EOMDJvL1uBfLgQuAFNuh9+8p6tQU9BIkLh9OKxJRLD+50ky7JSsgir6J2tChXiU8411JKKh F6xFeXZnVteN9cJGCPrU60Dwo8whMTXt4yJTGpHYfASb5tb456IqcU7VwYKZND1mzTx7UYy B9rAWzYTeG7gvTre5Dp64LN3XJOxEu3nWlUT8gmTi5B13RKr4qlFZBPxKUc2ZD36uLCMCv5 9aEfywhJB3qEbKW+sToYn9cumN7vQKDKD3ayZ50ojQTfVKLqNqGy9GTDYr7N034dfQQEnas lLTffwrxCJ4nLqomv0ElX49K/AXknOq8t5TWYR0y3lkd2CL71FQjjHUdMgifoLmOd+AMOl5 VyJ8ETp5PWsFzKcJeZYBLNnK8sFC99WzCtFJ44OXJyfltomfDGbLn9Q/iQCk6/woGTjd9Ly /K+kbH+nDPxyf51TudnYAbXiKIDbx/c/vZmuxjfOUi6zYzNhpT+4H+OQA0b8axMM5CuKseR EqM0AkeM8doeaoBCN+tmwqvKR87Gkz9RlqA3mi0VncESFcTarkTrO8azprMd5LsP/R9Gj5g 5gLOKAn/4sTaTWiTDo8XKjomZ9zMBzEbo2qTnow7yB9WCdKUwjSKlamHHQu6bKxbjKM9JnZ Sw5lNGoNX29Fpp3OowUjjZgbuXieYJ/kqH/IfcdEjuIVJM8fS41fB2Y1Cnr+davQRezJuOB Pb+16Cc9XGlqIzflV30FM5aZ3ER8h27mx2tFMx/WQGlgF/jNZHbuXWbne2uwDsYlxna8Pwk +pz/mqwwWQmm5c3f/StyhonQn9vxskl3W9WAylNuGTMzrXkBa7QMeRDEfmCufjzY+iePohD h8aGckbjrx9sDGZLmfPl7EVrak7Zo0Teg== X-QQ-XMRINFO: NI4Ajvh11aEj8Xl/2s1/T8w= X-QQ-RECHKSPAM: 0 After calling spacemit_i2c_conditionally_reset_bus(), the controller should ensure that the SDA line is release before proceeding. Previously, the driver checked the SCL line instead, which does not guarantee that the bus is truly idle. This patch changes the check to verify SDA. This ensures proper bus recovery and avoids potential communication errors after a conditional reset. Fixes: 5ea558473fa31 ("i2c: spacemit: add support for SpacemiT K1 SoC") Signed-off-by: Troy Mitchell Reviewed-by: Aurelien Jarno --- drivers/i2c/busses/i2c-k1.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/i2c/busses/i2c-k1.c b/drivers/i2c/busses/i2c-k1.c index c1656b78f1681729ccc2ebca6e290259d14889d9..4d78ee7b6929ee43771e500d4f8= 5d9e55e68b221 100644 --- a/drivers/i2c/busses/i2c-k1.c +++ b/drivers/i2c/busses/i2c-k1.c @@ -172,9 +172,9 @@ static void spacemit_i2c_conditionally_reset_bus(struct= spacemit_i2c_dev *i2c) spacemit_i2c_reset(i2c); usleep_range(10, 20); =20 - /* check scl status again */ + /* check sda again here */ status =3D readl(i2c->base + SPACEMIT_IBMR); - if (!(status & SPACEMIT_BMR_SCL)) + if (!(status & SPACEMIT_BMR_SDA)) dev_warn_ratelimited(i2c->dev, "unit reset failed\n"); } =20 --=20 2.50.1 From nobody Fri Oct 3 18:01:17 2025 Received: from smtpbgeu2.qq.com (smtpbgeu2.qq.com [18.194.254.142]) (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 7AC1B31A540; Wed, 27 Aug 2025 07:40:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=18.194.254.142 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756280451; cv=none; b=WbIT76qZua6Srkch8JzqSmIp4CfoLN6rhWS8ZTJFmlz8peRi6aPToxQbpBiPPb9XS9N2RWLWWDxEWZzKjDyWJFdrpVg0SC4FnlXJnStiK7VGUPTpElIXq/1IwGf2OCR1fCPLwlCkVHOG4r/XDlUWkB+Rj0JOZK68TWgnpMP0HVA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756280451; c=relaxed/simple; bh=N/MIBGWdKMusWYQh+IE7iWqeuc/rxrsn46nwIp2rkh8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kZ87NFLrrJN6SirT/kLl/pgRHzGRGRDSsPjFPPmuUddcUQ87px5EtSyiH7/jJhGwbJeKqS+oTEaz+gfBkuIqDfqnpDN5Hn5+9MEu6XzcD1ZjsTbzPzmtPRsgkaOUXe45lFoR4aVD+XAg8F2xfoT9BWA7dbSYR5F8IB+lHMc85Cc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com; spf=none smtp.mailfrom=linux.spacemit.com; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b=mSRQuziy; arc=none smtp.client-ip=18.194.254.142 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b="mSRQuziy" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.spacemit.com; s=mxsw2412; t=1756280380; bh=dZxBMt86SKCOY/w9ehAJ3MRPpPBc0NxW//Q8PLXehac=; h=From:Date:Subject:MIME-Version:Message-Id:To; b=mSRQuziy5Yf8B5+st4QKRAqBeVbXr1LgK8l6wYnZzuZ+bId6SHErHznZKnhVPb98v nDTcq7k51USk0Q+/m38gf0Gg/tjycrwrHi5goeoKoIPiyEDk23Pan0G1b69a1neE5W bRu6wlJMNCAFP0btbio6RIXDYrSYMQRlOSGoYE4Q= X-QQ-mid: zesmtpgz5t1756280373t997deac4 X-QQ-Originating-IP: eGdDigAjQ7bi+vHd1UWDFlX21gqYJLpym9L+1kE6YKU= Received: from = ( [61.145.255.150]) by bizesmtp.qq.com (ESMTP) with id ; Wed, 27 Aug 2025 15:39:32 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 7939611079706169338 EX-QQ-RecipientCnt: 9 From: Troy Mitchell Date: Wed, 27 Aug 2025 15:39:12 +0800 Subject: [PATCH 5/6] i2c: spacemit: ensure SDA is released after bus reset 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-k1-i2c-atomic-v1-5-e59bea02d680@linux.spacemit.com> References: <20250827-k1-i2c-atomic-v1-0-e59bea02d680@linux.spacemit.com> In-Reply-To: <20250827-k1-i2c-atomic-v1-0-e59bea02d680@linux.spacemit.com> To: Andi Shyti , Yixun Lan , Alex Elder , Troy Mitchell Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, Troy Mitchell X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1756280357; l=3354; i=troy.mitchell@linux.spacemit.com; s=20250710; h=from:subject:message-id; bh=N/MIBGWdKMusWYQh+IE7iWqeuc/rxrsn46nwIp2rkh8=; b=Ls/K6GXozvyjgJrMx+La90IrRGLCE0mHghea4y/6w4HrQLk/PPk3a8tKHS40YJbMBVu5yhmGb buX3D46J7S1DMicQ/+EnfV6Z26hm7ozie6c0OIGhr1AaX6YqGbHjpsU X-Developer-Key: i=troy.mitchell@linux.spacemit.com; a=ed25519; pk=lQa7BzLrq8DfZnChqmwJ5qQk8fP2USmY/4xZ2/MSsXc= X-QQ-SENDSIZE: 520 Feedback-ID: zesmtpgz:linux.spacemit.com:qybglogicsvrsz:qybglogicsvrsz3a-0 X-QQ-XMAILINFO: N8arHCzhf4/cmIVcGeLtNQIiaiYPkkgUUhAfUvCuOyuIAnf1iG8c3m+t z4RJwfVL/Z/LzLIguRwb24+e/FwLjgQHUGo6jR6dFBUU0UYWFMKW68NoY64Xm1ZLz5Q9Bri Zp15oc8Ro0qaIo4C2gQuZvIcLfUnE0z0Gb3p3VtLrw551BSxUt3Qzn5AMrzlkq+6oh3355X XeT6KNvdjAIsrTUeSH0ae9DN5TqZ9tLFfvofaNYZDmbAjCtfwV9iesIWf1V/uDEC5VELt0l 09bNb+qSORiivkobuhGCDrYkh2U4oYbF/K3dyfQXLzh4lutyBlWpf2+oCrLgfRcW8pTvBUZ trZPl9whI9qEYEqvUOMff4b3K2+m8vefgVbCt20bcVrZ3skikFuMyPMjw9+9JACZ0ZW03xZ BnlCmCpAtzp4Au4Kc8qLZFcEG0hyqZN4GNNdej7PqVrjfleJ1pVaBkO6jpPqfFsPI2rOIbU ZAdaX5gqBdS5/MD8JI/7Vvm3Nzc4JN20b05ODesF5penlEL6VIUfS/goZ+ir8BqvCw6B0H2 U/5k6n1VrynaeOLVDIS0TkQjmsHf9P9vOHhs+2mheuAThHrkZooONWwqicCH3wieWPTsrtM vFEhorqXwBwkIJrDp02eo0EyITtmwv7L9hu6xMSTLh0UV0rVlfY+EZ8gkH5h5JyyOzQtLyS 1ccfepyfY7wdGTXSKii3qW1IjSzb9KjKfEFqco6ouXPDhN9idBYMIR0QtzQQmnCi58j+HIO 9I/mh/W90c1mFcJUsRMs4p5pcbDcSzF4sz4P8aNr/pSOClvYEDVDhlr0KPrYKwWMTshv3VE uZRv+S9A7DYkSGE+Nbd6WlupH8OBgv93DqDZEwTNr1Mlz3zhgVrc6qinLeGrKCh1uhYRJA0 BwHekUUcTLcBQLQGsmC6KOfEaial2AOns62Wh41yjdhbfVjGbYPtpJ35MUKhKhCJYfOX8qv fbAK+jJdHqNepkpG7B3K+yKxrW/GJb6GmQCo8BBz8Flv3nRV32CDn0AgHusrCAONPIoLvIa p2nGFBgopjT9ypvV9H+Nl9RTDQVcXfWF097TrxETiuZJfF65WtCzEl3MfDA51X0dEWXrq6o MTHJjlk/JZwSfpuBHENE95XQ9UTa6oYRQ== X-QQ-XMRINFO: NyFYKkN4Ny6FSmKK/uo/jdU= X-QQ-RECHKSPAM: 0 After performing a conditional bus reset, the controller must ensure that the SDA line is actually released. Previously, the reset routine only performed a single check, which could leave the bus in a locked state in some situations. This patch introduces a loop that toggles the reset cycle and issues a reset request up to SPACEMIT_BUS_RESET_CLK_CNT_MAX times, checking SDA after each attempt. If SDA is released before the maximum count, the function returns early. Otherwise, a warning is emitted. This change improves bus recovery reliability. Fixes: 5ea558473fa31 ("i2c: spacemit: add support for SpacemiT K1 SoC") Signed-off-by: Troy Mitchell --- drivers/i2c/busses/i2c-k1.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-k1.c b/drivers/i2c/busses/i2c-k1.c index 4d78ee7b6929ee43771e500d4f85d9e55e68b221..d2c0d20d19ba73baa8b2e9a6acb= 02b2cc3b7243f 100644 --- a/drivers/i2c/busses/i2c-k1.c +++ b/drivers/i2c/busses/i2c-k1.c @@ -3,6 +3,7 @@ * Copyright (C) 2024-2025 Troy Mitchell */ =20 +#include #include #include #include @@ -26,7 +27,8 @@ #define SPACEMIT_CR_MODE_FAST BIT(8) /* bus mode (master operation) */ /* Bit 9 is reserved */ #define SPACEMIT_CR_UR BIT(10) /* unit reset */ -/* Bits 11-12 are reserved */ +#define SPACEMIT_CR_RSTREQ BIT(11) /* i2c bus reset request */ +/* Bit 12 is reserved */ #define SPACEMIT_CR_SCLE BIT(13) /* master clock enable */ #define SPACEMIT_CR_IUE BIT(14) /* unit enable */ /* Bits 15-17 are reserved */ @@ -78,6 +80,7 @@ SPACEMIT_SR_ALD) =20 #define SPACEMIT_RCR_SDA_GLITCH_NOFIX BIT(7) /* bypass the SDA glitch fi= x */ +#define SPACEMIT_RCR_FIELD_RST_CYC GENMASK(3, 0) /* bypass the SDA glitch= fix */ =20 /* SPACEMIT_IBMR register fields */ #define SPACEMIT_BMR_SDA BIT(0) /* SDA line level */ @@ -91,6 +94,8 @@ =20 #define SPACEMIT_SR_ERR (SPACEMIT_SR_BED | SPACEMIT_SR_RXOV | SPACEMIT_SR_= ALD) =20 +#define SPACEMIT_BUS_RESET_CLK_CNT_MAX 9 + enum spacemit_i2c_state { SPACEMIT_STATE_IDLE, SPACEMIT_STATE_START, @@ -163,6 +168,7 @@ static int spacemit_i2c_handle_err(struct spacemit_i2c_= dev *i2c) static void spacemit_i2c_conditionally_reset_bus(struct spacemit_i2c_dev *= i2c) { u32 status; + u8 clk_cnt; =20 /* if bus is locked, reset unit. 0: locked */ status =3D readl(i2c->base + SPACEMIT_IBMR); @@ -172,6 +178,21 @@ static void spacemit_i2c_conditionally_reset_bus(struc= t spacemit_i2c_dev *i2c) spacemit_i2c_reset(i2c); usleep_range(10, 20); =20 + for (clk_cnt =3D 0; clk_cnt < SPACEMIT_BUS_RESET_CLK_CNT_MAX; clk_cnt++) { + status =3D readl(i2c->base + SPACEMIT_IBMR); + if (status & SPACEMIT_BMR_SDA) + break; + + /* There's nothing left to save here, we are about to exit */ + writel(FIELD_PREP(SPACEMIT_RCR_FIELD_RST_CYC, 1), + i2c->base + SPACEMIT_IRCR); + writel(SPACEMIT_CR_RSTREQ, i2c->base + SPACEMIT_ICR); + usleep_range(20, 30); + } + + if (clk_cnt < SPACEMIT_BUS_RESET_CLK_CNT_MAX) + return; + /* check sda again here */ status =3D readl(i2c->base + SPACEMIT_IBMR); if (!(status & SPACEMIT_BMR_SDA)) --=20 2.50.1 From nobody Fri Oct 3 18:01:17 2025 Received: from smtpbgbr1.qq.com (smtpbgbr1.qq.com [54.207.19.206]) (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 CB1B731A04F; Wed, 27 Aug 2025 07:40:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=54.207.19.206 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756280459; cv=none; b=NBM4F6KxcPfsj7bvk+M741lWI8EO260i26ExPK1WnrAV7rQkqKqfIwf+XWlAE3oGcSngGP4kpy/EXYghhgAEsfXNx85FvrM0b240cJaciAS42s+OSmYHe31Pvjg3dQ4D1msuLe7FWXVL5FcEth/TdGp4R0AV2zHTvVZtU1ha5Yk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756280459; c=relaxed/simple; bh=SOwxrwMY5q6SLeifggiTWiBT3jVxztapPvG1+sfX4ZI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=iC6MO3tT3xCOLNFh9SdXV2CiIbHy8rN9BxAWXLzyAgvUfAJoSWnncnOAE/R0X+4FLVaGKxN1W64fZxQB47zD3H8nINFPLuckVVG+Eq+RStn1xCPncn2ww4QVW7n2Ai7YzE/X6qFZGkXXu2qdA9AxrSpWFMv0/XHnAM+CZloN1T4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com; spf=none smtp.mailfrom=linux.spacemit.com; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b=YFgkrUvk; arc=none smtp.client-ip=54.207.19.206 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.spacemit.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.spacemit.com header.i=@linux.spacemit.com header.b="YFgkrUvk" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.spacemit.com; s=mxsw2412; t=1756280383; bh=gk0AuPbE2e1go6AHp83tTfSoDlCJp9KcBO9I8dQc2/w=; h=From:Date:Subject:MIME-Version:Message-Id:To; b=YFgkrUvkBPJDF8SKkTcZ/LEwFpmJNLKvwQOPRRIkFKyxNCf+3rBy5eG8dhAud86BX MPmfcuInq9e6Z0wqpW0/Z1GOCUD9CCvE9EygDs1z4A7p28oi0V1153dAAhBoWVUt7G LsjJwNd3oTN8EgGeRN2wUgkcNR2jGGJigc2kp1BY= X-QQ-mid: esmtpsz18t1756280376t60a65922 X-QQ-Originating-IP: t+rbXBFCAiMUmuHnikv4NQQjcUFmojpqdPPAsHLpmyQ= Received: from = ( [61.145.255.150]) by bizesmtp.qq.com (ESMTP) with id ; Wed, 27 Aug 2025 15:39:34 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 13364597237366048741 EX-QQ-RecipientCnt: 9 From: Troy Mitchell Date: Wed, 27 Aug 2025 15:39:13 +0800 Subject: [PATCH 6/6] i2c: spacemit: introduce pio for k1 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-k1-i2c-atomic-v1-6-e59bea02d680@linux.spacemit.com> References: <20250827-k1-i2c-atomic-v1-0-e59bea02d680@linux.spacemit.com> In-Reply-To: <20250827-k1-i2c-atomic-v1-0-e59bea02d680@linux.spacemit.com> To: Andi Shyti , Yixun Lan , Alex Elder , Troy Mitchell Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, Troy Mitchell X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1756280357; l=8587; i=troy.mitchell@linux.spacemit.com; s=20250710; h=from:subject:message-id; bh=SOwxrwMY5q6SLeifggiTWiBT3jVxztapPvG1+sfX4ZI=; b=IUbNhkXO6wLZ0DN2n/Z79Z/ehMLvBpWeVOlBAcc8pVB1OTfUf665KFDKRU2qq6cNGgbUChruG fNRe5T1CM4GDqhUTksaumB3W1PtQCDWGXUJ6H8rYkobVOrKxFyCQjng X-Developer-Key: i=troy.mitchell@linux.spacemit.com; a=ed25519; pk=lQa7BzLrq8DfZnChqmwJ5qQk8fP2USmY/4xZ2/MSsXc= X-QQ-SENDSIZE: 520 Feedback-ID: esmtpsz:linux.spacemit.com:qybglogicsvrsz:qybglogicsvrsz3a-0 X-QQ-XMAILINFO: N32BSuq9GV7o+MV9TnBdRTukzhIXEXxy9DSgus6bc6vzM+Jjeb4zCZ3M Ur+0RtAzA4PETQtqi5zyOqmQunMnjqXvdEJgFJwEOHJwNj0PZibN5YLVw9z7VMEW74RS0+l AwR595G9JvlSFEbhhteK/8zOdE2D0hncbdgPmPxoDB16UzwJXDlQ/CSoA/YVF5SkFCxJS7O ntGkjpW76cRX3ELopXJQXXWOQDH1pQKLTA2V6OT+loGDtaGjwId6O6qmSFcK76XjeSeDk/n NFl9N3cvnmzi8C79t9MsS9GqUs9nT1TeXJSOqiorX2WkeHBm3ypBWU58jTOQeowQaQHOPSM L2A3jkPSW8wTEgDDQZ2+N+erSNMxJNLc2cAoffSX5mmoAEdqec/KYMucutjramisfKiaD4W xUH+z8zXuT79jjLhD7XoYbEkx++L74fHv+H5Lcxkm7emTz00bqyFgz5lLjcxQLW5ZSl56NA C6boyK34TzQVj4MvGT8cUEfCZoX28VE9OHDlnBNtQ22PS9/JJTYV9ldk3PqzMXCy8h/rNTT j3aghQTb9sEpS5aiV/rnM0iln0c+6B2n2OJsGS8OEz7yo00SWK/TxTCgqTChiLFED4eTDoR gZzrMRKq/5oTFEbSY9N1I09vbVgCabK2JN3L6OiFoTXy0CmxXBUXWE83P6WwMyfovErIySI x2M7AUwoZtqoOdeFeLXLZDCj1ul57+XUt0Q6TctQxZbevpcfcrUIJKMY0he8/0FfdCwZrlH OjOR5N2i0lhprqFnlydDcNwbeQXjAJNTUTfiMt40Z24Bpt0Um6vkqCtPKpFhP6v1gr28xAW EfdgoWLw+vKrocQjeiM+GJEBKRLx1ppRokHd2tCUSYvl1Ee5O55vCGWEOYmHqJK8KzKFZTr b4alwh2qnyZJY1/oKbTg9LmddDsYe6RoUDar1zIF8Ejzm7YaxYJK2SU2w7UyL08RKVKoC+X RRzEg9I3htVOHgZK2ewUHdJHChtxYFyU7UeyRLVqMNG7XXFpuTmm3FSdY5O3ltq09pFvmUE eca0XJk4uLXuvAGgw1BnalKzprSsdHVoVbYpTdOQD64mKQU6hVmYedwTsDCdBkn3hFi/GXR lQu6K0IpGlKyrozczi30QZ2/FQsf+68PgxRlnTfKfK1XgihZoumuCm3iT4JM+t4ug== X-QQ-XMRINFO: OWPUhxQsoeAVDbp3OJHYyFg= X-QQ-RECHKSPAM: 0 This patch introduces I2C PIO functionality for the Spacemit K1 SoC, enabling the use of I2C with interrupts disabled. Signed-off-by: Troy Mitchell --- drivers/i2c/busses/i2c-k1.c | 139 ++++++++++++++++++++++++++++++++++++++--= ---- 1 file changed, 120 insertions(+), 19 deletions(-) diff --git a/drivers/i2c/busses/i2c-k1.c b/drivers/i2c/busses/i2c-k1.c index d2c0d20d19ba73baa8b2e9a6acb02b2cc3b7243f..e558fe4cbd5a78b5b53b0c02cbb= ca818b6495d4a 100644 --- a/drivers/i2c/busses/i2c-k1.c +++ b/drivers/i2c/busses/i2c-k1.c @@ -124,6 +124,7 @@ struct spacemit_i2c_dev { =20 enum spacemit_i2c_state state; bool read; + bool is_pio; struct completion complete; u32 status; }; @@ -228,7 +229,7 @@ static void spacemit_i2c_check_bus_release(struct space= mit_i2c_dev *i2c) =20 static void spacemit_i2c_init(struct spacemit_i2c_dev *i2c) { - u32 val; + u32 val =3D 0; =20 /* * Unmask interrupt bits for all xfer mode: @@ -236,7 +237,8 @@ static void spacemit_i2c_init(struct spacemit_i2c_dev *= i2c) * For transaction complete signal, we use master stop * interrupt, so we don't need to unmask SPACEMIT_CR_TXDONEIE. */ - val =3D SPACEMIT_CR_BEIE | SPACEMIT_CR_ALDIE; + if (!i2c->is_pio) + val =3D SPACEMIT_CR_BEIE | SPACEMIT_CR_ALDIE; =20 /* * Unmask interrupt bits for interrupt xfer mode: @@ -246,7 +248,8 @@ static void spacemit_i2c_init(struct spacemit_i2c_dev *= i2c) * i2c_start function. * Otherwise, it will cause an erroneous empty interrupt before i2c_start. */ - val |=3D SPACEMIT_CR_DRFIE; + if (!i2c->is_pio) + val |=3D SPACEMIT_CR_DRFIE; =20 if (i2c->clock_freq =3D=3D SPACEMIT_I2C_MAX_FAST_MODE_FREQ) val |=3D SPACEMIT_CR_MODE_FAST; @@ -258,7 +261,10 @@ static void spacemit_i2c_init(struct spacemit_i2c_dev = *i2c) val |=3D SPACEMIT_CR_SCLE; =20 /* enable master stop detected */ - val |=3D SPACEMIT_CR_MSDE | SPACEMIT_CR_MSDIE; + val |=3D SPACEMIT_CR_MSDE; + + if (!i2c->is_pio) + val |=3D SPACEMIT_CR_MSDIE; =20 writel(val, i2c->base + SPACEMIT_ICR); =20 @@ -295,10 +301,54 @@ static void spacemit_i2c_start(struct spacemit_i2c_de= v *i2c) /* send start pulse */ val =3D readl(i2c->base + SPACEMIT_ICR); val &=3D ~SPACEMIT_CR_STOP; - val |=3D SPACEMIT_CR_START | SPACEMIT_CR_TB | SPACEMIT_CR_DTEIE; + val |=3D SPACEMIT_CR_START | SPACEMIT_CR_TB; + + if (!i2c->is_pio) + val |=3D SPACEMIT_CR_DTEIE; + writel(val, i2c->base + SPACEMIT_ICR); } =20 +static irqreturn_t spacemit_i2c_irq_handler(int irq, void *devid); +static int spacemit_i2c_wait_pio_xfer(struct spacemit_i2c_dev *i2c) +{ + u32 msec =3D jiffies_to_msecs(i2c->adapt.timeout); + ktime_t timeout =3D ktime_add_ms(ktime_get(), msec); + int ret; + + while (i2c->unprocessed && ktime_compare(ktime_get(), timeout) < 0) { + udelay(10); + i2c->status =3D readl(i2c->base + SPACEMIT_ISR); + + spacemit_i2c_clear_int_status(i2c, i2c->status); + + if (!(i2c->status & SPACEMIT_SR_IRF) && !(i2c->status & SPACEMIT_SR_ITE)) + continue; + + spacemit_i2c_irq_handler(0, i2c); + + i2c->status =3D readl(i2c->base + SPACEMIT_ISR); + + /* + * This is the last byte to write of the current message. + * If we do not wait here, control will proceed directly to start(), + * which would overwrite the current data. + */ + if (!i2c->read && !i2c->unprocessed) { + ret =3D readl_poll_timeout(i2c->base + SPACEMIT_ISR, + i2c->status, i2c->status & SPACEMIT_SR_ITE, + 30, 1000); + if (ret) + return 0; + } + } + + if (i2c->unprocessed) + return 0; + + return 1; +} + static int spacemit_i2c_xfer_msg(struct spacemit_i2c_dev *i2c) { unsigned long time_left; @@ -312,10 +362,27 @@ static int spacemit_i2c_xfer_msg(struct spacemit_i2c_= dev *i2c) =20 reinit_completion(&i2c->complete); =20 - spacemit_i2c_start(i2c); + if (i2c->is_pio) { + disable_irq(i2c->irq); + + /* + * The K1 I2C controller has a quirk: + * when doing PIO transfers, the status register must be cleared + * of all other bits before issuing a START. + * Failing to do so will prevent the transfer from working properly. + */ + spacemit_i2c_clear_int_status(i2c, SPACEMIT_I2C_INT_STATUS_MASK); + + spacemit_i2c_start(i2c); + time_left =3D spacemit_i2c_wait_pio_xfer(i2c); + + enable_irq(i2c->irq); + } else { + spacemit_i2c_start(i2c); + time_left =3D wait_for_completion_timeout(&i2c->complete, + i2c->adapt.timeout); + } =20 - time_left =3D wait_for_completion_timeout(&i2c->complete, - i2c->adapt.timeout); if (!time_left) { dev_err(i2c->dev, "msg completion timeout\n"); spacemit_i2c_conditionally_reset_bus(i2c); @@ -343,6 +410,9 @@ static bool spacemit_i2c_is_last_msg(struct spacemit_i2= c_dev *i2c) =20 static void spacemit_i2c_handle_write(struct spacemit_i2c_dev *i2c) { + if (!(i2c->status & SPACEMIT_SR_ITE)) + return; + /* if transfer completes, SPACEMIT_ISR will handle it */ if (i2c->status & SPACEMIT_SR_MSD) return; @@ -355,14 +425,20 @@ static void spacemit_i2c_handle_write(struct spacemit= _i2c_dev *i2c) =20 /* SPACEMIT_STATE_IDLE avoids trigger next byte */ i2c->state =3D SPACEMIT_STATE_IDLE; - complete(&i2c->complete); + + if (!i2c->is_pio) + complete(&i2c->complete); } =20 static void spacemit_i2c_handle_read(struct spacemit_i2c_dev *i2c) { + if (!(i2c->status & SPACEMIT_SR_IRF)) + return; + if (i2c->unprocessed) { *i2c->msg_buf++ =3D readl(i2c->base + SPACEMIT_IDBR); i2c->unprocessed--; + return; } =20 /* if transfer completes, SPACEMIT_ISR will handle it */ @@ -375,7 +451,9 @@ static void spacemit_i2c_handle_read(struct spacemit_i2= c_dev *i2c) =20 /* SPACEMIT_STATE_IDLE avoids trigger next byte */ i2c->state =3D SPACEMIT_STATE_IDLE; - complete(&i2c->complete); + + if (!i2c->is_pio) + complete(&i2c->complete); } =20 static void spacemit_i2c_handle_start(struct spacemit_i2c_dev *i2c) @@ -410,7 +488,9 @@ static void spacemit_i2c_err_check(struct spacemit_i2c_= dev *i2c) spacemit_i2c_clear_int_status(i2c, SPACEMIT_I2C_INT_STATUS_MASK); =20 i2c->state =3D SPACEMIT_STATE_IDLE; - complete(&i2c->complete); + + if (!i2c->is_pio) + complete(&i2c->complete); } =20 static irqreturn_t spacemit_i2c_irq_handler(int irq, void *devid) @@ -418,13 +498,20 @@ static irqreturn_t spacemit_i2c_irq_handler(int irq, = void *devid) struct spacemit_i2c_dev *i2c =3D devid; u32 status, val; =20 - status =3D readl(i2c->base + SPACEMIT_ISR); - if (!status) - return IRQ_HANDLED; + /* + * In PIO mode, do not read status again. + * It has already been read in wait_pio_xfer(), + * and reading it clears some bits. + */ + if (!i2c->is_pio) { + status =3D readl(i2c->base + SPACEMIT_ISR); + if (!status) + return IRQ_HANDLED; =20 - i2c->status =3D status; + i2c->status =3D status; =20 - spacemit_i2c_clear_int_status(i2c, status); + spacemit_i2c_clear_int_status(i2c, status); + } =20 if (i2c->status & SPACEMIT_SR_ERR) goto err_out; @@ -483,11 +570,14 @@ static void spacemit_i2c_calc_timeout(struct spacemit= _i2c_dev *i2c) i2c->adapt.timeout =3D usecs_to_jiffies(timeout + USEC_PER_SEC / 10) / i2= c->msg_num; } =20 -static int spacemit_i2c_xfer(struct i2c_adapter *adapt, struct i2c_msg *ms= gs, int num) +static inline int +spacemit_i2c_xfer(struct i2c_adapter *adapt, struct i2c_msg *msgs, int num= , bool is_pio) { struct spacemit_i2c_dev *i2c =3D i2c_get_adapdata(adapt); int ret; =20 + i2c->is_pio =3D is_pio; + i2c->msgs =3D msgs; i2c->msg_num =3D num; =20 @@ -510,18 +600,29 @@ static int spacemit_i2c_xfer(struct i2c_adapter *adap= t, struct i2c_msg *msgs, in =20 if (ret =3D=3D -ETIMEDOUT || ret =3D=3D -EAGAIN) dev_err(i2c->dev, "i2c transfer failed, ret %d err 0x%lx\n", - ret, i2c->status & SPACEMIT_SR_ERR); + ret, i2c->status & SPACEMIT_SR_ERR); =20 return ret < 0 ? ret : num; } =20 +static int spacemit_i2c_int_xfer(struct i2c_adapter *adapt, struct i2c_msg= *msgs, int num) +{ + return spacemit_i2c_xfer(adapt, msgs, num, false); +} + +static int spacemit_i2c_pio_xfer(struct i2c_adapter *adapt, struct i2c_msg= *msgs, int num) +{ + return spacemit_i2c_xfer(adapt, msgs, num, true); +} + static u32 spacemit_i2c_func(struct i2c_adapter *adap) { return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK); } =20 static const struct i2c_algorithm spacemit_i2c_algo =3D { - .xfer =3D spacemit_i2c_xfer, + .xfer =3D spacemit_i2c_int_xfer, + .xfer_atomic =3D spacemit_i2c_pio_xfer, .functionality =3D spacemit_i2c_func, }; =20 --=20 2.50.1