All of lore.kernel.org
 help / color / mirror / Atom feed
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

  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.