From: jacopo mondi <jacopo@jmondi.org>
To: Akinobu Mita <akinobu.mita@gmail.com>
Cc: linux-media@vger.kernel.org, devicetree@vger.kernel.org,
Jacopo Mondi <jacopo+renesas@jmondi.org>,
Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Hans Verkuil <hans.verkuil@cisco.com>,
Sakari Ailus <sakari.ailus@linux.intel.com>,
Mauro Carvalho Chehab <mchehab@s-opensource.com>
Subject: Re: [PATCH 1/6] media: ov772x: allow i2c controllers without I2C_FUNC_PROTOCOL_MANGLING
Date: Mon, 9 Apr 2018 08:58:12 +0200 [thread overview]
Message-ID: <20180409065812.GT20945@w540> (raw)
In-Reply-To: <1523116090-13101-2-git-send-email-akinobu.mita@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 4143 bytes --]
Hello Akinobu,
thank you for the patch.
On which platform have you tested the series (just curious) ?
On Sun, Apr 08, 2018 at 12:48:05AM +0900, Akinobu Mita wrote:
> The ov772x driver only works when the i2c controller have
> I2C_FUNC_PROTOCOL_MANGLING. However, many i2c controller drivers don't
> support it.
>
> The reason that the ov772x requires I2C_FUNC_PROTOCOL_MANGLING is that
> it doesn't support repeated starts.
>
> This change adds an alternative method for reading from ov772x register
> which uses two separated i2c messages for the i2c controllers without
> I2C_FUNC_PROTOCOL_MANGLING.
Actually, and please correct me if I'm wrong, what I see here is that
an i2c_master_send+i2c_master_recv sequence is equivalent to a mangled
smbus transaction:
i2c_smbus_read_byte_data | I2C_CLIENT_SCCB:
S Addr Wr [A] Comm [A] P S Addr Rd [A] [Data] NA P
i2c_master_send() + i2c_master_recv():
S Addr Wr [A] Data [A] P
S Addr Rd [A] [Data] NA P
I wonder if it is not worth to ditch the existing read() function in
favour of your new proposed one completely.
I have tested it on the Migo-R board where I have an ov772x installed
and it works fine.
Although I would like to have a confirmation this is fine by people
how has seen more i2c adapters in action than me :)
Thanks
j
>
> Cc: Jacopo Mondi <jacopo+renesas@jmondi.org>
> Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Cc: Hans Verkuil <hans.verkuil@cisco.com>
> Cc: Sakari Ailus <sakari.ailus@linux.intel.com>
> Cc: Mauro Carvalho Chehab <mchehab@s-opensource.com>
> Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
> ---
> drivers/media/i2c/ov772x.c | 42 +++++++++++++++++++++++++++++++++---------
> 1 file changed, 33 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/media/i2c/ov772x.c b/drivers/media/i2c/ov772x.c
> index b62860c..283ae2c 100644
> --- a/drivers/media/i2c/ov772x.c
> +++ b/drivers/media/i2c/ov772x.c
> @@ -424,6 +424,7 @@ struct ov772x_priv {
> /* band_filter = COM8[5] ? 256 - BDBASE : 0 */
> unsigned short band_filter;
> unsigned int fps;
> + int (*reg_read)(struct i2c_client *client, u8 addr);
> };
>
> /*
> @@ -542,11 +543,34 @@ static struct ov772x_priv *to_ov772x(struct v4l2_subdev *sd)
> return container_of(sd, struct ov772x_priv, subdev);
> }
>
> -static inline int ov772x_read(struct i2c_client *client, u8 addr)
> +static int ov772x_read(struct i2c_client *client, u8 addr)
> +{
> + struct v4l2_subdev *sd = i2c_get_clientdata(client);
> + struct ov772x_priv *priv = to_ov772x(sd);
> +
> + return priv->reg_read(client, addr);
> +}
> +
> +static int ov772x_reg_read(struct i2c_client *client, u8 addr)
> {
> return i2c_smbus_read_byte_data(client, addr);
> }
>
> +static int ov772x_reg_read_fallback(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;
> +}
> +
> static inline int ov772x_write(struct i2c_client *client, u8 addr, u8 value)
> {
> return i2c_smbus_write_byte_data(client, addr, value);
> @@ -1255,20 +1279,20 @@ static int ov772x_probe(struct i2c_client *client,
> return -EINVAL;
> }
>
> - if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA |
> - I2C_FUNC_PROTOCOL_MANGLING)) {
> - dev_err(&adapter->dev,
> - "I2C-Adapter doesn't support SMBUS_BYTE_DATA or PROTOCOL_MANGLING\n");
> - return -EIO;
> - }
> - client->flags |= I2C_CLIENT_SCCB;
> -
> priv = devm_kzalloc(&client->dev, sizeof(*priv), GFP_KERNEL);
> if (!priv)
> return -ENOMEM;
>
> priv->info = client->dev.platform_data;
>
> + if (i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA |
> + I2C_FUNC_PROTOCOL_MANGLING))
> + priv->reg_read = ov772x_reg_read;
> + else
> + priv->reg_read = ov772x_reg_read_fallback;
> +
> + client->flags |= I2C_CLIENT_SCCB;
> +
> v4l2_i2c_subdev_init(&priv->subdev, client, &ov772x_subdev_ops);
> v4l2_ctrl_handler_init(&priv->hdl, 3);
> v4l2_ctrl_new_std(&priv->hdl, &ov772x_ctrl_ops,
> --
> 2.7.4
>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
next prev parent reply other threads:[~2018-04-09 6:58 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-07 15:48 [PATCH 0/6] media: ov772x: support media controller, device tree probing, etc Akinobu Mita
2018-04-07 15:48 ` [PATCH 1/6] media: ov772x: allow i2c controllers without I2C_FUNC_PROTOCOL_MANGLING Akinobu Mita
2018-04-09 6:58 ` jacopo mondi [this message]
2018-04-09 11:55 ` Laurent Pinchart
2018-04-10 16:37 ` Akinobu Mita
2018-04-11 7:32 ` jacopo mondi
2018-04-07 15:48 ` [PATCH 2/6] media: ov772x: add checks for register read errors Akinobu Mita
2018-04-09 7:36 ` jacopo mondi
2018-04-10 16:28 ` Akinobu Mita
2018-04-07 15:48 ` [PATCH 3/6] media: ov772x: create subdevice device node Akinobu Mita
2018-04-07 15:48 ` [PATCH 4/6] media: ov772x: add media controller support Akinobu Mita
2018-04-09 8:32 ` jacopo mondi
2018-04-10 16:31 ` Akinobu Mita
2018-04-07 15:48 ` [PATCH 5/6] media: ov772x: add device tree binding Akinobu Mita
2018-04-09 9:06 ` jacopo mondi
2018-04-10 16:34 ` Akinobu Mita
2018-04-07 15:48 ` [PATCH 6/6] media: ov772x: support device tree probing Akinobu Mita
2018-04-09 9:27 ` jacopo mondi
2018-04-10 16:34 ` Akinobu Mita
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180409065812.GT20945@w540 \
--to=jacopo@jmondi.org \
--cc=akinobu.mita@gmail.com \
--cc=devicetree@vger.kernel.org \
--cc=hans.verkuil@cisco.com \
--cc=jacopo+renesas@jmondi.org \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@s-opensource.com \
--cc=sakari.ailus@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.