From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 0E5B23976B2 for ; Thu, 9 Jul 2026 04:21:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783570863; cv=none; b=hyGWkZqReHOsjR8Wgf6sdJp+OsayLMZnPT4eqgiCyGXGARUknwoArGFFo+t/AkZ1UVJlvn01X8AVw/8r321yn9LRAMcdTCQnjOXnYYUS8RrKqNwk1KmF+lpnCgTfBXEUGGyAgd5/MVrtVyLfYwsH/uu3nEeFz8QsF5UileLb4K0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783570863; c=relaxed/simple; bh=rvm1wz1ZLi+Wu8yKfQSbMLnWcPgwIpdMwa2eQX4CXKA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=uGijVG9BCyAc43EOqrLEvwSOP9+z7TeFzT8s8VwTDCdJFMQgX+1CEHNbrSonwmXvK7DYfb+8y1g4GPOq71s83n3X4v2+6InuBvM8ViIRhVsWmX1NGLQdQViKfNjALbLpB3wE3J0cqBez889qm+EI9zx8TPAm3NGOq+2EWkOI/u0= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=k/6CHhaq; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=SnK6C5yY; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="k/6CHhaq"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="SnK6C5yY" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 668N90Hi4055268 for ; Thu, 9 Jul 2026 04:21:01 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= nsz1H97/3mIQwsbA/XJBmxwh8+fKOZ0DFWQS+InwXQs=; b=k/6CHhaqcdFDevPc qdtrG50BN4sU3AOsD4sw5qrU/hdwu7pJxOK5vniJEka2MATwftQMCm+163/OnMvr m6T5l2eQYv5/dKT2dpl8DJHoQgvRlGAYIeORgWm6qG70yybtiZbCcMzrjlW3ifAK t6NX0XHFZqWfqGJ/yBgxeBaBirE+AayuqujJVfbir5sRdeC4dQkpkluK6Qx7MQ9y dSUlUl9vzpJqETtx6iOZehU26cSKZ9y6e/oH2stqJmlHEUCgcwjDphrJML24hu6S cZt6ObYMMD6IjFCY4T8gj48jnvXJ8OQnG32ZCd5o7vE/9fCKvkYi9FMBJbVVBNNt yhuoeg== Received: from mail-pj1-f69.google.com (mail-pj1-f69.google.com [209.85.216.69]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4f9wwfs87w-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 09 Jul 2026 04:21:00 +0000 (GMT) Received: by mail-pj1-f69.google.com with SMTP id 98e67ed59e1d1-38096521198so2712950a91.3 for ; Wed, 08 Jul 2026 21:21:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1783570860; x=1784175660; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=nsz1H97/3mIQwsbA/XJBmxwh8+fKOZ0DFWQS+InwXQs=; b=SnK6C5yYS9thEDgbzKKrA5eVaVsy7cLWqjWSEnPsN5gR22z6oznHLs3/jyKxQCK7zp PlDiknTWKhl/dyKjZgas0I52IE8AnaC+Ur06bXhwXFZJ+yE6yMU7maMLKDxB2uIigWBI Jbwkp1eK1S8IlxBXPVlsYq7H4N88nf+9IW9r09969jwOKSua/fBo3g9CN5DOLGg8SC6T iMYBJEL/5dEZXc1WgsgRIqTUkw8aw0Li0b3VKqNz09OyATEhSHF1qTr0Pa3jYDDlP4sJ 0ypU86UBlRrlVYfsZobF2h0XY2LXTBjg1/1j8d4vIdkL4Awc99hVeNDPNCimOPAXxa2t EBxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783570860; x=1784175660; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=nsz1H97/3mIQwsbA/XJBmxwh8+fKOZ0DFWQS+InwXQs=; b=iQx7JiXcYovdQQKlyXgsPVR4qclzLocuQq/y8VEQGWaOIG1kx2XdDj8qXd77iaq14h rtYhFbPionlEbKIROm/zkPUMfRC4kFaezGIVuEYhoJm/BUGSbY57z3tiVsppSQKqnJQa Tgzx3Zf4/SBzRHxZNtOZqx1kNwOP1mJYuUCQEvSuhXAl8bSVyxr4KVZH5UjQFIXQeCsS KhnHfD6NzKhtdNOOyDhSirOnNT06Ry4JuPopbieUBn7gpC5MmNMpwndYn26c83VWhE2l reGeajCe1rxCydSlqbNRW52rzxeGCJddmxxu/1lPwFxF8YYKoC4OtMiSjDHBtw2sJ/y+ rkqA== X-Forwarded-Encrypted: i=1; AHgh+RqRCBNRDsDPdOnHloJTng33ed5i/vszovRs+n6+gWvRCJ0aMUIML+O1Orf+Byb7g+PiL6LTVA66pBEVx28=@vger.kernel.org X-Gm-Message-State: AOJu0Yy8Dad3G2UGSjWSsFACf/p1nUwPQXLSKH26JKuoocE9ouewtMLR TLrFRHV80FfHimOnaG/SYe3KyMBc8cNx8admMjqX9dhCpK3maJjqHhCDcEpUH2feuUvaCpMsdDm USjBYQIQ6xQuVPkX/L8k557m9cEU6jwOFH22/sB2KBI1oWw6giI83CKtWUjLVBrjOlas= X-Gm-Gg: AfdE7cklbcxX5Jkd3u9myExyPmI1Il9dDyppDgbFOplGMpwoNu1B6fQNK6SE1ITU2oa mDEL0qCSqI4Z8DzA8whm3kB3FOknagY8DGd6/Y1f18VcvYEX2oCuHb12SYCf+oNcTYkkklLnoWG ycmtMJiD/nrIekIyHmdEHXxNwYrrExh7a1avr21Sp4Nn2Xa/IkG9NwpBbBppx3GyfMIm9VzTwZQ dO/eO/5qq5rPAjacjztyEPeWgnwWHGgOoJ0uH+Swqo9/RylIB1t9BB4x6ATufr1U8hxA0Ig22MT +M0S/81Oa5nK4GSSsKm4tsqhlSw4gr3pk++GXTZLhk6A4Sju2iBf9QrkKFpKQ9qEyZMdwRMZVvo mw/v7KeTt8bUxxT8YNMeoJYMpucsnbkMb+2PZ5IlN/00a X-Received: by 2002:a17:90a:d606:b0:37f:c683:e643 with SMTP id 98e67ed59e1d1-389421ae110mr5398322a91.24.1783570859885; Wed, 08 Jul 2026 21:20:59 -0700 (PDT) X-Received: by 2002:a17:90a:d606:b0:37f:c683:e643 with SMTP id 98e67ed59e1d1-389421ae110mr5398288a91.24.1783570859310; Wed, 08 Jul 2026 21:20:59 -0700 (PDT) Received: from hu-ptalari-hyd.qualcomm.com ([202.46.22.19]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-311747f596asm25490098eec.2.2026.07.08.21.20.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Jul 2026 21:20:58 -0700 (PDT) From: Praveen Talari Date: Thu, 09 Jul 2026 09:50:41 +0530 Subject: [PATCH v2 2/3] i2c: qcom-geni: use dedicated completions for abort and reset events 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: 7bit Message-Id: <20260709-fix_cancel_sequence_on_failure_for_i2c-v2-2-1db178c695bb@oss.qualcomm.com> References: <20260709-fix_cancel_sequence_on_failure_for_i2c-v2-0-1db178c695bb@oss.qualcomm.com> In-Reply-To: <20260709-fix_cancel_sequence_on_failure_for_i2c-v2-0-1db178c695bb@oss.qualcomm.com> To: Mukesh Kumar Savaliya , Viken Dadhaniya , Andi Shyti Cc: linux-arm-msm@vger.kernel.org, linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, Praveen Talari , Naresh Maramaina X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1783570849; l=5993; i=praveen.talari@oss.qualcomm.com; s=20251114; h=from:subject:message-id; bh=rvm1wz1ZLi+Wu8yKfQSbMLnWcPgwIpdMwa2eQX4CXKA=; b=vLdbT+65qynAFb5+3LAb+VXPtCTywzS0LgL3bE43v5KiGPrD3WeEwwabWztdms/jyiD9wSW8j bUwhpKBOMiBCT3QIKrcGuUaRNhoLEsI8UwQ5lS3D0yuJlFTW5c81rbS X-Developer-Key: i=praveen.talari@oss.qualcomm.com; a=ed25519; pk=NGK/88fjyHXgfhIKwag7+uIytOmyOypvZ/hDFaYPEss= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzA5MDAzNyBTYWx0ZWRfXySFh1BQR16Hk 351yAK/aPdIunVtFN7TWGIk55D51L5/5TT1aL3iM7g0bjb/b12oU0taGG4KznAFJO8KfYWQxuxJ zzGrkcuJNEvZ+Fk0ON7VlR0vlaJ2R/IlcPiPVE8BmIucNc9xlHqOVjisb3Ht6aE3gHjTh2324QG pqODeV7JOSojydQBX5Hq6EjDdgAhr4763myLjU/DGKMskVgdt+2teBiJQxdqh/euh48iIK4xY0o JmQc7SEIB8aeg/f32YnY39jyraN/sAVJ4ZhweuVOnt+6QTJzDy/Nb4aossfbb92pkcfCzCTAZon BOwByiM2/ZeZdkTnDWEPM/BmdrEhaYtbSxlex5rav3QUd4koLWvgp/09CNg/UX/fT3DDDVpPk4Y d1EMTi5zkn8OV596d4CjV4v99nr6rzEzugpiOudhIrRx74bDdy3/LDYqF3uR7EZqACzrcBoHAr1 gk3Eq9zx7J3jzLO+msA== X-Proofpoint-Spam-Info: AW1haW4tMjYwNzA5MDAzNyBTYWx0ZWRfX+/QYq14zkFjw Lf90tKEd+hMzoLgxqaBAQdpsL4B1ZdoNsHcX7NsVwkM/oe++qToUCY1pDlQBtfyqrB2qfk47OoL UYw8SWQYawLkKfZ8FYkRZzcF1pFvWbc= X-Proofpoint-ORIG-GUID: B6v6cSbxwUJoWz4xHcRvKcsw55SIaDRH X-Proofpoint-GUID: B6v6cSbxwUJoWz4xHcRvKcsw55SIaDRH X-Authority-Analysis: v=2.4 cv=Krh9H2WN c=1 sm=1 tr=0 ts=6a4f21ac cx=c_pps a=vVfyC5vLCtgYJKYeQD43oA==:117 a=fChuTYTh2wq5r3m49p7fHw==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yx91gb_oNiZeI1HMLzn7:22 a=EUspDBNiAAAA:8 a=KPPVM4V1oce58VYRkwwA:9 a=QEXdDO2ut3YA:10 a=rl5im9kqc5Lf4LNbBjHf:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-08_05,2026-07-08_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 phishscore=0 priorityscore=1501 impostorscore=0 lowpriorityscore=0 adultscore=0 spamscore=0 suspectscore=0 bulkscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607090037 The driver uses a common completion event for transfer, abort and DMA reset operations. This allows unrelated completion events to prematurely wake abort and reset waiters, leading to incorrect synchronization. Introduce dedicated completions for abort, TX reset, and RX reset operations, and signal them only from their respective interrupt events. This removes the dependency on shared completion state and eliminates the abort_done flag-based synchronization. Co-developed-by: Naresh Maramaina Signed-off-by: Naresh Maramaina Signed-off-by: Praveen Talari --- drivers/i2c/busses/i2c-qcom-geni.c | 54 +++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c index 15403edb355a..9490aee4928c 100644 --- a/drivers/i2c/busses/i2c-qcom-geni.c +++ b/drivers/i2c/busses/i2c-qcom-geni.c @@ -113,7 +113,10 @@ struct geni_i2c_dev { int err; struct i2c_adapter adap; struct completion done; + struct completion abort_done; struct completion cancel_done; + struct completion tx_reset_done; + struct completion rx_reset_done; struct i2c_msg *cur; int cur_wr; int cur_rd; @@ -127,7 +130,6 @@ struct geni_i2c_dev { struct dma_chan *rx_c; bool no_dma; bool gpi_mode; - bool abort_done; bool is_tx_multi_desc_xfer; u32 num_msgs; struct geni_i2c_gpi_multi_desc_xfer i2c_multi_desc_config; @@ -256,8 +258,6 @@ static void geni_i2c_err(struct geni_i2c_dev *gi2c, int err) switch (err) { case GENI_ABORT_DONE: - gi2c->abort_done = true; - break; case NACK: case GENI_TIMEOUT: dev_dbg(gi2c->se.dev, "%s\n", gi2c_log[err].msg); @@ -359,12 +359,18 @@ static irqreturn_t geni_i2c_irq(int irq, void *dev) writel_relaxed(dm_rx_st, base + SE_DMA_RX_IRQ_CLR); /* if this is err with done-bit not set, handle that through timeout. */ - if (m_stat & M_CMD_DONE_EN || m_stat & M_CMD_ABORT_EN || - dm_tx_st & TX_DMA_DONE || dm_tx_st & TX_RESET_DONE || - dm_rx_st & RX_DMA_DONE || dm_rx_st & RX_RESET_DONE) + if (m_stat & M_CMD_DONE_EN || + dm_tx_st & TX_DMA_DONE || + dm_rx_st & RX_DMA_DONE) complete(&gi2c->done); if (m_stat & M_CMD_CANCEL_EN) complete(&gi2c->cancel_done); + if (m_stat & M_CMD_ABORT_EN) + complete(&gi2c->abort_done); + if (dm_tx_st & TX_RESET_DONE) + complete(&gi2c->tx_reset_done); + if (dm_rx_st & RX_RESET_DONE) + complete(&gi2c->rx_reset_done); spin_unlock(&gi2c->lock); @@ -376,17 +382,13 @@ static void geni_i2c_abort_xfer(struct geni_i2c_dev *gi2c) unsigned long time_left = ABORT_TIMEOUT; unsigned long flags; + reinit_completion(&gi2c->abort_done); + spin_lock_irqsave(&gi2c->lock, flags); - geni_i2c_err(gi2c, GENI_TIMEOUT); - gi2c->cur = NULL; - gi2c->abort_done = false; geni_se_abort_m_cmd(&gi2c->se); spin_unlock_irqrestore(&gi2c->lock, flags); - do { - time_left = wait_for_completion_timeout(&gi2c->done, time_left); - } while (!gi2c->abort_done && time_left); - + time_left = wait_for_completion_timeout(&gi2c->abort_done, time_left); if (!time_left) dev_err(gi2c->se.dev, "Timeout abort_m_cmd\n"); } @@ -414,31 +416,25 @@ static void geni_i2c_cancel_xfer(struct geni_i2c_dev *gi2c) static void geni_i2c_rx_fsm_rst(struct geni_i2c_dev *gi2c) { - u32 val; unsigned long time_left = RST_TIMEOUT; + reinit_completion(&gi2c->rx_reset_done); writel_relaxed(1, gi2c->se.base + SE_DMA_RX_FSM_RST); - do { - time_left = wait_for_completion_timeout(&gi2c->done, time_left); - val = readl_relaxed(gi2c->se.base + SE_DMA_RX_IRQ_STAT); - } while (!(val & RX_RESET_DONE) && time_left); - if (!(val & RX_RESET_DONE)) + time_left = wait_for_completion_timeout(&gi2c->rx_reset_done, time_left); + if (!time_left) dev_err(gi2c->se.dev, "Timeout resetting RX_FSM\n"); } static void geni_i2c_tx_fsm_rst(struct geni_i2c_dev *gi2c) { - u32 val; unsigned long time_left = RST_TIMEOUT; + reinit_completion(&gi2c->tx_reset_done); writel_relaxed(1, gi2c->se.base + SE_DMA_TX_FSM_RST); - do { - time_left = wait_for_completion_timeout(&gi2c->done, time_left); - val = readl_relaxed(gi2c->se.base + SE_DMA_TX_IRQ_STAT); - } while (!(val & TX_RESET_DONE) && time_left); - if (!(val & TX_RESET_DONE)) + time_left = wait_for_completion_timeout(&gi2c->tx_reset_done, time_left); + if (!time_left) dev_err(gi2c->se.dev, "Timeout resetting TX_FSM\n"); } @@ -851,6 +847,7 @@ static int geni_i2c_gpi_xfer(struct geni_i2c_dev *gi2c, struct i2c_msg msgs[], i for (i = 0; i < num; i++) { gi2c->cur = &msgs[i]; gi2c->err = 0; + reinit_completion(&gi2c->done); dev_dbg(gi2c->se.dev, "msg[%d].len:%d\n", i, gi2c->cur->len); peripheral.stretch = 0; @@ -920,6 +917,8 @@ static int geni_i2c_fifo_xfer(struct geni_i2c_dev *gi2c, m_param |= ((msgs[i].addr << SLV_ADDR_SHFT) & SLV_ADDR_MSK); gi2c->cur = &msgs[i]; + gi2c->err = 0; + reinit_completion(&gi2c->done); if (msgs[i].flags & I2C_M_RD) ret = geni_i2c_rx_one_msg(gi2c, &msgs[i], m_param); else @@ -939,8 +938,6 @@ static int geni_i2c_xfer(struct i2c_adapter *adap, struct geni_i2c_dev *gi2c = i2c_get_adapdata(adap); int ret; - gi2c->err = 0; - reinit_completion(&gi2c->done); ret = pm_runtime_get_sync(gi2c->se.dev); if (ret < 0) { dev_err(gi2c->se.dev, "error turning SE resources:%d\n", ret); @@ -1132,7 +1129,10 @@ static int geni_i2c_probe(struct platform_device *pdev) gi2c->adap.algo = &geni_i2c_algo; init_completion(&gi2c->done); + init_completion(&gi2c->abort_done); init_completion(&gi2c->cancel_done); + init_completion(&gi2c->tx_reset_done); + init_completion(&gi2c->rx_reset_done); spin_lock_init(&gi2c->lock); platform_set_drvdata(pdev, gi2c); -- 2.34.1