Skip to contentSkip to conversation

i2c: designware: add reset interface

PATCH RESEND New Zhangfei Gao 4 participants 5 messages Dec 27, 2016 – Mar 9, 2017

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH RESEND v3 1/1 i2c: designware: add reset interface

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

---
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(-)
drivers/i2c/busses/i2c-designware-core.h +1 -0
index 26250b4..302807c 100644
@@ -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;
drivers/i2c/busses/i2c-designware-platdrv.c +24 -4
index 6ce4313..79c4b4e 100644
@@ -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;
 }
Signature · 1 line
2.7.4
#1 lore raw

PATCH RESEND v3 1/1 i2c: designware: add reset interface

Quoted 5 lines · Zhangfei Gao

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

Quoted 7 lines

---
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(-)
#3 lore raw

PATCH RESEND v3 1/1 i2c: designware: add reset interface

Hi Wolfram

Quoted 9 lines · Wolfram Sang
Quoted 5 lines · Zhangfei Gao

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

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?

Signature · 4 lines
Best Regards

Ramiro Oliveira
Ramiro.Oliveira at synopsys.com
Applied
#4 lore raw

PATCH RESEND v3 1/1 i2c: designware: add reset interface

Quoted 10 lines · Ramiro Oliveira

Hi Wolfram

Quoted 7 lines · Wolfram Sang
Quoted 5 lines · Zhangfei Gao

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

Quoted 5 lines
Quoted 2 lines

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!

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20170309/e4894bf1/attachment.sig>