8094b7e654beedaf7c22656627e3fb286974ebf8
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / rk_camsys / camsys_mipicsi_phy.c
1 #include "camsys_soc_priv.h"
2 #include "camsys_mipicsi_phy.h"
3
4 unsigned int CHIP_TYPE;
5 unsigned long rk_grf_base;
6 unsigned long rk_cru_base;
7 unsigned long rk_isp_base;
8
9 static int camsys_mipiphy_clkin_cb(void *ptr, unsigned int on)
10 {
11     camsys_mipiphy_clk_t *clk;
12     camsys_dev_t *camsys_dev = (camsys_dev_t*)ptr;
13     unsigned int i,phycnt;
14     
15     if (camsys_dev->mipiphy != NULL) {
16         phycnt = camsys_dev->mipiphy[0].phycnt;
17          
18         for (i=0; i<phycnt; i++) {
19             if (camsys_dev->mipiphy[i].clk != NULL) {
20                 clk = (camsys_mipiphy_clk_t*)camsys_dev->mipiphy[i].clk;
21                 if (on && !clk->on) {
22                     if (!IS_ERR_OR_NULL(clk->hclk))
23                         clk_prepare_enable(clk->hclk);  
24                     clk->on = on;
25                 } else if (!on && clk->on) {
26                     if (!IS_ERR_OR_NULL(clk->hclk))
27                         clk_disable_unprepare(clk->hclk);                    
28                     clk->on = on;
29                 }
30             }
31         }
32     }
33     if (on)
34         camsys_trace(1, "%s mipi phy clk in turn on",dev_name(camsys_dev->miscdev.this_device));
35     else 
36         camsys_trace(1, "%s mipi phy clk in turn off",dev_name(camsys_dev->miscdev.this_device));
37     
38     return 0;
39 }
40
41 static int camsys_mipiphy_ops (void * ptr, camsys_mipiphy_t *phy)
42 {
43     camsys_dev_t *camsys_dev = (camsys_dev_t*)ptr;
44     camsys_mipiphy_soc_para_t para;
45     camsys_soc_priv_t *soc;
46     
47     if (camsys_dev->soc) {
48         soc = (camsys_soc_priv_t*)camsys_dev->soc;
49         if (soc->soc_cfg) { 
50             para.camsys_dev = camsys_dev;
51             para.phy = phy;
52             (soc->soc_cfg)(Mipi_Phy_Cfg,(void*)&para);
53         } else {
54             camsys_err("camsys_dev->soc->soc_cfg is NULL!");
55         }
56     } else {
57         camsys_err("camsys_dev->soc is NULL!");
58     }
59     
60     return 0;
61 }
62
63 static int camsys_mipiphy_remove_cb(struct platform_device *pdev)
64 {
65     camsys_dev_t *camsys_dev = platform_get_drvdata(pdev);
66     camsys_mipiphy_clk_t *phyclk;
67     unsigned int i;
68     
69     if (camsys_dev->mipiphy != NULL) {
70         for (i=0; i<camsys_dev->mipiphy[0].phycnt; i++) {
71             if (camsys_dev->mipiphy[i].reg != NULL) {
72                 if (camsys_dev->mipiphy[i].reg->vir_base != 0) {
73                     iounmap((void __iomem *)camsys_dev->mipiphy[i].reg->vir_base);
74                     camsys_dev->mipiphy[i].reg->vir_base = 0;
75                 }
76                 kfree(camsys_dev->mipiphy[i].reg);
77                 camsys_dev->mipiphy[i].reg = NULL;
78             }
79
80             if (camsys_dev->mipiphy[i].clk != NULL) {
81                 phyclk = (camsys_mipiphy_clk_t*)camsys_dev->mipiphy[i].clk;
82                 devm_clk_put(&pdev->dev,phyclk->hclk);
83
84                 kfree(camsys_dev->mipiphy[i].clk);
85                 camsys_dev->mipiphy[i].clk = NULL;
86             }
87         }
88     }
89         if(CHIP_TYPE == 3368){
90                 if(camsys_dev->csiphy_reg != NULL){
91                         kfree(camsys_dev->csiphy_reg);
92                         camsys_dev->csiphy_reg = NULL;
93                 }
94         }
95
96     return 0;
97 }
98 int camsys_mipiphy_probe_cb(struct platform_device *pdev, camsys_dev_t *camsys_dev)
99 {
100     struct device *dev = &pdev->dev;
101     camsys_meminfo_t *meminfo;
102     camsys_phyinfo_t *mipiphy;
103     unsigned int mipiphy_cnt,phyreg[2];
104     char str[31];
105     struct clk* clk;
106     camsys_mipiphy_clk_t *phyclk;
107     int err,i;
108         struct device_node *node;
109         const char *compatible = NULL;
110
111         err = of_property_read_string(dev->of_node->parent,"compatible",&compatible);   
112     if (err < 0) {
113         camsys_err("get compatible failed!");
114     } else {
115         camsys_trace(1, "compatible is %s\n",compatible);
116     }
117         if(strstr(compatible, "rk3368"))
118                 CHIP_TYPE = 3368;
119         else if(strstr(compatible, "rk3288"))
120                 CHIP_TYPE = 3288;
121         
122     err = of_property_read_u32(dev->of_node,"rockchip,isp,mipiphy",&mipiphy_cnt);
123     if (err < 0) {
124         camsys_err("get property(rockchip,isp,mipiphy) failed!");
125         goto fail;
126     } else {
127         camsys_trace(2, "%s have %d mipi phy\n",dev_name(&pdev->dev),mipiphy_cnt);
128     }
129     
130     mipiphy = kzalloc(sizeof(camsys_phyinfo_t)*mipiphy_cnt,GFP_KERNEL);
131     if (mipiphy == NULL) {
132         err = -ENOMEM;
133         camsys_err("malloc camsys_phyinfo_t failed!");
134         goto fail;
135     }
136
137     camsys_dev->mipiphy = mipiphy;
138
139     memset(str,0x00,sizeof(str));
140     for (i=0; i<mipiphy_cnt; i++) {
141         meminfo = NULL;
142         sprintf(str,"rockchip,isp,mipiphy%d,reg",i);
143         if (of_property_read_u32_array(dev->of_node,str,phyreg,2) == 0) {
144             meminfo = kzalloc(sizeof(camsys_meminfo_t),GFP_KERNEL);
145             if (meminfo == NULL) {                
146                 camsys_err("malloc camsys_meminfo_t for mipiphy%d failed!",i);                
147             } else {
148                 meminfo->vir_base = (unsigned long)ioremap(phyreg[0],phyreg[1]);
149                 if (!meminfo->vir_base){
150                     camsys_err("%s ioremap %s failed",dev_name(&pdev->dev), str);                    
151                 } else {
152                     strlcpy(meminfo->name, CAMSYS_MIPIPHY_MEM_NAME,sizeof(meminfo->name));
153                     meminfo->phy_base = phyreg[0];
154                     meminfo->size = phyreg[1];
155                 }
156                
157                 camsys_dev->mipiphy[i].reg = meminfo;
158             }
159         }
160
161         memset(str,sizeof(str),0x00);
162         sprintf(str,"hclk_mipiphy%d",i);
163
164         clk = devm_clk_get(&pdev->dev, str);
165         if (!IS_ERR_OR_NULL(clk)) {
166             phyclk = kzalloc(sizeof(camsys_mipiphy_clk_t),GFP_KERNEL);
167             if (phyclk == NULL) {
168                 camsys_err("malloc camsys_mipiphy_clk_t for %s failed!",str);
169             } else {
170                 phyclk->hclk = clk;
171             }
172
173             camsys_dev->mipiphy[i].clk = (void*)phyclk;
174         }
175
176         camsys_dev->mipiphy[i].phycnt = mipiphy_cnt;
177         camsys_dev->mipiphy[i].clkin_cb = camsys_mipiphy_clkin_cb;
178         camsys_dev->mipiphy[i].ops = camsys_mipiphy_ops;
179         camsys_dev->mipiphy[i].remove = camsys_mipiphy_remove_cb;
180
181         if (meminfo != NULL) {
182             camsys_trace(1,"%s mipi phy%d probe success(reg_phy: 0x%lx  reg_vir: 0x%lx  size: 0x%x)",
183                 dev_name(&pdev->dev), i,meminfo->phy_base,meminfo->vir_base, meminfo->size);
184         } else {
185             camsys_trace(1,"%s mipi phy%d probe success(reg_phy: 0x%x  reg_vir: 0x%x  size: 0x%x)",
186                 dev_name(&pdev->dev), i,0,0,0);
187         }
188
189     }   
190
191         if(CHIP_TYPE == 3368){
192                 camsys_dev->csiphy_reg = kzalloc(sizeof(camsys_meminfo_t),GFP_KERNEL);
193             if (camsys_dev->csiphy_reg == NULL) {                
194                     camsys_err("malloc camsys_meminfo_t for csiphy_reg failed!"); 
195                 }
196                 if (of_property_read_u32_array(dev->of_node,"rockchip,isp,csiphy,reg",phyreg,2) == 0) {
197                         camsys_dev->csiphy_reg->vir_base = (unsigned long)ioremap(phyreg[0],phyreg[1]);
198                 if (!camsys_dev->csiphy_reg->vir_base){
199                         camsys_err("%s ioremap %s failed",dev_name(&pdev->dev), "rockchip,isp,csiphy,reg");                    
200                 } else {
201                 camsys_trace(1,"csiphy vir addr=0x%lx",camsys_dev->csiphy_reg->vir_base);
202                         strlcpy(camsys_dev->csiphy_reg->name, "Csi-DPHY",sizeof(camsys_dev->csiphy_reg->name));
203                         camsys_dev->csiphy_reg->phy_base = phyreg[0];
204                         camsys_dev->csiphy_reg->size = phyreg[1];
205                 }
206                 }
207                 //get cru base
208             node = of_parse_phandle(dev->of_node, "rockchip,cru", 0);
209             rk_cru_base = (unsigned long)of_iomap(node, 0);
210                 camsys_trace(1,"rk_cru_base=0x%lx",rk_cru_base);
211                 //get grf base
212             node = of_parse_phandle(dev->of_node, "rockchip,grf", 0);
213             rk_grf_base = (unsigned long)of_iomap(node, 0);
214                 camsys_trace(1,"rk_grf_base=0x%lx",rk_grf_base);
215         }
216         
217     return 0;
218
219 fail:
220
221     return err;
222 }
223