rk3036/rk3128 tve: support uboot logo display.
authorZheng Yang <zhengyang@rock-chips.com>
Thu, 16 Oct 2014 09:36:03 +0000 (17:36 +0800)
committerZheng Yang <zhengyang@rock-chips.com>
Thu, 16 Oct 2014 09:36:03 +0000 (17:36 +0800)
drivers/video/rockchip/rk_fb.c
drivers/video/rockchip/tve/rk3036/rk3036_tve.c

index ac655f9cb046f8572a6f029efad8e2317b3c8f33..b8cdcdfb2e4e2891183f25686bc66682ad0699fb 100755 (executable)
@@ -3363,10 +3363,10 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id)
        if (screen->type == SCREEN_HDMI)
                printk("hdmi %s lcdc%d\n", enable ? "connect to" : "remove from",
                                dev_drv->id);
-        else if (screen->type == SCREEN_TVOUT)
+        else if (screen->type == SCREEN_TVOUT ||
+                    screen->type == SCREEN_TVOUT_TEST )
                printk("cvbs %s lcdc%d\n", enable ? "connect to" : "remove from",
                                dev_drv->id);
-
        if (enable == 2 /*&& dev_drv->enable*/)
                return 0;
 
index e73fe0213e04066bffe4f3c553c9f2bb4db9fdf3..d28559ad1189d28be32cab5e6dc006099227f361 100644 (file)
@@ -31,12 +31,15 @@ static const struct fb_videomode rk3036_cvbs_mode[] = {
 
 static struct rk3036_tve *rk3036_tve;
 
+static int cvbsformat = -1;
+
 #define tve_writel(offset, v)  writel_relaxed(v, rk3036_tve->regbase + offset)
 #define tve_readl(offset)      readl_relaxed(rk3036_tve->regbase + offset)
 
 #ifdef DEBUG
 #define TVEDBG(format, ...) \
-               dev_info(rk3036_tve->dev, "RK3036 TVE: " format "\n", ## __VA_ARGS__)
+               dev_info(rk3036_tve->dev,\
+                "RK3036 TVE: " format "\n", ## __VA_ARGS__)
 #else
 #define TVEDBG(format, ...)
 #endif
@@ -72,9 +75,10 @@ static void dac_enable(bool enable)
 static void tve_set_mode(int mode)
 {
        TVEDBG("%s mode %d\n", __func__, mode);
-
+       if (cvbsformat >= 0)
+               return;
        tve_writel(TV_RESET, v_RESET(1));
-       udelay(100);
+       udelay_range(100, 100);
        tve_writel(TV_RESET, v_RESET(0));
        if (rk3036_tve->inputformat == INPUT_FORMAT_RGB)
                tve_writel(TV_CTRL, v_CVBS_MODE(mode) | v_CLK_UPSTREAM_EN(2) |
@@ -124,12 +128,16 @@ static void tve_set_mode(int mode)
                tve_writel(TV_ACT_ST,   0x001500F6);
                tve_writel(TV_ACT_TIMING, 0x0694011D | (1 << 12) | (2 << 28));
                if (rk3036_tve->soctype == SOC_RK312X) {
-                       tve_writel(TV_ADJ_TIMING, (0xa << 28) | 0x06c00800 | 0x80);
-                       udelay(100);
-                       tve_writel(TV_ADJ_TIMING, (0xa << 28) | 0x06c00800 | 0x80);
-                       tve_writel(TV_ACT_TIMING, 0x0694011D | (1 << 12) | (2 << 28));
+                       tve_writel(TV_ADJ_TIMING, (0xa << 28) |
+                                       0x06c00800 | 0x80);
+                       udelay_range(100, 100);
+                       tve_writel(TV_ADJ_TIMING, (0xa << 28) |
+                                       0x06c00800 | 0x80);
+                       tve_writel(TV_ACT_TIMING, 0x0694011D |
+                                       (1 << 12) | (2 << 28));
                } else {
-                       tve_writel(TV_ADJ_TIMING, (0xa << 28) | 0x06c00800 | 0x80);
+                       tve_writel(TV_ADJ_TIMING, (0xa << 28) |
+                                       0x06c00800 | 0x80);
                }
        }
 }
@@ -175,7 +183,6 @@ static int tve_switch_fb(const struct fb_videomode *modedb, int enable)
        /* Operation function*/
        screen->init = NULL;
        screen->standby = NULL;
-
        rk_fb_switch_screen(screen, enable, 0);
 
        if (enable) {
@@ -197,6 +204,7 @@ static int cvbs_set_enable(struct rk_display_device *device, int enable)
 
                if (enable == 0) {
                        dac_enable(false);
+                       cvbsformat = -1;
                        tve_switch_fb(rk3036_tve->mode, 0);
                } else if (enable == 1) {
                        tve_switch_fb(rk3036_tve->mode, 1);
@@ -331,13 +339,28 @@ static const struct of_device_id rk3036_tve_dt_ids[] = {
 };
 #endif
 
+static int __init bootloader_tve_setup(char *str)
+{
+       static int ret;
+
+       if (str) {
+               pr_info("cvbs init tve.format is %s\n", str);
+               ret = sscanf(str, "%d", &cvbsformat);
+       }
+
+       return 0;
+}
+
+early_param("tve.format", bootloader_tve_setup);
+
+
 static int rk3036_tve_probe(struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
        struct resource *res;
        const struct of_device_id *match;
        int i;
-       int val = 0 ;
+       int val = 0;
 
        match = of_match_node(rk3036_tve_dt_ids, np);
        if (!match)
@@ -382,7 +405,14 @@ static int rk3036_tve_probe(struct platform_device *pdev)
        INIT_LIST_HEAD(&(rk3036_tve->modelist));
        for (i = 0; i < ARRAY_SIZE(rk3036_cvbs_mode); i++)
                fb_add_videomode(&rk3036_cvbs_mode[i], &(rk3036_tve->modelist));
-       rk3036_tve->mode = (struct fb_videomode *)&rk3036_cvbs_mode[1];
+        if (cvbsformat >= 0) {
+               rk3036_tve->mode =
+                       (struct fb_videomode *)&rk3036_cvbs_mode[cvbsformat];
+               rk3036_tve->enable = 1;
+               tve_switch_fb(rk3036_tve->mode, 1);
+       } else {
+               rk3036_tve->mode = (struct fb_videomode *)&rk3036_cvbs_mode[1];
+       }
        rk3036_tve->ddev =
                rk_display_device_register(&display_cvbs, &pdev->dev, NULL);
        rk_display_device_enable(rk3036_tve->ddev);