tizen 2.4 release
[profile/mobile/platform/kernel/linux-3.10-sc7730.git] / drivers / media / sprd_isp / isp2.0 / pike / src / isp_cfg_param.c
1 /*
2  * Copyright (C) 2012 Spreadtrum Communications Inc.
3  *
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.
7  *
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.
12  */
13
14 #include <linux/uaccess.h>
15 #include <linux/sprd_mm.h>
16 #include <video/sprd_isp.h>
17 #include "isp_block.h"
18
19 typedef int32_t (*isp_cfg_fun_ptr)(struct isp_io_param *isp_param);
20
21 struct isp_cfg_fun {
22         uint32_t sub_block;
23         isp_cfg_fun_ptr cfg_fun;
24 };
25
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},
83 };
84
85 int32_t isp_cfg_param(void  *param, struct isp_k_private *isp_private)
86 {
87         int32_t ret = 0;
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};
91
92         if (!param) {
93                 printk("isp_cfg_param: param is null error.\n");
94                 return -1;
95         }
96
97         ret = copy_from_user((void *)&isp_param, (void *)param, sizeof(isp_param));
98         if ( 0 != ret) {
99                 printk("isp_cfg_param: copy error, ret = 0x%x\n", (uint32_t)ret);
100                 return -1;
101         }
102
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);
119         } else {
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;
124                                 break;
125                         }
126                 }
127
128                 if (NULL != cfg_fun_ptr)
129                         ret = cfg_fun_ptr(&isp_param);
130         }
131
132         return ret;
133 }