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>
17 #include "isp_block.h"
19 typedef int32_t (*isp_cfg_fun_ptr)(struct isp_io_param *isp_param);
23 isp_cfg_fun_ptr cfg_fun;
26 static struct isp_cfg_fun isp_cfg_fun_tab[] = {
27 {ISP_BLOCK_PRE_GLB_GAIN, isp_k_cfg_pgg},
28 {ISP_BLOCK_BLC, isp_k_cfg_blc},
29 {ISP_BLOCK_RGB_GAIN, isp_k_cfg_rgb_gain},
30 {ISP_BLOCK_PRE_WAVELET, isp_k_cfg_pwd},
31 {ISP_BLOCK_NLC, isp_k_cfg_nlc},
32 /*{ISP_BLOCK_2D_LSC, isp_k_cfg_2d_lsc},*/
33 {ISP_BLOCK_1D_LSC, isp_k_cfg_1d_lsc},
34 /*{ISP_BLOCK_BINNING4AWB, isp_k_cfg_binning},*/
35 /*{ISP_BLOCK_AWB, isp_k_cfg_awb},*/
36 /*{ISP_BLOCK_RAW_AEM, isp_k_cfg_raw_aem},*/
37 {ISP_BLOCK_BPC, isp_k_cfg_bpc},
38 {ISP_BLOCK_BDN, isp_k_cfg_bdn},
39 {ISP_BLOCK_GRGB, isp_k_cfg_grgb},
40 {ISP_BLOCK_RGB_GAIN2, isp_k_cfg_rgb_gain2},
41 {ISP_BLOCK_NLM, isp_k_cfg_nlm},
42 {ISP_BLOCK_CFA, isp_k_cfg_cfa},
43 {ISP_BLOCK_CMC, isp_k_cfg_cmc10},
44 {ISP_BLOCK_HDR, isp_k_cfg_hdr},//pike add module,this module is same to sharkl's hdr module
45 /*{ISP_BLOCK_GAMMA, isp_k_cfg_gamma},*/
46 {ISP_BLOCK_CMC8, isp_k_cfg_cmc8},
47 /*{ISP_BLOCK_CT, isp_k_cfg_ct},*/
48 {ISP_BLOCK_CCE, isp_k_cfg_cce},
49 {ISP_BLOCK_HSV, isp_k_cfg_hsv},
50 {ISP_BLOCK_CSC, isp_k_cfg_csc},
51 {ISP_BLOCK_PRE_CDN_RGB, isp_k_cfg_pre_cdn_rgb},
52 {ISP_BLOCK_POSTERIZE, isp_k_cfg_posterize},
53 {ISP_BLOCK_AFM_V1, isp_k_cfg_rgb_afm},
54 {ISP_BLOCK_RGB2Y, isp_k_cfg_rgb2y},//pike add module
55 {ISP_BLOCK_YIQ_AEM, isp_k_cfg_yiq_aem},
56 /*{ISP_BLOCK_ANTI_FLICKER, isp_k_cfg_anti_flicker},*/
57 {ISP_BLOCK_YIQ_AFM, isp_k_cfg_yiq_afm},
58 {ISP_BLOCK_YUV_PRECDN, isp_k_cfg_yuv_precdn},
59 {ISP_BLOCK_PRE_FILTER, isp_k_cfg_prefilter},
60 {ISP_BLOCK_UV_PREFILTER, isp_k_cfg_uv_prefilter},//pike add module
61 {ISP_BLOCK_BRIGHTNESS, isp_k_cfg_brightness},
62 {ISP_BLOCK_CONTRAST, isp_k_cfg_contrast},
63 {ISP_BLOCK_HIST, isp_k_cfg_hist},
64 {ISP_BLOCK_HIST2, isp_k_cfg_hist2},
65 {ISP_BLOCK_ACA, isp_k_cfg_aca},
66 {ISP_BLOCK_YUV_CDN, isp_k_cfg_yuv_cdn},
67 {ISP_BLOCK_EDGE, isp_k_cfg_edge},
68 {ISP_BLOCK_CSS, isp_k_cfg_css},
69 {ISP_BLOCK_CSA, isp_k_cfg_csa},
70 {ISP_BLOCK_HUE, isp_k_cfg_hue},
71 {ISP_BLOCK_POST_CDN, isp_k_cfg_post_cdn},
72 {ISP_BLOCK_EMBOSS, isp_k_cfg_emboss},
73 /*{ISP_BLOCK_YGAMMA, isp_k_cfg_ygamma},*/
74 {ISP_BLOCK_YDELAY, isp_k_cfg_ydelay},
75 {ISP_BLOCK_YUV_NLM, isp_k_cfg_yuv_nlm},//pike add module
76 //{ISP_BLOCK_IIRCNR, isp_k_cfg_iircnr},//pike has no this module
77 {ISP_BLOCK_FETCH, isp_k_cfg_fetch},
78 {ISP_BLOCK_STORE, isp_k_cfg_store},
79 {ISP_BLOCK_DISPATCH, isp_k_cfg_dispatch},
80 {ISP_BLOCK_ARBITER_V1, isp_k_cfg_arbiter},
81 //{ISP_BLOCK_RAW_SIZER, isp_k_cfg_raw_sizer},//pike has no this module
82 {ISP_BLOCK_COMMON_V1, isp_k_cfg_common},
85 int32_t isp_cfg_param(void *param, struct isp_k_private *isp_private)
88 uint32_t i = 0, cnt = 0;
89 isp_cfg_fun_ptr cfg_fun_ptr = NULL;
90 struct isp_io_param isp_param = {0, 0, 0, NULL};
93 printk("isp_cfg_param: param is null error.\n");
97 ret = copy_from_user((void *)&isp_param, (void *)param, sizeof(isp_param));
99 printk("isp_cfg_param: copy error, ret = 0x%x\n", (uint32_t)ret);
103 if (ISP_BLOCK_ANTI_FLICKER == isp_param.sub_block) {
104 ret = isp_k_cfg_anti_flicker(&isp_param, isp_private);
105 } else if (ISP_BLOCK_2D_LSC == isp_param.sub_block) {
106 ret = isp_k_cfg_2d_lsc(&isp_param, isp_private);
107 } else if (ISP_BLOCK_RAW_AEM == isp_param.sub_block) {
108 ret = isp_k_cfg_raw_aem(&isp_param, isp_private);
109 } else if (ISP_BLOCK_GAMMA == isp_param.sub_block) {
110 ret = isp_k_cfg_gamma(&isp_param, isp_private);
111 } else if (ISP_BLOCK_CT == isp_param.sub_block) {
112 ret = isp_k_cfg_ct(&isp_param, isp_private);
113 } else if (ISP_BLOCK_YGAMMA == isp_param.sub_block) {
114 ret = isp_k_cfg_ygamma(&isp_param, isp_private);
115 } else if (ISP_BLOCK_AWB == isp_param.sub_block) {
116 ret = isp_k_cfg_awb(&isp_param, isp_private);
117 } else if(ISP_BLOCK_BINNING4AWB == isp_param.sub_block){
118 ret = isp_k_cfg_binning(&isp_param, isp_private);
120 cnt = sizeof(isp_cfg_fun_tab) / sizeof(isp_cfg_fun_tab[0]);
121 for (i = 0; i < cnt; i++) {
122 if (isp_param.sub_block == isp_cfg_fun_tab[i].sub_block) {
123 cfg_fun_ptr = isp_cfg_fun_tab[i].cfg_fun;
128 if (NULL != cfg_fun_ptr)
129 ret = cfg_fun_ptr(&isp_param);