From patchwork Thu Jan 9 12:55:43 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrzej Hajda X-Patchwork-Id: 21516 X-Patchwork-Delegate: sylvester.nawrocki@gmail.com Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1W1F9S-000069-Qk; Thu, 09 Jan 2014 13:55:58 +0100 X-tubIT-Incoming-IP: 209.132.180.67 Received: from vger.kernel.org ([209.132.180.67]) by mail.tu-berlin.de (exim-4.72/mailfrontend-6) with esmtp id 1W1F9Q-0003PQ-5r; Thu, 09 Jan 2014 13:55:58 +0100 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751737AbaAIMzy (ORCPT + 1 other); Thu, 9 Jan 2014 07:55:54 -0500 Received: from mailout4.w1.samsung.com ([210.118.77.14]:60004 "EHLO mailout4.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751350AbaAIMzx (ORCPT ); Thu, 9 Jan 2014 07:55:53 -0500 Received: from eucpsbgm1.samsung.com (unknown [203.254.199.244]) by mailout4.w1.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0MZ4005WHX937A80@mailout4.w1.samsung.com> for linux-media@vger.kernel.org; Thu, 09 Jan 2014 12:55:51 +0000 (GMT) X-AuditID: cbfec7f4-b7f796d000005a13-f3-52ce9c57b2de Received: from eusync1.samsung.com ( [203.254.199.211]) by eucpsbgm1.samsung.com (EUCPMTA) with SMTP id 5A.BF.23059.75C9EC25; Thu, 09 Jan 2014 12:55:51 +0000 (GMT) Received: from AMDC1061.digital.local ([106.116.147.88]) by eusync1.samsung.com (Oracle Communications Messaging Server 7u4-23.01 (7.0.4.23.0) 64bit (built Aug 10 2011)) with ESMTPA id <0MZ40009SX8YDV90@eusync1.samsung.com>; Thu, 09 Jan 2014 12:55:51 +0000 (GMT) From: Andrzej Hajda To: linux-media@vger.kernel.org Cc: Andrzej Hajda , Dan Carpenter , Sylwester Nawrocki , Kyungmin Park , Mauro Carvalho Chehab Subject: [PATCH] s5k5baf: allow to handle arbitrary long i2c sequences Date: Thu, 09 Jan 2014 13:55:43 +0100 Message-id: <1389272143-22394-1-git-send-email-a.hajda@samsung.com> X-Mailer: git-send-email 1.8.3.2 In-reply-to: <20140108122709.39263bb9@samsung.com> References: <20140108122709.39263bb9@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrCJMWRmVeSWpSXmKPExsVy+t/xy7rhc84FGXw9w2pxa905VovX/6az WJxtesNu0bNhK6vFxXXyFofftLM6sHl8fHqLxaNvyypGj8+b5AKYo7hsUlJzMstSi/TtErgy Hv48wViwmL/iw445bA2ME3i6GDk5JARMJH5+nskKYYtJXLi3ng3EFhJYyijRcMWyi5ELyO5j ktj9YA0zSIJNQFPi7+abYEUiAvIST3pvsIEUMQvcB2qYs4UJJCEs4CZx4e5foAQHB4uAqkTb SVmQMK+As8Tj1deglilILPuylhmkhFPASOLMlHqIvYYS1+Y/YZ3AyLuAkWEVo2hqaXJBcVJ6 rqFecWJucWleul5yfu4mRkjIfNnBuPiY1SFGAQ5GJR5ejtqzQUKsiWXFlbmHGCU4mJVEeKc2 ngsS4k1JrKxKLcqPLyrNSS0+xMjEwSnVwCi9ui0su76Ma/8qyUj3FyfN425ZlWmyKa35w1z3 bobDwi3vLrHd9j23vGAeV7Dd/wsSp//nL5rTdlFgjqHad7mMyywvfTSTtr01Sza2uBVuLhM2 vVNeuDn72F3D43sdXwZ0K32VfX/M9XZGa9O9TQtuPFze9kTC1+Qtj175uul36r6e/VzZVq7E UpyRaKjFXFScCAAW78Vx9wEAAA== Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-PMX-Version: 6.0.0.2142326, Antispam-Engine: 2.7.2.2107409, Antispam-Data: 2014.1.9.124515 X-PMX-Spam: Gauge=IIIIIIIII, Probability=9%, Report=' HTML_NO_HTTP 0.1, MULTIPLE_RCPTS 0.1, HTML_00_10 0.05, BODYTEXTP_SIZE_3000_LESS 0, BODY_SIZE_2000_2999 0, BODY_SIZE_5000_LESS 0, BODY_SIZE_7000_LESS 0, URI_ENDS_IN_HTML 0, __ANY_URI 0, __CP_URI_IN_BODY 0, __HAS_FROM 0, __HAS_HTML 0, __HAS_MSGID 0, __HAS_X_MAILER 0, __HAS_X_MAILING_LIST 0, __IN_REP_TO 0, __MIME_TEXT_ONLY 0, __MULTIPLE_RCPTS_CC_X2 0, __SANE_MSGID 0, __SUBJ_ALPHA_END 0, __TO_MALFORMED_2 0, __TO_NO_NAME 0, __URI_NO_WWW 0, __URI_NS ' Using variable length array in s5k5baf_write_arr_seq caused an implicit assumption that i2c sequences should be short. The patch rewrites the function so it can handle sequences of any length and do not uses variable length array. Signed-off-by: Andrzej Hajda Reported-by: Dan Carpenter --- Hi Dan and Mauro, I hope this patch solves the issue. Regards Andrzej --- drivers/media/i2c/s5k5baf.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/drivers/media/i2c/s5k5baf.c b/drivers/media/i2c/s5k5baf.c index 089fba6..3de1287 100644 --- a/drivers/media/i2c/s5k5baf.c +++ b/drivers/media/i2c/s5k5baf.c @@ -478,25 +478,33 @@ static void s5k5baf_write_arr_seq(struct s5k5baf *state, u16 addr, u16 count, const u16 *seq) { struct i2c_client *c = v4l2_get_subdevdata(&state->sd); - __be16 buf[count + 1]; - int ret, n; + __be16 buf[65]; s5k5baf_i2c_write(state, REG_CMDWR_ADDR, addr); if (state->error) return; + v4l2_dbg(3, debug, c, "i2c_write_seq(count=%d): %*ph\n", count, + min(2 * count, 64), seq); + buf[0] = __constant_cpu_to_be16(REG_CMD_BUF); - for (n = 1; n <= count; ++n) - buf[n] = cpu_to_be16(*seq++); - n *= 2; - ret = i2c_master_send(c, (char *)buf, n); - v4l2_dbg(3, debug, c, "i2c_write_seq(count=%d): %*ph\n", count, - min(2 * count, 64), seq - count); + while (count > 0) { + int n = min_t(int, count, ARRAY_SIZE(buf) - 1); + int ret, i; - if (ret != n) { - v4l2_err(c, "i2c_write_seq: error during transfer (%d)\n", ret); - state->error = ret; + for (i = 1; i <= n; ++i) + buf[i] = cpu_to_be16(*seq++); + + i *= 2; + ret = i2c_master_send(c, (char *)buf, i); + if (ret != i) { + v4l2_err(c, "i2c_write_seq: error during transfer (%d)\n", ret); + state->error = ret; + break; + } + + count -= n; } }