From 13c6deed08544151e151be5fed240359724bc7f9 Mon Sep 17 00:00:00 2001 From: Fancy Fang Date: Wed, 29 Aug 2018 10:58:19 +0800 Subject: [PATCH] MLK-19400-2 drm/imx: sec-dsim_imx: alter 'rpm_suspended' to a counter Since the DSIM's runtime PM suspend() and resume() callbacks are also called during system PM suspend() and resume(), it is necessary to use a counter to record the suspended depth, and 'rpm_suspended' field can be used as this purpose which can help to detect and avoid runtime suspend and resume calls mismatch caused problems, by changing the 'rpm_suspended' to be an atomic integer from a boolean type. Signed-off-by: Fancy Fang (cherry picked from commit 91a8e6c8f63db328fbc752b1659bdaa67ee5c8d5) (cherry picked from commit 09f6ef5494d5fec7e3949bd80e4b51200b60dee3) --- drivers/gpu/drm/imx/sec_mipi_dsim-imx.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/imx/sec_mipi_dsim-imx.c b/drivers/gpu/drm/imx/sec_mipi_dsim-imx.c index f39d0709d3d5..d267039cfa88 100644 --- a/drivers/gpu/drm/imx/sec_mipi_dsim-imx.c +++ b/drivers/gpu/drm/imx/sec_mipi_dsim-imx.c @@ -51,7 +51,7 @@ struct imx_sec_dsim_device { struct drm_encoder encoder; struct regmap *gpr; - bool rpm_suspended; + atomic_t rpm_suspended; }; #define enc_to_dsim(enc) container_of(enc, struct imx_sec_dsim_device, encoder) @@ -267,8 +267,9 @@ static int imx_sec_dsim_bind(struct device *dev, struct device *master, return ret; } + atomic_set(&dsim_dev->rpm_suspended, 0); pm_runtime_enable(dev); - dsim_dev->rpm_suspended = true; + atomic_inc(&dsim_dev->rpm_suspended); dev_dbg(dev, "%s: dsim bind end\n", __func__); @@ -328,21 +329,25 @@ static int imx_sec_dsim_resume(struct device *dev) #ifdef CONFIG_PM static int imx_sec_dsim_runtime_suspend(struct device *dev) { - if (dsim_dev->rpm_suspended == true) + if (atomic_inc_return(&dsim_dev->rpm_suspended) > 1) return 0; sec_mipi_dsim_suspend(dev); release_bus_freq(BUS_FREQ_HIGH); - dsim_dev->rpm_suspended = true; - return 0; } static int imx_sec_dsim_runtime_resume(struct device *dev) { - if (dsim_dev->rpm_suspended == false) + if (unlikely(!atomic_read(&dsim_dev->rpm_suspended))) { + dev_warn(dsim_dev->dev, + "Unbalanced %s!\n", __func__); + return 0; + } + + if (!atomic_dec_and_test(&dsim_dev->rpm_suspended)) return 0; request_bus_freq(BUS_FREQ_HIGH); @@ -354,8 +359,6 @@ static int imx_sec_dsim_runtime_resume(struct device *dev) sec_mipi_dsim_resume(dev); - dsim_dev->rpm_suspended = false; - return 0; } #endif -- 2.17.1