diff options
Diffstat (limited to 'drivers/i2c')
| -rw-r--r-- | drivers/i2c/busses/i2c-designware-platdrv.c | 18 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-imx.c | 8 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-ismt.c | 2 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-mv64xxx.c | 6 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-rcar.c | 2 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-tiny-usb.c | 25 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-xgene-slimpro.c | 1 | ||||
| -rw-r--r-- | drivers/i2c/i2c-mux.c | 26 | ||||
| -rw-r--r-- | drivers/i2c/muxes/i2c-mux-reg.c | 21 | 
9 files changed, 71 insertions, 38 deletions
diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c index f2acd4b6bf01..d1263b82d646 100644 --- a/drivers/i2c/busses/i2c-designware-platdrv.c +++ b/drivers/i2c/busses/i2c-designware-platdrv.c @@ -94,6 +94,7 @@ static void dw_i2c_acpi_params(struct platform_device *pdev, char method[],  static int dw_i2c_acpi_configure(struct platform_device *pdev)  {  	struct dw_i2c_dev *dev = platform_get_drvdata(pdev); +	u32 ss_ht = 0, fp_ht = 0, hs_ht = 0, fs_ht = 0;  	acpi_handle handle = ACPI_HANDLE(&pdev->dev);  	const struct acpi_device_id *id;  	struct acpi_device *adev; @@ -107,23 +108,24 @@ static int dw_i2c_acpi_configure(struct platform_device *pdev)  	 * Try to get SDA hold time and *CNT values from an ACPI method for  	 * selected speed modes.  	 */ +	dw_i2c_acpi_params(pdev, "SSCN", &dev->ss_hcnt, &dev->ss_lcnt, &ss_ht); +	dw_i2c_acpi_params(pdev, "FPCN", &dev->fp_hcnt, &dev->fp_lcnt, &fp_ht); +	dw_i2c_acpi_params(pdev, "HSCN", &dev->hs_hcnt, &dev->hs_lcnt, &hs_ht); +	dw_i2c_acpi_params(pdev, "FMCN", &dev->fs_hcnt, &dev->fs_lcnt, &fs_ht); +  	switch (dev->clk_freq) {  	case 100000: -		dw_i2c_acpi_params(pdev, "SSCN", &dev->ss_hcnt, &dev->ss_lcnt, -				   &dev->sda_hold_time); +		dev->sda_hold_time = ss_ht;  		break;  	case 1000000: -		dw_i2c_acpi_params(pdev, "FPCN", &dev->fp_hcnt, &dev->fp_lcnt, -				   &dev->sda_hold_time); +		dev->sda_hold_time = fp_ht;  		break;  	case 3400000: -		dw_i2c_acpi_params(pdev, "HSCN", &dev->hs_hcnt, &dev->hs_lcnt, -				   &dev->sda_hold_time); +		dev->sda_hold_time = hs_ht;  		break;  	case 400000:  	default: -		dw_i2c_acpi_params(pdev, "FMCN", &dev->fs_hcnt, &dev->fs_lcnt, -				   &dev->sda_hold_time); +		dev->sda_hold_time = fs_ht;  		break;  	} diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c index 95ed17183e73..54a47b40546f 100644 --- a/drivers/i2c/busses/i2c-imx.c +++ b/drivers/i2c/busses/i2c-imx.c @@ -734,9 +734,9 @@ static int i2c_imx_dma_read(struct imx_i2c_struct *i2c_imx,  		 * the first read operation, otherwise the first read cost  		 * one extra clock cycle.  		 */ -		temp = readb(i2c_imx->base + IMX_I2C_I2CR); +		temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR);  		temp |= I2CR_MTX; -		writeb(temp, i2c_imx->base + IMX_I2C_I2CR); +		imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR);  	}  	msgs->buf[msgs->len-1] = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2DR); @@ -857,9 +857,9 @@ static int i2c_imx_read(struct imx_i2c_struct *i2c_imx, struct i2c_msg *msgs, bo  				 * the first read operation, otherwise the first read cost  				 * one extra clock cycle.  				 */ -				temp = readb(i2c_imx->base + IMX_I2C_I2CR); +				temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR);  				temp |= I2CR_MTX; -				writeb(temp, i2c_imx->base + IMX_I2C_I2CR); +				imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR);  			}  		} else if (i == (msgs->len - 2)) {  			dev_dbg(&i2c_imx->adapter.dev, diff --git a/drivers/i2c/busses/i2c-ismt.c b/drivers/i2c/busses/i2c-ismt.c index f573448d2132..e98e44e584a4 100644 --- a/drivers/i2c/busses/i2c-ismt.c +++ b/drivers/i2c/busses/i2c-ismt.c @@ -584,7 +584,7 @@ static int ismt_access(struct i2c_adapter *adap, u16 addr,  	/* unmap the data buffer */  	if (dma_size != 0) -		dma_unmap_single(&adap->dev, dma_addr, dma_size, dma_direction); +		dma_unmap_single(dev, dma_addr, dma_size, dma_direction);  	if (unlikely(!time_left)) {  		dev_err(dev, "completion wait timed out\n"); diff --git a/drivers/i2c/busses/i2c-mv64xxx.c b/drivers/i2c/busses/i2c-mv64xxx.c index cf737ec8563b..5c4db65c5019 100644 --- a/drivers/i2c/busses/i2c-mv64xxx.c +++ b/drivers/i2c/busses/i2c-mv64xxx.c @@ -819,7 +819,6 @@ mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data,  		rc = -EINVAL;  		goto out;  	} -	drv_data->irq = irq_of_parse_and_map(np, 0);  	drv_data->rstc = devm_reset_control_get_optional(dev, NULL);  	if (IS_ERR(drv_data->rstc)) { @@ -902,10 +901,11 @@ mv64xxx_i2c_probe(struct platform_device *pd)  	if (!IS_ERR(drv_data->clk))  		clk_prepare_enable(drv_data->clk); +	drv_data->irq = platform_get_irq(pd, 0); +  	if (pdata) {  		drv_data->freq_m = pdata->freq_m;  		drv_data->freq_n = pdata->freq_n; -		drv_data->irq = platform_get_irq(pd, 0);  		drv_data->adapter.timeout = msecs_to_jiffies(pdata->timeout);  		drv_data->offload_enabled = false;  		memcpy(&drv_data->reg_offsets, &mv64xxx_i2c_regs_mv64xxx, sizeof(drv_data->reg_offsets)); @@ -915,7 +915,7 @@ mv64xxx_i2c_probe(struct platform_device *pd)  			goto exit_clk;  	}  	if (drv_data->irq < 0) { -		rc = -ENXIO; +		rc = drv_data->irq;  		goto exit_reset;  	} diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c index 214bf2835d1f..8be3e6cb8fe6 100644 --- a/drivers/i2c/busses/i2c-rcar.c +++ b/drivers/i2c/busses/i2c-rcar.c @@ -319,7 +319,7 @@ static void rcar_i2c_dma_unmap(struct rcar_i2c_priv *priv)  	rcar_i2c_write(priv, ICFBSCR, TCYC06);  	dma_unmap_single(chan->device->dev, sg_dma_address(&priv->sg), -			 priv->msg->len, priv->dma_direction); +			 sg_dma_len(&priv->sg), priv->dma_direction);  	priv->dma_direction = DMA_NONE;  } diff --git a/drivers/i2c/busses/i2c-tiny-usb.c b/drivers/i2c/busses/i2c-tiny-usb.c index 0ed77eeff31e..a2e3dd715380 100644 --- a/drivers/i2c/busses/i2c-tiny-usb.c +++ b/drivers/i2c/busses/i2c-tiny-usb.c @@ -178,22 +178,39 @@ static int usb_read(struct i2c_adapter *adapter, int cmd,  		    int value, int index, void *data, int len)  {  	struct i2c_tiny_usb *dev = (struct i2c_tiny_usb *)adapter->algo_data; +	void *dmadata = kmalloc(len, GFP_KERNEL); +	int ret; + +	if (!dmadata) +		return -ENOMEM;  	/* do control transfer */ -	return usb_control_msg(dev->usb_dev, usb_rcvctrlpipe(dev->usb_dev, 0), +	ret = usb_control_msg(dev->usb_dev, usb_rcvctrlpipe(dev->usb_dev, 0),  			       cmd, USB_TYPE_VENDOR | USB_RECIP_INTERFACE | -			       USB_DIR_IN, value, index, data, len, 2000); +			       USB_DIR_IN, value, index, dmadata, len, 2000); + +	memcpy(data, dmadata, len); +	kfree(dmadata); +	return ret;  }  static int usb_write(struct i2c_adapter *adapter, int cmd,  		     int value, int index, void *data, int len)  {  	struct i2c_tiny_usb *dev = (struct i2c_tiny_usb *)adapter->algo_data; +	void *dmadata = kmemdup(data, len, GFP_KERNEL); +	int ret; + +	if (!dmadata) +		return -ENOMEM;  	/* do control transfer */ -	return usb_control_msg(dev->usb_dev, usb_sndctrlpipe(dev->usb_dev, 0), +	ret = usb_control_msg(dev->usb_dev, usb_sndctrlpipe(dev->usb_dev, 0),  			       cmd, USB_TYPE_VENDOR | USB_RECIP_INTERFACE, -			       value, index, data, len, 2000); +			       value, index, dmadata, len, 2000); + +	kfree(dmadata); +	return ret;  }  static void i2c_tiny_usb_free(struct i2c_tiny_usb *dev) diff --git a/drivers/i2c/busses/i2c-xgene-slimpro.c b/drivers/i2c/busses/i2c-xgene-slimpro.c index dbe7e44c9321..6ba6c83ca8f1 100644 --- a/drivers/i2c/busses/i2c-xgene-slimpro.c +++ b/drivers/i2c/busses/i2c-xgene-slimpro.c @@ -416,6 +416,7 @@ static int xgene_slimpro_i2c_probe(struct platform_device *pdev)  	adapter->class = I2C_CLASS_HWMON;  	adapter->dev.parent = &pdev->dev;  	adapter->dev.of_node = pdev->dev.of_node; +	ACPI_COMPANION_SET(&adapter->dev, ACPI_COMPANION(&pdev->dev));  	i2c_set_adapdata(adapter, ctx);  	rc = i2c_add_adapter(adapter);  	if (rc) { diff --git a/drivers/i2c/i2c-mux.c b/drivers/i2c/i2c-mux.c index 26f7237558ba..9669ca4937b8 100644 --- a/drivers/i2c/i2c-mux.c +++ b/drivers/i2c/i2c-mux.c @@ -395,18 +395,20 @@ int i2c_mux_add_adapter(struct i2c_mux_core *muxc,  	if (force_nr) {  		priv->adap.nr = force_nr;  		ret = i2c_add_numbered_adapter(&priv->adap); -		dev_err(&parent->dev, -			"failed to add mux-adapter %u as bus %u (error=%d)\n", -			chan_id, force_nr, ret); +		if (ret < 0) { +			dev_err(&parent->dev, +				"failed to add mux-adapter %u as bus %u (error=%d)\n", +				chan_id, force_nr, ret); +			goto err_free_priv; +		}  	} else {  		ret = i2c_add_adapter(&priv->adap); -		dev_err(&parent->dev, -			"failed to add mux-adapter %u (error=%d)\n", -			chan_id, ret); -	} -	if (ret < 0) { -		kfree(priv); -		return ret; +		if (ret < 0) { +			dev_err(&parent->dev, +				"failed to add mux-adapter %u (error=%d)\n", +				chan_id, ret); +			goto err_free_priv; +		}  	}  	WARN(sysfs_create_link(&priv->adap.dev.kobj, &muxc->dev->kobj, @@ -422,6 +424,10 @@ int i2c_mux_add_adapter(struct i2c_mux_core *muxc,  	muxc->adapter[muxc->num_adapters++] = &priv->adap;  	return 0; + +err_free_priv: +	kfree(priv); +	return ret;  }  EXPORT_SYMBOL_GPL(i2c_mux_add_adapter); diff --git a/drivers/i2c/muxes/i2c-mux-reg.c b/drivers/i2c/muxes/i2c-mux-reg.c index 406d5059072c..d97031804de8 100644 --- a/drivers/i2c/muxes/i2c-mux-reg.c +++ b/drivers/i2c/muxes/i2c-mux-reg.c @@ -196,20 +196,25 @@ static int i2c_mux_reg_probe(struct platform_device *pdev)  		res = platform_get_resource(pdev, IORESOURCE_MEM, 0);  		mux->data.reg_size = resource_size(res);  		mux->data.reg = devm_ioremap_resource(&pdev->dev, res); -		if (IS_ERR(mux->data.reg)) -			return PTR_ERR(mux->data.reg); +		if (IS_ERR(mux->data.reg)) { +			ret = PTR_ERR(mux->data.reg); +			goto err_put_parent; +		}  	}  	if (mux->data.reg_size != 4 && mux->data.reg_size != 2 &&  	    mux->data.reg_size != 1) {  		dev_err(&pdev->dev, "Invalid register size\n"); -		return -EINVAL; +		ret = -EINVAL; +		goto err_put_parent;  	}  	muxc = i2c_mux_alloc(parent, &pdev->dev, mux->data.n_values, 0, 0,  			     i2c_mux_reg_select, NULL); -	if (!muxc) -		return -ENOMEM; +	if (!muxc) { +		ret = -ENOMEM; +		goto err_put_parent; +	}  	muxc->priv = mux;  	platform_set_drvdata(pdev, muxc); @@ -223,7 +228,7 @@ static int i2c_mux_reg_probe(struct platform_device *pdev)  		ret = i2c_mux_add_adapter(muxc, nr, mux->data.values[i], class);  		if (ret) -			goto add_adapter_failed; +			goto err_del_mux_adapters;  	}  	dev_dbg(&pdev->dev, "%d port mux on %s adapter\n", @@ -231,8 +236,10 @@ static int i2c_mux_reg_probe(struct platform_device *pdev)  	return 0; -add_adapter_failed: +err_del_mux_adapters:  	i2c_mux_del_adapters(muxc); +err_put_parent: +	i2c_put_adapter(parent);  	return ret;  }  | 
