1 #include "camsys_soc_priv.h"
2 #include "camsys_mipicsi_phy.h"
4 unsigned int CHIP_TYPE;
5 unsigned long rk_grf_base;
6 unsigned long rk_cru_base;
7 unsigned long rk_isp_base;
9 static int camsys_mipiphy_clkin_cb(void *ptr, unsigned int on)
11 camsys_mipiphy_clk_t *clk;
12 camsys_dev_t *camsys_dev = (camsys_dev_t*)ptr;
13 unsigned int i,phycnt;
15 if (camsys_dev->mipiphy != NULL) {
16 phycnt = camsys_dev->mipiphy[0].phycnt;
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;
22 if (!IS_ERR_OR_NULL(clk->hclk))
23 clk_prepare_enable(clk->hclk);
25 } else if (!on && clk->on) {
26 if (!IS_ERR_OR_NULL(clk->hclk))
27 clk_disable_unprepare(clk->hclk);
34 camsys_trace(1, "%s mipi phy clk in turn on",dev_name(camsys_dev->miscdev.this_device));
36 camsys_trace(1, "%s mipi phy clk in turn off",dev_name(camsys_dev->miscdev.this_device));
41 static int camsys_mipiphy_ops (void * ptr, camsys_mipiphy_t *phy)
43 camsys_dev_t *camsys_dev = (camsys_dev_t*)ptr;
44 camsys_mipiphy_soc_para_t para;
45 camsys_soc_priv_t *soc;
47 if (camsys_dev->soc) {
48 soc = (camsys_soc_priv_t*)camsys_dev->soc;
50 para.camsys_dev = camsys_dev;
52 (soc->soc_cfg)(Mipi_Phy_Cfg,(void*)¶);
54 camsys_err("camsys_dev->soc->soc_cfg is NULL!");
57 camsys_err("camsys_dev->soc is NULL!");
63 static int camsys_mipiphy_remove_cb(struct platform_device *pdev)
65 camsys_dev_t *camsys_dev = platform_get_drvdata(pdev);
66 camsys_mipiphy_clk_t *phyclk;
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;
76 kfree(camsys_dev->mipiphy[i].reg);
77 camsys_dev->mipiphy[i].reg = NULL;
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);
84 kfree(camsys_dev->mipiphy[i].clk);
85 camsys_dev->mipiphy[i].clk = NULL;
89 if(CHIP_TYPE == 3368){
90 if(camsys_dev->csiphy_reg != NULL){
91 kfree(camsys_dev->csiphy_reg);
92 camsys_dev->csiphy_reg = NULL;
98 int camsys_mipiphy_probe_cb(struct platform_device *pdev, camsys_dev_t *camsys_dev)
100 struct device *dev = &pdev->dev;
101 camsys_meminfo_t *meminfo;
102 camsys_phyinfo_t *mipiphy;
103 unsigned int mipiphy_cnt,phyreg[2];
106 camsys_mipiphy_clk_t *phyclk;
108 struct device_node *node;
109 const char *compatible = NULL;
111 err = of_property_read_string(dev->of_node->parent,"compatible",&compatible);
113 camsys_err("get compatible failed!");
115 camsys_trace(1, "compatible is %s\n",compatible);
117 if(strstr(compatible, "rk3368"))
119 else if(strstr(compatible, "rk3288"))
122 err = of_property_read_u32(dev->of_node,"rockchip,isp,mipiphy",&mipiphy_cnt);
124 camsys_err("get property(rockchip,isp,mipiphy) failed!");
127 camsys_trace(2, "%s have %d mipi phy\n",dev_name(&pdev->dev),mipiphy_cnt);
130 mipiphy = kzalloc(sizeof(camsys_phyinfo_t)*mipiphy_cnt,GFP_KERNEL);
131 if (mipiphy == NULL) {
133 camsys_err("malloc camsys_phyinfo_t failed!");
137 camsys_dev->mipiphy = mipiphy;
139 memset(str,0x00,sizeof(str));
140 for (i=0; i<mipiphy_cnt; i++) {
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);
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);
152 strlcpy(meminfo->name, CAMSYS_MIPIPHY_MEM_NAME,sizeof(meminfo->name));
153 meminfo->phy_base = phyreg[0];
154 meminfo->size = phyreg[1];
157 camsys_dev->mipiphy[i].reg = meminfo;
161 memset(str,sizeof(str),0x00);
162 sprintf(str,"hclk_mipiphy%d",i);
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);
173 camsys_dev->mipiphy[i].clk = (void*)phyclk;
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;
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);
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);
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!");
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");
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];
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);
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);