From patchwork Wed Sep 27 14:52:23 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kamlakant Patel X-Patchwork-Id: 819206 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-i2c-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=CAVIUMNETWORKS.onmicrosoft.com header.i=@CAVIUMNETWORKS.onmicrosoft.com header.b="RL1Rl3Sl"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3y2LQc2J6wz9tXs for ; Thu, 28 Sep 2017 00:52:40 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751929AbdI0Owi (ORCPT ); Wed, 27 Sep 2017 10:52:38 -0400 Received: from mail-sn1nam01on0064.outbound.protection.outlook.com ([104.47.32.64]:21856 "EHLO NAM01-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751907AbdI0Owg (ORCPT ); Wed, 27 Sep 2017 10:52:36 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=S0oM8xmhkfepSbsrK9crhxoZONv0q2YmgHWrKHkpx0o=; b=RL1Rl3Slb3wTBb3Q9PMVOBaLNYvAPZJzmL3SiKFKxQhbcE5/CbrdW7wu1smZQDIu+DJG4np6Kqp3rsx8F4cmF5RawT2SG9U/H9ygzUtrwv8Se1nXL3lf3WWyXMF6fhrFizBZnHad5dIJExItdS2+2IUQL9ZDHK3qwsanG/8ZBSE= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Kamlakant.Patel@cavium.com; Received: from kamlakant--T110-II.caveonetworks.com (111.93.218.67) by BN4PR07MB2129.namprd07.prod.outlook.com (10.164.63.11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.77.7; Wed, 27 Sep 2017 14:52:33 +0000 From: Kamlakant Patel To: linux-i2c@vger.kernel.org, linux-acpi@vger.kernel.org Cc: Kamlakant Patel , Wolfram Sang , Mika Westerberg , Jayachandran C Subject: [PATCH 3/3] i2c: xlp9xx: Handle I2C_M_RECV_LEN in msg->flags Date: Wed, 27 Sep 2017 20:22:23 +0530 Message-Id: <1506523943-8632-4-git-send-email-kamlakant.patel@cavium.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1506523943-8632-1-git-send-email-kamlakant.patel@cavium.com> References: <1506523943-8632-1-git-send-email-kamlakant.patel@cavium.com> MIME-Version: 1.0 X-Originating-IP: [111.93.218.67] X-ClientProxiedBy: BMXPR01CA0043.INDPRD01.PROD.OUTLOOK.COM (10.174.214.29) To BN4PR07MB2129.namprd07.prod.outlook.com (10.164.63.11) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 4fcadff2-dc98-4e63-7499-08d505b763c8 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254152)(2017052603199)(201703131423075)(201703031133081)(201702281549075); SRVR:BN4PR07MB2129; X-Microsoft-Exchange-Diagnostics: 1; BN4PR07MB2129; 3:0LcsAsTpOiFiRBr2hmtn7BqiEB2vCov6EuHnCbwoY8gcXJUnDuQ2+v+4h8HcLgiqBHaGs9/B/vK6A8oEbnZJQJUt0oBCh7f5u4LRJheIpNR40TGvEjktZGdIk/TOOqPJZ6R12rEFQdqE8WC2JA1a2HY5f2b6ZPadWVLnnP/zbqZcujt5RFWvbqDJ5Z3RBYWVP/omuyABm6yzeQIsiLyFJKh+JEXBmZUd1DAJryJZbT50Aayf6JClO9CulQF0psCj; 25:tWSqQEhX97Ri8vPoXZ+rDp+dB1dqCst/IeD78ksKWR5CWCKl+4xh+DttlHMUuwos8d8vLLiPYdoUVsrDl+c/QhkxDqj5Qdquhp15Q5MHvwcwHubKPhgFZK0rlbUTgLbEHficJOI0QS5fbprlQ1V1zc7XK4y34N6iDzH9ofhLYjMEuA14IyClq1X5RPTkde+/DlIMiG6a8KGZXotCYudDaQoItw43LicwndsXW5LKBhj/zCH6boW1SGV1KKAuzS5Vt0ERv780v4HZtD3jG+JxqZq/kiPAYh+VcRQajGvPsEO7Rw26c3tkD7bsc+xJmSFYgttf0/mhSnTxZVy+jtWw/Q==; 31:ouicxIFWWE/bg47eb0UE+T+2hSjGq+upu3/GyCBxA2E98BtAgb5xDCYnoStWY4dItVzlTBz8z/CNR6ihb8+sZBDERHbNglseLCupIj4skQ7eCZlUGV0wYrAdvvz4mcOdSWwnnzAHr1VD/4YkpyvnY1iQQ7S3fTROB/ZhbUB5w7fYd2a1tRa5LAXVZBpH2YzpWsHbOLHdr/h6GXP4TPMwbf0VtKu+IEABqiyYaU17mxg= X-MS-TrafficTypeDiagnostic: BN4PR07MB2129: X-Microsoft-Exchange-Diagnostics: 1; BN4PR07MB2129; 20:TVOkI3oyHgTgTLwM2Kugx6sl1VJCxbCz84ev9iD9MCctL50SusVbTmh1MgUVaJDwqv0ZZgxOJURsH8bbqhAGguBqTzmqhBXAzQBcvv89QcwuntmmMpGmjwnpmPj4XhCjficGuxNtI0+v47FZhh/j3bRCBkMmfS0CWIHj7AwN6o8duDagWaxgZZzhi+7m1OC6RCqlmhdLhv5eXDMWum03PxEpN4RRw77PMqeRzfV+9TYb+w3WbTKnAC1Q7ATSeKLfrdoW9kjxak/1fwiKOrfrs3pjJAmqX/iSdHtuPq9Pmy5Wsa/vHOiT/+VBA79oDM940KBoGMUJj+XHl3WTtoiZRnGSSr0Mx6hA6Ns0B6L1YniKSfYFrjwk/J8S+tkg5ygsRTAZ6HkNREOdgkd+6aK6Kmx9oRafOlBDVq6dvzqWvGHSzZGwKN3s+EukfP5XUbEEAniT1CuO6UkX+btpb4vvhyGE+Ar6GpaoSvjEwIKcsUdSZc9SisVyCKgS/4V2mYW0; 4:iK4Sdvnw5qX5/Yh587BB8f6KhANCvULoLpCczLtWgokAEL4BrsokhUms0IOWIQszjIsmCoy6ji5HMFUkglkpUFGyBDXk7gviQPDc0xsN8oVksM74deXAv96idBiqk5ENxpOBfgF8JZnAYI9h3z++vLRTFDl8q7CczBueYgLIRILuGjHe6cazMm44ys2RdPDYSRV0teae8/uhmDEXL/tH9U4BM8qrWH9U3506E0Pxz2afhKPzMZuTnH6Ok1AaiU/C X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(8121501046)(5005006)(10201501046)(93006095)(93001095)(100000703101)(100105400095)(3002001)(6041248)(20161123558100)(20161123555025)(20161123562025)(20161123564025)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:BN4PR07MB2129; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:BN4PR07MB2129; X-Forefront-PRVS: 04433051BF X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(346002)(376002)(199003)(189002)(2950100002)(47776003)(33646002)(48376002)(8936002)(66066001)(68736007)(305945005)(76176999)(50986999)(69596002)(5009440100003)(54906003)(53936002)(105586002)(106356001)(50226002)(101416001)(25786009)(53416004)(6512007)(50466002)(16526017)(6506006)(81156014)(81166006)(8676002)(3846002)(6486002)(6116002)(16586007)(6666003)(5660300001)(551934003)(4326008)(5003940100001)(107886003)(36756003)(316002)(97736004)(72206003)(7736002)(189998001)(478600001)(2906002)(86362001)(575784001); DIR:OUT; SFP:1101; SCL:1; SRVR:BN4PR07MB2129; H:kamlakant--T110-II.caveonetworks.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: 1; BN4PR07MB2129; 23:ah8pSEsl+MQ37Y/BmZS+sy3S/M98L+feKBzP3CERQqFRTOBGHjLrf89RbJujNnU1Qhg4ZoYVQoMsRVWChIMISFDca9XfaPBLxuNw/sG5A7dWnlUrTpDjIgZLpcV34f8aLCbbQSwmHLipmlLWKjn2AdDm+QvQq1+F6F5hT3UW2geOc5rsf6dWo1+pBQNNxvyrOqnCGGYqBlAcLbVarQ1mkSpefX2BMV3iHTukZlV/yxPVJKjdp746mLbghMf8eKcLH9eB+jzUWJ87zIbDWHZXLNnhXhxYd5j9BgZXcLrSltqAvp+vw+sPKyIDs3xhR6bh2yF/xOKRtl2cKye6xtUna/RCI4oewEUVBoLAW09Bzk1iyAxDXqJestNYdzgozrnwXsURoQjehp0ePJsTC92S1AwPfmRYoQEbVQHOJBx6eNSSA6hBtTXct/OYnSCo3ChcRwi1/iSe9T5jltoIPOyJNLmtaTTW7JQjNeTzllFaMPgDSgOQ59HDc6ZBC16f+MSgJjVqWmWJqXFhv/XLsXY5jObWRP4ypEE4hLTBtSsQlLT/Qwtq6eN2JeqWiIqT+rDd5N9awDtBeXgawmcb4Q9B3xMWdANEBhwYJIsejBRe4l3BJdq7y1w4bhVgAy9whBY7DqBtoz48U0Q5CRDxmZ0MYEglSNyrOelzE7dxJH7GzE+4UawbW3usQl0yjlh/hvYOWuUoqBHSbELqHv1P5Jhoa813cpslaTg+9Ovgcmx9gcb/hOchzAJDqFzHSffk+iIhsKbyEt8Hxyn5yZqVYV8oLAD6gQme6tlj/52pv2xU13q1lLsLCeSbE9x91UGcLgDTtN0PAlc3Qna6OMqiqiI9GGra00lPf2QoJFXgdhR5M8ZMqxDGJajKP/NnNtf3W/1Pj5E8zvKxuu8XT52HKlyRmKrZJI4aP/HLOFGPk29DL7S6zbV8G9F1cIJFl2/YNVe5Pmzkm24NtBEBztHcImnNhBzlRdflTWrjD9BqSY/zFrq1KLB5bPEjljj79gz2AD0VxgmPyxFGROGo246PBEbh1NKojMFSSDYpLi7ULjzOt32ISHfb5xLqXEBiNa20KPXM8ls8ac6rzq6nV723I1EE6yMG3uNzscW8jzV99CUNxAMv7pk99u0Rtq1efuoYXbtNCb/RrUU1fRfYHdS8iZ34bDBxCMo2ZpFqgT1fF6DOWeAmnl3/uWy6LqqUdFGq4I5B80pRTTj6M1FNOZFPozuZXA== X-Microsoft-Exchange-Diagnostics: 1; BN4PR07MB2129; 6:+/4lr22yCToZZANf0SPbypR18Pr/k8L55MlEFlhxrqColSglyW+SOtPWSk2/tBzMrR30IH7ScAYFvUsNMOUMa8gFSkKbeUIUidzuo6vKGdx+LrbMeB969N5nKcO653pmPlUIrpMqDLP4HBVbIuLhFrPxUA7N497tKfH63HVj7PDu7wDRn3uWA0yXz/nSRh04L+1V6ayUcA8rAWYcehEtzIDsty+rWGsfnOonwUQbsSVef0Hr144CI1ExIevJyAIahHSknmtV5fqr9BFjW7vKcWLdpJCvL05osdTXpARPU++faONVZPRsiwTjtxHHLjkm3FVkm60FzbGm1fon3wpWxw==; 5:ZQ+5LgGxidcb2q0D6hfZFO4l4rEWgrAD3CvdHHqL2vLD6h6qaukT0nTGQkA7m1X6jz/cLyDkKCImH7jnuvMPU92h9sUsDrmBtzmMML7ubJYHTlJmRUOiiIAKkQ+63JFrHyCuh0M7Gqb2kmQhdOK0Tw==; 24:6wcuT/2KBeyS4zP54vbCFq4P4otqzsDhRGbzxuCgjgI5VS4v9MmxZV23ScwrS1ipyNE4Fgh7gStz5IC0NjfcaE+513ph6712Qrp+54h+njo=; 7:faoF423VbempWpoDK+H4+JIAcZxVNQ6AzVEYj1d9+g1pGN0K/bI6CNizwUSEs+bDWrSVjgwEewN3aJBswWQjxdl/sojMCnhY5HUJNLsjPWYZktCeBcBB5YsfKjBT2kmIenaXhVlWzWxebxCre1Qg/NihkpqJMAMInLzwDjY++t6bKEd6D2f0iDaQ9dzwwfdHmoL22exXWlzutrsg1RP6fmvrT+cNt7PxPWaphd2So98= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Sep 2017 14:52:33.5277 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN4PR07MB2129 Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org The driver needs to handle the flag I2C_M_RECV_LEN during receive to support SMBus emulation. Update receive logic to handle the case where the length is received as the first byte of a transaction. Also update the code to handle I2C_CLIENT_PEC, which is set when the client sends a packet error checking code byte. Signed-off-by: Jayachandran C Signed-off-by: Kamlakant Patel Reviewed-by: Mika Westerberg --- drivers/i2c/busses/i2c-xlp9xx.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/drivers/i2c/busses/i2c-xlp9xx.c b/drivers/i2c/busses/i2c-xlp9xx.c index f0bef2d..91c0369 100644 --- a/drivers/i2c/busses/i2c-xlp9xx.c +++ b/drivers/i2c/busses/i2c-xlp9xx.c @@ -82,6 +82,8 @@ struct xlp9xx_i2c_dev { struct completion msg_complete; int irq; bool msg_read; + bool len_recv; + bool client_pec; u32 __iomem *base; u32 msg_buf_remaining; u32 msg_len; @@ -143,10 +145,25 @@ static void xlp9xx_i2c_fill_tx_fifo(struct xlp9xx_i2c_dev *priv) static void xlp9xx_i2c_drain_rx_fifo(struct xlp9xx_i2c_dev *priv) { u32 len, i; - u8 *buf = priv->msg_buf; + u8 rlen, *buf = priv->msg_buf; len = xlp9xx_read_i2c_reg(priv, XLP9XX_I2C_FIFOWCNT) & XLP9XX_I2C_FIFO_WCNT_MASK; + if (!len) + return; + if (priv->len_recv) { + /* read length byte */ + rlen = xlp9xx_read_i2c_reg(priv, XLP9XX_I2C_MRXFIFO); + *buf++ = rlen; + len--; + if (priv->client_pec) + ++rlen; + /* update remaining bytes and message length */ + priv->msg_buf_remaining = rlen; + priv->msg_len = rlen + 1; + priv->len_recv = false; + } + len = min(priv->msg_buf_remaining, len); for (i = 0; i < len; i++, buf++) *buf = xlp9xx_read_i2c_reg(priv, XLP9XX_I2C_MRXFIFO); @@ -230,7 +247,7 @@ static int xlp9xx_i2c_xfer_msg(struct xlp9xx_i2c_dev *priv, struct i2c_msg *msg, int last_msg) { unsigned long timeleft; - u32 intr_mask, cmd, val; + u32 intr_mask, cmd, val, len; priv->msg_buf = msg->buf; priv->msg_buf_remaining = priv->msg_len = msg->len; @@ -263,9 +280,13 @@ static int xlp9xx_i2c_xfer_msg(struct xlp9xx_i2c_dev *priv, struct i2c_msg *msg, else val &= ~XLP9XX_I2C_CTRL_ADDMODE; + priv->len_recv = (msg->flags & I2C_M_RECV_LEN); + len = priv->len_recv ? XLP9XX_I2C_FIFO_SIZE : msg->len; + priv->client_pec = (msg->flags & I2C_CLIENT_PEC); + /* set data length to be transferred */ val = (val & ~XLP9XX_I2C_CTRL_MCTLEN_MASK) | - (msg->len << XLP9XX_I2C_CTRL_MCTLEN_SHIFT); + (len << XLP9XX_I2C_CTRL_MCTLEN_SHIFT); xlp9xx_write_i2c_reg(priv, XLP9XX_I2C_CTRL, val); /* fill fifo during tx */ @@ -312,6 +333,9 @@ static int xlp9xx_i2c_xfer_msg(struct xlp9xx_i2c_dev *priv, struct i2c_msg *msg, return -ETIMEDOUT; } + /* update msg->len with actual received length */ + if (msg->flags & I2C_M_RECV_LEN) + msg->len = priv->msg_len; return 0; }