drm/exynos/decon5433: merge different flag fields
Driver uses four different fields for internal flags. They can be merged into one. Signed-off-by: Andrzej Hajda <a.hajda@samsung.com> Signed-off-by: Inki Dae <inki.dae@samsung.com>
This commit is contained in:
parent
b219207385
commit
7b6bb6ed01
@ -37,6 +37,13 @@ static const char * const decon_clks_name[] = {
|
|||||||
"sclk_decon_eclk",
|
"sclk_decon_eclk",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum decon_flag_bits {
|
||||||
|
BIT_CLKS_ENABLED,
|
||||||
|
BIT_IRQS_ENABLED,
|
||||||
|
BIT_WIN_UPDATED,
|
||||||
|
BIT_SUSPENDED
|
||||||
|
};
|
||||||
|
|
||||||
struct decon_context {
|
struct decon_context {
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
struct drm_device *drm_dev;
|
struct drm_device *drm_dev;
|
||||||
@ -44,15 +51,9 @@ struct decon_context {
|
|||||||
struct exynos_drm_plane planes[WINDOWS_NR];
|
struct exynos_drm_plane planes[WINDOWS_NR];
|
||||||
void __iomem *addr;
|
void __iomem *addr;
|
||||||
struct clk *clks[ARRAY_SIZE(decon_clks_name)];
|
struct clk *clks[ARRAY_SIZE(decon_clks_name)];
|
||||||
unsigned long irq_flags;
|
|
||||||
int pipe;
|
int pipe;
|
||||||
bool suspended;
|
unsigned long flags;
|
||||||
|
|
||||||
#define BIT_CLKS_ENABLED 0
|
|
||||||
#define BIT_IRQS_ENABLED 1
|
|
||||||
unsigned long enabled;
|
|
||||||
bool i80_if;
|
bool i80_if;
|
||||||
atomic_t win_updated;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const uint32_t decon_formats[] = {
|
static const uint32_t decon_formats[] = {
|
||||||
@ -74,10 +75,10 @@ static int decon_enable_vblank(struct exynos_drm_crtc *crtc)
|
|||||||
struct decon_context *ctx = crtc->ctx;
|
struct decon_context *ctx = crtc->ctx;
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
if (ctx->suspended)
|
if (test_bit(BIT_SUSPENDED, &ctx->flags))
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
|
|
||||||
if (test_and_set_bit(0, &ctx->irq_flags)) {
|
if (test_and_set_bit(BIT_IRQS_ENABLED, &ctx->flags)) {
|
||||||
val = VIDINTCON0_INTEN;
|
val = VIDINTCON0_INTEN;
|
||||||
if (ctx->i80_if)
|
if (ctx->i80_if)
|
||||||
val |= VIDINTCON0_FRAMEDONE;
|
val |= VIDINTCON0_FRAMEDONE;
|
||||||
@ -94,10 +95,10 @@ static void decon_disable_vblank(struct exynos_drm_crtc *crtc)
|
|||||||
{
|
{
|
||||||
struct decon_context *ctx = crtc->ctx;
|
struct decon_context *ctx = crtc->ctx;
|
||||||
|
|
||||||
if (ctx->suspended)
|
if (test_bit(BIT_SUSPENDED, &ctx->flags))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (test_and_clear_bit(0, &ctx->irq_flags))
|
if (test_and_clear_bit(BIT_IRQS_ENABLED, &ctx->flags))
|
||||||
writel(0, ctx->addr + DECON_VIDINTCON0);
|
writel(0, ctx->addr + DECON_VIDINTCON0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,7 +115,7 @@ static void decon_commit(struct exynos_drm_crtc *crtc)
|
|||||||
struct drm_display_mode *m = &crtc->base.mode;
|
struct drm_display_mode *m = &crtc->base.mode;
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
if (ctx->suspended)
|
if (test_bit(BIT_SUSPENDED, &ctx->flags))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* enable clock gate */
|
/* enable clock gate */
|
||||||
@ -231,7 +232,7 @@ static void decon_atomic_begin(struct exynos_drm_crtc *crtc,
|
|||||||
{
|
{
|
||||||
struct decon_context *ctx = crtc->ctx;
|
struct decon_context *ctx = crtc->ctx;
|
||||||
|
|
||||||
if (ctx->suspended)
|
if (test_bit(BIT_SUSPENDED, &ctx->flags))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
decon_shadow_protect_win(ctx, plane->zpos, true);
|
decon_shadow_protect_win(ctx, plane->zpos, true);
|
||||||
@ -247,7 +248,7 @@ static void decon_update_plane(struct exynos_drm_crtc *crtc,
|
|||||||
unsigned int pitch = state->fb->pitches[0];
|
unsigned int pitch = state->fb->pitches[0];
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
if (ctx->suspended)
|
if (test_bit(BIT_SUSPENDED, &ctx->flags))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
val = COORDINATE_X(plane->crtc_x) | COORDINATE_Y(plane->crtc_y);
|
val = COORDINATE_X(plane->crtc_x) | COORDINATE_Y(plane->crtc_y);
|
||||||
@ -289,7 +290,7 @@ 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;
|
||||||
|
|
||||||
if (ctx->suspended)
|
if (test_bit(BIT_SUSPENDED, &ctx->flags))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
decon_shadow_protect_win(ctx, win, true);
|
decon_shadow_protect_win(ctx, win, true);
|
||||||
@ -308,13 +309,13 @@ static void decon_atomic_flush(struct exynos_drm_crtc *crtc,
|
|||||||
{
|
{
|
||||||
struct decon_context *ctx = crtc->ctx;
|
struct decon_context *ctx = crtc->ctx;
|
||||||
|
|
||||||
if (ctx->suspended)
|
if (test_bit(BIT_SUSPENDED, &ctx->flags))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
decon_shadow_protect_win(ctx, plane->zpos, false);
|
decon_shadow_protect_win(ctx, plane->zpos, false);
|
||||||
|
|
||||||
if (ctx->i80_if)
|
if (ctx->i80_if)
|
||||||
atomic_set(&ctx->win_updated, 1);
|
set_bit(BIT_WIN_UPDATED, &ctx->flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void decon_swreset(struct decon_context *ctx)
|
static void decon_swreset(struct decon_context *ctx)
|
||||||
@ -346,11 +347,9 @@ static void decon_enable(struct exynos_drm_crtc *crtc)
|
|||||||
int ret;
|
int ret;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!ctx->suspended)
|
if (!test_and_clear_bit(BIT_SUSPENDED, &ctx->flags))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ctx->suspended = false;
|
|
||||||
|
|
||||||
pm_runtime_get_sync(ctx->dev);
|
pm_runtime_get_sync(ctx->dev);
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(decon_clks_name); i++) {
|
for (i = 0; i < ARRAY_SIZE(decon_clks_name); i++) {
|
||||||
@ -359,10 +358,10 @@ static void decon_enable(struct exynos_drm_crtc *crtc)
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
set_bit(BIT_CLKS_ENABLED, &ctx->enabled);
|
set_bit(BIT_CLKS_ENABLED, &ctx->flags);
|
||||||
|
|
||||||
/* if vblank was enabled status, enable it again. */
|
/* if vblank was enabled status, enable it again. */
|
||||||
if (test_and_clear_bit(0, &ctx->irq_flags))
|
if (test_and_clear_bit(BIT_IRQS_ENABLED, &ctx->flags))
|
||||||
decon_enable_vblank(ctx->crtc);
|
decon_enable_vblank(ctx->crtc);
|
||||||
|
|
||||||
decon_commit(ctx->crtc);
|
decon_commit(ctx->crtc);
|
||||||
@ -372,7 +371,7 @@ err:
|
|||||||
while (--i >= 0)
|
while (--i >= 0)
|
||||||
clk_disable_unprepare(ctx->clks[i]);
|
clk_disable_unprepare(ctx->clks[i]);
|
||||||
|
|
||||||
ctx->suspended = true;
|
set_bit(BIT_SUSPENDED, &ctx->flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void decon_disable(struct exynos_drm_crtc *crtc)
|
static void decon_disable(struct exynos_drm_crtc *crtc)
|
||||||
@ -380,7 +379,7 @@ static void decon_disable(struct exynos_drm_crtc *crtc)
|
|||||||
struct decon_context *ctx = crtc->ctx;
|
struct decon_context *ctx = crtc->ctx;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (ctx->suspended)
|
if (test_bit(BIT_SUSPENDED, &ctx->flags))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -396,21 +395,21 @@ static void decon_disable(struct exynos_drm_crtc *crtc)
|
|||||||
for (i = 0; i < ARRAY_SIZE(decon_clks_name); i++)
|
for (i = 0; i < ARRAY_SIZE(decon_clks_name); i++)
|
||||||
clk_disable_unprepare(ctx->clks[i]);
|
clk_disable_unprepare(ctx->clks[i]);
|
||||||
|
|
||||||
clear_bit(BIT_CLKS_ENABLED, &ctx->enabled);
|
clear_bit(BIT_CLKS_ENABLED, &ctx->flags);
|
||||||
|
|
||||||
pm_runtime_put_sync(ctx->dev);
|
pm_runtime_put_sync(ctx->dev);
|
||||||
|
|
||||||
ctx->suspended = true;
|
set_bit(BIT_SUSPENDED, &ctx->flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
if (!test_bit(BIT_CLKS_ENABLED, &ctx->enabled))
|
if (!test_bit(BIT_CLKS_ENABLED, &ctx->flags))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (atomic_add_unless(&ctx->win_updated, -1, 0))
|
if (test_and_clear_bit(BIT_WIN_UPDATED, &ctx->flags))
|
||||||
decon_set_bits(ctx, DECON_TRIGCON, TRIGCON_SWTRIGCMD, ~0);
|
decon_set_bits(ctx, DECON_TRIGCON, TRIGCON_SWTRIGCMD, ~0);
|
||||||
|
|
||||||
drm_crtc_handle_vblank(&ctx->crtc->base);
|
drm_crtc_handle_vblank(&ctx->crtc->base);
|
||||||
@ -520,7 +519,7 @@ static irqreturn_t decon_vsync_irq_handler(int irq, void *dev_id)
|
|||||||
struct decon_context *ctx = dev_id;
|
struct decon_context *ctx = dev_id;
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
if (!test_bit(BIT_CLKS_ENABLED, &ctx->enabled))
|
if (!test_bit(BIT_CLKS_ENABLED, &ctx->flags))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
val = readl(ctx->addr + DECON_VIDINTCON1);
|
val = readl(ctx->addr + DECON_VIDINTCON1);
|
||||||
@ -541,7 +540,7 @@ static irqreturn_t decon_lcd_sys_irq_handler(int irq, void *dev_id)
|
|||||||
u32 val;
|
u32 val;
|
||||||
int win;
|
int win;
|
||||||
|
|
||||||
if (!test_bit(BIT_CLKS_ENABLED, &ctx->enabled))
|
if (!test_bit(BIT_CLKS_ENABLED, &ctx->flags))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
val = readl(ctx->addr + DECON_VIDINTCON1);
|
val = readl(ctx->addr + DECON_VIDINTCON1);
|
||||||
@ -576,7 +575,7 @@ static int exynos5433_decon_probe(struct platform_device *pdev)
|
|||||||
if (!ctx)
|
if (!ctx)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
ctx->suspended = true;
|
__set_bit(BIT_SUSPENDED, &ctx->flags);
|
||||||
ctx->dev = dev;
|
ctx->dev = dev;
|
||||||
if (of_get_child_by_name(dev->of_node, "i80-if-timings"))
|
if (of_get_child_by_name(dev->of_node, "i80-if-timings"))
|
||||||
ctx->i80_if = true;
|
ctx->i80_if = true;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user