aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2012-07-30 13:22:44 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-07-30 13:22:44 -0400
commitc893e7c64e36087dceb4662917976a81d1754fc0 (patch)
tree30e441fe3e13fc8fcf9690bfe5222f404e19daa0 /drivers/i2c
parentec3ed85f926f4e900bc48cec6e72abbe6475321f (diff)
parent2cefabc00ffdc1f22f960df946ae41b163081d5e (diff)
Merge branch 'patches_for_v3.6' into v4l_for_linus
* patches_for_v3.6: (174 commits) v4l: Export v4l2-common.h in include/linux/Kbuild media: Revert "[media] Terratec Cinergy S2 USB HD Rev.2" [media] media: Use pr_info not homegrown pr_reg macro [media] Terratec Cinergy S2 USB HD Rev.2 [media] v4l: Correct conflicting V4L2 subdev selection API documentation [media] Feature removal: V4L2 selections API target and flag definitions [media] v4l: Unify selection flags documentation [media] v4l: Unify selection flags [media] v4l: Common documentation for selection targets [media] v4l: Unify selection targets across V4L2 and V4L2 subdev interfaces [media] v4l: Remove "_ACTUAL" from subdev selection API target definition names [media] V4L: Remove "_ACTIVE" from the selection target name definitions [media] media: dvb-usb: print mac address via native %pM [media] s5p-tv: Use module_i2c_driver in sii9234_drv.c file [media] media: gpio-ir-recv: add allowed_protos for platform data [media] s5p-jpeg: Use module_platform_driver in jpeg-core.c file [media] saa7134: fix spelling of detach in label [media] cx88-blackbird: replace ioctl by unlocked_ioctl [media] cx88: don't use current_norm [media] cx88: fix a number of v4l2-compliance violations ...
Diffstat (limited to 'drivers/i2c')
-rw-r--r--drivers/i2c/i2c-core.c44
1 files changed, 33 insertions, 11 deletions
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
index feb7dc359186..ccc6445979c4 100644
--- a/drivers/i2c/i2c-core.c
+++ b/drivers/i2c/i2c-core.c
@@ -1295,6 +1295,37 @@ module_exit(i2c_exit);
1295 */ 1295 */
1296 1296
1297/** 1297/**
1298 * __i2c_transfer - unlocked flavor of i2c_transfer
1299 * @adap: Handle to I2C bus
1300 * @msgs: One or more messages to execute before STOP is issued to
1301 * terminate the operation; each message begins with a START.
1302 * @num: Number of messages to be executed.
1303 *
1304 * Returns negative errno, else the number of messages executed.
1305 *
1306 * Adapter lock must be held when calling this function. No debug logging
1307 * takes place. adap->algo->master_xfer existence isn't checked.
1308 */
1309int __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
1310{
1311 unsigned long orig_jiffies;
1312 int ret, try;
1313
1314 /* Retry automatically on arbitration loss */
1315 orig_jiffies = jiffies;
1316 for (ret = 0, try = 0; try <= adap->retries; try++) {
1317 ret = adap->algo->master_xfer(adap, msgs, num);
1318 if (ret != -EAGAIN)
1319 break;
1320 if (time_after(jiffies, orig_jiffies + adap->timeout))
1321 break;
1322 }
1323
1324 return ret;
1325}
1326EXPORT_SYMBOL(__i2c_transfer);
1327
1328/**
1298 * i2c_transfer - execute a single or combined I2C message 1329 * i2c_transfer - execute a single or combined I2C message
1299 * @adap: Handle to I2C bus 1330 * @adap: Handle to I2C bus
1300 * @msgs: One or more messages to execute before STOP is issued to 1331 * @msgs: One or more messages to execute before STOP is issued to
@@ -1308,8 +1339,7 @@ module_exit(i2c_exit);
1308 */ 1339 */
1309int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) 1340int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
1310{ 1341{
1311 unsigned long orig_jiffies; 1342 int ret;
1312 int ret, try;
1313 1343
1314 /* REVISIT the fault reporting model here is weak: 1344 /* REVISIT the fault reporting model here is weak:
1315 * 1345 *
@@ -1347,15 +1377,7 @@ int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
1347 i2c_lock_adapter(adap); 1377 i2c_lock_adapter(adap);
1348 } 1378 }
1349 1379
1350 /* Retry automatically on arbitration loss */ 1380 ret = __i2c_transfer(adap, msgs, num);
1351 orig_jiffies = jiffies;
1352 for (ret = 0, try = 0; try <= adap->retries; try++) {
1353 ret = adap->algo->master_xfer(adap, msgs, num);
1354 if (ret != -EAGAIN)
1355 break;
1356 if (time_after(jiffies, orig_jiffies + adap->timeout))
1357 break;
1358 }
1359 i2c_unlock_adapter(adap); 1381 i2c_unlock_adapter(adap);
1360 1382
1361 return ret; 1383 return ret;