1 #include "camsys_soc_priv.h"
2 #include "camsys_mipicsi_phy.h"
4 static int camsys_mipiphy_clkin_cb(void *ptr, unsigned int on)
6 camsys_mipiphy_clk_t *clk;
7 camsys_dev_t *camsys_dev = (camsys_dev_t*)ptr;
10 if (camsys_dev->mipiphy != NULL) {
11 phycnt = camsys_dev->mipiphy[0].phycnt;
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;
17 if (!IS_ERR_OR_NULL(clk->hclk))
18 clk_prepare_enable(clk->hclk);
20 } else if (!on && clk->on) {
21 if (!IS_ERR_OR_NULL(clk->hclk))
22 clk_disable_unprepare(clk->hclk);
29 camsys_trace(1, "%s mipi phy clk in turn on",dev_name(camsys_dev->miscdev.this_device));
31 camsys_trace(1, "%s mipi phy clk in turn off",dev_name(camsys_dev->miscdev.this_device));
36 static int camsys_mipiphy_ops (void * ptr, camsys_mipiphy_t *phy)
38 camsys_dev_t *camsys_dev = (camsys_dev_t*)ptr;
39 camsys_mipiphy_soc_para_t para;
40 camsys_soc_priv_t *soc;
42 if (camsys_dev->soc) {
43 soc = (camsys_soc_priv_t*)camsys_dev->soc;
45 para.camsys_dev = camsys_dev;
47 (soc->soc_cfg)(Mipi_Phy_Cfg,(void*)¶);
49 camsys_err("camsys_dev->soc->soc_cfg is NULL!");
52 camsys_err("camsys_dev->soc is NULL!");
58 static int camsys_mipiphy_remove_cb(struct platform_device *pdev)
60 camsys_dev_t *camsys_dev = platform_get_drvdata(pdev);
61 camsys_mipiphy_clk_t *phyclk;
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;
71 kfree(camsys_dev->mipiphy[i].reg);
72 camsys_dev->mipiphy[i].reg = NULL;
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);
79 kfree(camsys_dev->mipiphy[i].clk);
80 camsys_dev->mipiphy[i].clk = NULL;
88 int camsys_mipiphy_probe_cb(struct platform_device *pdev, camsys_dev_t *camsys_dev)
90 struct device *dev = &pdev->dev;
91 camsys_meminfo_t *meminfo;
92 camsys_phyinfo_t *mipiphy;
93 unsigned int mipiphy_cnt,phyreg[2];
96 camsys_mipiphy_clk_t *phyclk;
99 err = of_property_read_u32(dev->of_node,"rockchip,isp,mipiphy",&mipiphy_cnt);
101 camsys_err("get property(rockchip,isp,mipiphy) failed!");
104 camsys_trace(2, "%s have %d mipi phy\n",dev_name(&pdev->dev),mipiphy_cnt);
107 mipiphy = kzalloc(sizeof(camsys_phyinfo_t)*mipiphy_cnt,GFP_KERNEL);
108 if (mipiphy == NULL) {
110 camsys_err("malloc camsys_phyinfo_t failed!");
114 camsys_dev->mipiphy = mipiphy;
116 memset(str,0x00,sizeof(str));
117 for (i=0; i<mipiphy_cnt; i++) {
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);
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);
129 strlcpy(meminfo->name, CAMSYS_MIPIPHY_MEM_NAME,sizeof(meminfo->name));
130 meminfo->phy_base = phyreg[0];
131 meminfo->size = phyreg[1];
134 camsys_dev->mipiphy[i].reg = meminfo;
138 memset(str,sizeof(str),0x00);
139 sprintf(str,"hclk_mipiphy%d",i);
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);
150 camsys_dev->mipiphy[i].clk = (void*)phyclk;
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;
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);
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);