aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/ipu-v3
diff options
context:
space:
mode:
authorJiada Wang <jiada_wang@mentor.com>2014-12-18 21:00:20 -0500
committerPhilipp Zabel <p.zabel@pengutronix.de>2015-01-07 13:12:07 -0500
commit6541d71082fdb91f862c92920c6530e4e0548d6f (patch)
tree254653c61e3d12abc3aed43f89afbfe56851759b /drivers/gpu/ipu-v3
parentf66a162751b90ce684dc55eb3e660e30f7554de3 (diff)
gpu: ipu-di: Add ipu_di_adjust_videomode()
On some monitors, high resolution modes are not working, exhibiting pixel column truncation problems (for example, 1280x1024 displays as 1280x1022). The function ipu_di_adjust_videomode() aims to fix these issues by adjusting a passed videomode to IPU restrictions. The function can be called from the drm_crtc_helper_funcs->mode_fixup() methods. Signed-off-by: Jiada Wang <jiada_wang@mentor.com> Signed-off-by: Deepak Das <deepak_das@mentor.com> Signed-off-by: Steve Longerbeam <steve_longerbeam@mentor.com> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Diffstat (limited to 'drivers/gpu/ipu-v3')
-rw-r--r--drivers/gpu/ipu-v3/ipu-di.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/drivers/gpu/ipu-v3/ipu-di.c b/drivers/gpu/ipu-v3/ipu-di.c
index c490ba4384fc..46f9570a8b59 100644
--- a/drivers/gpu/ipu-v3/ipu-di.c
+++ b/drivers/gpu/ipu-v3/ipu-di.c
@@ -511,6 +511,35 @@ static void ipu_di_config_clock(struct ipu_di *di,
511 clk_get_rate(di->clk_di_pixel) / (clkgen0 >> 4)); 511 clk_get_rate(di->clk_di_pixel) / (clkgen0 >> 4));
512} 512}
513 513
514/*
515 * This function is called to adjust a video mode to IPU restrictions.
516 * It is meant to be called from drm crtc mode_fixup() methods.
517 */
518int ipu_di_adjust_videomode(struct ipu_di *di, struct videomode *mode)
519{
520 u32 diff;
521
522 if (mode->vfront_porch >= 2)
523 return 0;
524
525 diff = 2 - mode->vfront_porch;
526
527 if (mode->vback_porch >= diff) {
528 mode->vfront_porch = 2;
529 mode->vback_porch -= diff;
530 } else if (mode->vsync_len > diff) {
531 mode->vfront_porch = 2;
532 mode->vsync_len = mode->vsync_len - diff;
533 } else {
534 dev_warn(di->ipu->dev, "failed to adjust videomode\n");
535 return -EINVAL;
536 }
537
538 dev_warn(di->ipu->dev, "videomode adapted for IPU restrictions\n");
539 return 0;
540}
541EXPORT_SYMBOL_GPL(ipu_di_adjust_videomode);
542
514int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig) 543int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
515{ 544{
516 u32 reg; 545 u32 reg;