From patchwork Mon Jul 9 15:41:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Akinobu Mita X-Patchwork-Id: 941392 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="MDwPzLor"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41PV1X30Xlz9rvt for ; Tue, 10 Jul 2018 01:41:36 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933364AbeGIPlf (ORCPT ); Mon, 9 Jul 2018 11:41:35 -0400 Received: from mail-pf0-f195.google.com ([209.85.192.195]:43747 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932699AbeGIPle (ORCPT ); Mon, 9 Jul 2018 11:41:34 -0400 Received: by mail-pf0-f195.google.com with SMTP id y8-v6so13937607pfm.10; Mon, 09 Jul 2018 08:41:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=5BP8k/kLZyb2NPMNIXyJrYI+EKQf5OxxzpisrTeCJAo=; b=MDwPzLorgskxRfUAOvQF6sZWZlvebM8XHR53ozI9vE+bH9dGedSAY34MShmq6UoT8R 8ohOcn+I/+YOuQIGxliKzbbAhqSl3ixT7TsIMP+J1uWZKl2srfys2DUKkr5gjSCpJkJ4 X3KmVrjTOlme8wwntLRIN+LhKl4hZEZQbgITgnZnPKo7sje/6mPkUCbvBiN5bdkS7lF/ BbtlYf+3cXDySXoyFJItzQWwdOSCMVEZVBvEELeX62xGdk5T2jyJ8+PJ+TRsXK+oUG8v BxwqgWkzuqK5/P4IZP3de+PvF+KJrPPJiK/pGRl/uLmXYkxTHq6DDxBuwrFNaaHjMSYF Fgcg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=5BP8k/kLZyb2NPMNIXyJrYI+EKQf5OxxzpisrTeCJAo=; b=cypy18QJEKL1WmpfBrfDzej6z7gPEr/tmDIXrtZxUlV5BbvMfk0YjS9M41ruGzEmEy zdRmmuboRSEXie12rnOCCeIgK5joLWamLVQvOzMFuLDvrp9gJvTxxLmPdSifJbveIqEJ yPpSKfdlqIh0nBe3fYdQy//gO3csjCMoRAYfACxigCywGUgZ0WK2tkpxfNYcrSTKS+kg tlBoLSMnQSOBeWJ4HKUF/pcwNdKeYjbGl8hIOXmfAIv6xWedYvZ+vQeJpiPqytyew3+M RKigBB+BdPhV7Ccs4XQZ+IadDDuqZ5VEsjHf/W8Vz8NUvQZOS7hgwS/Lq3av9cfNVZMy IPZQ== X-Gm-Message-State: APt69E1lpaWaWntnRoxsng8MibVhbON8LvW5cjT9TQ/gXkvIr8Sv38Gb ygTz+5IJy4wflBNLrAFDOQWbvg== X-Google-Smtp-Source: AAOMgpfXa/i3SL/AVMDYQkQ9MaANjPma3/zVuzQupohP3/L1fCdZSdVCGOyhX3I5olZEHgN9qewO3w== X-Received: by 2002:a63:fc0a:: with SMTP id j10-v6mr19236859pgi.1.1531150893495; Mon, 09 Jul 2018 08:41:33 -0700 (PDT) Received: from localhost.localdomain ([240f:34:212d:1:3963:3c46:f9cd:fcc]) by smtp.gmail.com with ESMTPSA id g124-v6sm24980981pfb.5.2018.07.09.08.41.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 09 Jul 2018 08:41:32 -0700 (PDT) From: Akinobu Mita To: linux-media@vger.kernel.org, linux-i2c@vger.kernel.org Cc: Akinobu Mita , Peter Rosin , Sebastian Reichel , Wolfram Sang , Jacopo Mondi , Laurent Pinchart , Hans Verkuil , Sakari Ailus , Mauro Carvalho Chehab Subject: [PATCH -next v3 1/2] i2c: add SCCB helpers Date: Tue, 10 Jul 2018 00:41:13 +0900 Message-Id: <1531150874-4595-2-git-send-email-akinobu.mita@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1531150874-4595-1-git-send-email-akinobu.mita@gmail.com> References: <1531150874-4595-1-git-send-email-akinobu.mita@gmail.com> Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org This adds Serial Camera Control Bus (SCCB) helpers (sccb_is_available, sccb_read_byte, and sccb_write_byte) that are intended to be used by some of Omnivision sensor drivers. The ov772x driver is going to use these helpers. It was previously only worked with the i2c controller drivers that support I2C_FUNC_PROTOCOL_MANGLING, because the ov772x device doesn't support repeated starts. After commit 0b964d183cbf ("media: ov772x: allow i2c controllers without I2C_FUNC_PROTOCOL_MANGLING"), reading ov772x register is replaced with issuing two separated i2c messages in order to avoid repeated start. Using SCCB helpers hides the implementation detail. Cc: Peter Rosin Cc: Sebastian Reichel Cc: Wolfram Sang Cc: Jacopo Mondi Cc: Laurent Pinchart Cc: Hans Verkuil Cc: Sakari Ailus Cc: Mauro Carvalho Chehab Signed-off-by: Akinobu Mita --- include/linux/i2c-sccb.h | 77 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 include/linux/i2c-sccb.h diff --git a/include/linux/i2c-sccb.h b/include/linux/i2c-sccb.h new file mode 100644 index 0000000..61dece9 --- /dev/null +++ b/include/linux/i2c-sccb.h @@ -0,0 +1,77 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Serial Camera Control Bus (SCCB) helper functions + */ + +#ifndef _LINUX_I2C_SCCB_H +#define _LINUX_I2C_SCCB_H + +#include + +/** + * sccb_is_available - Check if the adapter supports SCCB protocol + * @adap: I2C adapter + * + * Return true if the I2C adapter is capable of using SCCB helper functions, + * false otherwise. + */ +static inline bool sccb_is_available(struct i2c_adapter *adap) +{ + u32 needed_funcs = I2C_FUNC_SMBUS_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE_DATA; + +#if 0 + /* + * sccb_xfer not needed yet, since there is no driver support currently. + * Just showing how it should be done if we ever need it. + */ + if (adap->algo->sccb_xfer) + return true; +#endif + + return (i2c_get_functionality(adap) & needed_funcs) == needed_funcs; +} + +/** + * sccb_read_byte - Read data from SCCB slave device + * @client: Handle to slave device + * @addr: Register to be read from + * + * This executes the 2-phase write transmission cycle that is followed by a + * 2-phase read transmission cycle, returning negative errno else a data byte + * received from the device. + */ +static inline int sccb_read_byte(struct i2c_client *client, u8 addr) +{ + int ret; + union i2c_smbus_data data; + + i2c_lock_bus(client->adapter, I2C_LOCK_SEGMENT); + + ret = __i2c_smbus_xfer(client->adapter, client->addr, client->flags, + I2C_SMBUS_WRITE, addr, I2C_SMBUS_BYTE, NULL); + if (ret < 0) + goto out; + + ret = __i2c_smbus_xfer(client->adapter, client->addr, client->flags, + I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data); +out: + i2c_unlock_bus(client->adapter, I2C_LOCK_SEGMENT); + + return ret < 0 ? ret : data.byte; +} + +/** + * sccb_write_byte - Write data to SCCB slave device + * @client: Handle to slave device + * @addr: Register to write to + * @data: Value to be written + * + * This executes the SCCB 3-phase write transmission cycle, returning negative + * errno else zero on success. + */ +static inline int sccb_write_byte(struct i2c_client *client, u8 addr, u8 data) +{ + return i2c_smbus_write_byte_data(client, addr, data); +} + +#endif /* _LINUX_I2C_SCCB_H */ From patchwork Mon Jul 9 15:41:14 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Akinobu Mita X-Patchwork-Id: 941393 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="cb5+9HqP"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41PV1c3PW9z9rvt for ; Tue, 10 Jul 2018 01:41:40 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933367AbeGIPli (ORCPT ); Mon, 9 Jul 2018 11:41:38 -0400 Received: from mail-pl0-f68.google.com ([209.85.160.68]:45274 "EHLO mail-pl0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932699AbeGIPlh (ORCPT ); Mon, 9 Jul 2018 11:41:37 -0400 Received: by mail-pl0-f68.google.com with SMTP id a17-v6so376647plm.12; Mon, 09 Jul 2018 08:41:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=mp3GMjUseJ058wwbdMUmYWhvx5kCyfuBtPZxYzBdlkQ=; b=cb5+9HqPEpf6K2k8In9X9OB+JBnSU33VyDCUEt1Q4Jnmo1NhpZlgnowAn6J6oWas4p nmNHfNCfZ3Z8wmazizEmLFj5F72XQuMzWq/cWBK5cDZbnkmWOnUX1RFkwE7M7XDneDQP SdHGOdp24XzwOqNO28u6T0d+HFCgxr03uAzTHyW32mkbAMvRk933s5kvLlUrG/05Qe9y 2IgWzsge6HiU+tMGAiUGjjhGWawyvXv2pMElSUcD44DEVTuIAPJT73p4PH8CN+KzCsMh KrkclojJ1h6/o7aRiRO2hj8GaZufNcrjMeeTdP8NFITXJCib4Y3AYy83NJBDK+PfxwH1 G0sQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=mp3GMjUseJ058wwbdMUmYWhvx5kCyfuBtPZxYzBdlkQ=; b=jszYim3o6jlOSy8+qm2IaFLcNty/+VJ2+2mU9aHW8qliwwGj+O7ODFJLwTUzjnFQZl tGuSy2zOsS06yFQJXPo4ieX68xsS6L3JQ2t8pQi5cnxRtw1yMUF3Xd5lNi2CFZoEQ55T Z0z1rtiUOPyiM4rxBnaQLpG3bXHWMTPP3qxuUsqwYi3010HSoIwSxDvmp38C2Fj2+Fj0 Ss9E6dn/qhYcGEXrJr/sJV3Bx2osXjPDhzUVqCJ/5okJXSDuPPHsTG8z0O5yjI0OvZhD 8C23xyiBhND7za1ovTfHk0gQ8Tki3vEgt9zyPL7YhmMsGA9qDsJus+oG51vUsa4hVDqA KUOQ== X-Gm-Message-State: APt69E02LaKvD02J6QUILwX6L9TaEfIRhYPjA/ljK6gwt8JUnQHVC+5z /5fTmg+pcTW0fiCT5uKKgugA6w== X-Google-Smtp-Source: AAOMgpcsep9W5f85mfjteDUj4+dRhOmNADPuq7+6jRXahfYC2urUthEFTNlrO+NDYQt/rFyOc/i7CA== X-Received: by 2002:a17:902:1081:: with SMTP id c1-v6mr21031634pla.153.1531150896958; Mon, 09 Jul 2018 08:41:36 -0700 (PDT) Received: from localhost.localdomain ([240f:34:212d:1:3963:3c46:f9cd:fcc]) by smtp.gmail.com with ESMTPSA id g124-v6sm24980981pfb.5.2018.07.09.08.41.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 09 Jul 2018 08:41:36 -0700 (PDT) From: Akinobu Mita To: linux-media@vger.kernel.org, linux-i2c@vger.kernel.org Cc: Akinobu Mita , Peter Rosin , Sebastian Reichel , Wolfram Sang , Jacopo Mondi , Laurent Pinchart , Hans Verkuil , Sakari Ailus , Mauro Carvalho Chehab Subject: [PATCH -next v3 2/2] media: ov772x: use SCCB helpers Date: Tue, 10 Jul 2018 00:41:14 +0900 Message-Id: <1531150874-4595-3-git-send-email-akinobu.mita@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1531150874-4595-1-git-send-email-akinobu.mita@gmail.com> References: <1531150874-4595-1-git-send-email-akinobu.mita@gmail.com> Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org Convert ov772x register access to use SCCB helpers. Cc: Peter Rosin Cc: Sebastian Reichel Cc: Wolfram Sang Cc: Jacopo Mondi Cc: Laurent Pinchart Cc: Hans Verkuil Cc: Sakari Ailus Cc: Mauro Carvalho Chehab Signed-off-by: Akinobu Mita Reviewed-by: Sebastian Reichel --- drivers/media/i2c/ov772x.c | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/drivers/media/i2c/ov772x.c b/drivers/media/i2c/ov772x.c index 7158c31..8a9a9ca 100644 --- a/drivers/media/i2c/ov772x.c +++ b/drivers/media/i2c/ov772x.c @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #include #include @@ -551,22 +551,12 @@ static struct ov772x_priv *to_ov772x(struct v4l2_subdev *sd) static int ov772x_read(struct i2c_client *client, u8 addr) { - int ret; - u8 val; - - ret = i2c_master_send(client, &addr, 1); - if (ret < 0) - return ret; - ret = i2c_master_recv(client, &val, 1); - if (ret < 0) - return ret; - - return val; + return sccb_read_byte(client, addr); } static inline int ov772x_write(struct i2c_client *client, u8 addr, u8 value) { - return i2c_smbus_write_byte_data(client, addr, value); + return sccb_write_byte(client, addr, value); } static int ov772x_mask_set(struct i2c_client *client, u8 command, u8 mask, @@ -1395,9 +1385,9 @@ static int ov772x_probe(struct i2c_client *client, return -EINVAL; } - if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { + if (!sccb_is_available(adapter)) { dev_err(&adapter->dev, - "I2C-Adapter doesn't support SMBUS_BYTE_DATA\n"); + "I2C-Adapter doesn't support SCCB\n"); return -EIO; }