video: fb: vt8500: Convert framebuffer drivers to standardized binding
authorTony Prisk <linux@prisktech.co.nz>
Tue, 2 Apr 2013 18:20:38 +0000 (07:20 +1300)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Thu, 4 Apr 2013 10:07:34 +0000 (13:07 +0300)
Now that a display timing binding is available, convert our almost identical
binding to use the standard binding.

This patch converts the vt8500 and wm8505 framebuffer drivers and
associated dts/dtsi files to use the standard binding as defined in
bindings/video/display-timing.txt.

There are two side-effects of making this conversion:

1) The fb node should now be in the board file, rather than the soc file as
the display-timing node is a child of the fb node.

2) We still require a bits per pixel property to initialize the framebuffer
for the different lcd panels. Rather than including this as part of the
display timing, it is moved into the framebuffer node.

I have also taken the opportunity to alphabetise the includes of each
driver to avoid double-ups.

Signed-off-by: Tony Prisk <linux@prisktech.co.nz>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
13 files changed:
Documentation/devicetree/bindings/video/via,vt8500-fb.txt
Documentation/devicetree/bindings/video/wm,wm8505-fb.txt
arch/arm/boot/dts/vt8500-bv07.dts
arch/arm/boot/dts/vt8500.dtsi
arch/arm/boot/dts/wm8505-ref.dts
arch/arm/boot/dts/wm8505.dtsi
arch/arm/boot/dts/wm8650-mid.dts
arch/arm/boot/dts/wm8650.dtsi
arch/arm/boot/dts/wm8850-w70v2.dts
arch/arm/boot/dts/wm8850.dtsi
drivers/video/Kconfig
drivers/video/vt8500lcdfb.c
drivers/video/wm8505fb.c

index c870b6478ec81861ada145526dc8c0644b1806aa..2871e218a0fb7662299997b848c859b00d150435 100644 (file)
@@ -5,58 +5,32 @@ Required properties:
 - compatible : "via,vt8500-fb"
 - reg : Should contain 1 register ranges(address and length)
 - interrupts : framebuffer controller interrupt
-- display: a phandle pointing to the display node
+- bits-per-pixel : bit depth of framebuffer (16 or 32)
 
-Required nodes:
-- display: a display node is required to initialize the lcd panel
-       This should be in the board dts.
-- default-mode: a videomode within the display with timing parameters
-       as specified below.
+Required subnodes:
+- display-timings: see display-timing.txt for information
 
 Example:
 
-       fb@d800e400 {
+       fb@d8050800 {
                compatible = "via,vt8500-fb";
                reg = <0xd800e400 0x400>;
                interrupts = <12>;
-               display = <&display>;
-               default-mode = <&mode0>;
-       };
-
-VIA VT8500 Display
------------------------------------------------------
-Required properties (as per of_videomode_helper):
-
- - hactive, vactive: Display resolution
- - hfront-porch, hback-porch, hsync-len: Horizontal Display timing parameters
-   in pixels
-   vfront-porch, vback-porch, vsync-len: Vertical display timing parameters in
-   lines
- - clock: displayclock in Hz
- - bpp: lcd panel bit-depth.
-       <16> for RGB565, <32> for RGB888
-
-Optional properties (as per of_videomode_helper):
- - width-mm, height-mm: Display dimensions in mm
- - hsync-active-high (bool): Hsync pulse is active high
- - vsync-active-high (bool): Vsync pulse is active high
- - interlaced (bool): This is an interlaced mode
- - doublescan (bool): This is a doublescan mode
+               bits-per-pixel = <16>;
 
-Example:
-       display: display@0 {
-               modes {
-                       mode0: mode@0 {
+               display-timings {
+                       native-mode = <&timing0>;
+                       timing0: 800x480 {
+                               clock-frequency = <0>; /* unused but required */
                                hactive = <800>;
                                vactive = <480>;
-                               hback-porch = <88>;
                                hfront-porch = <40>;
+                               hback-porch = <88>;
                                hsync-len = <0>;
                                vback-porch = <32>;
                                vfront-porch = <11>;
                                vsync-len = <1>;
-                               clock = <0>;    /* unused but required */
-                               bpp = <16>;     /* non-standard but required */
                        };
                };
        };
+
index 3d325e1d11ee64fd80ebfc61a3ae45fbf390b1cc..0bcadb2840a5c9d17d3f81dd2ef3056ed4b25381 100644 (file)
@@ -4,20 +4,30 @@ Wondermedia WM8505 Framebuffer
 Required properties:
 - compatible : "wm,wm8505-fb"
 - reg : Should contain 1 register ranges(address and length)
-- via,display: a phandle pointing to the display node
+- bits-per-pixel : bit depth of framebuffer (16 or 32)
 
-Required nodes:
-- display: a display node is required to initialize the lcd panel
-       This should be in the board dts. See definition in
-       Documentation/devicetree/bindings/video/via,vt8500-fb.txt
-- default-mode: a videomode node as specified in
-       Documentation/devicetree/bindings/video/via,vt8500-fb.txt
+Required subnodes:
+- display-timings: see display-timing.txt for information
 
 Example:
 
-       fb@d8050800 {
+       fb@d8051700 {
                compatible = "wm,wm8505-fb";
-               reg = <0xd8050800 0x200>;
-               display = <&display>;
-               default-mode = <&mode0>;
+               reg = <0xd8051700 0x200>;
+               bits-per-pixel = <16>;
+
+               display-timings {
+                       native-mode = <&timing0>;
+                       timing0: 800x480 {
+                               clock-frequency = <0>; /* unused but required */
+                               hactive = <800>;
+                               vactive = <480>;
+                               hfront-porch = <40>;
+                               hback-porch = <88>;
+                               hsync-len = <0>;
+                               vback-porch = <32>;
+                               vfront-porch = <11>;
+                               vsync-len = <1>;
+                       };
+               };
        };
index 567cf4e8ab84e49551667e8f68f986675b15a1a7..877b33afa7ed9182ca2b4f20597f66e26729dd3f 100644 (file)
 
 / {
        model = "Benign BV07 Netbook";
+};
 
-       /*
-        * Display node is based on Sascha Hauer's patch on dri-devel.
-        * Added a bpp property to calculate the size of the framebuffer
-        * until the binding is formalized.
-        */
-       display: display@0 {
-               modes {
-                       mode0: mode@0 {
-                               hactive = <800>;
-                               vactive = <480>;
-                               hback-porch = <88>;
-                               hfront-porch = <40>;
-                               hsync-len = <0>;
-                               vback-porch = <32>;
-                               vfront-porch = <11>;
-                               vsync-len = <1>;
-                               clock = <0>;    /* unused but required */
-                               bpp = <16>;     /* non-standard but required */
-                       };
+&fb {
+       bits-per-pixel = <16>;
+       display-timings {
+               native-mode = <&timing0>;
+               timing0: 800x480 {
+                       clock-frequency = <0>; /* unused but required */
+                       hactive = <800>;
+                       vactive = <480>;
+                       hfront-porch = <40>;
+                       hback-porch = <88>;
+                       hsync-len = <0>;
+                       vback-porch = <32>;
+                       vfront-porch = <11>;
+                       vsync-len = <1>;
                };
        };
 };
index cf31ced46602e1ef8c24bf8a1fed2634488e8845..68c8dc644383a248a502bb5da7a359010a6b4342 100644 (file)
                        interrupts = <43>;
                };
 
-               fb@d800e400 {
+               fb: fb@d8050800 {
                        compatible = "via,vt8500-fb";
                        reg = <0xd800e400 0x400>;
                        interrupts = <12>;
-                       display = <&display>;
-                       default-mode = <&mode0>;
                };
 
                ge_rops@d8050400 {
index fd4e248074c676a43d965338f210f1e3ea6fa673..edd2cec3d37f6b801335af4361560a2cecc1bb6b 100644 (file)
 
 / {
        model = "Wondermedia WM8505 Netbook";
+};
 
-       /*
-        * Display node is based on Sascha Hauer's patch on dri-devel.
-        * Added a bpp property to calculate the size of the framebuffer
-        * until the binding is formalized.
-        */
-       display: display@0 {
-               modes {
-                       mode0: mode@0 {
-                               hactive = <800>;
-                               vactive = <480>;
-                               hback-porch = <88>;
-                               hfront-porch = <40>;
-                               hsync-len = <0>;
-                               vback-porch = <32>;
-                               vfront-porch = <11>;
-                               vsync-len = <1>;
-                               clock = <0>;    /* unused but required */
-                               bpp = <32>;     /* non-standard but required */
-                       };
+&fb {
+       bits-per-pixel = <32>;
+       display-timings {
+               native-mode = <&timing0>;
+               timing0: 800x480 {
+                       clock-frequency = <0>; /* unused but required */
+                       hactive = <800>;
+                       vactive = <480>;
+                       hfront-porch = <40>;
+                       hback-porch = <88>;
+                       hsync-len = <0>;
+                       vback-porch = <32>;
+                       vfront-porch = <11>;
+                       vsync-len = <1>;
                };
        };
 };
index e74a1c0fb9a2998ef91dbf58019850644711465f..bcf668d31b28471602dc86c2b1555c9bcbb73be6 100644 (file)
                        interrupts = <0>;
                };
 
-               fb@d8050800 {
+               fb: fb@d8050800 {
                        compatible = "wm,wm8505-fb";
                        reg = <0xd8050800 0x200>;
-                       display = <&display>;
-                       default-mode = <&mode0>;
                };
 
                ge_rops@d8050400 {
index cefd938f842fe6192e90a2c244b05730c11383a5..61671a0d9edec507422bbf27fbf51bf5c908f2f6 100644 (file)
 
 / {
        model = "Wondermedia WM8650-MID Tablet";
+};
+
+&fb {
+       bits-per-pixel = <16>;
 
-       /*
-        * Display node is based on Sascha Hauer's patch on dri-devel.
-        * Added a bpp property to calculate the size of the framebuffer
-        * until the binding is formalized.
-        */
-       display: display@0 {
-               modes {
-                       mode0: mode@0 {
-                               hactive = <800>;
-                               vactive = <480>;
-                               hback-porch = <88>;
-                               hfront-porch = <40>;
-                               hsync-len = <0>;
-                               vback-porch = <32>;
-                               vfront-porch = <11>;
-                               vsync-len = <1>;
-                               clock = <0>;    /* unused but required */
-                               bpp = <16>;     /* non-standard but required */
-                       };
+       display-timings {
+               native-mode = <&timing0>;
+               timing0: 800x480 {
+                       clock-frequency = <0>; /* unused but required */
+                       hactive = <800>;
+                       vactive = <480>;
+                       hfront-porch = <40>;
+                       hback-porch = <88>;
+                       hsync-len = <0>;
+                       vback-porch = <32>;
+                       vfront-porch = <11>;
+                       vsync-len = <1>;
                };
        };
 };
+
index db3c0a12e052782641bd23731bf58aa4f4d4cc62..9313407bbc3044a8c3db5030a24eee24308dec83 100644 (file)
                        interrupts = <43>;
                };
 
-               fb@d8050800 {
+               fb: fb@d8050800 {
                        compatible = "wm,wm8505-fb";
                        reg = <0xd8050800 0x200>;
-                       display = <&display>;
-                       default-mode = <&mode0>;
                };
 
                ge_rops@d8050400 {
index fcc660c89540b9db811f68519d2c4c20c54c9a0c..32d22532cd6c1f2c4490c05d159358ce131651cc 100644 (file)
 / {
        model = "Wondermedia WM8850-W70v2 Tablet";
 
-       /*
-        * Display node is based on Sascha Hauer's patch on dri-devel.
-        * Added a bpp property to calculate the size of the framebuffer
-        * until the binding is formalized.
-        */
-       display: display@0 {
-               modes {
-                       mode0: mode@0 {
-                               hactive = <800>;
-                               vactive = <480>;
-                               hback-porch = <88>;
-                               hfront-porch = <40>;
-                               hsync-len = <0>;
-                               vback-porch = <32>;
-                               vfront-porch = <11>;
-                               vsync-len = <1>;
-                               clock = <0>;    /* unused but required */
-                               bpp = <16>;     /* non-standard but required */
-                       };
-               };
-       };
-
        backlight {
                compatible = "pwm-backlight";
                pwms = <&pwm 0 50000 1>;        /* duty inverted */
                default-brightness-level = <5>;
        };
 };
+
+&fb {
+       bits-per-pixel = <16>;
+       display-timings {
+               native-mode = <&timing0>;
+               timing0: 800x480 {
+                       clock-frequency = <0>; /* unused but required */
+                       hactive = <800>;
+                       vactive = <480>;
+                       hfront-porch = <40>;
+                       hback-porch = <88>;
+                       hsync-len = <0>;
+                       vback-porch = <32>;
+                       vfront-porch = <11>;
+                       vsync-len = <1>;
+               };
+       };
+};
index e8cbfdc87bba4bcfaa64089377727b02db13b0a3..7149cd13e3b97b1de6a01daddae27131f6f391f4 100644 (file)
                        };
                };
 
-               fb@d8051700 {
+               fb: fb@d8051700 {
                        compatible = "wm,wm8505-fb";
                        reg = <0xd8051700 0x200>;
-                       display = <&display>;
-                       default-mode = <&mode0>;
                };
 
                ge_rops@d8050400 {
index ad762ed2c5aaf9f94abb29b107909475477bc6cb..d0c932a86115c27f48164e21e93177ca57581f29 100644 (file)
@@ -1794,6 +1794,9 @@ config FB_VT8500
        select FB_SYS_FILLRECT if (!FB_WMT_GE_ROPS)
        select FB_SYS_COPYAREA if (!FB_WMT_GE_ROPS)
        select FB_SYS_IMAGEBLIT
+       select FB_MODE_HELPERS
+       select OF_DISPLAY_TIMING
+       select OF_VIDEOMODE
        help
          This is the framebuffer driver for VIA VT8500 integrated LCD
          controller.
@@ -1804,6 +1807,9 @@ config FB_WM8505
        select FB_SYS_FILLRECT if (!FB_WMT_GE_ROPS)
        select FB_SYS_COPYAREA if (!FB_WMT_GE_ROPS)
        select FB_SYS_IMAGEBLIT
+       select FB_MODE_HELPERS
+       select OF_DISPLAY_TIMING
+       select OF_VIDEOMODE
        help
          This is the framebuffer driver for WonderMedia WM8xxx-series
          integrated LCD controller. This driver covers the WM8505, WM8650
index 2ff2312a16acd8904d426cb19e5dcbaa27a417f7..9547e1831e0310da3ed9be93c4f3d291f9062458 100644 (file)
  * GNU General Public License for more details.
  */
 
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/slab.h>
 #include <linux/delay.h>
+#include <linux/dma-mapping.h>
+#include <linux/errno.h>
 #include <linux/fb.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
-#include <linux/dma-mapping.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/module.h>
 #include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/string.h>
 #include <linux/wait.h>
+#include <video/of_display_timing.h>
 
 #include "vt8500lcdfb.h"
 #include "wmt_ge_rops.h"
@@ -275,11 +276,11 @@ static int vt8500lcd_probe(struct platform_device *pdev)
 {
        struct vt8500lcd_info *fbi;
        struct resource *res;
+       struct display_timings *disp_timing;
        void *addr;
        int irq, ret;
 
        struct fb_videomode     of_mode;
-       struct device_node      *np;
        u32                     bpp;
        dma_addr_t fb_mem_phys;
        unsigned long fb_mem_len;
@@ -344,32 +345,18 @@ static int vt8500lcd_probe(struct platform_device *pdev)
                goto failed_free_res;
        }
 
-       np = of_parse_phandle(pdev->dev.of_node, "default-mode", 0);
-       if (!np) {
-               pr_err("%s: No display description in Device Tree\n", __func__);
-               ret = -EINVAL;
-               goto failed_free_res;
-       }
+       disp_timing = of_get_display_timings(pdev->dev.of_node);
+       if (!disp_timing)
+               return -EINVAL;
 
-       /*
-        * This code is copied from Sascha Hauer's of_videomode helper
-        * and can be replaced with a call to the helper once mainlined
-        */
-       ret = 0;
-       ret |= of_property_read_u32(np, "hactive", &of_mode.xres);
-       ret |= of_property_read_u32(np, "vactive", &of_mode.yres);
-       ret |= of_property_read_u32(np, "hback-porch", &of_mode.left_margin);
-       ret |= of_property_read_u32(np, "hfront-porch", &of_mode.right_margin);
-       ret |= of_property_read_u32(np, "hsync-len", &of_mode.hsync_len);
-       ret |= of_property_read_u32(np, "vback-porch", &of_mode.upper_margin);
-       ret |= of_property_read_u32(np, "vfront-porch", &of_mode.lower_margin);
-       ret |= of_property_read_u32(np, "vsync-len", &of_mode.vsync_len);
-       ret |= of_property_read_u32(np, "bpp", &bpp);
-       if (ret) {
-               pr_err("%s: Unable to read display properties\n", __func__);
-               goto failed_free_res;
-       }
-       of_mode.vmode = FB_VMODE_NONINTERLACED;
+       ret = of_get_fb_videomode(pdev->dev.of_node, &of_mode,
+                                                       OF_USE_NATIVE_MODE);
+       if (ret)
+               return ret;
+
+       ret = of_property_read_u32(pdev->dev.of_node, "bits-per-pixel", &bpp);
+       if (ret)
+               return ret;
 
        /* try allocating the framebuffer */
        fb_mem_len = of_mode.xres * of_mode.yres * 2 * (bpp / 8);
index e3be1e37d2b33a7541daf9a6328c8772f794a504..19e2e7ff492aa62b1a37afa3252fcc3a4b78feae 100644 (file)
  * GNU General Public License for more details.
  */
 
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/slab.h>
 #include <linux/delay.h>
+#include <linux/dma-mapping.h>
 #include <linux/fb.h>
+#include <linux/errno.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
-#include <linux/dma-mapping.h>
-#include <linux/platform_device.h>
-#include <linux/wait.h>
+#include <linux/kernel.h>
+#include <linux/memblock.h>
+#include <linux/mm.h>
+#include <linux/module.h>
 #include <linux/of.h>
 #include <linux/of_fdt.h>
-#include <linux/memblock.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/wait.h>
+#include <video/of_display_timing.h>
 
 #include "wm8505fb_regs.h"
 #include "wmt_ge_rops.h"
@@ -261,12 +262,12 @@ static struct fb_ops wm8505fb_ops = {
 static int wm8505fb_probe(struct platform_device *pdev)
 {
        struct wm8505fb_info    *fbi;
-       struct resource         *res;
+       struct resource *res;
+       struct display_timings *disp_timing;
        void                    *addr;
        int ret;
 
-       struct fb_videomode     of_mode;
-       struct device_node      *np;
+       struct fb_videomode     mode;
        u32                     bpp;
        dma_addr_t fb_mem_phys;
        unsigned long fb_mem_len;
@@ -306,33 +307,19 @@ static int wm8505fb_probe(struct platform_device *pdev)
        if (fbi->regbase == NULL)
                return -EBUSY;
 
-       np = of_parse_phandle(pdev->dev.of_node, "default-mode", 0);
-       if (!np) {
-               pr_err("%s: No display description in Device Tree\n", __func__);
+       disp_timing = of_get_display_timings(pdev->dev.of_node);
+       if (!disp_timing)
                return -EINVAL;
-       }
 
-       /*
-        * This code is copied from Sascha Hauer's of_videomode helper
-        * and can be replaced with a call to the helper once mainlined
-        */
-       ret = 0;
-       ret |= of_property_read_u32(np, "hactive", &of_mode.xres);
-       ret |= of_property_read_u32(np, "vactive", &of_mode.yres);
-       ret |= of_property_read_u32(np, "hback-porch", &of_mode.left_margin);
-       ret |= of_property_read_u32(np, "hfront-porch", &of_mode.right_margin);
-       ret |= of_property_read_u32(np, "hsync-len", &of_mode.hsync_len);
-       ret |= of_property_read_u32(np, "vback-porch", &of_mode.upper_margin);
-       ret |= of_property_read_u32(np, "vfront-porch", &of_mode.lower_margin);
-       ret |= of_property_read_u32(np, "vsync-len", &of_mode.vsync_len);
-       ret |= of_property_read_u32(np, "bpp", &bpp);
-       if (ret) {
-               pr_err("%s: Unable to read display properties\n", __func__);
-               return -EINVAL;
-       }
+       ret = of_get_fb_videomode(pdev->dev.of_node, &mode, OF_USE_NATIVE_MODE);
+       if (ret)
+               return ret;
+
+       ret = of_property_read_u32(pdev->dev.of_node, "bits-per-pixel", &bpp);
+       if (ret)
+               return ret;
 
-       of_mode.vmode = FB_VMODE_NONINTERLACED;
-       fb_videomode_to_var(&fbi->fb.var, &of_mode);
+       fb_videomode_to_var(&fbi->fb.var, &mode);
 
        fbi->fb.var.nonstd              = 0;
        fbi->fb.var.activate            = FB_ACTIVATE_NOW;
@@ -341,7 +328,7 @@ static int wm8505fb_probe(struct platform_device *pdev)
        fbi->fb.var.width               = -1;
 
        /* try allocating the framebuffer */
-       fb_mem_len = of_mode.xres * of_mode.yres * 2 * (bpp / 8);
+       fb_mem_len = mode.xres * mode.yres * 2 * (bpp / 8);
        fb_mem_virt = dmam_alloc_coherent(&pdev->dev, fb_mem_len, &fb_mem_phys,
                                GFP_KERNEL);
        if (!fb_mem_virt) {
@@ -349,8 +336,8 @@ static int wm8505fb_probe(struct platform_device *pdev)
                return -ENOMEM;
        }
 
-       fbi->fb.var.xres_virtual        = of_mode.xres;
-       fbi->fb.var.yres_virtual        = of_mode.yres * 2;
+       fbi->fb.var.xres_virtual        = mode.xres;
+       fbi->fb.var.yres_virtual        = mode.yres * 2;
        fbi->fb.var.bits_per_pixel      = bpp;
 
        fbi->fb.fix.smem_start          = fb_mem_phys;