diff options
Diffstat (limited to 'drivers/i2c')
| -rw-r--r-- | drivers/i2c/busses/i2c-designware-core.c | 14 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-designware-core.h | 2 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-designware-platdrv.c | 1 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-i801.c | 6 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-mv64xxx.c | 8 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-s3c2410.c | 5 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-sirf.c | 6 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-tegra.c | 5 | ||||
| -rw-r--r-- | drivers/i2c/i2c-core.c | 3 | 
9 files changed, 26 insertions, 24 deletions
diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c index 21fbb340ad6..c41ca6354fc 100644 --- a/drivers/i2c/busses/i2c-designware-core.c +++ b/drivers/i2c/busses/i2c-designware-core.c @@ -383,7 +383,8 @@ static void i2c_dw_xfer_init(struct dw_i2c_dev *dev)  	/* Enable the adapter */  	__i2c_dw_enable(dev, true); -	/* Enable interrupts */ +	/* Clear and enable interrupts */ +	i2c_dw_clear_int(dev);  	dw_writel(dev, DW_IC_INTR_DEFAULT_MASK, DW_IC_INTR_MASK);  } @@ -448,8 +449,14 @@ i2c_dw_xfer_msg(struct dw_i2c_dev *dev)  				cmd |= BIT(9);  			if (msgs[dev->msg_write_idx].flags & I2C_M_RD) { + +				/* avoid rx buffer overrun */ +				if (rx_limit - dev->rx_outstanding <= 0) +					break; +  				dw_writel(dev, cmd | 0x100, DW_IC_DATA_CMD);  				rx_limit--; +				dev->rx_outstanding++;  			} else  				dw_writel(dev, cmd | *buf++, DW_IC_DATA_CMD);  			tx_limit--; buf_len--; @@ -502,8 +509,10 @@ i2c_dw_read(struct dw_i2c_dev *dev)  		rx_valid = dw_readl(dev, DW_IC_RXFLR); -		for (; len > 0 && rx_valid > 0; len--, rx_valid--) +		for (; len > 0 && rx_valid > 0; len--, rx_valid--) {  			*buf++ = dw_readl(dev, DW_IC_DATA_CMD); +			dev->rx_outstanding--; +		}  		if (len > 0) {  			dev->status |= STATUS_READ_IN_PROGRESS; @@ -561,6 +570,7 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)  	dev->msg_err = 0;  	dev->status = STATUS_IDLE;  	dev->abort_source = 0; +	dev->rx_outstanding = 0;  	ret = i2c_dw_wait_bus_not_busy(dev);  	if (ret < 0) diff --git a/drivers/i2c/busses/i2c-designware-core.h b/drivers/i2c/busses/i2c-designware-core.h index 9c1840ee09c..e761ad18dd6 100644 --- a/drivers/i2c/busses/i2c-designware-core.h +++ b/drivers/i2c/busses/i2c-designware-core.h @@ -60,6 +60,7 @@   * @adapter: i2c subsystem adapter node   * @tx_fifo_depth: depth of the hardware tx fifo   * @rx_fifo_depth: depth of the hardware rx fifo + * @rx_outstanding: current master-rx elements in tx fifo   */  struct dw_i2c_dev {  	struct device		*dev; @@ -88,6 +89,7 @@ struct dw_i2c_dev {  	u32			master_cfg;  	unsigned int		tx_fifo_depth;  	unsigned int		rx_fifo_depth; +	int			rx_outstanding;  };  #define ACCESS_SWAP		0x00000001 diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c index 8ec91335d95..35b70a1edf5 100644 --- a/drivers/i2c/busses/i2c-designware-platdrv.c +++ b/drivers/i2c/busses/i2c-designware-platdrv.c @@ -69,6 +69,7 @@ static int dw_i2c_acpi_configure(struct platform_device *pdev)  static const struct acpi_device_id dw_i2c_acpi_match[] = {  	{ "INT33C2", 0 },  	{ "INT33C3", 0 }, +	{ "80860F41", 0 },  	{ }  };  MODULE_DEVICE_TABLE(acpi, dw_i2c_acpi_match); diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c index e1cf2e0e1f2..3a6903f6391 100644 --- a/drivers/i2c/busses/i2c-i801.c +++ b/drivers/i2c/busses/i2c-i801.c @@ -231,7 +231,11 @@ static const char *i801_feature_names[] = {  static unsigned int disable_features;  module_param(disable_features, uint, S_IRUGO | S_IWUSR); -MODULE_PARM_DESC(disable_features, "Disable selected driver features"); +MODULE_PARM_DESC(disable_features, "Disable selected driver features:\n" +	"\t\t  0x01  disable SMBus PEC\n" +	"\t\t  0x02  disable the block buffer\n" +	"\t\t  0x08  disable the I2C block read functionality\n" +	"\t\t  0x10  don't use interrupts ");  /* Make sure the SMBus host is ready to start transmitting.     Return 0 if it is, -EBUSY if it is not. */ diff --git a/drivers/i2c/busses/i2c-mv64xxx.c b/drivers/i2c/busses/i2c-mv64xxx.c index 3bbd65d35a5..1a3abd6a0bf 100644 --- a/drivers/i2c/busses/i2c-mv64xxx.c +++ b/drivers/i2c/busses/i2c-mv64xxx.c @@ -252,7 +252,7 @@ mv64xxx_i2c_do_action(struct mv64xxx_i2c_data *drv_data)  		writel(drv_data->cntl_bits,  			drv_data->reg_base + MV64XXX_I2C_REG_CONTROL);  		drv_data->block = 0; -		wake_up_interruptible(&drv_data->waitq); +		wake_up(&drv_data->waitq);  		break;  	case MV64XXX_I2C_ACTION_CONTINUE: @@ -300,7 +300,7 @@ mv64xxx_i2c_do_action(struct mv64xxx_i2c_data *drv_data)  		writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_STOP,  			drv_data->reg_base + MV64XXX_I2C_REG_CONTROL);  		drv_data->block = 0; -		wake_up_interruptible(&drv_data->waitq); +		wake_up(&drv_data->waitq);  		break;  	case MV64XXX_I2C_ACTION_INVALID: @@ -315,7 +315,7 @@ mv64xxx_i2c_do_action(struct mv64xxx_i2c_data *drv_data)  		writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_STOP,  			drv_data->reg_base + MV64XXX_I2C_REG_CONTROL);  		drv_data->block = 0; -		wake_up_interruptible(&drv_data->waitq); +		wake_up(&drv_data->waitq);  		break;  	}  } @@ -381,7 +381,7 @@ mv64xxx_i2c_wait_for_completion(struct mv64xxx_i2c_data *drv_data)  	unsigned long	flags;  	char		abort = 0; -	time_left = wait_event_interruptible_timeout(drv_data->waitq, +	time_left = wait_event_timeout(drv_data->waitq,  		!drv_data->block, drv_data->adapter.timeout);  	spin_lock_irqsave(&drv_data->lock, flags); diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index 6e8ee92ab55..cab1c91b75a 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c @@ -1082,11 +1082,6 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev)  	/* map the registers */  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (res == NULL) { -		dev_err(&pdev->dev, "cannot find IO resource\n"); -		return -ENOENT; -	} -  	i2c->regs = devm_ioremap_resource(&pdev->dev, res);  	if (IS_ERR(i2c->regs)) diff --git a/drivers/i2c/busses/i2c-sirf.c b/drivers/i2c/busses/i2c-sirf.c index 5a7ad240bd2..a63c7d50683 100644 --- a/drivers/i2c/busses/i2c-sirf.c +++ b/drivers/i2c/busses/i2c-sirf.c @@ -303,12 +303,6 @@ static int i2c_sirfsoc_probe(struct platform_device *pdev)  	adap->class = I2C_CLASS_HWMON;  	mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (mem_res == NULL) { -		dev_err(&pdev->dev, "Unable to get MEM resource\n"); -		err = -EINVAL; -		goto out; -	} -  	siic->base = devm_ioremap_resource(&pdev->dev, mem_res);  	if (IS_ERR(siic->base)) {  		err = PTR_ERR(siic->base); diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index b60ff90adc3..9aa1b60f7fd 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c @@ -714,11 +714,6 @@ static int tegra_i2c_probe(struct platform_device *pdev)  	int ret = 0;  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (!res) { -		dev_err(&pdev->dev, "no mem resource\n"); -		return -EINVAL; -	} -  	base = devm_ioremap_resource(&pdev->dev, res);  	if (IS_ERR(base))  		return PTR_ERR(base); diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 6b63cc7eb71..48e31ed69db 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c @@ -892,7 +892,8 @@ i2c_sysfs_delete_device(struct device *dev, struct device_attribute *attr,  }  static DEVICE_ATTR(new_device, S_IWUSR, NULL, i2c_sysfs_new_device); -static DEVICE_ATTR(delete_device, S_IWUSR, NULL, i2c_sysfs_delete_device); +static DEVICE_ATTR_IGNORE_LOCKDEP(delete_device, S_IWUSR, NULL, +				   i2c_sysfs_delete_device);  static struct attribute *i2c_adapter_attrs[] = {  	&dev_attr_name.attr,  | 
