F304: add board & tp
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-rk3188 / board-rk3188m-f304-camera.c
1 #ifdef CONFIG_VIDEO_RK29
2 #include <plat/rk_camera.h>
3 /* Notes:
4
5 Simple camera device registration:
6
7        new_camera_device(sensor_name,\       // sensor name, it is equal to CONFIG_SENSOR_X
8                           face,\              // sensor face information, it can be back or front
9                           pwdn_io,\           // power down gpio configuration, it is equal to CONFIG_SENSOR_POWERDN_PIN_XX
10                           flash_attach,\      // sensor is attach flash or not
11                           mir,\               // sensor image mirror and flip control information
12                           i2c_chl,\           // i2c channel which the sensor attached in hardware, it is equal to CONFIG_SENSOR_IIC_ADAPTER_ID_X
13                           cif_chl)  \         // cif channel which the sensor attached in hardware, it is equal to CONFIG_SENSOR_CIF_INDEX_X
14
15 Comprehensive camera device registration:
16
17       new_camera_device_ex(sensor_name,\
18                              face,\
19                              ori,\            // sensor orientation, it is equal to CONFIG_SENSOR_ORIENTATION_X
20                              pwr_io,\         // sensor power gpio configuration, it is equal to CONFIG_SENSOR_POWER_PIN_XX
21                              pwr_active,\     // sensor power active level, is equal to CONFIG_SENSOR_RESETACTIVE_LEVEL_X
22                              rst_io,\         // sensor reset gpio configuration, it is equal to CONFIG_SENSOR_RESET_PIN_XX
23                              rst_active,\     // sensor reset active level, is equal to CONFIG_SENSOR_RESETACTIVE_LEVEL_X
24                              pwdn_io,\
25                              pwdn_active,\    // sensor power down active level, is equal to CONFIG_SENSOR_POWERDNACTIVE_LEVEL_X
26                              flash_attach,\
27                              res,\            // sensor resolution, this is real resolution or resoltuion after interpolate
28                              mir,\
29                              i2c_chl,\
30                              i2c_spd,\        // i2c speed , 100000 = 100KHz
31                              i2c_addr,\       // the i2c slave device address for sensor
32                              cif_chl,\
33                              mclk)\           // sensor input clock rate, 24 or 48
34                           
35 */
36 static struct rkcamera_platform_data new_camera[] = { 
37
38     new_camera_device(RK29_CAM_SENSOR_NT99340,
39                         back,
40                         RK30_PIN3_PB5,
41                         0,
42                         0,
43                         3,
44                         0),
45     new_camera_device(RK29_CAM_SENSOR_NT99252,
46                         front,
47                         RK30_PIN3_PB4,
48                         0,
49                         0,
50                         3,
51                         0),                        
52     new_camera_device_end  
53 };
54
55 #endif  //#ifdef CONFIG_VIDEO_RK29
56 /*---------------- Camera Sensor Configuration Macro End------------------------*/
57 #include "../../../drivers/media/video/rk30_camera.c"
58 /*---------------- Camera Sensor Macro Define End  ---------*/
59
60 #define PMEM_CAM_SIZE PMEM_CAM_NECESSARY
61 /*****************************************************************************************
62  * camera  devices
63  * author: ddl@rock-chips.com
64  *****************************************************************************************/
65 #ifdef CONFIG_VIDEO_RK29
66 #define CONFIG_SENSOR_POWER_IOCTL_USR      1 //define this refer to your board layout
67 #define CONFIG_SENSOR_RESET_IOCTL_USR      0
68 #define CONFIG_SENSOR_POWERDOWN_IOCTL_USR          0
69 #define CONFIG_SENSOR_FLASH_IOCTL_USR      0
70
71 static void rk_cif_power(struct rk29camera_gpio_res *res,int on)
72 {
73         struct regulator *ldo_18,*ldo_28;
74         int camera_power = res->gpio_power;
75           int camera_ioflag = res->gpio_flag;
76           int camera_io_init = res->gpio_init;
77           
78         ldo_28 = regulator_get(NULL, "ricoh_ldo4");     // vcc28_cif
79         ldo_18 = regulator_get(NULL, "ricoh_ldo5");     // vcc18_cif
80         if (ldo_28 == NULL || IS_ERR(ldo_28) || ldo_18 == NULL || IS_ERR(ldo_18)){
81                 printk("get cif ldo failed!\n");
82                 return;
83                 }
84         if(on == 0){
85                 while(regulator_is_enabled(ldo_28)>0)   
86                         regulator_disable(ldo_28);
87                 regulator_put(ldo_28);
88                 while(regulator_is_enabled(ldo_18)>0)
89                         regulator_disable(ldo_18);
90                 regulator_put(ldo_18);
91                 mdelay(10);
92         if (camera_power != INVALID_GPIO)  {
93                   if (camera_io_init & RK29_CAM_POWERACTIVE_MASK) {
94                           gpio_set_value(camera_power, (((~camera_ioflag)&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));
95                         //      dprintk("%s..%s..PowerPin=%d ..PinLevel = %x     \n",__FUNCTION__,res->dev_name, camera_power, (((~camera_ioflag)&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));
96                         }
97                 }
98         }
99         else{
100                 regulator_set_voltage(ldo_28, 2800000, 2800000);
101                 regulator_enable(ldo_28);
102                 printk("%s set vcc28_cif=%dmV end\n", __func__, regulator_get_voltage(ldo_28));
103                 regulator_put(ldo_28);
104
105                 regulator_set_voltage(ldo_18, 1800000, 1800000);
106         //      regulator_set_suspend_voltage(ldo, 1800000);
107                 regulator_enable(ldo_18);
108                 printk("%s set vcc18_cif=%dmV end\n", __func__, regulator_get_voltage(ldo_18));
109                 regulator_put(ldo_18);
110         if (camera_power != INVALID_GPIO)  {
111                   if (camera_io_init & RK29_CAM_POWERACTIVE_MASK) {
112                         gpio_set_value(camera_power, ((camera_ioflag&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));
113                         //dprintk("%s..%s..PowerPin=%d ..PinLevel = %x   \n",__FUNCTION__,res->dev_name, camera_power, ((camera_ioflag&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));
114                         mdelay(10);
115                         }
116         }
117
118         }
119 }
120
121 #if CONFIG_SENSOR_POWER_IOCTL_USR
122 static int sensor_power_usr_cb (struct rk29camera_gpio_res *res,int on)
123 {
124         //#error "CONFIG_SENSOR_POWER_IOCTL_USR is 1, sensor_power_usr_cb function must be writed!!";
125         rk_cif_power(res,on);
126         return 0;
127 }
128 #endif
129
130 #if CONFIG_SENSOR_FLASH_IOCTL_USR
131 static int sensor_flash_usr_cb (struct rk29camera_gpio_res *res,int on)
132 {
133         #error "CONFIG_SENSOR_FLASH_IOCTL_USR is 1, sensor_flash_usr_cb function must be writed!!";
134 }
135 #endif
136
137 static struct rk29camera_platform_ioctl_cb      sensor_ioctl_cb = {
138         #if CONFIG_SENSOR_POWER_IOCTL_USR
139         .sensor_power_cb = sensor_power_usr_cb,
140         #else
141         .sensor_power_cb = NULL,
142         #endif
143
144         #if CONFIG_SENSOR_RESET_IOCTL_USR
145         .sensor_reset_cb = sensor_reset_usr_cb,
146         #else
147         .sensor_reset_cb = NULL,
148         #endif
149
150         #if CONFIG_SENSOR_POWERDOWN_IOCTL_USR
151         .sensor_powerdown_cb = sensor_powerdown_usr_cb,
152         #else
153         .sensor_powerdown_cb = NULL,
154         #endif
155
156         #if CONFIG_SENSOR_FLASH_IOCTL_USR
157         .sensor_flash_cb = sensor_flash_usr_cb,
158         #else
159         .sensor_flash_cb = NULL,
160         #endif
161 };
162
163
164 static rk_sensor_user_init_data_s rk_init_data_sensor[RK_CAM_NUM] = 
165 {
166     #if CONFIG_SENSOR_IIC_ADDR_0
167     {
168        .rk_sensor_init_width = INVALID_VALUE,
169        .rk_sensor_init_height = INVALID_VALUE,
170        .rk_sensor_init_bus_param = INVALID_VALUE,
171        .rk_sensor_init_pixelcode = INVALID_VALUE,
172        .rk_sensor_init_data = rk_init_data_sensor_reg_0,
173        .rk_sensor_init_winseq = rk_init_data_sensor_winseqreg_0,
174        .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_0) / sizeof(struct reginfo_t),
175        .rk_sensor_init_data_size = sizeof(rk_init_data_sensor_reg_0) / sizeof(struct reginfo_t),
176     },
177     #else
178     {
179        .rk_sensor_init_width = INVALID_VALUE,
180        .rk_sensor_init_height = INVALID_VALUE,
181        .rk_sensor_init_bus_param = INVALID_VALUE,
182        .rk_sensor_init_pixelcode = INVALID_VALUE,
183        .rk_sensor_init_data = NULL,
184        .rk_sensor_init_winseq = NULL,
185        .rk_sensor_winseq_size = 0,
186        .rk_sensor_init_data_size = 0,
187     },
188     #endif
189     #if CONFIG_SENSOR_IIC_ADDR_1
190     {
191        .rk_sensor_init_width = INVALID_VALUE,
192        .rk_sensor_init_height = INVALID_VALUE,
193        .rk_sensor_init_bus_param = INVALID_VALUE,
194        .rk_sensor_init_pixelcode = INVALID_VALUE,
195        .rk_sensor_init_data = rk_init_data_sensor_reg_1,
196        .rk_sensor_init_winseq = rk_init_data_sensor_winseqreg_1,
197        .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_1) / sizeof(struct reginfo_t),
198        .rk_sensor_init_data_size = sizeof(rk_init_data_sensor_reg_1) / sizeof(struct reginfo_t),
199     },
200     #else
201     {
202        .rk_sensor_init_width = INVALID_VALUE,
203        .rk_sensor_init_height = INVALID_VALUE,
204        .rk_sensor_init_bus_param = INVALID_VALUE,
205        .rk_sensor_init_pixelcode = INVALID_VALUE,
206        .rk_sensor_init_data = NULL,
207        .rk_sensor_init_winseq = NULL,
208        .rk_sensor_winseq_size = 0,
209        .rk_sensor_init_data_size = 0,
210     },
211     #endif
212     #if CONFIG_SENSOR_IIC_ADDR_01
213     {
214        .rk_sensor_init_width = INVALID_VALUE,
215        .rk_sensor_init_height = INVALID_VALUE,
216        .rk_sensor_init_bus_param = INVALID_VALUE,
217        .rk_sensor_init_pixelcode = INVALID_VALUE,
218        .rk_sensor_init_data = rk_init_data_sensor_reg_01,
219        .rk_sensor_init_winseq = rk_init_data_sensor_winseqreg_01,
220        .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_01) / sizeof(struct reginfo_t),
221        .rk_sensor_init_data_size = sizeof(rk_init_data_sensor_reg_01) / sizeof(struct reginfo_t),
222     },
223     #else
224     {
225        .rk_sensor_init_width = INVALID_VALUE,
226        .rk_sensor_init_height = INVALID_VALUE,
227        .rk_sensor_init_bus_param = INVALID_VALUE,
228        .rk_sensor_init_pixelcode = INVALID_VALUE,
229        .rk_sensor_init_data = NULL,
230        .rk_sensor_init_winseq = NULL,
231        .rk_sensor_winseq_size = 0,
232        .rk_sensor_init_data_size = 0,
233     },
234     #endif
235     #if CONFIG_SENSOR_IIC_ADDR_02
236     {
237        .rk_sensor_init_width = INVALID_VALUE,
238        .rk_sensor_init_height = INVALID_VALUE,
239        .rk_sensor_init_bus_param = INVALID_VALUE,
240        .rk_sensor_init_pixelcode = INVALID_VALUE,
241        .rk_sensor_init_data = rk_init_data_sensor_reg_02,
242        .rk_sensor_init_winseq = rk_init_data_sensor_winseqreg_02,
243        .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_02) / sizeof(struct reginfo_t),
244        .rk_sensor_init_data_size = sizeof(rk_init_data_sensor_reg_02) / sizeof(struct reginfo_t),
245     },
246     #else
247     {
248        .rk_sensor_init_width = INVALID_VALUE,
249        .rk_sensor_init_height = INVALID_VALUE,
250        .rk_sensor_init_bus_param = INVALID_VALUE,
251        .rk_sensor_init_pixelcode = INVALID_VALUE,
252        .rk_sensor_init_data = NULL,
253        .rk_sensor_init_winseq = NULL,
254        .rk_sensor_winseq_size = 0,
255        .rk_sensor_init_data_size = 0,
256     },
257     #endif
258     #if CONFIG_SENSOR_IIC_ADDR_11
259     {
260        .rk_sensor_init_width = INVALID_VALUE,
261        .rk_sensor_init_height = INVALID_VALUE,
262        .rk_sensor_init_bus_param = INVALID_VALUE,
263        .rk_sensor_init_pixelcode = INVALID_VALUE,
264        .rk_sensor_init_data = rk_init_data_sensor_reg_11,
265        .rk_sensor_init_winseq = rk_init_data_sensor_winseqreg_11,
266        .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_11) / sizeof(struct reginfo_t),
267        .rk_sensor_init_data_size = sizeof(rk_init_data_sensor_reg_11) / sizeof(struct reginfo_t),
268     },
269     #else
270     {
271        .rk_sensor_init_width = INVALID_VALUE,
272        .rk_sensor_init_height = INVALID_VALUE,
273        .rk_sensor_init_bus_param = INVALID_VALUE,
274        .rk_sensor_init_pixelcode = INVALID_VALUE,
275        .rk_sensor_init_data = NULL,
276        .rk_sensor_init_winseq = NULL,
277        .rk_sensor_winseq_size = 0,
278        .rk_sensor_init_data_size = 0,
279     },
280     #endif
281     #if CONFIG_SENSOR_IIC_ADDR_12
282     {
283        .rk_sensor_init_width = INVALID_VALUE,
284        .rk_sensor_init_height = INVALID_VALUE,
285        .rk_sensor_init_bus_param = INVALID_VALUE,
286        .rk_sensor_init_pixelcode = INVALID_VALUE,
287        .rk_sensor_init_data = rk_init_data_sensor_reg_12,
288        .rk_sensor_init_winseq = rk_init_data_sensor_winseqreg_12,
289        .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_12) / sizeof(struct reginfo_t),
290        .rk_sensor_init_data_size = sizeof(rk_init_data_sensor_reg_12) / sizeof(struct reginfo_t),
291     },
292     #else
293     {
294        .rk_sensor_init_width = INVALID_VALUE,
295        .rk_sensor_init_height = INVALID_VALUE,
296        .rk_sensor_init_bus_param = INVALID_VALUE,
297        .rk_sensor_init_pixelcode = INVALID_VALUE,
298        .rk_sensor_init_data = NULL,
299        .rk_sensor_init_winseq = NULL,
300        .rk_sensor_winseq_size = 0,
301        .rk_sensor_init_data_size = 0,
302     },
303     #endif
304
305  };
306 #include "../../../drivers/media/video/rk30_camera.c"
307
308 #endif /* CONFIG_VIDEO_RK29 */