2 * Copyright (C) 2012 Spreadtrum Communications Inc.
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
14 #include <linux/uaccess.h>
15 #include <linux/sprd_mm.h>
16 #include <video/sprd_isp.h>
19 static int32_t isp_k_common_block(struct isp_io_param *param)
22 struct isp_dev_common_info_v1 common_info;
24 memset(&common_info, 0x00, sizeof(common_info));
26 ret = copy_from_user((void *)&common_info, param->property_param, sizeof(common_info));
28 printk("isp_k_common_block: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
32 REG_MWR(ISP_COMMON_CTRL_CH0, 3, common_info.fetch_sel_0);
33 REG_MWR(ISP_COMMON_CTRL_CH0, 3 << 4, common_info.sizer_sel_0 << 4);
34 REG_MWR(ISP_COMMON_CTRL_CH0, 3 << 16, common_info.store_sel_0 << 16);
35 REG_MWR(ISP_COMMON_CTRL_CH1, 3, common_info.fetch_sel_1);
36 REG_MWR(ISP_COMMON_CTRL_CH1, 3 << 4, common_info.sizer_sel_1 << 4);
37 REG_MWR(ISP_COMMON_CTRL_CH1, 3 << 16, common_info.store_sel_1 << 16);
38 REG_MWR(ISP_COMMON_SPACE_SEL, 3 , common_info.fetch_color_format) ;
39 REG_MWR(ISP_COMMON_SPACE_SEL, 3 << 2, common_info.store_color_format << 2) ;
40 REG_MWR(ISP_COMMON_CTRL_AWBM, BIT_0 , common_info.awbm_pos) ;
41 REG_MWR(ISP_COMMON_3A_CTRL0, 3, common_info.y_afm_pos_0);
42 REG_MWR(ISP_COMMON_3A_CTRL0, 3 << 4, common_info.y_aem_pos_0 << 4);
43 REG_MWR(ISP_COMMON_3A_CTRL1, 3, common_info.y_afm_pos_1);
44 REG_MWR(ISP_COMMON_3A_CTRL1, 3 << 4, common_info.y_aem_pos_1 << 4);
45 REG_WR(ISP_COMMON_LBUF_OFFSET0, ((common_info.lbuf_off.cfae_lbuf_offset & 0xFFFF) << 16 ) | (common_info.lbuf_off.comm_lbuf_offset & 0xFFFF));
46 REG_WR(ISP_COMMON_LBUF_OFFSET1, ((common_info.lbuf_off.ydly_lbuf_offset& 0xFFFF) << 16 ) | (common_info.lbuf_off.awbm_lbuf_offset & 0xFFFF));
51 static int32_t isp_k_common_version(struct isp_io_param *param)
56 version = REG_RD(ISP_COMMON_VERSION);
58 ret = copy_to_user(param->property_param, (void*)&version, sizeof(version));
61 printk("isp_k_common_version: copy_to_user error, ret = 0x%x\n", (uint32_t)ret);
67 static int32_t isp_k_common_status0(struct isp_io_param *param)
72 status = REG_RD(ISP_COMMON_STATUS0);
74 ret = copy_to_user(param->property_param, (void*)&status, sizeof(status));
77 printk("isp_k_common_status0: copy_to_user error, ret = 0x%x\n", (uint32_t)ret);
83 static int32_t isp_k_common_status1(struct isp_io_param *param)
88 status = REG_RD(ISP_COMMON_STATUS1);
90 ret = copy_to_user(param->property_param, (void*)&status, sizeof(status));
93 printk("isp_k_common_status1: copy_to_user error, ret = 0x%x\n", (uint32_t)ret);
99 static int32_t isp_k_common_channel0_fetch_sel(struct isp_io_param *param)
102 uint32_t fetch_sel = 0;
104 ret = copy_from_user((void *)&fetch_sel, param->property_param, sizeof(fetch_sel));
106 printk("isp_k_channel0_fetch_sel: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
110 REG_MWR(ISP_COMMON_CTRL_CH0, 3, fetch_sel);
115 static int32_t isp_k_common_channel0_sizer_sel(struct isp_io_param *param)
118 uint32_t sizer_sel = 0;
120 ret = copy_from_user((void *)&sizer_sel, param->property_param, sizeof(sizer_sel));
122 printk("isp_k_channel0_sizer_sel: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
126 REG_MWR(ISP_COMMON_CTRL_CH0, 3 << 4, sizer_sel << 4);
131 static int32_t isp_k_common_channel0_store_sel(struct isp_io_param *param)
134 uint32_t store_sel = 0;
136 ret = copy_from_user((void *)&store_sel, param->property_param, sizeof(store_sel));
138 printk("isp_k_common_channel0_store_sel: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
142 REG_MWR(ISP_COMMON_CTRL_CH0, 3 << 16, store_sel << 16);
147 static int32_t isp_k_common_channel1_fetch_sel(struct isp_io_param *param)
150 uint32_t fetch_sel = 0;
152 ret = copy_from_user((void *)&fetch_sel, param->property_param, sizeof(fetch_sel));
154 printk("isp_k_channel1_fetch_sel: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
158 REG_MWR(ISP_COMMON_CTRL_CH1, 3, fetch_sel);
163 static int32_t isp_k_common_channel1_sizer_sel(struct isp_io_param *param)
166 uint32_t sizer_sel = 0;
168 ret = copy_from_user((void *)&sizer_sel, param->property_param, sizeof(sizer_sel));
170 printk("isp_k_common_channel1_sizer_sel: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
174 REG_MWR(ISP_COMMON_CTRL_CH1, 3 << 4, sizer_sel << 4);
179 static int32_t isp_k_common_channel1_store_sel(struct isp_io_param *param)
182 uint32_t store_sel = 0;
184 ret = copy_from_user((void *)&store_sel, param->property_param, sizeof(store_sel));
186 printk("isp_k_common_channel1_store_sel: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
190 REG_MWR(ISP_COMMON_CTRL_CH1, 3 << 16, store_sel << 16);
195 static int32_t isp_k_common_fetch_color_space_sel(struct isp_io_param *param)
198 uint32_t color_space = 0;
200 ret = copy_from_user((void *)&color_space, param->property_param, sizeof(color_space));
202 printk("isp_k_common_fetch_color_space_sel: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
206 REG_MWR(ISP_COMMON_SPACE_SEL, 3 , color_space) ;
211 static int32_t isp_k_common_store_color_space_sel(struct isp_io_param *param)
214 uint32_t color_space = 0;
216 ret = copy_from_user((void *)&color_space, param->property_param, sizeof(color_space));
218 printk("isp_k_common_store_color_space_sel: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
222 REG_MWR(ISP_COMMON_SPACE_SEL, 3 << 2, color_space << 2) ;
227 static int32_t isp_k_common_awbm_pos_sel(struct isp_io_param *param)
230 uint32_t awbm_pos = 0;
232 ret = copy_from_user((void *)&awbm_pos, param->property_param, sizeof(awbm_pos));
234 printk("isp_k_common_awbm_pos_sel: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
238 REG_MWR(ISP_COMMON_CTRL_AWBM, BIT_0 , awbm_pos) ;
243 static int32_t isp_k_common_channel0_y_afm_pos(struct isp_io_param *param)
246 uint32_t position = 0;
248 ret = copy_from_user((void *)&position, param->property_param, sizeof(position));
250 printk("isp_k_common_channel0_y_afm_pos: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
254 REG_MWR(ISP_COMMON_3A_CTRL0, 3, position);
259 static int32_t isp_k_common_channel0_y_aem_pos(struct isp_io_param *param)
262 uint32_t position = 0;
264 ret = copy_from_user((void *)&position, param->property_param, sizeof(position));
266 printk("isp_k_common_channel0_y_aem_pos: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
270 REG_MWR(ISP_COMMON_3A_CTRL0, 3 << 4, position << 4);
275 static int32_t isp_k_common_channel1_y_afm_pos(struct isp_io_param *param)
278 uint32_t position = 0;
280 ret = copy_from_user((void *)&position, param->property_param, sizeof(position));
282 printk("isp_k_common_channel1_y_afm_pos: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
286 REG_MWR(ISP_COMMON_3A_CTRL1, 3, position);
291 static int32_t isp_k_common_channel1_y_aem_pos(struct isp_io_param *param)
294 uint32_t position = 0;
296 ret = copy_from_user((void *)&position, param->property_param, sizeof(position));
298 printk("isp_k_common_channel1_y_aem_pos: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
302 REG_MWR(ISP_COMMON_3A_CTRL1, 3 << 4, position << 4);
307 static int32_t isp_k_common_lbuf_offset(struct isp_io_param *param)
310 struct isp_common_lbuf_param_v1 lbuf_off;
312 memset(&lbuf_off, 0x00, sizeof(lbuf_off));
313 ret = copy_from_user((void *)&lbuf_off, param->property_param, sizeof(lbuf_off));
315 printk("isp_k_common_lbuf_offset: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
319 REG_WR(ISP_COMMON_LBUF_OFFSET0, ((lbuf_off.cfae_lbuf_offset & 0xFFFF) << 16 ) | (lbuf_off.comm_lbuf_offset & 0xFFFF));
320 REG_WR(ISP_COMMON_LBUF_OFFSET1, ((lbuf_off.ydly_lbuf_offset& 0xFFFF) << 16 ) | (lbuf_off.awbm_lbuf_offset & 0xFFFF));
325 static int32_t isp_k_all_shadow_ctrl(struct isp_io_param *param)
328 uint32_t auto_shadow = 0;
330 ret = copy_from_user((void *)&auto_shadow, param->property_param, sizeof(auto_shadow));
332 printk("isp_k_all_shadow_ctrl: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
336 REG_MWR(ISP_SHADOW_CTRL_CH0, 1 << 16, auto_shadow << 16);
341 static int32_t isp_k_awbm_shadow_ctrl(struct isp_io_param *param)
344 uint32_t shadow_done = 0;
346 ret = copy_from_user((void *)&shadow_done, param->property_param, sizeof(shadow_done));
348 printk("isp_k_awbm_shadow_ctrl: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
352 REG_MWR(ISP_SHADOW_CTRL_CH0, 1 << 17, shadow_done << 17);
357 static int32_t isp_k_ae_shadow_ctrl(struct isp_io_param *param)
360 uint32_t shadow_done = 0;
362 ret = copy_from_user((void *)&shadow_done, param->property_param, sizeof(shadow_done));
364 printk("isp_k_ae_shadow_ctrl: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
368 REG_MWR(ISP_SHADOW_CTRL_CH0, 1 << 18, shadow_done << 18);
373 static int32_t isp_k_af_shadow_ctrl(struct isp_io_param *param)
376 uint32_t shadow_done = 0;
378 ret = copy_from_user((void *)&shadow_done, param->property_param, sizeof(shadow_done));
380 printk("isp_k_af_shadow_ctrl: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
384 REG_MWR(ISP_SHADOW_CTRL_CH0, 1 << 19, shadow_done << 19);
389 static int32_t isp_k_afl_shadow_ctrl(struct isp_io_param *param)
392 uint32_t shadow_done = 0;
394 ret = copy_from_user((void *)&shadow_done, param->property_param, sizeof(shadow_done));
396 printk("isp_k_afl_shadow_ctrl: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
400 REG_MWR(ISP_SHADOW_CTRL_CH0, 1 << 20, shadow_done << 20);
405 static int32_t isp_k_comm_shadow_ctrl(struct isp_io_param *param)
408 uint32_t shadow_done = 0;
410 ret = copy_from_user((void *)&shadow_done, param->property_param, sizeof(shadow_done));
412 printk("isp_k_comm_shadow_ctrl: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
416 REG_MWR(ISP_SHADOW_CTRL_CH0, 1 << 21, shadow_done << 21);
421 static int32_t isp_k_3a_shadow_ctrl(struct isp_io_param *param)
426 ret = copy_from_user((void *)&enable, param->property_param, sizeof(enable));
428 printk("isp_k_3a_shadow_ctrl: copy_from_user error, ret = 0x%x\n", (uint32_t)ret);
432 REG_MWR(ISP_COMMON_RESERVED0, 1 << 2, enable << 2);
437 int32_t isp_k_cfg_common(struct isp_io_param *param)
442 printk("isp_k_cfg_common: param is null error.\n");
446 if (NULL == param->property_param) {
447 printk("isp_k_cfg_common: property_param is null error.\n");
451 switch (param->property) {
452 case ISP_PRO_COMMON_BLOCK:
453 ret = isp_k_common_block(param);
455 case ISP_PRO_COMMON_VERSION:
456 ret = isp_k_common_version(param);
458 case ISP_PRO_COMMON_STATUS0:
459 ret = isp_k_common_status0(param);
461 case ISP_PRO_COMMON_STATUS1:
462 ret = isp_k_common_status1(param);
464 case ISP_PRO_COMMON_CH0_FETCH_SEL:
465 ret = isp_k_common_channel0_fetch_sel(param);
467 case ISP_PRO_COMMON_CH0_SIZER_SEL:
468 ret = isp_k_common_channel0_sizer_sel(param);
470 case ISP_PRO_COMMON_CH0_STORE_SEL:
471 ret = isp_k_common_channel0_store_sel(param);
473 case ISP_PRO_COMMON_CH1_FETCH_SEL:
474 ret = isp_k_common_channel1_fetch_sel(param);
476 case ISP_PRO_COMMON_CH1_SIZER_SEL:
477 ret = isp_k_common_channel1_sizer_sel(param);
479 case ISP_PRO_COMMON_CH1_STORE_SEL:
480 ret = isp_k_common_channel1_store_sel(param);
482 case ISP_PRO_COMMON_FETCH_COLOR_SPACE_SEL:
483 ret = isp_k_common_fetch_color_space_sel(param);
485 case ISP_PRO_COMMON_STORE_COLOR_SPACE_SEL:
486 ret = isp_k_common_store_color_space_sel(param);
488 case ISP_PRO_COMMON_AWBM_POS_SEL:
489 ret = isp_k_common_awbm_pos_sel(param);
491 case ISP_PRO_COMMON_CH0_AEM2_POS:
492 ret = isp_k_common_channel0_y_aem_pos(param);
494 case ISP_PRO_COMMON_CH0_Y_AFM_POS:
495 ret = isp_k_common_channel0_y_afm_pos(param);
497 case ISP_PRO_COMMON_CH1_AEM2_POS:
498 ret = isp_k_common_channel1_y_aem_pos(param);
500 case ISP_PRO_COMMON_CH1_Y_AFM_POS:
501 ret = isp_k_common_channel1_y_afm_pos(param);
503 case ISP_PRO_COMMON_LBUF_OFFSET:
504 ret = isp_k_common_lbuf_offset(param);
506 case ISP_PRO_COMMON_SHADOW_ALL_CTRL:
507 ret = isp_k_all_shadow_ctrl(param);
509 case ISP_PRO_COMMON_AWBM_SHADOW:
510 ret = isp_k_awbm_shadow_ctrl(param);
512 case ISP_PRO_COMMON_AE_SHADOW:
513 ret = isp_k_ae_shadow_ctrl(param);
515 case ISP_PRO_COMMON_AF_SHADOW:
516 ret = isp_k_af_shadow_ctrl(param);
518 case ISP_PRO_COMMON_AFL_SHADOW:
519 ret = isp_k_afl_shadow_ctrl(param);
521 case ISP_PRO_COMMON_COMM_SHADOW:
522 ret = isp_k_comm_shadow_ctrl(param);
524 case ISP_PRO_COMMON_3A_SINGLE_FRAME_CTRL:
525 ret = isp_k_3a_shadow_ctrl(param);
528 printk("isp_k_cfg_common: fail cmd id:%d, not supported.\n", param->property);