aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c/busses/i2c-axxia.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/i2c/busses/i2c-axxia.c')
-rw-r--r--drivers/i2c/busses/i2c-axxia.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/drivers/i2c/busses/i2c-axxia.c b/drivers/i2c/busses/i2c-axxia.c
index 768a598d8d03..32d883490863 100644
--- a/drivers/i2c/busses/i2c-axxia.c
+++ b/drivers/i2c/busses/i2c-axxia.c
@@ -334,12 +334,7 @@ static int axxia_i2c_xfer_msg(struct axxia_i2c_dev *idev, struct i2c_msg *msg)
334 u32 int_mask = MST_STATUS_ERR | MST_STATUS_SNS; 334 u32 int_mask = MST_STATUS_ERR | MST_STATUS_SNS;
335 u32 rx_xfer, tx_xfer; 335 u32 rx_xfer, tx_xfer;
336 u32 addr_1, addr_2; 336 u32 addr_1, addr_2;
337 int ret; 337 unsigned long time_left;
338
339 if (msg->len > 255) {
340 dev_warn(idev->dev, "unsupported length %u\n", msg->len);
341 return -EINVAL;
342 }
343 338
344 idev->msg = msg; 339 idev->msg = msg;
345 idev->msg_xfrd = 0; 340 idev->msg_xfrd = 0;
@@ -388,15 +383,15 @@ static int axxia_i2c_xfer_msg(struct axxia_i2c_dev *idev, struct i2c_msg *msg)
388 383
389 i2c_int_enable(idev, int_mask); 384 i2c_int_enable(idev, int_mask);
390 385
391 ret = wait_for_completion_timeout(&idev->msg_complete, 386 time_left = wait_for_completion_timeout(&idev->msg_complete,
392 I2C_XFER_TIMEOUT); 387 I2C_XFER_TIMEOUT);
393 388
394 i2c_int_disable(idev, int_mask); 389 i2c_int_disable(idev, int_mask);
395 390
396 if (readl(idev->base + MST_COMMAND) & CMD_BUSY) 391 if (readl(idev->base + MST_COMMAND) & CMD_BUSY)
397 dev_warn(idev->dev, "busy after xfer\n"); 392 dev_warn(idev->dev, "busy after xfer\n");
398 393
399 if (ret == 0) 394 if (time_left == 0)
400 idev->msg_err = -ETIMEDOUT; 395 idev->msg_err = -ETIMEDOUT;
401 396
402 if (unlikely(idev->msg_err) && idev->msg_err != -ENXIO) 397 if (unlikely(idev->msg_err) && idev->msg_err != -ENXIO)
@@ -408,17 +403,17 @@ static int axxia_i2c_xfer_msg(struct axxia_i2c_dev *idev, struct i2c_msg *msg)
408static int axxia_i2c_stop(struct axxia_i2c_dev *idev) 403static int axxia_i2c_stop(struct axxia_i2c_dev *idev)
409{ 404{
410 u32 int_mask = MST_STATUS_ERR | MST_STATUS_SCC; 405 u32 int_mask = MST_STATUS_ERR | MST_STATUS_SCC;
411 int ret; 406 unsigned long time_left;
412 407
413 reinit_completion(&idev->msg_complete); 408 reinit_completion(&idev->msg_complete);
414 409
415 /* Issue stop */ 410 /* Issue stop */
416 writel(0xb, idev->base + MST_COMMAND); 411 writel(0xb, idev->base + MST_COMMAND);
417 i2c_int_enable(idev, int_mask); 412 i2c_int_enable(idev, int_mask);
418 ret = wait_for_completion_timeout(&idev->msg_complete, 413 time_left = wait_for_completion_timeout(&idev->msg_complete,
419 I2C_STOP_TIMEOUT); 414 I2C_STOP_TIMEOUT);
420 i2c_int_disable(idev, int_mask); 415 i2c_int_disable(idev, int_mask);
421 if (ret == 0) 416 if (time_left == 0)
422 return -ETIMEDOUT; 417 return -ETIMEDOUT;
423 418
424 if (readl(idev->base + MST_COMMAND) & CMD_BUSY) 419 if (readl(idev->base + MST_COMMAND) & CMD_BUSY)
@@ -454,6 +449,11 @@ static const struct i2c_algorithm axxia_i2c_algo = {
454 .functionality = axxia_i2c_func, 449 .functionality = axxia_i2c_func,
455}; 450};
456 451
452static struct i2c_adapter_quirks axxia_i2c_quirks = {
453 .max_read_len = 255,
454 .max_write_len = 255,
455};
456
457static int axxia_i2c_probe(struct platform_device *pdev) 457static int axxia_i2c_probe(struct platform_device *pdev)
458{ 458{
459 struct device_node *np = pdev->dev.of_node; 459 struct device_node *np = pdev->dev.of_node;
@@ -511,6 +511,7 @@ static int axxia_i2c_probe(struct platform_device *pdev)
511 strlcpy(idev->adapter.name, pdev->name, sizeof(idev->adapter.name)); 511 strlcpy(idev->adapter.name, pdev->name, sizeof(idev->adapter.name));
512 idev->adapter.owner = THIS_MODULE; 512 idev->adapter.owner = THIS_MODULE;
513 idev->adapter.algo = &axxia_i2c_algo; 513 idev->adapter.algo = &axxia_i2c_algo;
514 idev->adapter.quirks = &axxia_i2c_quirks;
514 idev->adapter.dev.parent = &pdev->dev; 515 idev->adapter.dev.parent = &pdev->dev;
515 idev->adapter.dev.of_node = pdev->dev.of_node; 516 idev->adapter.dev.of_node = pdev->dev.of_node;
516 517