From: Tomasz Figa <tfiga@chromium.org>
To: "Yeh, Andy" <andy.yeh@intel.com>
Cc: Linux Media Mailing List <linux-media@vger.kernel.org>,
Sakari Ailus <sakari.ailus@linux.intel.com>,
devicetree@vger.kernel.org, jacopo@jmondi.org,
Alan Chiang <alanx.chiang@intel.com>
Subject: Re: [RESEND PATCH v7 2/2] media: dw9807: Add dw9807 vcm driver
Date: Wed, 11 Apr 2018 04:38:17 +0000 [thread overview]
Message-ID: <CAAFQd5ApQdHCFAmA1PjUOcDGa6VMbc=JJA1mLa8WH2PJJGD17g@mail.gmail.com> (raw)
In-Reply-To: <1523375324-27856-3-git-send-email-andy.yeh@intel.com>
Hi Andy, Alan,
On Wed, Apr 11, 2018 at 12:41 AM Andy Yeh <andy.yeh@intel.com> wrote:
> From: Alan Chiang <alanx.chiang@intel.com>
> DW9807 is a 10 bit DAC from Dongwoon, designed for linear
> control of voice coil motor.
> This driver creates a V4L2 subdevice and
> provides control to set the desired focus.
Please see my comments inline.
[snip]
> +static int dw9807_i2c_check(struct i2c_client *client)
> +{
> + const char status_addr = DW9807_STATUS_ADDR;
> + char status_result;
> + int ret;
> +
> + ret = i2c_master_send(client, (const char *)&status_addr,
> + sizeof(status_addr));
Why is this cast needed? status_addr is const char already, so
&status_addr, should be const char *.
> + if (ret < 0) {
> + dev_err(&client->dev, "I2C write STATUS address fail ret
= %d\n",
> + ret);
> + return ret;
> + }
> +
> + ret = i2c_master_recv(client, (char *)&status_result,
Shouldn't need this cast.
> + sizeof(status_result));
> + if (ret != sizeof(status_result)) {
> + dev_err(&client->dev, "I2C read STATUS value fail
ret=%d\n",
> + ret);
> + return ret;
> + }
> +
> + return status_result;
> +}
> +
> +static int dw9807_set_dac(struct i2c_client *client, u16 data)
> +{
> + const char tx_data[3] = {
> + DW9807_MSB_ADDR, ((data >> 8) & 0x03), (data & 0xff)
> + };
> + int ret, retry = 0;
> +
> + /*
> + * According to the datasheet, need to check the bus status
before we
> + * write VCM position. This ensure that we really write the value
> + * into the register
> + */
> + while ((ret = dw9807_i2c_check(client)) != 0) {
> + if (ret < 0)
> + return ret;
> +
> + if (MAX_RETRY == ++retry) {
> + dev_err(&client->dev,
> + "Cannot do the write operation because
VCM is busy\n");
> + return -EIO;
> + }
> + usleep_range(DW9807_CTRL_DELAY_US, DW9807_CTRL_DELAY_US +
10);
> + }
One could use readx_poll_timeout() here:
int val;
ret = readx_poll_timeout(dw9807_i2c_check, client, val, !val,
DW9807_CTRL_DELAY_US,
MAX_RETRY * DW9807_CTRL_DELAY_US);
if (ret) {
dev_err(&client->dev,
"Cannot do the write operation because VCM is busy\n");
return -EIO;
}
> +
> + /* Write VCM position to registers */
> + ret = i2c_master_send(client, tx_data, sizeof(tx_data));
> + if (ret != sizeof(tx_data)) {
> + if (ret < 0) {
> + dev_err(&client->dev,
> + "I2C write MSB fail ret=%d\n", ret);
> + return ret;
> + } else {
I believe this can't happen, both by looking at implementation of
i2c_master_send() and existing drivers checking only for (ret < 0).
> + dev_err(&client->dev, "I2C write MSB fail,
transmission size is not equal the size expected\n");
> + return -EIO;
> + }
> + }
> +
> + return 0;
> +}
[snip]
> +static const struct of_device_id dw9807_of_table[] = {
> + { .compatible = "dongwoon,dw9807" },
> + { { 0 } }
It looks like we may need other changes, so I'd go with
{ /* sentinel */ },
here. That's (+/- the comment) what other drivers use normally.
Best regards,
Tomasz
next prev parent reply other threads:[~2018-04-11 4:38 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-10 15:48 [RESEND PATCH v7 0/2] DW9807 DT binding and driver patches Andy Yeh
2018-04-10 15:48 ` [RESEND PATCH v7 1/2] media: dt-bindings: Add bindings for Dongwoon DW9807 voice coil Andy Yeh
2018-04-13 15:10 ` Rob Herring
2018-04-25 2:31 ` Yeh, Andy
2018-04-10 15:48 ` [RESEND PATCH v7 2/2] media: dw9807: Add dw9807 vcm driver Andy Yeh
2018-04-11 4:38 ` Tomasz Figa [this message]
2018-04-11 4:42 ` Tomasz Figa
2018-04-12 8:57 ` jacopo mondi
2018-04-12 9:57 ` Sakari Ailus
2018-04-16 4:30 ` Tomasz Figa
2018-04-16 9:49 ` Sakari Ailus
2018-04-25 2:28 ` Yeh, Andy
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='CAAFQd5ApQdHCFAmA1PjUOcDGa6VMbc=JJA1mLa8WH2PJJGD17g@mail.gmail.com' \
--to=tfiga@chromium.org \
--cc=alanx.chiang@intel.com \
--cc=andy.yeh@intel.com \
--cc=devicetree@vger.kernel.org \
--cc=jacopo@jmondi.org \
--cc=linux-media@vger.kernel.org \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).