diff options
author | Fancy Fang <chen.fang@nxp.com> | 2019-05-26 21:45:48 +0800 |
---|---|---|
committer | Fancy Fang <chen.fang@nxp.com> | 2019-05-28 16:29:48 +0800 |
commit | f22589c76eef08f0a4a307e3320f6559fb84af3b (patch) | |
tree | 8f95dd6d0fb75f6dd024e2823467f4993a298d52 | |
parent | c302d0b9bbd689155e898b045f623e28263c5803 (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.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/imx/sec_mipi_dsim-imx.c | 9 |
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; |