diff options
Diffstat (limited to 'drivers/i2c/busses/i2c-omap.c')
| -rw-r--r-- | drivers/i2c/busses/i2c-omap.c | 36 | 
1 files changed, 17 insertions, 19 deletions
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index db31eaed6ea..3525c9e62cb 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c @@ -43,7 +43,6 @@  #include <linux/slab.h>  #include <linux/i2c-omap.h>  #include <linux/pm_runtime.h> -#include <linux/pm_qos.h>  /* I2C controller revisions */  #define OMAP_I2C_OMAP1_REV_2		0x20 @@ -187,8 +186,9 @@ struct omap_i2c_dev {  	int			reg_shift;      /* bit shift for I2C register addresses */  	struct completion	cmd_complete;  	struct resource		*ioarea; -	u32			latency;	/* maximum MPU wkup latency */ -	struct pm_qos_request	pm_qos_request; +	u32			latency;	/* maximum mpu wkup latency */ +	void			(*set_mpu_wkup_lat)(struct device *dev, +						    long latency);  	u32			speed;		/* Speed of bus in kHz */  	u32			dtrev;		/* extra revision from DT */  	u32			flags; @@ -494,7 +494,9 @@ static void omap_i2c_resize_fifo(struct omap_i2c_dev *dev, u8 size, bool is_rx)  		dev->b_hw = 1; /* Enable hardware fixes */  	/* calculate wakeup latency constraint for MPU */ -	dev->latency = (1000000 * dev->threshold) / (1000 * dev->speed / 8); +	if (dev->set_mpu_wkup_lat != NULL) +		dev->latency = (1000000 * dev->threshold) / +			(1000 * dev->speed / 8);  }  /* @@ -522,6 +524,9 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap,  	dev->buf = msg->buf;  	dev->buf_len = msg->len; +	/* make sure writes to dev->buf_len are ordered */ +	barrier(); +  	omap_i2c_write_reg(dev, OMAP_I2C_CNT_REG, dev->buf_len);  	/* Clear the FIFO Buffers */ @@ -579,7 +584,6 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap,  	 */  	timeout = wait_for_completion_timeout(&dev->cmd_complete,  						OMAP_I2C_TIMEOUT); -	dev->buf_len = 0;  	if (timeout == 0) {  		dev_err(dev->dev, "controller timed out\n");  		omap_i2c_init(dev); @@ -629,16 +633,8 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)  	if (r < 0)  		goto out; -	/* -	 * When waiting for completion of a i2c transfer, we need to -	 * set a wake up latency constraint for the MPU. This is to -	 * ensure quick enough wakeup from idle, when transfer -	 * completes. -	 */ -	if (dev->latency) -		pm_qos_add_request(&dev->pm_qos_request, -				   PM_QOS_CPU_DMA_LATENCY, -				   dev->latency); +	if (dev->set_mpu_wkup_lat != NULL) +		dev->set_mpu_wkup_lat(dev->dev, dev->latency);  	for (i = 0; i < num; i++) {  		r = omap_i2c_xfer_msg(adap, &msgs[i], (i == (num - 1))); @@ -646,8 +642,8 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)  			break;  	} -	if (dev->latency) -		pm_qos_remove_request(&dev->pm_qos_request); +	if (dev->set_mpu_wkup_lat != NULL) +		dev->set_mpu_wkup_lat(dev->dev, -1);  	if (r == 0)  		r = num; @@ -1104,6 +1100,7 @@ omap_i2c_probe(struct platform_device *pdev)  	} else if (pdata != NULL) {  		dev->speed = pdata->clkrate;  		dev->flags = pdata->flags; +		dev->set_mpu_wkup_lat = pdata->set_mpu_wkup_lat;  		dev->dtrev = pdata->rev;  	} @@ -1159,8 +1156,9 @@ omap_i2c_probe(struct platform_device *pdev)  			dev->b_hw = 1; /* Enable hardware fixes */  		/* calculate wakeup latency constraint for MPU */ -		dev->latency = (1000000 * dev->fifo_size) / -			       (1000 * dev->speed / 8); +		if (dev->set_mpu_wkup_lat != NULL) +			dev->latency = (1000000 * dev->fifo_size) / +				       (1000 * dev->speed / 8);  	}  	/* reset ASAP, clearing any IRQs */  |