From patchwork Mon Jun 17 13:16:45 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [V10,Resend] i2c/designware: Provide i2c bus recovery support X-Patchwork-Submitter: Viresh Kumar X-Patchwork-Id: 251846 Message-Id: <70c7ee79478cc2b89ad876d814207c6433e26a59.1371474881.git.viresh.kumar@linaro.org> To: wsa@the-dreams.de Cc: khali@linux-fr.org, linux-i2c@vger.kernel.org, spear-devel@list.st.com, u.kleine-koenig@pengutronix.de, Viresh Kumar , Vincenzo Frascino , Shiraz Hashim Date: Mon, 17 Jun 2013 18:46:45 +0530 From: Viresh Kumar List-Id: Add bus recovery support for designware_i2c controller. It uses generic gpio based i2c_gpio_recover_bus() routine. Platforms need to pass struct i2c_bus_recovery_info as platform data to designware I2C controller. Signed-off-by: Vincenzo Frascino Signed-off-by: Shiraz Hashim Signed-off-by: Viresh Kumar --- This patch isn't drawing attention since sometime, so sending it again. drivers/i2c/busses/i2c-designware-core.c | 5 ++++- drivers/i2c/busses/i2c-designware-platdrv.c | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c index c41ca63..5ecb2f0 100644 --- a/drivers/i2c/busses/i2c-designware-core.c +++ b/drivers/i2c/busses/i2c-designware-core.c @@ -583,7 +583,10 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) ret = wait_for_completion_interruptible_timeout(&dev->cmd_complete, HZ); if (ret == 0) { dev_err(dev->dev, "controller timed out\n"); - i2c_dw_init(dev); + + if (i2c_recover_bus(adap) < 0) + i2c_dw_init(dev); + ret = -ETIMEDOUT; goto done; } else if (ret < 0) diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c index 35b70a1..c3ada3e 100644 --- a/drivers/i2c/busses/i2c-designware-platdrv.c +++ b/drivers/i2c/busses/i2c-designware-platdrv.c @@ -162,6 +162,12 @@ static int dw_i2c_probe(struct platform_device *pdev) adap->dev.parent = &pdev->dev; adap->dev.of_node = pdev->dev.of_node; + /* Bus recovery support */ + adap->bus_recovery_info = dev_get_platdata(&pdev->dev); + if (adap->bus_recovery_info) + adap->bus_recovery_info->recover_bus = + i2c_generic_gpio_recovery; + r = i2c_add_numbered_adapter(adap); if (r) { dev_err(&pdev->dev, "failure adding adapter\n");