camsys_drv : v0.9.0
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / rk2928_camera.c
1 \r
2 #include <mach/iomux.h>\r
3 #include <media/soc_camera.h>\r
4 #include <linux/android_pmem.h>\r
5 #include <mach/rk2928_camera.h>\r
6 #ifndef PMEM_CAM_SIZE\r
7 #include "../../../arch/arm/plat-rk/rk_camera.c"\r
8 #else\r
9 /*****************************************************************************************\r
10  * camera  devices\r
11  * author: ddl@rock-chips.com\r
12  *****************************************************************************************/\r
13 #ifdef CONFIG_VIDEO_RK29 \r
14 \r
15 static int rk_sensor_iomux(int pin)\r
16 {    \r
17     iomux_set_gpio_mode(pin);\r
18     return 0;\r
19 }\r
20 #define PMEM_CAM_BASE 0 //just for compile ,no meaning\r
21 #include "../../../arch/arm/plat-rk/rk_camera.c"\r
22 \r
23 \r
24 static u64 rockchip_device_camera_dmamask = 0xffffffffUL;\r
25 #if RK_SUPPORT_CIF0\r
26 static struct resource rk_camera_resource_host_0[] = {\r
27         [0] = {\r
28                 .start = RK2928_CIF_PHYS,\r
29                 .end   = RK2928_CIF_PHYS + RK2928_CIF_SIZE - 1,\r
30                 .flags = IORESOURCE_MEM,\r
31         },\r
32         [1] = {\r
33                 .start = IRQ_CIF,\r
34                 .end   = IRQ_CIF,\r
35                 .flags = IORESOURCE_IRQ,\r
36         }\r
37 };\r
38 #endif\r
39 #if RK_SUPPORT_CIF1\r
40 static struct resource rk_camera_resource_host_1[] = {\r
41         [0] = {\r
42                 .start = RK2928_CIF_PHYS,\r
43                 .end   = RK2928_CIF_PHYS+ RK2928_CIF_SIZE - 1,\r
44                 .flags = IORESOURCE_MEM,\r
45         },\r
46         [1] = {\r
47                 .start = IRQ_CIF,\r
48                 .end   = IRQ_CIF,\r
49                 .flags = IORESOURCE_IRQ,\r
50         }\r
51 };\r
52 #endif\r
53 \r
54 /*platform_device : */\r
55 #if RK_SUPPORT_CIF0\r
56  struct platform_device rk_device_camera_host_0 = {\r
57         .name             = RK29_CAM_DRV_NAME,\r
58         .id       = RK_CAM_PLATFORM_DEV_ID_0,                           /* This is used to put cameras on this interface */\r
59         .num_resources    = ARRAY_SIZE(rk_camera_resource_host_0),\r
60         .resource         = rk_camera_resource_host_0,\r
61         .dev                    = {\r
62                 .dma_mask = &rockchip_device_camera_dmamask,\r
63                 .coherent_dma_mask = 0xffffffffUL,\r
64                 .platform_data  = &rk_camera_platform_data,\r
65         }\r
66 };\r
67 #endif\r
68 \r
69 #if RK_SUPPORT_CIF1\r
70 /*platform_device : */\r
71  struct platform_device rk_device_camera_host_1 = {\r
72         .name             = RK29_CAM_DRV_NAME,\r
73         .id       = RK_CAM_PLATFORM_DEV_ID_1,                           /* This is used to put cameras on this interface */\r
74         .num_resources    = ARRAY_SIZE(rk_camera_resource_host_1),\r
75         .resource         = rk_camera_resource_host_1,\r
76         .dev                    = {\r
77                 .dma_mask = &rockchip_device_camera_dmamask,\r
78                 .coherent_dma_mask = 0xffffffffUL,\r
79                 .platform_data  = &rk_camera_platform_data,\r
80         }\r
81 };\r
82 #endif\r
83 \r
84 static void rk_init_camera_plateform_data(void)\r
85 {\r
86     int i,dev_idx;\r
87     \r
88     dev_idx = 0;\r
89     for (i=0; i<RK_CAM_NUM; i++) {\r
90         rk_camera_platform_data.sensor_init_data[i] = &rk_init_data_sensor[i];\r
91         if (rk_camera_platform_data.register_dev[i].device_info.name) {            \r
92             rk_camera_platform_data.register_dev[i].link_info.board_info = \r
93                 &rk_camera_platform_data.register_dev[i].i2c_cam_info;\r
94             rk_camera_platform_data.register_dev[i].device_info.id = dev_idx;\r
95             rk_camera_platform_data.register_dev[i].device_info.dev.platform_data = \r
96                 &rk_camera_platform_data.register_dev[i].link_info;\r
97             dev_idx++;\r
98         }\r
99     }\r
100 }\r
101 \r
102 static void rk30_camera_request_reserve_mem(void)\r
103 {\r
104     int i,max_resolution;\r
105     int cam_ipp_mem=PMEM_CAMIPP_NECESSARY, cam_pmem=PMEM_CAM_NECESSARY;\r
106     \r
107     i =0;\r
108     max_resolution = 0x00;\r
109     while (strstr(new_camera[i].dev.device_info.dev.init_name,"end")==NULL) {\r
110         if (new_camera[i].resolution > max_resolution)\r
111             max_resolution = new_camera[i].resolution;\r
112         i++;\r
113     }\r
114 \r
115     if (max_resolution < PMEM_SENSOR_FULL_RESOLUTION_CIF_1)\r
116         max_resolution = PMEM_SENSOR_FULL_RESOLUTION_CIF_1;\r
117     if (max_resolution < PMEM_SENSOR_FULL_RESOLUTION_CIF_0)\r
118         max_resolution = PMEM_SENSOR_FULL_RESOLUTION_CIF_0;\r
119 \r
120     switch (max_resolution)\r
121     {\r
122         case 0x800000:\r
123         default:\r
124         {\r
125             cam_ipp_mem = 0x800000;\r
126             cam_pmem = 0x1900000;\r
127             break;\r
128         }\r
129 \r
130         case 0x500000:\r
131         {\r
132             cam_ipp_mem = 0x800000;\r
133             cam_pmem = 0x1400000;\r
134             break;\r
135         }\r
136 \r
137         case 0x300000:\r
138         {\r
139             cam_ipp_mem = 0x600000;\r
140             cam_pmem = 0xf00000;\r
141             break;\r
142         }\r
143 \r
144         case 0x200000:\r
145         {\r
146             cam_ipp_mem = 0x600000;\r
147             cam_pmem = 0xc00000;\r
148             break;\r
149         }\r
150 \r
151         case 0x100000:\r
152         {\r
153             cam_ipp_mem = 0x600000;\r
154             cam_pmem = 0xa00000;\r
155             break;\r
156         }\r
157 \r
158         case 0x30000:\r
159         {\r
160             cam_ipp_mem = 0x600000;\r
161             cam_pmem = 0x600000;\r
162             break;\r
163         }\r
164     }\r
165 \r
166  \r
167     rk_camera_platform_data.meminfo.vbase = rk_camera_platform_data.meminfo_cif1.vbase = NULL;\r
168 #if defined(CONFIG_VIDEO_RKCIF_WORK_SIMUL_OFF) || ((RK_SUPPORT_CIF0 && RK_SUPPORT_CIF1) == 0)\r
169     rk_camera_platform_data.meminfo.name = "camera_ipp_mem";\r
170     rk_camera_platform_data.meminfo.start = board_mem_reserve_add("camera_ipp_mem",cam_ipp_mem);\r
171     rk_camera_platform_data.meminfo.size= cam_ipp_mem;\r
172 \r
173     memcpy(&rk_camera_platform_data.meminfo_cif1,&rk_camera_platform_data.meminfo,sizeof(struct rk29camera_mem_res));\r
174 #else\r
175     rk_camera_platform_data.meminfo.name = "camera_ipp_mem_0";\r
176     rk_camera_platform_data.meminfo.start = board_mem_reserve_add("camera_ipp_mem_0",PMEM_CAMIPP_NECESSARY_CIF_0);\r
177     rk_camera_platform_data.meminfo.size= PMEM_CAMIPP_NECESSARY_CIF_0;\r
178 \r
179     rk_camera_platform_data.meminfo_cif1.name = "camera_ipp_mem_1";\r
180     rk_camera_platform_data.meminfo_cif1.start =board_mem_reserve_add("camera_ipp_mem_1",PMEM_CAMIPP_NECESSARY_CIF_1);\r
181     rk_camera_platform_data.meminfo_cif1.size= PMEM_CAMIPP_NECESSARY_CIF_1;\r
182 #endif\r
183 \r
184  #if PMEM_CAM_NECESSARY\r
185         android_pmem_cam_pdata.start = board_mem_reserve_add((char*)(android_pmem_cam_pdata.name),cam_pmem);\r
186         android_pmem_cam_pdata.size= cam_pmem;\r
187  #endif\r
188 \r
189 }\r
190 static int rk_register_camera_devices(void)\r
191 {\r
192     int i;\r
193     int host_registered_0,host_registered_1;\r
194     struct rkcamera_platform_data *new_camera;\r
195     \r
196         rk_init_camera_plateform_data();\r
197 \r
198     host_registered_0 = 0;\r
199     host_registered_1 = 0;\r
200     for (i=0; i<RK_CAM_NUM; i++) {\r
201         if (rk_camera_platform_data.register_dev[i].device_info.name) {\r
202             if (rk_camera_platform_data.register_dev[i].link_info.bus_id == RK_CAM_PLATFORM_DEV_ID_0) {\r
203             #if RK_SUPPORT_CIF0                \r
204                 host_registered_0 = 1;\r
205             #else\r
206                 printk(KERN_ERR "%s(%d) : This chip isn't support CIF0, Please user check ...\n",__FUNCTION__,__LINE__);\r
207             #endif\r
208             } \r
209 \r
210             if (rk_camera_platform_data.register_dev[i].link_info.bus_id == RK_CAM_PLATFORM_DEV_ID_1) {\r
211             #if RK_SUPPORT_CIF1\r
212                 host_registered_1 = 1;\r
213             #else\r
214                 printk(KERN_ERR "%s(%d) : This chip isn't support CIF1, Please user check ...\n",__FUNCTION__,__LINE__);\r
215             #endif\r
216             } \r
217         }\r
218     }\r
219 \r
220     \r
221     i=0;\r
222     new_camera = rk_camera_platform_data.register_dev_new;\r
223     if (new_camera != NULL) {\r
224         while (strstr(new_camera->dev.device_info.dev.init_name,"end")==NULL) {\r
225             if (new_camera->dev.link_info.bus_id == RK_CAM_PLATFORM_DEV_ID_1) {\r
226                 host_registered_1 = 1;\r
227             } else if (new_camera->dev.link_info.bus_id == RK_CAM_PLATFORM_DEV_ID_0) {\r
228                 host_registered_0 = 1;\r
229             }\r
230             new_camera++;\r
231         }\r
232     }\r
233     #if RK_SUPPORT_CIF0\r
234     if (host_registered_0) {\r
235         platform_device_register(&rk_device_camera_host_0);\r
236     }\r
237     #endif\r
238     #if RK_SUPPORT_CIF1\r
239     if (host_registered_1) {\r
240         platform_device_register(&rk_device_camera_host_1);\r
241     }  \r
242     #endif\r
243 \r
244     for (i=0; i<RK_CAM_NUM; i++) {\r
245         if (rk_camera_platform_data.register_dev[i].device_info.name) {\r
246             platform_device_register(&rk_camera_platform_data.register_dev[i].device_info);\r
247         }\r
248     }\r
249 \r
250     if (rk_camera_platform_data.sensor_register)\r
251        (rk_camera_platform_data.sensor_register)(); \r
252     \r
253  #if PMEM_CAM_NECESSARY\r
254     platform_device_register(&android_pmem_cam_device);\r
255  #endif\r
256     \r
257         return 0;\r
258 }\r
259 \r
260 module_init(rk_register_camera_devices);\r
261 #endif\r
262 \r
263 #endif //#ifdef CONFIG_VIDEO_RK\r