]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
video: fbdev: imxfb: support AUS mode
authorMartin Kaiser <martin@kaiser.cx>
Fri, 21 Apr 2017 14:47:11 +0000 (16:47 +0200)
committerBartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Fri, 21 Apr 2017 14:47:11 +0000 (16:47 +0200)
Some displays require setting AUS mode in the LDCD AUS Mode Control
Register to work with the imxfb driver. Like the value of the Panel
Configuration Register, the AUS mode setting depends on the display
mode.

Allow setting AUS mode from the device tree by adding a boolean
property. Make this property optional to keep the DT ABI stable.
AUS mode can be set only on imx21 and compatible chipsets.

Signed-off-by: Martin Kaiser <martin@kaiser.cx>
Cc: Sascha Hauer <kernel@pengutronix.de>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
drivers/video/fbdev/imxfb.c
include/linux/platform_data/video-imxfb.h

index 1b0faadb30801921d74231b6fc788fac5b67d9cd..c166e0725be5dab13e9a685a93ea7ea9c23a3351 100644 (file)
 
 #define IMXFB_LSCR1_DEFAULT 0x00120300
 
+#define LCDC_LAUSCR    0x80
+#define LAUSCR_AUS_MODE        (1<<31)
+
 /* Used fb-mode. Can be set on kernel command line, therefore file-static. */
 static const char *fb_mode;
 
@@ -158,6 +161,7 @@ struct imxfb_info {
        dma_addr_t              dbar2;
 
        u_int                   pcr;
+       u_int                   lauscr;
        u_int                   pwmr;
        u_int                   lscr1;
        u_int                   dmacr;
@@ -422,6 +426,11 @@ static int imxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
        pcr |= imxfb_mode->pcr & ~(0x3f | (7 << 25));
 
        fbi->pcr = pcr;
+       /*
+        * The LCDC AUS Mode Control Register does not exist on imx1.
+        */
+       if (!is_imx1_fb(fbi) && imxfb_mode->aus_mode)
+               fbi->lauscr = LAUSCR_AUS_MODE;
 
        /*
         * Copy the RGB parameters for this display
@@ -638,6 +647,9 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf
        if (fbi->dmacr)
                writel(fbi->dmacr, fbi->regs + LCDC_DMACR);
 
+       if (fbi->lauscr)
+               writel(fbi->lauscr, fbi->regs + LCDC_LAUSCR);
+
        return 0;
 }
 
@@ -734,6 +746,11 @@ static int imxfb_of_read_mode(struct device *dev, struct device_node *np,
        imxfb_mode->bpp = bpp;
        imxfb_mode->pcr = pcr;
 
+       /*
+        * fsl,aus-mode is optional
+        */
+       imxfb_mode->aus_mode = of_property_read_bool(np, "fsl,aus-mode");
+
        return 0;
 }
 
index a5c0a71ec9147692f6a4dc995b71375f977bb71c..cf9348b376ac50f99944c5bc0762afb3e0b65daf 100644 (file)
@@ -50,6 +50,7 @@
 struct imx_fb_videomode {
        struct fb_videomode mode;
        u32 pcr;
+       bool aus_mode;
        unsigned char   bpp;
 };