All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jarkko Nikula <jarkko.nikula@linux.intel.com>
To: Jan Kiszka <jan.kiszka@siemens.com>,
	Ard Biesheuvel <ard.biesheuvel@linaro.org>,
	Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	mika.westerberg@linux.intel.com, wsa@the-dreams.de,
	linux-i2c@vger.kernel.org,
	Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: "linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH] i2c: designware: don't infer timings described by ACPI from clock rate
Date: Mon, 22 May 2017 09:35:24 +0300	[thread overview]
Message-ID: <a254b8bf-cbca-599a-2986-6775fbadb79c@linux.intel.com> (raw)
In-Reply-To: <62548890-2541-32b2-2015-74b5ed40f115@siemens.com>

On 05/22/2017 08:44 AM, Jan Kiszka wrote:
> On 2017-05-21 10:09, Ard Biesheuvel wrote:
>> On 19 May 2017 at 09:56, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
>>> Commit bd698d24b1b57 ("i2c: designware: Get selected speed mode
>>> sda-hold-time via ACPI") updated the logic that reads the timing
>>> parameters for various I2C bus rates from the DSDT, to only read
>>> the timing parameters for the currently selected mode.
>>>
>>> This causes a WARN_ON() splat on platforms that legally omit the clock
>>> frequency from the ACPI description, because in the new situation, the
>>> core I2C designware driver still accesses the fields in the driver
>>> struct that we no longer populate, and proceeds to calculate them from
>>> the clock frequency. Since the clock frequency is unspecified, the
>>> driver complains loudly using a WARN_ON().
>>>
>>> So revert back to the old situation, where the struct fields for all
>>> timings are populated, but retain the new logic which chooses the SDA
>>> hold time from the timing mode that is currently in use.
>>>
>>> Fixes: bd698d24b1b57 ("i2c: designware: Get selected speed mode ...")
>>> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>>> ---
>>>  drivers/i2c/busses/i2c-designware-platdrv.c | 18 ++++++++++--------
>>>  1 file changed, 10 insertions(+), 8 deletions(-)
>>>
>>> diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
>>> index f2acd4b6bf01..6283b99d2b17 100644
>>> --- a/drivers/i2c/busses/i2c-designware-platdrv.c
>>> +++ b/drivers/i2c/busses/i2c-designware-platdrv.c
>>> @@ -96,6 +96,7 @@ static int dw_i2c_acpi_configure(struct platform_device *pdev)
>>>         struct dw_i2c_dev *dev = platform_get_drvdata(pdev);
>>>         acpi_handle handle = ACPI_HANDLE(&pdev->dev);
>>>         const struct acpi_device_id *id;
>>> +       u32 ss_ht, fp_ht, hs_ht, fs_ht;
>>
>> Should these be initialized to zero? I realized that
>> dw_i2c_acpi_params() could fail, resulting in bogus hold time values
>> being returnted, but it is unclear to me how that affects the logic in
>> the core driver.
>
Oh, indeed, great you found this quickly and we got also report and fix 
quickly from Jan. In bad case this could have been difficult to bisect.

> I can tell you what happens: this breaks e.g. the Galileo and the
> IOT2000 boards. Will send a patch to initialize the vars to 0, restoring
> the previous behavior in the absence to the ACPI parameters. The core is
> prepared for sda_hold_time == 0.
>
Yes, i2c-designware-core.c will read the hold time from HW set by 
bootloader or the reset default when dev->sda_hold_time is zero.

-- 
Jarkko

WARNING: multiple messages have this Message-ID (diff)
From: jarkko.nikula@linux.intel.com (Jarkko Nikula)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] i2c: designware: don't infer timings described by ACPI from clock rate
Date: Mon, 22 May 2017 09:35:24 +0300	[thread overview]
Message-ID: <a254b8bf-cbca-599a-2986-6775fbadb79c@linux.intel.com> (raw)
In-Reply-To: <62548890-2541-32b2-2015-74b5ed40f115@siemens.com>

On 05/22/2017 08:44 AM, Jan Kiszka wrote:
> On 2017-05-21 10:09, Ard Biesheuvel wrote:
>> On 19 May 2017 at 09:56, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
>>> Commit bd698d24b1b57 ("i2c: designware: Get selected speed mode
>>> sda-hold-time via ACPI") updated the logic that reads the timing
>>> parameters for various I2C bus rates from the DSDT, to only read
>>> the timing parameters for the currently selected mode.
>>>
>>> This causes a WARN_ON() splat on platforms that legally omit the clock
>>> frequency from the ACPI description, because in the new situation, the
>>> core I2C designware driver still accesses the fields in the driver
>>> struct that we no longer populate, and proceeds to calculate them from
>>> the clock frequency. Since the clock frequency is unspecified, the
>>> driver complains loudly using a WARN_ON().
>>>
>>> So revert back to the old situation, where the struct fields for all
>>> timings are populated, but retain the new logic which chooses the SDA
>>> hold time from the timing mode that is currently in use.
>>>
>>> Fixes: bd698d24b1b57 ("i2c: designware: Get selected speed mode ...")
>>> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>>> ---
>>>  drivers/i2c/busses/i2c-designware-platdrv.c | 18 ++++++++++--------
>>>  1 file changed, 10 insertions(+), 8 deletions(-)
>>>
>>> diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
>>> index f2acd4b6bf01..6283b99d2b17 100644
>>> --- a/drivers/i2c/busses/i2c-designware-platdrv.c
>>> +++ b/drivers/i2c/busses/i2c-designware-platdrv.c
>>> @@ -96,6 +96,7 @@ static int dw_i2c_acpi_configure(struct platform_device *pdev)
>>>         struct dw_i2c_dev *dev = platform_get_drvdata(pdev);
>>>         acpi_handle handle = ACPI_HANDLE(&pdev->dev);
>>>         const struct acpi_device_id *id;
>>> +       u32 ss_ht, fp_ht, hs_ht, fs_ht;
>>
>> Should these be initialized to zero? I realized that
>> dw_i2c_acpi_params() could fail, resulting in bogus hold time values
>> being returnted, but it is unclear to me how that affects the logic in
>> the core driver.
>
Oh, indeed, great you found this quickly and we got also report and fix 
quickly from Jan. In bad case this could have been difficult to bisect.

> I can tell you what happens: this breaks e.g. the Galileo and the
> IOT2000 boards. Will send a patch to initialize the vars to 0, restoring
> the previous behavior in the absence to the ACPI parameters. The core is
> prepared for sda_hold_time == 0.
>
Yes, i2c-designware-core.c will read the hold time from HW set by 
bootloader or the reset default when dev->sda_hold_time is zero.

-- 
Jarkko

  reply	other threads:[~2017-05-22  6:37 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-19  8:56 [PATCH] i2c: designware: don't infer timings described by ACPI from clock rate Ard Biesheuvel
2017-05-19  8:56 ` Ard Biesheuvel
2017-05-19 10:01 ` Jarkko Nikula
2017-05-19 10:01   ` Jarkko Nikula
2017-05-19 10:06   ` Ard Biesheuvel
2017-05-19 10:06     ` Ard Biesheuvel
2017-05-19 10:37     ` Jarkko Nikula
2017-05-19 10:37       ` Jarkko Nikula
2017-05-19 10:48       ` Ard Biesheuvel
2017-05-19 10:48         ` Ard Biesheuvel
2017-05-19 12:38 ` Wolfram Sang
2017-05-19 12:38   ` Wolfram Sang
2017-05-21  8:09 ` Ard Biesheuvel
2017-05-21  8:09   ` Ard Biesheuvel
2017-05-22  5:44   ` Jan Kiszka
2017-05-22  5:44     ` Jan Kiszka
2017-05-22  6:35     ` Jarkko Nikula [this message]
2017-05-22  6:35       ` Jarkko Nikula
2017-05-22  5:46   ` [PATCH] i2c: designware: Fix bogus sda_hold_time due to uninitialized vars Jan Kiszka
2017-05-22  5:46     ` Jan Kiszka
2017-05-22  5:46     ` Jan Kiszka
2017-05-22  6:02     ` Ard Biesheuvel
2017-05-22  6:02       ` Ard Biesheuvel
2017-05-22  6:37     ` Jarkko Nikula
2017-05-22  6:37       ` Jarkko Nikula
2017-05-22  8:36     ` Wolfram Sang
2017-05-22  8:36       ` Wolfram Sang

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=a254b8bf-cbca-599a-2986-6775fbadb79c@linux.intel.com \
    --to=jarkko.nikula@linux.intel.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=ard.biesheuvel@linaro.org \
    --cc=jan.kiszka@siemens.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-i2c@vger.kernel.org \
    --cc=lorenzo.pieralisi@arm.com \
    --cc=mika.westerberg@linux.intel.com \
    --cc=wsa@the-dreams.de \
    /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.