Commit a7d3bb00 authored by Rob Clark's avatar Rob Clark

drm/msm/mdp5: add tracking for clk enable-count

Accessing registers for an unclocked block is an insta-reboot on
snapdragon devices.  So add a bit of logic to track the enable_count so
we can WARN_ON() unclocked register writes.  This makes it much easier
to track down mistakes.
Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
parent a0ce4d23
...@@ -249,6 +249,9 @@ int mdp5_disable(struct mdp5_kms *mdp5_kms) ...@@ -249,6 +249,9 @@ int mdp5_disable(struct mdp5_kms *mdp5_kms)
{ {
DBG(""); DBG("");
mdp5_kms->enable_count--;
WARN_ON(mdp5_kms->enable_count < 0);
clk_disable_unprepare(mdp5_kms->ahb_clk); clk_disable_unprepare(mdp5_kms->ahb_clk);
clk_disable_unprepare(mdp5_kms->axi_clk); clk_disable_unprepare(mdp5_kms->axi_clk);
clk_disable_unprepare(mdp5_kms->core_clk); clk_disable_unprepare(mdp5_kms->core_clk);
...@@ -262,6 +265,8 @@ int mdp5_enable(struct mdp5_kms *mdp5_kms) ...@@ -262,6 +265,8 @@ int mdp5_enable(struct mdp5_kms *mdp5_kms)
{ {
DBG(""); DBG("");
mdp5_kms->enable_count++;
clk_prepare_enable(mdp5_kms->ahb_clk); clk_prepare_enable(mdp5_kms->ahb_clk);
clk_prepare_enable(mdp5_kms->axi_clk); clk_prepare_enable(mdp5_kms->axi_clk);
clk_prepare_enable(mdp5_kms->core_clk); clk_prepare_enable(mdp5_kms->core_clk);
......
...@@ -76,6 +76,8 @@ struct mdp5_kms { ...@@ -76,6 +76,8 @@ struct mdp5_kms {
bool rpm_enabled; bool rpm_enabled;
struct mdp_irq error_handler; struct mdp_irq error_handler;
int enable_count;
}; };
#define to_mdp5_kms(x) container_of(x, struct mdp5_kms, base) #define to_mdp5_kms(x) container_of(x, struct mdp5_kms, base)
...@@ -167,11 +169,13 @@ struct mdp5_encoder { ...@@ -167,11 +169,13 @@ struct mdp5_encoder {
static inline void mdp5_write(struct mdp5_kms *mdp5_kms, u32 reg, u32 data) static inline void mdp5_write(struct mdp5_kms *mdp5_kms, u32 reg, u32 data)
{ {
WARN_ON(mdp5_kms->enable_count <= 0);
msm_writel(data, mdp5_kms->mmio + reg); msm_writel(data, mdp5_kms->mmio + reg);
} }
static inline u32 mdp5_read(struct mdp5_kms *mdp5_kms, u32 reg) static inline u32 mdp5_read(struct mdp5_kms *mdp5_kms, u32 reg)
{ {
WARN_ON(mdp5_kms->enable_count <= 0);
return msm_readl(mdp5_kms->mmio + reg); return msm_readl(mdp5_kms->mmio + reg);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment