The exynos fimd provides video type selection bits from system register but exynos3 series don't has it, so needs has_vtsel flag and we can distinguish whether set video type selection bits.
Signed-off-by: Joonyoung Shim jy0922.shim@samsung.com --- Changelog from v1: - rebase on latest exynos-drm-next branch - add has_vtsel for exynos4415
drivers/gpu/drm/exynos/exynos_drm_fimd.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 5cc57f7..93b263e 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -96,6 +96,7 @@ struct fimd_driver_data { unsigned int has_clksel:1; unsigned int has_limited_fmt:1; unsigned int has_vidoutcon:1; + unsigned int has_vtsel:1; };
static struct fimd_driver_data s3c64xx_fimd_driver_data = { @@ -118,6 +119,7 @@ static struct fimd_driver_data exynos4_fimd_driver_data = { .lcdblk_vt_shift = 10, .lcdblk_bypass_shift = 1, .has_shadowcon = 1, + .has_vtsel = 1, };
static struct fimd_driver_data exynos4415_fimd_driver_data = { @@ -127,6 +129,7 @@ static struct fimd_driver_data exynos4415_fimd_driver_data = { .lcdblk_bypass_shift = 1, .has_shadowcon = 1, .has_vidoutcon = 1, + .has_vtsel = 1, };
static struct fimd_driver_data exynos5_fimd_driver_data = { @@ -136,6 +139,7 @@ static struct fimd_driver_data exynos5_fimd_driver_data = { .lcdblk_bypass_shift = 15, .has_shadowcon = 1, .has_vidoutcon = 1, + .has_vtsel = 1, };
struct fimd_win_data { @@ -354,7 +358,8 @@ static void fimd_commit(struct exynos_drm_manager *mgr) writel(0, timing_base + I80IFCONFBx(0));
/* set video type selection to I80 interface */ - if (ctx->sysreg && regmap_update_bits(ctx->sysreg, + if (driver_data->has_vtsel && ctx->sysreg && + regmap_update_bits(ctx->sysreg, driver_data->lcdblk_offset, 0x3 << driver_data->lcdblk_vt_shift, 0x1 << driver_data->lcdblk_vt_shift)) {
It's better to be checking whether triggerring in fimd_trigger function. Also it will return if in triggerring on fimd_te_handler, then it can't execute remain codes.
Signed-off-by: Joonyoung Shim jy0922.shim@samsung.com --- Based on lastest exynos-drm-next branch.
drivers/gpu/drm/exynos/exynos_drm_fimd.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 7593f62..033b18b 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -944,6 +944,13 @@ static void fimd_trigger(struct device *dev) void *timing_base = ctx->regs + driver_data->timing_base; u32 reg;
+ /* + * Skips to trigger if in triggering state, because multiple triggering + * requests can cause panel reset. + */ + if (atomic_read(&ctx->triggering)) + return; + atomic_set(&ctx->triggering, 1);
reg = readl(ctx->regs + VIDINTCON0); @@ -964,13 +971,6 @@ static void fimd_te_handler(struct exynos_drm_manager *mgr) if (ctx->pipe < 0 || !ctx->drm_dev) return;
- /* - * Skips to trigger if in triggering state, because multiple triggering - * requests can cause panel reset. - */ - if (atomic_read(&ctx->triggering)) - return; - /* * If there is a page flip request, triggers and handles the page flip * event so that current fb can be updated into panel GRAM.
The drm_handle_vblank should be called whenever be vsync, te interrupt means vsync on i80 interface.
Signed-off-by: Joonyoung Shim jy0922.shim@samsung.com --- Based on lastest exynos-drm-next branch and patch of Youngjun Cho ("drm/exynos: fimd: move handle vblank position in TE handler").
drivers/gpu/drm/exynos/exynos_drm_fimd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 033b18b..5cc57f7 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -984,7 +984,7 @@ static void fimd_te_handler(struct exynos_drm_manager *mgr) wake_up(&ctx->wait_vsync_queue); }
- if (!atomic_read(&ctx->triggering)) + if (test_bit(0, &ctx->irq_flags)) drm_handle_vblank(ctx->drm_dev, ctx->pipe); }
Hi JoonYoung,
On 11/14/2014 11:36 AM, Joonyoung Shim wrote:
The drm_handle_vblank should be called whenever be vsync, te interrupt means vsync on i80 interface.
That's right.
Signed-off-by: Joonyoung Shim jy0922.shim@samsung.com
Based on lastest exynos-drm-next branch and patch of Youngjun Cho ("drm/exynos: fimd: move handle vblank position in TE handler").
drivers/gpu/drm/exynos/exynos_drm_fimd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 033b18b..5cc57f7 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -984,7 +984,7 @@ static void fimd_te_handler(struct exynos_drm_manager *mgr) wake_up(&ctx->wait_vsync_queue); }
- if (!atomic_read(&ctx->triggering))
- if (test_bit(0, &ctx->irq_flags)) drm_handle_vblank(ctx->drm_dev, ctx->pipe);
But after triggering, "fimd_irq_handler()" is called by "lcd_sys" interrupt and that calls "drm_handle_vblank()".
So I think "fimd_te_handler()" calls "drm_handle_vblank()" only non-triggering condition.
Thank you. Best regards YJ
}
Hi,
On 11/14/2014 02:01 PM, YoungJun Cho wrote:
Hi JoonYoung,
On 11/14/2014 11:36 AM, Joonyoung Shim wrote:
The drm_handle_vblank should be called whenever be vsync, te interrupt means vsync on i80 interface.
That's right.
Signed-off-by: Joonyoung Shim jy0922.shim@samsung.com
Based on lastest exynos-drm-next branch and patch of Youngjun Cho ("drm/exynos: fimd: move handle vblank position in TE handler").
drivers/gpu/drm/exynos/exynos_drm_fimd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 033b18b..5cc57f7 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -984,7 +984,7 @@ static void fimd_te_handler(struct exynos_drm_manager *mgr) wake_up(&ctx->wait_vsync_queue); }
- if (!atomic_read(&ctx->triggering))
- if (test_bit(0, &ctx->irq_flags)) drm_handle_vblank(ctx->drm_dev, ctx->pipe);
But after triggering, "fimd_irq_handler()" is called by "lcd_sys" interrupt and that calls "drm_handle_vblank()".
I missed the routine but i think drm_handle_vblank should be called by vsync interrupt handler. As you know, fimd_irq_handler is not vsync interrupt handler on i80 interface.
So I think "fimd_te_handler()" calls "drm_handle_vblank()" only non-triggering condition.
Thank you. Best regards YJ
}
Hi JoonYoung,
On 11/14/2014 02:12 PM, Joonyoung Shim wrote:
Hi,
On 11/14/2014 02:01 PM, YoungJun Cho wrote:
Hi JoonYoung,
On 11/14/2014 11:36 AM, Joonyoung Shim wrote:
The drm_handle_vblank should be called whenever be vsync, te interrupt means vsync on i80 interface.
That's right.
Signed-off-by: Joonyoung Shim jy0922.shim@samsung.com
Based on lastest exynos-drm-next branch and patch of Youngjun Cho ("drm/exynos: fimd: move handle vblank position in TE handler").
drivers/gpu/drm/exynos/exynos_drm_fimd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 033b18b..5cc57f7 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -984,7 +984,7 @@ static void fimd_te_handler(struct exynos_drm_manager *mgr) wake_up(&ctx->wait_vsync_queue); }
- if (!atomic_read(&ctx->triggering))
- if (test_bit(0, &ctx->irq_flags)) drm_handle_vblank(ctx->drm_dev, ctx->pipe);
But after triggering, "fimd_irq_handler()" is called by "lcd_sys" interrupt and that calls "drm_handle_vblank()".
I missed the routine but i think drm_handle_vblank should be called by vsync interrupt handler. As you know, fimd_irq_handler is not vsync interrupt handler on i80 interface.
That sounds reasonable. For that, we should modify "fimd_irq_handler()" not to call "drm_handle_vblank()" in I80 interface.
Thank you. Best regards YJ
So I think "fimd_te_handler()" calls "drm_handle_vblank()" only non-triggering condition.
Thank you. Best regards YJ
}
On 2014년 11월 14일 11:36, Joonyoung Shim wrote:
The exynos fimd provides video type selection bits from system register but exynos3 series don't has it, so needs has_vtsel flag and we can distinguish whether set video type selection bits.
Applied.
Thanks, Inki Dae
Signed-off-by: Joonyoung Shim jy0922.shim@samsung.com
Changelog from v1:
- rebase on latest exynos-drm-next branch
- add has_vtsel for exynos4415
drivers/gpu/drm/exynos/exynos_drm_fimd.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 5cc57f7..93b263e 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -96,6 +96,7 @@ struct fimd_driver_data { unsigned int has_clksel:1; unsigned int has_limited_fmt:1; unsigned int has_vidoutcon:1;
- unsigned int has_vtsel:1;
};
static struct fimd_driver_data s3c64xx_fimd_driver_data = { @@ -118,6 +119,7 @@ static struct fimd_driver_data exynos4_fimd_driver_data = { .lcdblk_vt_shift = 10, .lcdblk_bypass_shift = 1, .has_shadowcon = 1,
- .has_vtsel = 1,
};
static struct fimd_driver_data exynos4415_fimd_driver_data = { @@ -127,6 +129,7 @@ static struct fimd_driver_data exynos4415_fimd_driver_data = { .lcdblk_bypass_shift = 1, .has_shadowcon = 1, .has_vidoutcon = 1,
- .has_vtsel = 1,
};
static struct fimd_driver_data exynos5_fimd_driver_data = { @@ -136,6 +139,7 @@ static struct fimd_driver_data exynos5_fimd_driver_data = { .lcdblk_bypass_shift = 15, .has_shadowcon = 1, .has_vidoutcon = 1,
- .has_vtsel = 1,
};
struct fimd_win_data { @@ -354,7 +358,8 @@ static void fimd_commit(struct exynos_drm_manager *mgr) writel(0, timing_base + I80IFCONFBx(0));
/* set video type selection to I80 interface */
if (ctx->sysreg && regmap_update_bits(ctx->sysreg,
if (driver_data->has_vtsel && ctx->sysreg &&
regmap_update_bits(ctx->sysreg, driver_data->lcdblk_offset, 0x3 << driver_data->lcdblk_vt_shift, 0x1 << driver_data->lcdblk_vt_shift)) {
dri-devel@lists.freedesktop.org