Commit b2192073 authored by Andrzej Hajda's avatar Andrzej Hajda Committed by Inki Dae

drm/exynos/decon5433: add function to set particular register bits

The driver often sets only particular bits of configuration registers.
Using separate function to such action simplifies the code.
Signed-off-by: default avatarAndrzej Hajda <a.hajda@samsung.com>
Signed-off-by: default avatarInki Dae <inki.dae@samsung.com>
parent 85de275a
...@@ -62,6 +62,13 @@ static const uint32_t decon_formats[] = { ...@@ -62,6 +62,13 @@ static const uint32_t decon_formats[] = {
DRM_FORMAT_ARGB8888, DRM_FORMAT_ARGB8888,
}; };
static inline void decon_set_bits(struct decon_context *ctx, u32 reg, u32 mask,
u32 val)
{
val = (val & mask) | (readl(ctx->addr + reg) & ~mask);
writel(val, ctx->addr + reg);
}
static int decon_enable_vblank(struct exynos_drm_crtc *crtc) static int decon_enable_vblank(struct exynos_drm_crtc *crtc)
{ {
struct decon_context *ctx = crtc->ctx; struct decon_context *ctx = crtc->ctx;
...@@ -215,16 +222,8 @@ static void decon_win_set_pixfmt(struct decon_context *ctx, unsigned int win, ...@@ -215,16 +222,8 @@ static void decon_win_set_pixfmt(struct decon_context *ctx, unsigned int win,
static void decon_shadow_protect_win(struct decon_context *ctx, int win, static void decon_shadow_protect_win(struct decon_context *ctx, int win,
bool protect) bool protect)
{ {
u32 val; decon_set_bits(ctx, DECON_SHADOWCON, SHADOWCON_Wx_PROTECT(win),
protect ? ~0 : 0);
val = readl(ctx->addr + DECON_SHADOWCON);
if (protect)
val |= SHADOWCON_Wx_PROTECT(win);
else
val &= ~SHADOWCON_Wx_PROTECT(win);
writel(val, ctx->addr + DECON_SHADOWCON);
} }
static void decon_atomic_begin(struct exynos_drm_crtc *crtc, static void decon_atomic_begin(struct exynos_drm_crtc *crtc,
...@@ -278,14 +277,10 @@ static void decon_update_plane(struct exynos_drm_crtc *crtc, ...@@ -278,14 +277,10 @@ static void decon_update_plane(struct exynos_drm_crtc *crtc,
decon_win_set_pixfmt(ctx, win, state->fb); decon_win_set_pixfmt(ctx, win, state->fb);
/* window enable */ /* window enable */
val = readl(ctx->addr + DECON_WINCONx(win)); decon_set_bits(ctx, DECON_WINCONx(win), WINCONx_ENWIN_F, ~0);
val |= WINCONx_ENWIN_F;
writel(val, ctx->addr + DECON_WINCONx(win));
/* standalone update */ /* standalone update */
val = readl(ctx->addr + DECON_UPDATE); decon_set_bits(ctx, DECON_UPDATE, STANDALONE_UPDATE_F, ~0);
val |= STANDALONE_UPDATE_F;
writel(val, ctx->addr + DECON_UPDATE);
} }
static void decon_disable_plane(struct exynos_drm_crtc *crtc, static void decon_disable_plane(struct exynos_drm_crtc *crtc,
...@@ -293,7 +288,6 @@ static void decon_disable_plane(struct exynos_drm_crtc *crtc, ...@@ -293,7 +288,6 @@ static void decon_disable_plane(struct exynos_drm_crtc *crtc,
{ {
struct decon_context *ctx = crtc->ctx; struct decon_context *ctx = crtc->ctx;
unsigned int win = plane->zpos; unsigned int win = plane->zpos;
u32 val;
if (ctx->suspended) if (ctx->suspended)
return; return;
...@@ -301,16 +295,12 @@ static void decon_disable_plane(struct exynos_drm_crtc *crtc, ...@@ -301,16 +295,12 @@ static void decon_disable_plane(struct exynos_drm_crtc *crtc,
decon_shadow_protect_win(ctx, win, true); decon_shadow_protect_win(ctx, win, true);
/* window disable */ /* window disable */
val = readl(ctx->addr + DECON_WINCONx(win)); decon_set_bits(ctx, DECON_WINCONx(win), WINCONx_ENWIN_F, 0);
val &= ~WINCONx_ENWIN_F;
writel(val, ctx->addr + DECON_WINCONx(win));
decon_shadow_protect_win(ctx, win, false); decon_shadow_protect_win(ctx, win, false);
/* standalone update */ /* standalone update */
val = readl(ctx->addr + DECON_UPDATE); decon_set_bits(ctx, DECON_UPDATE, STANDALONE_UPDATE_F, ~0);
val |= STANDALONE_UPDATE_F;
writel(val, ctx->addr + DECON_UPDATE);
} }
static void decon_atomic_flush(struct exynos_drm_crtc *crtc, static void decon_atomic_flush(struct exynos_drm_crtc *crtc,
...@@ -416,17 +406,12 @@ static void decon_disable(struct exynos_drm_crtc *crtc) ...@@ -416,17 +406,12 @@ static void decon_disable(struct exynos_drm_crtc *crtc)
void decon_te_irq_handler(struct exynos_drm_crtc *crtc) void decon_te_irq_handler(struct exynos_drm_crtc *crtc)
{ {
struct decon_context *ctx = crtc->ctx; struct decon_context *ctx = crtc->ctx;
u32 val;
if (!test_bit(BIT_CLKS_ENABLED, &ctx->enabled)) if (!test_bit(BIT_CLKS_ENABLED, &ctx->enabled))
return; return;
if (atomic_add_unless(&ctx->win_updated, -1, 0)) { if (atomic_add_unless(&ctx->win_updated, -1, 0))
/* trigger */ decon_set_bits(ctx, DECON_TRIGCON, TRIGCON_SWTRIGCMD, ~0);
val = readl(ctx->addr + DECON_TRIGCON);
val |= TRIGCON_SWTRIGCMD;
writel(val, ctx->addr + DECON_TRIGCON);
}
drm_crtc_handle_vblank(&ctx->crtc->base); drm_crtc_handle_vblank(&ctx->crtc->base);
} }
...@@ -435,7 +420,6 @@ static void decon_clear_channels(struct exynos_drm_crtc *crtc) ...@@ -435,7 +420,6 @@ static void decon_clear_channels(struct exynos_drm_crtc *crtc)
{ {
struct decon_context *ctx = crtc->ctx; struct decon_context *ctx = crtc->ctx;
int win, i, ret; int win, i, ret;
u32 val;
DRM_DEBUG_KMS("%s\n", __FILE__); DRM_DEBUG_KMS("%s\n", __FILE__);
...@@ -446,25 +430,10 @@ static void decon_clear_channels(struct exynos_drm_crtc *crtc) ...@@ -446,25 +430,10 @@ static void decon_clear_channels(struct exynos_drm_crtc *crtc)
} }
for (win = 0; win < WINDOWS_NR; win++) { for (win = 0; win < WINDOWS_NR; win++) {
/* shadow update disable */ decon_shadow_protect_win(ctx, win, true);
val = readl(ctx->addr + DECON_SHADOWCON); decon_set_bits(ctx, DECON_WINCONx(win), WINCONx_ENWIN_F, 0);
val |= SHADOWCON_Wx_PROTECT(win); decon_shadow_protect_win(ctx, win, false);
writel(val, ctx->addr + DECON_SHADOWCON); decon_set_bits(ctx, DECON_UPDATE, STANDALONE_UPDATE_F, ~0);
/* window disable */
val = readl(ctx->addr + DECON_WINCONx(win));
val &= ~WINCONx_ENWIN_F;
writel(val, ctx->addr + DECON_WINCONx(win));
/* shadow update enable */
val = readl(ctx->addr + DECON_SHADOWCON);
val &= ~SHADOWCON_Wx_PROTECT(win);
writel(val, ctx->addr + DECON_SHADOWCON);
/* standalone update */
val = readl(ctx->addr + DECON_UPDATE);
val |= STANDALONE_UPDATE_F;
writel(val, ctx->addr + DECON_UPDATE);
} }
/* TODO: wait for possible vsync */ /* TODO: wait for possible vsync */
msleep(50); msleep(50);
......
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