drm/msm/mdp5: add tracking for clk enable-count
authorRob Clark <robdclark@gmail.com>
Mon, 3 Jul 2017 17:13:57 +0000 (13:13 -0400)
committerRob Clark <robdclark@gmail.com>
Tue, 22 Aug 2017 17:20:37 +0000 (13:20 -0400)
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: Rob Clark <robdclark@gmail.com>
drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c
drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h

index b0800bad8ac8ffd4d36061663c9083f5a1ed2eb4..9f9d95f7c80f87ed78f390db8698e4b09b35fa05 100644 (file)
@@ -249,6 +249,9 @@ int mdp5_disable(struct mdp5_kms *mdp5_kms)
 {
        DBG("");
 
+       mdp5_kms->enable_count--;
+       WARN_ON(mdp5_kms->enable_count < 0);
+
        clk_disable_unprepare(mdp5_kms->ahb_clk);
        clk_disable_unprepare(mdp5_kms->axi_clk);
        clk_disable_unprepare(mdp5_kms->core_clk);
@@ -262,6 +265,8 @@ int mdp5_enable(struct mdp5_kms *mdp5_kms)
 {
        DBG("");
 
+       mdp5_kms->enable_count++;
+
        clk_prepare_enable(mdp5_kms->ahb_clk);
        clk_prepare_enable(mdp5_kms->axi_clk);
        clk_prepare_enable(mdp5_kms->core_clk);
index b42461cda22dd215e8b4174d431f52c6e98bb993..9b3fe01089d13812d9b143997815702f210ab83c 100644 (file)
@@ -76,6 +76,8 @@ struct mdp5_kms {
        bool rpm_enabled;
 
        struct mdp_irq error_handler;
+
+       int enable_count;
 };
 #define to_mdp5_kms(x) container_of(x, struct mdp5_kms, base)
 
@@ -167,11 +169,13 @@ struct mdp5_encoder {
 
 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);
 }
 
 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);
 }