diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2017-02-18 06:38:25 -0800 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-02-18 06:38:24 -0800 |
| commit | 237a49b33024faa6ce17c7a289c630266c574b10 (patch) | |
| tree | abbd9073c5873f471dfe74687ccd769855e5aedb | |
| parent | 4160f2ac41202e7069e8a5c1f8efad15869a634a (diff) | |
| parent | 432ea6de2e50c7065ebefb25f5363564b4c310ea (diff) | |
Merge "msm: sde: Fix SW timestamp initialization when missing power event"
| -rw-r--r-- | drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c | 37 | ||||
| -rw-r--r-- | drivers/media/platform/msm/sde/rotator/sde_rotator_r3_hwio.h | 1 |
2 files changed, 38 insertions, 0 deletions
diff --git a/drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c b/drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c index 89fde987d4c1..2c79ad7e45be 100644 --- a/drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c +++ b/drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c @@ -1599,6 +1599,7 @@ static int sde_hw_rotator_config(struct sde_rot_hw_resource *hw, u32 danger_lut = 0; /* applicable for realtime client only */ u32 safe_lut = 0; /* applicable for realtime client only */ u32 flags = 0; + u32 rststs = 0; struct sde_rotation_item *item; if (!hw || !entry) { @@ -1616,10 +1617,46 @@ static int sde_hw_rotator_config(struct sde_rot_hw_resource *hw, return -EINVAL; } + /* + * if Rotator HW is reset, but missing PM event notification, we + * need to init the SW timestamp automatically. + */ + rststs = SDE_ROTREG_READ(rot->mdss_base, REGDMA_RESET_STATUS_REG); + if (!rot->reset_hw_ts && rststs) { + u32 l_ts, h_ts, swts; + + swts = SDE_ROTREG_READ(rot->mdss_base, REGDMA_TIMESTAMP_REG); + h_ts = atomic_read(&rot->timestamp[ROT_QUEUE_HIGH_PRIORITY]); + l_ts = atomic_read(&rot->timestamp[ROT_QUEUE_LOW_PRIORITY]); + SDEROT_EVTLOG(0xbad0, rststs, swts, h_ts, l_ts); + + if (ctx->q_id == ROT_QUEUE_HIGH_PRIORITY) + h_ts = (h_ts - 1) & SDE_REGDMA_SWTS_MASK; + else + l_ts = (l_ts - 1) & SDE_REGDMA_SWTS_MASK; + + /* construct the combined timstamp */ + swts = (h_ts & SDE_REGDMA_SWTS_MASK) | + ((l_ts & SDE_REGDMA_SWTS_MASK) << + SDE_REGDMA_SWTS_SHIFT); + + SDEROT_DBG("swts:0x%x, h_ts:0x%x, l_ts;0x%x\n", + swts, h_ts, l_ts); + SDEROT_EVTLOG(0x900d, swts, h_ts, l_ts); + rot->last_hw_ts = swts; + + SDE_ROTREG_WRITE(rot->mdss_base, REGDMA_TIMESTAMP_REG, + rot->last_hw_ts); + SDE_ROTREG_WRITE(rot->mdss_base, REGDMA_RESET_STATUS_REG, 0); + /* ensure write is issued to the rotator HW */ + wmb(); + } + if (rot->reset_hw_ts) { SDEROT_EVTLOG(rot->last_hw_ts); SDE_ROTREG_WRITE(rot->mdss_base, REGDMA_TIMESTAMP_REG, rot->last_hw_ts); + SDE_ROTREG_WRITE(rot->mdss_base, REGDMA_RESET_STATUS_REG, 0); /* ensure write is issued to the rotator HW */ wmb(); rot->reset_hw_ts = false; diff --git a/drivers/media/platform/msm/sde/rotator/sde_rotator_r3_hwio.h b/drivers/media/platform/msm/sde/rotator/sde_rotator_r3_hwio.h index fedade122b88..b721ec54229d 100644 --- a/drivers/media/platform/msm/sde/rotator/sde_rotator_r3_hwio.h +++ b/drivers/media/platform/msm/sde/rotator/sde_rotator_r3_hwio.h @@ -277,5 +277,6 @@ #define REGDMA_INT_LOW_MASK 0x00000700 #define REGDMA_INT_ERR_MASK 0x000F0000 #define REGDMA_TIMESTAMP_REG ROT_SSPP_TPG_PATTERN_GEN_INIT_VAL +#define REGDMA_RESET_STATUS_REG ROT_SSPP_TPG_RGB_MAPPING #endif /*_SDE_ROTATOR_R3_HWIO_H */ |
