diff options
author | Jean Delvare <khali@linux-fr.org> | 2011-01-10 16:11:23 -0500 |
---|---|---|
committer | Jean Delvare <khali@endymion.delvare> | 2011-01-10 16:11:23 -0500 |
commit | af5a60baaee66e2f891dbb9a8519ca28ab7da7cd (patch) | |
tree | b2dc270ce64b4ad9779d1f3a013a96cfb7ab069e | |
parent | f451171c5ac829e55581c81caf2cb01e1c0a5c5f (diff) |
i2c-algo-bit: Complain about masters which can't read SCL
The I2C specification explicitly describes both SDA and SCL as
bidirectional lines. An I2C master with a read-only SCL is thus not
compliant. If a slow slave stretches the clock, errors will happen,
so the bus can't be considered as reliable.
Signed-off-by: Jean Delvare <khali@linux-fr.org>
-rw-r--r-- | drivers/i2c/algos/i2c-algo-bit.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c index 938170b8998..38319a69bd0 100644 --- a/drivers/i2c/algos/i2c-algo-bit.c +++ b/drivers/i2c/algos/i2c-algo-bit.c | |||
@@ -604,9 +604,10 @@ static int __i2c_bit_add_bus(struct i2c_adapter *adap, | |||
604 | int (*add_adapter)(struct i2c_adapter *)) | 604 | int (*add_adapter)(struct i2c_adapter *)) |
605 | { | 605 | { |
606 | struct i2c_algo_bit_data *bit_adap = adap->algo_data; | 606 | struct i2c_algo_bit_data *bit_adap = adap->algo_data; |
607 | int ret; | ||
607 | 608 | ||
608 | if (bit_test) { | 609 | if (bit_test) { |
609 | int ret = test_bus(bit_adap, adap->name); | 610 | ret = test_bus(bit_adap, adap->name); |
610 | if (ret < 0) | 611 | if (ret < 0) |
611 | return -ENODEV; | 612 | return -ENODEV; |
612 | } | 613 | } |
@@ -615,7 +616,16 @@ static int __i2c_bit_add_bus(struct i2c_adapter *adap, | |||
615 | adap->algo = &i2c_bit_algo; | 616 | adap->algo = &i2c_bit_algo; |
616 | adap->retries = 3; | 617 | adap->retries = 3; |
617 | 618 | ||
618 | return add_adapter(adap); | 619 | ret = add_adapter(adap); |
620 | if (ret < 0) | ||
621 | return ret; | ||
622 | |||
623 | /* Complain if SCL can't be read */ | ||
624 | if (bit_adap->getscl == NULL) { | ||
625 | dev_warn(&adap->dev, "Not I2C compliant: can't read SCL\n"); | ||
626 | dev_warn(&adap->dev, "Bus may be unreliable\n"); | ||
627 | } | ||
628 | return 0; | ||
619 | } | 629 | } |
620 | 630 | ||
621 | int i2c_bit_add_bus(struct i2c_adapter *adap) | 631 | int i2c_bit_add_bus(struct i2c_adapter *adap) |