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 #define DENOISE_DISWEI_NUM_MAX 256
20 #define DENOISE_RANWEI_NUM_MAX 256
22 static const uint8_t diswei_tab[DENOISE_DISWEI_NUM_MAX][19] = {
23 #include "denoise_diswei.h"
26 static const uint8_t ranwei_tab[DENOISE_RANWEI_NUM_MAX][31] = {
27 #include "denoise_ranwei.h"
30 int32_t isp_k_bdn_block(struct isp_io_param *param)
33 uint32_t i = 0, val = 0, addr = 0;
34 struct isp_dev_wavelet_denoise_info denoise_info;
36 memset(&denoise_info, 0x00, sizeof(denoise_info));
38 ret = copy_from_user((void *)&denoise_info, param->property_param, sizeof(denoise_info));
40 printk("isp_k_wavelet_denoise_block: copy error, ret=0x%x\n", (uint32_t)ret);
44 if (DENOISE_DISWEI_NUM_MAX < denoise_info.diswei_level
45 || DENOISE_RANWEI_NUM_MAX < denoise_info.ranwei_level) {
46 printk("isp_k_wavelet_denoise_block: index error: %d %d\n",
47 denoise_info.diswei_level, denoise_info.ranwei_level);
51 addr = ISP_WAVE_DISWEI_0;
52 for (i = 0; i < 16; i += 4) {
53 val = (diswei_tab[denoise_info.diswei_level][i + 3] << 24)
54 | (diswei_tab[denoise_info.diswei_level][i + 2] << 16)
55 | (diswei_tab[denoise_info.diswei_level][i + 1] << 8)
56 | diswei_tab[denoise_info.diswei_level][i];
60 val = (diswei_tab[denoise_info.diswei_level][18] << 16)
61 | (diswei_tab[denoise_info.diswei_level][17] << 8)
62 | diswei_tab[denoise_info.diswei_level][16];
63 REG_WR(ISP_WAVE_DISWEI_4, val);
65 addr = ISP_WAVE_RANWEI_0;
66 for (i = 0; i < 28; i += 4) {
67 val = (ranwei_tab[denoise_info.ranwei_level][i + 3] << 24)
68 | (ranwei_tab[denoise_info.ranwei_level][i + 2] << 16)
69 | (ranwei_tab[denoise_info.ranwei_level][i + 1] << 8)
70 | ranwei_tab[denoise_info.ranwei_level][i];
74 val = (ranwei_tab[denoise_info.ranwei_level][30] << 16)
75 | (ranwei_tab[denoise_info.ranwei_level][29] << 8)
76 | ranwei_tab[denoise_info.ranwei_level][28];
77 REG_WR(ISP_WAVE_RANWEI_7, val);
79 if (denoise_info.bypass) {
80 REG_OWR(ISP_WAVE_PARAM, BIT_0);
82 REG_MWR(ISP_WAVE_PARAM, BIT_0, 0);
88 static int32_t isp_k_bdn_bypass(struct isp_io_param *param)
93 ret = copy_from_user((void *)&bypass, param->property_param, sizeof(bypass));
95 printk("isp_k_wavelet_denoise_bypass: copy error, ret=0x%x\n", (uint32_t)ret);
100 REG_OWR(ISP_WAVE_PARAM, BIT_0);
102 REG_MWR(ISP_WAVE_PARAM, BIT_0, 0);
108 static int32_t isp_k_bdn_slice_size(struct isp_io_param *param)
112 struct isp_img_size size = {0, 0};
114 ret = copy_from_user((void *)&size, param->property_param, sizeof(size));
116 printk("isp_k_wavelet_denoise_slice_size: copy error, ret=0x%x\n", (uint32_t)ret);
120 val = ((size.height & 0xFFFF) << 16) | (size.width & 0xFFFF);
121 REG_WR(ISP_WAVE_SLICE_SIZE, val);
126 static int32_t isp_k_bdn_diswei(struct isp_io_param *param)
129 uint32_t i = 0, val = 0, addr = 0;
130 uint32_t diswei_index = 0;
132 ret = copy_from_user((void *)&diswei_index, param->property_param, sizeof(diswei_index));
134 printk("isp_k_wavelet_denoise_diswei: copy error, ret=0x%x\n", (uint32_t)ret);
138 if (DENOISE_DISWEI_NUM_MAX < diswei_index) {
139 printk("isp_k_wavelet_denoise_diswei: index error: %d\n", diswei_index);
143 addr = ISP_WAVE_DISWEI_0;
144 for (i = 0; i < 16; i += 4) {
145 val = (diswei_tab[diswei_index][i + 3] << 24)
146 | (diswei_tab[diswei_index][i + 2] << 16)
147 | (diswei_tab[diswei_index][i + 1] << 8)
148 | diswei_tab[diswei_index][i];
152 val = (diswei_tab[diswei_index][18] << 16)
153 | (diswei_tab[diswei_index][17] << 8)
154 | diswei_tab[diswei_index][16];
155 REG_WR(ISP_WAVE_DISWEI_4, val);
160 static int32_t isp_k_bdn_ranwei(struct isp_io_param *param)
163 uint32_t i = 0, val = 0, addr = 0;
164 uint32_t ranwei_index = 0;
166 ret = copy_from_user((void *)&ranwei_index, param->property_param, sizeof(ranwei_index));
168 printk("isp_k_wavelet_denoise_ranwei: copy error, ret=0x%x\n", (uint32_t)ret);
172 if (DENOISE_RANWEI_NUM_MAX < ranwei_index) {
173 printk("isp_k_wavelet_denoise_ranwei: index error: %d\n", ranwei_index);
177 addr = ISP_WAVE_RANWEI_0;
178 for (i = 0; i < 28; i += 4) {
179 val = (ranwei_tab[ranwei_index][i + 3] << 24)
180 | (ranwei_tab[ranwei_index][i + 2] << 16)
181 | (ranwei_tab[ranwei_index][i + 1] << 8)
182 | ranwei_tab[ranwei_index][i];
186 val = (ranwei_tab[ranwei_index][30] << 16)
187 | (ranwei_tab[ranwei_index][29] << 8)
188 | ranwei_tab[ranwei_index][28];
189 REG_WR(ISP_WAVE_RANWEI_7, val);
194 int32_t isp_k_cfg_bdn(struct isp_io_param *param)
199 printk("isp_k_cfg_bdn: param is null error.\n");
203 if (NULL == param->property_param) {
204 printk("isp_k_cfg_bdn: property_param is null error.\n");
208 switch(param->property) {
209 case ISP_PRO_BDN_BLOCK:
210 ret = isp_k_bdn_block(param);
212 case ISP_PRO_BDN_BYPASS:
213 ret = isp_k_bdn_bypass(param);
215 case ISP_PRO_BDN_SLICE_SIZE:
216 ret = isp_k_bdn_slice_size(param);
218 case ISP_PRO_BDN_DISWEI:
219 ret = isp_k_bdn_diswei(param);
221 case ISP_PRO_BDN_RANWEI:
222 ret = isp_k_bdn_ranwei(param);
225 printk("isp_k_cfg_bdn: fail cmd id:%d, not supported.\n", param->property);