From nobody Mon Sep 28 08:46:17 2026 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 4F50C3EC82A for ; Mon, 24 Aug 2026 11:26:22 +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=1787570785; cv=none; b=J4IfSyQHOrdwRzNWUrwZPh5qbGknDqYYIeU3aT4kLH8t0GDS9NghGU1r3sih3MEUquJXWNoLX8ZbJ6am0Y/EONtKZ1/iKtvZHCpT2pIlIdxco9vVqjrp/Cn4TMWY5kLco7RBQSkvGCI+fsWsIRtZ9yheRIS1Uqg5d6oZh3ydR+w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787570785; c=relaxed/simple; bh=wyZrDrT94kleNnxYe3zfwal6cWHvi+0Xa2JF7iNHiCE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Ggt7I4ujBK7M8LVj2E9snSyBbMfqlbBqf6RUy51W14arrdIUI8fLBlHWp3Aik4rrj0yqxPMErHpvyQKkL+f7eFILwZXZmtBRtc6ch6nDqr8XDnGJlU1aEoXdOrUNhkcS7K8PqWPjc+qtpKm5QkQPsCrc4OAUfY4yHjGEo7WTP8k= 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=Hwo1DxCV; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=jcneYvbS; 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="Hwo1DxCV"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="jcneYvbS" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67OBMeMM3195004 for ; Mon, 24 Aug 2026 11:26:21 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= SuDJmzv9VCByMHTq2q9HTLWJYFjDIUBgT1sx9HrKQ04=; b=Hwo1DxCVLBL2oFSP D1cGUJkwkNKVBzV/IQf5MxsbyHkdsmzdpmX3p35HKpGfXFMDetmk0EFQB9oeWiWz KDmVIsHfUg3ZoprGwo9QQeB5efO33c9UyE1IHegPR8lxgfQqLaleOaqTny464IGo mn+UuWLm5ocHHE1TO/HDUBijPzPLWK1NgfHZbXHlRZ3YqJq2L7UqMa2fdxxW2CDD 4mwljV3FC7QS1Rnxz08Iwu+zJHGaWjeQOzPQfiROmHH4rE59G8wpzn18yPwhH6V4 ZXj1FmvJO2/dhxueKUIKBJaxZnCRDp9k3H35bJteQ1Li7Vfq9QJfJuJT+aUpNhHb 89J6sQ== Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4g8hjgryrn-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 24 Aug 2026 11:26:21 +0000 (GMT) Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-c85798977dcso6006286a12.0 for ; Mon, 24 Aug 2026 04:26:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1787570780; x=1788175580; 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=SuDJmzv9VCByMHTq2q9HTLWJYFjDIUBgT1sx9HrKQ04=; b=jcneYvbSKwWXwW+Dc2QrZGmvY12CyQcQF+m5YsU7hNcxLOeOz6ErYX1EfedpDYRuqM +11e6iXRVaJaT/h/frupGumxX1e2j6wH+4owRXxUgcXaKvFjLBUTEzCHcjHzCLjhaVU8 YyQJ7LOW4f6CWXE05drdJOaxl+BzagQCNxqlLM7dLLGCOpxgBDDeRd1qhoA4xu7qwyfg SpHjLyJDopaeX/Jm5p89Xcq44yqmVoirHp0LA9+IsXFK2nHBxqbpa9+Cvgx8Fv7+FQX9 fHyG2F2QulAmngEXubrzR/bN27M5qICQwIk6gxl0ojYXN0iRaDlKd7AAkr5rRt5g4Y+k +yUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787570780; x=1788175580; 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=SuDJmzv9VCByMHTq2q9HTLWJYFjDIUBgT1sx9HrKQ04=; b=J/GOkaugUPJNXWDFgXz+hA11RG9vJrBB4SwSiM+96WoTR3iTvb36sCBw0WXgeONALV 4fnVjOovoowkrjM7O2H6LfLnLy2hNSagLpmDIF3WVzxHxQ1gc56TEK1hL0Ry89wQYOdR B+nIlK+wFy8wEirQaj9OsraWshknowj103UZksXltzekeEeBfO9+ejY/szwz0uvVBjSa Nm95UD7KHINHp7IrQ2N14jsxOQWLs51Su0XJs+HalVeU9uoaW3udk6d3PB+Yfs3u6LfP 7csJcyV4tLq8OI2kqdWWxh/1vPOTdKbiKtrKwWm/fX68lEMRdGsgZ7EXaSMKz17P7KFs ohbQ== X-Forwarded-Encrypted: i=1; AHgh+RqEno3Drrng68Rvc5MEi3GyOi9dsKGJSnNahv4B1H9fBTZZQ53cMLrY27cfIAWA3qMOG/oFeJWXB0kvRN0=@vger.kernel.org X-Gm-Message-State: AFuF++lX2NrSnoSCAjQdaWQZsU11wO5UfSfZ6CU2fuDNeIcEXhsbel6d TyUtvEEgIkMnzN5oSDRymNJUHd73TDUn0gSx70dXyO5ByXLsyN4D4yKw63bgEXGc67hFOBfL4GX lK3Jwpt/K9O8XcvC6JmUc1ryzUIdp87jRk+8KKUQn9gXKHDzF5os+83KSHWGGpC6cP5U= X-Gm-Gg: AR+sD13PyG1QXuWlIJ+pzqJARelDmX9hmiNkxBpYgABTqp3qgzrKHS5c0IDr9lYtWBy 7HbAAIhZT4KRWH6E2mTLeIYHC+jizqbtpgtIRrsJeZmypccU4GAturQOkk2oQab7LmweAFFXGg6 4EfDpHQqDcF5X9KpGp8+MPu7ZLKt/LE0fets7ozIbklpucrlyy6gK0dAtSENKyu0pbATT4uqBy/ SmyMn36/jfanLhl6llyerPwtJv+UQGI0f2FLG6IZfTPrrPqEmVzDCS3bBlgVOeCOceESnU2K6Nq ozMmSFv9U716VFZg/EYoDLVAkn2cprWgWq61r7q3iRYSVddWMfXEj+Qh0TRvYduLlN+ZvDeMln2 YaDZTvT9Z2Ej+0Dxqrlo79HnhbOpUwdZW/BM= X-Received: by 2002:a17:90b:580d:b0:38f:5869:387b with SMTP id 98e67ed59e1d1-395df24e757mr34314762a91.9.1787570780116; Mon, 24 Aug 2026 04:26:20 -0700 (PDT) X-Received: by 2002:a17:90b:580d:b0:38f:5869:387b with SMTP id 98e67ed59e1d1-395df24e757mr34314069a91.9.1787570777103; Mon, 24 Aug 2026 04:26:17 -0700 (PDT) Received: from hu-jseerapu-hyd.qualcomm.com ([202.46.22.19]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-395e4a1597csm9767137a91.13.2026.08.24.04.26.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Aug 2026 04:26:16 -0700 (PDT) From: Jyothi Kumar Seerapu Date: Mon, 24 Aug 2026 16:55:48 +0530 Subject: [PATCH 1/2] dmaengine: qcom-gpi: Add I2C High-Speed mode configuration support 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: <20260824-i2c-hs-v1-1-8dd94e5c6113@oss.qualcomm.com> References: <20260824-i2c-hs-v1-0-8dd94e5c6113@oss.qualcomm.com> In-Reply-To: <20260824-i2c-hs-v1-0-8dd94e5c6113@oss.qualcomm.com> To: Vinod Koul , Frank Li , Mukesh Kumar Savaliya , Viken Dadhaniya , Andi Shyti Cc: linux-arm-msm@vger.kernel.org, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, linux-i2c@vger.kernel.org, Jyothi Kumar Seerapu X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787570769; l=6680; i=jyothi.seerapu@oss.qualcomm.com; h=from:subject:message-id; bh=wyZrDrT94kleNnxYe3zfwal6cWHvi+0Xa2JF7iNHiCE=; b=EuI+Sk/+uPt6HFuMFlCzcMt3ddMe6yPUfrqw67ON+f5gUHInF6WXskUt1hyKAYAeWS6QQaTH4 VFMcKpmn+25DUNmGmBM9Z6LnjFIQcDItjXN1fgfC9mm1w6nMDoddGt1 X-Developer-Key: i=jyothi.seerapu@oss.qualcomm.com; a=ed25519; pk=9vafyYsia0OnBKWSEwhmWe3hPVQfI2T1xOs5dPaFvEo= X-Proofpoint-Spam-Info: AW1haW4tMjYwODI0MDA5NSBTYWx0ZWRfX30bNTIRF4L8B nj2yEi4plonIMSLihiL4Hc9ufOd72mYWXtynRwVeu9w8rESKE2kRbfmo4nRmH2XRKkkwXcuj6hb PvlX/eBnoMhD/2JLKb7pd45Ea8oSv04= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI0MDA5NSBTYWx0ZWRfX6QZSHKugo53V mXE7FkuylGPqIVyqr+g0vp1NkZc7XzsWfRMOSEiQAj7fle/lK6uzdSsAP9AK/8uPlS3rG9dwTMd tVXdAINg4AvkyZgia9bw5vLRLOiSWdKAXBFLdamWHpIUMUsCzPFySKk8VlZcueuB3GtBq3iutWA lrQQaI1IfVcLUUkRCVvlMFh1K42o8wOsD2sHXJz27MF14DWwY1G6ESk3FzT2K4AwtFjBqPJLGN8 HRsnZX+rkOQArFdI8tWjYXHU5GQkahMApL/tK+EcNdCNmz0u6H2dxzmZb2EBmOWvxDqqjv7DsT7 6YJJmtBJcM/QqM9xKTraLo0quXTfROFj0X9YbX2yQ/PciXrSmxYnNs9LG+Dw72BZ4z1ZS+Uk8zb kNlZq98SDy5OwcHyJiJbVETBrjtYoPAtZfamMOBXFOa39ep3iCIZiV7eehdDDA1FKlyn6oc4kGU +RG4vOkNq7i5v4GcbFA== X-Proofpoint-ORIG-GUID: Gh0iSWMfYVPay5hUtRlv6jVoBlk_qWRQ X-Authority-Analysis: v=2.4 cv=CoCPtH4D c=1 sm=1 tr=0 ts=6a8c2a5d cx=c_pps a=Qgeoaf8Lrialg5Z894R3/Q==:117 a=fChuTYTh2wq5r3m49p7fHw==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=3WHJM1ZQz_JShphwDgj5:22 a=EUspDBNiAAAA:8 a=8yvkWvxPp_QYhSqoyPwA:9 a=QEXdDO2ut3YA:10 a=x9snwWr2DeNwDh03kgHS:22 X-Proofpoint-GUID: Gh0iSWMfYVPay5hUtRlv6jVoBlk_qWRQ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-24_03,2026-08-24_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 priorityscore=1501 malwarescore=0 phishscore=0 bulkscore=0 adultscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608240095 Add support in the Qualcomm GPI (Generic Packet Interface) DMA engine to configure I2C High-Speed (HS) mode transfers. Introduce support for CONFIG1 Transfer Ring Element (TRE) to convey HS-specific timing parameters to the hardware. Define a new gpi_i2c_config1 structure containing tcycle_cnt and tlow_cnt fields, with default values of 28 and 38 respectively, as required for 3.4 MHz HS mode operation. Signed-off-by: Jyothi Kumar Seerapu --- drivers/dma/qcom/gpi.c | 54 +++++++++++++++++++++++++++++++++++-= ---- include/linux/dma/qcom-gpi-dma.h | 28 ++++++++++++++++++++- 2 files changed, 75 insertions(+), 7 deletions(-) diff --git a/drivers/dma/qcom/gpi.c b/drivers/dma/qcom/gpi.c index a5055a6273af..52a7800ed4f5 100644 --- a/drivers/dma/qcom/gpi.c +++ b/drivers/dma/qcom/gpi.c @@ -21,6 +21,7 @@ #define TRE_TYPE_IMMEDIATE_DMA 0x11 #define TRE_TYPE_GO 0x20 #define TRE_TYPE_CONFIG0 0x22 +#define TRE_TYPE_CONFIG1 0x23 =20 /* TRE flags */ #define TRE_FLAGS_CHAIN BIT(0) @@ -58,9 +59,14 @@ #define TRE_I2C_C0_TX_PACK BIT(24) #define TRE_I2C_C0_RX_PACK BIT(25) =20 +/* I2C Config1 WD0 */ +#define TRE_I2C_C1_TLOW GENMASK(9, 0) +#define TRE_I2C_C1_TCYCLE GENMASK(19, 10) + /* I2C GO WD0 */ #define TRE_I2C_GO_CMD GENMASK(4, 0) #define TRE_I2C_GO_ADDR GENMASK(14, 8) +#define TRE_I2C_GO_MASTER_CODE GENMASK(17, 15) #define TRE_I2C_GO_STRETCH BIT(26) =20 /* DMA TRE */ @@ -1631,7 +1637,7 @@ static int gpi_create_i2c_tre(struct gchan *chan, str= uct gpi_desc *desc, struct gpi_tre *tre; unsigned int i; =20 - /* first create config tre if applicable */ + /* first create config0 tre if applicable */ if (i2c->set_config) { tre =3D &desc->tre[tre_idx]; tre_idx++; @@ -1645,20 +1651,48 @@ static int gpi_create_i2c_tre(struct gchan *chan, s= truct gpi_desc *desc, tre->dword[1] =3D 0; =20 tre->dword[2] =3D u32_encode_bits(i2c->clk_div, TRE_C0_CLK_DIV); + tre->dword[2] |=3D u32_encode_bits(i2c->clk_src, TRE_C0_CLK_SRC); =20 tre->dword[3] =3D u32_encode_bits(TRE_TYPE_CONFIG0, TRE_FLAGS_TYPE); tre->dword[3] |=3D u32_encode_bits(1, TRE_FLAGS_CHAIN); } =20 - /* create the GO tre for Tx */ - if (i2c->op =3D=3D I2C_WRITE) { + /* Create CONFIG1 TRE if requested */ + if (i2c->set_config1) { tre =3D &desc->tre[tre_idx]; tre_idx++; =20 + /* CONFIG1 TRE with timing parameters */ + tre->dword[0] =3D u32_encode_bits(i2c->config1.tlow_cnt, TRE_I2C_C1_TLOW= ); + tre->dword[0] |=3D u32_encode_bits(i2c->config1.tcycle_cnt, TRE_I2C_C1_T= CYCLE); + tre->dword[1] =3D 0; + tre->dword[2] =3D 0; + tre->dword[3] =3D u32_encode_bits(TRE_TYPE_CONFIG1, TRE_FLAGS_TYPE); + tre->dword[3] |=3D u32_encode_bits(1, TRE_FLAGS_CHAIN); + } + + /* create the GO tre for Tx */ + if (i2c->op =3D=3D I2C_WRITE || i2c->op =3D=3D I2C_HS_WRITE) { + u8 master_code =3D 0; /* Default master code for Linux EE */ + u32 cmd_opcode; + bool is_hs_mode =3D false; + + tre =3D &desc->tre[tre_idx]; + tre_idx++; + + is_hs_mode =3D (i2c->op =3D=3D I2C_HS_WRITE || i2c->op =3D=3D I2C_HS_REA= D); + + /* Determine the command opcode based on HS mode and multi_msg flag */ if (i2c->multi_msg) - tre->dword[0] =3D u32_encode_bits(I2C_READ, TRE_I2C_GO_CMD); + cmd_opcode =3D is_hs_mode ? I2C_HS_READ : I2C_READ; else - tre->dword[0] =3D u32_encode_bits(i2c->op, TRE_I2C_GO_CMD); + /* I2C HS write vs Regular I2C write */ + cmd_opcode =3D is_hs_mode ? I2C_HS_WRITE : i2c->op; + + tre->dword[0] =3D u32_encode_bits(cmd_opcode, TRE_I2C_GO_CMD); + + if (is_hs_mode) + tre->dword[0] |=3D u32_encode_bits(master_code, TRE_I2C_GO_MASTER_CODE); =20 tre->dword[0] |=3D u32_encode_bits(i2c->addr, TRE_I2C_GO_ADDR); tre->dword[0] |=3D u32_encode_bits(i2c->stretch, TRE_I2C_GO_STRETCH); @@ -1674,7 +1708,7 @@ static int gpi_create_i2c_tre(struct gchan *chan, str= uct gpi_desc *desc, tre->dword[3] |=3D u32_encode_bits(1, TRE_FLAGS_CHAIN); } =20 - if (i2c->op =3D=3D I2C_READ || i2c->multi_msg =3D=3D false) { + if (i2c->op =3D=3D I2C_READ || i2c->op =3D=3D I2C_HS_READ || i2c->multi_m= sg =3D=3D false) { /* create the DMA TRE */ tre =3D &desc->tre[tre_idx]; tre_idx++; @@ -1826,6 +1860,14 @@ gpi_prep_slave_sg(struct dma_chan *chan, struct scat= terlist *sgl, if (direction =3D=3D DMA_DEV_TO_MEM) /* rx */ nr_tre =3D 1; =20 + /* I2C High-Speed mode sends an extra CONFIG1 TRE ahead of the GO TRE */ + if (gchan->protocol =3D=3D QCOM_GPI_I2C) { + struct gpi_i2c_config *i2c =3D gchan->config; + + if (i2c->set_config1) + nr_tre++; + } + /* calculate # of elements required & available */ nr =3D gpi_ring_num_elements_avail(ch_ring); if (nr < nr_tre) { diff --git a/include/linux/dma/qcom-gpi-dma.h b/include/linux/dma/qcom-gpi-= dma.h index 332be28427e4..6e9f09fc109a 100644 --- a/include/linux/dma/qcom-gpi-dma.h +++ b/include/linux/dma/qcom-gpi-dma.h @@ -6,6 +6,24 @@ #ifndef QCOM_GPI_DMA_H #define QCOM_GPI_DMA_H =20 +/** + * struct gpi_i2c_config1 - I2C High-Speed mode timing configuration + * @tcycle_cnt: I2C HS mode TCYCLE counter value + * @tlow_cnt: I2C HS mode TLOW counter value + * + * This structure is used for I2C High-Speed mode to configure the + * high-speed timing parameters via CONFIG1 TRE. The CONFIG1 TRE + * must be sent before the GO TRE when operating in HS mode. + * + * For I2C HS mode (3.4 MHz): + * - tcycle_cnt: Typically 28 for 100 MHz source clock + * - tlow_cnt: Typically 38 for 100 MHz source clock + */ +struct gpi_i2c_config1 { + u16 tcycle_cnt; + u16 tlow_cnt; +}; + /** * enum spi_transfer_cmd - spi transfer commands * @SPI_TX: SPI peripheral TX command @@ -52,6 +70,8 @@ struct gpi_spi_config { enum i2c_op { I2C_WRITE =3D 1, I2C_READ, + I2C_HS_WRITE =3D 0xa, + I2C_HS_READ =3D 0xb, }; =20 /** @@ -62,15 +82,19 @@ enum i2c_op { * @high_count: high period of clock * @low_count: low period of clock * @clk_div: source clock divider + * @clk_src: serial clock * @addr: i2c bus address * @stretch: stretch the clock at eot - * @set_config: set peripheral config + * @set_config: set peripheral config (CONFIG0) + * @set_config1: set peripheral config1 (CONFIG1) + * @config1: I2C HS mode timing configuration (CONFIG1 TRE parameters) * @rx_len: receive length for buffer * @op: i2c cmd * @multi_msg: is part of multi i2c r-w msgs */ struct gpi_i2c_config { u8 set_config; + u8 set_config1; u8 pack_enable; u8 cycle_count; u8 high_count; @@ -78,6 +102,8 @@ struct gpi_i2c_config { u8 addr; u8 stretch; u16 clk_div; + u32 clk_src; + struct gpi_i2c_config1 config1; u32 rx_len; enum i2c_op op; bool multi_msg; --=20 2.34.1 From nobody Mon Sep 28 08:46:17 2026 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 1DAA940DB23 for ; Mon, 24 Aug 2026 11:26:26 +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=1787570787; cv=none; b=hJ7qxRmrWbXnJu9MEtS05gzM4Kmy+64iktssg5rP02r6SFAdeN9BXe5SyVHkI2bO+xBbm3hDHJd2kOErpdc76oehxqHEZXw6hamY+6ZVVV3Vdc1JwllqV0gCPw73Ngxcs0weQHEYMQMUts0KLMHrtjOnv0EvhN9uuxeACx/bZ+k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787570787; c=relaxed/simple; bh=WrxAo54F0PNxjIKywqioE+0bNvoyH2vqjLWAaOJpeAs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bC8jxcig3YoLw3mReerefNtzGdfSz2/ZznPUj0xa/ykf0PpsnpOrZB8GR0mBYMAEWDeAKVnnU9ztXsRGxTGLiu1hwiqBkrsIUA1MITX4k447HAfH6DrPiwtzwXKUibIpD3NNvBy5Vk64ZQ4xePQdlW9M+ok/+CLXNvmt11GUcqw= 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=eMOUwrJb; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=WHUIj0KZ; 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="eMOUwrJb"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="WHUIj0KZ" Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67OBMZUd1673221 for ; Mon, 24 Aug 2026 11:26:25 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= daDy3e63G0aS4Qk0qxsOt8Z6YU9UhNvw1bujjTlM55w=; b=eMOUwrJb0lXriREP lxwqGpXhU3AQt3AmiNDqsYGLWCvIE798QR9AyTHWbsbxOxu012S5l6Z4Vr9XHEky M7y4m2nYVPBf6yOGvEeSEyqSlqXX73EFUpo3C12f3odZ+jTwkYonnqYAwvMvMMnI J88Bl9wcHlxRVSFB1iDq1hTYhqNW7aO49qJ/Pj8cP2HzHS1Bne2pCl2j5BNYnYzO HxS3RDotjMJLLY/Pf3d6o+nVBf98FUhPoa7m30CMF27+5ucun/jc/uO6vOYuUuwc loj6pydEqKrzpivFACQVVYGp6IeprrstPf0lRxR6gkLySoQNWAffcl4JL0cdX0mW 2oyvIw== Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4g8huf0x8r-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 24 Aug 2026 11:26:24 +0000 (GMT) Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-38dd87656d3so4432446a91.2 for ; Mon, 24 Aug 2026 04:26:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1787570784; x=1788175584; 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=daDy3e63G0aS4Qk0qxsOt8Z6YU9UhNvw1bujjTlM55w=; b=WHUIj0KZ9izl6phhnVyu2lEGU1w4teZIi30tw7YeA7m8dKk00rBlWyqrtlpj6U/17Z s7AzbDseNPPtNzAYolb8l1MPgum0r5C03QrFHsw2JKl2XJH4sFShh+nhZ+07ewO7cQbY v7qMSfLRREesI+mM2imf7uOfMcsc/7WHeGEftocGiXR2GJtu8n1HdoL1GJuxTLTwnrXY EAY9lB1R62F+y8EK5T47Rbl6VfvAUfvbNYrq/2yzN+eHdoMNnIMg+9raLGsmtwq6yoHH TpTRC+3v8NaGOnmxT7Q9gAdZJ194loGj1GSwTO+p/hqo43M6Mn/TG0we8PGJ6xhTip/t amrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787570784; x=1788175584; 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=daDy3e63G0aS4Qk0qxsOt8Z6YU9UhNvw1bujjTlM55w=; b=P/3SVN0ZbMvvuxPjryCylBkmDF/3B7QrsJdRXn8pvTSeaM3mcueGszm/n/aM9RFN3s 0kfw2kX78o4VUHZQy2AZvTKopw0cJfpOPCHuSkjaoOLy1W/EyUD572vdzRo6Opk0d0Fe reCxY/+MOfpIpikz7UL98n6RzTLm8CiJ767XSiE2zzrugdxdDoEVfqIaSG/QKuCMcwn3 47YvxtdEuP5j0R7S6OrzrGfGyeSm8Gun55jGZ2UgTOUI5cVRjDenrypf3s1CAfYlqqOQ eD6H3dFRjQW6+DLTXmjZcnPYnFvUQsOn99lw4yq1S0Uf8Z7HYD+OjPvo7A0ePeFRR9NL AkFQ== X-Forwarded-Encrypted: i=1; AHgh+Rqd+3NsX7Q6otrU2aHx7lTlV2KaS94pr4BkOP8XGVPsYPArW9BQVyV8I2k8TAN24icWQsMcgMWs5dpx/oI=@vger.kernel.org X-Gm-Message-State: AFuF++kTJOq1sFoSj280ay1cr5DCwoNaCZYaZ8irPUHZ+CnmGay1CCN/ 2hKAtJEsvgXikJ7xcHbuVUAQ0yvZuUM7KdCE4XncSkADdCNi0x9JYrBnmkq8kGP+pVmTchM9ZFl VA904z3UiWY4nZNZ+UymGbVwTPhePEy+ek+T+p3jTp+esZkVmo6TVIcie9VtaO7Z9iZk= X-Gm-Gg: AR+sD12rBfVG43UAkhjKBwQl4YgoHvk9v55eFj6Z69eAey8jttGuJ+aBn6PNKXhgdqU BQNfSzSVVRK0/FWZUrWHI9zqCFaeD/Bjvn0D4dNcm7MmoBGgoPw4Op2q3sTShuOjPgLG6oWMh3a U5rE75JSTTC+ae0gMwB+GZeLMoGX/l0hS33z3X7C1bqGeWPijgX6/oO0R2O8kIjIwbeJ5EFNxbG 9T+EXHV/7TSjSbU511SVlsoxbUEJS1PmaKE2tqhxoZDA3Dm8AIROsJ7iYvVekv3Vnlc9WOKMz70 wA2nnjZPUYbTMyJ2E/xtXbWXm388xpnKANv2ABVbeyn8vFnf+heap/511dj7cgdgVlj5NuqUiqD d4UFUoY8iZ12i8OWL+m6J4p6gu5/K1xBSrPQ= X-Received: by 2002:a17:90b:58cf:b0:37f:eafd:3505 with SMTP id 98e67ed59e1d1-395deec0e5amr34549139a91.6.1787570783786; Mon, 24 Aug 2026 04:26:23 -0700 (PDT) X-Received: by 2002:a17:90b:58cf:b0:37f:eafd:3505 with SMTP id 98e67ed59e1d1-395deec0e5amr34549034a91.6.1787570783254; Mon, 24 Aug 2026 04:26:23 -0700 (PDT) Received: from hu-jseerapu-hyd.qualcomm.com ([202.46.22.19]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-395e4a1597csm9767137a91.13.2026.08.24.04.26.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Aug 2026 04:26:22 -0700 (PDT) From: Jyothi Kumar Seerapu Date: Mon, 24 Aug 2026 16:55:49 +0530 Subject: [PATCH 2/2] i2c: qcom-geni: Add support for I2C High-Speed mode 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: <20260824-i2c-hs-v1-2-8dd94e5c6113@oss.qualcomm.com> References: <20260824-i2c-hs-v1-0-8dd94e5c6113@oss.qualcomm.com> In-Reply-To: <20260824-i2c-hs-v1-0-8dd94e5c6113@oss.qualcomm.com> To: Vinod Koul , Frank Li , Mukesh Kumar Savaliya , Viken Dadhaniya , Andi Shyti Cc: linux-arm-msm@vger.kernel.org, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, linux-i2c@vger.kernel.org, Jyothi Kumar Seerapu X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787570769; l=9461; i=jyothi.seerapu@oss.qualcomm.com; h=from:subject:message-id; bh=WrxAo54F0PNxjIKywqioE+0bNvoyH2vqjLWAaOJpeAs=; b=lbgWB+9vzlrxP8LuBgkhtkArf5m2UFgWqdLEhQqO67h5+wRIMNqTg29M0DELY6xx8QUyAP+2N V403qE1+ZA4DyvBm6nOuRXidESL6WG7aoBU4iKMJYZsbbZByF5/D+4+ X-Developer-Key: i=jyothi.seerapu@oss.qualcomm.com; a=ed25519; pk=9vafyYsia0OnBKWSEwhmWe3hPVQfI2T1xOs5dPaFvEo= X-Proofpoint-Spam-Info: AW1haW4tMjYwODI0MDA5NSBTYWx0ZWRfX6qX2E44SI3sk GylPMqCA1wM7OAyp6HMNX1q/1hYTnsbNLV67v3fk+Go1yDC1a6dM7RW5CFxZudjjjTyNUIwohgJ twdZZVp/+Uq/VDAuzf0T7IrWsKtAR/4= X-Authority-Analysis: v=2.4 cv=Wac8rUhX c=1 sm=1 tr=0 ts=6a8c2a60 cx=c_pps a=UNFcQwm+pnOIJct1K4W+Mw==:117 a=fChuTYTh2wq5r3m49p7fHw==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_glEPmIy2e8OvE2BGh3C:22 a=EUspDBNiAAAA:8 a=CVQZEhLW7cNm6rAVh1IA:9 a=QEXdDO2ut3YA:10 a=uKXjsCUrEbL0IQVhDsJ9:22 X-Proofpoint-ORIG-GUID: aBvtOqskr4eF0P_HDFaikoH2muMWZnQq X-Proofpoint-GUID: aBvtOqskr4eF0P_HDFaikoH2muMWZnQq X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI0MDA5NSBTYWx0ZWRfXxJ2O0anWJbv3 0RKRNkoVOvArKtvpK0ZLI/o/+zgDO0oRegiJfKoA2sV9yFi4UByBuRWdORVXwGmQNJV+vO824H5 llUwQWpKPDZtBWVbWELrWXt7iirDboQixweplWISi9Rc02zKT8xZkcTbxps9Yyj7VvagQEXzpfV BteQheaGPx73f26NfmqjffFIgZIedC6KwmHwBghStwFqAPfHN6B6XBsWfnNZIBmewhSPKppoxj8 iL5FjuFbPAeVRFjsTTwb+dSgxLBKoybx23lptSkk3DbzDHm+GPjxjXduKmiMg0GmW9fhUO4IAOd 9ciea67xlBClCnCuUOzIhTiRO3/8Mw8xqwn1saUUvDAFx2Wuv/owPn4lgTzEX4Y3D2l4Wh5rCtD W1B7nZVjedUj7YIb2oLaIIxV96FVKeVhIcSeDiwtK6eGRAmo1h9eDLJuJdOOx2uC+D6siqYK3Hk U3uP66pGrHAg0YESfWw== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-24_03,2026-08-24_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 suspectscore=0 impostorscore=0 adultscore=0 priorityscore=1501 bulkscore=0 lowpriorityscore=0 phishscore=0 malwarescore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608240095 Implement I2C High-Speed (HS) mode for the Qualcomm GENI I2C controller. Detect HS mode requests based on 3.4 MHz frequency and configure the hardware accordingly. When HS mode is active, set the source clock to 100 MHz and program timing parameters (TCYCLE=3D28, TLOW=3D38). For FIFO/SE-DMA transfers, use HS-specific opcodes I2C_HS_WRITE (0xa) and I2C_HS_READ (0xb). Transmit the master code at Fast Mode Plus timing (1 MHz) before switching to 3.4 MHz for data transfer. For GPI DMA, extend the configuration with a CONFIG1 TRE to pass HS timing parameters to the DMA engine. Add gpi_i2c_config1 with tcycle_cnt and tlow_cnt fields (defaults: 28 and 38). Use the set_config1 flag in gpi_i2c_config to send CONFIG1 TRE before the GO TRE in HS mode. Signed-off-by: Jyothi Kumar Seerapu --- drivers/i2c/busses/i2c-qcom-geni.c | 133 +++++++++++++++++++++++++++++++++= ---- 1 file changed, 121 insertions(+), 12 deletions(-) diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qc= om-geni.c index 658636c1ee0e..3712e0dd9e68 100644 --- a/drivers/i2c/busses/i2c-qcom-geni.c +++ b/drivers/i2c/busses/i2c-qcom-geni.c @@ -21,9 +21,21 @@ #include #include =20 +#define SE_GENI_CFG_REG68 0x210 +#define SE_I2C_HS_TLOW_REG 0x268 #define SE_I2C_TX_TRANS_LEN 0x26c #define SE_I2C_RX_TRANS_LEN 0x270 #define SE_I2C_SCL_COUNTERS 0x278 +#define SE_I2C_HS_TCYCLE_REG 0x27c + +/* I2C High-Speed mode definitions */ +#define I2C_HS_MODE_FREQ 3400000 +#define I2C_HS_SRC_CLK_FREQ (100 * HZ_PER_MHZ) +#define I2C_HS_TCYCLE_CNT 28 +#define I2C_HS_TLOW_CNT 38 +/* I2C HS mode support requires QUPv3 core version >=3D 4.3 per HPG */ +#define QUP_I2C_HS_MIN_MAJOR 4 +#define QUP_I2C_HS_MIN_MINOR 3 =20 #define SE_I2C_ERR (M_CMD_OVERRUN_EN | M_ILLEGAL_CMD_EN | M_CMD_FAILURE_E= N |\ M_GP_IRQ_1_EN | M_GP_IRQ_3_EN | M_GP_IRQ_4_EN) @@ -36,6 +48,9 @@ #define I2C_ADDR_ONLY 0x4 #define I2C_BUS_CLEAR 0x6 #define I2C_STOP_ON_BUS 0x7 +#define I2C_HS_WRITE 0xa +#define I2C_HS_READ 0xb + /* M_CMD params for I2C */ #define PRE_CMD_DELAY BIT(0) #define TIMESTAMP_BEFORE BIT(1) @@ -138,6 +153,9 @@ struct geni_i2c_dev { u32 num_msgs; struct geni_i2c_gpi_multi_desc_xfer i2c_multi_desc_config; const struct geni_i2c_desc *dev_data; + bool is_hs_mode; + bool config1_sent; + u32 dfs_index; }; =20 struct geni_i2c_err_log { @@ -162,9 +180,14 @@ static const struct geni_i2c_err_log gi2c_log[] =3D { struct geni_i2c_clk_fld { u32 clk_freq_out; u8 clk_div; - u8 t_high_cnt; - u8 t_low_cnt; - u8 t_cycle_cnt; + /* + * In normal mode, these counter values fit within 8 bits. + * In High-Speed mode, HS_TLOW_COUNT and HS_TCYCLE_COUNT are + * 10-bit fields, so u16 is required. + */ + u16 t_high_cnt; + u16 t_low_cnt; + u16 t_cycle_cnt; }; =20 /* @@ -194,10 +217,30 @@ static const struct geni_i2c_clk_fld geni_i2c_clk_map= _32mhz[] =3D { {} }; =20 +/* source_clock =3D 100 MHz */ +static const struct geni_i2c_clk_fld geni_i2c_clk_map_100mhz[] =3D { + { I2C_MAX_STANDARD_MODE_FREQ, 1, 449, 548, 998 }, + { I2C_MAX_FAST_MODE_FREQ, 1, 76, 167, 248 }, + { I2C_MAX_FAST_MODE_PLUS_FREQ, 1, 23, 59, 98 }, + {} +}; + static int geni_i2c_clk_map_idx(struct geni_i2c_dev *gi2c) { const struct geni_i2c_clk_fld *itr; =20 + /* Check if HS mode is requested */ + if (gi2c->clk_freq_out =3D=3D I2C_HS_MODE_FREQ) { + gi2c->is_hs_mode =3D true; + /* For HS mode, source clock should be 100 MHz */ + itr =3D geni_i2c_clk_map_100mhz; + /* For HS mode, start with 1MHz for master code */ + gi2c->clk_fld =3D &itr[2]; + return 0; + } + + gi2c->is_hs_mode =3D false; + if (clk_get_rate(gi2c->se.clk) =3D=3D 32 * HZ_PER_MHZ) itr =3D geni_i2c_clk_map_32mhz; else @@ -219,7 +262,12 @@ static int qcom_geni_i2c_conf(struct geni_se *se, unsi= gned long freq) const struct geni_i2c_clk_fld *itr =3D gi2c->clk_fld; u32 val; =20 - writel_relaxed(0, gi2c->se.base + SE_GENI_CLK_SEL); + if (gi2c->is_hs_mode) { + writel_relaxed(I2C_HS_TCYCLE_CNT, gi2c->se.base + SE_I2C_HS_TCYCLE_REG); + writel_relaxed(I2C_HS_TLOW_CNT, gi2c->se.base + SE_I2C_HS_TLOW_REG); + } + + writel_relaxed(gi2c->dfs_index, gi2c->se.base + SE_GENI_CLK_SEL); =20 val =3D (itr->clk_div << CLK_DIV_SHFT) | SER_CLK_EN; writel_relaxed(val, gi2c->se.base + GENI_SER_M_CLK_CFG); @@ -500,7 +548,11 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi= 2c, struct i2c_msg *msg, geni_se_select_mode(se, GENI_SE_FIFO); =20 writel_relaxed(len, se->base + SE_I2C_RX_TRANS_LEN); - geni_se_setup_m_cmd(se, I2C_READ, m_param); + + if (gi2c->is_hs_mode) + geni_se_setup_m_cmd(se, I2C_HS_READ, m_param); + else + geni_se_setup_m_cmd(se, I2C_READ, m_param); =20 if (dma_buf && geni_se_rx_dma_prep(se, dma_buf, len, &rx_dma)) { geni_se_select_mode(se, GENI_SE_FIFO); @@ -539,7 +591,11 @@ static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi= 2c, struct i2c_msg *msg, geni_se_select_mode(se, GENI_SE_FIFO); =20 writel_relaxed(len, se->base + SE_I2C_TX_TRANS_LEN); - geni_se_setup_m_cmd(se, I2C_WRITE, m_param); + + if (gi2c->is_hs_mode) + geni_se_setup_m_cmd(se, I2C_HS_WRITE, m_param); + else + geni_se_setup_m_cmd(se, I2C_WRITE, m_param); =20 if (dma_buf && geni_se_tx_dma_prep(se, dma_buf, len, &tx_dma)) { geni_se_select_mode(se, GENI_SE_FIFO); @@ -700,7 +756,7 @@ static int geni_i2c_gpi(struct geni_i2c_dev *gi2c, stru= ct i2c_msg msgs[], goto out; } =20 - if (op =3D=3D I2C_WRITE) + if (op =3D=3D I2C_WRITE || op =3D=3D I2C_HS_WRITE) map_dirn =3D DMA_TO_DEVICE; else map_dirn =3D DMA_FROM_DEVICE; @@ -737,7 +793,7 @@ static int geni_i2c_gpi(struct geni_i2c_dev *gi2c, stru= ct i2c_msg msgs[], peripheral->set_config =3D 0; peripheral->multi_msg =3D true; =20 - if (op =3D=3D I2C_WRITE) + if (op =3D=3D I2C_WRITE || op =3D=3D I2C_HS_WRITE) dma_dirn =3D DMA_MEM_TO_DEV; else dma_dirn =3D DMA_DEV_TO_MEM; @@ -827,6 +883,7 @@ static int geni_i2c_gpi_xfer(struct geni_i2c_dev *gi2c,= struct i2c_msg msgs[], i peripheral.high_count =3D itr->t_high_cnt; peripheral.low_count =3D itr->t_low_cnt; peripheral.clk_div =3D itr->clk_div; + peripheral.clk_src =3D gi2c->dfs_index; peripheral.set_config =3D 1; peripheral.multi_msg =3D false; =20 @@ -836,6 +893,13 @@ static int geni_i2c_gpi_xfer(struct geni_i2c_dev *gi2c= , struct i2c_msg msgs[], i =20 gi2c->num_msgs =3D num; gi2c->is_tx_multi_desc_xfer =3D false; + gi2c->config1_sent =3D false; + + /* Initialize config1 TRE settings for HS mode */ + if (gi2c->is_hs_mode) { + peripheral.config1.tcycle_cnt =3D I2C_HS_TCYCLE_CNT; + peripheral.config1.tlow_cnt =3D I2C_HS_TLOW_CNT; + } =20 tx_multi_xfer =3D &gi2c->i2c_multi_desc_config; memset(tx_multi_xfer, 0, sizeof(struct geni_i2c_gpi_multi_desc_xfer)); @@ -883,14 +947,25 @@ static int geni_i2c_gpi_xfer(struct geni_i2c_dev *gi2= c, struct i2c_msg msgs[], i if (i > 0 && (!(msgs[i].flags & I2C_M_RD))) peripheral.multi_msg =3D false; =20 - ret =3D geni_i2c_gpi(gi2c, msgs, &config, - &tx_addr, &tx_buf, I2C_WRITE, gi2c->tx_c); + /* Set config1 TRE only for HS mode */ + if (gi2c->is_hs_mode && !gi2c->config1_sent) { + peripheral.set_config1 =3D 1; + gi2c->config1_sent =3D true; + } else { + peripheral.set_config1 =3D 0; + } + + ret =3D geni_i2c_gpi(gi2c, msgs, &config, &tx_addr, &tx_buf, + gi2c->is_hs_mode ? I2C_HS_WRITE : I2C_WRITE, gi2c->tx_c); if (ret) goto err; =20 + /* CONFIG1 TRE is only for the TX channel; clear before RX call */ + peripheral.set_config1 =3D 0; + if (msgs[i].flags & I2C_M_RD) { - ret =3D geni_i2c_gpi(gi2c, msgs, &config, - &rx_addr, &rx_buf, I2C_READ, gi2c->rx_c); + ret =3D geni_i2c_gpi(gi2c, msgs, &config, &rx_addr, &rx_buf, + gi2c->is_hs_mode ? I2C_HS_READ : I2C_READ, gi2c->rx_c); if (ret) goto err; =20 @@ -1037,6 +1112,7 @@ static int setup_gpi_dma(struct geni_i2c_dev *gi2c) static int geni_i2c_init(struct geni_i2c_dev *gi2c) { u32 proto, tx_depth; + unsigned long freq_out; bool fifo_disable; int ret; =20 @@ -1046,6 +1122,39 @@ static int geni_i2c_init(struct geni_i2c_dev *gi2c) return ret; } =20 + /* + * For I2C High-Speed mode, first verify QUP HW version supports it + * (requires QUPv3 core >=3D 4.3 per HPG), then configure 100 MHz source = clock. + */ + if (gi2c->is_hs_mode) { + u32 hw_ver =3D geni_se_get_qup_hw_version(&gi2c->se); + u32 major =3D GENI_SE_VERSION_MAJOR(hw_ver); + u32 minor =3D GENI_SE_VERSION_MINOR(hw_ver); + + if (major < QUP_I2C_HS_MIN_MAJOR || + (major =3D=3D QUP_I2C_HS_MIN_MAJOR && minor < QUP_I2C_HS_MIN_MINOR))= { + dev_err(gi2c->se.dev, + "QUP HW v%u.%u does not support I2C HS mode (requires >=3D %u.%u)\n", + major, minor, + QUP_I2C_HS_MIN_MAJOR, QUP_I2C_HS_MIN_MINOR); + ret =3D -EOPNOTSUPP; + goto err; + } + + ret =3D geni_se_clk_freq_match(&gi2c->se, I2C_HS_SRC_CLK_FREQ, + &gi2c->dfs_index, &freq_out, false); + if (ret) { + dev_err(gi2c->se.dev, "Failed to get DFS index for HS mode: %d\n", ret); + goto err; + } + + ret =3D clk_set_rate(gi2c->se.clk, freq_out); + if (ret) { + dev_err(gi2c->se.dev, "Failed to set HS mode clock rate: %d\n", ret); + goto err; + } + } + proto =3D geni_se_read_proto(&gi2c->se); if (proto =3D=3D GENI_SE_INVALID_PROTO) { ret =3D geni_load_se_firmware(&gi2c->se, GENI_SE_I2C); --=20 2.34.1