From nobody Fri Sep 25 18:20:25 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (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 1B54F55409C; Wed, 9 Sep 2026 14:56:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788965803; cv=none; b=Z8JkAtrLi0D3l/vSgki8tlfOoWHnyZjFwQtB5hXOOro482TrsZ8GwfWfPU3mdaALtSV9vlYwEw4SWAdS5/Ohj5zEr+4EhjtssT4cJh+50gy7xevmzs4THQgXkdCqXg0xZPnREZh+ZmPj6S5KOaaGODXchHFjsw1iLn/76cTNai8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788965803; c=relaxed/simple; bh=PnJBgVnbIgcWLNLYch9cQewKsDFIC4Led3KTymkokH4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jfYaXUsMsEKzVPxyff5yYbJLSzqJrd+tdyJvxsIyhZZSc7UvlcPXZronq+bOqBiL20xZ8a0bNCiuHFMO1VveTHvbKu8DWcMHmxVmLbWwv8f6/K8mgS4JefFJifMAQG+4W/6lwhSKPp85Hv1Ydh25ZsK1XzP7i6p5qjlKbaPxL2E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BgAjzxW9; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="BgAjzxW9" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9AB591F00A3D; Wed, 9 Sep 2026 14:56:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788965801; bh=xQvqh5V0jEHbs9qUBqtF9FaB1INU8MfQPD5WaPzmvXE=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=BgAjzxW9oTcmnwHg/oM/xjTLyIDaxl7iX4kw9aix5b+MeuTyqn/eJJahgw5PKt6Ga /kQcnUYjaa9xomM5KEVrNN/kexYLL1sMWt5IHHqlxP30pDTQoTTdHjDx2oKF/udBKv juJiXeR40VraItdO5rHIEiE5/aqxSuVgNskyTQfBTrNR9q0wi4hj8iHOnqWtnzZGjA bYXupBcRjhQDQdYUEqynIP77PHULgPXZl43Wo2PtYtb6n/aUPtTCrBqbCSYZ2R0ZyC D9+61p3qkIICqvg37w1/hKWPQzSkLau+lrJvWjtO9/afYZXYb7CAJiDiGT3+uXNAr4 mQNHE/C2qQPZg== From: Jisheng Zhang To: Mark Brown Cc: linux-spi@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 1/5] spi: dw: use DW_SPI_ISR directly Date: Wed, 9 Sep 2026 22:36:48 +0800 Message-ID: <20260909143652.9234-2-jszhang@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260909143652.9234-1-jszhang@kernel.org> References: <20260909143652.9234-1-jszhang@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The DW_SPI_ISR register reports the masked interrupts, no need to mask again. Signed-off-by: Jisheng Zhang --- drivers/spi/spi-dw-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/spi/spi-dw-core.c b/drivers/spi/spi-dw-core.c index 206d3f9dd83d..1c060f0ec50c 100644 --- a/drivers/spi/spi-dw-core.c +++ b/drivers/spi/spi-dw-core.c @@ -275,7 +275,7 @@ static irqreturn_t dw_spi_irq(int irq, void *dev_id) { struct spi_controller *ctlr =3D dev_id; struct dw_spi *dws =3D spi_controller_get_devdata(ctlr); - u16 irq_status =3D dw_readl(dws, DW_SPI_ISR) & DW_SPI_INT_MASK; + u16 irq_status =3D dw_readl(dws, DW_SPI_ISR); =20 if (!irq_status) return IRQ_NONE; --=20 2.53.0 From nobody Fri Sep 25 18:20:25 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (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 F2C7B5505DA; Wed, 9 Sep 2026 14:56:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788965804; cv=none; b=IlOXfXGlUvztNRlTVhbeG50GUu/KiNUThhvMJjH8SD6FAyK42/vjDp3zxAbaAuhENZtciy5XPh8J3L17CtLKBmlvV9v5jwx3u2lUsWy0jCCNxlnoAGuZoBd04+pY3pjUMhTEuZaoIRLOj5+vk/QID3HlFEQB64kXh8Q4xSYN+I4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788965804; c=relaxed/simple; bh=YoBqXSNWbmIJDpbWGo5PSN1FJHiwmzLJwcB374omhe4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Kul5zMdVyp4WJEmx+s2qLqUdE+OKKqq+/Lgs6c9AteWT0ZSHMe5wqu6Sl7oMMjWiYm7AzTKXMMtoSB5OPzMeLL8HLo/DjUftjrrNzMbM+7rwQae5aNdBoNgPGIyWHO+EKjZ9b1EkP7npz6uZRRWeC6sbD/rM2HEO+nXmKS1woDQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Q80N7y6j; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Q80N7y6j" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 10E821F00A3E; Wed, 9 Sep 2026 14:56:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788965802; bh=yAQ2P8CHyaU39zrns5eUxUPj6PC6Gwq9Dx1e55SbnRg=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=Q80N7y6jZkn00QJfFwdbi/QK0AnCiZmPSjikaWZumx8C18H6jr7frrV8B4jEX5sUj SLLfrx2u4MGGVBKOgERWjVzW7AkbQZuzhb1Yn8jcMg9WUmzU5yAMNewOaqR7hsbNRF nrfm8e/BbiRnFIAXS4/ISjMaQIfEGqhW4vq037UgzpTwED+fbCUQ+sEPn9dFEscS2p H18Js/Jyahm/9zKieMmt+6rG10Y+RXJazxZQQ/Nf8gybOJzXv7oT64cBF2LiAiC6cp cNin4shA/SCDtRoGYE0wlcHgd0vJUSRPJUU7fWC/rxGRUc5Xc0YJGkjatZeqRI8MXg /24HpqlPE2KBw== From: Jisheng Zhang To: Mark Brown Cc: linux-spi@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 2/5] spi: dw: remove useless dws->transfer_handler check Date: Wed, 9 Sep 2026 22:36:49 +0800 Message-ID: <20260909143652.9234-3-jszhang@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260909143652.9234-1-jszhang@kernel.org> References: <20260909143652.9234-1-jszhang@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" transfer_handler is initialized before any DW SPI interrupt is unmasked. While the IRQ is registered but the handler is NULL, dw_spi_hw_init() has all DW SPI interrupts disabled. Therefore dw_spi_irq() cannot observe a DW SPI interrupt with a NULL transfer_handler. Signed-off-by: Jisheng Zhang --- drivers/spi/spi-dw-core.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/spi/spi-dw-core.c b/drivers/spi/spi-dw-core.c index 1c060f0ec50c..f4c4e9dae25e 100644 --- a/drivers/spi/spi-dw-core.c +++ b/drivers/spi/spi-dw-core.c @@ -280,8 +280,7 @@ static irqreturn_t dw_spi_irq(int irq, void *dev_id) if (!irq_status) return IRQ_NONE; =20 - if (!dws->transfer_handler || - (!ctlr->cur_msg && dws->transfer_handler =3D=3D dw_spi_transfer_handl= er)) { + if (!ctlr->cur_msg && dws->transfer_handler =3D=3D dw_spi_transfer_handle= r) { dw_spi_mask_intr(dws, 0xff); return IRQ_HANDLED; } --=20 2.53.0 From nobody Fri Sep 25 18:20:25 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (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 5B6CD563FBD; Wed, 9 Sep 2026 14:56:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788965805; cv=none; b=spFb1nLw1tyYsJdM+ys24jmJCKk0mXuk7LZ3IDeaMIl7M/Bby9oNQNEWt6k57XiVHSx6yo5RCmWfPn7yhnSwD9Uj704gjWXl9HQ05l//YXsOLLmPJiJ8gjYCUyDmfxExcBq5pY/i1/pDpWu+NFHd9vzqlVixGi5wwX2w2avPZVU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788965805; c=relaxed/simple; bh=KFTyLKUyX4zP8QpdqjlR7ZkyMKM4k7B/cpIbOdWCqCI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=g6CzVnVDboRnehMz7Fvg5KPAKnAGQiPq5/sKIiNguJjCCPN4eCzBas5r56Kczr+8WAIrcZ/kZHfetEIb1MBN3xEx2MTtbRENd0xZ7lqstgkYlXE78NmTEXyJUKxSurmCtdXZbAuvr9UnkWsB4A0O6BablAgODbWFzMB6FsEK3yc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hwZuxalJ; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="hwZuxalJ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 818831F00A3A; Wed, 9 Sep 2026 14:56:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788965804; bh=neytlIQXdUaSH2YGaKdqCIIZLNyrglaw5V1+1H8MeMc=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=hwZuxalJOizp6Rwky6Uq1LIhAyZFma2S9Kd2qprue/tsdbnJjNpBGWoZW97Hd9lb6 niD3hTtJXRsZyfzLYimoac1G7ub1y29xFqepS0Gn6TImOi43bH7xzx/ZrubpukFvxq LTB7Z1o4kak8wX0l/d6yQLqfOgeehsvzbqCQ2MdRF5tfSv4Ov2a0SH0ZfVhtHgQYEh 8WIhlVMyF8wO+KtoEucN7u6wQK+1m2hm8ccHGTo/8WGAFERKifvuJwLDd3MoMuD8cY nMJPrtGw+JblBHVBRId0Cjg5K+Z/KFv8kZuWMLqL1T9Fuiml83MT+U7rV00Ur127/2 KvP2lc0v4/EEw== From: Jisheng Zhang To: Mark Brown Cc: linux-spi@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 3/5] spi: dw: remove duplicated "!rx_len && !tx_len" handling from dw_spi_irq Date: Wed, 9 Sep 2026 22:36:50 +0800 Message-ID: <20260909143652.9234-4-jszhang@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260909143652.9234-1-jszhang@kernel.org> References: <20260909143652.9234-1-jszhang@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" dw_spi_irq() need not handle enhanced-transfer's "!rx_len && !tx_len" case as that state is already handled by dw_spi_enh_handler() Signed-off-by: Jisheng Zhang Reviewed-by: Changhuang Liang --- drivers/spi/spi-dw-core.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/drivers/spi/spi-dw-core.c b/drivers/spi/spi-dw-core.c index f4c4e9dae25e..91de357f97f3 100644 --- a/drivers/spi/spi-dw-core.c +++ b/drivers/spi/spi-dw-core.c @@ -284,12 +284,6 @@ static irqreturn_t dw_spi_irq(int irq, void *dev_id) dw_spi_mask_intr(dws, 0xff); return IRQ_HANDLED; } - if (dws->transfer_handler =3D=3D dw_spi_enh_handler && - !dws->rx_len && !dws->tx_len) { - dw_spi_mask_intr(dws, 0xff); - spi_finalize_current_transfer(ctlr); - return IRQ_HANDLED; - } =20 return dws->transfer_handler(dws); } --=20 2.53.0 From nobody Fri Sep 25 18:20:25 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (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 6DF345678DE; Wed, 9 Sep 2026 14:56:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788965806; cv=none; b=NGptOGJCxj9ICw/ZXadlOiNGtQ4YqX3j4r1x29E9F01EM1UflHVci0Mb54g37TtT6HyJ5JdncQFXNqEiPZsG9BIw7psGi4VrMlm312003Ot3+gSqcjO7/r9PsMyHE/g/mjb+QblXtWyKxMGFPw3k/pfytiUu8pcstXIO7Wmbudc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788965806; c=relaxed/simple; bh=s9t9vqFss4fnL6PsVZLuhqTrhB4WXEejgasTPMs2yxg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TFMsw0fRPqpL/T6wKKzLaDi93AbARyNMUFf1M8Gz5y+y/7qamZlijZmmW0RpygnquycGKtGQ+AWzYAHGJFaiFTpMxtWgDstlAJYZKM+fCJhFMYkcsXBBbr5TNA8h3Uu09fcay2GY98Ro2tHbG67rYFLJmjYqpsKkAIl+/pVxasc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=A48RPVhL; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="A48RPVhL" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 99AFB1F00A3D; Wed, 9 Sep 2026 14:56:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788965805; bh=ov9JwG7dTxYqZs760mQ1kon32dW5uXkE9+e7+SDMk24=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=A48RPVhLJFNJg3sIYe01Vh1B3cg5oGnJdSMKmbPyiwLlr1P4FeqFFwpvdYpfdZy6A 8aSxNkA+R6aKfyxp7mspCCbjZw61AUNe3k/wlKuJCJ99InvzK+hwuUmRFojCBecgf5 VfiYCpOuxbIQm1u6Z2J3be7k7DDNayP2mic8eDTolTQkWNb3OTMLiUlox3x8McfjwD qKWUQJI+l0FV0YQna6a0eYXnOgv6EW0huz/b+Ibr4rQKLQ/w0G8AiLpHU5qaaXtZhD 6kbh4ZscSGHnGxWjW4u6dyMnO5sKiWT2GK81JAs7n4jfw517WvjUkawPOgqnsVySRM KkHF1l/U85Jsg== From: Jisheng Zhang To: Mark Brown Cc: linux-spi@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 4/5] spi: dw: restore previous irq handling behavior when !ctlr->cur_msg Date: Wed, 9 Sep 2026 22:36:51 +0800 Message-ID: <20260909143652.9234-5-jszhang@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260909143652.9234-1-jszhang@kernel.org> References: <20260909143652.9234-1-jszhang@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Recent "enhanced" support changes the dw_spi_irq() behavior a bit when !!ctlr->cur_msg: if (!ctlr->cur_msg && dws->transfer_handler =3D=3D dw_spi_transfer_hand= ler) { dw_spi_mask_intr(dws, 0xff); return IRQ_HANDLED; } But it misses the dma case, where the transfer_handler =3D=3D dw_spi_dma_transfer_handler, so this changes the previous long time working behavior, let's restore the previous handling by only filtering out the dw_spi_enh_handler. Signed-off-by: Jisheng Zhang Reviewed-by: Changhuang Liang --- drivers/spi/spi-dw-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/spi/spi-dw-core.c b/drivers/spi/spi-dw-core.c index 91de357f97f3..da7d4872e513 100644 --- a/drivers/spi/spi-dw-core.c +++ b/drivers/spi/spi-dw-core.c @@ -280,7 +280,7 @@ static irqreturn_t dw_spi_irq(int irq, void *dev_id) if (!irq_status) return IRQ_NONE; =20 - if (!ctlr->cur_msg && dws->transfer_handler =3D=3D dw_spi_transfer_handle= r) { + if (!ctlr->cur_msg && dws->transfer_handler !=3D dw_spi_enh_handler) { dw_spi_mask_intr(dws, 0xff); return IRQ_HANDLED; } --=20 2.53.0 From nobody Fri Sep 25 18:20:25 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (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 3603356B843; Wed, 9 Sep 2026 14:56:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788965808; cv=none; b=VzmtobWbJ/b85lUSTOumq7pX8W8q1fHab5JlqviP9R+Qd6L7GSLWip/xsgYOVcSd/GVNvsRWxhEDpRH0uU8YIxKPO3sYepAH01IE8w5RYRvtK8PYRNftPCA0v2B8Ii0dDPm9Ghdqzxic1Km1vD7WF7WxeGAAVI9VOlGHgPPJWtU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788965808; c=relaxed/simple; bh=EfdVcm7oOBV5+uMpuaGCOSLJBIUFRXHNfXCqOq2JwP0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UYuGgbF7SIsyfn9d7qUx3u4SbAsW0t/V0674OtGRgFICY6LIswQCGJqLKze15ymDG+FEPzNRic1tyKD5/owyTuSE8JCJatrXDSynou7PIxCUB62+88j3G3Gjn+qfkUlpswdqrzFHNU+K0vJ/d1uunMGMHofCaOpZ9VTVYoYW/64= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jeMe76B8; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jeMe76B8" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 150B31F00A3A; Wed, 9 Sep 2026 14:56:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788965806; bh=SEv5DPhtIQKp4tr7foAtnrNAn/IGR+fxuJIVNvbZUS0=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=jeMe76B8xT0qA1zlOId1jnCQHzNWBmlrQJxAy9myoJ5lAizSTeQLrXGkgouLb5O43 UAmRrigzlkyCi3KjTDOmazxPxTSjhjXZbFYJn+EzmkTK1hWi7aose8qNMud7inypmX sPfa5E+D3ppSCAW5xD+zF0xRImK9xO2SBM/iQhO0wold+cBstaZRuzI/tIWVPY52eO yCBybYzV176YuJyxS1D98pknRa1JuNk8pdhCRq5iCmRDx71eA4Lq0DaaaWagUJXNPP vFdi7M8ljYqA0EkbmGvCxzwlFY1v2Dd0i90OuqwMR6IszjK8F29HT6ZldmuAu8RzF9 uoOwl1PzlbhyA== From: Jisheng Zhang To: Mark Brown Cc: linux-spi@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 5/5] spi: dw: use threaded interrupt and optimize the threaded ISR Date: Wed, 9 Sep 2026 22:36:52 +0800 Message-ID: <20260909143652.9234-6-jszhang@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260909143652.9234-1-jszhang@kernel.org> References: <20260909143652.9234-1-jszhang@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" To avoid blocking for an excessive amount of time, eventually impacting on system responsiveness, hard interrupt handlers should finish executing in as little time as possible. Use threaded interrupt and move the SPI transfer handling to an interrupt thread for host mode and non enhanced spi for two reasons: "while the performance improvement will apply for both target mode has no control over the clocking of data by the host so is much more vulnerable to dropping data in a threaded interrupt if the system is loaded. In host mode this isn't an issue since we'll simply stop clocking data while waiting for the scheduler to get round to the interrupt thread." In theory, we could do this for enhanced spi too, but I don't have the HW to test, so I leave enhanced spi interrupt routine as is, anyone has the HW can implement similar optimization in the future. After that, since the dw_reader() and dw_writer() are called in threaded ISR now, so we can delay the unmasking interrupts until no rx and tx action is taken, thus reduce the interrupt numbers further. Tested with below two cmds ./spidev_test -D /dev/spidev1.3 -s 30000000 -S 327680 -I 1 ./spidev_test -D /dev/spidev1.3 -s 30000000 -S 327680 -I 1000 ./rtla timerlat top -q -k -P f:95 The first cmd is to check the interrupt numbers optmizaion result, the 2nd cmd group is to check the threaded interrupt improvement. Before the patch: each 320KB spi spidev_test transfer triggers 33118 interrupts spidev_test reports ~22090 kbps and rtla reports: Timer Latency 0 00:00:37 | IRQ Timer Latency (us) | Thread Ti= mer Latency (us) CPU COUNT | cur min avg max | cur mi= n avg max 0 #9958 | 1 0 67 103394 | 6 = 4 2198 105031 1 #36902 | 1 0 1 18 | 5 = 4 5 29 After the patch: each 320KB spi spidev_test transfer only triggers 1 interrupts spidev_test reports ~23520 kbps and now rtla reports: Timer Latency 0 00:00:58 | IRQ Timer Latency (us) | Thread Ti= mer Latency (us) CPU COUNT | cur min avg max | cur mi= n avg max 0 #58362 | 1 0 0 29 | 6 = 3 4 56 1 #58363 | 1 0 1 23 | 6 = 4 5 68 In summary: before the patch after the patch 33118 interrutps 1 interrupts reduced by 33117 times! 103394 us max latency 29 us max latency reduced by 3564 times! 22090 kbps rate 23520 kbps rate improved by 6.5% Signed-off-by: Jisheng Zhang --- drivers/spi/spi-dw-core.c | 75 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 70 insertions(+), 5 deletions(-) diff --git a/drivers/spi/spi-dw-core.c b/drivers/spi/spi-dw-core.c index da7d4872e513..c1f24f263488 100644 --- a/drivers/spi/spi-dw-core.c +++ b/drivers/spi/spi-dw-core.c @@ -132,10 +132,11 @@ static inline u32 dw_spi_rx_max(struct dw_spi *dws) return min_t(u32, dws->rx_len, dw_readl(dws, DW_SPI_RXFLR)); } =20 -static void dw_writer(struct dw_spi *dws) +static u32 dw_writer(struct dw_spi *dws) { u32 max =3D dw_spi_tx_max(dws); u32 txw =3D 0; + u32 tx =3D 0; =20 while (max--) { if (dws->tx) { @@ -150,13 +151,16 @@ static void dw_writer(struct dw_spi *dws) } dw_write_io_reg(dws, DW_SPI_DR, txw); --dws->tx_len; + ++tx; } + return tx; } =20 -static void dw_reader(struct dw_spi *dws) +static u32 dw_reader(struct dw_spi *dws) { u32 max =3D dw_spi_rx_max(dws); u32 rxw; + u32 rx =3D 0; =20 while (max--) { rxw =3D dw_read_io_reg(dws, DW_SPI_DR); @@ -171,7 +175,9 @@ static void dw_reader(struct dw_spi *dws) dws->rx +=3D dws->n_bytes; } --dws->rx_len; + ++rx; } + return rx; } =20 int dw_spi_check_status(struct dw_spi *dws, bool raw) @@ -210,6 +216,62 @@ int dw_spi_check_status(struct dw_spi *dws, bool raw) } EXPORT_SYMBOL_NS_GPL(dw_spi_check_status, "SPI_DW_CORE"); =20 +static irqreturn_t dw_spi_irq_thread_fn(int irq, void *dev_id) +{ + struct spi_controller *ctlr =3D dev_id; + struct dw_spi *dws =3D spi_controller_get_devdata(ctlr); + u32 rx, tx, imask, mask =3D 0; + bool finalize =3D false; + + do { + /* + * Read data from the Rx FIFO every time we've got a chance executing + * this method. If there is nothing left to receive, terminate the + * procedure. Otherwise adjust the Rx FIFO Threshold level if it's a + * final stage of the transfer. By doing so we'll get the next IRQ + * right when the leftover incoming data is received. + */ + rx =3D dw_reader(dws); + if (!dws->rx_len) { + mask |=3D 0xff; + finalize =3D true; + } else if (dws->rx_len <=3D dw_readl(dws, DW_SPI_RXFTLR)) { + dw_writel(dws, DW_SPI_RXFTLR, dws->rx_len - 1); + } + + /* + * Send data out as much as possible. The Tx FIFO Empty IRQ will be + * disabled after the data transmission is finished so not to + * have the TXE IRQ flood at the final stage of the transfer. + */ + tx =3D dw_writer(dws); + if (!dws->tx_len) + mask |=3D DW_SPI_INT_TXEI; + } while (rx !=3D 0 || tx !=3D 0); + + imask =3D DW_SPI_INT_TXEI | DW_SPI_INT_TXOI | + DW_SPI_INT_RXUI | DW_SPI_INT_RXOI | DW_SPI_INT_RXFI; + imask &=3D ~mask; + dw_spi_umask_intr(dws, imask); + + if (finalize) + spi_finalize_current_transfer(dws->ctlr); + + return IRQ_HANDLED; +} + +static irqreturn_t dw_spi_host_handler(struct dw_spi *dws) +{ + if (dw_spi_check_status(dws, false)) { + spi_finalize_current_transfer(dws->ctlr); + return IRQ_HANDLED; + } + + dw_spi_mask_intr(dws, 0xff); + + return IRQ_WAKE_THREAD; +} + static irqreturn_t dw_spi_transfer_handler(struct dw_spi *dws) { u16 irq_status =3D dw_readl(dws, DW_SPI_ISR); @@ -415,7 +477,10 @@ static void dw_spi_irq_setup(struct dw_spi *dws) dw_writel(dws, DW_SPI_TXFTLR, level); dw_writel(dws, DW_SPI_RXFTLR, level - 1); =20 - dws->transfer_handler =3D dw_spi_transfer_handler; + if (spi_controller_is_target(dws->ctlr)) + dws->transfer_handler =3D dw_spi_transfer_handler; + else + dws->transfer_handler =3D dw_spi_host_handler; =20 imask =3D DW_SPI_INT_TXEI | DW_SPI_INT_TXOI | DW_SPI_INT_RXUI | DW_SPI_INT_RXOI | DW_SPI_INT_RXFI; @@ -1305,8 +1370,8 @@ int dw_spi_add_controller(struct device *dev, struct = dw_spi *dws) /* Basic HW init */ dw_spi_hw_init(dev, dws); =20 - ret =3D request_irq(dws->irq, dw_spi_irq, IRQF_SHARED, dev_name(dev), - ctlr); + ret =3D request_threaded_irq(dws->irq, dw_spi_irq, dw_spi_irq_thread_fn, + IRQF_SHARED, dev_name(dev), ctlr); if (ret < 0 && ret !=3D -ENOTCONN) { dev_err(dev, "can not request IRQ\n"); goto err_free_ctlr; --=20 2.53.0