From: Linus Walleij <linus.walleij@linaro.org> To: linux-arm-kernel@lists.infradead.org Subject: [PATCH 02/11] video: ARM CLCD: support DT signal inversion flags Date: Thu, 04 Feb 2016 14:04:11 +0000 [thread overview] Message-ID: <1454594660-7532-3-git-send-email-linus.walleij@linaro.org> (raw) In-Reply-To: <1454594660-7532-1-git-send-email-linus.walleij@linaro.org> 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; -- 2.4.3
WARNING: multiple messages have this Message-ID (diff)
From: linus.walleij@linaro.org (Linus Walleij) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH 02/11] video: ARM CLCD: support DT signal inversion flags Date: Thu, 4 Feb 2016 15:04:11 +0100 [thread overview] Message-ID: <1454594660-7532-3-git-send-email-linus.walleij@linaro.org> (raw) In-Reply-To: <1454594660-7532-1-git-send-email-linus.walleij@linaro.org> 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; -- 2.4.3
next prev parent reply other threads:[~2016-02-04 14:04 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 ` Linus Walleij [this message] 2016-02-04 14:04 ` [PATCH 02/11] video: ARM CLCD: support DT signal inversion flags Linus Walleij 2016-02-17 18:10 ` [02/11] " Ray Jui 2016-02-17 18:10 ` 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=1454594660-7532-3-git-send-email-linus.walleij@linaro.org \ --to=linus.walleij@linaro.org \ --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: linkBe 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.