Add support for specifying display panel data in the device tree. If no panel data is provided in the device tree, default video mode will be used as usual.
Signed-off-by: Anatolij Gustschin <ag...@denx.de> --- drivers/video/Kconfig | 1 + drivers/video/fsl-diu-fb.c | 63 +++++++++++++++++++++++++------------------- 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index dc1beb0..c805ecd 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig @@ -1850,6 +1850,7 @@ config FB_FSL_DIU select FB_CFB_COPYAREA select FB_CFB_IMAGEBLIT select PPC_LIB_RHEAP + select FB_OF_MODE ---help--- Framebuffer driver for the Freescale SoC DIU diff --git a/drivers/video/fsl-diu-fb.c b/drivers/video/fsl-diu-fb.c index 4637bcb..19ca1da 100644 --- a/drivers/video/fsl-diu-fb.c +++ b/drivers/video/fsl-diu-fb.c @@ -36,6 +36,8 @@ #include <sysdev/fsl_soc.h> #include "fsl-diu-fb.h" +#include "ofmode.h" + /* * These parameters give default parameters * for video output 1024x768, @@ -1168,7 +1170,7 @@ static int init_fbinfo(struct fb_info *info) return 0; } -static int __devinit install_fb(struct fb_info *info) +static int __devinit install_fb(struct device_node *np, struct fb_info *info) { int rc; struct mfb_info *mfbi = info->par; @@ -1177,33 +1179,40 @@ static int __devinit install_fb(struct fb_info *info) if (init_fbinfo(info)) return -EINVAL; - if (mfbi->index == 0) /* plane 0 */ - aoi_mode = fb_mode; - else + if (mfbi->index == 0) { /* plane 0 */ + /* use default mode for plane0 if there is no mode in DTB */ + if (of_get_video_mode(np, info) < 0) + aoi_mode = fb_mode; + else + aoi_mode = NULL; + } else aoi_mode = init_aoi_mode; - pr_debug("mode used = %s\n", aoi_mode); - rc = fb_find_mode(&info->var, info, aoi_mode, fsl_diu_mode_db, - ARRAY_SIZE(fsl_diu_mode_db), &fsl_diu_default_mode, default_bpp); - switch (rc) { - case 1: - pr_debug("using mode specified in @mode\n"); - break; - case 2: - pr_debug("using mode specified in @mode " - "with ignored refresh rate\n"); - break; - case 3: - pr_debug("using mode default mode\n"); - break; - case 4: - pr_debug("using mode from list\n"); - break; - default: - pr_debug("rc = %d\n", rc); - pr_debug("failed to find mode\n"); - return -EINVAL; - break; + if (aoi_mode) { + pr_debug("mode used = %s\n", aoi_mode); + rc = fb_find_mode(&info->var, info, aoi_mode, fsl_diu_mode_db, + ARRAY_SIZE(fsl_diu_mode_db), + &fsl_diu_default_mode, default_bpp); + switch (rc) { + case 1: + pr_debug("using mode specified in @mode\n"); + break; + case 2: + pr_debug("using mode specified in @mode " + "with ignored refresh rate\n"); + break; + case 3: + pr_debug("using mode default mode\n"); + break; + case 4: + pr_debug("using mode from list\n"); + break; + default: + pr_debug("rc = %d\n", rc); + pr_debug("failed to find mode\n"); + return -EINVAL; + break; + } } pr_debug("xres_virtual %d\n", info->var.xres_virtual); @@ -1521,7 +1530,7 @@ static int __devinit fsl_diu_probe(struct of_device *ofdev, mfbi->ad = (struct diu_ad *)((u32)pool.ad.vaddr + pool.ad.offset) + i; mfbi->ad->paddr = pool.ad.paddr + i * sizeof(struct diu_ad); - ret = install_fb(machine_data->fsl_diu_info[i]); + ret = install_fb(np, machine_data->fsl_diu_info[i]); if (ret) { dev_err(&ofdev->dev, "Failed to register framebuffer %d\n", -- 1.6.3.3 _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev