From nobody Fri Sep 25 12:38:02 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 5720247F2C2 for ; Sat, 12 Sep 2026 13:05: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=1789218303; cv=none; b=GeDviEnNSWHNZGUtBU3wGo1Ihr4YQdUWNVaZjEdRfzQLG9FquBjScQLPu8slnSQD2yMtwsA3/lS8u0S0uCWXwLvXVbjtyZl5E6+Boqk7pYe+aTsPN08exwU83gcX3gy/kNp04HOK+3NqdV5ty5VHuvMlkgjZxwuYzhP/b9b4BkI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789218303; c=relaxed/simple; bh=wyw1WqsiNFGKoo42wz77AWZNLZL4lodVAHqdQSR+w2U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Nf+6NtxC8ONF5dO7xCGrlRtzzSRLfbLpgl6pbnYmNWeo7l0d89rWoU2y3R16urruaHiPZtv70Ft+GZVK/X/qAuI4u6IJvpLWWOEFFtEONk++TAK5parfbce2gX2iBs1RN4aZH735qH0vilShEgOrVq8pciLEdvH3cbzio1SbpRw= 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=cCqEHrHI; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=AZVwVY9y; 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="cCqEHrHI"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="AZVwVY9y" Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68CBe2Xt2780858 for ; Sat, 12 Sep 2026 13:04:59 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= SSh8gFqeHXIIjFJPAXzKIU1K8Q/Grp6yUgkciIM+fPo=; b=cCqEHrHIAuv458Zp VvX/ApBPIa2MsTuaoXWNuCvbKC3XXaq+hVWdxAstTvglo0v82Ux0/LUZHQwQG8VT Bajbxv7L9WnlgekMS+9nmnicLQlcrGLMbjPrJjRc+CBC+PalBS/IIoyXfbDtSnbZ LsSD4NC02fm1lt11U1Qg/ic3yqRtk2SNIEPHDFZDkhuYWdY0N3Twqi9w8zSuCmtA xq+lcSfu19mkie4pc6z8FYa2YL5QYNkyT12BzwGBwXrTlc/ppgqAeNPFBvWvCEci NoPqDXSrXHD0XU0BFlrvD7snK0GFIJi7d9FQhCwYe9xV3YXT3ORFROEGEdy85Nd6 d7r/xA== 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 4gmy9d8yk7-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sat, 12 Sep 2026 13:04:59 +0000 (GMT) Received: by mail-pj1-f69.google.com with SMTP id 98e67ed59e1d1-3823dcc1647so2485816a91.3 for ; Sat, 12 Sep 2026 06:04:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789218299; x=1789823099; 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=SSh8gFqeHXIIjFJPAXzKIU1K8Q/Grp6yUgkciIM+fPo=; b=AZVwVY9yHMdXuVSStWu5la5cq4So5/t+WFlt1/M7Z3pBsc6vzSEgjz/IJTaia9VuJT IRDk58gmiOoVTrv42n2INBRC170/1toUbl5g6Q5ynwSjjDoKX/ORYB2rIwAAXKMVb6h7 Y4suppALd8r8iazoSoIHL2VC5QzLfW1QHmKOvBswdNBdtt+YifFRKfnNJNkuqWapywaI fEay2maQKiEq2RyohXVpTDSE8HXSoye7xZdO5blAAQWUmhRHlhE5m/Vp+U+DmoVI+PfR MBc0+VmStuLq/KQwybTfU8ui3uVdjXbsuWoaF3P5WOqJSP1ymBURko26Fr+1h/LdBkH6 +xIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789218299; x=1789823099; 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=SSh8gFqeHXIIjFJPAXzKIU1K8Q/Grp6yUgkciIM+fPo=; b=r3WwUhK2dbVCKDkqNAD4AtLiwwlHE9F7GyXJAZ/mWPmkNVVLqTJq5iY+2+2qyzzCHs FvbGD89OU1uYSuEVV5NFHSG47sScQkHrraWiR2KcxI9um+in6Th4a0JdI4WKjSYuqNXt ARjsWlg5qh+F521dNLUegVp+Isw0JDjAEEC2eMvDwuvJbFrMYugLObU8jsNdAVybN2lV uU6e4VgC8QHAYbIxHhDpHyLSJoHwqhUW4WHNC9+N/fuLkP7OFhL3bLS417V4SQzwzGSW xzw3C0ztGTvMLha+03+0AbpTQN08lMzcIDDMbKrVU2KczR29yCR9YOVpd2jwYFbH4SbV XuFA== X-Forwarded-Encrypted: i=1; AKwUvBxjc8A3+JVSLiVkv/HQlrHxgXSCndCSM6sqqGvkivHqyJQqcFwd+rDiim8knyH3D0gLErmKtzRzJ+WIH/Y=@vger.kernel.org X-Gm-Message-State: AFuF++lQclbQpejvvbzz02Vg3bWQOuqKqNQ7UZfuZCSoumZP4ToDGDKs ANXzi/+7iIphGwV7i8xu5yfkmmDHEcPIB8qy0BtJ3Xo+sqfhJAO9wAZMUwYgq1EvoK5eVjo516F 36epwL/MndRCOdaYpbvoDTKS/5nwqfHnv141nFcrMwV30ef/yUlKoCq+M5hKhMW3V7OE= X-Gm-Gg: AYBFou1UkOA12mqFIClnj4EHjt2EMGQxMi2wsp1Y/cqSARY/0vQzqQsESy5EsQJmbZV Wo5O1SHjD7PPC5i7NcWtIzPvtJD8/pS6TZx1BsCqdDAdolYw6n1VUa0er4RcedL49JqkoizoPxI 5UL/2ZqLJXVxG4N5n6yt4FS3yLFvMyOy443Xxk56D/ve2snSrGHAD6cE6TrkrKeWL4VXDdpj3hz /uZrf5TcMHl7Xy5gT6H/hQEeaAh4aEfihcIzwtxg667ZabwQ0ZtM50U9nXRRF0Vcydo3E+Avreu gWPSZ2VISDmsP2Ca2YsjmlemZF4nGrWVobfypYPYFYs9dzSmouGZ4DlhowswkYsBj0bWXjMcvgS drc0kmGgZmXZf5svGCL0Fddnrf+7HUvaXsnk= X-Received: by 2002:a17:90b:51c3:b0:398:9bd5:490d with SMTP id 98e67ed59e1d1-39dbc6ed4b1mr4957425a91.20.1789218298587; Sat, 12 Sep 2026 06:04:58 -0700 (PDT) X-Received: by 2002:a17:90b:51c3:b0:398:9bd5:490d with SMTP id 98e67ed59e1d1-39dbc6ed4b1mr4957403a91.20.1789218298123; Sat, 12 Sep 2026 06:04:58 -0700 (PDT) Received: from hu-jseerapu-hyd.qualcomm.com ([202.46.22.19]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-33ba4f1e434sm13665036eec.22.2026.09.12.06.04.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 12 Sep 2026 06:04:57 -0700 (PDT) From: Jyothi Kumar Seerapu Date: Sat, 12 Sep 2026 18:34:22 +0530 Subject: [PATCH v2 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: <20260912-i2c-hs-v2-1-b0901791e244@oss.qualcomm.com> References: <20260912-i2c-hs-v2-0-b0901791e244@oss.qualcomm.com> In-Reply-To: <20260912-i2c-hs-v2-0-b0901791e244@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=1789218290; l=6772; i=jyothi.seerapu@oss.qualcomm.com; h=from:subject:message-id; bh=wyw1WqsiNFGKoo42wz77AWZNLZL4lodVAHqdQSR+w2U=; b=QZsYJKPUtKBBZIOhyUlWeQfDtdu06FuOAoUiFNstXty+oOI7HrnlzcCsDQIgGODNCnGBS0lEk KoeMaYeBNu4BQ3gK83h1ZUQooRhNRhoZ+rnm3IDaPQXH1dSRq/2Q1Gi X-Developer-Key: i=jyothi.seerapu@oss.qualcomm.com; a=ed25519; pk=9vafyYsia0OnBKWSEwhmWe3hPVQfI2T1xOs5dPaFvEo= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEyMDE4OSBTYWx0ZWRfX5MmlzeMI1G3d SRmyQ31CycYywDyF9p98wd2T7We/yDdcWWfkvNVcn0q1L8SgT5rxlpAB0MxudYdEbxqrl8WRp6/ rMgS2FgY6VGrh9vTpP2YmMnpKAY7pTBnHhF4FzZKr2QKi9YFuxsPfKJCIRQ1e833J5ybtYoXuHl PBmLxv5Gfq94pWgl7hAtg6hij1/CavsOa4CvhMV/0TXsX+UmMZg6rQkMNT2xmIilFCtUnz5bepa HBLbJ4Erns7LVc/sRcW67WSVNE1/SMqi87VcAdECeqHxaGHN1epOADBQvI66d+x1mkVd+LUVOnN 1WOvQ3Q0E5m4JkUL60XV2Z+60FuPNaYQtIsCeMEPNV4XNnyWny4vKARCCzANiFClhHfVOGe+S2c gIN5Xq4wrj5iIAO4ugUpsn+mRqaWdRhkLm3GeGt876kseZZpC+LN86Gty5CIR/zI3eGrix8AAjU oI2IzF8+SA9uRH1MT9A== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEyMDE4OSBTYWx0ZWRfX0plm51bT+d2o woWpBnRhobGbeoHf+DPt+BQ8rzywwibREhmEYRbeQybO6ihjLieOonKQH4E03+FJt2i/8kyWh0Q FXZgCzjVpDr9PBmLZ+0hrGKMUxLMO3c= X-Proofpoint-GUID: 4MGOQ_axLNd9CeSYdeI12fZqgekqmyuQ X-Authority-Analysis: v=2.4 cv=OeUNnRTY c=1 sm=1 tr=0 ts=6aa54dfb cx=c_pps a=vVfyC5vLCtgYJKYeQD43oA==:117 a=fChuTYTh2wq5r3m49p7fHw==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=ZpdpYltYx_vBUK5n70dp:22 a=EUspDBNiAAAA:8 a=8yvkWvxPp_QYhSqoyPwA:9 a=QEXdDO2ut3YA:10 a=rl5im9kqc5Lf4LNbBjHf:22 X-Proofpoint-ORIG-GUID: 4MGOQ_axLNd9CeSYdeI12fZqgekqmyuQ 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-09-12_04,2026-09-11_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 priorityscore=1501 suspectscore=0 impostorscore=0 adultscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609120189 Add support in the Qualcomm GPI (Generic Packet Interface) DMA engine for I2C High-Speed (HS) mode transfers Introduce support for CONFIG1 Transfer Ring Element (TRE) to convey HS-specific timing parameters to the Qualcomm GPI DMA engine. 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 | 56 +++++++++++++++++++++++++++++++++++-= ---- include/linux/dma/qcom-gpi-dma.h | 28 +++++++++++++++++++- 2 files changed, 76 insertions(+), 8 deletions(-) diff --git a/drivers/dma/qcom/gpi.c b/drivers/dma/qcom/gpi.c index a5055a6273af..835021a9b7ed 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 */ @@ -518,7 +524,7 @@ struct gpii { bool ieob_set; }; =20 -#define MAX_TRE 3 +#define MAX_TRE 4 =20 struct gpi_desc { struct virt_dma_desc vd; @@ -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; + 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); + + /* Select HS-mode or standard I2C opcode */ 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..dda5f00660f9 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: source 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 Fri Sep 25 12:38:02 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 9C3D447DF89 for ; Sat, 12 Sep 2026 13:05:05 +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=1789218307; cv=none; b=In5PSvryoKU3Txg7c81jUq7B+bDIb469MabJO2Ao9L57GPsTmJIsW4N+YEDwiQBTRDSoMO6mlR8whP8JjNy4fwO4rw5nhVX1t5oUSoAWS0XOeooWM0MPyugtKUo9grmPhCTpVFEhtR5SI0Hw7G2h0/T6XS37m5J3ZtuDhNfaTWA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789218307; c=relaxed/simple; bh=79Fr5OwJj3rXBZztb4Irukv1fBUVIxftWbDY0TgTFr0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cn9WfejGaXG4ic1x+6zPzsEDM8ry39f7FyRkpS/BlpAbNhEzjNxGurSBMG2ne4ztTd10eO/QKmQtRXHCIlDTS16+0NHgpRCgtRPRTMktPH9PnBwa8UiXJhP8HuO/k70OByWYIVraKLEyRz7XdWwSegqvyHNr/xgFWZAXlPKYSdo= 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=QPU1O1TR; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=EyInj4ni; 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="QPU1O1TR"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="EyInj4ni" Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68CBdcDh2779792 for ; Sat, 12 Sep 2026 13:05:04 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= Q6iPIf53YQku72sisV18OVAO89sx7Fr8T67qn+OtB0Y=; b=QPU1O1TR8YP0bjnF uPBp79wgrYkEvQaQrRoxZMAIFfpSbj7+PhoE4qz6kervXCdbVMTdvoqk0777R4RL 6xiwhxexcUZZOsFNnBAkRI/o+/svCV4yIWzetUBucSadAa6nCcsPPJt3fGnc/EZT MxqvvqGRvQ94h1itW6KI8CbjpqGZGt9kRyO0ZYhLoPdpsIU/j73rIsh2jx3uqded qWo4NmWJSbP3U2vtQEwRyjUvGFcUjSG2oMss4VXMPAkq4LTREti4Xnh3dWa3cW3O 8u7GgziP9DpkJJJHNvHVnmhVo5NASD5mRXfBmnPy/gnFy3jZ/6uv6/R99QLp+Xt1 smaqBA== 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 4gmy9d8ykc-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sat, 12 Sep 2026 13:05:03 +0000 (GMT) Received: by mail-pj1-f69.google.com with SMTP id 98e67ed59e1d1-396b9ef3070so3238839a91.3 for ; Sat, 12 Sep 2026 06:05:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789218303; x=1789823103; 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=Q6iPIf53YQku72sisV18OVAO89sx7Fr8T67qn+OtB0Y=; b=EyInj4niBMB8gc2wT6mDtdrAqiYGiWOhqRDOshXsWbkveLdWJJBwRyYSOX+QvJ/kEd 6fLg25CKQae4uneT97Dc5WgDaPdWJLhWOriIh0asqI2KPAVqpaGKMo4+jkK1V/niBng7 0nfJpSrxsSPDAScwz6uf6a/yz8DODbAgrvjXPbXahG69rXzgLlvoEMYbDwp5n5KaKTy5 bnVrzyG/4eGVkYxWTCvFucuelzFr/V918pw0gxf5fLs6RvMwAfKgl6R9zrQNy/sFROEo xbf0jBPR0TyAu4Yaob2WEkSq5fChV4Uk6FbMZOpuw/3WazaQpAay/oKv3MA7UNi7R146 i9PQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789218303; x=1789823103; 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=Q6iPIf53YQku72sisV18OVAO89sx7Fr8T67qn+OtB0Y=; b=IMdl5TRALBnwUmrvhYNymSWXLJdjPS8iQwiFHJ0yAY0m0DkrDvW8EctLaIDjpzrD15 pwKLCLMYvd2oIj70KKhPkh3bRXLFqp1kClGgVc/Shq2BORV+Q09LYbbN1ybqFlmSgM3U 5lqZDSuc+vcOTPyK1O3JAKPV0pcn2QhJIoOK1xwtJC7yqZs7aA0eI4flydTG4/3AzTak rmW15CzexFWfGMdwbhdsjirTf+1faG3I9hOMb9NvF3C6Fz3th10nezYpgoUFeCejRYsv gvWmFovqsTt9lsRR/eg14s0Hm6DT0ndEluRyDgeFTIlN+Cxwocl0f5OR3ejyfpfnQdQY 6ZxQ== X-Forwarded-Encrypted: i=1; AKwUvByO8SNxAuymrwg/Mq0q4Pi/IMwPX1YmVjEVu4elFxxHC3TtqdnI+oDIge+5G5VNg2M72Mq2C/RXqWuz+Q4=@vger.kernel.org X-Gm-Message-State: AFuF++klEiulSifzornPRENlFeIRsM2cISWWNZ3pFdD/+NRfd6Tv+udM RIh2vBnTy77+NB7m9BlmJBDXtesQGgQaZcu6cgUwGUqoa8ZzyUXkvdcAqO8RTpQ0k4SxX3mMelh baTgfHPcAdEgfWZ9I7J3x6xjKiX8vy8F0OBbQXbJdIRXHpHIQcanI8zzoexEKG6Ctbdw= X-Gm-Gg: AYBFou0WbbYtLnKTgKh9vyE0v2t+DfRqByIOno9Wv241NtaaXm8hNfen3muYnupL+V7 2zXLgN8kYOI0rCFyul28ArBL26KRPEM9BFNRUswo7gOkAZfovapzXiCwUJMUMBcPioFJvRIH7oz ksR4m2OBAXFJQEHqFiqEFugt46yoRVpYnUL5XWuUOLM+suHXMDbqAuxacp3DqSXL42QdSgkvs3Q hR/eZRMB1i/qT7t8SpQGqo6cBSOrbjKiCnoMZgTYH1waGqLqGpiQEPhrdwAM4c0NEOAD/jlrNR6 MSIY5iuDSoFzSNcG+Gn1ymIChftaw0W0uI/tQu8R0KmrUWy1KsRIXYjuRREuX9nZBV/qIGMWq2S ZQt2WX1u795Z4RDF+bGoWkGXqT1UJp1vBZ6I= X-Received: by 2002:a17:90b:540d:b0:398:ba96:1afd with SMTP id 98e67ed59e1d1-39d9bee4822mr15258935a91.8.1789218302563; Sat, 12 Sep 2026 06:05:02 -0700 (PDT) X-Received: by 2002:a17:90b:540d:b0:398:ba96:1afd with SMTP id 98e67ed59e1d1-39d9bee4822mr15258873a91.8.1789218302058; Sat, 12 Sep 2026 06:05:02 -0700 (PDT) Received: from hu-jseerapu-hyd.qualcomm.com ([202.46.22.19]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-33ba4f1e434sm13665036eec.22.2026.09.12.06.04.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 12 Sep 2026 06:05:01 -0700 (PDT) From: Jyothi Kumar Seerapu Date: Sat, 12 Sep 2026 18:34:23 +0530 Subject: [PATCH v2 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: <20260912-i2c-hs-v2-2-b0901791e244@oss.qualcomm.com> References: <20260912-i2c-hs-v2-0-b0901791e244@oss.qualcomm.com> In-Reply-To: <20260912-i2c-hs-v2-0-b0901791e244@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=1789218290; l=9959; i=jyothi.seerapu@oss.qualcomm.com; h=from:subject:message-id; bh=79Fr5OwJj3rXBZztb4Irukv1fBUVIxftWbDY0TgTFr0=; b=5bH5F2JZ+Qn5sf6GDPcxFodFCLDd9mwLIxABbAtzWDu2oKoQD3I3LugWXwmUyrRbu7nbpAvqQ BzYzMRToK2xBN+1+Vkc28GTwVdRjOZ2wty66Xv7iYjeZrkywNSr1zJb X-Developer-Key: i=jyothi.seerapu@oss.qualcomm.com; a=ed25519; pk=9vafyYsia0OnBKWSEwhmWe3hPVQfI2T1xOs5dPaFvEo= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEyMDE4OSBTYWx0ZWRfX88RBclN3g93q elJhLa/Jq8k/poPmlzYC/L1roYv1okb9+j03HWgvPFoCV0SD15ksGJira8wlKfkdLig1I3ZwG45 sp7/8elsnRsz641+usU5hHKbSIkgqG/OmYTlo+IzVWJbUdVvOCtb1GHuRBqm78C1WXnw0a0nWHf moHF8An8Wz5XlnQwHG9xA98KC61EemGLdjsZv2nlH1C3RDn9NfvU2pTavnJGYsKGFed5yctgamn ouc6b6LrQuVxtF+Py7zC92UVMICQVKVnIyjlbaYvdTMkXh1ViPCD5hq0xoJRgdUx9Dw+oM5fSs9 cvZZWpWjlf/ez1fVNiZ1Q7ob/h0iZp/aK47p6dH5OIuU3e8F9OJbMqQt6DAZsvgsq521Ch4X/3Z iDo9qGuJ86zoP3rokw7wnB49jr3iwm/ihrv3toV40XyZC3mEeywGTxFwrYRvxseAamMboWtCaQe RzD3nFkyG1ZuSkptgXg== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEyMDE4OSBTYWx0ZWRfX4V/8uCHtl6XT 0Y4KRn0fFZIovvYq/6gHLz5/Ifb6byYKaJPUXaju3Owb5et+coXVcFvO3w9nFnf3rlMdFSWp6QS ZJlUP54y5ol5gi/a9hmLEQ6RlgBBUd8= X-Proofpoint-GUID: jHUUv5Y9-z2TZ3RGQSeYc1BLFZN6QYZT X-Authority-Analysis: v=2.4 cv=OeUNnRTY c=1 sm=1 tr=0 ts=6aa54dff cx=c_pps a=vVfyC5vLCtgYJKYeQD43oA==:117 a=fChuTYTh2wq5r3m49p7fHw==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=ZpdpYltYx_vBUK5n70dp:22 a=EUspDBNiAAAA:8 a=CVQZEhLW7cNm6rAVh1IA:9 a=QEXdDO2ut3YA:10 a=rl5im9kqc5Lf4LNbBjHf:22 X-Proofpoint-ORIG-GUID: jHUUv5Y9-z2TZ3RGQSeYc1BLFZN6QYZT 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-09-12_04,2026-09-11_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 priorityscore=1501 suspectscore=0 impostorscore=0 adultscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609120189 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 | 127 +++++++++++++++++++++++++++++++++= ---- 1 file changed, 113 insertions(+), 14 deletions(-) diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qc= om-geni.c index 658636c1ee0e..03c7bf95aec6 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,9 @@ 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; + u16 t_high_cnt; + u16 t_low_cnt; + u16 t_cycle_cnt; }; =20 /* @@ -194,10 +212,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 +257,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 +543,9 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2= c, 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); + + geni_se_setup_m_cmd(se, gi2c->is_hs_mode ? I2C_HS_READ : 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 +584,9 @@ static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2= c, 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); + + geni_se_setup_m_cmd(se, gi2c->is_hs_mode ? I2C_HS_WRITE : 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); @@ -689,7 +736,8 @@ static int geni_i2c_gpi(struct geni_i2c_dev *gi2c, stru= ct i2c_msg msgs[], * programming an extra TX DMA TRE that would cause an unintended * write cycle on the I2C bus before the actual read operation. */ - if (op =3D=3D I2C_WRITE && msgs[msg_idx].flags & I2C_M_RD) { + if ((op =3D=3D I2C_WRITE || op =3D=3D I2C_HS_WRITE) && + msgs[msg_idx].flags & I2C_M_RD) { peripheral->multi_msg =3D true; goto skip_tx_dma_map; } @@ -700,7 +748,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 +785,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; @@ -760,7 +808,8 @@ static int geni_i2c_gpi(struct geni_i2c_dev *gi2c, stru= ct i2c_msg msgs[], desc->callback_result =3D i2c_gpi_cb_result; desc->callback_param =3D gi2c; =20 - if (!((msgs[msg_idx].flags & I2C_M_RD) && op =3D=3D I2C_WRITE)) + if (!((msgs[msg_idx].flags & I2C_M_RD) && + (op =3D=3D I2C_WRITE || op =3D=3D I2C_HS_WRITE))) gi2c_gpi_xfer->msg_idx_cnt++; =20 cookie =3D dmaengine_submit(desc); @@ -827,6 +876,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 +886,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 +940,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 +1105,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 +1115,36 @@ static int geni_i2c_init(struct geni_i2c_dev *gi2c) return ret; } =20 + /* HS mode requires QUPv3 version >=3D 4.3 and source clock=3D100 MHz */ + 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