mirror of https://gitee.com/openkylin/linux.git
Merge branch 'i2c-for-linus' of git://jdelvare.pck.nerim.net/jdelvare-2.6
* 'i2c-for-linus' of git://jdelvare.pck.nerim.net/jdelvare-2.6: i2c-algo-pca: Let PCA9564 recover from unacked data byte (state 0x30) i2c-algo-bit: Fix timeout test i2c: Timeouts off by 1
This commit is contained in:
commit
f328ddc154
|
@ -104,7 +104,7 @@ static int sclhi(struct i2c_algo_bit_data *adap)
|
|||
* chips may hold it low ("clock stretching") while they
|
||||
* are processing data internally.
|
||||
*/
|
||||
if (time_after_eq(jiffies, start + adap->timeout))
|
||||
if (time_after(jiffies, start + adap->timeout))
|
||||
return -ETIMEDOUT;
|
||||
cond_resched();
|
||||
}
|
||||
|
|
|
@ -287,10 +287,21 @@ static int pca_xfer(struct i2c_adapter *i2c_adap,
|
|||
|
||||
case 0x30: /* Data byte in I2CDAT has been transmitted; NOT ACK has been received */
|
||||
DEB2("NOT ACK received after data byte\n");
|
||||
pca_stop(adap);
|
||||
goto out;
|
||||
|
||||
case 0x38: /* Arbitration lost during SLA+W, SLA+R or data bytes */
|
||||
DEB2("Arbitration lost\n");
|
||||
/*
|
||||
* The PCA9564 data sheet (2006-09-01) says "A
|
||||
* START condition will be transmitted when the
|
||||
* bus becomes free (STOP or SCL and SDA high)"
|
||||
* when the STA bit is set (p. 11).
|
||||
*
|
||||
* In case this won't work, try pca_reset()
|
||||
* instead.
|
||||
*/
|
||||
pca_start(adap);
|
||||
goto out;
|
||||
|
||||
case 0x58: /* Data byte has been received; NOT ACK has been returned */
|
||||
|
|
|
@ -284,7 +284,7 @@ static int ali1535_transaction(struct i2c_adapter *adap)
|
|||
&& (timeout++ < MAX_TIMEOUT));
|
||||
|
||||
/* If the SMBus is still busy, we give up */
|
||||
if (timeout >= MAX_TIMEOUT) {
|
||||
if (timeout > MAX_TIMEOUT) {
|
||||
result = -ETIMEDOUT;
|
||||
dev_err(&adap->dev, "SMBus Timeout!\n");
|
||||
}
|
||||
|
|
|
@ -306,7 +306,7 @@ static int ali15x3_transaction(struct i2c_adapter *adap)
|
|||
&& (timeout++ < MAX_TIMEOUT));
|
||||
|
||||
/* If the SMBus is still busy, we give up */
|
||||
if (timeout >= MAX_TIMEOUT) {
|
||||
if (timeout > MAX_TIMEOUT) {
|
||||
result = -ETIMEDOUT;
|
||||
dev_err(&adap->dev, "SMBus Timeout!\n");
|
||||
}
|
||||
|
|
|
@ -126,7 +126,7 @@ static int amd756_transaction(struct i2c_adapter *adap)
|
|||
} while ((temp & (GS_HST_STS | GS_SMB_STS)) &&
|
||||
(timeout++ < MAX_TIMEOUT));
|
||||
/* If the SMBus is still busy, we give up */
|
||||
if (timeout >= MAX_TIMEOUT) {
|
||||
if (timeout > MAX_TIMEOUT) {
|
||||
dev_dbg(&adap->dev, "Busy wait timeout (%04x)\n", temp);
|
||||
goto abort;
|
||||
}
|
||||
|
@ -143,7 +143,7 @@ static int amd756_transaction(struct i2c_adapter *adap)
|
|||
} while ((temp & GS_HST_STS) && (timeout++ < MAX_TIMEOUT));
|
||||
|
||||
/* If the SMBus is still busy, we give up */
|
||||
if (timeout >= MAX_TIMEOUT) {
|
||||
if (timeout > MAX_TIMEOUT) {
|
||||
dev_dbg(&adap->dev, "Completion timeout!\n");
|
||||
goto abort;
|
||||
}
|
||||
|
|
|
@ -237,7 +237,7 @@ static int i801_transaction(int xact)
|
|||
status = inb_p(SMBHSTSTS);
|
||||
} while ((status & SMBHSTSTS_HOST_BUSY) && (timeout++ < MAX_TIMEOUT));
|
||||
|
||||
result = i801_check_post(status, timeout >= MAX_TIMEOUT);
|
||||
result = i801_check_post(status, timeout > MAX_TIMEOUT);
|
||||
if (result < 0)
|
||||
return result;
|
||||
|
||||
|
@ -257,9 +257,9 @@ static void i801_wait_hwpec(void)
|
|||
} while ((!(status & SMBHSTSTS_INTR))
|
||||
&& (timeout++ < MAX_TIMEOUT));
|
||||
|
||||
if (timeout >= MAX_TIMEOUT) {
|
||||
if (timeout > MAX_TIMEOUT)
|
||||
dev_dbg(&I801_dev->dev, "PEC Timeout!\n");
|
||||
}
|
||||
|
||||
outb_p(status, SMBHSTSTS);
|
||||
}
|
||||
|
||||
|
@ -344,7 +344,7 @@ static int i801_block_transaction_byte_by_byte(union i2c_smbus_data *data,
|
|||
while ((!(status & SMBHSTSTS_BYTE_DONE))
|
||||
&& (timeout++ < MAX_TIMEOUT));
|
||||
|
||||
result = i801_check_post(status, timeout >= MAX_TIMEOUT);
|
||||
result = i801_check_post(status, timeout > MAX_TIMEOUT);
|
||||
if (result < 0)
|
||||
return result;
|
||||
|
||||
|
|
|
@ -112,7 +112,7 @@ static int sch_transaction(void)
|
|||
} while ((temp & 0x08) && (timeout++ < MAX_TIMEOUT));
|
||||
|
||||
/* If the SMBus is still busy, we give up */
|
||||
if (timeout >= MAX_TIMEOUT) {
|
||||
if (timeout > MAX_TIMEOUT) {
|
||||
dev_err(&sch_adapter.dev, "SMBus Timeout!\n");
|
||||
result = -ETIMEDOUT;
|
||||
}
|
||||
|
|
|
@ -173,7 +173,7 @@ static int nforce2_check_status(struct i2c_adapter *adap)
|
|||
temp = inb_p(NVIDIA_SMB_STS);
|
||||
} while ((!temp) && (timeout++ < MAX_TIMEOUT));
|
||||
|
||||
if (timeout >= MAX_TIMEOUT) {
|
||||
if (timeout > MAX_TIMEOUT) {
|
||||
dev_dbg(&adap->dev, "SMBus Timeout!\n");
|
||||
if (smbus->can_abort)
|
||||
nforce2_abort(adap);
|
||||
|
|
|
@ -256,7 +256,7 @@ static int sis5595_transaction(struct i2c_adapter *adap)
|
|||
} while (!(temp & 0x40) && (timeout++ < MAX_TIMEOUT));
|
||||
|
||||
/* If the SMBus is still busy, we give up */
|
||||
if (timeout >= MAX_TIMEOUT) {
|
||||
if (timeout > MAX_TIMEOUT) {
|
||||
dev_dbg(&adap->dev, "SMBus Timeout!\n");
|
||||
result = -ETIMEDOUT;
|
||||
}
|
||||
|
|
|
@ -173,7 +173,7 @@ static int sis630_transaction_wait(struct i2c_adapter *adap, int size)
|
|||
} while (!(temp & 0x0e) && (timeout++ < MAX_TIMEOUT));
|
||||
|
||||
/* If the SMBus is still busy, we give up */
|
||||
if (timeout >= MAX_TIMEOUT) {
|
||||
if (timeout > MAX_TIMEOUT) {
|
||||
dev_dbg(&adap->dev, "SMBus Timeout!\n");
|
||||
result = -ETIMEDOUT;
|
||||
}
|
||||
|
|
|
@ -132,7 +132,7 @@ static int sis96x_transaction(int size)
|
|||
} while (!(temp & 0x0e) && (timeout++ < MAX_TIMEOUT));
|
||||
|
||||
/* If the SMBus is still busy, we give up */
|
||||
if (timeout >= MAX_TIMEOUT) {
|
||||
if (timeout > MAX_TIMEOUT) {
|
||||
dev_dbg(&sis96x_adapter.dev, "SMBus Timeout! (0x%02x)\n", temp);
|
||||
result = -ETIMEDOUT;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue