All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ray Jui <ray.jui@broadcom.com>
To: linux-arm-kernel@lists.infradead.org
Subject: Re: [02/11] video: ARM CLCD: support DT signal inversion flags
Date: Wed, 17 Feb 2016 18:10:46 +0000	[thread overview]
Message-ID: <0cebf93a-ee0a-3637-3242-8aed266df091@broadcom.com> (raw)
In-Reply-To: <1454594660-7532-3-git-send-email-linus.walleij@linaro.org>

Hi Linus,

A somewhat related question, how do you see the CLKSEL bit in the TIM2 
register will be supported in the future? There are some cases where the 
CLKSEL bit needs to be set, and therefore the "CLCDCLK" instead of 
"HCLK" reference clock source is selected.

Thanks!

Ray

On 2/4/2016 6:04 AM, Linus Walleij wrote:
> The device tree bindings from display-timing.txt allows us to
> specify if data enable, hsync, vsync or the pixed clock should be
> inverted on the way to the display. The driver does not currently
> handle this so add support for those flags as it is needed for
> the Versatile Sanyo LCD display.
>
> Note that the previous behaviour was to invert the pixel clock
> for all displays, so unless the pixel clock polarity is
> explicitly defined in the device tree (i.e. the timings node
> has the "pixelclk-active" property) we fall back to inverting
> the pixel clock. This needs some extra compatibility code.
>
> Since the timing flags have to be set up inside the struct
> clcd_panel, we need to refactor the code a bit to pass around
> the panel rather than just the mode.
>
> Cc: Pawel Moll <pawel.moll@arm.com>
> Cc: Rob Herring <robh@kernel.org>
> Cc: Russell King <linux@arm.linux.org.uk>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
>
> ---
> drivers/video/fbdev/amba-clcd.c | 41 ++++++++++++++++++++++++++++++++++-------
>  1 file changed, 34 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/video/fbdev/amba-clcd.c b/drivers/video/fbdev/amba-clcd.c
> index c5d1e9ca81ab..8903a42c4122 100644
> --- a/drivers/video/fbdev/amba-clcd.c
> +++ b/drivers/video/fbdev/amba-clcd.c
> @@ -567,10 +567,11 @@ static int clcdfb_register(struct clcd_fb *fb)
>
>  #ifdef CONFIG_OF
>  static int clcdfb_of_get_dpi_panel_mode(struct device_node *node,
> -		struct fb_videomode *mode)
> +		struct clcd_panel *clcd_panel)
>  {
>  	int err;
>  	struct display_timing timing;
> +	struct device_node *timnp;
>  	struct videomode video;
>
>  	err = of_get_display_timing(node, "panel-timing", &timing);
> @@ -579,10 +580,34 @@ static int clcdfb_of_get_dpi_panel_mode(struct device_node *node,
>
>  	videomode_from_timing(&timing, &video);
>
> -	err = fb_videomode_from_videomode(&video, mode);
> +	err = fb_videomode_from_videomode(&video, &clcd_panel->mode);
>  	if (err)
>  		return err;
>
> +	/* Set up some inversion flags */
> +	timnp = of_get_child_by_name(node, "panel-timing");
> +	if (timnp && of_property_read_bool(timnp, "pixelclk-active")) {
> +		if (timing.flags & DISPLAY_FLAGS_PIXDATA_NEGEDGE)
> +			clcd_panel->tim2 |= TIM2_IPC;
> +	} else {
> +		/*
> +		 * To preserve backwards compatibility, the IPC (inverted
> +		 * pixel clock) flag needs to be set on any display that
> +		 * doesn't explicitly specify that the pixel clock is
> +		 * active on the negative edge.
> +		 */
> +		clcd_panel->tim2 |= TIM2_IPC;
> +	}
> +
> +	if (timing.flags & DISPLAY_FLAGS_HSYNC_LOW)
> +		clcd_panel->tim2 |= TIM2_IHS;
> +
> +	if (timing.flags & DISPLAY_FLAGS_VSYNC_LOW)
> +		clcd_panel->tim2 |= TIM2_IVS;
> +
> +	if (timing.flags & DISPLAY_FLAGS_DE_LOW)
> +		clcd_panel->tim2 |= TIM2_IOE;
> +
>  	return 0;
>  }
>
> @@ -615,10 +640,11 @@ static int clcdfb_of_get_backlight(struct device_node *endpoint,
>  }
>
>  static int clcdfb_of_get_mode(struct device *dev, struct device_node *endpoint,
> -		struct fb_videomode *mode)
> +		struct clcd_panel *clcd_panel)
>  {
>  	int err;
>  	struct device_node *panel;
> +	struct fb_videomode *mode;
>  	char *name;
>  	int len;
>
> @@ -628,11 +654,12 @@ static int clcdfb_of_get_mode(struct device *dev, struct device_node *endpoint,
>
>  	/* Only directly connected DPI panels supported for now */
>  	if (of_device_is_compatible(panel, "panel-dpi"))
> -		err = clcdfb_of_get_dpi_panel_mode(panel, mode);
> +		err = clcdfb_of_get_dpi_panel_mode(panel, clcd_panel);
>  	else
>  		err = -ENOENT;
>  	if (err)
>  		return err;
> +	mode = &clcd_panel->mode;
>
>  	len = clcdfb_snprintf_mode(NULL, 0, mode);
>  	name = devm_kzalloc(dev, len + 1, GFP_KERNEL);
> @@ -663,8 +690,8 @@ static int clcdfb_of_init_tft_panel(struct clcd_fb *fb, u32 r0, u32 g0, u32 b0)
>  	};
>  	int i;
>
> -	/* Bypass pixel clock divider, data output on the falling edge */
> -	fb->panel->tim2 = TIM2_BCD | TIM2_IPC;
> +	/* Bypass pixel clock divider */
> +	fb->panel->tim2 |= TIM2_BCD;
>
>  	/* TFT display, vert. comp. interrupt at the start of the back porch */
>  	fb->panel->cntl |= CNTL_LCDTFT | CNTL_LCDVCOMP(1);
> @@ -704,7 +731,7 @@ static int clcdfb_of_init_display(struct clcd_fb *fb)
>  	if (err)
>  		return err;
>
> -	err = clcdfb_of_get_mode(&fb->dev->dev, endpoint, &fb->panel->mode);
> +	err = clcdfb_of_get_mode(&fb->dev->dev, endpoint, fb->panel);
>  	if (err)
>  		return err;
>
>

WARNING: multiple messages have this Message-ID (diff)
From: ray.jui@broadcom.com (Ray Jui)
To: linux-arm-kernel@lists.infradead.org
Subject: [02/11] video: ARM CLCD: support DT signal inversion flags
Date: Wed, 17 Feb 2016 10:10:46 -0800	[thread overview]
Message-ID: <0cebf93a-ee0a-3637-3242-8aed266df091@broadcom.com> (raw)
In-Reply-To: <1454594660-7532-3-git-send-email-linus.walleij@linaro.org>

Hi Linus,

A somewhat related question, how do you see the CLKSEL bit in the TIM2 
register will be supported in the future? There are some cases where the 
CLKSEL bit needs to be set, and therefore the "CLCDCLK" instead of 
"HCLK" reference clock source is selected.

Thanks!

Ray

On 2/4/2016 6:04 AM, Linus Walleij wrote:
> The device tree bindings from display-timing.txt allows us to
> specify if data enable, hsync, vsync or the pixed clock should be
> inverted on the way to the display. The driver does not currently
> handle this so add support for those flags as it is needed for
> the Versatile Sanyo LCD display.
>
> Note that the previous behaviour was to invert the pixel clock
> for all displays, so unless the pixel clock polarity is
> explicitly defined in the device tree (i.e. the timings node
> has the "pixelclk-active" property) we fall back to inverting
> the pixel clock. This needs some extra compatibility code.
>
> Since the timing flags have to be set up inside the struct
> clcd_panel, we need to refactor the code a bit to pass around
> the panel rather than just the mode.
>
> Cc: Pawel Moll <pawel.moll@arm.com>
> Cc: Rob Herring <robh@kernel.org>
> Cc: Russell King <linux@arm.linux.org.uk>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
>
> ---
> drivers/video/fbdev/amba-clcd.c | 41 ++++++++++++++++++++++++++++++++++-------
>  1 file changed, 34 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/video/fbdev/amba-clcd.c b/drivers/video/fbdev/amba-clcd.c
> index c5d1e9ca81ab..8903a42c4122 100644
> --- a/drivers/video/fbdev/amba-clcd.c
> +++ b/drivers/video/fbdev/amba-clcd.c
> @@ -567,10 +567,11 @@ static int clcdfb_register(struct clcd_fb *fb)
>
>  #ifdef CONFIG_OF
>  static int clcdfb_of_get_dpi_panel_mode(struct device_node *node,
> -		struct fb_videomode *mode)
> +		struct clcd_panel *clcd_panel)
>  {
>  	int err;
>  	struct display_timing timing;
> +	struct device_node *timnp;
>  	struct videomode video;
>
>  	err = of_get_display_timing(node, "panel-timing", &timing);
> @@ -579,10 +580,34 @@ static int clcdfb_of_get_dpi_panel_mode(struct device_node *node,
>
>  	videomode_from_timing(&timing, &video);
>
> -	err = fb_videomode_from_videomode(&video, mode);
> +	err = fb_videomode_from_videomode(&video, &clcd_panel->mode);
>  	if (err)
>  		return err;
>
> +	/* Set up some inversion flags */
> +	timnp = of_get_child_by_name(node, "panel-timing");
> +	if (timnp && of_property_read_bool(timnp, "pixelclk-active")) {
> +		if (timing.flags & DISPLAY_FLAGS_PIXDATA_NEGEDGE)
> +			clcd_panel->tim2 |= TIM2_IPC;
> +	} else {
> +		/*
> +		 * To preserve backwards compatibility, the IPC (inverted
> +		 * pixel clock) flag needs to be set on any display that
> +		 * doesn't explicitly specify that the pixel clock is
> +		 * active on the negative edge.
> +		 */
> +		clcd_panel->tim2 |= TIM2_IPC;
> +	}
> +
> +	if (timing.flags & DISPLAY_FLAGS_HSYNC_LOW)
> +		clcd_panel->tim2 |= TIM2_IHS;
> +
> +	if (timing.flags & DISPLAY_FLAGS_VSYNC_LOW)
> +		clcd_panel->tim2 |= TIM2_IVS;
> +
> +	if (timing.flags & DISPLAY_FLAGS_DE_LOW)
> +		clcd_panel->tim2 |= TIM2_IOE;
> +
>  	return 0;
>  }
>
> @@ -615,10 +640,11 @@ static int clcdfb_of_get_backlight(struct device_node *endpoint,
>  }
>
>  static int clcdfb_of_get_mode(struct device *dev, struct device_node *endpoint,
> -		struct fb_videomode *mode)
> +		struct clcd_panel *clcd_panel)
>  {
>  	int err;
>  	struct device_node *panel;
> +	struct fb_videomode *mode;
>  	char *name;
>  	int len;
>
> @@ -628,11 +654,12 @@ static int clcdfb_of_get_mode(struct device *dev, struct device_node *endpoint,
>
>  	/* Only directly connected DPI panels supported for now */
>  	if (of_device_is_compatible(panel, "panel-dpi"))
> -		err = clcdfb_of_get_dpi_panel_mode(panel, mode);
> +		err = clcdfb_of_get_dpi_panel_mode(panel, clcd_panel);
>  	else
>  		err = -ENOENT;
>  	if (err)
>  		return err;
> +	mode = &clcd_panel->mode;
>
>  	len = clcdfb_snprintf_mode(NULL, 0, mode);
>  	name = devm_kzalloc(dev, len + 1, GFP_KERNEL);
> @@ -663,8 +690,8 @@ static int clcdfb_of_init_tft_panel(struct clcd_fb *fb, u32 r0, u32 g0, u32 b0)
>  	};
>  	int i;
>
> -	/* Bypass pixel clock divider, data output on the falling edge */
> -	fb->panel->tim2 = TIM2_BCD | TIM2_IPC;
> +	/* Bypass pixel clock divider */
> +	fb->panel->tim2 |= TIM2_BCD;
>
>  	/* TFT display, vert. comp. interrupt at the start of the back porch */
>  	fb->panel->cntl |= CNTL_LCDTFT | CNTL_LCDVCOMP(1);
> @@ -704,7 +731,7 @@ static int clcdfb_of_init_display(struct clcd_fb *fb)
>  	if (err)
>  		return err;
>
> -	err = clcdfb_of_get_mode(&fb->dev->dev, endpoint, &fb->panel->mode);
> +	err = clcdfb_of_get_mode(&fb->dev->dev, endpoint, fb->panel);
>  	if (err)
>  		return err;
>
>

  reply	other threads:[~2016-02-17 18:10 UTC|newest]

Thread overview: 145+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-04 14:04 [PATCH 00/11] CLCD Nomadik+Versatile support Linus Walleij
2016-02-04 14:04 ` Linus Walleij
2016-02-04 14:04 ` [PATCH 01/11] video: ARM CLCD: backlight support for OF Linus Walleij
2016-02-04 14:04   ` Linus Walleij
2016-02-04 14:04 ` [PATCH 02/11] video: ARM CLCD: support DT signal inversion flags Linus Walleij
2016-02-04 14:04   ` Linus Walleij
2016-02-17 18:10   ` Ray Jui [this message]
2016-02-17 18:10     ` [02/11] " Ray Jui
2016-02-19  8:46     ` Linus Walleij
2016-02-19  8:46       ` Linus Walleij
2016-02-20  1:23       ` Ray Jui
2016-02-20  1:23         ` Ray Jui
2016-02-20 11:46         ` Linus Walleij
2016-02-20 11:46           ` Linus Walleij
2016-02-04 14:04 ` [PATCH 03/11] video: ARM CLCD: support pads connected in reverse order Linus Walleij
2016-02-04 14:04   ` Linus Walleij
2016-02-04 14:04 ` [PATCH 04/11] video: ARM CLCD: support Nomadik variant Linus Walleij
2016-02-04 14:04   ` Linus Walleij
2016-02-04 14:04 ` [PATCH 05/11] video: ARM CLCD: add special board and panel hooks for Nomadik Linus Walleij
2016-02-04 14:04   ` Linus Walleij
2016-02-04 14:04 ` [PATCH 06/11] Documentation/DT: add blurb for IB2 syscon to Versatile Linus Walleij
2016-02-04 14:04   ` Linus Walleij
2016-02-04 14:04 ` [PATCH 07/11] Documentation/DT: add Versatile display bindings Linus Walleij
2016-02-04 14:04   ` Linus Walleij
2016-02-17  9:11   ` Tomi Valkeinen
2016-02-17  9:11     ` Tomi Valkeinen
2016-02-18 20:48     ` Linus Walleij
2016-02-18 20:48       ` Linus Walleij
2016-02-04 14:04 ` [PATCH 08/11] video: ARM CLCD: add special panel hook for Versatiles Linus Walleij
2016-02-04 14:04   ` Linus Walleij
2016-02-04 14:04 ` [PATCH 09/11] ARM: PB11MPCore: define a standard VGA panel Linus Walleij
2016-02-04 14:04   ` Linus Walleij
2016-02-04 14:04 ` [PATCH 10/11] ARM: PB1176: " Linus Walleij
2016-02-04 14:04   ` Linus Walleij
2016-02-04 14:04 ` [PATCH 11/11] ARM: versatile: move CLCD configuration to device tree Linus Walleij
2016-02-04 14:04   ` Linus Walleij
2016-02-17  9:09   ` Tomi Valkeinen
2016-02-17  9:09     ` Tomi Valkeinen
2016-02-17  9:41     ` Russell King - ARM Linux
2016-02-17  9:41       ` Russell King - ARM Linux
2016-02-17 16:17     ` Linus Walleij
2016-02-17 16:17       ` Linus Walleij
2016-02-17 21:32       ` Russell King - ARM Linux
2016-02-17 21:32         ` Russell King - ARM Linux
2016-02-18 11:52         ` Tomi Valkeinen
2016-02-18 11:52           ` Tomi Valkeinen
2016-02-18 13:12           ` Russell King - ARM Linux
2016-02-18 13:12             ` Russell King - ARM Linux
2016-02-18 13:37             ` Tomi Valkeinen
2016-02-18 13:37               ` Tomi Valkeinen
2016-02-18 20:31               ` Linus Walleij
2016-02-18 20:31                 ` Linus Walleij
     [not found]           ` <56C5B080.9090007-l0cyMroinI0@public.gmane.org>
2016-02-21 22:39             ` Linus Walleij
2016-02-21 22:39               ` Linus Walleij
2016-02-21 22:39               ` Linus Walleij
     [not found]               ` <CACRpkdaXFUCR5=5mS28_4Dx_LfzqV13zwT=vVeJwuOzm_rGRBQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-02-22 15:41                 ` Tomi Valkeinen
2016-02-22 15:41                   ` Tomi Valkeinen
2016-02-22 15:41                   ` Tomi Valkeinen
     [not found]                   ` <56CB2C31.5040703-l0cyMroinI0@public.gmane.org>
2016-02-22 15:54                     ` Linus Walleij
2016-02-22 15:54                       ` Linus Walleij
2016-02-22 15:54                       ` Linus Walleij
2016-02-23  9:08   ` Linus Walleij
2016-02-23  9:08     ` Linus Walleij
2016-02-23  9:34     ` Arnd Bergmann
2016-02-23  9:34       ` Arnd Bergmann
2016-02-23 10:10       ` Linus Walleij
2016-02-23 10:10         ` Linus Walleij
2016-02-23 11:22         ` Arnd Bergmann
2016-02-23 11:22           ` Arnd Bergmann
2016-02-23 13:00           ` Tomi Valkeinen
2016-02-23 13:00             ` Tomi Valkeinen
2016-02-23 13:16             ` Linus Walleij
2016-02-23 13:16               ` Linus Walleij
2016-02-23 13:38               ` Tomi Valkeinen
2016-02-23 13:38                 ` Tomi Valkeinen
2016-02-24 10:53                 ` Russell King - ARM Linux
2016-02-24 10:53                   ` Russell King - ARM Linux
2016-02-24 11:35                   ` Tomi Valkeinen
2016-02-24 11:35                     ` Tomi Valkeinen
2016-02-25 14:04                 ` Linus Walleij
2016-02-25 14:04                   ` Linus Walleij
2016-02-25 16:08                   ` Arnd Bergmann
2016-02-25 16:08                     ` Arnd Bergmann
2016-02-25 16:22                   ` Russell King - ARM Linux
2016-02-25 16:22                     ` Russell King - ARM Linux
2016-02-25 16:45                   ` Tomi Valkeinen
2016-02-25 16:45                     ` Tomi Valkeinen
2016-02-25 16:57                     ` Russell King - ARM Linux
2016-02-25 16:57                       ` Russell King - ARM Linux
2016-02-25 19:30                     ` Linus Walleij
2016-02-25 19:30                       ` Linus Walleij
2016-02-26 10:47                       ` Tomi Valkeinen
2016-02-26 10:47                         ` Tomi Valkeinen
2016-03-05 16:57                         ` Linus Walleij
2016-03-05 16:57                           ` Linus Walleij
2016-03-07  7:36                           ` Tomi Valkeinen
2016-03-07  7:36                             ` Tomi Valkeinen
2016-02-25 19:32                     ` Linus Walleij
2016-02-25 19:32                       ` Linus Walleij
2016-02-23  9:58     ` Tomi Valkeinen
2016-02-23  9:58       ` Tomi Valkeinen
2016-02-23 10:32       ` Adam Ford
2016-02-23 10:32         ` Adam Ford
2016-02-23 10:59         ` Pantelis Antoniou
2016-02-23 10:59           ` Pantelis Antoniou
2016-02-23 11:56       ` Peter Maydell
2016-02-23 11:56         ` Peter Maydell
2016-02-23 12:01         ` Russell King - ARM Linux
2016-02-23 12:01           ` Russell King - ARM Linux
2016-02-23 13:45           ` Tom Rini
2016-02-23 13:45             ` Tom Rini
2016-02-23 12:45         ` Tomi Valkeinen
2016-02-23 12:45           ` Tomi Valkeinen
2016-02-23 13:49           ` Peter Maydell
2016-02-23 13:49             ` Peter Maydell
2016-02-24 12:06             ` Tomi Valkeinen
2016-02-24 12:06               ` Tomi Valkeinen
2016-02-24 10:46           ` Russell King - ARM Linux
2016-02-24 10:46             ` Russell King - ARM Linux
2016-02-24 11:21             ` Tomi Valkeinen
2016-02-24 11:21               ` Tomi Valkeinen
2016-02-24 11:35               ` Russell King - ARM Linux
2016-02-24 11:35                 ` Russell King - ARM Linux
2016-02-24 11:47                 ` Tomi Valkeinen
2016-02-24 11:47                   ` Tomi Valkeinen
2016-02-24 12:13               ` Pantelis Antoniou
2016-02-24 12:13                 ` Pantelis Antoniou
2016-02-25 13:43                 ` Linus Walleij
2016-02-25 13:43                   ` Linus Walleij
2016-02-25 13:56                   ` Tomi Valkeinen
2016-02-25 13:56                     ` Tomi Valkeinen
2016-02-25 14:35                   ` Pantelis Antoniou
2016-02-25 14:35                     ` Pantelis Antoniou
2016-02-25 15:36                     ` Linus Walleij
2016-02-25 15:36                       ` Linus Walleij
2016-02-25 15:40                       ` Pantelis Antoniou
2016-02-25 15:40                         ` Pantelis Antoniou
2016-02-23 13:08         ` Linus Walleij
2016-02-23 13:08           ` Linus Walleij
2016-02-15 23:34 ` [PATCH 00/11] CLCD Nomadik+Versatile support Linus Walleij
2016-02-15 23:34   ` Linus Walleij
2016-02-16 13:29   ` Tomi Valkeinen
2016-02-16 13:29     ` Tomi Valkeinen
2016-02-16 22:30     ` Linus Walleij
2016-02-16 22:30       ` Linus Walleij

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0cebf93a-ee0a-3637-3242-8aed266df091@broadcom.com \
    --to=ray.jui@broadcom.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.