mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 05:48:40 +00:00
viafb: fix i2c_transfer error handling
i2c_transfer returns negative errno on error and number of messages processed on success. Just returning this value would give a poor interface as it is not obvious that you must compare with 2 after reading 1 or n bytes and with 1 after writing 1 byte to determine if it was successful. To avoid this error prone interface convert the error code of a successful read/write to zero and all other non-negative values to an negative error code. This fixes a regression introduced by via: Rationalize vt1636 detection which resulted in no longer detecting a VT1636 chip and therefore has broken the output in configurations which contain this chip. Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de> Acked-by: Jonathan Corbet <corbet@lwn.net> Cc: Joseph Chan <JosephChan@via.com.tw> Cc: stable@kernel.org
This commit is contained in:
parent
dbc2809824
commit
85c5702ac0
1 changed files with 24 additions and 3 deletions
|
@ -114,6 +114,7 @@ static void via_i2c_setsda(void *data, int state)
|
|||
|
||||
int viafb_i2c_readbyte(u8 adap, u8 slave_addr, u8 index, u8 *pdata)
|
||||
{
|
||||
int ret;
|
||||
u8 mm1[] = {0x00};
|
||||
struct i2c_msg msgs[2];
|
||||
|
||||
|
@ -126,11 +127,18 @@ int viafb_i2c_readbyte(u8 adap, u8 slave_addr, u8 index, u8 *pdata)
|
|||
mm1[0] = index;
|
||||
msgs[0].len = 1; msgs[1].len = 1;
|
||||
msgs[0].buf = mm1; msgs[1].buf = pdata;
|
||||
return i2c_transfer(&via_i2c_par[adap].adapter, msgs, 2);
|
||||
ret = i2c_transfer(&via_i2c_par[adap].adapter, msgs, 2);
|
||||
if (ret == 2)
|
||||
ret = 0;
|
||||
else if (ret >= 0)
|
||||
ret = -EIO;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int viafb_i2c_writebyte(u8 adap, u8 slave_addr, u8 index, u8 data)
|
||||
{
|
||||
int ret;
|
||||
u8 msg[2] = { index, data };
|
||||
struct i2c_msg msgs;
|
||||
|
||||
|
@ -140,11 +148,18 @@ int viafb_i2c_writebyte(u8 adap, u8 slave_addr, u8 index, u8 data)
|
|||
msgs.addr = slave_addr / 2;
|
||||
msgs.len = 2;
|
||||
msgs.buf = msg;
|
||||
return i2c_transfer(&via_i2c_par[adap].adapter, &msgs, 1);
|
||||
ret = i2c_transfer(&via_i2c_par[adap].adapter, &msgs, 1);
|
||||
if (ret == 1)
|
||||
ret = 0;
|
||||
else if (ret >= 0)
|
||||
ret = -EIO;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int viafb_i2c_readbytes(u8 adap, u8 slave_addr, u8 index, u8 *buff, int buff_len)
|
||||
{
|
||||
int ret;
|
||||
u8 mm1[] = {0x00};
|
||||
struct i2c_msg msgs[2];
|
||||
|
||||
|
@ -156,7 +171,13 @@ int viafb_i2c_readbytes(u8 adap, u8 slave_addr, u8 index, u8 *buff, int buff_len
|
|||
mm1[0] = index;
|
||||
msgs[0].len = 1; msgs[1].len = buff_len;
|
||||
msgs[0].buf = mm1; msgs[1].buf = buff;
|
||||
return i2c_transfer(&via_i2c_par[adap].adapter, msgs, 2);
|
||||
ret = i2c_transfer(&via_i2c_par[adap].adapter, msgs, 2);
|
||||
if (ret == 2)
|
||||
ret = 0;
|
||||
else if (ret >= 0)
|
||||
ret = -EIO;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue