]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/video/mxsfb.c
WiP: tx28-dt-devel
[karo-tx-linux.git] / drivers / video / mxsfb.c
index 49619b4415000efc1ef87756d09667017a682244..1d9b6ee4d8db421f0198ef0229a7b0fd5e7b9e39 100644 (file)
@@ -50,6 +50,9 @@
 #include <linux/pinctrl/consumer.h>
 #include <linux/mxsfb.h>
 
+static char *mode;
+module_param(mode, charp, S_IRUGO);
+
 #define REG_SET        4
 #define REG_CLR        8
 
 #define VDCTRL0_ENABLE_PRESENT         (1 << 28)
 #define VDCTRL0_VSYNC_ACT_HIGH         (1 << 27)
 #define VDCTRL0_HSYNC_ACT_HIGH         (1 << 26)
-#define VDCTRL0_DOTCLK_ACT_FAILING     (1 << 25)
+#define VDCTRL0_DOTCLK_ACT_FALLING     (1 << 25)
 #define VDCTRL0_ENABLE_ACT_HIGH                (1 << 24)
 #define VDCTRL0_VSYNC_PERIOD_UNIT      (1 << 21)
 #define VDCTRL0_VSYNC_PULSE_WIDTH_UNIT (1 << 20)
@@ -369,7 +372,8 @@ static void mxsfb_disable_controller(struct fb_info *fb_info)
                loop--;
        }
 
-       writel(VDCTRL4_SYNC_SIGNALS_ON, host->base + LCDC_VDCTRL4 + REG_CLR);
+       reg = readl(host->base + LCDC_VDCTRL4);
+       writel(reg & ~VDCTRL4_SYNC_SIGNALS_ON, host->base + LCDC_VDCTRL4);
 
        clk_disable_unprepare(host->clk);
 
@@ -457,8 +461,8 @@ static int mxsfb_set_par(struct fb_info *fb_info)
                vdctrl0 |= VDCTRL0_VSYNC_ACT_HIGH;
        if (fb_info->var.sync & FB_SYNC_DATA_ENABLE_HIGH_ACT)
                vdctrl0 |= VDCTRL0_ENABLE_ACT_HIGH;
-       if (fb_info->var.sync & FB_SYNC_DOTCLK_FAILING_ACT)
-               vdctrl0 |= VDCTRL0_DOTCLK_ACT_FAILING;
+       if (fb_info->var.sync & FB_SYNC_DOTCLK_FALLING_ACT)
+               vdctrl0 |= VDCTRL0_DOTCLK_ACT_FALLING;
 
        writel(vdctrl0, host->base + LCDC_VDCTRL0);
 
@@ -780,7 +784,7 @@ static int __devinit mxsfb_probe(struct platform_device *pdev)
        struct resource *res;
        struct mxsfb_info *host;
        struct fb_info *fb_info;
-       struct fb_modelist *modelist;
+       struct fb_modelist *modelist = NULL;
        struct pinctrl *pinctrl;
        int panel_enable;
        enum of_gpio_flags flags;
@@ -864,11 +868,21 @@ static int __devinit mxsfb_probe(struct platform_device *pdev)
        if (ret != 0)
                goto error_init_fb;
 
-       for (i = 0; i < pdata->mode_count; i++)
+       for (i = 0; i < pdata->mode_count; i++) {
                fb_add_videomode(&pdata->mode_list[i], &fb_info->modelist);
+               if (mode && strlen(mode) > 0 &&
+                       strcmp(mode, pdata->mode_list[i].name) == 0) {
+                       modelist = list_first_entry(&fb_info->modelist,
+                                               struct fb_modelist, list);
+               }
+       }
+       if (modelist == NULL)
+               modelist = list_first_entry(&fb_info->modelist,
+                                       struct fb_modelist, list);
+
+       if (modelist)
+               printk("Using video mode: '%s'\n", modelist->mode.name);
 
-       modelist = list_first_entry(&fb_info->modelist,
-                       struct fb_modelist, list);
        fb_videomode_to_var(&fb_info->var, &modelist->mode);
 
        /* init the color fields */