diff mbox

video: fb: vt8500: Convert framebuffer drivers to standardized binding

Message ID 1364100587-9320-1-git-send-email-linux@prisktech.co.nz (mailing list archive)
State New, archived
Headers show

Commit Message

Tony Prisk March 24, 2013, 4:49 a.m. UTC
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>
---
Hi Florian,

This patch is based on top of the previous patchset (0/5 video: vt8500 patches
for 3.10). It could be considered patch 6 of the same set.

Regards
Tony P

 .../devicetree/bindings/video/via,vt8500-fb.txt    |   48 ++++----------
 .../devicetree/bindings/video/wm,wm8505-fb.txt     |   32 +++++----
 arch/arm/boot/dts/vt8500-bv07.dts                  |   24 +++----
 arch/arm/boot/dts/vt8500.dtsi                      |    8 ---
 arch/arm/boot/dts/wm8505-ref.dts                   |   21 +++---
 arch/arm/boot/dts/wm8505.dtsi                      |    7 --
 arch/arm/boot/dts/wm8650-mid.dts                   |   21 +++---
 arch/arm/boot/dts/wm8650.dtsi                      |    7 --
 arch/arm/boot/dts/wm8850-w70v2.dts                 |   21 +++---
 arch/arm/boot/dts/wm8850.dtsi                      |    7 --
 drivers/video/Kconfig                              |    6 ++
 drivers/video/vt8500lcdfb.c                        |   53 ++++++---------
 drivers/video/wm8505fb.c                           |   68 ++++++++------------
 13 files changed, 130 insertions(+), 193 deletions(-)

Comments

Jean-Christophe PLAGNIOL-VILLARD March 29, 2013, 6:43 p.m. UTC | #1
On 17:49 Sun 24 Mar     , Tony Prisk wrote:
> 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>
> ---
> Hi Florian,
> 
> This patch is based on top of the previous patchset (0/5 video: vt8500 patches
> for 3.10). It could be considered patch 6 of the same set.
> 
> Regards
> Tony P
> 
>  .../devicetree/bindings/video/via,vt8500-fb.txt    |   48 ++++----------
>  .../devicetree/bindings/video/wm,wm8505-fb.txt     |   32 +++++----
>  arch/arm/boot/dts/vt8500-bv07.dts                  |   24 +++----
>  arch/arm/boot/dts/vt8500.dtsi                      |    8 ---
>  arch/arm/boot/dts/wm8505-ref.dts                   |   21 +++---
>  arch/arm/boot/dts/wm8505.dtsi                      |    7 --
>  arch/arm/boot/dts/wm8650-mid.dts                   |   21 +++---
>  arch/arm/boot/dts/wm8650.dtsi                      |    7 --
>  arch/arm/boot/dts/wm8850-w70v2.dts                 |   21 +++---
>  arch/arm/boot/dts/wm8850.dtsi                      |    7 --
>  drivers/video/Kconfig                              |    6 ++
>  drivers/video/vt8500lcdfb.c                        |   53 ++++++---------
>  drivers/video/wm8505fb.c                           |   68 ++++++++------------
>  13 files changed, 130 insertions(+), 193 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/video/via,vt8500-fb.txt b/Documentation/devicetree/bindings/video/via,vt8500-fb.txt
> index c870b64..2871e21 100644
> --- a/Documentation/devicetree/bindings/video/via,vt8500-fb.txt
> +++ b/Documentation/devicetree/bindings/video/via,vt8500-fb.txt
> @@ -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 */
>  			};
>  		};
>  	};
> +
> diff --git a/Documentation/devicetree/bindings/video/wm,wm8505-fb.txt b/Documentation/devicetree/bindings/video/wm,wm8505-fb.txt
> index 3d325e1..0bcadb2 100644
> --- a/Documentation/devicetree/bindings/video/wm,wm8505-fb.txt
> +++ b/Documentation/devicetree/bindings/video/wm,wm8505-fb.txt
> @@ -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>;
> +			};
> +		};
>  	};
> diff --git a/arch/arm/boot/dts/vt8500-bv07.dts b/arch/arm/boot/dts/vt8500-bv07.dts
> index 567cf4e..7ec9a41 100644
> --- a/arch/arm/boot/dts/vt8500-bv07.dts
> +++ b/arch/arm/boot/dts/vt8500-bv07.dts
> @@ -12,24 +12,26 @@
>  / {
>  	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 {
> +	interrupt-parent = <&intc>;
> +
> +	fb@d8050800 {
> +		compatible = "via,vt8500-fb";
> +		reg = <0xd800e400 0x400>;
> +		interrupts = <12>;
> +		bits-per-pixel = <16>;
> +
> +		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 */
>  			};
>  		};
>  	};
> diff --git a/arch/arm/boot/dts/vt8500.dtsi b/arch/arm/boot/dts/vt8500.dtsi
> index cf31ced..fc25d9f 100644
> --- a/arch/arm/boot/dts/vt8500.dtsi
> +++ b/arch/arm/boot/dts/vt8500.dtsi
> @@ -98,14 +98,6 @@
>  			interrupts = <43>;
>  		};
>  
> -		fb@d800e400 {
> -			compatible = "via,vt8500-fb";
> -			reg = <0xd800e400 0x400>;
> -			interrupts = <12>;
> -			display = <&display>;
> -			default-mode = <&mode0>;
> -		};

no this belong here at Soc level not board
		fb@d800e400 {
			compatible = "via,vt8500-fb";
			reg = <0xd800e400 0x400>;
			interrupts = <12>;
		};

> -
>  		ge_rops@d8050400 {
>  			compatible = "wm,prizm-ge-rops";
>  			reg = <0xd8050400 0x100>;
> diff --git a/arch/arm/boot/dts/wm8505-ref.dts b/arch/arm/boot/dts/wm8505-ref.dts
> index fd4e248..a600572 100644
> --- a/arch/arm/boot/dts/wm8505-ref.dts
> +++ b/arch/arm/boot/dts/wm8505-ref.dts
> @@ -12,24 +12,23 @@
>  / {
>  	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 {
> +	fb@d8050800 {
> +		compatible = "wm,wm8505-fb";
> +		reg = <0xd8050800 0x200>;
> +		bits-per-pixel = <32>;
> +
> +		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 = <32>;	/* non-standard but required */
>  			};
>  		};
>  	};
> diff --git a/arch/arm/boot/dts/wm8505.dtsi b/arch/arm/boot/dts/wm8505.dtsi
> index e74a1c0..826bd8d 100644
> --- a/arch/arm/boot/dts/wm8505.dtsi
> +++ b/arch/arm/boot/dts/wm8505.dtsi
> @@ -128,13 +128,6 @@
>  			interrupts = <0>;
>  		};
>  
> -		fb@d8050800 {
> -			compatible = "wm,wm8505-fb";
> -			reg = <0xd8050800 0x200>;
> -			display = <&display>;
> -			default-mode = <&mode0>;
> -		};
> -
>  		ge_rops@d8050400 {
>  			compatible = "wm,prizm-ge-rops";
>  			reg = <0xd8050400 0x100>;
> diff --git a/arch/arm/boot/dts/wm8650-mid.dts b/arch/arm/boot/dts/wm8650-mid.dts
> index cefd938..d77bf22 100644
> --- a/arch/arm/boot/dts/wm8650-mid.dts
> +++ b/arch/arm/boot/dts/wm8650-mid.dts
> @@ -12,24 +12,23 @@
>  / {
>  	model = "Wondermedia WM8650-MID 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 {
> +	fb@d8050800 {
> +		compatible = "wm,wm8505-fb";
> +		reg = <0xd8050800 0x200>;
> +		bits-per-pixel = <16>;
> +
> +		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 */
>  			};
>  		};
>  	};
> diff --git a/arch/arm/boot/dts/wm8650.dtsi b/arch/arm/boot/dts/wm8650.dtsi
> index db3c0a1..2073963 100644
> --- a/arch/arm/boot/dts/wm8650.dtsi
> +++ b/arch/arm/boot/dts/wm8650.dtsi
> @@ -128,13 +128,6 @@
>  			interrupts = <43>;
>  		};
>  
> -		fb@d8050800 {
> -			compatible = "wm,wm8505-fb";
> -			reg = <0xd8050800 0x200>;
> -			display = <&display>;
> -			default-mode = <&mode0>;
> -		};
> -
>  		ge_rops@d8050400 {
>  			compatible = "wm,prizm-ge-rops";
>  			reg = <0xd8050400 0x100>;
> diff --git a/arch/arm/boot/dts/wm8850-w70v2.dts b/arch/arm/boot/dts/wm8850-w70v2.dts
> index fcc660c..9b56701 100644
> --- a/arch/arm/boot/dts/wm8850-w70v2.dts
> +++ b/arch/arm/boot/dts/wm8850-w70v2.dts
> @@ -15,24 +15,23 @@
>  / {
>  	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 {
> +	fb@d8051700 {
> +		compatible = "wm,wm8505-fb";
> +		reg = <0xd8051700 0x200>;
> +		bits-per-pixel = <16>;
> +
> +		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 */
>  			};
>  		};
>  	};
> diff --git a/arch/arm/boot/dts/wm8850.dtsi b/arch/arm/boot/dts/wm8850.dtsi
> index e8cbfdc..dfc50a4 100644
> --- a/arch/arm/boot/dts/wm8850.dtsi
> +++ b/arch/arm/boot/dts/wm8850.dtsi
> @@ -135,13 +135,6 @@
>  			};
>  		};
>  
> -		fb@d8051700 {
> -			compatible = "wm,wm8505-fb";
> -			reg = <0xd8051700 0x200>;
> -			display = <&display>;
> -			default-mode = <&mode0>;
> -		};
> -
>  		ge_rops@d8050400 {
>  			compatible = "wm,prizm-ge-rops";
>  			reg = <0xd8050400 0x100>;
> diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
> index ad762ed..d0c932a 100644
> --- a/drivers/video/Kconfig
> +++ b/drivers/video/Kconfig
> @@ -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
> diff --git a/drivers/video/vt8500lcdfb.c b/drivers/video/vt8500lcdfb.c
> index 1c34821..816e8ce 100644
> --- a/drivers/video/vt8500lcdfb.c
> +++ b/drivers/video/vt8500lcdfb.c
> @@ -15,20 +15,21 @@
>   * 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"
>  
> @@ -290,11 +291,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;
> @@ -359,31 +360,19 @@ 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;
> +
> +	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;
>  
> -	/*
> -	 * 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;
>  
>  	/* try allocating the framebuffer */
> diff --git a/drivers/video/wm8505fb.c b/drivers/video/wm8505fb.c
> index 5057457..ab112ad 100644
> --- a/drivers/video/wm8505fb.c
> +++ b/drivers/video/wm8505fb.c
> @@ -14,23 +14,24 @@
>   * 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"
>  
> @@ -276,12 +277,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;
> @@ -321,33 +322,20 @@ 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);
> +	mode.vmode = FB_VMODE_NONINTERLACED;
why this hanble by of_get_fb_videomode

Best Regards,
J.
> +	fb_videomode_to_var(&fbi->fb.var, &mode);
>  
>  	fbi->fb.var.nonstd		= 0;
>  	fbi->fb.var.activate		= FB_ACTIVATE_NOW;
> @@ -356,7 +344,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) {
> @@ -364,8 +352,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;
> -- 
> 1.7.9.5
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Tony Prisk March 30, 2013, 9:25 a.m. UTC | #2
On 30/03/13 07:43, Jean-Christophe PLAGNIOL-VILLARD wrote:
> On 17:49 Sun 24 Mar     , Tony Prisk wrote:
>> 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>
>> ---
>> Hi Florian,
>>
>> This patch is based on top of the previous patchset (0/5 video: vt8500 patches
>> for 3.10). It could be considered patch 6 of the same set.
>>
>> Regards
>> Tony P
>>
>>   .../devicetree/bindings/video/via,vt8500-fb.txt    |   48 ++++----------
>>   .../devicetree/bindings/video/wm,wm8505-fb.txt     |   32 +++++----
>>   arch/arm/boot/dts/vt8500-bv07.dts                  |   24 +++----
>>   arch/arm/boot/dts/vt8500.dtsi                      |    8 ---
>>   arch/arm/boot/dts/wm8505-ref.dts                   |   21 +++---
>>   arch/arm/boot/dts/wm8505.dtsi                      |    7 --
>>   arch/arm/boot/dts/wm8650-mid.dts                   |   21 +++---
>>   arch/arm/boot/dts/wm8650.dtsi                      |    7 --
>>   arch/arm/boot/dts/wm8850-w70v2.dts                 |   21 +++---
>>   arch/arm/boot/dts/wm8850.dtsi                      |    7 --
>>   drivers/video/Kconfig                              |    6 ++
>>   drivers/video/vt8500lcdfb.c                        |   53 ++++++---------
>>   drivers/video/wm8505fb.c                           |   68 ++++++++------------
>>   13 files changed, 130 insertions(+), 193 deletions(-)
>>
>> ...
>>
>> diff --git a/arch/arm/boot/dts/vt8500.dtsi b/arch/arm/boot/dts/vt8500.dtsi
>> index cf31ced..fc25d9f 100644
>> --- a/arch/arm/boot/dts/vt8500.dtsi
>> +++ b/arch/arm/boot/dts/vt8500.dtsi
>> @@ -98,14 +98,6 @@
>>   			interrupts = <43>;
>>   		};
>>   
>> -		fb@d800e400 {
>> -			compatible = "via,vt8500-fb";
>> -			reg = <0xd800e400 0x400>;
>> -			interrupts = <12>;
>> -			display = <&display>;
>> -			default-mode = <&mode0>;
>> -		};
> no this belong here at Soc level not board
> 		fb@d800e400 {
> 			compatible = "via,vt8500-fb";
> 			reg = <0xd800e400 0x400>;
> 			interrupts = <12>;
> 		};
I have made this change as suggested by Tomi. I had a feeling it was 
wrong, but didn't know the correct way of doing it. Will be in v2.
>> ...
>>
>> +	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);
>> +	mode.vmode = FB_VMODE_NONINTERLACED;
> why this hanble by of_get_fb_videomode
>
> Best Regards,
> J.
>
Hmm.. I didn't notice the optional interlaced property. Will remove this 
for v2 - All boards so far have been non-interlaced so it doesn't 
require a change to the dts.

Thanks for the feedback

Regards
Tony P
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/video/via,vt8500-fb.txt b/Documentation/devicetree/bindings/video/via,vt8500-fb.txt
index c870b64..2871e21 100644
--- a/Documentation/devicetree/bindings/video/via,vt8500-fb.txt
+++ b/Documentation/devicetree/bindings/video/via,vt8500-fb.txt
@@ -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 */
 			};
 		};
 	};
+
diff --git a/Documentation/devicetree/bindings/video/wm,wm8505-fb.txt b/Documentation/devicetree/bindings/video/wm,wm8505-fb.txt
index 3d325e1..0bcadb2 100644
--- a/Documentation/devicetree/bindings/video/wm,wm8505-fb.txt
+++ b/Documentation/devicetree/bindings/video/wm,wm8505-fb.txt
@@ -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>;
+			};
+		};
 	};
diff --git a/arch/arm/boot/dts/vt8500-bv07.dts b/arch/arm/boot/dts/vt8500-bv07.dts
index 567cf4e..7ec9a41 100644
--- a/arch/arm/boot/dts/vt8500-bv07.dts
+++ b/arch/arm/boot/dts/vt8500-bv07.dts
@@ -12,24 +12,26 @@ 
 / {
 	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 {
+	interrupt-parent = <&intc>;
+
+	fb@d8050800 {
+		compatible = "via,vt8500-fb";
+		reg = <0xd800e400 0x400>;
+		interrupts = <12>;
+		bits-per-pixel = <16>;
+
+		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 */
 			};
 		};
 	};
diff --git a/arch/arm/boot/dts/vt8500.dtsi b/arch/arm/boot/dts/vt8500.dtsi
index cf31ced..fc25d9f 100644
--- a/arch/arm/boot/dts/vt8500.dtsi
+++ b/arch/arm/boot/dts/vt8500.dtsi
@@ -98,14 +98,6 @@ 
 			interrupts = <43>;
 		};
 
-		fb@d800e400 {
-			compatible = "via,vt8500-fb";
-			reg = <0xd800e400 0x400>;
-			interrupts = <12>;
-			display = <&display>;
-			default-mode = <&mode0>;
-		};
-
 		ge_rops@d8050400 {
 			compatible = "wm,prizm-ge-rops";
 			reg = <0xd8050400 0x100>;
diff --git a/arch/arm/boot/dts/wm8505-ref.dts b/arch/arm/boot/dts/wm8505-ref.dts
index fd4e248..a600572 100644
--- a/arch/arm/boot/dts/wm8505-ref.dts
+++ b/arch/arm/boot/dts/wm8505-ref.dts
@@ -12,24 +12,23 @@ 
 / {
 	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 {
+	fb@d8050800 {
+		compatible = "wm,wm8505-fb";
+		reg = <0xd8050800 0x200>;
+		bits-per-pixel = <32>;
+
+		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 = <32>;	/* non-standard but required */
 			};
 		};
 	};
diff --git a/arch/arm/boot/dts/wm8505.dtsi b/arch/arm/boot/dts/wm8505.dtsi
index e74a1c0..826bd8d 100644
--- a/arch/arm/boot/dts/wm8505.dtsi
+++ b/arch/arm/boot/dts/wm8505.dtsi
@@ -128,13 +128,6 @@ 
 			interrupts = <0>;
 		};
 
-		fb@d8050800 {
-			compatible = "wm,wm8505-fb";
-			reg = <0xd8050800 0x200>;
-			display = <&display>;
-			default-mode = <&mode0>;
-		};
-
 		ge_rops@d8050400 {
 			compatible = "wm,prizm-ge-rops";
 			reg = <0xd8050400 0x100>;
diff --git a/arch/arm/boot/dts/wm8650-mid.dts b/arch/arm/boot/dts/wm8650-mid.dts
index cefd938..d77bf22 100644
--- a/arch/arm/boot/dts/wm8650-mid.dts
+++ b/arch/arm/boot/dts/wm8650-mid.dts
@@ -12,24 +12,23 @@ 
 / {
 	model = "Wondermedia WM8650-MID 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 {
+	fb@d8050800 {
+		compatible = "wm,wm8505-fb";
+		reg = <0xd8050800 0x200>;
+		bits-per-pixel = <16>;
+
+		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 */
 			};
 		};
 	};
diff --git a/arch/arm/boot/dts/wm8650.dtsi b/arch/arm/boot/dts/wm8650.dtsi
index db3c0a1..2073963 100644
--- a/arch/arm/boot/dts/wm8650.dtsi
+++ b/arch/arm/boot/dts/wm8650.dtsi
@@ -128,13 +128,6 @@ 
 			interrupts = <43>;
 		};
 
-		fb@d8050800 {
-			compatible = "wm,wm8505-fb";
-			reg = <0xd8050800 0x200>;
-			display = <&display>;
-			default-mode = <&mode0>;
-		};
-
 		ge_rops@d8050400 {
 			compatible = "wm,prizm-ge-rops";
 			reg = <0xd8050400 0x100>;
diff --git a/arch/arm/boot/dts/wm8850-w70v2.dts b/arch/arm/boot/dts/wm8850-w70v2.dts
index fcc660c..9b56701 100644
--- a/arch/arm/boot/dts/wm8850-w70v2.dts
+++ b/arch/arm/boot/dts/wm8850-w70v2.dts
@@ -15,24 +15,23 @@ 
 / {
 	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 {
+	fb@d8051700 {
+		compatible = "wm,wm8505-fb";
+		reg = <0xd8051700 0x200>;
+		bits-per-pixel = <16>;
+
+		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 */
 			};
 		};
 	};
diff --git a/arch/arm/boot/dts/wm8850.dtsi b/arch/arm/boot/dts/wm8850.dtsi
index e8cbfdc..dfc50a4 100644
--- a/arch/arm/boot/dts/wm8850.dtsi
+++ b/arch/arm/boot/dts/wm8850.dtsi
@@ -135,13 +135,6 @@ 
 			};
 		};
 
-		fb@d8051700 {
-			compatible = "wm,wm8505-fb";
-			reg = <0xd8051700 0x200>;
-			display = <&display>;
-			default-mode = <&mode0>;
-		};
-
 		ge_rops@d8050400 {
 			compatible = "wm,prizm-ge-rops";
 			reg = <0xd8050400 0x100>;
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
index ad762ed..d0c932a 100644
--- a/drivers/video/Kconfig
+++ b/drivers/video/Kconfig
@@ -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
diff --git a/drivers/video/vt8500lcdfb.c b/drivers/video/vt8500lcdfb.c
index 1c34821..816e8ce 100644
--- a/drivers/video/vt8500lcdfb.c
+++ b/drivers/video/vt8500lcdfb.c
@@ -15,20 +15,21 @@ 
  * 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"
 
@@ -290,11 +291,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;
@@ -359,31 +360,19 @@  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;
+
+	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;
 
-	/*
-	 * 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;
 
 	/* try allocating the framebuffer */
diff --git a/drivers/video/wm8505fb.c b/drivers/video/wm8505fb.c
index 5057457..ab112ad 100644
--- a/drivers/video/wm8505fb.c
+++ b/drivers/video/wm8505fb.c
@@ -14,23 +14,24 @@ 
  * 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"
 
@@ -276,12 +277,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;
@@ -321,33 +322,20 @@  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);
+	mode.vmode = FB_VMODE_NONINTERLACED;
+	fb_videomode_to_var(&fbi->fb.var, &mode);
 
 	fbi->fb.var.nonstd		= 0;
 	fbi->fb.var.activate		= FB_ACTIVATE_NOW;
@@ -356,7 +344,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) {
@@ -364,8 +352,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;