Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1573507 > unrolled thread

[PATCH] i2c: designwear: Fix clk warning on suspend/resume

Started byJohn Stultz <john.stultz@linaro.org>
First post2017-02-04 00:10 +0100
Last post2017-02-06 10:40 +0100
Articles 2 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH] i2c: designwear: Fix clk warning on suspend/resume John Stultz <john.stultz@linaro.org> - 2017-02-04 00:10 +0100
    Re: [PATCH] i2c: designwear: Fix clk warning on suspend/resume Jarkko Nikula <jarkko.nikula@linux.intel.com> - 2017-02-06 10:40 +0100

#1573507 — [PATCH] i2c: designwear: Fix clk warning on suspend/resume

FromJohn Stultz <john.stultz@linaro.org>
Date2017-02-04 00:10 +0100
Subject[PATCH] i2c: designwear: Fix clk warning on suspend/resume
Message-ID<t6V9n-8rI-1@gated-at.bofh.it>
On my HiKey board, I'm seeing clk warnings on suspend/resume, which
seem to be caused by runtime pm suspending the device, then the same
suspend hook being called again on suspend time.

Thus this patch adds suspend state tracking to avoid runtime pm and
suspend causing double suspend calls on i2c-designware-platdrv.

Feedback would be greatly appreciated!

Cc: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Mika Westerberg <mika.westerberg@linux.intel.com>
Cc: Wolfram Sang <wsa@the-dreams.de>
Cc: linux-i2c@vger.kernel.org
Signed-off-by: John Stultz <john.stultz@linaro.org>
---
 drivers/i2c/busses/i2c-designware-core.h    | 1 +
 drivers/i2c/busses/i2c-designware-platdrv.c | 9 +++++++++
 2 files changed, 10 insertions(+)

diff --git a/drivers/i2c/busses/i2c-designware-core.h b/drivers/i2c/busses/i2c-designware-core.h
index 26250b4..386cacb 100644
--- a/drivers/i2c/busses/i2c-designware-core.h
+++ b/drivers/i2c/busses/i2c-designware-core.h
@@ -126,6 +126,7 @@ struct dw_i2c_dev {
 	void			(*release_lock)(struct dw_i2c_dev *dev);
 	bool			pm_runtime_disabled;
 	bool			dynamic_tar_update_enabled;
+	bool			suspended;
 };
 
 #define ACCESS_SWAP		0x00000001
diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
index 6ce4313..54084fe 100644
--- a/drivers/i2c/busses/i2c-designware-platdrv.c
+++ b/drivers/i2c/busses/i2c-designware-platdrv.c
@@ -340,8 +340,12 @@ static int dw_i2c_plat_suspend(struct device *dev)
 	struct platform_device *pdev = to_platform_device(dev);
 	struct dw_i2c_dev *i_dev = platform_get_drvdata(pdev);
 
+	if (i_dev->suspended)
+		return 0;
+
 	i2c_dw_disable(i_dev);
 	i2c_dw_plat_prepare_clk(i_dev, false);
+	i_dev->suspended = true;
 
 	return 0;
 }
@@ -351,11 +355,16 @@ static int dw_i2c_plat_resume(struct device *dev)
 	struct platform_device *pdev = to_platform_device(dev);
 	struct dw_i2c_dev *i_dev = platform_get_drvdata(pdev);
 
+	if (!i_dev->suspended)
+		return 0;
+
 	i2c_dw_plat_prepare_clk(i_dev, true);
 
 	if (!i_dev->pm_runtime_disabled)
 		i2c_dw_init(i_dev);
 
+	i_dev->suspended = false;
+
 	return 0;
 }
 
-- 
2.7.4

[toc] | [next] | [standalone]


#1574500

FromJarkko Nikula <jarkko.nikula@linux.intel.com>
Date2017-02-06 10:40 +0100
Message-ID<t7NWa-3aZ-13@gated-at.bofh.it>
In reply to#1573507
Hi

On 04.02.2017 01:01, John Stultz wrote:
> On my HiKey board, I'm seeing clk warnings on suspend/resume, which
> seem to be caused by runtime pm suspending the device, then the same
> suspend hook being called again on suspend time.
>
> Thus this patch adds suspend state tracking to avoid runtime pm and
> suspend causing double suspend calls on i2c-designware-platdrv.
>
> Feedback would be greatly appreciated!
>
> Cc: Jarkko Nikula <jarkko.nikula@linux.intel.com>
> Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Cc: Mika Westerberg <mika.westerberg@linux.intel.com>
> Cc: Wolfram Sang <wsa@the-dreams.de>
> Cc: linux-i2c@vger.kernel.org
> Signed-off-by: John Stultz <john.stultz@linaro.org>
> ---
>  drivers/i2c/busses/i2c-designware-core.h    | 1 +
>  drivers/i2c/busses/i2c-designware-platdrv.c | 9 +++++++++
>  2 files changed, 10 insertions(+)
>
...
> @@ -340,8 +340,12 @@ static int dw_i2c_plat_suspend(struct device *dev)
>  	struct platform_device *pdev = to_platform_device(dev);
>  	struct dw_i2c_dev *i_dev = platform_get_drvdata(pdev);
>
> +	if (i_dev->suspended)
> +		return 0;
> +
>  	i2c_dw_disable(i_dev);
>  	i2c_dw_plat_prepare_clk(i_dev, false);
> +	i_dev->suspended = true;
>
This feels a band-aid fix. At quick look some drivers appear to use 
SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, 
pm_runtime_force_resume) in their dev_pm_ops.

Could you try does it help in your case and I'll check our platforms.

-- 
Jarkko

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web