summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFancy Fang <chen.fang@nxp.com>2019-05-26 21:45:48 +0800
committerFancy Fang <chen.fang@nxp.com>2019-05-28 16:29:48 +0800
commitf22589c76eef08f0a4a307e3320f6559fb84af3b (patch)
tree8f95dd6d0fb75f6dd024e2823467f4993a298d52
parentc302d0b9bbd689155e898b045f623e28263c5803 (diff)
MLK-21880-1 drm/bridge: sec-dsim: correct DSIM version register access
During the DSIM binding stage, only enable cfg clock is not enough to access the version register, since at this time, if the DSIM is still in the reset state, the register read will always return 0. So before the version register read, the runtime pm should be in resume state. Signed-off-by: Fancy Fang <chen.fang@nxp.com>
-rw-r--r--drivers/gpu/drm/bridge/sec-dsim.c9
-rw-r--r--drivers/gpu/drm/imx/sec_mipi_dsim-imx.c9
2 files changed, 10 insertions, 8 deletions
diff --git a/drivers/gpu/drm/bridge/sec-dsim.c b/drivers/gpu/drm/bridge/sec-dsim.c
index 2349e55530b2..303122217833 100644
--- a/drivers/gpu/drm/bridge/sec-dsim.c
+++ b/drivers/gpu/drm/bridge/sec-dsim.c
@@ -22,6 +22,7 @@
#include <linux/log2.h>
#include <linux/module.h>
#include <linux/of_graph.h>
+#include <linux/pm_runtime.h>
#include <drm/bridge/sec_mipi_dsim.h>
#include <drm/drmP.h>
#include <drm/drm_atomic_helper.h>
@@ -1840,10 +1841,12 @@ int sec_mipi_dsim_bind(struct device *dev, struct device *master, void *data,
return ret;
}
- clk_prepare_enable(dsim->clk_cfg);
+ dev_set_drvdata(dev, dsim);
+
+ pm_runtime_get_sync(dev);
version = dsim_read(dsim, DSIM_VERSION);
WARN_ON(version != pdata->version);
- clk_disable_unprepare(dsim->clk_cfg);
+ pm_runtime_put_sync(dev);
dev_info(dev, "version number is %#x\n", version);
@@ -1898,8 +1901,6 @@ int sec_mipi_dsim_bind(struct device *dev, struct device *master, void *data,
bridge->encoder = encoder;
encoder->bridge = bridge;
- dev_set_drvdata(dev, dsim);
-
/* attach sec dsim bridge and its next bridge if exists */
ret = drm_bridge_attach(encoder, bridge, NULL);
if (ret) {
diff --git a/drivers/gpu/drm/imx/sec_mipi_dsim-imx.c b/drivers/gpu/drm/imx/sec_mipi_dsim-imx.c
index 427fb1aa39dc..560323301a6a 100644
--- a/drivers/gpu/drm/imx/sec_mipi_dsim-imx.c
+++ b/drivers/gpu/drm/imx/sec_mipi_dsim-imx.c
@@ -261,18 +261,19 @@ static int imx_sec_dsim_bind(struct device *dev, struct device *master,
if (ret)
return ret;
+ atomic_set(&dsim_dev->rpm_suspended, 0);
+ pm_runtime_enable(dev);
+ atomic_inc(&dsim_dev->rpm_suspended);
+
/* bind sec dsim bridge */
ret = sec_mipi_dsim_bind(dev, master, data, encoder, res, irq, pdata);
if (ret) {
dev_err(dev, "failed to bind sec dsim bridge: %d\n", ret);
+ pm_runtime_disable(dev);
drm_encoder_cleanup(encoder);
return ret;
}
- atomic_set(&dsim_dev->rpm_suspended, 0);
- pm_runtime_enable(dev);
- atomic_inc(&dsim_dev->rpm_suspended);
-
dev_dbg(dev, "%s: dsim bind end\n", __func__);
return 0;