aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/amba
diff options
context:
space:
mode:
authorLinus Walleij <linus.walleij@linaro.org>2016-06-16 05:36:15 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2016-08-11 10:54:53 -0400
commit03d14c36af98dd2191c2e35b5ed55ff93b59d345 (patch)
tree80ce9c2dac706da03271214a645b0c04e10111cb /include/linux/amba
parentaf29897f1046d7c1ab86b57506fbfdcfba569de8 (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.h18
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
113struct clcd_regs { 119struct 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) {