Thanks for that, it worked fine now. > -----Original Message----- > From: David Brownell [mailto:david-b@xxxxxxxxxxx] > Sent: Tuesday, October 07, 2008 1:29 PM > To: Aguirre Rodriguez, Sergio Alberto > Cc: linux-omap@xxxxxxxxxxxxxxx > Subject: Re: kernel oops for 3430sdp > > On Tuesday 07 October 2008, Aguirre Rodriguez, Sergio Alberto wrote: > > <1>Unable to handle kernel NULL pointer dereference at virtual address > 00000000 > > Did you try with the hack I've sent, to work around one problematic > (and surprisingly reproducible!) i2c-omap timeout? Appended. > > Given I2C faults, many things blow up rudely ... hardly any I2C > drivers are written to tolerate transfer errors. Not entirely > unreasonably, since such errors are otherwise quite rare. > > > I currently suspect there's an issue where the i2c-omap code can > handle a bunch of requests that group closely together ... or are > separated by a lot of time ... but there's some middle ground > where if you wait the "right" amount of time before making the > next request, it times out instead of working correctly. > > I have no proof behind that theory, but it does seem to match up > to a few of the observed facts. Notably that the i2c timeouts > appear when the only device on that bus is the TWL4030, and the > drivers make known-to-be-valid requets ... the timeouts started > to appear only after some trivial changes in init timings, which > were caused by moving code out of drivers/i2c into directories > that are more appropriate. > > - Dave > > > --- > drivers/i2c/chips/twl4030-pwrirq.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > --- a/drivers/i2c/chips/twl4030-pwrirq.c > +++ b/drivers/i2c/chips/twl4030-pwrirq.c > @@ -161,6 +161,8 @@ static int twl4030_pwrirq_thread(void *d > return 0; > } > > +#include <linux/delay.h> > + > static int __init twl4030_pwrirq_init(void) > { > int i, err; > @@ -168,8 +170,16 @@ static int __init twl4030_pwrirq_init(vo > twl4030_pwrirq_mask = 0xff; > twl4030_pwrirq_pending_unmask = 0; > > +/* HEY: core already did this. > + * But that's surely not why we > + * sometimes see timeouts here ... > + */ > +for (i = 0; i < 5; i++) { > err = twl4030_i2c_write_u8(TWL4030_MODULE_INT, twl4030_pwrirq_mask, > TWL4030_INT_PWR_IMR1); > +if (!err) break; > +msleep(10); > +} > if (err) > return err; > > -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html