Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp30465708rwd; Thu, 6 Jul 2023 06:24:10 -0700 (PDT) X-Google-Smtp-Source: APBJJlFJOl2eVRl4qDavagLOSbh30H5TCvCgldUOQ+s5WHmcA41bYK/xziCYRIPrJyST3OKaSL1g X-Received: by 2002:a05:6a20:b284:b0:12f:1f3e:a5bb with SMTP id ei4-20020a056a20b28400b0012f1f3ea5bbmr1335794pzb.32.1688649850541; Thu, 06 Jul 2023 06:24:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1688649850; cv=none; d=google.com; s=arc-20160816; b=g7V6wv5Zxnf9phuwRhryaqXy9WceLz5uzmiMtgaQYYhTAxtnlCpxB3zT9iNfYY9rkk 5ZprxkaRki8Fvn362NQfcaTQsapyoobFxEgknbKELMrg/Nk40ITmvs03Ms+AcVmUKP0Q WMACTSrLjtnrPQPyD5z+lsMKokbXmvYf9caBo7s7kikjKi3ivI2G8xlXsgte0v69nVhq zDt3Y3ps9fPJb91GjeaAcvHpqOwYnJ9sVU9yltxu+Ej8lQt8nj79fafqOWjse24LZ58P N7t0dx7FVMp810S8MGImnPfPV2TDVqwPiOcTllvt9I2YIp4oACl7F8Zs0V7TBdsu5cHG Ilow== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=7Apw43uWwus5sfXTw/1lTZRrHpImHMcKjbYLJ91bwPI=; fh=ZTBFHTjtM0ZkKvVnVpVXafRtX5PGbw2mGsfC+nd8pa0=; b=MjlgVhDT9hig9adR42MleRxRxqZRTJ0MgOs74ICDcOXOTt5J086kDiaSh/PkroIG6E uoGw1AZTrilARH/4hnaPEuzEanZdJluS1y9EZ5xeODZBTc/2ng+aYB2086QPFt20jEvg vmlm1jyLKd8RJmGTsNd/93Kg9CCKeNjRQwtzqQt/rHqIiQ56GMxzt+lpjFK6i3PTXrYm eKNy+As+TcoC4w+i4pvvmVUDsl8mI1P9Mjm6rQrFRbJMQlhE3+baCYPX1rXMsweLz2uI yckxWSMjID+OtuaRippcDUS3Ccmt0aG8lPa9o1oGiYxv8l6AJaULb3SDFz1GYKbwp9a1 cfpg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id w30-20020a63475e000000b0053eee173733si1441087pgk.227.2023.07.06.06.23.56; Thu, 06 Jul 2023 06:24:10 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229748AbjGFM6L (ORCPT + 99 others); Thu, 6 Jul 2023 08:58:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58942 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229490AbjGFM6K (ORCPT ); Thu, 6 Jul 2023 08:58:10 -0400 Received: from unicorn.mansr.com (unicorn.mansr.com [81.2.72.234]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BC5F01994; Thu, 6 Jul 2023 05:58:07 -0700 (PDT) Received: from raven.mansr.com (raven.mansr.com [IPv6:2001:8b0:ca0d:1::3]) by unicorn.mansr.com (Postfix) with ESMTPS id DE08515360; Thu, 6 Jul 2023 13:58:03 +0100 (BST) Received: by raven.mansr.com (Postfix, from userid 51770) id CF8DB219FC1; Thu, 6 Jul 2023 13:58:03 +0100 (BST) From: Mans Rullgard To: Oleksij Rempel , Pengutronix Kernel Team Cc: Andi Shyti , Shawn Guo , Sascha Hauer , Fabio Estevam , NXP Linux Team , linux-i2c@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH] i2c: imx: add support for I2C_M_STOP flag Date: Thu, 6 Jul 2023 13:57:29 +0100 Message-ID: <20230706125729.17335-1-mans@mansr.com> X-Mailer: git-send-email 2.41.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,SPF_HELO_PASS, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add support for the I2C_M_STOP flag to the i2c-imx driver. This allows devices requiring a stop between messages to work with this controller. Signed-off-by: Mans Rullgard --- drivers/i2c/busses/i2c-imx.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c index 42189a5f2905..f59d086688ff 100644 --- a/drivers/i2c/busses/i2c-imx.c +++ b/drivers/i2c/busses/i2c-imx.c @@ -1262,10 +1262,17 @@ static int i2c_imx_xfer_common(struct i2c_adapter *adapter, /* read/write data */ for (i = 0; i < num; i++) { - if (i == num - 1) - is_lastmsg = true; + if (is_lastmsg) { + /* previous message had I2C_M_STOP flag set */ + temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR); + temp |= I2CR_MSTA; + imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR); + result = i2c_imx_bus_busy(i2c_imx, 1, atomic); + if (result) + goto fail0; + } - if (i) { + if (i && !is_lastmsg) { dev_dbg(&i2c_imx->adapter.dev, "<%s> repeated start\n", __func__); temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR); @@ -1275,6 +1282,10 @@ static int i2c_imx_xfer_common(struct i2c_adapter *adapter, if (result) goto fail0; } + + if (i == num - 1 || (msgs[i].flags & I2C_M_STOP)) + is_lastmsg = true; + dev_dbg(&i2c_imx->adapter.dev, "<%s> transfer message: %d\n", __func__, i); /* write/read data */ @@ -1304,6 +1315,13 @@ static int i2c_imx_xfer_common(struct i2c_adapter *adapter, result = i2c_imx_dma_write(i2c_imx, &msgs[i]); else result = i2c_imx_write(i2c_imx, &msgs[i], atomic); + + if (msgs[i].flags & I2C_M_STOP) { + temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR); + temp &= ~I2CR_MSTA; + imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR); + i2c_imx_bus_busy(i2c_imx, 0, atomic); + } } if (result) goto fail0; @@ -1425,7 +1443,7 @@ static int i2c_imx_init_recovery_info(struct imx_i2c_struct *i2c_imx, static u32 i2c_imx_func(struct i2c_adapter *adapter) { - return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL + return I2C_FUNC_I2C | I2C_FUNC_PROTOCOL_MANGLING | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_SMBUS_READ_BLOCK_DATA; } -- 2.41.0