From: Zheng Yang Date: Thu, 16 Oct 2014 09:36:03 +0000 (+0800) Subject: rk3036/rk3128 tve: support uboot logo display. X-Git-Tag: firefly_0821_release~4574 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=07740a40aa018e89af5148268da742c929178ffe;p=firefly-linux-kernel-4.4.55.git rk3036/rk3128 tve: support uboot logo display. --- diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index ac655f9cb046..b8cdcdfb2e4e 100755 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -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; diff --git a/drivers/video/rockchip/tve/rk3036/rk3036_tve.c b/drivers/video/rockchip/tve/rk3036/rk3036_tve.c index e73fe0213e04..d28559ad1189 100644 --- a/drivers/video/rockchip/tve/rk3036/rk3036_tve.c +++ b/drivers/video/rockchip/tve/rk3036/rk3036_tve.c @@ -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);