i2c: Bus drivers return -Errno not -1
Tighten error paths used by various i2c adapters (mostly x86) so they return real fault/errno codes instead of a "-1" (which is most often interpreted as "-EPERM"). Build tested, with eyeball review. One minor initial goal is to have adapters consistently return the code "-ENXIO" when addressing a device doesn't get an ACK response, at least in the probe paths where they are already good at stifling related logspam. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Jean Delvare <khali@linux-fr.org>
这个提交包含在:
@@ -236,7 +236,7 @@ static int sis5595_transaction(struct i2c_adapter *adap)
|
||||
sis5595_write(SMB_STS_HI, temp >> 8);
|
||||
if ((temp = sis5595_read(SMB_STS_LO) + (sis5595_read(SMB_STS_HI) << 8)) != 0x00) {
|
||||
dev_dbg(&adap->dev, "Failed! (%02x)\n", temp);
|
||||
return -1;
|
||||
return -EBUSY;
|
||||
} else {
|
||||
dev_dbg(&adap->dev, "Successful!\n");
|
||||
}
|
||||
@@ -254,19 +254,19 @@ static int sis5595_transaction(struct i2c_adapter *adap)
|
||||
/* If the SMBus is still busy, we give up */
|
||||
if (timeout >= MAX_TIMEOUT) {
|
||||
dev_dbg(&adap->dev, "SMBus Timeout!\n");
|
||||
result = -1;
|
||||
result = -ETIMEDOUT;
|
||||
}
|
||||
|
||||
if (temp & 0x10) {
|
||||
dev_dbg(&adap->dev, "Error: Failed bus transaction\n");
|
||||
result = -1;
|
||||
result = -ENXIO;
|
||||
}
|
||||
|
||||
if (temp & 0x20) {
|
||||
dev_err(&adap->dev, "Bus collision! SMBus may be locked until "
|
||||
"next hard reset (or not...)\n");
|
||||
/* Clock stops and slave is stuck in mid-transmission */
|
||||
result = -1;
|
||||
result = -EIO;
|
||||
}
|
||||
|
||||
temp = sis5595_read(SMB_STS_LO) + (sis5595_read(SMB_STS_HI) << 8);
|
||||
@@ -282,11 +282,13 @@ static int sis5595_transaction(struct i2c_adapter *adap)
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Return -1 on error. */
|
||||
/* Return negative errno on error. */
|
||||
static s32 sis5595_access(struct i2c_adapter *adap, u16 addr,
|
||||
unsigned short flags, char read_write,
|
||||
u8 command, int size, union i2c_smbus_data *data)
|
||||
{
|
||||
int status;
|
||||
|
||||
switch (size) {
|
||||
case I2C_SMBUS_QUICK:
|
||||
sis5595_write(SMB_ADDR, ((addr & 0x7f) << 1) | (read_write & 0x01));
|
||||
@@ -318,13 +320,14 @@ static s32 sis5595_access(struct i2c_adapter *adap, u16 addr,
|
||||
break;
|
||||
default:
|
||||
dev_warn(&adap->dev, "Unsupported transaction %d\n", size);
|
||||
return -1;
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
sis5595_write(SMB_CTL_LO, ((size & 0x0E)));
|
||||
|
||||
if (sis5595_transaction(adap))
|
||||
return -1;
|
||||
status = sis5595_transaction(adap);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
if ((size != SIS5595_PROC_CALL) &&
|
||||
((read_write == I2C_SMBUS_WRITE) || (size == SIS5595_QUICK)))
|
||||
|
在新工单中引用
屏蔽一个用户