devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
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

  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).