camera: rockchip: camsys version 0.0x21.0xb
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / rk_camsys / camsys_mipicsi_phy.c
index 8094b7e654beedaf7c22656627e3fb286974ebf8..fb5d83baf6f2b0e4e7ae998925850f68c9db14ef 100755 (executable)
@@ -8,216 +8,279 @@ unsigned long rk_isp_base;
 
 static int camsys_mipiphy_clkin_cb(void *ptr, unsigned int on)
 {
-    camsys_mipiphy_clk_t *clk;
-    camsys_dev_t *camsys_dev = (camsys_dev_t*)ptr;
-    unsigned int i,phycnt;
-    
-    if (camsys_dev->mipiphy != NULL) {
-        phycnt = camsys_dev->mipiphy[0].phycnt;
-         
-        for (i=0; i<phycnt; i++) {
-            if (camsys_dev->mipiphy[i].clk != NULL) {
-                clk = (camsys_mipiphy_clk_t*)camsys_dev->mipiphy[i].clk;
-                if (on && !clk->on) {
-                    if (!IS_ERR_OR_NULL(clk->hclk))
-                        clk_prepare_enable(clk->hclk);  
-                    clk->on = on;
-                } else if (!on && clk->on) {
-                    if (!IS_ERR_OR_NULL(clk->hclk))
-                        clk_disable_unprepare(clk->hclk);                    
-                    clk->on = on;
-                }
-            }
-        }
-    }
-    if (on)
-        camsys_trace(1, "%s mipi phy clk in turn on",dev_name(camsys_dev->miscdev.this_device));
-    else 
-        camsys_trace(1, "%s mipi phy clk in turn off",dev_name(camsys_dev->miscdev.this_device));
-    
-    return 0;
+       camsys_mipiphy_clk_t *clk;
+       camsys_dev_t *camsys_dev = (camsys_dev_t *)ptr;
+       unsigned int i, phycnt;
+
+       if (camsys_dev->mipiphy != NULL) {
+               phycnt = camsys_dev->mipiphy[0].phycnt;
+
+               for (i = 0; i < phycnt; i++) {
+                       if (camsys_dev->mipiphy[i].clk != NULL) {
+                               clk = (camsys_mipiphy_clk_t *)
+                                       camsys_dev->mipiphy[i].clk;
+                               if (on && !clk->on) {
+                                       if (!IS_ERR_OR_NULL(clk->hclk))
+                                               clk_prepare_enable(clk->hclk);
+                                       clk->on = on;
+                               } else if (!on && clk->on) {
+                                       if (!IS_ERR_OR_NULL(clk->hclk))
+                                               clk_disable_unprepare
+                                               (clk->hclk);
+                                       clk->on = on;
+                               }
+                       }
+               }
+       }
+       if (on)
+               camsys_trace(2, "%s mipiphy clk turn on",
+               dev_name(camsys_dev->miscdev.this_device));
+       else
+               camsys_trace(2, "%s mipiphy clk turn off",
+               dev_name(camsys_dev->miscdev.this_device));
+
+       return 0;
 }
 
-static int camsys_mipiphy_ops (void * ptr, camsys_mipiphy_t *phy)
+static int camsys_mipiphy_ops(void *ptr, camsys_mipiphy_t *phy)
 {
-    camsys_dev_t *camsys_dev = (camsys_dev_t*)ptr;
-    camsys_mipiphy_soc_para_t para;
-    camsys_soc_priv_t *soc;
-    
-    if (camsys_dev->soc) {
-        soc = (camsys_soc_priv_t*)camsys_dev->soc;
-        if (soc->soc_cfg) { 
-            para.camsys_dev = camsys_dev;
-            para.phy = phy;
-            (soc->soc_cfg)(Mipi_Phy_Cfg,(void*)&para);
-        } else {
-            camsys_err("camsys_dev->soc->soc_cfg is NULL!");
-        }
-    } else {
-        camsys_err("camsys_dev->soc is NULL!");
-    }
-    
-    return 0;
+       camsys_dev_t *camsys_dev = (camsys_dev_t *)ptr;
+       camsys_mipiphy_soc_para_t para;
+       camsys_soc_priv_t *soc;
+
+       if (camsys_dev->soc) {
+               soc = (camsys_soc_priv_t *)camsys_dev->soc;
+               if (soc->soc_cfg) {
+                       para.camsys_dev = camsys_dev;
+                       para.phy = phy;
+                       (soc->soc_cfg)(camsys_dev, Mipi_Phy_Cfg, (void *)&para);
+               } else {
+                       camsys_err("camsys_dev->soc->soc_cfg is NULL!");
+               }
+       } else {
+               camsys_err("camsys_dev->soc is NULL!");
+       }
+
+       return 0;
 }
 
 static int camsys_mipiphy_remove_cb(struct platform_device *pdev)
 {
-    camsys_dev_t *camsys_dev = platform_get_drvdata(pdev);
-    camsys_mipiphy_clk_t *phyclk;
-    unsigned int i;
-    
-    if (camsys_dev->mipiphy != NULL) {
-        for (i=0; i<camsys_dev->mipiphy[0].phycnt; i++) {
-            if (camsys_dev->mipiphy[i].reg != NULL) {
-                if (camsys_dev->mipiphy[i].reg->vir_base != 0) {
-                    iounmap((void __iomem *)camsys_dev->mipiphy[i].reg->vir_base);
-                    camsys_dev->mipiphy[i].reg->vir_base = 0;
-                }
-                kfree(camsys_dev->mipiphy[i].reg);
-                camsys_dev->mipiphy[i].reg = NULL;
-            }
-
-            if (camsys_dev->mipiphy[i].clk != NULL) {
-                phyclk = (camsys_mipiphy_clk_t*)camsys_dev->mipiphy[i].clk;
-                devm_clk_put(&pdev->dev,phyclk->hclk);
-
-                kfree(camsys_dev->mipiphy[i].clk);
-                camsys_dev->mipiphy[i].clk = NULL;
-            }
-        }
-    }
-       if(CHIP_TYPE == 3368){
-               if(camsys_dev->csiphy_reg != NULL){
+       camsys_dev_t *camsys_dev = platform_get_drvdata(pdev);
+       camsys_mipiphy_clk_t *phyclk;
+       unsigned int i = 0;
+       unsigned long vir_base = camsys_dev->mipiphy[i].reg->vir_base;
+
+       if (camsys_dev->mipiphy != NULL) {
+               for (i = 0; i < camsys_dev->mipiphy[0].phycnt; i++) {
+                       if (camsys_dev->mipiphy[i].reg != NULL) {
+                               if (camsys_dev->mipiphy[i].reg->vir_base != 0) {
+                                       iounmap((void __iomem *)vir_base);
+                                       vir_base = 0;
+                               }
+                               kfree(camsys_dev->mipiphy[i].reg);
+                               camsys_dev->mipiphy[i].reg = NULL;
+                       }
+
+                       if (camsys_dev->mipiphy[i].clk != NULL) {
+                               phyclk =
+                                       (camsys_mipiphy_clk_t *)
+                                       camsys_dev->mipiphy[i].clk;
+                               devm_clk_put(&pdev->dev, phyclk->hclk);
+
+                               kfree(camsys_dev->mipiphy[i].clk);
+                               camsys_dev->mipiphy[i].clk = NULL;
+                       }
+               }
+       }
+       if (CHIP_TYPE == 3368 || CHIP_TYPE == 3366 || CHIP_TYPE == 3399) {
+               if (camsys_dev->csiphy_reg != NULL) {
                        kfree(camsys_dev->csiphy_reg);
                        camsys_dev->csiphy_reg = NULL;
                }
+
+               if (camsys_dev->dsiphy_reg != NULL) {
+                       kfree(camsys_dev->dsiphy_reg);
+                       camsys_dev->dsiphy_reg = NULL;
+               }
        }
 
-    return 0;
+       return 0;
 }
-int camsys_mipiphy_probe_cb(struct platform_device *pdev, camsys_dev_t *camsys_dev)
+
+int camsys_mipiphy_probe_cb(
+struct platform_device *pdev, camsys_dev_t *camsys_dev)
 {
-    struct device *dev = &pdev->dev;
-    camsys_meminfo_t *meminfo;
-    camsys_phyinfo_t *mipiphy;
-    unsigned int mipiphy_cnt,phyreg[2];
-    char str[31];
-    struct clk* clk;
-    camsys_mipiphy_clk_t *phyclk;
-    int err,i;
+       struct device *dev = &pdev->dev;
+       camsys_meminfo_t *meminfo;
+       camsys_phyinfo_t *mipiphy;
+       unsigned int mipiphy_cnt, phyreg[2];
+       char str[31];
+       struct clk *clk;
+       camsys_mipiphy_clk_t *phyclk;
+       int err, i;
        struct device_node *node;
-       const char *compatible = NULL;
-
-       err = of_property_read_string(dev->of_node->parent,"compatible",&compatible);   
-    if (err < 0) {
-        camsys_err("get compatible failed!");
-    } else {
-        camsys_trace(1, "compatible is %s\n",compatible);
-    }
-       if(strstr(compatible, "rk3368"))
-               CHIP_TYPE = 3368;
-       else if(strstr(compatible, "rk3288"))
-               CHIP_TYPE = 3288;
-       
-    err = of_property_read_u32(dev->of_node,"rockchip,isp,mipiphy",&mipiphy_cnt);
-    if (err < 0) {
-        camsys_err("get property(rockchip,isp,mipiphy) failed!");
-        goto fail;
-    } else {
-        camsys_trace(2, "%s have %d mipi phy\n",dev_name(&pdev->dev),mipiphy_cnt);
-    }
-    
-    mipiphy = kzalloc(sizeof(camsys_phyinfo_t)*mipiphy_cnt,GFP_KERNEL);
-    if (mipiphy == NULL) {
-        err = -ENOMEM;
-        camsys_err("malloc camsys_phyinfo_t failed!");
-        goto fail;
-    }
-
-    camsys_dev->mipiphy = mipiphy;
-
-    memset(str,0x00,sizeof(str));
-    for (i=0; i<mipiphy_cnt; i++) {
-        meminfo = NULL;
-        sprintf(str,"rockchip,isp,mipiphy%d,reg",i);
-        if (of_property_read_u32_array(dev->of_node,str,phyreg,2) == 0) {
-            meminfo = kzalloc(sizeof(camsys_meminfo_t),GFP_KERNEL);
-            if (meminfo == NULL) {                
-                camsys_err("malloc camsys_meminfo_t for mipiphy%d failed!",i);                
-            } else {
-                meminfo->vir_base = (unsigned long)ioremap(phyreg[0],phyreg[1]);
-                if (!meminfo->vir_base){
-                    camsys_err("%s ioremap %s failed",dev_name(&pdev->dev), str);                    
-                } else {
-                    strlcpy(meminfo->name, CAMSYS_MIPIPHY_MEM_NAME,sizeof(meminfo->name));
-                    meminfo->phy_base = phyreg[0];
-                    meminfo->size = phyreg[1];
-                }
-               
-                camsys_dev->mipiphy[i].reg = meminfo;
-            }
-        }
-
-        memset(str,sizeof(str),0x00);
-        sprintf(str,"hclk_mipiphy%d",i);
-
-        clk = devm_clk_get(&pdev->dev, str);
-        if (!IS_ERR_OR_NULL(clk)) {
-            phyclk = kzalloc(sizeof(camsys_mipiphy_clk_t),GFP_KERNEL);
-            if (phyclk == NULL) {
-                camsys_err("malloc camsys_mipiphy_clk_t for %s failed!",str);
-            } else {
-                phyclk->hclk = clk;
-            }
-
-            camsys_dev->mipiphy[i].clk = (void*)phyclk;
-        }
-
-        camsys_dev->mipiphy[i].phycnt = mipiphy_cnt;
-        camsys_dev->mipiphy[i].clkin_cb = camsys_mipiphy_clkin_cb;
-        camsys_dev->mipiphy[i].ops = camsys_mipiphy_ops;
-        camsys_dev->mipiphy[i].remove = camsys_mipiphy_remove_cb;
-
-        if (meminfo != NULL) {
-            camsys_trace(1,"%s mipi phy%d probe success(reg_phy: 0x%lx  reg_vir: 0x%lx  size: 0x%x)",
-                dev_name(&pdev->dev), i,meminfo->phy_base,meminfo->vir_base, meminfo->size);
-        } else {
-            camsys_trace(1,"%s mipi phy%d probe success(reg_phy: 0x%x  reg_vir: 0x%x  size: 0x%x)",
-                dev_name(&pdev->dev), i,0,0,0);
-        }
-
-    }   
-
-       if(CHIP_TYPE == 3368){
-               camsys_dev->csiphy_reg = kzalloc(sizeof(camsys_meminfo_t),GFP_KERNEL);
-           if (camsys_dev->csiphy_reg == NULL) {                
-                   camsys_err("malloc camsys_meminfo_t for csiphy_reg failed!"); 
+
+       err = of_property_read_u32(dev->of_node,
+               "rockchip,isp,mipiphy", &mipiphy_cnt);
+       if (err < 0) {
+               camsys_err("get property(rockchip,isp,mipiphy) failed!");
+               goto fail;
+       } else {
+               camsys_trace(2, "%s have %d mipi phy\n",
+                       dev_name(&pdev->dev), mipiphy_cnt);
+       }
+
+       mipiphy = kzalloc(sizeof(camsys_phyinfo_t)*mipiphy_cnt, GFP_KERNEL);
+       if (mipiphy == NULL) {
+               err = -ENOMEM;
+               camsys_err("malloc camsys_phyinfo_t failed!");
+               goto fail;
+       }
+
+       camsys_dev->mipiphy = mipiphy;
+
+       memset(str, 0x00, sizeof(str));
+       for (i = 0; i < mipiphy_cnt; i++) {
+               meminfo = NULL;
+               sprintf(str, "rockchip,isp,mipiphy%d,reg", i);
+               if (of_property_read_u32_array(
+                               dev->of_node, str, phyreg, 2
+                               ) == 0
+                       ) {
+                       meminfo = kzalloc(sizeof(camsys_meminfo_t), GFP_KERNEL);
+                       if (meminfo == NULL) {
+                               camsys_err(
+                               "malloc camsys_meminfo_t for mipiphy%d failed!",
+                               i);
+                       } else {
+                               meminfo->vir_base =
+                                       (unsigned long)
+                                       ioremap(phyreg[0], phyreg[1]);
+                               if (!meminfo->vir_base) {
+                                       camsys_err("%s ioremap %s failed",
+                                               dev_name(&pdev->dev), str);
+                               } else {
+                                       strlcpy(meminfo->name,
+                                               CAMSYS_MIPIPHY_MEM_NAME,
+                                               sizeof(meminfo->name));
+                                       meminfo->phy_base = phyreg[0];
+                                       meminfo->size = phyreg[1];
+                               }
+                               camsys_dev->mipiphy[i].reg = meminfo;
+                       }
+               }
+
+               sprintf(str, "hclk_mipiphy%d", i);
+
+               clk = devm_clk_get(&pdev->dev, str);
+               if (!IS_ERR_OR_NULL(clk)) {
+                       phyclk =
+                               kzalloc(sizeof(camsys_mipiphy_clk_t),
+                               GFP_KERNEL);
+                       if (phyclk == NULL) {
+                               camsys_err("malloc camsys_mipiphy_clk_t for %s failed!",
+                                       str);
+                       } else {
+                               phyclk->hclk = clk;
+                       }
+
+                       camsys_dev->mipiphy[i].clk = (void *)phyclk;
                }
-               if (of_property_read_u32_array(dev->of_node,"rockchip,isp,csiphy,reg",phyreg,2) == 0) {
-                       camsys_dev->csiphy_reg->vir_base = (unsigned long)ioremap(phyreg[0],phyreg[1]);
-               if (!camsys_dev->csiphy_reg->vir_base){
-                       camsys_err("%s ioremap %s failed",dev_name(&pdev->dev), "rockchip,isp,csiphy,reg");                    
-               } else {
-               camsys_trace(1,"csiphy vir addr=0x%lx",camsys_dev->csiphy_reg->vir_base);
-                       strlcpy(camsys_dev->csiphy_reg->name, "Csi-DPHY",sizeof(camsys_dev->csiphy_reg->name));
-                       camsys_dev->csiphy_reg->phy_base = phyreg[0];
-                       camsys_dev->csiphy_reg->size = phyreg[1];
-               }
+
+               camsys_dev->mipiphy[i].phycnt = mipiphy_cnt;
+               camsys_dev->mipiphy[i].clkin_cb = camsys_mipiphy_clkin_cb;
+               camsys_dev->mipiphy[i].ops = camsys_mipiphy_ops;
+               camsys_dev->mipiphy[i].remove = camsys_mipiphy_remove_cb;
+
+               if (meminfo != NULL) {
+                       camsys_trace(1, "%s mipi phy%d probe success "
+                               "(reg_phy: 0x%lx  reg_vir: 0x%lx  size: 0x%x)\n",
+                               dev_name(&pdev->dev), i, meminfo->phy_base,
+                               meminfo->vir_base, meminfo->size);
+               } else {
+                       camsys_trace(1, "%s mipi phy%d probe success "
+                               "(reg_phy: 0x%x  reg_vir: 0x%x  size: 0x%x)\n",
+                               dev_name(&pdev->dev), i, 0, 0, 0);
                }
-               //get cru base
-           node = of_parse_phandle(dev->of_node, "rockchip,cru", 0);
-           rk_cru_base = (unsigned long)of_iomap(node, 0);
-               camsys_trace(1,"rk_cru_base=0x%lx",rk_cru_base);
-               //get grf base
-           node = of_parse_phandle(dev->of_node, "rockchip,grf", 0);
-           rk_grf_base = (unsigned long)of_iomap(node, 0);
-               camsys_trace(1,"rk_grf_base=0x%lx",rk_grf_base);
+
        }
-       
-    return 0;
+
+       if (CHIP_TYPE == 3368 || CHIP_TYPE == 3366 || CHIP_TYPE == 3399) {
+
+               if (CHIP_TYPE == 3399) {
+                       camsys_dev->dsiphy_reg =
+                               kzalloc(sizeof(camsys_meminfo_t), GFP_KERNEL);
+                       if (camsys_dev->dsiphy_reg == NULL) {
+                               camsys_err("malloc camsys_meminfo_t for dsiphy_reg failed!");
+                       }
+
+                       if (of_property_read_u32_array(
+                                       dev->of_node,
+                                       "rockchip,isp,dsiphy,reg", phyreg, 2
+                                       ) == 0
+                               ) {
+                                       camsys_dev->dsiphy_reg->vir_base =
+                                               (unsigned long)
+                                               ioremap(phyreg[0], phyreg[1]);
+                               if (!camsys_dev->dsiphy_reg->vir_base) {
+                                       camsys_err("%s ioremap %s failed",
+                                               dev_name(&pdev->dev),
+                                               "rockchip,isp,dsiphy,reg");
+                               } else {
+                               strlcpy(camsys_dev->dsiphy_reg->name,
+                                       "Dsi-DPHY",
+                                       sizeof(camsys_dev->dsiphy_reg->name));
+                               camsys_dev->dsiphy_reg->phy_base = phyreg[0];
+                               camsys_dev->dsiphy_reg->size = phyreg[1];
+                               }
+                       }
+
+       } else {
+                       camsys_dev->csiphy_reg =
+                               kzalloc(sizeof(camsys_meminfo_t), GFP_KERNEL);
+                       if (camsys_dev->csiphy_reg == NULL) {
+                               camsys_err("malloc camsys_meminfo_t for csiphy_reg failed!");
+                       }
+
+                       if (of_property_read_u32_array(
+                                       dev->of_node,
+                                       "rockchip,isp,csiphy,reg", phyreg, 2
+                                       ) == 0
+                               ) {
+                               camsys_dev->csiphy_reg->vir_base =
+                                       (unsigned long)
+                                       ioremap(phyreg[0], phyreg[1]);
+                               if (!camsys_dev->csiphy_reg->vir_base) {
+                                       camsys_err("%s ioremap %s failed",
+                                               dev_name(&pdev->dev),
+                                               "rockchip,isp,csiphy,reg");
+                               } else {
+                                       strlcpy(camsys_dev->csiphy_reg->name,
+                                       "Csi-DPHY",
+                                       sizeof(camsys_dev->csiphy_reg->name));
+                                       camsys_dev->csiphy_reg->phy_base =
+                                               phyreg[0];
+                                       camsys_dev->csiphy_reg->size =
+                                               phyreg[1];
+                               }
+                       }
+               }
+
+               /* get cru base */
+               node = of_parse_phandle(dev->of_node, "rockchip,cru", 0);
+               camsys_dev->rk_cru_base = (unsigned long)of_iomap(node, 0);
+               camsys_trace(2, "rk_cru_base=0x%lx", camsys_dev->rk_cru_base);
+               /* get grf base */
+               node = of_parse_phandle(dev->of_node, "rockchip,grf", 0);
+               camsys_dev->rk_grf_base = (unsigned long)of_iomap(node, 0);
+               camsys_trace(2, "rk_grf_base=0x%lx", camsys_dev->rk_grf_base);
+       }
+
+       return 0;
 
 fail:
 
-    return err;
+       return err;
 }