On Mon, Apr 11, 2016 at 05:28:39PM +0200, Jan Glauber wrote:[...]
+ */
+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.