linux-iio.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jonathan Cameron <jic23@kernel.org>
To: Jean-Baptiste Maneyrol <JManeyrol@invensense.com>,
	"linux-iio@vger.kernel.org" <linux-iio@vger.kernel.org>
Subject: Re: [PATCH] iio: imu: inv_mpu6050: test whoami against invalid values and do it first
Date: Sun, 21 May 2017 12:43:49 +0100	[thread overview]
Message-ID: <dfb943f0-a26f-fa77-9355-a887c9928d3e@kernel.org> (raw)
In-Reply-To: <BLUPR12MB06573DAB544C2B6C067587C4C4E70@BLUPR12MB0657.namprd12.prod.outlook.com>

On 17/05/17 16:03, Jean-Baptiste Maneyrol wrote:
> 
>> From: Jonathan Cameron <jic23@kernel.org>
>> Sent: Tuesday, May 16, 2017 20:06
>> To: Jean-Baptiste Maneyrol; linux-iio@vger.kernel.org
>> Subject: Re: [PATCH] iio: imu: inv_mpu6050: test whoami against invalid values and do it first
>>      
>> On 15/05/17 09:42, Jean-Baptiste Maneyrol wrote:
>>> Hello,
>>>
>>> this is mainly useful for our test platforms where we want to support
>>> both I2C and SPI configuration with the same kernel image. For that
>>> purpose we declare 2 chips, 1 on I2C and 1 on SPI bus. But on the
>>> hardware there is only 1 chip connected (you can plug it in a I2C or
>>> SPI slot as required). And we expect the driver probe to fail
>>> properly when there is no chip connected on the corresponding bus
>>> (wasn't the case with SPI version).
>>>
>>> In any case if there is a SPI wiring issue somewhere, it is useful to
>>> have the driver probe failing correctly and reporting the issue.
>>> Since SPI transfer are not acked, there always will be a response for
>>> every transaction even if there is no chip behind (this is 0x00 on my
>>> platform, I don't know if there is some "standard" response here).
>>> That's why I am testing whoami reading against these values to ensure
>>> there is a real chip behind.
>>>
>>> I think it is useful to keep the check against ID not preventing the
>>> driver probe to succeed. We have a lot of similar chips with
>>> different IDs, so it can be helpful. Otherwise, I can switch to
>>> checking against ID and add all known IDs.
>> That would be be my preference.  Check against all known and
>> report but don't fail on the 'it is the wrong one' case we
>> all know happens out in the wild!
>>
>> Jonathan
>>
>> p.s. Please don't top post and please wrap lines at 80 chars.
>> I've just broken some threading email clients by wrapping
>> it in this reply... (minor point!)
> 
> We agree on this point, but we are digressing from the issue.
> Sorry my explanations were a bit too long.
> 
> The main point is that the SPI driver probe is not failing when
> there is no chip connected or when the wiring is broken.
> This is a blocking issue for my use case and not very clean anyway.
> The problem is that SPI transactions are never failing even if there is
> a transfer problem. That's not the case with I2C where every
> transactions are acked.
> 
> My solution is to read whoami and test if the value is clearly invalid
> (0x00 or 0xff are obvious invalid whoami that will be never used in any
> invensense chips, and are possible return values for a
> not working SPI wiring). So that we are not blocking the driver probe for
> future possible whoamiI would rather we did block on unknown future whoami values. The part
that is present could be something entirely different.

The 0x00 and 0xff is a kind of convenient hack.  Unless they are clamped
one way or the other you might well get something inbetween on a floating
pin and a random response.

I can see where you are coming from for wanting to allow future flexibility
for whoami values changing, but I'd rather have it clean and consistent.
Normally when there is a whoami change we need minor changes in the driver
anyway to support it properly...
> 
> Is this approach correct for you? Otherwise if you have a better idea,
> it would be welcome.
> 
> Thanks for your help.
> 
> JB
> 
> P.S.: Hope this e-mail is OK. I'm stuck with Outlook WebApp,
> but that's not that bad to use.
You have my sympathies ;)
> 
>>>
>>> Thanks. Jean-Baptiste
>>>
>>> From: Jonathan Cameron <jic23@kernel.org>
>>> Sent: Sunday, May 14, 2017 16:49
>>> To: Jean-Baptiste Maneyrol; linux-iio@vger.kernel.org
>>> Subject: Re: [PATCH] iio: imu: inv_mpu6050: test whoami against invalid values and do it first
>>>        
>>> On 12/05/17 13:45, Jean-Baptiste Maneyrol wrote:
>>>> SPI bus is never generating error during transfer, so a simple way to check
>>>> if a chip is correctly connected on a SPI bus is to check a fixed value like
>>>> whoami against valid values. 0x00 or 0xff can never happened. It is better
>>>> to do this test first since if there is a problem with a DTS and an incorrect
>>>> chip is wired instead, a write can be more damaging than a read.
>>>>
>>>> Signed-off-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
>>> Hmm. I'd a little unsure on this one.  If we start getting into the
>>> general game of protecting against every wrong DTS it may be a slippery
>>> slope.
>>>
>>> Is there an actual platform out there that you know of that this will
>>> protect?  If so I can probably be persuaded.
>>>
>>> If not I would actually prefer if we checked against the specified ID
>>> rather than relying on a different chip producing either high or low
>>> consistently when hit with this query.
>>>
>>> So perhaps make the ID check a failure if it doesn't match any of the
>>> supported parts?  Bit of a pain for new devices as they won't work
>>> immediately but conversely protects them against issues due to incorrect
>>> identification as well.
>>>
>>> Jonathan
>>>
>>>> ---
>>>       drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 19 ++++++++++++-------
>>>       1 file changed, 12 insertions(+), 7 deletions(-)
>>>
>>> diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
>>> index 96dabbd..42fb135 100644
>>> --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
>>> +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
>>> @@ -774,23 +774,28 @@ static int inv_check_and_setup_chip(struct inv_mpu6050_state *st)
>>>            st->hw  = &hw_info[st->chip_type];
>>>            st->reg = hw_info[st->chip_type].reg;
>>>       
>>> -     /* reset to make sure previous state are not there */
>>> -     result = regmap_write(st->map, st->reg->pwr_mgmt_1,
>>> -                           INV_MPU6050_BIT_H_RESET);
>>> -     if (result)
>>> -             return result;
>>> -     msleep(INV_MPU6050_POWER_UP_TIME);
>>> -
>>>            /* check chip self-identification */
>>>            result = regmap_read(st->map, INV_MPU6050_REG_WHOAMI, &regval);
>>>            if (result)
>>>                    return result;
>>>            if (regval != st->hw->whoami) {
>>> +             if (regval == 0x00 || regval == 0xff) {
>>> +                     dev_err(regmap_get_device(st->map),
>>> +                                     "invalid whoami probably io error\n");
>>> +                     return -EIO;
>>> +             }
>>>                    dev_warn(regmap_get_device(st->map),
>>>                                    "whoami mismatch got %#02x expected %#02hhx for %s\n",
>>>                                    regval, st->hw->whoami, st->hw->name);
>>>            }
>>>       
>>> +     /* reset to make sure previous state are not there */
>>> +     result = regmap_write(st->map, st->reg->pwr_mgmt_1,
>>> +                           INV_MPU6050_BIT_H_RESET);
>>> +     if (result)
>>> +             return result;
>>> +     msleep(INV_MPU6050_POWER_UP_TIME);
>>> +
>>>            /*
>>>             * toggle power state. After reset, the sleep bit could be on
>>>             * or off depending on the OTP settings. Toggling power would
>>>
>>
>>        
>>
> 
>      
> 


      reply	other threads:[~2017-05-21 11:43 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-12 12:45 [PATCH] iio: imu: inv_mpu6050: test whoami against invalid values and do it first Jean-Baptiste Maneyrol
2017-05-14 14:49 ` Jonathan Cameron
2017-05-15  8:42   ` Jean-Baptiste Maneyrol
2017-05-16 18:06     ` Jonathan Cameron
2017-05-17 15:03       ` Jean-Baptiste Maneyrol
2017-05-21 11:43         ` Jonathan Cameron [this message]

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=dfb943f0-a26f-fa77-9355-a887c9928d3e@kernel.org \
    --to=jic23@kernel.org \
    --cc=JManeyrol@invensense.com \
    --cc=linux-iio@vger.kernel.org \
    /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).