From: Paul Carpenter <paul-YHLC2tV1sDlxR4N9A70vTlRxknfHcPLb9dF7HbQ/qKg@public.gmane.org>
To: Viresh Kumar <viresh.kumar-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
Cc: w.sang-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org,
u.kleine-koenig-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org,
khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org,
ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org,
linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
spear-devel-nkJGhpqTU55BDgjK7y7TUQ@public.gmane.org
Subject: Re: [PATCH V7 1/2] i2c/adapter: Add bus recovery infrastructure
Date: Sun, 25 Nov 2012 11:52:16 +0000 [thread overview]
Message-ID: <50B20670.5070509@pcserviceselectronics.co.uk> (raw)
In-Reply-To: <71e27515a050a2c7d18272b84ff7ec3ec8b11cae.1353824555.git.viresh.kumar-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
Viresh Kumar wrote:
> Add i2c bus recovery infrastructure to i2c adapters as specified in
the i2c
> protocol Rev. 03 section 3.1.16 titled "Bus clear".
>
> http://www.nxp.com/documents/user_manual/UM10204.pdf
You should also take note of section 3.1.14 and its notes on Software
Reset -
"Precautions must be taken to ensure that a device is not
pulling down the SDA or SCL line after applying the supply
voltage, since these low levels would block the bus"
> Sometimes during operation i2c bus hangs and we need to give dummy
clocks to
> slave device to start the transfer again. Now we may have capability
in the bus
> controller to generate these clocks or platform may have gpio pins
which can be
> toggled to generate dummy clocks. This patch supports both.
I may have missed it but misses an I2C check step, but that could be
because I do so much embedded and hardware side as well.
> This patch also adds in generic bus recovery routines gpio or scl
line based
> which can be used by bus controller. In addition controller driver
may provide
> its own version of the bus recovery routine.
>
> This doesn't support multi-master recovery for now.
>
> Signed-off-by: Viresh Kumar <viresh.kumar-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
> ---
>
> Hi Wolfram,
>
> I am sending V7 before closing our comments completely on V6 (Very
few are left
> now :) ), so that you can get an idea of what i am implementing now. It
> incorporates all your comments leaving:
.....
> +static int i2c_get_gpios_for_recovery(struct i2c_adapter *adap)
> +{
> + struct i2c_bus_recovery_info *bri = adap->bus_recovery_info;
> + struct device *dev = &adap->dev;
> + int ret = 0;
Where is the check that SCL is NOT low (bus fault or device doing clock
stretching)
> + ret = gpio_request_one(bri->scl_gpio, GPIOF_OPEN_DRAIN |
> + GPIOF_OUT_INIT_HIGH, "i2c-scl");
I always get wary of people driving I2C with non-open-drain, especially
with stuck busses
> + if (ret) {
> + dev_warn(dev, "gpio request fail: %d\n", bri->scl_gpio);
> + return ret;
> + }
> +
> + if (!bri->skip_sda_polling) {
> + if (gpio_request_one(bri->sda_gpio, GPIOF_IN, "i2c-sda")) {
> + /* work without sda polling */
> + dev_warn(dev, "can't get sda: %d. Skip sda polling\n",
> + bri->sda_gpio);
> + bri->skip_sda_polling = true;
> + }
> + }
> +
> + return ret;
> +}
.....
> +static int i2c_generic_recovery(struct i2c_adapter *adap)
> +{
> + struct i2c_bus_recovery_info *bri = adap->bus_recovery_info;
> + unsigned long delay = 1000000; /* 106/KHz for delay in ns */
> + int i, val = 0;
> +
> + if (bri->prepare_recovery)
> + bri->prepare_recovery(bri);
> +
> + /*
> + * By this time SCL is high, as we need to give 9 falling-rising
edges
> + */
In my view that needs to be done by an actual check of the real SCL not
assumption.
> + delay = DIV_ROUND_UP(delay, bri->clock_rate_khz * 2);
> +
> + for (i = 0; i < RECOVERY_CLK_CNT * 2; i++, val = !val) {
> + bri->set_scl(adap, val);
> + ndelay(delay);
> +
> + /* break if sda got high, check only when scl line is high */
> + if (!bri->skip_sda_polling && val)
Dont use 'val' read the actual SCL line which ensures you you are not
wasting your time because of hardware fault. Possibly saving your GPIO
from being stuck permanently.
> + if (unlikely(bri->get_sda(adap)))
> + break;
> + }
> +
> + if (bri->unprepare_recovery)
> + bri->unprepare_recovery(bri);
> +
> + return 0;
> +}
--
Paul Carpenter | paul-YHLC2tV1sDlxR4N9A70vTlRxknfHcPLb9dF7HbQ/qKg@public.gmane.org
<http://www.pcserviceselectronics.co.uk/> PC Services
<http://www.pcserviceselectronics.co.uk/fonts/> Timing Diagram Font
<http://www.gnuh8.org.uk/> GNU H8 - compiler & Renesas H8/H8S/H8 Tiny
<http://www.badweb.org.uk/> For those web sites you hate
next prev parent reply other threads:[~2012-11-25 11:52 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-25 6:31 [PATCH V7 1/2] i2c/adapter: Add bus recovery infrastructure Viresh Kumar
[not found] ` <71e27515a050a2c7d18272b84ff7ec3ec8b11cae.1353824555.git.viresh.kumar-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2012-11-25 6:31 ` [PATCH V7 2/2] i2c/designware: Provide i2c bus recovery support Viresh Kumar
2012-11-25 11:52 ` Paul Carpenter [this message]
[not found] ` <50B20670.5070509-YHLC2tV1sDlxR4N9A70vTlRxknfHcPLb9dF7HbQ/qKg@public.gmane.org>
2012-11-26 2:28 ` [PATCH V7 1/2] i2c/adapter: Add bus recovery infrastructure Viresh Kumar
[not found] ` <CAKohpo=_2xwj+NCpZPB1EsWiGPLafc3XKVbRT+690AkHB76AWw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-11-26 11:45 ` Paul Carpenter
[not found] ` <50B35642.7030104-YHLC2tV1sDlxR4N9A70vTlRxknfHcPLb9dF7HbQ/qKg@public.gmane.org>
2012-11-26 12:51 ` Viresh Kumar
[not found] ` <CAKohpomNTKFJQCrZdC81OiQpjdtK85XXWfvvB=XYb85e49OBZA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-11-26 13:28 ` Paul Carpenter
[not found] ` <50B36E76.6010008-YHLC2tV1sDlxR4N9A70vTlRxknfHcPLb9dF7HbQ/qKg@public.gmane.org>
2012-11-26 14:51 ` Viresh Kumar
2012-11-26 20:20 ` Uwe Kleine-König
[not found] ` <20121126202003.GA3384-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2012-11-26 23:00 ` Paul Carpenter
2012-11-27 5:49 ` Viresh Kumar
[not found] ` <CAKohpokgcvaSHNDoN2epnsxSmpKJ6GaWph0EW+rrkCfXjBrUyA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-11-30 14:05 ` 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=50B20670.5070509@pcserviceselectronics.co.uk \
--to=paul-yhlc2tv1sdlxr4n9a70vtlrxknfhcplb9df7hbq/qkg@public.gmane.org \
--cc=ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org \
--cc=khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org \
--cc=linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=spear-devel-nkJGhpqTU55BDgjK7y7TUQ@public.gmane.org \
--cc=u.kleine-koenig-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org \
--cc=viresh.kumar-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
--cc=w.sang-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.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 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.