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 *)
21 camsys_dev->mipiphy[i].clk;
23 if (!IS_ERR_OR_NULL(clk->hclk))
24 clk_prepare_enable(clk->hclk);
26 } else if (!on && clk->on) {
27 if (!IS_ERR_OR_NULL(clk->hclk))
36 camsys_trace(2, "%s mipiphy clk turn on",
37 dev_name(camsys_dev->miscdev.this_device));
39 camsys_trace(2, "%s mipiphy clk turn off",
40 dev_name(camsys_dev->miscdev.this_device));
45 static int camsys_mipiphy_ops(void *ptr, camsys_mipiphy_t *phy)
47 camsys_dev_t *camsys_dev = (camsys_dev_t *)ptr;
48 camsys_mipiphy_soc_para_t para;
49 camsys_soc_priv_t *soc;
51 if (camsys_dev->soc) {
52 soc = (camsys_soc_priv_t *)camsys_dev->soc;
54 para.camsys_dev = camsys_dev;
56 (soc->soc_cfg)(camsys_dev, Mipi_Phy_Cfg, (void *)¶);
58 camsys_err("camsys_dev->soc->soc_cfg is NULL!");
61 camsys_err("camsys_dev->soc is NULL!");
67 static int camsys_mipiphy_remove_cb(struct platform_device *pdev)
69 camsys_dev_t *camsys_dev = platform_get_drvdata(pdev);
70 camsys_mipiphy_clk_t *phyclk;
72 unsigned long vir_base = camsys_dev->mipiphy[i].reg->vir_base;
74 if (camsys_dev->mipiphy != NULL) {
75 for (i = 0; i < camsys_dev->mipiphy[0].phycnt; i++) {
76 if (camsys_dev->mipiphy[i].reg != NULL) {
77 if (camsys_dev->mipiphy[i].reg->vir_base != 0) {
78 iounmap((void __iomem *)vir_base);
81 kfree(camsys_dev->mipiphy[i].reg);
82 camsys_dev->mipiphy[i].reg = NULL;
85 if (camsys_dev->mipiphy[i].clk != NULL) {
87 (camsys_mipiphy_clk_t *)
88 camsys_dev->mipiphy[i].clk;
89 devm_clk_put(&pdev->dev, phyclk->hclk);
91 kfree(camsys_dev->mipiphy[i].clk);
92 camsys_dev->mipiphy[i].clk = NULL;
96 if (CHIP_TYPE == 3368 || CHIP_TYPE == 3366 || CHIP_TYPE == 3399) {
97 if (camsys_dev->csiphy_reg != NULL) {
98 kfree(camsys_dev->csiphy_reg);
99 camsys_dev->csiphy_reg = NULL;
102 if (camsys_dev->dsiphy_reg != NULL) {
103 kfree(camsys_dev->dsiphy_reg);
104 camsys_dev->dsiphy_reg = NULL;
111 int camsys_mipiphy_probe_cb(
112 struct platform_device *pdev, camsys_dev_t *camsys_dev)
114 struct device *dev = &pdev->dev;
115 camsys_meminfo_t *meminfo;
116 camsys_phyinfo_t *mipiphy;
117 unsigned int mipiphy_cnt, phyreg[2];
120 camsys_mipiphy_clk_t *phyclk;
122 struct device_node *node;
124 err = of_property_read_u32(dev->of_node,
125 "rockchip,isp,mipiphy", &mipiphy_cnt);
127 camsys_err("get property(rockchip,isp,mipiphy) failed!");
130 camsys_trace(2, "%s have %d mipi phy\n",
131 dev_name(&pdev->dev), mipiphy_cnt);
134 mipiphy = kzalloc(sizeof(camsys_phyinfo_t)*mipiphy_cnt, GFP_KERNEL);
135 if (mipiphy == NULL) {
137 camsys_err("malloc camsys_phyinfo_t failed!");
141 camsys_dev->mipiphy = mipiphy;
143 memset(str, 0x00, sizeof(str));
144 for (i = 0; i < mipiphy_cnt; i++) {
146 sprintf(str, "rockchip,isp,mipiphy%d,reg", i);
147 if (of_property_read_u32_array(
148 dev->of_node, str, phyreg, 2
151 meminfo = kzalloc(sizeof(camsys_meminfo_t), GFP_KERNEL);
152 if (meminfo == NULL) {
154 "malloc camsys_meminfo_t for mipiphy%d failed!",
159 ioremap(phyreg[0], phyreg[1]);
160 if (!meminfo->vir_base) {
161 camsys_err("%s ioremap %s failed",
162 dev_name(&pdev->dev), str);
164 strlcpy(meminfo->name,
165 CAMSYS_MIPIPHY_MEM_NAME,
166 sizeof(meminfo->name));
167 meminfo->phy_base = phyreg[0];
168 meminfo->size = phyreg[1];
170 camsys_dev->mipiphy[i].reg = meminfo;
174 sprintf(str, "hclk_mipiphy%d", i);
176 clk = devm_clk_get(&pdev->dev, str);
177 if (!IS_ERR_OR_NULL(clk)) {
179 kzalloc(sizeof(camsys_mipiphy_clk_t),
181 if (phyclk == NULL) {
182 camsys_err("malloc camsys_mipiphy_clk_t for %s failed!",
188 camsys_dev->mipiphy[i].clk = (void *)phyclk;
191 camsys_dev->mipiphy[i].phycnt = mipiphy_cnt;
192 camsys_dev->mipiphy[i].clkin_cb = camsys_mipiphy_clkin_cb;
193 camsys_dev->mipiphy[i].ops = camsys_mipiphy_ops;
194 camsys_dev->mipiphy[i].remove = camsys_mipiphy_remove_cb;
196 if (meminfo != NULL) {
197 camsys_trace(1, "%s mipi phy%d probe success "
198 "(reg_phy: 0x%lx reg_vir: 0x%lx size: 0x%x)\n",
199 dev_name(&pdev->dev), i, meminfo->phy_base,
200 meminfo->vir_base, meminfo->size);
202 camsys_trace(1, "%s mipi phy%d probe success "
203 "(reg_phy: 0x%x reg_vir: 0x%x size: 0x%x)\n",
204 dev_name(&pdev->dev), i, 0, 0, 0);
209 if (CHIP_TYPE == 3368 || CHIP_TYPE == 3366 || CHIP_TYPE == 3399) {
211 if (CHIP_TYPE == 3399) {
212 camsys_dev->dsiphy_reg =
213 kzalloc(sizeof(camsys_meminfo_t), GFP_KERNEL);
214 if (camsys_dev->dsiphy_reg == NULL) {
215 camsys_err("malloc camsys_meminfo_t for dsiphy_reg failed!");
218 if (of_property_read_u32_array(
220 "rockchip,isp,dsiphy,reg", phyreg, 2
223 camsys_dev->dsiphy_reg->vir_base =
225 ioremap(phyreg[0], phyreg[1]);
226 if (!camsys_dev->dsiphy_reg->vir_base) {
227 camsys_err("%s ioremap %s failed",
228 dev_name(&pdev->dev),
229 "rockchip,isp,dsiphy,reg");
231 strlcpy(camsys_dev->dsiphy_reg->name,
233 sizeof(camsys_dev->dsiphy_reg->name));
234 camsys_dev->dsiphy_reg->phy_base = phyreg[0];
235 camsys_dev->dsiphy_reg->size = phyreg[1];
240 camsys_dev->csiphy_reg =
241 kzalloc(sizeof(camsys_meminfo_t), GFP_KERNEL);
242 if (camsys_dev->csiphy_reg == NULL) {
243 camsys_err("malloc camsys_meminfo_t for csiphy_reg failed!");
246 if (of_property_read_u32_array(
248 "rockchip,isp,csiphy,reg", phyreg, 2
251 camsys_dev->csiphy_reg->vir_base =
253 ioremap(phyreg[0], phyreg[1]);
254 if (!camsys_dev->csiphy_reg->vir_base) {
255 camsys_err("%s ioremap %s failed",
256 dev_name(&pdev->dev),
257 "rockchip,isp,csiphy,reg");
259 strlcpy(camsys_dev->csiphy_reg->name,
261 sizeof(camsys_dev->csiphy_reg->name));
262 camsys_dev->csiphy_reg->phy_base =
264 camsys_dev->csiphy_reg->size =
271 node = of_parse_phandle(dev->of_node, "rockchip,cru", 0);
272 camsys_dev->rk_cru_base = (unsigned long)of_iomap(node, 0);
273 camsys_trace(2, "rk_cru_base=0x%lx", camsys_dev->rk_cru_base);
275 node = of_parse_phandle(dev->of_node, "rockchip,grf", 0);
276 camsys_dev->rk_grf_base = (unsigned long)of_iomap(node, 0);
277 camsys_trace(2, "rk_grf_base=0x%lx", camsys_dev->rk_grf_base);