diff options
| author | Linus Walleij <linus.walleij@linaro.org> | 2016-06-16 05:36:15 -0400 |
|---|---|---|
| committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2016-08-11 10:54:53 -0400 |
| commit | 03d14c36af98dd2191c2e35b5ed55ff93b59d345 (patch) | |
| tree | 80ce9c2dac706da03271214a645b0c04e10111cb /include/linux/amba | |
| parent | af29897f1046d7c1ab86b57506fbfdcfba569de8 (diff) | |
video: ARM CLCD: support pads connected in reverse order
There are CLCDs connected with the pads in BGR rather than RGB
order. It really doesn't matter since the CLCD has a flag and
a bit to switch the position of the RGB and BGR components.
This is needed to put something logical into the
arm,pl11x,tft-r0g0b0-pads property of the device tree on the
Nomadik which will then be <16 8 0>.
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>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'include/linux/amba')
| -rw-r--r-- | include/linux/amba/clcd.h | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/include/linux/amba/clcd.h b/include/linux/amba/clcd.h index e64c1ccebb76..8b64ec0d574b 100644 --- a/include/linux/amba/clcd.h +++ b/include/linux/amba/clcd.h | |||
| @@ -108,6 +108,12 @@ struct clcd_panel { | |||
| 108 | grayscale:1; | 108 | grayscale:1; |
| 109 | unsigned int connector; | 109 | unsigned int connector; |
| 110 | struct backlight_device *backlight; | 110 | struct backlight_device *backlight; |
| 111 | /* | ||
| 112 | * If the B/R lines are switched between the CLCD | ||
| 113 | * and the panel we need to know this and not try to | ||
| 114 | * compensate with the BGR bit in the control register. | ||
| 115 | */ | ||
| 116 | bool bgr_connection; | ||
| 111 | }; | 117 | }; |
| 112 | 118 | ||
| 113 | struct clcd_regs { | 119 | struct clcd_regs { |
| @@ -234,16 +240,22 @@ static inline void clcdfb_decode(struct clcd_fb *fb, struct clcd_regs *regs) | |||
| 234 | if (var->grayscale) | 240 | if (var->grayscale) |
| 235 | val |= CNTL_LCDBW; | 241 | val |= CNTL_LCDBW; |
| 236 | 242 | ||
| 237 | if (fb->panel->caps && fb->board->caps && | 243 | if (fb->panel->caps && fb->board->caps && var->bits_per_pixel >= 16) { |
| 238 | var->bits_per_pixel >= 16) { | ||
| 239 | /* | 244 | /* |
| 240 | * if board and panel supply capabilities, we can support | 245 | * if board and panel supply capabilities, we can support |
| 241 | * changing BGR/RGB depending on supplied parameters | 246 | * changing BGR/RGB depending on supplied parameters. Here |
| 247 | * we switch to what the framebuffer is providing if need | ||
| 248 | * be, so if the framebuffer is BGR but the display connection | ||
| 249 | * is RGB (first case) we switch it around. Vice versa mutatis | ||
| 250 | * mutandis if the framebuffer is RGB but the display connection | ||
| 251 | * is BGR, we flip it around. | ||
| 242 | */ | 252 | */ |
| 243 | if (var->red.offset == 0) | 253 | if (var->red.offset == 0) |
| 244 | val &= ~CNTL_BGR; | 254 | val &= ~CNTL_BGR; |
| 245 | else | 255 | else |
| 246 | val |= CNTL_BGR; | 256 | val |= CNTL_BGR; |
| 257 | if (fb->panel->bgr_connection) | ||
| 258 | val ^= CNTL_BGR; | ||
| 247 | } | 259 | } |
| 248 | 260 | ||
| 249 | switch (var->bits_per_pixel) { | 261 | switch (var->bits_per_pixel) { |
