aboutsummaryrefslogtreecommitdiff
path: root/drivers/media/platform/s5p-tv/mixer_reg.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/platform/s5p-tv/mixer_reg.c')
-rw-r--r--drivers/media/platform/s5p-tv/mixer_reg.c37
1 files changed, 30 insertions, 7 deletions
diff --git a/drivers/media/platform/s5p-tv/mixer_reg.c b/drivers/media/platform/s5p-tv/mixer_reg.c
index b713403024e..56d9b45c3ab 100644
--- a/drivers/media/platform/s5p-tv/mixer_reg.c
+++ b/drivers/media/platform/s5p-tv/mixer_reg.c
@@ -57,12 +57,25 @@ static inline void mxr_write_mask(struct mxr_device *mdev, u32 reg_id,
writel(val, mdev->res.mxr_regs + reg_id);
}
+static void mxr_reg_layer_update(struct mxr_device *mdev)
+{
+ u32 val;
+
+ val = mxr_read(mdev, MXR_CFG);
+
+ /* allow one update per vsync only */
+ if (!(val & MXR_CFG_LAYER_UPDATE_COUNT_MASK))
+ mxr_write_mask(mdev, MXR_CFG, ~0, MXR_CFG_LAYER_UPDATE);
+}
+
void mxr_vsync_set_update(struct mxr_device *mdev, int en)
{
/* block update on vsync */
mxr_write_mask(mdev, MXR_STATUS, en ? MXR_STATUS_SYNC_ENABLE : 0,
MXR_STATUS_SYNC_ENABLE);
- vp_write(mdev, VP_SHADOW_UPDATE, en ? VP_SHADOW_UPDATE_ENABLE : 0);
+ if (mdev->vp_enabled)
+ vp_write(mdev, VP_SHADOW_UPDATE,
+ en ? VP_SHADOW_UPDATE_ENABLE : 0);
}
static void __mxr_reg_vp_reset(struct mxr_device *mdev)
@@ -103,8 +116,9 @@ void mxr_reg_reset(struct mxr_device *mdev)
* layer1 - OSD
*/
val = MXR_LAYER_CFG_GRP0_VAL(1);
- val |= MXR_LAYER_CFG_VP_VAL(2);
val |= MXR_LAYER_CFG_GRP1_VAL(3);
+ if (mdev->vp_enabled)
+ val |= MXR_LAYER_CFG_VP_VAL(2);
mxr_write(mdev, MXR_LAYER_CFG, val);
/* use dark gray background color */
@@ -123,8 +137,10 @@ void mxr_reg_reset(struct mxr_device *mdev)
mxr_write(mdev, MXR_GRAPHIC_CFG(1), val);
/* configuration of Video Processor Registers */
- __mxr_reg_vp_reset(mdev);
- mxr_reg_vp_default_filter(mdev);
+ if (mdev->vp_enabled) {
+ __mxr_reg_vp_reset(mdev);
+ mxr_reg_vp_default_filter(mdev);
+ }
/* enable all interrupts */
mxr_write_mask(mdev, MXR_INT_EN, ~0, MXR_INT_EN_ALL);
@@ -225,6 +241,9 @@ void mxr_reg_graph_buffer(struct mxr_device *mdev, int idx, dma_addr_t addr)
mxr_write_mask(mdev, MXR_CFG, val, MXR_CFG_GRP1_ENABLE);
mxr_write(mdev, MXR_GRAPHIC_BASE(idx), addr);
+ if (mdev->mxr_ver == MXR_VER_16_0_33_0)
+ mxr_reg_layer_update(mdev);
+
mxr_vsync_set_update(mdev, MXR_ENABLE);
spin_unlock_irqrestore(&mdev->reg_slock, flags);
}
@@ -409,8 +428,11 @@ void mxr_reg_set_mbus_fmt(struct mxr_device *mdev,
MXR_CFG_OUT_MASK);
val = (fmt->field == V4L2_FIELD_INTERLACED) ? ~0 : 0;
- vp_write_mask(mdev, VP_MODE, val,
- VP_MODE_LINE_SKIP | VP_MODE_FIELD_ID_AUTO_TOGGLING);
+
+ if (mdev->vp_enabled) {
+ vp_write_mask(mdev, VP_MODE, val,
+ VP_MODE_LINE_SKIP | VP_MODE_FIELD_ID_AUTO_TOGGLING);
+ }
mxr_vsync_set_update(mdev, MXR_ENABLE);
spin_unlock_irqrestore(&mdev->reg_slock, flags);
@@ -548,6 +570,7 @@ do { \
void mxr_reg_dump(struct mxr_device *mdev)
{
mxr_reg_mxr_dump(mdev);
- mxr_reg_vp_dump(mdev);
+ if (mdev->vp_enabled)
+ mxr_reg_vp_dump(mdev);
}