diff options
Diffstat (limited to 'drivers/i2c/i2c-core.c')
-rw-r--r-- | drivers/i2c/i2c-core.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index e6d4935161e4..c83e4d13cfc5 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
@@ -567,6 +567,9 @@ static int i2c_generic_recovery(struct i2c_adapter *adap) | |||
567 | if (bri->prepare_recovery) | 567 | if (bri->prepare_recovery) |
568 | bri->prepare_recovery(adap); | 568 | bri->prepare_recovery(adap); |
569 | 569 | ||
570 | bri->set_scl(adap, val); | ||
571 | ndelay(RECOVERY_NDELAY); | ||
572 | |||
570 | /* | 573 | /* |
571 | * By this time SCL is high, as we need to give 9 falling-rising edges | 574 | * By this time SCL is high, as we need to give 9 falling-rising edges |
572 | */ | 575 | */ |
@@ -597,7 +600,6 @@ static int i2c_generic_recovery(struct i2c_adapter *adap) | |||
597 | 600 | ||
598 | int i2c_generic_scl_recovery(struct i2c_adapter *adap) | 601 | int i2c_generic_scl_recovery(struct i2c_adapter *adap) |
599 | { | 602 | { |
600 | adap->bus_recovery_info->set_scl(adap, 1); | ||
601 | return i2c_generic_recovery(adap); | 603 | return i2c_generic_recovery(adap); |
602 | } | 604 | } |
603 | EXPORT_SYMBOL_GPL(i2c_generic_scl_recovery); | 605 | EXPORT_SYMBOL_GPL(i2c_generic_scl_recovery); |
@@ -1338,13 +1340,17 @@ static int of_dev_node_match(struct device *dev, void *data) | |||
1338 | struct i2c_client *of_find_i2c_device_by_node(struct device_node *node) | 1340 | struct i2c_client *of_find_i2c_device_by_node(struct device_node *node) |
1339 | { | 1341 | { |
1340 | struct device *dev; | 1342 | struct device *dev; |
1343 | struct i2c_client *client; | ||
1341 | 1344 | ||
1342 | dev = bus_find_device(&i2c_bus_type, NULL, node, | 1345 | dev = bus_find_device(&i2c_bus_type, NULL, node, of_dev_node_match); |
1343 | of_dev_node_match); | ||
1344 | if (!dev) | 1346 | if (!dev) |
1345 | return NULL; | 1347 | return NULL; |
1346 | 1348 | ||
1347 | return i2c_verify_client(dev); | 1349 | client = i2c_verify_client(dev); |
1350 | if (!client) | ||
1351 | put_device(dev); | ||
1352 | |||
1353 | return client; | ||
1348 | } | 1354 | } |
1349 | EXPORT_SYMBOL(of_find_i2c_device_by_node); | 1355 | EXPORT_SYMBOL(of_find_i2c_device_by_node); |
1350 | 1356 | ||
@@ -1352,13 +1358,17 @@ EXPORT_SYMBOL(of_find_i2c_device_by_node); | |||
1352 | struct i2c_adapter *of_find_i2c_adapter_by_node(struct device_node *node) | 1358 | struct i2c_adapter *of_find_i2c_adapter_by_node(struct device_node *node) |
1353 | { | 1359 | { |
1354 | struct device *dev; | 1360 | struct device *dev; |
1361 | struct i2c_adapter *adapter; | ||
1355 | 1362 | ||
1356 | dev = bus_find_device(&i2c_bus_type, NULL, node, | 1363 | dev = bus_find_device(&i2c_bus_type, NULL, node, of_dev_node_match); |
1357 | of_dev_node_match); | ||
1358 | if (!dev) | 1364 | if (!dev) |
1359 | return NULL; | 1365 | return NULL; |
1360 | 1366 | ||
1361 | return i2c_verify_adapter(dev); | 1367 | adapter = i2c_verify_adapter(dev); |
1368 | if (!adapter) | ||
1369 | put_device(dev); | ||
1370 | |||
1371 | return adapter; | ||
1362 | } | 1372 | } |
1363 | EXPORT_SYMBOL(of_find_i2c_adapter_by_node); | 1373 | EXPORT_SYMBOL(of_find_i2c_adapter_by_node); |
1364 | #else | 1374 | #else |