From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.5 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,URIBL_BLOCKED, USER_AGENT_SANE_2 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5A346C433E0 for ; Tue, 30 Jun 2020 07:34:00 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2489E20759 for ; Tue, 30 Jun 2020 07:34:00 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="j0PRvbOz"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="GCeFcF1V" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2489E20759 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Date:To:From: Subject:Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=IclyH2WmNcQwGudOYJIhinTEO/bDhRyW3Mb8o+2puVs=; b=j0PRvbOzlJi4bnVh75BWy5NFo XXxLwgvFarFm8Lg1avLo80cC71IFcRLKrYWiTDOmVrODxS0YTWRhcSRLRyRe3nq6XGjk2Siegptb2 Plt0DzMCjvMyLtWyZ+BCd5gw1kaNM7lLA2GVlaP2mjyZCs9KqnaV3/NeVFfFt/sRDbweK6x1hbPUk +SWh6vYTBsq1Jw9EERKdtUpMOvYq2ZdTqqUBsaUs80CdXT/FGc+fl7WlrYxN5IgfuRTm4Y/GijYAE U1eUa9RptHXnUjs2OtqmbyqoQj3ZvBYmUazHDY6cqNF/4/AWs+0N0c6GlFQlAv6aozIBncQLQxvXg tanVMqZlQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jqAm6-0007Zf-Vu; Tue, 30 Jun 2020 07:33:51 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jqAm4-0007Xl-9l; Tue, 30 Jun 2020 07:33:49 +0000 X-UUID: 4dd15085197645909469e2f9d330f468-20200629 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=g16KvrnbD399itfp7Gu6dbRkAnFVoPytjIcdXi66ePg=; b=GCeFcF1VM+46UVRBsznlnmz9AIn6xS0y/8ME5GK6bAmFktvB7BAWUBGgJjuXT3w20HWeUUsAiAzBUFemSGm9fv7jOlM9oIaQh7Byqt+zgGEYFn4P8s818+USqWByVDOy+XyFWlsxBRFEFXdSXqxqHp8oiQqng6bWHwi06EUMqDM=; X-UUID: 4dd15085197645909469e2f9d330f468-20200629 Received: from mtkcas68.mediatek.inc [(172.29.94.19)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 1161993647; Mon, 29 Jun 2020 23:33:33 -0800 Received: from MTKMBS07N2.mediatek.inc (172.21.101.141) by MTKMBS62N1.mediatek.inc (172.29.193.41) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 30 Jun 2020 00:33:38 -0700 Received: from MTKCAS06.mediatek.inc (172.21.101.30) by mtkmbs07n2.mediatek.inc (172.21.101.141) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 30 Jun 2020 15:33:37 +0800 Received: from [172.21.77.4] (172.21.77.4) by MTKCAS06.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 30 Jun 2020 15:33:39 +0800 Message-ID: <1593502419.29073.7.camel@mtksdaap41> Subject: Re: [PATCH] i2c: mediatek: Add to support continuous mode From: Yingjoe Chen To: Qiangming Xia Date: Tue, 30 Jun 2020 15:33:39 +0800 In-Reply-To: <20200623074245.24513-1-qiangming.xia@mediatek.com> References: <20200623074245.24513-1-qiangming.xia@mediatek.com> X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-MTK: N X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree@vger.kernel.org, srv_heupstream@mediatek.com, wsa@the-dreams.de, linux-kernel@vger.kernel.org, Wolfram Sang , Qii Wang , linux-i2c@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org Hi Qiangming, When you send new version, you should - Add version number in subject, so we know this is a new one. - List what's changed in this patch after ---, so reviewer knows where we should check. On Tue, 2020-06-23 at 15:42 +0800, Qiangming Xia wrote: > From: "qiangming.xia" > > Mediatek i2c controller support for continuous mode, > it allow to transfer once multiple writing messages of equal > length. > A i2c slave sometimes need write a serial of non-continuous > offset range in chip,e.g. camera sensor imx586,imx576. It need > transfer 294 writing messages when initiate setting. It can use > this mode to improve performance. > > Change-Id: If473d96d2b76e9d51f20741a9380db4fcad15dbd Remove this. > Signed-off-by: Qiangming Xia > --- > drivers/i2c/busses/i2c-mt65xx.c | 66 +++++++++++++++++++++++++++++++++ > 1 file changed, 66 insertions(+) > > diff --git a/drivers/i2c/busses/i2c-mt65xx.c b/drivers/i2c/busses/i2c-mt65xx.c > index deef69e56906..108bca1a4042 100644 > --- a/drivers/i2c/busses/i2c-mt65xx.c > +++ b/drivers/i2c/busses/i2c-mt65xx.c > @@ -97,6 +97,7 @@ enum mtk_trans_op { > I2C_MASTER_WR = 1, > I2C_MASTER_RD, > I2C_MASTER_WRRD, > + I2C_MASTER_CONTINUOUS_WR, > }; > > enum I2C_REGS_OFFSET { > @@ -846,6 +847,9 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs, > OFFSET_TRANSFER_LEN); > } > mtk_i2c_writew(i2c, I2C_WRRD_TRANAC_VALUE, OFFSET_TRANSAC_LEN); > + } else if (i2c->op == I2C_MASTER_CONTINUOUS_WR) { > + mtk_i2c_writew(i2c, msgs->len / num, OFFSET_TRANSFER_LEN); > + mtk_i2c_writew(i2c, num, OFFSET_TRANSAC_LEN); > } else { > mtk_i2c_writew(i2c, msgs->len, OFFSET_TRANSFER_LEN); > mtk_i2c_writew(i2c, num, OFFSET_TRANSAC_LEN); > @@ -896,6 +900,23 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs, > writel(reg_4g_mode, i2c->pdmabase + OFFSET_TX_4G_MODE); > } > > + writel((u32)wpaddr, i2c->pdmabase + OFFSET_TX_MEM_ADDR); > + writel(msgs->len, i2c->pdmabase + OFFSET_TX_LEN); > + } else if (i2c->op == I2C_MASTER_CONTINUOUS_WR) { > + writel(I2C_DMA_INT_FLAG_NONE, i2c->pdmabase + OFFSET_INT_FLAG); > + writel(I2C_DMA_CON_TX, i2c->pdmabase + OFFSET_CON); > + wpaddr = dma_map_single(i2c->dev, msgs->buf, > + msgs->len, DMA_TO_DEVICE); > + if (dma_mapping_error(i2c->dev, wpaddr)) { > + kfree(msgs->buf); > + return -ENOMEM; > + } > + > + if (i2c->dev_comp->support_33bits) { > + reg_4g_mode = mtk_i2c_set_4g_mode(wpaddr); > + writel(reg_4g_mode, i2c->pdmabase + OFFSET_TX_4G_MODE); > + } > + > writel((u32)wpaddr, i2c->pdmabase + OFFSET_TX_MEM_ADDR); > writel(msgs->len, i2c->pdmabase + OFFSET_TX_LEN); > } else { > @@ -979,6 +1000,11 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs, > msgs->len, DMA_FROM_DEVICE); > > i2c_put_dma_safe_msg_buf(dma_rd_buf, msgs, true); > + } else if (i2c->op == I2C_MASTER_CONTINUOUS_WR) { > + dma_unmap_single(i2c->dev, wpaddr, > + msgs->len, DMA_TO_DEVICE); > + > + kfree(msgs->buf); > } else { > dma_unmap_single(i2c->dev, wpaddr, msgs->len, > DMA_TO_DEVICE); > @@ -1009,6 +1035,9 @@ static int mtk_i2c_transfer(struct i2c_adapter *adap, > { > int ret; > int left_num = num; > + int i, j; > + u8 *dma_multi_wr_buf; > + struct i2c_msg multi_msg[1]; > struct mtk_i2c *i2c = i2c_get_adapdata(adap); > > ret = mtk_i2c_clock_enable(i2c); > @@ -1025,6 +1054,43 @@ static int mtk_i2c_transfer(struct i2c_adapter *adap, > } > } > > + if (num > 1 && !(msgs[0].flags & I2C_M_RD)) { > + for (i = 0; i < num - 1; i++) { > + if (!(msgs[i+1].flags & I2C_M_RD) && > + (msgs[i].addr == msgs[i+1].addr) > + && (msgs[i].len == msgs[i+1].len)) { > + continue; Don't need () for addr/len check. When wrap, please put operator at end of previous line. The 2nd line of if is at the same indent level with continue, that doesn't look good. Let's use 4 spaces as indent for addr and len check, so this should be: if (num > 1 && !(msgs[0].flags & I2C_M_RD)) { for (i = 0; i < num - 1; i++) { if (!(msgs[i+1].flags & I2C_M_RD) && msgs[i].addr == msgs[i+1].addr && msgs[i].len == msgs[i+1].len) { Joe.C _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek