mend rk1000 cvbs display when open uboot logo
authorRK_ywj <ywj@rock-chips.com>
Thu, 7 May 2015 09:28:12 +0000 (17:28 +0800)
committerRK_ywj <ywj@rock-chips.com>
Tue, 12 May 2015 06:06:05 +0000 (14:06 +0800)
drivers/mfd/rk1000-core.c
drivers/video/rockchip/tve/rk1000/rk1000_tve.c
drivers/video/rockchip/tve/rk1000/rk1000_tve_cvbs.c

index 68c6f86f7f4a6fd9953df3f4dbb2eb9dd3574aed..474e944be271c6a4b3f211a79fdf962161579703 100755 (executable)
@@ -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:
index a8247e783da72005c495510e42ec01539f736141..6b178b6e16c26dfecd3c06806dbd6a36af8ebaa4 100755 (executable)
@@ -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);
index 79591a487717a5966500150e024a3a8227d94f27..e0680481393a8da8844c01a24b74a55bd5eb1407 100755 (executable)
@@ -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;
 }