linux-i2c.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Uwe Kleine-König" <u.kleine-koenig-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
To: Wolfram Sang <w.sang-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
Cc: Viresh Kumar
	<viresh.kumar-QSEj5FYQhm4dnm+yROfE0A@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,
	paul-YHLC2tV1sDlxR4N9A70vTlRxknfHcPLb9dF7HbQ/qKg@public.gmane.org
Subject: Re: [PATCH V8 1/2] i2c/adapter: Add bus recovery infrastructure
Date: Thu, 24 Jan 2013 11:54:38 +0100	[thread overview]
Message-ID: <20130124105438.GB8668@pengutronix.de> (raw)
In-Reply-To: <20130124072445.GA8364-8EAEigeeuNG034pCzgS/Qg7AFbiQbgqx@public.gmane.org>

On Thu, Jan 24, 2013 at 08:24:45AM +0100, Wolfram Sang wrote:
> Hi Viresh,
> 
> I think we are getting close.
> 
> On Mon, Dec 03, 2012 at 08:24:04AM +0530, 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
> > 
> > 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.
> > 
> > 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.
> 
> Assuming that recover_bus is not called on BUS_BUSY but on TIMEOUTs,,
> this should work?
How do you differentiate these two? You're machine boots and sees sda
being low. How long should it wait for action on sda or scl until it can
diagnose a timeout?

If the current code is operated on a multi-master bus and the bus is
busy various things can happen. At least without sda polling the current
transaction could be modified and completed. Not sure if that can happen
with sda polling.

Some more comments below.

> > +static int i2c_generic_recovery(struct i2c_adapter *adap)
> > +{
> > +	struct i2c_bus_recovery_info *bri = adap->bus_recovery_info;
> > +	int i, val = 0;
> > +
> > +	if (bri->prepare_recovery)
> > +		bri->prepare_recovery(bri);
> 
> prepare_recovery and unprepare should be in i2c_generic_scl_recovery and
> i2c_generic_gpio_recovery since they are probably needed to turn SDA/SCL
> into GPIOs and back. We want that before the gpio_get/put routines.
> 
> > +
> > +	/* SCL shouldn't be low here */
> > +	if (!bri->get_scl(adap)) {
> > +		dev_err(&adap->dev, "SCL is stuck Low, exiting recovery.\n");
> 
> returning -EBUSY?
> 
> > +		goto unprepare;
> > +	}
> > +
> > +	/*
> > +	 * By this time SCL is high, as we need to give 9 falling-rising edges
> > +	 */
> > +	for (i = 0; i < RECOVERY_CLK_CNT * 2; i++, val = !val) {
> > +		bri->set_scl(adap, val);
> > +		ndelay(clk_delay);
> > +
> > +		/* break if sda got high, check only when scl line is high */
> > +		if (!bri->skip_sda_polling && val)
> 
> * if (val && bri->get_sda)
> 
> > +			/* Check SCL again to see fault condition */
> > +			if (!bri->get_scl(adap)) {
> > +				dev_err(&adap->dev, "SCL is stuck Low during recovery, exiting recovery.\n");
> 
> returning -EBUSY?
> This scl check should not depend on skip_sda_polling, or?
Well right. But note this might also just be a slave doing clock
streching.

> > +				goto unprepare;
> > +			}
> > +
> > +			if (bri->get_sda(adap))
> > +				break;
Indention suggests that you want this in the body of the if (val &&
bri->get_sda). Unfortunately the C-Compiler won't notice without braces.

> Checking SDA should be done before setting SCL? That would
> 
> a) let us escape early if SDA got HIGH magically somehow until we enter
>    the for loop for the first time
> b) breaking out of the for loop after the last pulse is moot
You mean:

	val = 0;

	for (i = 0; i < RECOVERY_CLK_CNT * 2; i++, val = !val) {
		if (!val && !bri->get_scl(adap))
				scl stuck low (or wait a bit to sort out clock streching)
		if (bri->get_sda && bri->get_sda(adap))
			break;

		bri->set_scl(adap, val);
		ndelay(clk_delay);
	}

Looks ok I think. This would also get rid of the seperate scl check
before the loop.

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

  parent reply	other threads:[~2013-01-24 10:54 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-03  2:54 [PATCH V8 1/2] i2c/adapter: Add bus recovery infrastructure Viresh Kumar
     [not found] ` <547205b4f54e6b48746efc7c22ccc0a59bd9b659.1354502924.git.viresh.kumar-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2012-12-03  2:54   ` [PATCH V8 2/2] i2c/designware: Provide i2c bus recovery support Viresh Kumar
     [not found]     ` <7f319334237d8cfad4e6d29499d7424c3e739608.1354502924.git.viresh.kumar-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2013-01-24  7:24       ` Wolfram Sang
     [not found]         ` <20130124072456.GB8364-8EAEigeeuNG034pCzgS/Qg7AFbiQbgqx@public.gmane.org>
2013-01-24  7:55           ` Viresh Kumar
2012-12-06  2:07   ` [PATCH V8 1/2] i2c/adapter: Add bus recovery infrastructure Viresh Kumar
     [not found]     ` <CAKohpokjxh0DDZVFy1uN7ejdd_=jkbyVvYCy73jJChMy5dKeGA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-12-06 15:58       ` Paul Carpenter
     [not found]         ` <50C0C08E.4060807-YHLC2tV1sDlxR4N9A70vTlRxknfHcPLb9dF7HbQ/qKg@public.gmane.org>
2012-12-06 16:01           ` Viresh Kumar
2012-12-06 20:30       ` Paul Carpenter
     [not found]         ` <50C1005B.7-YHLC2tV1sDlxR4N9A70vTlRxknfHcPLb9dF7HbQ/qKg@public.gmane.org>
2012-12-11  4:52           ` Viresh Kumar
     [not found]             ` <CAKohpo=4xDOQMcbraq9Hj1Gq1xOgSoDj9xoYLHcosTyUJkD6fg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-12-19  0:00               ` Wolfram Sang
     [not found]                 ` <20121219000000.GC19157-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2012-12-19  1:16                   ` Paul Carpenter
2012-12-20  9:17                   ` Viresh Kumar
     [not found]                     ` <CAKohponZSSyAGnayRXLOBRZ+AgfB1ut3MLyvHSOTQMPTeU-uxA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-01-07 10:32                       ` Viresh Kumar
     [not found]                         ` <CAKohpo=1BfLScbqk-Mt_kA62pP1+EKUxCkSRbKvLfiXhGyvz5A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-01-23 15:44                           ` Viresh Kumar
2013-01-24  7:24   ` Wolfram Sang
     [not found]     ` <20130124072445.GA8364-8EAEigeeuNG034pCzgS/Qg7AFbiQbgqx@public.gmane.org>
2013-01-24  8:47       ` Viresh Kumar
     [not found]         ` <CAKohpo=HhdsVRqzGN87yUSz3rEn-3MHEh3rM0-XJJgcX19kXUg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-01-25  8:50           ` Wolfram Sang
     [not found]             ` <20130125085012.GB5684-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2013-01-25  8:54               ` Viresh Kumar
     [not found]                 ` <CAKohpokBLyJ8PEO6vP-LPt4rj4CkmyBWJ0s9TKiGhKOTEcfywA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-01-25  8:59                   ` Wolfram Sang
2013-01-24 10:54       ` Uwe Kleine-König [this message]
     [not found]         ` <20130124105438.GB8668-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2013-01-24 11:00           ` Viresh Kumar
2013-01-25  8:53           ` Wolfram Sang
     [not found]             ` <20130125085337.GC5684-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2013-01-25  9:04               ` Uwe Kleine-König
     [not found]                 ` <20130125090447.GG8668-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2013-01-25  9:23                   ` 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=20130124105438.GB8668@pengutronix.de \
    --to=u.kleine-koenig-bicnvbalz9megne8c9+irq@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=paul-YHLC2tV1sDlxR4N9A70vTlRxknfHcPLb9dF7HbQ/qKg@public.gmane.org \
    --cc=spear-devel-nkJGhpqTU55BDgjK7y7TUQ@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 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).