diff options
Diffstat (limited to 'drivers/i2c')
| -rw-r--r-- | drivers/i2c/busses/i2c-omap.c | 35 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-stu300.c | 2 | 
2 files changed, 35 insertions, 2 deletions
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index b605ff3a1fa..829a2a1029f 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c @@ -847,11 +847,15 @@ complete:  			dev_err(dev->dev, "Arbitration lost\n");  			err |= OMAP_I2C_STAT_AL;  		} +		/* +		 * ProDB0017052: Clear ARDY bit twice +		 */  		if (stat & (OMAP_I2C_STAT_ARDY | OMAP_I2C_STAT_NACK |  					OMAP_I2C_STAT_AL)) {  			omap_i2c_ack_stat(dev, stat &  				(OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR | -				OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR)); +				OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR | +				OMAP_I2C_STAT_ARDY));  			omap_i2c_complete_cmd(dev, err);  			return IRQ_HANDLED;  		} @@ -1137,12 +1141,41 @@ omap_i2c_remove(struct platform_device *pdev)  	return 0;  } +#ifdef CONFIG_SUSPEND +static int omap_i2c_suspend(struct device *dev) +{ +	if (!pm_runtime_suspended(dev)) +		if (dev->bus && dev->bus->pm && dev->bus->pm->runtime_suspend) +			dev->bus->pm->runtime_suspend(dev); + +	return 0; +} + +static int omap_i2c_resume(struct device *dev) +{ +	if (!pm_runtime_suspended(dev)) +		if (dev->bus && dev->bus->pm && dev->bus->pm->runtime_resume) +			dev->bus->pm->runtime_resume(dev); + +	return 0; +} + +static struct dev_pm_ops omap_i2c_pm_ops = { +	.suspend = omap_i2c_suspend, +	.resume = omap_i2c_resume, +}; +#define OMAP_I2C_PM_OPS (&omap_i2c_pm_ops) +#else +#define OMAP_I2C_PM_OPS NULL +#endif +  static struct platform_driver omap_i2c_driver = {  	.probe		= omap_i2c_probe,  	.remove		= omap_i2c_remove,  	.driver		= {  		.name	= "omap_i2c",  		.owner	= THIS_MODULE, +		.pm	= OMAP_I2C_PM_OPS,  	},  }; diff --git a/drivers/i2c/busses/i2c-stu300.c b/drivers/i2c/busses/i2c-stu300.c index 495be451d32..266135ddf7f 100644 --- a/drivers/i2c/busses/i2c-stu300.c +++ b/drivers/i2c/busses/i2c-stu300.c @@ -942,7 +942,7 @@ stu300_probe(struct platform_device *pdev)  	adap->owner = THIS_MODULE;  	/* DDC class but actually often used for more generic I2C */  	adap->class = I2C_CLASS_DDC; -	strncpy(adap->name, "ST Microelectronics DDC I2C adapter", +	strlcpy(adap->name, "ST Microelectronics DDC I2C adapter",  		sizeof(adap->name));  	adap->nr = bus_nr;  	adap->algo = &stu300_algo;  |