On Mon, Apr 11, 2016 at 05:28:39PM +0200, Jan Glauber wrote: > From: David Daney <ddaney@xxxxxxxxxxxxxxxxxx> > > Use High-Level Controller (HLC) when possible. The HLC can read/write > up to 8 bytes and is completely optional. The most important difference > of the HLC is that it only requires one interrupt for a transfer > (up to 8 bytes) where the low-level read/write requires 2 interrupts > plus one interrupt per transferred byte. Since the interrupts are costly > using the HLC improves the performance. Also, the HLC provides improved error > handling. Much better description, thanks! > + while (1) { > + val = octeon_i2c_ctl_read(i2c); > + if (!(val & (TWSI_CTL_STA | TWSI_CTL_STP))); > + break; > + > + /* clear IFLG event */ > + if (val & TWSI_CTL_IFLG) > + octeon_i2c_ctl_write(i2c, TWSI_CTL_ENAB); > + > + if (try++ > 100) { > + pr_err("%s: giving up\n", __func__); > + break; > + } > + > + /* spin until any start/stop has finished */ > + udelay(10); > + } Maybe you can use one of the readx_poll_timeout() functions? > +/** > + * octeon_i2c_hlc_wait - wait for an HLC operation to complete > + * @i2c: The struct octeon_i2c > + * > + * Returns 0 on success, otherwise a negative errno. > + */ > +static int octeon_i2c_hlc_wait(struct octeon_i2c *i2c) > +{ > + int time_left; > + > + octeon_i2c_hlc_int_enable(i2c); > + time_left = wait_event_interruptible_timeout(i2c->queue, > + octeon_i2c_hlc_test_ready(i2c), > + i2c->adap.timeout); Have you tested signal handling thoroughly? Most driver dropped the _interruptible after a while. Mostly they found out that the state machine of the interrupt handler couldn't gracefully deal with it and nobody really needed the interruptible. Just saying. > + octeon_i2c_int_disable(i2c); > + if (!time_left) { > + octeon_i2c_hlc_int_clear(i2c); > + dev_dbg(i2c->dev, "%s: timeout\n", __func__); > + return -ETIMEDOUT; > + } > + > + if (time_left < 0) { > + dev_dbg(i2c->dev, "%s: wait interrupted\n", __func__); > + return time_left; > + } > + return 0; > +} Drop the debug messages? I can't say much about the HW details, of course. Didn't spot anything suspicious there.
Attachment:
signature.asc
Description: PGP signature