From 073313449cc040ceb840b82f8b30b19f9a96f731 Mon Sep 17 00:00:00 2001 From: RK_ywj Date: Thu, 7 May 2015 17:28:12 +0800 Subject: [PATCH] mend rk1000 cvbs display when open uboot logo --- drivers/mfd/rk1000-core.c | 124 +++++++++++++----- .../video/rockchip/tve/rk1000/rk1000_tve.c | 26 +++- .../rockchip/tve/rk1000/rk1000_tve_cvbs.c | 27 ++-- 3 files changed, 128 insertions(+), 49 deletions(-) diff --git a/drivers/mfd/rk1000-core.c b/drivers/mfd/rk1000-core.c index 68c6f86f7f4a..474e944be271 100755 --- a/drivers/mfd/rk1000-core.c +++ b/drivers/mfd/rk1000-core.c @@ -37,6 +37,7 @@ struct rk1000 { }; static struct rk1000 *rk1000; +int cvbsmode = -1; void rk1000_reset_ctrl(int enable) { @@ -105,6 +106,46 @@ int rk1000_i2c_recv(const u8 addr, const u8 reg, const char *buf) return (ret == 2) ? 0 : -1; } +static ssize_t rk1000_show(struct kobject *kobj, struct kobj_attribute *attr,char *buf) +{ + int ret=-1; + int i=0; + unsigned char tv_encoder_regs[] = {0x00, 0x00, 0x00, 0x03, 0x00, 0x00}; + unsigned char tv_encoder_control_regs[] = {0x43, 0x01}; + + + for (i = 0; i < sizeof(tv_encoder_regs); i++) { + ret = rk1000_i2c_recv(I2C_ADDR_TVE, i, buf); + printk("---%x--\n",buf[0]); + if (ret < 0) { + pr_err("rk1000_tv_write_block err!\n"); + return ret; + } + } + + for (i = 0; i < sizeof(tv_encoder_control_regs); i++) { + ret = rk1000_i2c_recv(I2C_ADDR_CTRL,i + 3,buf); + printk("cntrl---%x--\n",buf[0]); + if (ret < 0) { + pr_err("rk1000_control_write_block err!\n"); + return ret; + } + } + return 0; +} + +static DEVICE_ATTR(rkcontrl, 0666, rk1000_show, NULL); + + +static int __init bootloader_cvbs_setup(char *str){ + static int ret; + if (str) { + printk("cvbs init tve.format is %s\n", str); + ret = sscanf(str, "%d", &cvbsmode); + } + return 0; +} +early_param("tve.format", bootloader_cvbs_setup); #ifdef CONFIG_PM static int rk1000_control_suspend(struct device *dev) @@ -153,55 +194,62 @@ static int rk1000_probe(struct i2c_client *client, enum of_gpio_flags flags; int ret; + DBG("[%s] start\n", __func__); rk1000 = kmalloc(sizeof(*rk1000), GFP_KERNEL); if (!rk1000) { dev_err(&client->dev, ">> rk1000 core inf kmalloc fail!"); return -ENOMEM; } + memset(rk1000, 0, sizeof(struct rk1000)); rk1000->client = client; rk1000->dev = &client->dev; rk1000_np = rk1000->dev->of_node; - /********Get reset pin***********/ - rk1000->io_reset.gpio = of_get_named_gpio_flags(rk1000_np, - "gpio-reset", - 0, &flags); - if (!gpio_is_valid(rk1000->io_reset.gpio)) { - DBG("invalid rk1000->io_reset.gpio: %d\n", - rk1000->io_reset.gpio); - ret = -1; - goto err; - } - ret = gpio_request(rk1000->io_reset.gpio, "rk1000-reset-io"); - if (ret != 0) { - DBG("gpio_request rk1000->io_reset.gpio invalid: %d\n", - rk1000->io_reset.gpio); - goto err; - } - rk1000->io_reset.active = !(flags & OF_GPIO_ACTIVE_LOW); - gpio_direction_output(rk1000->io_reset.gpio, - !(rk1000->io_reset.active)); - msleep(20); - /********Get power pin***********/ - rk1000->io_power.gpio = of_get_named_gpio_flags(rk1000_np, - "gpio-power", - 0, &flags); - if (gpio_is_valid(rk1000->io_power.gpio)) { - ret = gpio_request(rk1000->io_power.gpio, "rk1000-power-io"); + + if(cvbsmode<0){ + /********Get reset pin***********/ + rk1000->io_reset.gpio = of_get_named_gpio_flags(rk1000_np, + "gpio-reset", + 0, &flags); + if (!gpio_is_valid(rk1000->io_reset.gpio)) { + DBG("invalid rk1000->io_reset.gpio: %d\n", + rk1000->io_reset.gpio); + ret = -1; + goto err; + } + ret = gpio_request(rk1000->io_reset.gpio, "rk1000-reset-io"); if (ret != 0) { - DBG("gpio_request rk1000->io_power.gpio invalid: %d\n", - rk1000->io_power.gpio); + DBG("gpio_request rk1000->io_reset.gpio invalid: %d\n", + rk1000->io_reset.gpio); goto err; } - rk1000->io_power.active = !(flags & OF_GPIO_ACTIVE_LOW); - gpio_direction_output(rk1000->io_power.gpio, - rk1000->io_power.active); + rk1000->io_reset.active = !(flags & OF_GPIO_ACTIVE_LOW); + + + gpio_direction_output(rk1000->io_reset.gpio, + !(rk1000->io_reset.active)); + msleep(20); + /********Get power pin***********/ + rk1000->io_power.gpio = of_get_named_gpio_flags(rk1000_np, + "gpio-power", + 0, &flags); + if (gpio_is_valid(rk1000->io_power.gpio)) { + ret = gpio_request(rk1000->io_power.gpio, "rk1000-power-io"); + if (ret != 0) { + DBG("gpio_request rk1000->io_power.gpio invalid: %d\n", + rk1000->io_power.gpio); + goto err; + } + rk1000->io_power.active = !(flags & OF_GPIO_ACTIVE_LOW); + gpio_direction_output(rk1000->io_power.gpio, + rk1000->io_power.active); + } + /********rk1000 reset***********/ + gpio_set_value(rk1000->io_reset.gpio, rk1000->io_reset.active); + msleep(100); + gpio_set_value(rk1000->io_reset.gpio, !(rk1000->io_reset.active)); } - /********rk1000 reset***********/ - gpio_set_value(rk1000->io_reset.gpio, rk1000->io_reset.active); - msleep(100); - gpio_set_value(rk1000->io_reset.gpio, !(rk1000->io_reset.active)); rk1000_i2c_send(I2C_ADDR_CTRL, CTRL_ADC, 0x88); #ifdef CONFIG_SND_SOC_RK1000 rk1000_i2c_send(I2C_ADDR_CTRL, CTRL_CODEC, 0x00); @@ -209,7 +257,11 @@ static int rk1000_probe(struct i2c_client *client, rk1000_i2c_send(I2C_ADDR_CTRL, CTRL_CODEC, 0x0d); #endif rk1000_i2c_send(I2C_ADDR_CTRL, CTRL_I2C, 0x22); - rk1000_i2c_send(I2C_ADDR_CTRL, CTRL_TVE, 0x00); + + if(cvbsmode<0){ + rk1000_i2c_send(I2C_ADDR_CTRL, CTRL_TVE, 0x00); + } + device_create_file(&client->dev, &dev_attr_rkcontrl); DBG("rk1000 probe ok\n"); return 0; err: diff --git a/drivers/video/rockchip/tve/rk1000/rk1000_tve.c b/drivers/video/rockchip/tve/rk1000/rk1000_tve.c index a8247e783da7..6b178b6e16c2 100755 --- a/drivers/video/rockchip/tve/rk1000/rk1000_tve.c +++ b/drivers/video/rockchip/tve/rk1000/rk1000_tve.c @@ -27,7 +27,7 @@ #include "rk1000_tve.h" struct rk1000_tve rk1000_tve; - +int cvbsformat = -1; int rk1000_tv_write_block(u8 reg, u8 *buf, u8 len) { @@ -54,6 +54,16 @@ int rk1000_control_write_block(u8 reg, u8 *buf, u8 len) return ret; } +static int __init bootloader_rk1000_setup(char *str){ + static int ret; + if (str) { + printk("cvbs init tve.format is %s\n", str); + ret = sscanf(str, "%d", &cvbsformat); + } + return 0; +} +early_param("tve.format", bootloader_rk1000_setup); + int rk1000_switch_fb(const struct fb_videomode *modedb, int tv_mode) { struct rk_screen *screen; @@ -79,7 +89,7 @@ int rk1000_switch_fb(const struct fb_videomode *modedb, int tv_mode) else screen->pin_vsync = 0; screen->pin_den = 0; - screen->pin_dclk = 1; + screen->pin_dclk = 0; /* Swap rule */ screen->swap_rb = 0; screen->swap_rg = 0; @@ -191,7 +201,10 @@ static int rk1000_tve_initial(void) screen.mode.vsync_len = 6; rk_fb_switch_screen(&screen, 2 , rk1000_tve.video_source); /* Power down RK1000 output DAC. */ - return rk1000_i2c_send(I2C_ADDR_TVE, 0x03, 0x07); + if(cvbsformat <0) + return rk1000_i2c_send(I2C_ADDR_TVE, 0x03, 0x07); + else + return 0; } @@ -297,7 +310,12 @@ static int rk1000_tve_probe(struct i2c_client *client, pr_err("video src is lcdc%d, prop is %d\n", rk1000_tve.video_source, rk1000_tve.property); #endif - rk1000_tve.mode = RK1000_TVOUT_DEAULT; + printk("-------|%d|-------\n",cvbsformat); + if (cvbsformat >= 0) + rk1000_tve.mode = cvbsformat + 1; + else + rk1000_tve.mode = RK1000_TVOUT_DEAULT; + rc = rk1000_tve_initial(); if (rc) { dev_err(&client->dev, "rk1000 tvencoder probe error %d\n", rc); diff --git a/drivers/video/rockchip/tve/rk1000/rk1000_tve_cvbs.c b/drivers/video/rockchip/tve/rk1000/rk1000_tve_cvbs.c index 79591a487717..e0680481393a 100755 --- a/drivers/video/rockchip/tve/rk1000/rk1000_tve_cvbs.c +++ b/drivers/video/rockchip/tve/rk1000/rk1000_tve_cvbs.c @@ -11,6 +11,7 @@ static const struct fb_videomode rk1000_cvbs_mode[] = { }; static struct rk1000_monspecs cvbs_monspecs; +extern int cvbsformat; int rk1000_tv_ntsc_init(void) { @@ -18,7 +19,7 @@ int rk1000_tv_ntsc_init(void) unsigned char tv_encoder_control_regs[] = {0x43, 0x01}; int i; int ret; - + printk("---------%s----%d-----\n",__FUNCTION__,__LINE__); for (i = 0; i < sizeof(tv_encoder_regs); i++) { ret = rk1000_tv_write_block(i, tv_encoder_regs + i, 1); if (ret < 0) { @@ -46,7 +47,7 @@ int rk1000_tv_pal_init(void) unsigned char tv_encoder_control_regs[] = {0x41, 0x01}; int i; int ret; - + for (i = 0; i < sizeof(tv_encoder_regs); i++) { ret = rk1000_tv_write_block(i, tv_encoder_regs+i, 1); if (ret < 0) { @@ -79,13 +80,20 @@ static int rk1000_cvbs_set_enable(struct rk_display_device *device, int enable) cvbs_monspecs.enable = 0; rk1000_tv_standby(RK1000_TVOUT_CVBS); } else if (enable == 1) { - val = 0x07; - rk1000_tv_write_block(0x03, &val, 1); - rk1000_switch_fb(cvbs_monspecs.mode, + + if(cvbsformat>=0){ + rk1000_switch_fb(cvbs_monspecs.mode, cvbs_monspecs.mode_set); - msleep(600); - val = 0x03; - rk1000_tv_write_block(0x03, &val, 1); + cvbsformat=-1; + }else{ + val = 0x07; + rk1000_tv_write_block(0x03, &val, 1); + rk1000_switch_fb(cvbs_monspecs.mode, + cvbs_monspecs.mode_set); + msleep(600); + val = 0x03; + rk1000_tv_write_block(0x03, &val, 1); + } cvbs_monspecs.enable = 1; } } @@ -184,7 +192,8 @@ int rk1000_register_display_cvbs(struct device *parent) cvbs_monspecs.ddev = rk_display_device_register(&display_rk1000_cvbs, parent, NULL); rk1000_tve.cvbs = &cvbs_monspecs; - if (rk1000_tve.mode < TVOUT_YPBPR_720X480P_60) + if (rk1000_tve.mode < TVOUT_YPBPR_720X480P_60){ rk_display_device_enable(cvbs_monspecs.ddev); + } return 0; } -- 2.34.1