mirror of
https://github.com/torvalds/linux.git
synced 2024-11-15 00:21:59 +00:00
via: Do not attempt I/O on inactive I2C adapters
If an adapter has been configured for GPIO (or off), we should not try to use it as an I2C port. Cc: ScottFang@viatech.com.cn Cc: JosephChan@via.com.tw Cc: Harald Welte <laforge@gnumonks.org> Acked-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de> Signed-off-by: Jonathan Corbet <corbet@lwn.net>
This commit is contained in:
parent
7582eb9be8
commit
b052d7f81f
@ -115,6 +115,8 @@ int viafb_i2c_readbyte(u8 adap, u8 slave_addr, u8 index, u8 *pdata)
|
||||
u8 mm1[] = {0x00};
|
||||
struct i2c_msg msgs[2];
|
||||
|
||||
if (!via_i2c_par[adap].is_active)
|
||||
return -ENODEV;
|
||||
*pdata = 0;
|
||||
msgs[0].flags = 0;
|
||||
msgs[1].flags = I2C_M_RD;
|
||||
@ -130,6 +132,8 @@ int viafb_i2c_writebyte(u8 adap, u8 slave_addr, u8 index, u8 data)
|
||||
u8 msg[2] = { index, data };
|
||||
struct i2c_msg msgs;
|
||||
|
||||
if (!via_i2c_par[adap].is_active)
|
||||
return -ENODEV;
|
||||
msgs.flags = 0;
|
||||
msgs.addr = slave_addr / 2;
|
||||
msgs.len = 2;
|
||||
@ -142,6 +146,8 @@ int viafb_i2c_readbytes(u8 adap, u8 slave_addr, u8 index, u8 *buff, int buff_len
|
||||
u8 mm1[] = {0x00};
|
||||
struct i2c_msg msgs[2];
|
||||
|
||||
if (!via_i2c_par[adap].is_active)
|
||||
return -ENODEV;
|
||||
msgs[0].flags = 0;
|
||||
msgs[1].flags = I2C_M_RD;
|
||||
msgs[0].addr = msgs[1].addr = slave_addr / 2;
|
||||
@ -198,18 +204,18 @@ static int viafb_i2c_probe(struct platform_device *platdev)
|
||||
struct via_port_cfg *adap_cfg = configs++;
|
||||
struct via_i2c_stuff *i2c_stuff = &via_i2c_par[i];
|
||||
|
||||
i2c_stuff->is_active = 0;
|
||||
if (adap_cfg->type == 0 || adap_cfg->mode != VIA_MODE_I2C)
|
||||
continue;
|
||||
|
||||
ret = create_i2c_bus(&i2c_stuff->adapter,
|
||||
&i2c_stuff->algo, adap_cfg,
|
||||
NULL); /* FIXME: PCIDEV */
|
||||
if (ret < 0) {
|
||||
printk(KERN_ERR "viafb: cannot create i2c bus %u:%d\n",
|
||||
i, ret);
|
||||
/* FIXME: properly release previous busses */
|
||||
return ret;
|
||||
continue; /* Still try to make the rest */
|
||||
}
|
||||
i2c_stuff->is_active = 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -225,7 +231,7 @@ static int viafb_i2c_remove(struct platform_device *platdev)
|
||||
* Only remove those entries in the array that we've
|
||||
* actually used (and thus initialized algo_data)
|
||||
*/
|
||||
if (i2c_stuff->adapter.algo_data == &i2c_stuff->algo)
|
||||
if (i2c_stuff->is_active)
|
||||
i2c_del_adapter(&i2c_stuff->adapter);
|
||||
}
|
||||
return 0;
|
||||
|
@ -26,6 +26,7 @@
|
||||
|
||||
struct via_i2c_stuff {
|
||||
u16 i2c_port; /* GPIO or I2C port */
|
||||
u16 is_active; /* Being used as I2C? */
|
||||
struct i2c_adapter adapter;
|
||||
struct i2c_algo_bit_data algo;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user