diff options
Diffstat (limited to 'drivers/i2c')
| -rw-r--r-- | drivers/i2c/busses/i2c-cpm.c | 5 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-davinci.c | 6 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-ibm_iic.c | 3 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-mpc.c | 1 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-octeon.c | 2 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-omap.c | 2 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-pca-isa.c | 12 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-pca-platform.c | 11 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-s3c2410.c | 4 | ||||
| -rw-r--r-- | drivers/i2c/i2c-core.c | 54 | 
10 files changed, 56 insertions, 44 deletions
| diff --git a/drivers/i2c/busses/i2c-cpm.c b/drivers/i2c/busses/i2c-cpm.c index f7bd2613cec..f2de3be35df 100644 --- a/drivers/i2c/busses/i2c-cpm.c +++ b/drivers/i2c/busses/i2c-cpm.c @@ -677,6 +677,11 @@ static int __devinit cpm_i2c_probe(struct platform_device *ofdev,  	dev_dbg(&ofdev->dev, "hw routines for %s registered.\n",  		cpm->adap.name); +	/* +	 * register OF I2C devices +	 */ +	of_i2c_register_devices(&cpm->adap); +  	return 0;  out_shut:  	cpm_i2c_shutdown(cpm); diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c index 2222c87876b..b8feac5f2ef 100644 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c @@ -357,9 +357,6 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop)  	dev->terminate = 0; -	/* write the data into mode register */ -	davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag); -  	/*  	 * First byte should be set here, not after interrupt,  	 * because transmit-data-ready interrupt can come before @@ -371,6 +368,9 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop)  		dev->buf_len--;  	} +	/* write the data into mode register; start transmitting */ +	davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag); +  	r = wait_for_completion_interruptible_timeout(&dev->cmd_complete,  						      dev->adapter.timeout);  	if (r == 0) { diff --git a/drivers/i2c/busses/i2c-ibm_iic.c b/drivers/i2c/busses/i2c-ibm_iic.c index 43ca32fddde..89eedf45d30 100644 --- a/drivers/i2c/busses/i2c-ibm_iic.c +++ b/drivers/i2c/busses/i2c-ibm_iic.c @@ -761,6 +761,9 @@ static int __devinit iic_probe(struct platform_device *ofdev,  	dev_info(&ofdev->dev, "using %s mode\n",  		 dev->fast_mode ? "fast (400 kHz)" : "standard (100 kHz)"); +	/* Now register all the child nodes */ +	of_i2c_register_devices(adap); +  	return 0;  error_cleanup: diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c index a1c419a716a..b74e6dc6886 100644 --- a/drivers/i2c/busses/i2c-mpc.c +++ b/drivers/i2c/busses/i2c-mpc.c @@ -632,6 +632,7 @@ static int __devinit fsl_i2c_probe(struct platform_device *op,  		dev_err(i2c->dev, "failed to add adapter\n");  		goto fail_add;  	} +	of_i2c_register_devices(&i2c->adap);  	return result; diff --git a/drivers/i2c/busses/i2c-octeon.c b/drivers/i2c/busses/i2c-octeon.c index 0e9f85d0a83..56dbe54e881 100644 --- a/drivers/i2c/busses/i2c-octeon.c +++ b/drivers/i2c/busses/i2c-octeon.c @@ -218,7 +218,7 @@ static int octeon_i2c_wait(struct octeon_i2c *i2c)  		return result;  	} else if (result == 0) {  		dev_dbg(i2c->dev, "%s: timeout\n", __func__); -		result = -ETIMEDOUT; +		return -ETIMEDOUT;  	}  	return 0; diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index 7674efb5537..b33c78586bf 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c @@ -680,6 +680,8 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)  	if (r == 0)  		r = num; + +	omap_i2c_wait_for_bb(dev);  out:  	omap_i2c_idle(dev);  	return r; diff --git a/drivers/i2c/busses/i2c-pca-isa.c b/drivers/i2c/busses/i2c-pca-isa.c index bbd77603a41..29933f87d8f 100644 --- a/drivers/i2c/busses/i2c-pca-isa.c +++ b/drivers/i2c/busses/i2c-pca-isa.c @@ -71,8 +71,8 @@ static int pca_isa_readbyte(void *pd, int reg)  static int pca_isa_waitforcompletion(void *pd)  { -	long ret = ~0;  	unsigned long timeout; +	long ret;  	if (irq > -1) {  		ret = wait_event_timeout(pca_wait, @@ -81,11 +81,15 @@ static int pca_isa_waitforcompletion(void *pd)  	} else {  		/* Do polling */  		timeout = jiffies + pca_isa_ops.timeout; -		while (((pca_isa_readbyte(pd, I2C_PCA_CON) -				& I2C_PCA_CON_SI) == 0) -				&& (ret = time_before(jiffies, timeout))) +		do { +			ret = time_before(jiffies, timeout); +			if (pca_isa_readbyte(pd, I2C_PCA_CON) +					& I2C_PCA_CON_SI) +				break;  			udelay(100); +		} while (ret);  	} +  	return ret > 0;  } diff --git a/drivers/i2c/busses/i2c-pca-platform.c b/drivers/i2c/busses/i2c-pca-platform.c index ef5c78487eb..5f6d7f89e22 100644 --- a/drivers/i2c/busses/i2c-pca-platform.c +++ b/drivers/i2c/busses/i2c-pca-platform.c @@ -80,8 +80,8 @@ static void i2c_pca_pf_writebyte32(void *pd, int reg, int val)  static int i2c_pca_pf_waitforcompletion(void *pd)  {  	struct i2c_pca_pf_data *i2c = pd; -	long ret = ~0;  	unsigned long timeout; +	long ret;  	if (i2c->irq) {  		ret = wait_event_timeout(i2c->wait, @@ -90,10 +90,13 @@ static int i2c_pca_pf_waitforcompletion(void *pd)  	} else {  		/* Do polling */  		timeout = jiffies + i2c->adap.timeout; -		while (((i2c->algo_data.read_byte(i2c, I2C_PCA_CON) -				& I2C_PCA_CON_SI) == 0) -				&& (ret = time_before(jiffies, timeout))) +		do { +			ret = time_before(jiffies, timeout); +			if (i2c->algo_data.read_byte(i2c, I2C_PCA_CON) +					& I2C_PCA_CON_SI) +				break;  			udelay(100); +		} while (ret);  	}  	return ret > 0; diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index 72902e0bbfa..bf831bf8158 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c @@ -662,8 +662,8 @@ static int s3c24xx_i2c_clockrate(struct s3c24xx_i2c *i2c, unsigned int *got)  		unsigned long sda_delay;  		if (pdata->sda_delay) { -			sda_delay = (freq / 1000) * pdata->sda_delay; -			sda_delay /= 1000000; +			sda_delay = clkin * pdata->sda_delay; +			sda_delay = DIV_ROUND_UP(sda_delay, 1000000);  			sda_delay = DIV_ROUND_UP(sda_delay, 5);  			if (sda_delay > 3)  				sda_delay = 3; diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 6649176de94..bea4c5021d2 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c @@ -32,7 +32,6 @@  #include <linux/init.h>  #include <linux/idr.h>  #include <linux/mutex.h> -#include <linux/of_i2c.h>  #include <linux/of_device.h>  #include <linux/completion.h>  #include <linux/hardirq.h> @@ -197,11 +196,12 @@ static int i2c_device_pm_suspend(struct device *dev)  {  	const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; -	if (pm_runtime_suspended(dev)) -		return 0; - -	if (pm) -		return pm->suspend ? pm->suspend(dev) : 0; +	if (pm) { +		if (pm_runtime_suspended(dev)) +			return 0; +		else +			return pm->suspend ? pm->suspend(dev) : 0; +	}  	return i2c_legacy_suspend(dev, PMSG_SUSPEND);  } @@ -216,12 +216,6 @@ static int i2c_device_pm_resume(struct device *dev)  	else  		ret = i2c_legacy_resume(dev); -	if (!ret) { -		pm_runtime_disable(dev); -		pm_runtime_set_active(dev); -		pm_runtime_enable(dev); -	} -  	return ret;  } @@ -229,11 +223,12 @@ static int i2c_device_pm_freeze(struct device *dev)  {  	const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; -	if (pm_runtime_suspended(dev)) -		return 0; - -	if (pm) -		return pm->freeze ? pm->freeze(dev) : 0; +	if (pm) { +		if (pm_runtime_suspended(dev)) +			return 0; +		else +			return pm->freeze ? pm->freeze(dev) : 0; +	}  	return i2c_legacy_suspend(dev, PMSG_FREEZE);  } @@ -242,11 +237,12 @@ static int i2c_device_pm_thaw(struct device *dev)  {  	const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; -	if (pm_runtime_suspended(dev)) -		return 0; - -	if (pm) -		return pm->thaw ? pm->thaw(dev) : 0; +	if (pm) { +		if (pm_runtime_suspended(dev)) +			return 0; +		else +			return pm->thaw ? pm->thaw(dev) : 0; +	}  	return i2c_legacy_resume(dev);  } @@ -255,11 +251,12 @@ static int i2c_device_pm_poweroff(struct device *dev)  {  	const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; -	if (pm_runtime_suspended(dev)) -		return 0; - -	if (pm) -		return pm->poweroff ? pm->poweroff(dev) : 0; +	if (pm) { +		if (pm_runtime_suspended(dev)) +			return 0; +		else +			return pm->poweroff ? pm->poweroff(dev) : 0; +	}  	return i2c_legacy_suspend(dev, PMSG_HIBERNATE);  } @@ -876,9 +873,6 @@ static int i2c_register_adapter(struct i2c_adapter *adap)  	if (adap->nr < __i2c_first_dynamic_bus_num)  		i2c_scan_static_board_info(adap); -	/* Register devices from the device tree */ -	of_i2c_register_devices(adap); -  	/* Notify drivers */  	mutex_lock(&core_lock);  	bus_for_each_drv(&i2c_bus_type, NULL, adap, __process_new_adapter); | 
