From nobody Tue Dec 16 23:46:28 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6141AC2FC24 for ; Thu, 17 Aug 2023 09:47:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1349876AbjHQJrL (ORCPT ); Thu, 17 Aug 2023 05:47:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52822 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1349827AbjHQJqn (ORCPT ); Thu, 17 Aug 2023 05:46:43 -0400 Received: from SHSQR01.spreadtrum.com (unknown [222.66.158.135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 07EE82D61; Thu, 17 Aug 2023 02:46:40 -0700 (PDT) Received: from dlp.unisoc.com ([10.29.3.86]) by SHSQR01.spreadtrum.com with ESMTP id 37H9kFjS085239; Thu, 17 Aug 2023 17:46:15 +0800 (+08) (envelope-from Huangzheng.Lai@unisoc.com) Received: from SHDLP.spreadtrum.com (shmbx04.spreadtrum.com [10.0.1.214]) by dlp.unisoc.com (SkyGuard) with ESMTPS id 4RRKpD0fTTz2Q0M6k; Thu, 17 Aug 2023 17:44:04 +0800 (CST) Received: from xm9614pcu.spreadtrum.com (10.13.2.29) by shmbx04.spreadtrum.com (10.0.1.214) with Microsoft SMTP Server (TLS) id 15.0.1497.23; Thu, 17 Aug 2023 17:46:14 +0800 From: Huangzheng Lai To: Andi Shyti CC: Orson Zhai , Baolin Wang , Chunyan Zhang , , , huangzheng lai , Huangzheng Lai , Xiongpeng Wu Subject: [PATCH 1/8] i2c: sprd: Add configurations that support 1Mhz and 3.4Mhz frequencies Date: Thu, 17 Aug 2023 17:45:13 +0800 Message-ID: <20230817094520.21286-2-Huangzheng.Lai@unisoc.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20230817094520.21286-1-Huangzheng.Lai@unisoc.com> References: <20230817094520.21286-1-Huangzheng.Lai@unisoc.com> MIME-Version: 1.0 X-Originating-IP: [10.13.2.29] X-ClientProxiedBy: SHCAS03.spreadtrum.com (10.0.1.207) To shmbx04.spreadtrum.com (10.0.1.214) X-MAIL: SHSQR01.spreadtrum.com 37H9kFjS085239 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This patch adds I2C controller driver support for 1Mhz and 3.4Mhz frequency configurations. Signed-off-by: Huangzheng Lai Acked-by: Andi Shyti =20 --- drivers/i2c/busses/i2c-sprd.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/i2c/busses/i2c-sprd.c b/drivers/i2c/busses/i2c-sprd.c index ffc54fbf814d..acc2a4d4eeae 100644 --- a/drivers/i2c/busses/i2c-sprd.c +++ b/drivers/i2c/busses/i2c-sprd.c @@ -347,6 +347,10 @@ static void sprd_i2c_set_clk(struct sprd_i2c *i2c_dev,= u32 freq) writel((6 * apb_clk) / 10000000, i2c_dev->base + ADDR_STA0_DVD); else if (freq =3D=3D I2C_MAX_STANDARD_MODE_FREQ) writel((4 * apb_clk) / 1000000, i2c_dev->base + ADDR_STA0_DVD); + else if (freq =3D=3D I2C_MAX_FAST_MODE_PLUS_FREQ) + writel((8 * apb_clk) / 10000000, i2c_dev->base + ADDR_STA0_DVD); + else if (freq =3D=3D I2C_MAX_HIGH_SPEED_MODE_FREQ) + writel((8 * apb_clk) / 10000000, i2c_dev->base + ADDR_STA0_DVD); } =20 static void sprd_i2c_enable(struct sprd_i2c *i2c_dev) @@ -519,9 +523,11 @@ static int sprd_i2c_probe(struct platform_device *pdev) if (!of_property_read_u32(dev->of_node, "clock-frequency", &prop)) i2c_dev->bus_freq =3D prop; =20 - /* We only support 100k and 400k now, otherwise will return error. */ + /* We only support 100k\400k\1m\3.4m now, otherwise will return error. */ if (i2c_dev->bus_freq !=3D I2C_MAX_STANDARD_MODE_FREQ && - i2c_dev->bus_freq !=3D I2C_MAX_FAST_MODE_FREQ) + i2c_dev->bus_freq !=3D I2C_MAX_FAST_MODE_FREQ && + i2c_dev->bus_freq !=3D I2C_MAX_FAST_MODE_PLUS_FREQ && + i2c_dev->bus_freq !=3D I2C_MAX_HIGH_SPEED_MODE_FREQ) return -EINVAL; =20 ret =3D sprd_i2c_clk_init(i2c_dev); --=20 2.17.1 From nobody Tue Dec 16 23:46:28 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4A8DEC2FC20 for ; Thu, 17 Aug 2023 09:47:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1349859AbjHQJrJ (ORCPT ); Thu, 17 Aug 2023 05:47:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52808 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1349828AbjHQJqn (ORCPT ); Thu, 17 Aug 2023 05:46:43 -0400 Received: from SHSQR01.spreadtrum.com (unknown [222.66.158.135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 35D222D67; Thu, 17 Aug 2023 02:46:41 -0700 (PDT) Received: from dlp.unisoc.com ([10.29.3.86]) by SHSQR01.spreadtrum.com with ESMTP id 37H9kGL5085282; Thu, 17 Aug 2023 17:46:16 +0800 (+08) (envelope-from Huangzheng.Lai@unisoc.com) Received: from SHDLP.spreadtrum.com (shmbx04.spreadtrum.com [10.0.1.214]) by dlp.unisoc.com (SkyGuard) with ESMTPS id 4RRKpF0W4yz2P3khb; Thu, 17 Aug 2023 17:44:05 +0800 (CST) Received: from xm9614pcu.spreadtrum.com (10.13.2.29) by shmbx04.spreadtrum.com (10.0.1.214) with Microsoft SMTP Server (TLS) id 15.0.1497.23; Thu, 17 Aug 2023 17:46:15 +0800 From: Huangzheng Lai To: Andi Shyti CC: Orson Zhai , Baolin Wang , Chunyan Zhang , , , huangzheng lai , Huangzheng Lai , Xiongpeng Wu Subject: [PATCH 2/8] i2c: sprd: Add I2C driver to use 'reset framework' function Date: Thu, 17 Aug 2023 17:45:14 +0800 Message-ID: <20230817094520.21286-3-Huangzheng.Lai@unisoc.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20230817094520.21286-1-Huangzheng.Lai@unisoc.com> References: <20230817094520.21286-1-Huangzheng.Lai@unisoc.com> MIME-Version: 1.0 X-Originating-IP: [10.13.2.29] X-ClientProxiedBy: SHCAS03.spreadtrum.com (10.0.1.207) To shmbx04.spreadtrum.com (10.0.1.214) X-MAIL: SHSQR01.spreadtrum.com 37H9kGL5085282 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This patch adds the 'reset framework' function for I2C drivers, which resets the I2C controller when a timeout exception occurs. Signed-off-by: Huangzheng Lai --- drivers/i2c/busses/i2c-sprd.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/drivers/i2c/busses/i2c-sprd.c b/drivers/i2c/busses/i2c-sprd.c index acc2a4d4eeae..066b3a9c30c8 100644 --- a/drivers/i2c/busses/i2c-sprd.c +++ b/drivers/i2c/busses/i2c-sprd.c @@ -17,6 +17,7 @@ #include #include #include +#include =20 #define I2C_CTL 0x00 #define I2C_ADDR_CFG 0x04 @@ -85,6 +86,7 @@ struct sprd_i2c { u32 src_clk; u32 bus_freq; struct completion complete; + struct reset_control *rst; u8 *buf; u32 count; int irq; @@ -247,6 +249,7 @@ static int sprd_i2c_handle_msg(struct i2c_adapter *i2c_= adap, { struct sprd_i2c *i2c_dev =3D i2c_adap->algo_data; unsigned long time_left; + int ret; =20 i2c_dev->msg =3D msg; i2c_dev->buf =3D msg->buf; @@ -278,9 +281,16 @@ static int sprd_i2c_handle_msg(struct i2c_adapter *i2c= _adap, =20 time_left =3D wait_for_completion_timeout(&i2c_dev->complete, msecs_to_jiffies(I2C_XFER_TIMEOUT)); - if (!time_left) + if (!time_left) { + dev_err(i2c_dev->dev, "transfer timeout, I2C_STATUS =3D 0x%x\n", + readl(i2c_dev->base + I2C_STATUS)); + if (i2c_dev->rst !=3D NULL) { + ret =3D reset_control_reset(i2c_dev->rst); + if (ret < 0) + dev_err(i2c_dev->dev, "i2c soft reset failed, ret =3D %d\n", ret); + } return -ETIMEDOUT; - + } return i2c_dev->err; } =20 @@ -535,6 +545,11 @@ static int sprd_i2c_probe(struct platform_device *pdev) return ret; =20 platform_set_drvdata(pdev, i2c_dev); + i2c_dev->rst =3D devm_reset_control_get(i2c_dev->dev, "i2c_rst"); + if (IS_ERR(i2c_dev->rst)) { + dev_err(i2c_dev->dev, "can't get i2c reset node\n"); + i2c_dev->rst =3D NULL; + } =20 ret =3D clk_prepare_enable(i2c_dev->clk); if (ret) --=20 2.17.1 From nobody Tue Dec 16 23:46:28 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 74963C2FC23 for ; Thu, 17 Aug 2023 09:47:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1349891AbjHQJrO (ORCPT ); Thu, 17 Aug 2023 05:47:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52848 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1349833AbjHQJqt (ORCPT ); Thu, 17 Aug 2023 05:46:49 -0400 Received: from SHSQR01.spreadtrum.com (mx1.unisoc.com [222.66.158.135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E26822D69; Thu, 17 Aug 2023 02:46:46 -0700 (PDT) Received: from dlp.unisoc.com ([10.29.3.86]) by SHSQR01.spreadtrum.com with ESMTP id 37H9kI3Q085331; Thu, 17 Aug 2023 17:46:18 +0800 (+08) (envelope-from Huangzheng.Lai@unisoc.com) Received: from SHDLP.spreadtrum.com (shmbx04.spreadtrum.com [10.0.1.214]) by dlp.unisoc.com (SkyGuard) with ESMTPS id 4RRKpG0xByz2Q0Ft2; Thu, 17 Aug 2023 17:44:06 +0800 (CST) Received: from xm9614pcu.spreadtrum.com (10.13.2.29) by shmbx04.spreadtrum.com (10.0.1.214) with Microsoft SMTP Server (TLS) id 15.0.1497.23; Thu, 17 Aug 2023 17:46:16 +0800 From: Huangzheng Lai To: Andi Shyti CC: Orson Zhai , Baolin Wang , Chunyan Zhang , , , huangzheng lai , Huangzheng Lai , Xiongpeng Wu Subject: [PATCH 3/8] i2c: sprd: Use global variables to record IIC ack/nack status instead of local variables Date: Thu, 17 Aug 2023 17:45:15 +0800 Message-ID: <20230817094520.21286-4-Huangzheng.Lai@unisoc.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20230817094520.21286-1-Huangzheng.Lai@unisoc.com> References: <20230817094520.21286-1-Huangzheng.Lai@unisoc.com> MIME-Version: 1.0 X-Originating-IP: [10.13.2.29] X-ClientProxiedBy: SHCAS03.spreadtrum.com (10.0.1.207) To shmbx04.spreadtrum.com (10.0.1.214) X-MAIL: SHSQR01.spreadtrum.com 37H9kI3Q085331 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" We found that when the interrupt bit of the IIC controller is cleared, the ack/nack bit is also cleared at the same time. After clearing the interrupt bit in sprd_i2c_isr(), incorrect ack/nack information will be obtained in sprd_i2c_isr_thread(), resulting in incorrect communication when nack cannot be recognized. To solve this problem, we used a global variable to record ack/nack information before clearing the interrupt bit instead of a local variable. Signed-off-by: Huangzheng Lai --- drivers/i2c/busses/i2c-sprd.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/i2c/busses/i2c-sprd.c b/drivers/i2c/busses/i2c-sprd.c index 066b3a9c30c8..549b60dd3273 100644 --- a/drivers/i2c/busses/i2c-sprd.c +++ b/drivers/i2c/busses/i2c-sprd.c @@ -85,6 +85,7 @@ struct sprd_i2c { struct clk *clk; u32 src_clk; u32 bus_freq; + bool ack_flag; struct completion complete; struct reset_control *rst; u8 *buf; @@ -384,7 +385,6 @@ static irqreturn_t sprd_i2c_isr_thread(int irq, void *d= ev_id) { struct sprd_i2c *i2c_dev =3D dev_id; struct i2c_msg *msg =3D i2c_dev->msg; - bool ack =3D !(readl(i2c_dev->base + I2C_STATUS) & I2C_RX_ACK); u32 i2c_tran; =20 if (msg->flags & I2C_M_RD) @@ -400,7 +400,7 @@ static irqreturn_t sprd_i2c_isr_thread(int irq, void *d= ev_id) * For reading data, ack is always true, if i2c_tran is not 0 which * means we still need to contine to read data from slave. */ - if (i2c_tran && ack) { + if (i2c_tran && i2c_dev->ack_flag) { sprd_i2c_data_transfer(i2c_dev); return IRQ_HANDLED; } @@ -411,7 +411,7 @@ static irqreturn_t sprd_i2c_isr_thread(int irq, void *d= ev_id) * If we did not get one ACK from slave when writing data, we should * return -EIO to notify users. */ - if (!ack) + if (!i2c_dev->ack_flag) i2c_dev->err =3D -EIO; else if (msg->flags & I2C_M_RD && i2c_dev->count) sprd_i2c_read_bytes(i2c_dev, i2c_dev->buf, i2c_dev->count); @@ -428,7 +428,6 @@ static irqreturn_t sprd_i2c_isr(int irq, void *dev_id) { struct sprd_i2c *i2c_dev =3D dev_id; struct i2c_msg *msg =3D i2c_dev->msg; - bool ack =3D !(readl(i2c_dev->base + I2C_STATUS) & I2C_RX_ACK); u32 i2c_tran; =20 if (msg->flags & I2C_M_RD) @@ -447,7 +446,8 @@ static irqreturn_t sprd_i2c_isr(int irq, void *dev_id) * means we can read all data in one time, then we can finish this * transmission too. */ - if (!i2c_tran || !ack) { + i2c_dev->ack_flag =3D !(readl(i2c_dev->base + I2C_STATUS) & I2C_RX_ACK); + if (!i2c_tran || !i2c_dev->ack_flag) { sprd_i2c_clear_start(i2c_dev); sprd_i2c_clear_irq(i2c_dev); } --=20 2.17.1 From nobody Tue Dec 16 23:46:28 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8ABD7C2FC29 for ; Thu, 17 Aug 2023 09:47:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1349906AbjHQJrQ (ORCPT ); Thu, 17 Aug 2023 05:47:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46564 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1349835AbjHQJqx (ORCPT ); Thu, 17 Aug 2023 05:46:53 -0400 Received: from SHSQR01.spreadtrum.com (unknown [222.66.158.135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 90CEA2D61; Thu, 17 Aug 2023 02:46:51 -0700 (PDT) Received: from dlp.unisoc.com ([10.29.3.86]) by SHSQR01.spreadtrum.com with ESMTP id 37H9kJn8085390; Thu, 17 Aug 2023 17:46:19 +0800 (+08) (envelope-from Huangzheng.Lai@unisoc.com) Received: from SHDLP.spreadtrum.com (shmbx04.spreadtrum.com [10.0.1.214]) by dlp.unisoc.com (SkyGuard) with ESMTPS id 4RRKpH1kdPz2P3khb; Thu, 17 Aug 2023 17:44:07 +0800 (CST) Received: from xm9614pcu.spreadtrum.com (10.13.2.29) by shmbx04.spreadtrum.com (10.0.1.214) with Microsoft SMTP Server (TLS) id 15.0.1497.23; Thu, 17 Aug 2023 17:46:17 +0800 From: Huangzheng Lai To: Andi Shyti CC: Orson Zhai , Baolin Wang , Chunyan Zhang , , , huangzheng lai , Huangzheng Lai , Xiongpeng Wu Subject: [PATCH 4/8] i2c: sprd: Add IIC controller driver to support dynamic switching of 400K/1M/3.4M frequency Date: Thu, 17 Aug 2023 17:45:16 +0800 Message-ID: <20230817094520.21286-5-Huangzheng.Lai@unisoc.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20230817094520.21286-1-Huangzheng.Lai@unisoc.com> References: <20230817094520.21286-1-Huangzheng.Lai@unisoc.com> MIME-Version: 1.0 X-Originating-IP: [10.13.2.29] X-ClientProxiedBy: SHCAS03.spreadtrum.com (10.0.1.207) To shmbx04.spreadtrum.com (10.0.1.214) X-MAIL: SHSQR01.spreadtrum.com 37H9kJn8085390 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When IIC-slaves supporting different frequencies use the same IIC controller, the IIC controller usually only operates at lower frequencies. In order to improve the performance of IIC-slaves transmission supporting faster frequencies, we dynamically configure the IIC operating frequency based on the value of the input parameter msg ->flag. Signed-off-by: Huangzheng Lai --- drivers/i2c/busses/i2c-sprd.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-sprd.c b/drivers/i2c/busses/i2c-sprd.c index 549b60dd3273..02c11a9ff2da 100644 --- a/drivers/i2c/busses/i2c-sprd.c +++ b/drivers/i2c/busses/i2c-sprd.c @@ -75,7 +75,14 @@ #define SPRD_I2C_PM_TIMEOUT 1000 /* timeout (ms) for transfer message */ #define I2C_XFER_TIMEOUT 1000 - +/* dynamic modify clk_freq flag */ +#define I2C_3M4_FLAG 0x0100 +#define I2C_1M_FLAG 0x0080 +#define I2C_400K_FLAG 0x0040 + +#define I2C_FREQ_400K 400000 +#define I2C_FREQ_1M 1000000 +#define I2C_FREQ_3_4M 3400000 /* SPRD i2c data structure */ struct sprd_i2c { struct i2c_adapter adap; @@ -94,6 +101,8 @@ struct sprd_i2c { int err; }; =20 +static void sprd_i2c_set_clk(struct sprd_i2c *i2c_dev, u32 freq); + static void sprd_i2c_set_count(struct sprd_i2c *i2c_dev, u32 count) { writel(count, i2c_dev->base + I2C_COUNT); @@ -269,6 +278,12 @@ static int sprd_i2c_handle_msg(struct i2c_adapter *i2c= _adap, sprd_i2c_send_stop(i2c_dev, !!is_last_msg); } =20 + if (msg->flags & I2C_400K_FLAG) + sprd_i2c_set_clk(i2c_dev, I2C_FREQ_400K); + else if (msg->flags & I2C_1M_FLAG) + sprd_i2c_set_clk(i2c_dev, I2C_FREQ_1M); + else if (msg->flags & I2C_3M4_FLAG) + sprd_i2c_set_clk(i2c_dev, I2C_FREQ_3_4M); /* * We should enable rx fifo full interrupt to get data when receiving * full data. --=20 2.17.1 From nobody Tue Dec 16 23:46:28 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9C48BC2FC27 for ; Thu, 17 Aug 2023 09:47:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1349916AbjHQJrS (ORCPT ); Thu, 17 Aug 2023 05:47:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46552 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1349834AbjHQJqw (ORCPT ); Thu, 17 Aug 2023 05:46:52 -0400 Received: from SHSQR01.spreadtrum.com (mx1.unisoc.com [222.66.158.135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4E94B2D57; Thu, 17 Aug 2023 02:46:51 -0700 (PDT) Received: from dlp.unisoc.com ([10.29.3.86]) by SHSQR01.spreadtrum.com with ESMTP id 37H9kJlY085458; Thu, 17 Aug 2023 17:46:19 +0800 (+08) (envelope-from Huangzheng.Lai@unisoc.com) Received: from SHDLP.spreadtrum.com (shmbx04.spreadtrum.com [10.0.1.214]) by dlp.unisoc.com (SkyGuard) with ESMTPS id 4RRKpJ0P5fz2Q0Ft2; Thu, 17 Aug 2023 17:44:08 +0800 (CST) Received: from xm9614pcu.spreadtrum.com (10.13.2.29) by shmbx04.spreadtrum.com (10.0.1.214) with Microsoft SMTP Server (TLS) id 15.0.1497.23; Thu, 17 Aug 2023 17:46:18 +0800 From: Huangzheng Lai To: Andi Shyti CC: Orson Zhai , Baolin Wang , Chunyan Zhang , , , huangzheng lai , Huangzheng Lai , Xiongpeng Wu Subject: [PATCH 5/8] i2c: sprd: Configure the enable bit of the IIC controller before each transmission initiation Date: Thu, 17 Aug 2023 17:45:17 +0800 Message-ID: <20230817094520.21286-6-Huangzheng.Lai@unisoc.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20230817094520.21286-1-Huangzheng.Lai@unisoc.com> References: <20230817094520.21286-1-Huangzheng.Lai@unisoc.com> MIME-Version: 1.0 X-Originating-IP: [10.13.2.29] X-ClientProxiedBy: SHCAS03.spreadtrum.com (10.0.1.207) To shmbx04.spreadtrum.com (10.0.1.214) X-MAIL: SHSQR01.spreadtrum.com 37H9kJlY085458 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When a timeout exception occurs in the IIC driver, the IIC controller will be reset, and after resetting, control bits such as I2C_EN and I2C_INT_EN will be reset to 0, and the IIC master cannot initiate Transmission unless sprd_i2c_enable() is executed. To address this issue, this patch places sprd_i2c_enable() before each transmission initiation to ensure that the necessary control bits of the IIC controller are configured. Signed-off-by: Huangzheng Lai --- drivers/i2c/busses/i2c-sprd.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/i2c/busses/i2c-sprd.c b/drivers/i2c/busses/i2c-sprd.c index 02c11a9ff2da..7314c897525d 100644 --- a/drivers/i2c/busses/i2c-sprd.c +++ b/drivers/i2c/busses/i2c-sprd.c @@ -310,6 +310,8 @@ static int sprd_i2c_handle_msg(struct i2c_adapter *i2c_= adap, return i2c_dev->err; } =20 +static void sprd_i2c_enable(struct sprd_i2c *i2c_dev); + static int sprd_i2c_master_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, int num) { @@ -320,6 +322,8 @@ static int sprd_i2c_master_xfer(struct i2c_adapter *i2c= _adap, if (ret < 0) return ret; =20 + sprd_i2c_enable(i2c_dev); + for (im =3D 0; im < num - 1; im++) { ret =3D sprd_i2c_handle_msg(i2c_adap, &msgs[im], 0); if (ret) @@ -661,8 +665,6 @@ static int __maybe_unused sprd_i2c_runtime_resume(struc= t device *dev) if (ret) return ret; =20 - sprd_i2c_enable(i2c_dev); - return 0; } =20 --=20 2.17.1 From nobody Tue Dec 16 23:46:28 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BBAD8C2FC2E for ; Thu, 17 Aug 2023 09:47:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1349928AbjHQJrU (ORCPT ); Thu, 17 Aug 2023 05:47:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46566 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1349836AbjHQJqy (ORCPT ); Thu, 17 Aug 2023 05:46:54 -0400 Received: from SHSQR01.spreadtrum.com (mx1.unisoc.com [222.66.158.135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8FBF62D67; Thu, 17 Aug 2023 02:46:52 -0700 (PDT) Received: from dlp.unisoc.com ([10.29.3.86]) by SHSQR01.spreadtrum.com with ESMTP id 37H9kLHA085564; Thu, 17 Aug 2023 17:46:21 +0800 (+08) (envelope-from Huangzheng.Lai@unisoc.com) Received: from SHDLP.spreadtrum.com (shmbx04.spreadtrum.com [10.0.1.214]) by dlp.unisoc.com (SkyGuard) with ESMTPS id 4RRKpK2LpLz2P3khb; Thu, 17 Aug 2023 17:44:09 +0800 (CST) Received: from xm9614pcu.spreadtrum.com (10.13.2.29) by shmbx04.spreadtrum.com (10.0.1.214) with Microsoft SMTP Server (TLS) id 15.0.1497.23; Thu, 17 Aug 2023 17:46:19 +0800 From: Huangzheng Lai To: Andi Shyti CC: Orson Zhai , Baolin Wang , Chunyan Zhang , , , huangzheng lai , Huangzheng Lai , Xiongpeng Wu Subject: [PATCH 6/8] i2c: sprd: Add additional IIC control bit configuration to adapt to the new IP version of the UNISOC platform Date: Thu, 17 Aug 2023 17:45:18 +0800 Message-ID: <20230817094520.21286-7-Huangzheng.Lai@unisoc.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20230817094520.21286-1-Huangzheng.Lai@unisoc.com> References: <20230817094520.21286-1-Huangzheng.Lai@unisoc.com> MIME-Version: 1.0 X-Originating-IP: [10.13.2.29] X-ClientProxiedBy: SHCAS03.spreadtrum.com (10.0.1.207) To shmbx04.spreadtrum.com (10.0.1.214) X-MAIL: SHSQR01.spreadtrum.com 37H9kLHA085564 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The new IIC IP version on the UNISOC platform has added I2C_NACK_EN and I2C_TRANS_EN control bits. To ensure that the IIC controller can initiate transmission smoothly, these two bits need to be configured. Signed-off-by: Huangzheng Lai --- drivers/i2c/busses/i2c-sprd.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-sprd.c b/drivers/i2c/busses/i2c-sprd.c index 7314c897525d..d867389c7f17 100644 --- a/drivers/i2c/busses/i2c-sprd.c +++ b/drivers/i2c/busses/i2c-sprd.c @@ -33,6 +33,8 @@ #define ADDR_RST 0x2c =20 /* I2C_CTL */ +#define I2C_NACK_EN BIT(22) +#define I2C_TRANS_EN BIT(21) #define STP_EN BIT(20) #define FIFO_AF_LVL_MASK GENMASK(19, 16) #define FIFO_AF_LVL 16 @@ -397,7 +399,7 @@ static void sprd_i2c_enable(struct sprd_i2c *i2c_dev) sprd_i2c_clear_irq(i2c_dev); =20 tmp =3D readl(i2c_dev->base + I2C_CTL); - writel(tmp | I2C_EN | I2C_INT_EN, i2c_dev->base + I2C_CTL); + writel(tmp | I2C_EN | I2C_INT_EN | I2C_NACK_EN | I2C_TRANS_EN, i2c_dev->b= ase + I2C_CTL); } =20 static irqreturn_t sprd_i2c_isr_thread(int irq, void *dev_id) --=20 2.17.1 From nobody Tue Dec 16 23:46:28 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6F9F1C2FC18 for ; Thu, 17 Aug 2023 09:47:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1349804AbjHQJra (ORCPT ); Thu, 17 Aug 2023 05:47:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46574 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1349660AbjHQJq4 (ORCPT ); Thu, 17 Aug 2023 05:46:56 -0400 Received: from SHSQR01.spreadtrum.com (unknown [222.66.158.135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8FBC52D57; Thu, 17 Aug 2023 02:46:55 -0700 (PDT) Received: from dlp.unisoc.com ([10.29.3.86]) by SHSQR01.spreadtrum.com with ESMTP id 37H9kMAr085658; Thu, 17 Aug 2023 17:46:22 +0800 (+08) (envelope-from Huangzheng.Lai@unisoc.com) Received: from SHDLP.spreadtrum.com (shmbx04.spreadtrum.com [10.0.1.214]) by dlp.unisoc.com (SkyGuard) with ESMTPS id 4RRKpL2gQvz2PyrhG; Thu, 17 Aug 2023 17:44:10 +0800 (CST) Received: from xm9614pcu.spreadtrum.com (10.13.2.29) by shmbx04.spreadtrum.com (10.0.1.214) with Microsoft SMTP Server (TLS) id 15.0.1497.23; Thu, 17 Aug 2023 17:46:20 +0800 From: Huangzheng Lai To: Andi Shyti CC: Orson Zhai , Baolin Wang , Chunyan Zhang , , , huangzheng lai , Huangzheng Lai , Xiongpeng Wu Subject: [PATCH 7/8] i2c: sprd: Set I2C_RX_ACK when clear irq Date: Thu, 17 Aug 2023 17:45:19 +0800 Message-ID: <20230817094520.21286-8-Huangzheng.Lai@unisoc.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20230817094520.21286-1-Huangzheng.Lai@unisoc.com> References: <20230817094520.21286-1-Huangzheng.Lai@unisoc.com> MIME-Version: 1.0 X-Originating-IP: [10.13.2.29] X-ClientProxiedBy: SHCAS03.spreadtrum.com (10.0.1.207) To shmbx04.spreadtrum.com (10.0.1.214) X-MAIL: SHSQR01.spreadtrum.com 37H9kMAr085658 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" We found that when clearing the I2C_TX_ACK bit, the I2C_MODE bit will also be cleared to 0. When the IIC master reads data, this situation will cause the FIFO of the IIC to be empty after clearing the interrupt. To address this issue, when clearing interrupts, set I2C_RX_ACK bit to 1, as writing 1 to this bit will not take effect. Signed-off-by: Huangzheng Lai --- drivers/i2c/busses/i2c-sprd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-sprd.c b/drivers/i2c/busses/i2c-sprd.c index d867389c7f17..6f65f28ea69d 100644 --- a/drivers/i2c/busses/i2c-sprd.c +++ b/drivers/i2c/busses/i2c-sprd.c @@ -138,7 +138,7 @@ static void sprd_i2c_clear_irq(struct sprd_i2c *i2c_dev) { u32 tmp =3D readl(i2c_dev->base + I2C_STATUS); =20 - writel(tmp & ~I2C_INT, i2c_dev->base + I2C_STATUS); + writel((tmp & ~I2C_INT) | I2C_RX_ACK, i2c_dev->base + I2C_STATUS); } =20 static void sprd_i2c_reset_fifo(struct sprd_i2c *i2c_dev) --=20 2.17.1 From nobody Tue Dec 16 23:46:28 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8F670C2FC1C for ; Thu, 17 Aug 2023 09:47:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S245458AbjHQJrd (ORCPT ); Thu, 17 Aug 2023 05:47:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46682 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1349799AbjHQJrB (ORCPT ); Thu, 17 Aug 2023 05:47:01 -0400 Received: from SHSQR01.spreadtrum.com (mx1.unisoc.com [222.66.158.135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 66A3B30C1; Thu, 17 Aug 2023 02:46:58 -0700 (PDT) Received: from dlp.unisoc.com ([10.29.3.86]) by SHSQR01.spreadtrum.com with ESMTP id 37H9kNje085755; Thu, 17 Aug 2023 17:46:23 +0800 (+08) (envelope-from Huangzheng.Lai@unisoc.com) Received: from SHDLP.spreadtrum.com (shmbx04.spreadtrum.com [10.0.1.214]) by dlp.unisoc.com (SkyGuard) with ESMTPS id 4RRKpM49rVz2P3khb; Thu, 17 Aug 2023 17:44:11 +0800 (CST) Received: from xm9614pcu.spreadtrum.com (10.13.2.29) by shmbx04.spreadtrum.com (10.0.1.214) with Microsoft SMTP Server (TLS) id 15.0.1497.23; Thu, 17 Aug 2023 17:46:21 +0800 From: Huangzheng Lai To: Andi Shyti CC: Orson Zhai , Baolin Wang , Chunyan Zhang , , , huangzheng lai , Huangzheng Lai , Xiongpeng Wu Subject: [PATCH 8/8] i2c: sprd: Increase the waiting time for IIC transmission to avoid system crash issues Date: Thu, 17 Aug 2023 17:45:20 +0800 Message-ID: <20230817094520.21286-9-Huangzheng.Lai@unisoc.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20230817094520.21286-1-Huangzheng.Lai@unisoc.com> References: <20230817094520.21286-1-Huangzheng.Lai@unisoc.com> MIME-Version: 1.0 X-Originating-IP: [10.13.2.29] X-ClientProxiedBy: SHCAS03.spreadtrum.com (10.0.1.207) To shmbx04.spreadtrum.com (10.0.1.214) X-MAIL: SHSQR01.spreadtrum.com 37H9kNje085755 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Due to the relatively low priority of the isr_thread, when the CPU load is high, the execution of sprd_i2c_isr_thread will be delayed. After the waiting time is exceeded, the IIC driver will perform operations such as disabling the IIC controller. Later, when sprd_i2c_isr_thread is called by the CPU, there will be kernel panic caused by illegal access to the IIC register. After pressure testing, we found that increasing the IIC waiting time to 10 seconds can avoid this problem. Signed-off-by: Huangzheng Lai --- drivers/i2c/busses/i2c-sprd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-sprd.c b/drivers/i2c/busses/i2c-sprd.c index 6f65f28ea69d..3c7af04fa177 100644 --- a/drivers/i2c/busses/i2c-sprd.c +++ b/drivers/i2c/busses/i2c-sprd.c @@ -76,7 +76,7 @@ /* timeout (ms) for pm runtime autosuspend */ #define SPRD_I2C_PM_TIMEOUT 1000 /* timeout (ms) for transfer message */ -#define I2C_XFER_TIMEOUT 1000 +#define I2C_XFER_TIMEOUT 10000 /* dynamic modify clk_freq flag */ #define I2C_3M4_FLAG 0x0100 #define I2C_1M_FLAG 0x0080 --=20 2.17.1