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

Reply via email to