@@ -331,21 +331,16 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop)
331
331
INIT_COMPLETION (dev -> cmd_complete );
332
332
dev -> cmd_err = 0 ;
333
333
334
- /* Take I2C out of reset, configure it as master and set the
335
- * start bit */
336
- flag = DAVINCI_I2C_MDR_IRS | DAVINCI_I2C_MDR_MST | DAVINCI_I2C_MDR_STT ;
334
+ /* Take I2C out of reset and configure it as master */
335
+ flag = DAVINCI_I2C_MDR_IRS | DAVINCI_I2C_MDR_MST ;
337
336
338
337
/* if the slave address is ten bit address, enable XA bit */
339
338
if (msg -> flags & I2C_M_TEN )
340
339
flag |= DAVINCI_I2C_MDR_XA ;
341
340
if (!(msg -> flags & I2C_M_RD ))
342
341
flag |= DAVINCI_I2C_MDR_TRX ;
343
- if (stop )
344
- flag |= DAVINCI_I2C_MDR_STP ;
345
- if (msg -> len == 0 ) {
342
+ if (msg -> len == 0 )
346
343
flag |= DAVINCI_I2C_MDR_RM ;
347
- flag &= ~DAVINCI_I2C_MDR_STP ;
348
- }
349
344
350
345
/* Enable receive or transmit interrupts */
351
346
w = davinci_i2c_read_reg (dev , DAVINCI_I2C_IMR_REG );
@@ -357,18 +352,29 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop)
357
352
358
353
dev -> terminate = 0 ;
359
354
355
+ /*
356
+ * Write mode register first as needed for correct behaviour
357
+ * on OMAP-L138, but don't set STT yet to avoid a race with XRDY
358
+ * occuring before we have loaded DXR
359
+ */
360
+ davinci_i2c_write_reg (dev , DAVINCI_I2C_MDR_REG , flag );
361
+
360
362
/*
361
363
* First byte should be set here, not after interrupt,
362
364
* because transmit-data-ready interrupt can come before
363
365
* NACK-interrupt during sending of previous message and
364
366
* ICDXR may have wrong data
367
+ * It also saves us one interrupt, slightly faster
365
368
*/
366
369
if ((!(msg -> flags & I2C_M_RD )) && dev -> buf_len ) {
367
370
davinci_i2c_write_reg (dev , DAVINCI_I2C_DXR_REG , * dev -> buf ++ );
368
371
dev -> buf_len -- ;
369
372
}
370
373
371
- /* write the data into mode register; start transmitting */
374
+ /* Set STT to begin transmit now DXR is loaded */
375
+ flag |= DAVINCI_I2C_MDR_STT ;
376
+ if (stop && msg -> len != 0 )
377
+ flag |= DAVINCI_I2C_MDR_STP ;
372
378
davinci_i2c_write_reg (dev , DAVINCI_I2C_MDR_REG , flag );
373
379
374
380
r = wait_for_completion_interruptible_timeout (& dev -> cmd_complete ,
0 commit comments