[v3,resend] i2c: designware: add reset interface

Message ID 1482848560-3752-1-git-send-email-zhangfei.gao@linaro.org
State New
Headers show

Commit Message

Zhangfei Gao Dec. 27, 2016, 2:22 p.m.
Some platforms like hi3660 need do reset first to allow accessing registers

Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org>

Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

Tested-by: Ramiro Oliveira <ramiro.oliveira@synopsys.com>

---
rebase to 4.10-rc1

 drivers/i2c/busses/i2c-designware-core.h    |  1 +
 drivers/i2c/busses/i2c-designware-platdrv.c | 28 ++++++++++++++++++++++++----
 2 files changed, 25 insertions(+), 4 deletions(-)

-- 
2.7.4

--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Jarkko Nikula Dec. 27, 2016, 2:41 p.m. | #1
On 12/27/2016 04:22 PM, Zhangfei Gao wrote:
> Some platforms like hi3660 need do reset first to allow accessing registers

>

> Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org>

> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

> Tested-by: Ramiro Oliveira <ramiro.oliveira@synopsys.com>

> ---

> rebase to 4.10-rc1

>

>  drivers/i2c/busses/i2c-designware-core.h    |  1 +

>  drivers/i2c/busses/i2c-designware-platdrv.c | 28 ++++++++++++++++++++++++----

>  2 files changed, 25 insertions(+), 4 deletions(-)

>

Acked-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>

--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Wolfram Sang Jan. 12, 2017, 6:54 p.m. | #2
On Tue, Dec 27, 2016 at 10:22:40PM +0800, Zhangfei Gao wrote:
> Some platforms like hi3660 need do reset first to allow accessing registers

> 

> Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org>

> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

> Tested-by: Ramiro Oliveira <ramiro.oliveira@synopsys.com>


Applied to for-next, thanks!

--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Ramiro Oliveira March 6, 2017, 3:11 p.m. | #3
Hi Wolfram

On 1/12/2017 6:54 PM, Wolfram Sang wrote:
> On Tue, Dec 27, 2016 at 10:22:40PM +0800, Zhangfei Gao wrote:

>> Some platforms like hi3660 need do reset first to allow accessing registers

>>

>> Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org>

>> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

>> Tested-by: Ramiro Oliveira <ramiro.oliveira@synopsys.com>

> 

> Applied to for-next, thanks!

> 


I haven't been able to find this patch anywhere. Do you still have plans to
apply it to for-next?

-- 
Best Regards

Ramiro Oliveira
Ramiro.Oliveira@synopsys.com
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Wolfram Sang March 9, 2017, 2:43 p.m. | #4
On Mon, Mar 06, 2017 at 03:11:48PM +0000, Ramiro Oliveira wrote:
> Hi Wolfram

> 

> On 1/12/2017 6:54 PM, Wolfram Sang wrote:

> > On Tue, Dec 27, 2016 at 10:22:40PM +0800, Zhangfei Gao wrote:

> >> Some platforms like hi3660 need do reset first to allow accessing registers

> >>

> >> Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org>

> >> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

> >> Tested-by: Ramiro Oliveira <ramiro.oliveira@synopsys.com>

> > 

> > Applied to for-next, thanks!

> > 

> 

> I haven't been able to find this patch anywhere. Do you still have plans to

> apply it to for-next?


Uh, thanks for the heads up. Can't really tell why it fell through the
cracks :( It probably got lost by an improper rebase by me? Sorry about
that.

Applied to for-current, thanks again!

Patch hide | download patch | download mbox

diff --git a/drivers/i2c/busses/i2c-designware-core.h b/drivers/i2c/busses/i2c-designware-core.h
index 26250b4..302807c 100644
--- a/drivers/i2c/busses/i2c-designware-core.h
+++ b/drivers/i2c/busses/i2c-designware-core.h
@@ -88,6 +88,7 @@  struct dw_i2c_dev {
 	void __iomem		*base;
 	struct completion	cmd_complete;
 	struct clk		*clk;
+	struct reset_control	*rst;
 	u32			(*get_clk_rate_khz) (struct dw_i2c_dev *dev);
 	struct dw_pci_controller *controller;
 	int			cmd_err;
diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
index 6ce4313..79c4b4e 100644
--- a/drivers/i2c/busses/i2c-designware-platdrv.c
+++ b/drivers/i2c/busses/i2c-designware-platdrv.c
@@ -38,6 +38,7 @@ 
 #include <linux/pm_runtime.h>
 #include <linux/property.h>
 #include <linux/io.h>
+#include <linux/reset.h>
 #include <linux/slab.h>
 #include <linux/acpi.h>
 #include <linux/platform_data/i2c-designware.h>
@@ -199,6 +200,14 @@  static int dw_i2c_plat_probe(struct platform_device *pdev)
 	dev->irq = irq;
 	platform_set_drvdata(pdev, dev);
 
+	dev->rst = devm_reset_control_get_optional_exclusive(&pdev->dev, NULL);
+	if (IS_ERR(dev->rst)) {
+		if (PTR_ERR(dev->rst) == -EPROBE_DEFER)
+			return -EPROBE_DEFER;
+	} else {
+		reset_control_deassert(dev->rst);
+	}
+
 	if (pdata) {
 		dev->clk_freq = pdata->i2c_scl_freq;
 	} else {
@@ -235,12 +244,13 @@  static int dw_i2c_plat_probe(struct platform_device *pdev)
 	    && dev->clk_freq != 1000000 && dev->clk_freq != 3400000) {
 		dev_err(&pdev->dev,
 			"Only 100kHz, 400kHz, 1MHz and 3.4MHz supported");
-		return -EINVAL;
+		r = -EINVAL;
+		goto exit_reset;
 	}
 
 	r = i2c_dw_eval_lock_support(dev);
 	if (r)
-		return r;
+		goto exit_reset;
 
 	dev->functionality = I2C_FUNC_10BIT_ADDR | DW_IC_DEFAULT_FUNCTIONALITY;
 
@@ -286,10 +296,18 @@  static int dw_i2c_plat_probe(struct platform_device *pdev)
 	}
 
 	r = i2c_dw_probe(dev);
-	if (r && !dev->pm_runtime_disabled)
-		pm_runtime_disable(&pdev->dev);
+	if (r)
+		goto exit_probe;
 
 	return r;
+
+exit_probe:
+	if (!dev->pm_runtime_disabled)
+		pm_runtime_disable(&pdev->dev);
+exit_reset:
+	if (!IS_ERR_OR_NULL(dev->rst))
+		reset_control_assert(dev->rst);
+	return r;
 }
 
 static int dw_i2c_plat_remove(struct platform_device *pdev)
@@ -306,6 +324,8 @@  static int dw_i2c_plat_remove(struct platform_device *pdev)
 	pm_runtime_put_sync(&pdev->dev);
 	if (!dev->pm_runtime_disabled)
 		pm_runtime_disable(&pdev->dev);
+	if (!IS_ERR_OR_NULL(dev->rst))
+		reset_control_assert(dev->rst);
 
 	return 0;
 }