|
43 | 43 | #include <linux/slab.h> |
44 | 44 | #include <linux/i2c-omap.h> |
45 | 45 | #include <linux/pm_runtime.h> |
46 | | -#include <linux/pm_qos.h> |
47 | 46 |
|
48 | 47 | /* I2C controller revisions */ |
49 | 48 | #define OMAP_I2C_OMAP1_REV_2 0x20 |
@@ -187,8 +186,9 @@ struct omap_i2c_dev { |
187 | 186 | int reg_shift; /* bit shift for I2C register addresses */ |
188 | 187 | struct completion cmd_complete; |
189 | 188 | struct resource *ioarea; |
190 | | - u32 latency; /* maximum MPU wkup latency */ |
191 | | - struct pm_qos_request pm_qos_request; |
| 189 | + u32 latency; /* maximum mpu wkup latency */ |
| 190 | + void (*set_mpu_wkup_lat)(struct device *dev, |
| 191 | + long latency); |
192 | 192 | u32 speed; /* Speed of bus in kHz */ |
193 | 193 | u32 dtrev; /* extra revision from DT */ |
194 | 194 | u32 flags; |
@@ -494,7 +494,9 @@ static void omap_i2c_resize_fifo(struct omap_i2c_dev *dev, u8 size, bool is_rx) |
494 | 494 | dev->b_hw = 1; /* Enable hardware fixes */ |
495 | 495 |
|
496 | 496 | /* calculate wakeup latency constraint for MPU */ |
497 | | - dev->latency = (1000000 * dev->threshold) / (1000 * dev->speed / 8); |
| 497 | + if (dev->set_mpu_wkup_lat != NULL) |
| 498 | + dev->latency = (1000000 * dev->threshold) / |
| 499 | + (1000 * dev->speed / 8); |
498 | 500 | } |
499 | 501 |
|
500 | 502 | /* |
@@ -522,6 +524,9 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap, |
522 | 524 | dev->buf = msg->buf; |
523 | 525 | dev->buf_len = msg->len; |
524 | 526 |
|
| 527 | + /* make sure writes to dev->buf_len are ordered */ |
| 528 | + barrier(); |
| 529 | + |
525 | 530 | omap_i2c_write_reg(dev, OMAP_I2C_CNT_REG, dev->buf_len); |
526 | 531 |
|
527 | 532 | /* Clear the FIFO Buffers */ |
@@ -579,7 +584,6 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap, |
579 | 584 | */ |
580 | 585 | timeout = wait_for_completion_timeout(&dev->cmd_complete, |
581 | 586 | OMAP_I2C_TIMEOUT); |
582 | | - dev->buf_len = 0; |
583 | 587 | if (timeout == 0) { |
584 | 588 | dev_err(dev->dev, "controller timed out\n"); |
585 | 589 | omap_i2c_init(dev); |
@@ -629,25 +633,17 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) |
629 | 633 | if (r < 0) |
630 | 634 | goto out; |
631 | 635 |
|
632 | | - /* |
633 | | - * When waiting for completion of a i2c transfer, we need to |
634 | | - * set a wake up latency constraint for the MPU. This is to |
635 | | - * ensure quick enough wakeup from idle, when transfer |
636 | | - * completes. |
637 | | - */ |
638 | | - if (dev->latency) |
639 | | - pm_qos_add_request(&dev->pm_qos_request, |
640 | | - PM_QOS_CPU_DMA_LATENCY, |
641 | | - dev->latency); |
| 636 | + if (dev->set_mpu_wkup_lat != NULL) |
| 637 | + dev->set_mpu_wkup_lat(dev->dev, dev->latency); |
642 | 638 |
|
643 | 639 | for (i = 0; i < num; i++) { |
644 | 640 | r = omap_i2c_xfer_msg(adap, &msgs[i], (i == (num - 1))); |
645 | 641 | if (r != 0) |
646 | 642 | break; |
647 | 643 | } |
648 | 644 |
|
649 | | - if (dev->latency) |
650 | | - pm_qos_remove_request(&dev->pm_qos_request); |
| 645 | + if (dev->set_mpu_wkup_lat != NULL) |
| 646 | + dev->set_mpu_wkup_lat(dev->dev, -1); |
651 | 647 |
|
652 | 648 | if (r == 0) |
653 | 649 | r = num; |
@@ -1104,6 +1100,7 @@ omap_i2c_probe(struct platform_device *pdev) |
1104 | 1100 | } else if (pdata != NULL) { |
1105 | 1101 | dev->speed = pdata->clkrate; |
1106 | 1102 | dev->flags = pdata->flags; |
| 1103 | + dev->set_mpu_wkup_lat = pdata->set_mpu_wkup_lat; |
1107 | 1104 | dev->dtrev = pdata->rev; |
1108 | 1105 | } |
1109 | 1106 |
|
@@ -1159,8 +1156,9 @@ omap_i2c_probe(struct platform_device *pdev) |
1159 | 1156 | dev->b_hw = 1; /* Enable hardware fixes */ |
1160 | 1157 |
|
1161 | 1158 | /* calculate wakeup latency constraint for MPU */ |
1162 | | - dev->latency = (1000000 * dev->fifo_size) / |
1163 | | - (1000 * dev->speed / 8); |
| 1159 | + if (dev->set_mpu_wkup_lat != NULL) |
| 1160 | + dev->latency = (1000000 * dev->fifo_size) / |
| 1161 | + (1000 * dev->speed / 8); |
1164 | 1162 | } |
1165 | 1163 |
|
1166 | 1164 | /* reset ASAP, clearing any IRQs */ |
|
0 commit comments