diff options
author | Stefan Agner <stefan.agner@toradex.com> | 2014-09-30 16:45:17 +0200 |
---|---|---|
committer | Stefan Agner <stefan.agner@toradex.com> | 2014-11-19 11:29:46 +0100 |
commit | 5fccb8702a099b03b7d25cd648f14435dbe92a06 (patch) | |
tree | f8a352489312c49a764f3eaa75979750b3adf852 /drivers | |
parent | 87c8ad206b5c097adaebed74c8778a35abe21671 (diff) |
video: fsl-dcu-fb: use native-display timing
Use the timing defined in the native-display property by default.
Get display timings from device tree only once in probe instead for
each framebuffer layer again.
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/video/fbdev/fsl-dcu-fb.c | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/drivers/video/fbdev/fsl-dcu-fb.c b/drivers/video/fbdev/fsl-dcu-fb.c index 23b16ee7775f..c0a09fa361a0 100644 --- a/drivers/video/fbdev/fsl-dcu-fb.c +++ b/drivers/video/fbdev/fsl-dcu-fb.c @@ -140,6 +140,9 @@ struct dcu_fb_data { void __iomem *reg_base; unsigned int irq; struct clk *clk; + struct list_head modelist; + struct fb_videomode native_mode; + u32 bits_per_pixel; }; struct layer_display_offset { @@ -761,11 +764,8 @@ static struct fb_ops fsl_dcu_ops = { .fb_release = fsl_dcu_release, }; -static int fsl_dcu_init_fbinfo(struct fb_info *info) +static int fsl_dcu_init_modelist(struct dcu_fb_data *dcufb) { - struct mfb_info *mfbi = info->par; - struct fb_var_screeninfo *var = &info->var; - struct dcu_fb_data *dcufb = mfbi->parent; struct device_node *np = dcufb->dev->of_node; struct device_node *display_np; struct display_timings *timings; @@ -779,7 +779,7 @@ static int fsl_dcu_init_fbinfo(struct fb_info *info) } ret = of_property_read_u32(display_np, "bits-per-pixel", - &var->bits_per_pixel); + &dcufb->bits_per_pixel); if (ret < 0) { dev_err(dcufb->dev, "failed to get property bits-per-pixel\n"); goto put_display_node; @@ -804,7 +804,10 @@ static int fsl_dcu_init_fbinfo(struct fb_info *info) if (ret < 0) goto put_display_node; - fb_add_videomode(&fb_vm, &info->modelist); + if (i == timings->native_mode) + fb_videomode_from_videomode(&vm, &dcufb->native_mode); + + fb_add_videomode(&fb_vm, &dcufb->modelist); } put_display_node: @@ -816,7 +819,7 @@ static int install_framebuffer(struct fb_info *info) { struct mfb_info *mfbi = info->par; struct dcu_fb_data *dcufb = mfbi->parent; - struct fb_modelist *modelist; + struct fb_videomode *mode = &dcufb->native_mode; int ret; info->var.activate = FB_ACTIVATE_NOW; @@ -827,14 +830,9 @@ static int install_framebuffer(struct fb_info *info) fb_alloc_cmap(&info->cmap, 16, 0); INIT_LIST_HEAD(&info->modelist); - - ret = fsl_dcu_init_fbinfo(info); - if (ret) - return ret; - - modelist = list_first_entry(&info->modelist, - struct fb_modelist, list); - fb_videomode_to_var(&info->var, &modelist->mode); + fb_add_videomode(mode, &info->modelist); + fb_videomode_to_var(&info->var, mode); + info->var.bits_per_pixel = dcufb->bits_per_pixel; fsl_dcu_check_var(&info->var, info); ret = register_framebuffer(info); @@ -990,6 +988,11 @@ static int fsl_dcu_probe(struct platform_device *pdev) pm_runtime_enable(dcufb->dev); pm_runtime_get_sync(dcufb->dev); + INIT_LIST_HEAD(&dcufb->modelist); + ret = fsl_dcu_init_modelist(dcufb); + if (ret) + goto failed_alloc_framebuffer; + for (i = 0; i < ARRAY_SIZE(dcufb->fsl_dcu_info); i++) { dcufb->fsl_dcu_info[i] = framebuffer_alloc(sizeof(struct mfb_info), &pdev->dev); |