diff options
Diffstat (limited to 'drivers/i2c')
| -rw-r--r-- | drivers/i2c/busses/i2c-designware-core.c | 26 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-designware-platdrv.c | 5 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-imx.c | 11 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-ismt.c | 3 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-mv64xxx.c | 16 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-mxs.c | 3 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-omap.c | 3 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-s3c2410.c | 2 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-stu300.c | 11 | ||||
| -rw-r--r-- | drivers/i2c/i2c-core.c | 3 | ||||
| -rw-r--r-- | drivers/i2c/muxes/i2c-arb-gpio-challenge.c | 2 | ||||
| -rw-r--r-- | drivers/i2c/muxes/i2c-mux-gpio.c | 14 | ||||
| -rw-r--r-- | drivers/i2c/muxes/i2c-mux-pinctrl.c | 4 | 
13 files changed, 66 insertions, 37 deletions
| diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c index dbecf08399f..5888feef1ac 100644 --- a/drivers/i2c/busses/i2c-designware-core.c +++ b/drivers/i2c/busses/i2c-designware-core.c @@ -98,6 +98,8 @@  #define DW_IC_ERR_TX_ABRT	0x1 +#define DW_IC_TAR_10BITADDR_MASTER BIT(12) +  /*   * status codes   */ @@ -388,22 +390,34 @@ static int i2c_dw_wait_bus_not_busy(struct dw_i2c_dev *dev)  static void i2c_dw_xfer_init(struct dw_i2c_dev *dev)  {  	struct i2c_msg *msgs = dev->msgs; -	u32 ic_con; +	u32 ic_con, ic_tar = 0;  	/* Disable the adapter */  	__i2c_dw_enable(dev, false); -	/* set the slave (target) address */ -	dw_writel(dev, msgs[dev->msg_write_idx].addr, DW_IC_TAR); -  	/* if the slave address is ten bit address, enable 10BITADDR */  	ic_con = dw_readl(dev, DW_IC_CON); -	if (msgs[dev->msg_write_idx].flags & I2C_M_TEN) +	if (msgs[dev->msg_write_idx].flags & I2C_M_TEN) {  		ic_con |= DW_IC_CON_10BITADDR_MASTER; -	else +		/* +		 * If I2C_DYNAMIC_TAR_UPDATE is set, the 10-bit addressing +		 * mode has to be enabled via bit 12 of IC_TAR register. +		 * We set it always as I2C_DYNAMIC_TAR_UPDATE can't be +		 * detected from registers. +		 */ +		ic_tar = DW_IC_TAR_10BITADDR_MASTER; +	} else {  		ic_con &= ~DW_IC_CON_10BITADDR_MASTER; +	} +  	dw_writel(dev, ic_con, DW_IC_CON); +	/* +	 * Set the slave (target) address and enable 10-bit addressing mode +	 * if applicable. +	 */ +	dw_writel(dev, msgs[dev->msg_write_idx].addr | ic_tar, DW_IC_TAR); +  	/* Enable the adapter */  	__i2c_dw_enable(dev, true); diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c index 4c1b60539a2..0aa01136f8d 100644 --- a/drivers/i2c/busses/i2c-designware-platdrv.c +++ b/drivers/i2c/busses/i2c-designware-platdrv.c @@ -270,7 +270,8 @@ static SIMPLE_DEV_PM_OPS(dw_i2c_dev_pm_ops, dw_i2c_suspend, dw_i2c_resume);  MODULE_ALIAS("platform:i2c_designware");  static struct platform_driver dw_i2c_driver = { -	.remove		= dw_i2c_remove, +	.probe = dw_i2c_probe, +	.remove = dw_i2c_remove,  	.driver		= {  		.name	= "i2c_designware",  		.owner	= THIS_MODULE, @@ -282,7 +283,7 @@ static struct platform_driver dw_i2c_driver = {  static int __init dw_i2c_init_driver(void)  { -	return platform_driver_probe(&dw_i2c_driver, dw_i2c_probe); +	return platform_driver_register(&dw_i2c_driver);  }  subsys_initcall(dw_i2c_init_driver); diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c index ccf46656bda..1d7efa3169c 100644 --- a/drivers/i2c/busses/i2c-imx.c +++ b/drivers/i2c/busses/i2c-imx.c @@ -365,7 +365,7 @@ static void i2c_imx_stop(struct imx_i2c_struct *i2c_imx)  	clk_disable_unprepare(i2c_imx->clk);  } -static void __init i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx, +static void i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx,  							unsigned int rate)  {  	struct imx_i2c_clk_pair *i2c_clk_div = i2c_imx->hwdata->clk_div; @@ -589,7 +589,7 @@ static struct i2c_algorithm i2c_imx_algo = {  	.functionality	= i2c_imx_func,  }; -static int __init i2c_imx_probe(struct platform_device *pdev) +static int i2c_imx_probe(struct platform_device *pdev)  {  	const struct of_device_id *of_id = of_match_device(i2c_imx_dt_ids,  							   &pdev->dev); @@ -697,7 +697,7 @@ static int __init i2c_imx_probe(struct platform_device *pdev)  	return 0;   /* Return OK */  } -static int __exit i2c_imx_remove(struct platform_device *pdev) +static int i2c_imx_remove(struct platform_device *pdev)  {  	struct imx_i2c_struct *i2c_imx = platform_get_drvdata(pdev); @@ -715,7 +715,8 @@ static int __exit i2c_imx_remove(struct platform_device *pdev)  }  static struct platform_driver i2c_imx_driver = { -	.remove		= __exit_p(i2c_imx_remove), +	.probe = i2c_imx_probe, +	.remove = i2c_imx_remove,  	.driver	= {  		.name	= DRIVER_NAME,  		.owner	= THIS_MODULE, @@ -726,7 +727,7 @@ static struct platform_driver i2c_imx_driver = {  static int __init i2c_adap_imx_init(void)  { -	return platform_driver_probe(&i2c_imx_driver, i2c_imx_probe); +	return platform_driver_register(&i2c_imx_driver);  }  subsys_initcall(i2c_adap_imx_init); diff --git a/drivers/i2c/busses/i2c-ismt.c b/drivers/i2c/busses/i2c-ismt.c index 8ed79a086f8..1672effbceb 100644 --- a/drivers/i2c/busses/i2c-ismt.c +++ b/drivers/i2c/busses/i2c-ismt.c @@ -393,6 +393,9 @@ static int ismt_access(struct i2c_adapter *adap, u16 addr,  	desc = &priv->hw[priv->head]; +	/* Initialize the DMA buffer */ +	memset(priv->dma_buffer, 0, sizeof(priv->dma_buffer)); +  	/* Initialize the descriptor */  	memset(desc, 0, sizeof(struct ismt_desc));  	desc->tgtaddr_rw = ISMT_DESC_ADDR_RW(addr, read_write); diff --git a/drivers/i2c/busses/i2c-mv64xxx.c b/drivers/i2c/busses/i2c-mv64xxx.c index 7f3a4744349..d3e9cc3153a 100644 --- a/drivers/i2c/busses/i2c-mv64xxx.c +++ b/drivers/i2c/busses/i2c-mv64xxx.c @@ -234,9 +234,9 @@ static int mv64xxx_i2c_offload_msg(struct mv64xxx_i2c_data *drv_data)  		ctrl_reg |= MV64XXX_I2C_BRIDGE_CONTROL_WR |  		    (msg->len - 1) << MV64XXX_I2C_BRIDGE_CONTROL_TX_SIZE_SHIFT; -		writel_relaxed(data_reg_lo, +		writel(data_reg_lo,  			drv_data->reg_base + MV64XXX_I2C_REG_TX_DATA_LO); -		writel_relaxed(data_reg_hi, +		writel(data_reg_hi,  			drv_data->reg_base + MV64XXX_I2C_REG_TX_DATA_HI);  	} else { @@ -697,6 +697,7 @@ static const struct of_device_id mv64xxx_i2c_of_match_table[] = {  MODULE_DEVICE_TABLE(of, mv64xxx_i2c_of_match_table);  #ifdef CONFIG_OF +#ifdef CONFIG_HAVE_CLK  static int  mv64xxx_calc_freq(const int tclk, const int n, const int m)  { @@ -726,16 +727,12 @@ mv64xxx_find_baud_factors(const u32 req_freq, const u32 tclk, u32 *best_n,  		return false;  	return true;  } +#endif /* CONFIG_HAVE_CLK */  static int  mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data,  		  struct device *dev)  { -	const struct of_device_id *device; -	struct device_node *np = dev->of_node; -	u32 bus_freq, tclk; -	int rc = 0; -  	/* CLK is mandatory when using DT to describe the i2c bus. We  	 * need to know tclk in order to calculate bus clock  	 * factors. @@ -744,6 +741,11 @@ mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data,  	/* Have OF but no CLK */  	return -ENODEV;  #else +	const struct of_device_id *device; +	struct device_node *np = dev->of_node; +	u32 bus_freq, tclk; +	int rc = 0; +  	if (IS_ERR(drv_data->clk)) {  		rc = -ENODEV;  		goto out; diff --git a/drivers/i2c/busses/i2c-mxs.c b/drivers/i2c/busses/i2c-mxs.c index f4a01675fa7..b7c85777470 100644 --- a/drivers/i2c/busses/i2c-mxs.c +++ b/drivers/i2c/busses/i2c-mxs.c @@ -780,12 +780,13 @@ static struct platform_driver mxs_i2c_driver = {  		   .owner = THIS_MODULE,  		   .of_match_table = mxs_i2c_dt_ids,  		   }, +	.probe = mxs_i2c_probe,  	.remove = mxs_i2c_remove,  };  static int __init mxs_i2c_init(void)  { -	return platform_driver_probe(&mxs_i2c_driver, mxs_i2c_probe); +	return platform_driver_register(&mxs_i2c_driver);  }  subsys_initcall(mxs_i2c_init); diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index 6d8308d5dc4..9967a6f9c2f 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c @@ -939,6 +939,9 @@ omap_i2c_isr_thread(int this_irq, void *dev_id)  		/*  		 * ProDB0017052: Clear ARDY bit twice  		 */ +		if (stat & OMAP_I2C_STAT_ARDY) +			omap_i2c_ack_stat(dev, OMAP_I2C_STAT_ARDY); +  		if (stat & (OMAP_I2C_STAT_ARDY | OMAP_I2C_STAT_NACK |  					OMAP_I2C_STAT_AL)) {  			omap_i2c_ack_stat(dev, (OMAP_I2C_STAT_RRDY | diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index 3535f3c0f7b..3747b9bf67d 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c @@ -1178,8 +1178,6 @@ static int s3c24xx_i2c_remove(struct platform_device *pdev)  	i2c_del_adapter(&i2c->adap); -	clk_disable_unprepare(i2c->clk); -  	if (pdev->dev.of_node && IS_ERR(i2c->pctrl))  		s3c24xx_i2c_dt_gpio_free(i2c); diff --git a/drivers/i2c/busses/i2c-stu300.c b/drivers/i2c/busses/i2c-stu300.c index f8f6f2e552d..04a17b9b38b 100644 --- a/drivers/i2c/busses/i2c-stu300.c +++ b/drivers/i2c/busses/i2c-stu300.c @@ -859,8 +859,7 @@ static const struct i2c_algorithm stu300_algo = {  	.functionality	= stu300_func,  }; -static int __init -stu300_probe(struct platform_device *pdev) +static int stu300_probe(struct platform_device *pdev)  {  	struct stu300_dev *dev;  	struct i2c_adapter *adap; @@ -966,8 +965,7 @@ static SIMPLE_DEV_PM_OPS(stu300_pm, stu300_suspend, stu300_resume);  #define STU300_I2C_PM	NULL  #endif -static int __exit -stu300_remove(struct platform_device *pdev) +static int stu300_remove(struct platform_device *pdev)  {  	struct stu300_dev *dev = platform_get_drvdata(pdev); @@ -989,13 +987,14 @@ static struct platform_driver stu300_i2c_driver = {  		.pm	= STU300_I2C_PM,  		.of_match_table = stu300_dt_match,  	}, -	.remove		= __exit_p(stu300_remove), +	.probe = stu300_probe, +	.remove = stu300_remove,  };  static int __init stu300_init(void)  { -	return platform_driver_probe(&stu300_i2c_driver, stu300_probe); +	return platform_driver_register(&stu300_i2c_driver);  }  static void __exit stu300_exit(void) diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 29d3f045a2b..3be58f89ac7 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c @@ -1134,6 +1134,9 @@ static void acpi_i2c_register_devices(struct i2c_adapter *adap)  	acpi_handle handle;  	acpi_status status; +	if (!adap->dev.parent) +		return; +  	handle = ACPI_HANDLE(adap->dev.parent);  	if (!handle)  		return; diff --git a/drivers/i2c/muxes/i2c-arb-gpio-challenge.c b/drivers/i2c/muxes/i2c-arb-gpio-challenge.c index 74b41ae690f..928656e241d 100644 --- a/drivers/i2c/muxes/i2c-arb-gpio-challenge.c +++ b/drivers/i2c/muxes/i2c-arb-gpio-challenge.c @@ -200,7 +200,7 @@ static int i2c_arbitrator_probe(struct platform_device *pdev)  	arb->parent = of_find_i2c_adapter_by_node(parent_np);  	if (!arb->parent) {  		dev_err(dev, "Cannot find parent bus\n"); -		return -EINVAL; +		return -EPROBE_DEFER;  	}  	/* Actually add the mux adapter */ diff --git a/drivers/i2c/muxes/i2c-mux-gpio.c b/drivers/i2c/muxes/i2c-mux-gpio.c index 5d4a99ba743..a764da777f0 100644 --- a/drivers/i2c/muxes/i2c-mux-gpio.c +++ b/drivers/i2c/muxes/i2c-mux-gpio.c @@ -66,7 +66,7 @@ static int i2c_mux_gpio_probe_dt(struct gpiomux *mux,  	struct device_node *adapter_np, *child;  	struct i2c_adapter *adapter;  	unsigned *values, *gpios; -	int i = 0; +	int i = 0, ret;  	if (!np)  		return -ENODEV; @@ -79,7 +79,7 @@ static int i2c_mux_gpio_probe_dt(struct gpiomux *mux,  	adapter = of_find_i2c_adapter_by_node(adapter_np);  	if (!adapter) {  		dev_err(&pdev->dev, "Cannot find parent bus\n"); -		return -ENODEV; +		return -EPROBE_DEFER;  	}  	mux->data.parent = i2c_adapter_id(adapter);  	put_device(&adapter->dev); @@ -116,8 +116,12 @@ static int i2c_mux_gpio_probe_dt(struct gpiomux *mux,  		return -ENOMEM;  	} -	for (i = 0; i < mux->data.n_gpios; i++) -		gpios[i] = of_get_named_gpio(np, "mux-gpios", i); +	for (i = 0; i < mux->data.n_gpios; i++) { +		ret = of_get_named_gpio(np, "mux-gpios", i); +		if (ret < 0) +			return ret; +		gpios[i] = ret; +	}  	mux->data.gpios = gpios; @@ -177,7 +181,7 @@ static int i2c_mux_gpio_probe(struct platform_device *pdev)  	if (!parent) {  		dev_err(&pdev->dev, "Parent adapter (%d) not found\n",  			mux->data.parent); -		return -ENODEV; +		return -EPROBE_DEFER;  	}  	mux->parent = parent; diff --git a/drivers/i2c/muxes/i2c-mux-pinctrl.c b/drivers/i2c/muxes/i2c-mux-pinctrl.c index 69a91732ae6..68a37157377 100644 --- a/drivers/i2c/muxes/i2c-mux-pinctrl.c +++ b/drivers/i2c/muxes/i2c-mux-pinctrl.c @@ -113,7 +113,7 @@ static int i2c_mux_pinctrl_parse_dt(struct i2c_mux_pinctrl *mux,  	adapter = of_find_i2c_adapter_by_node(adapter_np);  	if (!adapter) {  		dev_err(mux->dev, "Cannot find parent bus\n"); -		return -ENODEV; +		return -EPROBE_DEFER;  	}  	mux->pdata->parent_bus_num = i2c_adapter_id(adapter);  	put_device(&adapter->dev); @@ -211,7 +211,7 @@ static int i2c_mux_pinctrl_probe(struct platform_device *pdev)  	if (!mux->parent) {  		dev_err(&pdev->dev, "Parent adapter (%d) not found\n",  			mux->pdata->parent_bus_num); -		ret = -ENODEV; +		ret = -EPROBE_DEFER;  		goto err;  	} | 
