rk312x camera : oneframe v0.1.9,pingpong v0.1.9
[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 static int camsys_mipiphy_clkin_cb(void *ptr, unsigned int on)
5 {
6     camsys_mipiphy_clk_t *clk;
7     camsys_dev_t *camsys_dev = (camsys_dev_t*)ptr;
8     unsigned int i,phycnt;
9     
10     if (camsys_dev->mipiphy != NULL) {
11         phycnt = camsys_dev->mipiphy[0].phycnt;
12          
13         for (i=0; i<phycnt; i++) {
14             if (camsys_dev->mipiphy[i].clk != NULL) {
15                 clk = (camsys_mipiphy_clk_t*)camsys_dev->mipiphy[i].clk;
16                 if (on && !clk->on) {
17                     if (!IS_ERR_OR_NULL(clk->hclk))
18                         clk_prepare_enable(clk->hclk);  
19                     clk->on = on;
20                 } else if (!on && clk->on) {
21                     if (!IS_ERR_OR_NULL(clk->hclk))
22                         clk_disable_unprepare(clk->hclk);                    
23                     clk->on = on;
24                 }
25             }
26         }
27     }
28     if (on)
29         camsys_trace(1, "%s mipi phy clk in turn on",dev_name(camsys_dev->miscdev.this_device));
30     else 
31         camsys_trace(1, "%s mipi phy clk in turn off",dev_name(camsys_dev->miscdev.this_device));
32     
33     return 0;
34 }
35
36 static int camsys_mipiphy_ops (void * ptr, camsys_mipiphy_t *phy)
37 {
38     camsys_dev_t *camsys_dev = (camsys_dev_t*)ptr;
39     camsys_mipiphy_soc_para_t para;
40     camsys_soc_priv_t *soc;
41     
42     if (camsys_dev->soc) {
43         soc = (camsys_soc_priv_t*)camsys_dev->soc;
44         if (soc->soc_cfg) { 
45             para.camsys_dev = camsys_dev;
46             para.phy = phy;
47             (soc->soc_cfg)(Mipi_Phy_Cfg,(void*)&para);
48         } else {
49             camsys_err("camsys_dev->soc->soc_cfg is NULL!");
50         }
51     } else {
52         camsys_err("camsys_dev->soc is NULL!");
53     }
54     
55     return 0;
56 }
57
58 static int camsys_mipiphy_remove_cb(struct platform_device *pdev)
59 {
60     camsys_dev_t *camsys_dev = platform_get_drvdata(pdev);
61     camsys_mipiphy_clk_t *phyclk;
62     unsigned int i;
63     
64     if (camsys_dev->mipiphy != NULL) {
65         for (i=0; i<camsys_dev->mipiphy[0].phycnt; i++) {
66             if (camsys_dev->mipiphy[i].reg != NULL) {
67                 if (camsys_dev->mipiphy[i].reg->vir_base != 0) {
68                     iounmap((void __iomem *)camsys_dev->mipiphy[i].reg->vir_base);
69                     camsys_dev->mipiphy[i].reg->vir_base = 0;
70                 }
71                 kfree(camsys_dev->mipiphy[i].reg);
72                 camsys_dev->mipiphy[i].reg = NULL;
73             }
74
75             if (camsys_dev->mipiphy[i].clk != NULL) {
76                 phyclk = (camsys_mipiphy_clk_t*)camsys_dev->mipiphy[i].clk;
77                 devm_clk_put(&pdev->dev,phyclk->hclk);
78
79                 kfree(camsys_dev->mipiphy[i].clk);
80                 camsys_dev->mipiphy[i].clk = NULL;
81             }
82         }
83     }
84
85     
86     return 0;
87 }
88 int camsys_mipiphy_probe_cb(struct platform_device *pdev, camsys_dev_t *camsys_dev)
89 {
90     struct device *dev = &pdev->dev;
91     camsys_meminfo_t *meminfo;
92     camsys_phyinfo_t *mipiphy;
93     unsigned int mipiphy_cnt,phyreg[2];
94     char str[31];
95     struct clk* clk;
96     camsys_mipiphy_clk_t *phyclk;
97     int err,i;
98
99     err = of_property_read_u32(dev->of_node,"rockchip,isp,mipiphy",&mipiphy_cnt);
100     if (err < 0) {
101         camsys_err("get property(rockchip,isp,mipiphy) failed!");
102         goto fail;
103     } else {
104         camsys_trace(2, "%s have %d mipi phy\n",dev_name(&pdev->dev),mipiphy_cnt);
105     }
106     
107     mipiphy = kzalloc(sizeof(camsys_phyinfo_t)*mipiphy_cnt,GFP_KERNEL);
108     if (mipiphy == NULL) {
109         err = -ENOMEM;
110         camsys_err("malloc camsys_phyinfo_t failed!");
111         goto fail;
112     }
113
114     camsys_dev->mipiphy = mipiphy;
115
116     memset(str,0x00,sizeof(str));
117     for (i=0; i<mipiphy_cnt; i++) {
118         meminfo = NULL;
119         sprintf(str,"rockchip,isp,mipiphy%d,reg",i);
120         if (of_property_read_u32_array(dev->of_node,str,phyreg,2) == 0) {
121             meminfo = kzalloc(sizeof(camsys_meminfo_t),GFP_KERNEL);
122             if (meminfo == NULL) {                
123                 camsys_err("malloc camsys_meminfo_t for mipiphy%d failed!",i);                
124             } else {
125                 meminfo->vir_base = (unsigned int)ioremap(phyreg[0],phyreg[1]);
126                 if (!meminfo->vir_base){
127                     camsys_err("%s ioremap %s failed",dev_name(&pdev->dev), str);                    
128                 } else {
129                     strlcpy(meminfo->name, CAMSYS_MIPIPHY_MEM_NAME,sizeof(meminfo->name));
130                     meminfo->phy_base = phyreg[0];
131                     meminfo->size = phyreg[1];
132                 }
133                
134                 camsys_dev->mipiphy[i].reg = meminfo;
135             }
136         }
137
138         memset(str,sizeof(str),0x00);
139         sprintf(str,"hclk_mipiphy%d",i);
140
141         clk = devm_clk_get(&pdev->dev, str);
142         if (!IS_ERR_OR_NULL(clk)) {
143             phyclk = kzalloc(sizeof(camsys_mipiphy_clk_t),GFP_KERNEL);
144             if (phyclk == NULL) {
145                 camsys_err("malloc camsys_mipiphy_clk_t for %s failed!",str);
146             } else {
147                 phyclk->hclk = clk;
148             }
149
150             camsys_dev->mipiphy[i].clk = (void*)phyclk;
151         }
152
153         camsys_dev->mipiphy[i].phycnt = mipiphy_cnt;
154         camsys_dev->mipiphy[i].clkin_cb = camsys_mipiphy_clkin_cb;
155         camsys_dev->mipiphy[i].ops = camsys_mipiphy_ops;
156         camsys_dev->mipiphy[i].remove = camsys_mipiphy_remove_cb;
157
158         if (meminfo != NULL) {
159             camsys_trace(1,"%s mipi phy%d probe success(reg_phy: 0x%x  reg_vir: 0x%x  size: 0x%x)",
160                 dev_name(&pdev->dev), i,meminfo->phy_base,meminfo->vir_base, meminfo->size);
161         } else {
162             camsys_trace(1,"%s mipi phy%d probe success(reg_phy: 0x%x  reg_vir: 0x%x  size: 0x%x)",
163                 dev_name(&pdev->dev), i,0,0,0);
164         }
165
166     }   
167     
168     return 0;
169
170 fail:
171
172     return err;
173 }
174