diff options
Diffstat (limited to 'drivers/i2c/busses/i2c-axxia.c')
-rw-r--r-- | drivers/i2c/busses/i2c-axxia.c | 27 |
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) | |||
408 | static int axxia_i2c_stop(struct axxia_i2c_dev *idev) | 403 | static 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 | ||
452 | static struct i2c_adapter_quirks axxia_i2c_quirks = { | ||
453 | .max_read_len = 255, | ||
454 | .max_write_len = 255, | ||
455 | }; | ||
456 | |||
457 | static int axxia_i2c_probe(struct platform_device *pdev) | 457 | static 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 | ||