rk transmitter: dp anx6345、dp rk32、lvds rk32 implement rk_fb_trsm_ops interface
authoryxj <yxj@rock-chips.com>
Thu, 13 Mar 2014 03:21:13 +0000 (11:21 +0800)
committeryxj <yxj@rock-chips.com>
Thu, 13 Mar 2014 03:27:53 +0000 (11:27 +0800)
drivers/video/rockchip/transmitter/anx6345.h
drivers/video/rockchip/transmitter/dp_anx6345.c
drivers/video/rockchip/transmitter/rk32_dp.c
drivers/video/rockchip/transmitter/rk32_lvds.c

index 11f3599ce36d51b40b92879e211c5e0291e530b1..dbf6c5d55901a4f3851e35802d31eeb54f9e0c43 100644 (file)
@@ -670,6 +670,7 @@ struct  anx6345_platform_data {
        int          dvdd18_en_val;
        unsigned int edp_rst_pin;
        int (*power_ctl)(struct anx6345_platform_data *pdata);
+       bool pwron;
 };
 
 struct edp_anx6345 {
index ea148e288a38e4b60441953d9213182981593896..1dbd77f84935a56325e3ed721c67b1762dd2643b 100644 (file)
@@ -21,6 +21,7 @@
 #endif
 
 
+static struct edp_anx6345 *edp;
 //#define BIST_MODE 0
 static int i2c_master_reg8_send(const struct i2c_client *client,
                const char reg, const char *buf, int count, int scl_rate)
@@ -1201,24 +1202,46 @@ static int anx6345_init(struct i2c_client *client)
 }
 
 
-#ifdef CONFIG_HAS_EARLYSUSPEND
-static void anx6345_early_suspend(struct early_suspend *h)
+static int  anx6345_disable(void)
 {
-       struct edp_anx6345 *anx6345 = container_of(h, struct edp_anx6345, early_suspend);
+       struct edp_anx6345 *anx6345 = edp;
+
+       if (!anx6345->pdata->pwron)
+               return 0;
        gpio_set_value(anx6345->pdata->dvdd33_en_pin,!anx6345->pdata->dvdd33_en_val);
        gpio_set_value(anx6345->pdata->dvdd18_en_pin,!anx6345->pdata->dvdd18_en_val);
+       anx6345->pdata->pwron = false;
+
+       return 0;
+       
 }
+       
 
-static void anx6345_late_resume(struct early_suspend *h)
+static int anx6345_enable(void)
 {
-       struct edp_anx6345 *anx6345 = container_of(h, struct edp_anx6345, early_suspend);
-       gpio_set_value(anx6345->pdata->dvdd33_en_pin,anx6345->pdata->dvdd33_en_val);
-       msleep(5);
-       gpio_set_value(anx6345->pdata->dvdd18_en_pin,anx6345->pdata->dvdd18_en_val);
-       gpio_set_value(anx6345->pdata->edp_rst_pin,0);
-       msleep(50);
-       gpio_set_value(anx6345->pdata->edp_rst_pin,1);
+       struct edp_anx6345 *anx6345 = edp;
+
+       if (!anx6345->pdata->pwron) {
+               gpio_set_value(anx6345->pdata->dvdd33_en_pin,anx6345->pdata->dvdd33_en_val);
+               msleep(5);
+               gpio_set_value(anx6345->pdata->dvdd18_en_pin,anx6345->pdata->dvdd18_en_val);
+               gpio_set_value(anx6345->pdata->edp_rst_pin,0);
+               msleep(50);
+               gpio_set_value(anx6345->pdata->edp_rst_pin,1);
+               anx6345->pdata->pwron = true;
+       }
        anx6345->edp_anx_init(anx6345->client);
+       return 0;
+}
+#ifdef CONFIG_HAS_EARLYSUSPEND
+static void anx6345_early_suspend(struct early_suspend *h)
+{
+       anx6345_disable();
+}
+
+static void anx6345_late_resume(struct early_suspend *h)
+{
+       anx6345_enable();
 }
 #endif                         
 
@@ -1256,10 +1279,17 @@ static int anx6345_power_ctl(struct anx6345_platform_data  *pdata)
               msleep(50);
               gpio_direction_output(pdata->edp_rst_pin, 1);
        }
+       pdata->pwron = true;
        return 0;
 
 }
 
+
+struct rk_fb_trsm_ops  trsm_edp_ops = {
+       .enable = anx6345_enable,
+       .disable = anx6345_disable,
+       
+};
 static void anx6345_parse_dt(struct edp_anx6345 *anx6345)
 {
        struct device_node *np = anx6345->client->dev.of_node;
@@ -1312,14 +1342,17 @@ static int anx6345_i2c_probe(struct i2c_client *client,const struct i2c_device_i
        }
        i2c_set_clientdata(client,anx6345);
        rk_fb_get_prmry_screen(&anx6345->screen);
+       if (anx6345->screen.type != SCREEN_EDP){
+               dev_err(&client->dev, "screen is not edp!\n");
+               return -EINVAL;
+       }
        if(anx6345->pdata->power_ctl)
                anx6345->pdata->power_ctl(anx6345->pdata);
 
 #if defined(CONFIG_DEBUG_FS)
        anx6345->debugfs_dir = debugfs_create_dir("edp", NULL);
-       if (IS_ERR(anx6345->debugfs_dir))
-       {
-               printk(KERN_ERR "failed to create debugfs dir for edp!\n");
+       if (IS_ERR(anx6345->debugfs_dir)) {
+               dev_err(&client->dev, "failed to create debugfs dir for edp!\n");
        }
        else
                debugfs_create_file("edp-reg", S_IRUSR,anx6345->debugfs_dir,anx6345,&edp_reg_fops);
@@ -1336,8 +1369,9 @@ static int anx6345_i2c_probe(struct i2c_client *client,const struct i2c_device_i
                anx6345->edp_anx_init = anx980x_init;
        else
                anx6345->edp_anx_init = anx6345_init;
+       edp = anx6345;
 
-       anx6345->edp_anx_init(client);
+       rk_fb_trsm_ops_register(&trsm_edp_ops, SCREEN_EDP);
 
        dev_info(&client->dev, "edp anx%x probe ok \n", get_dp_chip_id(client));
        
@@ -1385,6 +1419,6 @@ static void __exit anx6345_module_exit(void)
        i2c_del_driver(&anx6345_i2c_driver);
 }
 
-fs_initcall_sync(anx6345_module_init);
+subsys_initcall_sync(anx6345_module_init);
 module_exit(anx6345_module_exit);
 
index c6c08ed9e275665e8608ab121e369ecdb21c47be..5ea21b658f8b6213a5bfd3accfbcacd21cd6df98 100644 (file)
@@ -33,6 +33,7 @@
 
 /*#define EDP_BIST_MODE*/
 
+static struct rk32_edp *rk32_edp;
 static int rk32_edp_init_edp(struct rk32_edp *edp)
 {
        struct rk_screen *screen = &edp->screen;
@@ -1061,11 +1062,11 @@ static irqreturn_t rk32_edp_isr(int irq, void *arg)
        return IRQ_HANDLED;
 }
 
-static int rk32_edp_enable(struct rk32_edp *edp)
+static int rk32_edp_enable(void)
 {
        int ret = 0;
        int retry = 0;
-
+       struct rk32_edp *edp = rk32_edp;
        if (edp->enabled)
                goto out;
 
@@ -1133,10 +1134,12 @@ out:
        return ret;
 }
        
-static void rk32_edp_disable(struct rk32_edp *edp)
+static int  rk32_edp_disable(void )
 {
+       struct rk32_edp *edp = rk32_edp;
+
        if (!edp->enabled)
-               return ;
+               return 0;
 
        edp->enabled = 0;
 
@@ -1145,15 +1148,14 @@ static void rk32_edp_disable(struct rk32_edp *edp)
 
        clk_disable(edp->clk_24m);
        clk_disable(edp->clk_edp);
+       return 0;
 }
 
 
-
-static void rk32_edp_init(struct rk32_edp *edp)
-{
-
-       rk32_edp_enable(edp);
-}
+static struct rk_fb_trsm_ops trsm_edp_ops = {
+       .enable = rk32_edp_enable,
+       .disable = rk32_edp_disable,
+};
 static int rk32_edp_probe(struct platform_device *pdev)
 {
        struct rk32_edp *edp;
@@ -1209,8 +1211,8 @@ static int rk32_edp_probe(struct platform_device *pdev)
                dev_err(&pdev->dev, "cannot claim IRQ %d\n", edp->irq);
                return ret;
        }
-       
-       rk32_edp_init(edp);
+       rk32_edp = edp;
+       rk_fb_trsm_ops_register(&trsm_edp_ops, SCREEN_EDP);
        dev_info(&pdev->dev, "rk32 edp driver probe success\n");
 
        return 0;
@@ -1252,5 +1254,5 @@ static void __exit rk32_edp_module_exit(void)
 
 }
 
-fs_initcall(rk32_edp_module_init);
+subsys_initcall_sync(rk32_edp_module_init);
 module_exit(rk32_edp_module_exit);
index c77e22402d9a659717fc817869e901e2de38ad22..285bf6c46980aff288c6e4dc900af8b1d479ea37 100644 (file)
 #include "rk32_lvds.h"
 
 
-static int rk32_lvds_disable(struct rk32_lvds *lvds)
+static struct rk32_lvds *rk32_lvds;
+static int rk32_lvds_disable(void)
 {
+       struct rk32_lvds *lvds = rk32_lvds;
        writel_relaxed(0x80008000, RK_GRF_VIRT + RK3288_GRF_SOC_CON7);
        writel_relaxed(0x00, lvds->regs + LVDS_CFG_REG_21); /*disable tx*/
        writel_relaxed(0xff, lvds->regs + LVDS_CFG_REG_c); /*disable pll*/
        return 0;
 }
 
-static int rk32_lvds_en(struct rk32_lvds *lvds)
+static int rk32_lvds_en(void)
 {
+       struct rk32_lvds *lvds = rk32_lvds;
        struct rk_screen *screen = &lvds->screen;
        u32 h_bp = screen->mode.hsync_len + screen->mode.left_margin;
        u32 val ;
@@ -77,16 +80,11 @@ static int rk32_lvds_en(struct rk32_lvds *lvds)
 }
 
 
-static int rk32_lvds_init(struct rk32_lvds *lvds, bool enable)
-{
-       
-       if (enable) 
-               rk32_lvds_en(lvds);
-       else
-               rk32_lvds_disable(lvds);
 
-       return 0;
-}
+static struct rk_fb_trsm_ops trsm_lvds_ops = {
+       .enable = rk32_lvds_en,
+       .disable = rk32_lvds_disable,
+};
 
 static int rk32_lvds_probe(struct platform_device *pdev)
 {
@@ -120,7 +118,9 @@ static int rk32_lvds_probe(struct platform_device *pdev)
                dev_err(&pdev->dev, "ioremap reg failed\n");
                return PTR_ERR(lvds->regs);
        }
-       rk32_lvds_init(lvds, true);
+
+       rk32_lvds = lvds;
+       rk_fb_trsm_ops_register(&trsm_lvds_ops,SCREEN_LVDS);
        dev_info(&pdev->dev, "rk32 lvds driver probe success\n");
 
        return 0;