1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Samsung EXYNOS4x12 FIMC-IS (Imaging Subsystem) driver
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2013 Samsung Electronics Co., Ltd.
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Authors: Younghwan Joo <yhwan.joo@samsung.com>
8*4882a593Smuzhiyun * Sylwester Nawrocki <s.nawrocki@samsung.com>
9*4882a593Smuzhiyun */
10*4882a593Smuzhiyun #define pr_fmt(fmt) "%s:%d " fmt, __func__, __LINE__
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun #include <linux/bitops.h>
13*4882a593Smuzhiyun #include <linux/bug.h>
14*4882a593Smuzhiyun #include <linux/device.h>
15*4882a593Smuzhiyun #include <linux/errno.h>
16*4882a593Smuzhiyun #include <linux/kernel.h>
17*4882a593Smuzhiyun #include <linux/module.h>
18*4882a593Smuzhiyun #include <linux/platform_device.h>
19*4882a593Smuzhiyun #include <linux/slab.h>
20*4882a593Smuzhiyun #include <linux/types.h>
21*4882a593Smuzhiyun #include <linux/videodev2.h>
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun #include <media/v4l2-device.h>
24*4882a593Smuzhiyun #include <media/v4l2-ioctl.h>
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun #include "fimc-is.h"
27*4882a593Smuzhiyun #include "fimc-is-command.h"
28*4882a593Smuzhiyun #include "fimc-is-errno.h"
29*4882a593Smuzhiyun #include "fimc-is-param.h"
30*4882a593Smuzhiyun #include "fimc-is-regs.h"
31*4882a593Smuzhiyun #include "fimc-is-sensor.h"
32*4882a593Smuzhiyun
__hw_param_copy(void * dst,void * src)33*4882a593Smuzhiyun static void __hw_param_copy(void *dst, void *src)
34*4882a593Smuzhiyun {
35*4882a593Smuzhiyun memcpy(dst, src, FIMC_IS_PARAM_MAX_SIZE);
36*4882a593Smuzhiyun }
37*4882a593Smuzhiyun
__fimc_is_hw_update_param_global_shotmode(struct fimc_is * is)38*4882a593Smuzhiyun static void __fimc_is_hw_update_param_global_shotmode(struct fimc_is *is)
39*4882a593Smuzhiyun {
40*4882a593Smuzhiyun struct param_global_shotmode *dst, *src;
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun dst = &is->is_p_region->parameter.global.shotmode;
43*4882a593Smuzhiyun src = &is->config[is->config_index].global.shotmode;
44*4882a593Smuzhiyun __hw_param_copy(dst, src);
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun
__fimc_is_hw_update_param_sensor_framerate(struct fimc_is * is)47*4882a593Smuzhiyun static void __fimc_is_hw_update_param_sensor_framerate(struct fimc_is *is)
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun struct param_sensor_framerate *dst, *src;
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun dst = &is->is_p_region->parameter.sensor.frame_rate;
52*4882a593Smuzhiyun src = &is->config[is->config_index].sensor.frame_rate;
53*4882a593Smuzhiyun __hw_param_copy(dst, src);
54*4882a593Smuzhiyun }
55*4882a593Smuzhiyun
__fimc_is_hw_update_param(struct fimc_is * is,u32 offset)56*4882a593Smuzhiyun int __fimc_is_hw_update_param(struct fimc_is *is, u32 offset)
57*4882a593Smuzhiyun {
58*4882a593Smuzhiyun struct is_param_region *par = &is->is_p_region->parameter;
59*4882a593Smuzhiyun struct chain_config *cfg = &is->config[is->config_index];
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun switch (offset) {
62*4882a593Smuzhiyun case PARAM_ISP_CONTROL:
63*4882a593Smuzhiyun __hw_param_copy(&par->isp.control, &cfg->isp.control);
64*4882a593Smuzhiyun break;
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun case PARAM_ISP_OTF_INPUT:
67*4882a593Smuzhiyun __hw_param_copy(&par->isp.otf_input, &cfg->isp.otf_input);
68*4882a593Smuzhiyun break;
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun case PARAM_ISP_DMA1_INPUT:
71*4882a593Smuzhiyun __hw_param_copy(&par->isp.dma1_input, &cfg->isp.dma1_input);
72*4882a593Smuzhiyun break;
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun case PARAM_ISP_DMA2_INPUT:
75*4882a593Smuzhiyun __hw_param_copy(&par->isp.dma2_input, &cfg->isp.dma2_input);
76*4882a593Smuzhiyun break;
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun case PARAM_ISP_AA:
79*4882a593Smuzhiyun __hw_param_copy(&par->isp.aa, &cfg->isp.aa);
80*4882a593Smuzhiyun break;
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun case PARAM_ISP_FLASH:
83*4882a593Smuzhiyun __hw_param_copy(&par->isp.flash, &cfg->isp.flash);
84*4882a593Smuzhiyun break;
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun case PARAM_ISP_AWB:
87*4882a593Smuzhiyun __hw_param_copy(&par->isp.awb, &cfg->isp.awb);
88*4882a593Smuzhiyun break;
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun case PARAM_ISP_IMAGE_EFFECT:
91*4882a593Smuzhiyun __hw_param_copy(&par->isp.effect, &cfg->isp.effect);
92*4882a593Smuzhiyun break;
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun case PARAM_ISP_ISO:
95*4882a593Smuzhiyun __hw_param_copy(&par->isp.iso, &cfg->isp.iso);
96*4882a593Smuzhiyun break;
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun case PARAM_ISP_ADJUST:
99*4882a593Smuzhiyun __hw_param_copy(&par->isp.adjust, &cfg->isp.adjust);
100*4882a593Smuzhiyun break;
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun case PARAM_ISP_METERING:
103*4882a593Smuzhiyun __hw_param_copy(&par->isp.metering, &cfg->isp.metering);
104*4882a593Smuzhiyun break;
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun case PARAM_ISP_AFC:
107*4882a593Smuzhiyun __hw_param_copy(&par->isp.afc, &cfg->isp.afc);
108*4882a593Smuzhiyun break;
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun case PARAM_ISP_OTF_OUTPUT:
111*4882a593Smuzhiyun __hw_param_copy(&par->isp.otf_output, &cfg->isp.otf_output);
112*4882a593Smuzhiyun break;
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun case PARAM_ISP_DMA1_OUTPUT:
115*4882a593Smuzhiyun __hw_param_copy(&par->isp.dma1_output, &cfg->isp.dma1_output);
116*4882a593Smuzhiyun break;
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun case PARAM_ISP_DMA2_OUTPUT:
119*4882a593Smuzhiyun __hw_param_copy(&par->isp.dma2_output, &cfg->isp.dma2_output);
120*4882a593Smuzhiyun break;
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun case PARAM_DRC_CONTROL:
123*4882a593Smuzhiyun __hw_param_copy(&par->drc.control, &cfg->drc.control);
124*4882a593Smuzhiyun break;
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun case PARAM_DRC_OTF_INPUT:
127*4882a593Smuzhiyun __hw_param_copy(&par->drc.otf_input, &cfg->drc.otf_input);
128*4882a593Smuzhiyun break;
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun case PARAM_DRC_DMA_INPUT:
131*4882a593Smuzhiyun __hw_param_copy(&par->drc.dma_input, &cfg->drc.dma_input);
132*4882a593Smuzhiyun break;
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun case PARAM_DRC_OTF_OUTPUT:
135*4882a593Smuzhiyun __hw_param_copy(&par->drc.otf_output, &cfg->drc.otf_output);
136*4882a593Smuzhiyun break;
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun case PARAM_FD_CONTROL:
139*4882a593Smuzhiyun __hw_param_copy(&par->fd.control, &cfg->fd.control);
140*4882a593Smuzhiyun break;
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun case PARAM_FD_OTF_INPUT:
143*4882a593Smuzhiyun __hw_param_copy(&par->fd.otf_input, &cfg->fd.otf_input);
144*4882a593Smuzhiyun break;
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun case PARAM_FD_DMA_INPUT:
147*4882a593Smuzhiyun __hw_param_copy(&par->fd.dma_input, &cfg->fd.dma_input);
148*4882a593Smuzhiyun break;
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun case PARAM_FD_CONFIG:
151*4882a593Smuzhiyun __hw_param_copy(&par->fd.config, &cfg->fd.config);
152*4882a593Smuzhiyun break;
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun default:
155*4882a593Smuzhiyun return -EINVAL;
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun return 0;
159*4882a593Smuzhiyun }
160*4882a593Smuzhiyun
__get_pending_param_count(struct fimc_is * is)161*4882a593Smuzhiyun unsigned int __get_pending_param_count(struct fimc_is *is)
162*4882a593Smuzhiyun {
163*4882a593Smuzhiyun struct chain_config *config = &is->config[is->config_index];
164*4882a593Smuzhiyun unsigned long flags;
165*4882a593Smuzhiyun unsigned int count;
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun spin_lock_irqsave(&is->slock, flags);
168*4882a593Smuzhiyun count = hweight32(config->p_region_index[0]);
169*4882a593Smuzhiyun count += hweight32(config->p_region_index[1]);
170*4882a593Smuzhiyun spin_unlock_irqrestore(&is->slock, flags);
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun return count;
173*4882a593Smuzhiyun }
174*4882a593Smuzhiyun
__is_hw_update_params(struct fimc_is * is)175*4882a593Smuzhiyun int __is_hw_update_params(struct fimc_is *is)
176*4882a593Smuzhiyun {
177*4882a593Smuzhiyun unsigned long *p_index;
178*4882a593Smuzhiyun int i, id, ret = 0;
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun id = is->config_index;
181*4882a593Smuzhiyun p_index = &is->config[id].p_region_index[0];
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun if (test_bit(PARAM_GLOBAL_SHOTMODE, p_index))
184*4882a593Smuzhiyun __fimc_is_hw_update_param_global_shotmode(is);
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun if (test_bit(PARAM_SENSOR_FRAME_RATE, p_index))
187*4882a593Smuzhiyun __fimc_is_hw_update_param_sensor_framerate(is);
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun for (i = PARAM_ISP_CONTROL; i < PARAM_DRC_CONTROL; i++) {
190*4882a593Smuzhiyun if (test_bit(i, p_index))
191*4882a593Smuzhiyun ret = __fimc_is_hw_update_param(is, i);
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun for (i = PARAM_DRC_CONTROL; i < PARAM_SCALERC_CONTROL; i++) {
195*4882a593Smuzhiyun if (test_bit(i, p_index))
196*4882a593Smuzhiyun ret = __fimc_is_hw_update_param(is, i);
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun for (i = PARAM_FD_CONTROL; i <= PARAM_FD_CONFIG; i++) {
200*4882a593Smuzhiyun if (test_bit(i, p_index))
201*4882a593Smuzhiyun ret = __fimc_is_hw_update_param(is, i);
202*4882a593Smuzhiyun }
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun return ret;
205*4882a593Smuzhiyun }
206*4882a593Smuzhiyun
__is_get_frame_size(struct fimc_is * is,struct v4l2_mbus_framefmt * mf)207*4882a593Smuzhiyun void __is_get_frame_size(struct fimc_is *is, struct v4l2_mbus_framefmt *mf)
208*4882a593Smuzhiyun {
209*4882a593Smuzhiyun struct isp_param *isp;
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun isp = &is->config[is->config_index].isp;
212*4882a593Smuzhiyun mf->width = isp->otf_input.width;
213*4882a593Smuzhiyun mf->height = isp->otf_input.height;
214*4882a593Smuzhiyun }
215*4882a593Smuzhiyun
__is_set_frame_size(struct fimc_is * is,struct v4l2_mbus_framefmt * mf)216*4882a593Smuzhiyun void __is_set_frame_size(struct fimc_is *is, struct v4l2_mbus_framefmt *mf)
217*4882a593Smuzhiyun {
218*4882a593Smuzhiyun unsigned int index = is->config_index;
219*4882a593Smuzhiyun struct isp_param *isp;
220*4882a593Smuzhiyun struct drc_param *drc;
221*4882a593Smuzhiyun struct fd_param *fd;
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun isp = &is->config[index].isp;
224*4882a593Smuzhiyun drc = &is->config[index].drc;
225*4882a593Smuzhiyun fd = &is->config[index].fd;
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun /* Update isp size info (OTF only) */
228*4882a593Smuzhiyun isp->otf_input.width = mf->width;
229*4882a593Smuzhiyun isp->otf_input.height = mf->height;
230*4882a593Smuzhiyun isp->otf_output.width = mf->width;
231*4882a593Smuzhiyun isp->otf_output.height = mf->height;
232*4882a593Smuzhiyun /* Update drc size info (OTF only) */
233*4882a593Smuzhiyun drc->otf_input.width = mf->width;
234*4882a593Smuzhiyun drc->otf_input.height = mf->height;
235*4882a593Smuzhiyun drc->otf_output.width = mf->width;
236*4882a593Smuzhiyun drc->otf_output.height = mf->height;
237*4882a593Smuzhiyun /* Update fd size info (OTF only) */
238*4882a593Smuzhiyun fd->otf_input.width = mf->width;
239*4882a593Smuzhiyun fd->otf_input.height = mf->height;
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun if (test_bit(PARAM_ISP_OTF_INPUT,
242*4882a593Smuzhiyun &is->config[index].p_region_index[0]))
243*4882a593Smuzhiyun return;
244*4882a593Smuzhiyun
245*4882a593Smuzhiyun /* Update field */
246*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_ISP_OTF_INPUT);
247*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_ISP_OTF_OUTPUT);
248*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_DRC_OTF_INPUT);
249*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_DRC_OTF_OUTPUT);
250*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_FD_OTF_INPUT);
251*4882a593Smuzhiyun }
252*4882a593Smuzhiyun
fimc_is_hw_get_sensor_max_framerate(struct fimc_is * is)253*4882a593Smuzhiyun int fimc_is_hw_get_sensor_max_framerate(struct fimc_is *is)
254*4882a593Smuzhiyun {
255*4882a593Smuzhiyun switch (is->sensor->drvdata->id) {
256*4882a593Smuzhiyun case FIMC_IS_SENSOR_ID_S5K6A3:
257*4882a593Smuzhiyun return 30;
258*4882a593Smuzhiyun default:
259*4882a593Smuzhiyun return 15;
260*4882a593Smuzhiyun }
261*4882a593Smuzhiyun }
262*4882a593Smuzhiyun
__is_set_sensor(struct fimc_is * is,int fps)263*4882a593Smuzhiyun void __is_set_sensor(struct fimc_is *is, int fps)
264*4882a593Smuzhiyun {
265*4882a593Smuzhiyun unsigned int index = is->config_index;
266*4882a593Smuzhiyun struct sensor_param *sensor;
267*4882a593Smuzhiyun struct isp_param *isp;
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun sensor = &is->config[index].sensor;
270*4882a593Smuzhiyun isp = &is->config[index].isp;
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun if (fps == 0) {
273*4882a593Smuzhiyun sensor->frame_rate.frame_rate =
274*4882a593Smuzhiyun fimc_is_hw_get_sensor_max_framerate(is);
275*4882a593Smuzhiyun isp->otf_input.frametime_min = 0;
276*4882a593Smuzhiyun isp->otf_input.frametime_max = 66666;
277*4882a593Smuzhiyun } else {
278*4882a593Smuzhiyun sensor->frame_rate.frame_rate = fps;
279*4882a593Smuzhiyun isp->otf_input.frametime_min = 0;
280*4882a593Smuzhiyun isp->otf_input.frametime_max = (u32)1000000 / fps;
281*4882a593Smuzhiyun }
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_SENSOR_FRAME_RATE);
284*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_ISP_OTF_INPUT);
285*4882a593Smuzhiyun }
286*4882a593Smuzhiyun
__is_set_init_isp_aa(struct fimc_is * is)287*4882a593Smuzhiyun static void __maybe_unused __is_set_init_isp_aa(struct fimc_is *is)
288*4882a593Smuzhiyun {
289*4882a593Smuzhiyun struct isp_param *isp;
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun isp = &is->config[is->config_index].isp;
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun isp->aa.cmd = ISP_AA_COMMAND_START;
294*4882a593Smuzhiyun isp->aa.target = ISP_AA_TARGET_AF | ISP_AA_TARGET_AE |
295*4882a593Smuzhiyun ISP_AA_TARGET_AWB;
296*4882a593Smuzhiyun isp->aa.mode = 0;
297*4882a593Smuzhiyun isp->aa.scene = 0;
298*4882a593Smuzhiyun isp->aa.sleep = 0;
299*4882a593Smuzhiyun isp->aa.face = 0;
300*4882a593Smuzhiyun isp->aa.touch_x = 0;
301*4882a593Smuzhiyun isp->aa.touch_y = 0;
302*4882a593Smuzhiyun isp->aa.manual_af_setting = 0;
303*4882a593Smuzhiyun isp->aa.err = ISP_AF_ERROR_NONE;
304*4882a593Smuzhiyun
305*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_ISP_AA);
306*4882a593Smuzhiyun }
307*4882a593Smuzhiyun
__is_set_isp_flash(struct fimc_is * is,u32 cmd,u32 redeye)308*4882a593Smuzhiyun void __is_set_isp_flash(struct fimc_is *is, u32 cmd, u32 redeye)
309*4882a593Smuzhiyun {
310*4882a593Smuzhiyun unsigned int index = is->config_index;
311*4882a593Smuzhiyun struct isp_param *isp = &is->config[index].isp;
312*4882a593Smuzhiyun
313*4882a593Smuzhiyun isp->flash.cmd = cmd;
314*4882a593Smuzhiyun isp->flash.redeye = redeye;
315*4882a593Smuzhiyun isp->flash.err = ISP_FLASH_ERROR_NONE;
316*4882a593Smuzhiyun
317*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_ISP_FLASH);
318*4882a593Smuzhiyun }
319*4882a593Smuzhiyun
__is_set_isp_awb(struct fimc_is * is,u32 cmd,u32 val)320*4882a593Smuzhiyun void __is_set_isp_awb(struct fimc_is *is, u32 cmd, u32 val)
321*4882a593Smuzhiyun {
322*4882a593Smuzhiyun unsigned int index = is->config_index;
323*4882a593Smuzhiyun struct isp_param *isp;
324*4882a593Smuzhiyun
325*4882a593Smuzhiyun isp = &is->config[index].isp;
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun isp->awb.cmd = cmd;
328*4882a593Smuzhiyun isp->awb.illumination = val;
329*4882a593Smuzhiyun isp->awb.err = ISP_AWB_ERROR_NONE;
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_ISP_AWB);
332*4882a593Smuzhiyun }
333*4882a593Smuzhiyun
__is_set_isp_effect(struct fimc_is * is,u32 cmd)334*4882a593Smuzhiyun void __is_set_isp_effect(struct fimc_is *is, u32 cmd)
335*4882a593Smuzhiyun {
336*4882a593Smuzhiyun unsigned int index = is->config_index;
337*4882a593Smuzhiyun struct isp_param *isp;
338*4882a593Smuzhiyun
339*4882a593Smuzhiyun isp = &is->config[index].isp;
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun isp->effect.cmd = cmd;
342*4882a593Smuzhiyun isp->effect.err = ISP_IMAGE_EFFECT_ERROR_NONE;
343*4882a593Smuzhiyun
344*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_ISP_IMAGE_EFFECT);
345*4882a593Smuzhiyun }
346*4882a593Smuzhiyun
__is_set_isp_iso(struct fimc_is * is,u32 cmd,u32 val)347*4882a593Smuzhiyun void __is_set_isp_iso(struct fimc_is *is, u32 cmd, u32 val)
348*4882a593Smuzhiyun {
349*4882a593Smuzhiyun unsigned int index = is->config_index;
350*4882a593Smuzhiyun struct isp_param *isp;
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun isp = &is->config[index].isp;
353*4882a593Smuzhiyun
354*4882a593Smuzhiyun isp->iso.cmd = cmd;
355*4882a593Smuzhiyun isp->iso.value = val;
356*4882a593Smuzhiyun isp->iso.err = ISP_ISO_ERROR_NONE;
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_ISP_ISO);
359*4882a593Smuzhiyun }
360*4882a593Smuzhiyun
__is_set_isp_adjust(struct fimc_is * is,u32 cmd,u32 val)361*4882a593Smuzhiyun void __is_set_isp_adjust(struct fimc_is *is, u32 cmd, u32 val)
362*4882a593Smuzhiyun {
363*4882a593Smuzhiyun unsigned int index = is->config_index;
364*4882a593Smuzhiyun unsigned long *p_index;
365*4882a593Smuzhiyun struct isp_param *isp;
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun p_index = &is->config[index].p_region_index[0];
368*4882a593Smuzhiyun isp = &is->config[index].isp;
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun switch (cmd) {
371*4882a593Smuzhiyun case ISP_ADJUST_COMMAND_MANUAL_CONTRAST:
372*4882a593Smuzhiyun isp->adjust.contrast = val;
373*4882a593Smuzhiyun break;
374*4882a593Smuzhiyun case ISP_ADJUST_COMMAND_MANUAL_SATURATION:
375*4882a593Smuzhiyun isp->adjust.saturation = val;
376*4882a593Smuzhiyun break;
377*4882a593Smuzhiyun case ISP_ADJUST_COMMAND_MANUAL_SHARPNESS:
378*4882a593Smuzhiyun isp->adjust.sharpness = val;
379*4882a593Smuzhiyun break;
380*4882a593Smuzhiyun case ISP_ADJUST_COMMAND_MANUAL_EXPOSURE:
381*4882a593Smuzhiyun isp->adjust.exposure = val;
382*4882a593Smuzhiyun break;
383*4882a593Smuzhiyun case ISP_ADJUST_COMMAND_MANUAL_BRIGHTNESS:
384*4882a593Smuzhiyun isp->adjust.brightness = val;
385*4882a593Smuzhiyun break;
386*4882a593Smuzhiyun case ISP_ADJUST_COMMAND_MANUAL_HUE:
387*4882a593Smuzhiyun isp->adjust.hue = val;
388*4882a593Smuzhiyun break;
389*4882a593Smuzhiyun case ISP_ADJUST_COMMAND_AUTO:
390*4882a593Smuzhiyun isp->adjust.contrast = 0;
391*4882a593Smuzhiyun isp->adjust.saturation = 0;
392*4882a593Smuzhiyun isp->adjust.sharpness = 0;
393*4882a593Smuzhiyun isp->adjust.exposure = 0;
394*4882a593Smuzhiyun isp->adjust.brightness = 0;
395*4882a593Smuzhiyun isp->adjust.hue = 0;
396*4882a593Smuzhiyun break;
397*4882a593Smuzhiyun }
398*4882a593Smuzhiyun
399*4882a593Smuzhiyun if (!test_bit(PARAM_ISP_ADJUST, p_index)) {
400*4882a593Smuzhiyun isp->adjust.cmd = cmd;
401*4882a593Smuzhiyun isp->adjust.err = ISP_ADJUST_ERROR_NONE;
402*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_ISP_ADJUST);
403*4882a593Smuzhiyun } else {
404*4882a593Smuzhiyun isp->adjust.cmd |= cmd;
405*4882a593Smuzhiyun }
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun
__is_set_isp_metering(struct fimc_is * is,u32 id,u32 val)408*4882a593Smuzhiyun void __is_set_isp_metering(struct fimc_is *is, u32 id, u32 val)
409*4882a593Smuzhiyun {
410*4882a593Smuzhiyun unsigned int index = is->config_index;
411*4882a593Smuzhiyun struct isp_param *isp;
412*4882a593Smuzhiyun unsigned long *p_index;
413*4882a593Smuzhiyun
414*4882a593Smuzhiyun p_index = &is->config[index].p_region_index[0];
415*4882a593Smuzhiyun isp = &is->config[index].isp;
416*4882a593Smuzhiyun
417*4882a593Smuzhiyun switch (id) {
418*4882a593Smuzhiyun case IS_METERING_CONFIG_CMD:
419*4882a593Smuzhiyun isp->metering.cmd = val;
420*4882a593Smuzhiyun break;
421*4882a593Smuzhiyun case IS_METERING_CONFIG_WIN_POS_X:
422*4882a593Smuzhiyun isp->metering.win_pos_x = val;
423*4882a593Smuzhiyun break;
424*4882a593Smuzhiyun case IS_METERING_CONFIG_WIN_POS_Y:
425*4882a593Smuzhiyun isp->metering.win_pos_y = val;
426*4882a593Smuzhiyun break;
427*4882a593Smuzhiyun case IS_METERING_CONFIG_WIN_WIDTH:
428*4882a593Smuzhiyun isp->metering.win_width = val;
429*4882a593Smuzhiyun break;
430*4882a593Smuzhiyun case IS_METERING_CONFIG_WIN_HEIGHT:
431*4882a593Smuzhiyun isp->metering.win_height = val;
432*4882a593Smuzhiyun break;
433*4882a593Smuzhiyun default:
434*4882a593Smuzhiyun return;
435*4882a593Smuzhiyun }
436*4882a593Smuzhiyun
437*4882a593Smuzhiyun if (!test_bit(PARAM_ISP_METERING, p_index)) {
438*4882a593Smuzhiyun isp->metering.err = ISP_METERING_ERROR_NONE;
439*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_ISP_METERING);
440*4882a593Smuzhiyun }
441*4882a593Smuzhiyun }
442*4882a593Smuzhiyun
__is_set_isp_afc(struct fimc_is * is,u32 cmd,u32 val)443*4882a593Smuzhiyun void __is_set_isp_afc(struct fimc_is *is, u32 cmd, u32 val)
444*4882a593Smuzhiyun {
445*4882a593Smuzhiyun unsigned int index = is->config_index;
446*4882a593Smuzhiyun struct isp_param *isp;
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun isp = &is->config[index].isp;
449*4882a593Smuzhiyun
450*4882a593Smuzhiyun isp->afc.cmd = cmd;
451*4882a593Smuzhiyun isp->afc.manual = val;
452*4882a593Smuzhiyun isp->afc.err = ISP_AFC_ERROR_NONE;
453*4882a593Smuzhiyun
454*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_ISP_AFC);
455*4882a593Smuzhiyun }
456*4882a593Smuzhiyun
__is_set_drc_control(struct fimc_is * is,u32 val)457*4882a593Smuzhiyun void __is_set_drc_control(struct fimc_is *is, u32 val)
458*4882a593Smuzhiyun {
459*4882a593Smuzhiyun unsigned int index = is->config_index;
460*4882a593Smuzhiyun struct drc_param *drc;
461*4882a593Smuzhiyun
462*4882a593Smuzhiyun drc = &is->config[index].drc;
463*4882a593Smuzhiyun
464*4882a593Smuzhiyun drc->control.bypass = val;
465*4882a593Smuzhiyun
466*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_DRC_CONTROL);
467*4882a593Smuzhiyun }
468*4882a593Smuzhiyun
__is_set_fd_control(struct fimc_is * is,u32 val)469*4882a593Smuzhiyun void __is_set_fd_control(struct fimc_is *is, u32 val)
470*4882a593Smuzhiyun {
471*4882a593Smuzhiyun unsigned int index = is->config_index;
472*4882a593Smuzhiyun struct fd_param *fd;
473*4882a593Smuzhiyun unsigned long *p_index;
474*4882a593Smuzhiyun
475*4882a593Smuzhiyun p_index = &is->config[index].p_region_index[1];
476*4882a593Smuzhiyun fd = &is->config[index].fd;
477*4882a593Smuzhiyun
478*4882a593Smuzhiyun fd->control.cmd = val;
479*4882a593Smuzhiyun
480*4882a593Smuzhiyun if (!test_bit((PARAM_FD_CONFIG - 32), p_index))
481*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_FD_CONTROL);
482*4882a593Smuzhiyun }
483*4882a593Smuzhiyun
__is_set_fd_config_maxface(struct fimc_is * is,u32 val)484*4882a593Smuzhiyun void __is_set_fd_config_maxface(struct fimc_is *is, u32 val)
485*4882a593Smuzhiyun {
486*4882a593Smuzhiyun unsigned int index = is->config_index;
487*4882a593Smuzhiyun struct fd_param *fd;
488*4882a593Smuzhiyun unsigned long *p_index;
489*4882a593Smuzhiyun
490*4882a593Smuzhiyun p_index = &is->config[index].p_region_index[1];
491*4882a593Smuzhiyun fd = &is->config[index].fd;
492*4882a593Smuzhiyun
493*4882a593Smuzhiyun fd->config.max_number = val;
494*4882a593Smuzhiyun
495*4882a593Smuzhiyun if (!test_bit((PARAM_FD_CONFIG - 32), p_index)) {
496*4882a593Smuzhiyun fd->config.cmd = FD_CONFIG_COMMAND_MAXIMUM_NUMBER;
497*4882a593Smuzhiyun fd->config.err = ERROR_FD_NONE;
498*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_FD_CONFIG);
499*4882a593Smuzhiyun } else {
500*4882a593Smuzhiyun fd->config.cmd |= FD_CONFIG_COMMAND_MAXIMUM_NUMBER;
501*4882a593Smuzhiyun }
502*4882a593Smuzhiyun }
503*4882a593Smuzhiyun
__is_set_fd_config_rollangle(struct fimc_is * is,u32 val)504*4882a593Smuzhiyun void __is_set_fd_config_rollangle(struct fimc_is *is, u32 val)
505*4882a593Smuzhiyun {
506*4882a593Smuzhiyun unsigned int index = is->config_index;
507*4882a593Smuzhiyun struct fd_param *fd;
508*4882a593Smuzhiyun unsigned long *p_index;
509*4882a593Smuzhiyun
510*4882a593Smuzhiyun p_index = &is->config[index].p_region_index[1];
511*4882a593Smuzhiyun fd = &is->config[index].fd;
512*4882a593Smuzhiyun
513*4882a593Smuzhiyun fd->config.roll_angle = val;
514*4882a593Smuzhiyun
515*4882a593Smuzhiyun if (!test_bit((PARAM_FD_CONFIG - 32), p_index)) {
516*4882a593Smuzhiyun fd->config.cmd = FD_CONFIG_COMMAND_ROLL_ANGLE;
517*4882a593Smuzhiyun fd->config.err = ERROR_FD_NONE;
518*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_FD_CONFIG);
519*4882a593Smuzhiyun } else {
520*4882a593Smuzhiyun fd->config.cmd |= FD_CONFIG_COMMAND_ROLL_ANGLE;
521*4882a593Smuzhiyun }
522*4882a593Smuzhiyun }
523*4882a593Smuzhiyun
__is_set_fd_config_yawangle(struct fimc_is * is,u32 val)524*4882a593Smuzhiyun void __is_set_fd_config_yawangle(struct fimc_is *is, u32 val)
525*4882a593Smuzhiyun {
526*4882a593Smuzhiyun unsigned int index = is->config_index;
527*4882a593Smuzhiyun struct fd_param *fd;
528*4882a593Smuzhiyun unsigned long *p_index;
529*4882a593Smuzhiyun
530*4882a593Smuzhiyun p_index = &is->config[index].p_region_index[1];
531*4882a593Smuzhiyun fd = &is->config[index].fd;
532*4882a593Smuzhiyun
533*4882a593Smuzhiyun fd->config.yaw_angle = val;
534*4882a593Smuzhiyun
535*4882a593Smuzhiyun if (!test_bit((PARAM_FD_CONFIG - 32), p_index)) {
536*4882a593Smuzhiyun fd->config.cmd = FD_CONFIG_COMMAND_YAW_ANGLE;
537*4882a593Smuzhiyun fd->config.err = ERROR_FD_NONE;
538*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_FD_CONFIG);
539*4882a593Smuzhiyun } else {
540*4882a593Smuzhiyun fd->config.cmd |= FD_CONFIG_COMMAND_YAW_ANGLE;
541*4882a593Smuzhiyun }
542*4882a593Smuzhiyun }
543*4882a593Smuzhiyun
__is_set_fd_config_smilemode(struct fimc_is * is,u32 val)544*4882a593Smuzhiyun void __is_set_fd_config_smilemode(struct fimc_is *is, u32 val)
545*4882a593Smuzhiyun {
546*4882a593Smuzhiyun unsigned int index = is->config_index;
547*4882a593Smuzhiyun struct fd_param *fd;
548*4882a593Smuzhiyun unsigned long *p_index;
549*4882a593Smuzhiyun
550*4882a593Smuzhiyun p_index = &is->config[index].p_region_index[1];
551*4882a593Smuzhiyun fd = &is->config[index].fd;
552*4882a593Smuzhiyun
553*4882a593Smuzhiyun fd->config.smile_mode = val;
554*4882a593Smuzhiyun
555*4882a593Smuzhiyun if (!test_bit((PARAM_FD_CONFIG - 32), p_index)) {
556*4882a593Smuzhiyun fd->config.cmd = FD_CONFIG_COMMAND_SMILE_MODE;
557*4882a593Smuzhiyun fd->config.err = ERROR_FD_NONE;
558*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_FD_CONFIG);
559*4882a593Smuzhiyun } else {
560*4882a593Smuzhiyun fd->config.cmd |= FD_CONFIG_COMMAND_SMILE_MODE;
561*4882a593Smuzhiyun }
562*4882a593Smuzhiyun }
563*4882a593Smuzhiyun
__is_set_fd_config_blinkmode(struct fimc_is * is,u32 val)564*4882a593Smuzhiyun void __is_set_fd_config_blinkmode(struct fimc_is *is, u32 val)
565*4882a593Smuzhiyun {
566*4882a593Smuzhiyun unsigned int index = is->config_index;
567*4882a593Smuzhiyun struct fd_param *fd;
568*4882a593Smuzhiyun unsigned long *p_index;
569*4882a593Smuzhiyun
570*4882a593Smuzhiyun p_index = &is->config[index].p_region_index[1];
571*4882a593Smuzhiyun fd = &is->config[index].fd;
572*4882a593Smuzhiyun
573*4882a593Smuzhiyun fd->config.blink_mode = val;
574*4882a593Smuzhiyun
575*4882a593Smuzhiyun if (!test_bit((PARAM_FD_CONFIG - 32), p_index)) {
576*4882a593Smuzhiyun fd->config.cmd = FD_CONFIG_COMMAND_BLINK_MODE;
577*4882a593Smuzhiyun fd->config.err = ERROR_FD_NONE;
578*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_FD_CONFIG);
579*4882a593Smuzhiyun } else {
580*4882a593Smuzhiyun fd->config.cmd |= FD_CONFIG_COMMAND_BLINK_MODE;
581*4882a593Smuzhiyun }
582*4882a593Smuzhiyun }
583*4882a593Smuzhiyun
__is_set_fd_config_eyedetect(struct fimc_is * is,u32 val)584*4882a593Smuzhiyun void __is_set_fd_config_eyedetect(struct fimc_is *is, u32 val)
585*4882a593Smuzhiyun {
586*4882a593Smuzhiyun unsigned int index = is->config_index;
587*4882a593Smuzhiyun struct fd_param *fd;
588*4882a593Smuzhiyun unsigned long *p_index;
589*4882a593Smuzhiyun
590*4882a593Smuzhiyun p_index = &is->config[index].p_region_index[1];
591*4882a593Smuzhiyun fd = &is->config[index].fd;
592*4882a593Smuzhiyun
593*4882a593Smuzhiyun fd->config.eye_detect = val;
594*4882a593Smuzhiyun
595*4882a593Smuzhiyun if (!test_bit((PARAM_FD_CONFIG - 32), p_index)) {
596*4882a593Smuzhiyun fd->config.cmd = FD_CONFIG_COMMAND_EYES_DETECT;
597*4882a593Smuzhiyun fd->config.err = ERROR_FD_NONE;
598*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_FD_CONFIG);
599*4882a593Smuzhiyun } else {
600*4882a593Smuzhiyun fd->config.cmd |= FD_CONFIG_COMMAND_EYES_DETECT;
601*4882a593Smuzhiyun }
602*4882a593Smuzhiyun }
603*4882a593Smuzhiyun
__is_set_fd_config_mouthdetect(struct fimc_is * is,u32 val)604*4882a593Smuzhiyun void __is_set_fd_config_mouthdetect(struct fimc_is *is, u32 val)
605*4882a593Smuzhiyun {
606*4882a593Smuzhiyun unsigned int index = is->config_index;
607*4882a593Smuzhiyun struct fd_param *fd;
608*4882a593Smuzhiyun unsigned long *p_index;
609*4882a593Smuzhiyun
610*4882a593Smuzhiyun p_index = &is->config[index].p_region_index[1];
611*4882a593Smuzhiyun fd = &is->config[index].fd;
612*4882a593Smuzhiyun
613*4882a593Smuzhiyun fd->config.mouth_detect = val;
614*4882a593Smuzhiyun
615*4882a593Smuzhiyun if (!test_bit((PARAM_FD_CONFIG - 32), p_index)) {
616*4882a593Smuzhiyun fd->config.cmd = FD_CONFIG_COMMAND_MOUTH_DETECT;
617*4882a593Smuzhiyun fd->config.err = ERROR_FD_NONE;
618*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_FD_CONFIG);
619*4882a593Smuzhiyun } else {
620*4882a593Smuzhiyun fd->config.cmd |= FD_CONFIG_COMMAND_MOUTH_DETECT;
621*4882a593Smuzhiyun }
622*4882a593Smuzhiyun }
623*4882a593Smuzhiyun
__is_set_fd_config_orientation(struct fimc_is * is,u32 val)624*4882a593Smuzhiyun void __is_set_fd_config_orientation(struct fimc_is *is, u32 val)
625*4882a593Smuzhiyun {
626*4882a593Smuzhiyun unsigned int index = is->config_index;
627*4882a593Smuzhiyun struct fd_param *fd;
628*4882a593Smuzhiyun unsigned long *p_index;
629*4882a593Smuzhiyun
630*4882a593Smuzhiyun p_index = &is->config[index].p_region_index[1];
631*4882a593Smuzhiyun fd = &is->config[index].fd;
632*4882a593Smuzhiyun
633*4882a593Smuzhiyun fd->config.orientation = val;
634*4882a593Smuzhiyun
635*4882a593Smuzhiyun if (!test_bit((PARAM_FD_CONFIG - 32), p_index)) {
636*4882a593Smuzhiyun fd->config.cmd = FD_CONFIG_COMMAND_ORIENTATION;
637*4882a593Smuzhiyun fd->config.err = ERROR_FD_NONE;
638*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_FD_CONFIG);
639*4882a593Smuzhiyun } else {
640*4882a593Smuzhiyun fd->config.cmd |= FD_CONFIG_COMMAND_ORIENTATION;
641*4882a593Smuzhiyun }
642*4882a593Smuzhiyun }
643*4882a593Smuzhiyun
__is_set_fd_config_orientation_val(struct fimc_is * is,u32 val)644*4882a593Smuzhiyun void __is_set_fd_config_orientation_val(struct fimc_is *is, u32 val)
645*4882a593Smuzhiyun {
646*4882a593Smuzhiyun unsigned int index = is->config_index;
647*4882a593Smuzhiyun struct fd_param *fd;
648*4882a593Smuzhiyun unsigned long *p_index;
649*4882a593Smuzhiyun
650*4882a593Smuzhiyun p_index = &is->config[index].p_region_index[1];
651*4882a593Smuzhiyun fd = &is->config[index].fd;
652*4882a593Smuzhiyun
653*4882a593Smuzhiyun fd->config.orientation_value = val;
654*4882a593Smuzhiyun
655*4882a593Smuzhiyun if (!test_bit((PARAM_FD_CONFIG - 32), p_index)) {
656*4882a593Smuzhiyun fd->config.cmd = FD_CONFIG_COMMAND_ORIENTATION_VALUE;
657*4882a593Smuzhiyun fd->config.err = ERROR_FD_NONE;
658*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_FD_CONFIG);
659*4882a593Smuzhiyun } else {
660*4882a593Smuzhiyun fd->config.cmd |= FD_CONFIG_COMMAND_ORIENTATION_VALUE;
661*4882a593Smuzhiyun }
662*4882a593Smuzhiyun }
663*4882a593Smuzhiyun
fimc_is_set_initial_params(struct fimc_is * is)664*4882a593Smuzhiyun void fimc_is_set_initial_params(struct fimc_is *is)
665*4882a593Smuzhiyun {
666*4882a593Smuzhiyun struct global_param *global;
667*4882a593Smuzhiyun struct isp_param *isp;
668*4882a593Smuzhiyun struct drc_param *drc;
669*4882a593Smuzhiyun struct fd_param *fd;
670*4882a593Smuzhiyun unsigned long *p_index;
671*4882a593Smuzhiyun unsigned int index;
672*4882a593Smuzhiyun
673*4882a593Smuzhiyun index = is->config_index;
674*4882a593Smuzhiyun global = &is->config[index].global;
675*4882a593Smuzhiyun isp = &is->config[index].isp;
676*4882a593Smuzhiyun drc = &is->config[index].drc;
677*4882a593Smuzhiyun fd = &is->config[index].fd;
678*4882a593Smuzhiyun p_index = &is->config[index].p_region_index[0];
679*4882a593Smuzhiyun
680*4882a593Smuzhiyun /* Global */
681*4882a593Smuzhiyun global->shotmode.cmd = 1;
682*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_GLOBAL_SHOTMODE);
683*4882a593Smuzhiyun
684*4882a593Smuzhiyun /* ISP */
685*4882a593Smuzhiyun isp->control.cmd = CONTROL_COMMAND_START;
686*4882a593Smuzhiyun isp->control.bypass = CONTROL_BYPASS_DISABLE;
687*4882a593Smuzhiyun isp->control.err = CONTROL_ERROR_NONE;
688*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_ISP_CONTROL);
689*4882a593Smuzhiyun
690*4882a593Smuzhiyun isp->otf_input.cmd = OTF_INPUT_COMMAND_ENABLE;
691*4882a593Smuzhiyun if (!test_bit(PARAM_ISP_OTF_INPUT, p_index)) {
692*4882a593Smuzhiyun isp->otf_input.width = DEFAULT_PREVIEW_STILL_WIDTH;
693*4882a593Smuzhiyun isp->otf_input.height = DEFAULT_PREVIEW_STILL_HEIGHT;
694*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_ISP_OTF_INPUT);
695*4882a593Smuzhiyun }
696*4882a593Smuzhiyun if (is->sensor->test_pattern)
697*4882a593Smuzhiyun isp->otf_input.format = OTF_INPUT_FORMAT_STRGEN_COLORBAR_BAYER;
698*4882a593Smuzhiyun else
699*4882a593Smuzhiyun isp->otf_input.format = OTF_INPUT_FORMAT_BAYER;
700*4882a593Smuzhiyun isp->otf_input.bitwidth = 10;
701*4882a593Smuzhiyun isp->otf_input.order = OTF_INPUT_ORDER_BAYER_GR_BG;
702*4882a593Smuzhiyun isp->otf_input.crop_offset_x = 0;
703*4882a593Smuzhiyun isp->otf_input.crop_offset_y = 0;
704*4882a593Smuzhiyun isp->otf_input.err = OTF_INPUT_ERROR_NONE;
705*4882a593Smuzhiyun
706*4882a593Smuzhiyun isp->dma1_input.cmd = DMA_INPUT_COMMAND_DISABLE;
707*4882a593Smuzhiyun isp->dma1_input.width = 0;
708*4882a593Smuzhiyun isp->dma1_input.height = 0;
709*4882a593Smuzhiyun isp->dma1_input.format = 0;
710*4882a593Smuzhiyun isp->dma1_input.bitwidth = 0;
711*4882a593Smuzhiyun isp->dma1_input.plane = 0;
712*4882a593Smuzhiyun isp->dma1_input.order = 0;
713*4882a593Smuzhiyun isp->dma1_input.buffer_number = 0;
714*4882a593Smuzhiyun isp->dma1_input.width = 0;
715*4882a593Smuzhiyun isp->dma1_input.err = DMA_INPUT_ERROR_NONE;
716*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_ISP_DMA1_INPUT);
717*4882a593Smuzhiyun
718*4882a593Smuzhiyun isp->dma2_input.cmd = DMA_INPUT_COMMAND_DISABLE;
719*4882a593Smuzhiyun isp->dma2_input.width = 0;
720*4882a593Smuzhiyun isp->dma2_input.height = 0;
721*4882a593Smuzhiyun isp->dma2_input.format = 0;
722*4882a593Smuzhiyun isp->dma2_input.bitwidth = 0;
723*4882a593Smuzhiyun isp->dma2_input.plane = 0;
724*4882a593Smuzhiyun isp->dma2_input.order = 0;
725*4882a593Smuzhiyun isp->dma2_input.buffer_number = 0;
726*4882a593Smuzhiyun isp->dma2_input.width = 0;
727*4882a593Smuzhiyun isp->dma2_input.err = DMA_INPUT_ERROR_NONE;
728*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_ISP_DMA2_INPUT);
729*4882a593Smuzhiyun
730*4882a593Smuzhiyun isp->aa.cmd = ISP_AA_COMMAND_START;
731*4882a593Smuzhiyun isp->aa.target = ISP_AA_TARGET_AE | ISP_AA_TARGET_AWB;
732*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_ISP_AA);
733*4882a593Smuzhiyun
734*4882a593Smuzhiyun if (!test_bit(PARAM_ISP_FLASH, p_index))
735*4882a593Smuzhiyun __is_set_isp_flash(is, ISP_FLASH_COMMAND_DISABLE,
736*4882a593Smuzhiyun ISP_FLASH_REDEYE_DISABLE);
737*4882a593Smuzhiyun
738*4882a593Smuzhiyun if (!test_bit(PARAM_ISP_AWB, p_index))
739*4882a593Smuzhiyun __is_set_isp_awb(is, ISP_AWB_COMMAND_AUTO, 0);
740*4882a593Smuzhiyun
741*4882a593Smuzhiyun if (!test_bit(PARAM_ISP_IMAGE_EFFECT, p_index))
742*4882a593Smuzhiyun __is_set_isp_effect(is, ISP_IMAGE_EFFECT_DISABLE);
743*4882a593Smuzhiyun
744*4882a593Smuzhiyun if (!test_bit(PARAM_ISP_ISO, p_index))
745*4882a593Smuzhiyun __is_set_isp_iso(is, ISP_ISO_COMMAND_AUTO, 0);
746*4882a593Smuzhiyun
747*4882a593Smuzhiyun if (!test_bit(PARAM_ISP_ADJUST, p_index)) {
748*4882a593Smuzhiyun __is_set_isp_adjust(is, ISP_ADJUST_COMMAND_MANUAL_CONTRAST, 0);
749*4882a593Smuzhiyun __is_set_isp_adjust(is,
750*4882a593Smuzhiyun ISP_ADJUST_COMMAND_MANUAL_SATURATION, 0);
751*4882a593Smuzhiyun __is_set_isp_adjust(is, ISP_ADJUST_COMMAND_MANUAL_SHARPNESS, 0);
752*4882a593Smuzhiyun __is_set_isp_adjust(is, ISP_ADJUST_COMMAND_MANUAL_EXPOSURE, 0);
753*4882a593Smuzhiyun __is_set_isp_adjust(is,
754*4882a593Smuzhiyun ISP_ADJUST_COMMAND_MANUAL_BRIGHTNESS, 0);
755*4882a593Smuzhiyun __is_set_isp_adjust(is, ISP_ADJUST_COMMAND_MANUAL_HUE, 0);
756*4882a593Smuzhiyun }
757*4882a593Smuzhiyun
758*4882a593Smuzhiyun if (!test_bit(PARAM_ISP_METERING, p_index)) {
759*4882a593Smuzhiyun __is_set_isp_metering(is, 0, ISP_METERING_COMMAND_CENTER);
760*4882a593Smuzhiyun __is_set_isp_metering(is, 1, 0);
761*4882a593Smuzhiyun __is_set_isp_metering(is, 2, 0);
762*4882a593Smuzhiyun __is_set_isp_metering(is, 3, 0);
763*4882a593Smuzhiyun __is_set_isp_metering(is, 4, 0);
764*4882a593Smuzhiyun }
765*4882a593Smuzhiyun
766*4882a593Smuzhiyun if (!test_bit(PARAM_ISP_AFC, p_index))
767*4882a593Smuzhiyun __is_set_isp_afc(is, ISP_AFC_COMMAND_AUTO, 0);
768*4882a593Smuzhiyun
769*4882a593Smuzhiyun isp->otf_output.cmd = OTF_OUTPUT_COMMAND_ENABLE;
770*4882a593Smuzhiyun if (!test_bit(PARAM_ISP_OTF_OUTPUT, p_index)) {
771*4882a593Smuzhiyun isp->otf_output.width = DEFAULT_PREVIEW_STILL_WIDTH;
772*4882a593Smuzhiyun isp->otf_output.height = DEFAULT_PREVIEW_STILL_HEIGHT;
773*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_ISP_OTF_OUTPUT);
774*4882a593Smuzhiyun }
775*4882a593Smuzhiyun isp->otf_output.format = OTF_OUTPUT_FORMAT_YUV444;
776*4882a593Smuzhiyun isp->otf_output.bitwidth = 12;
777*4882a593Smuzhiyun isp->otf_output.order = 0;
778*4882a593Smuzhiyun isp->otf_output.err = OTF_OUTPUT_ERROR_NONE;
779*4882a593Smuzhiyun
780*4882a593Smuzhiyun if (!test_bit(PARAM_ISP_DMA1_OUTPUT, p_index)) {
781*4882a593Smuzhiyun isp->dma1_output.cmd = DMA_OUTPUT_COMMAND_DISABLE;
782*4882a593Smuzhiyun isp->dma1_output.width = 0;
783*4882a593Smuzhiyun isp->dma1_output.height = 0;
784*4882a593Smuzhiyun isp->dma1_output.format = 0;
785*4882a593Smuzhiyun isp->dma1_output.bitwidth = 0;
786*4882a593Smuzhiyun isp->dma1_output.plane = 0;
787*4882a593Smuzhiyun isp->dma1_output.order = 0;
788*4882a593Smuzhiyun isp->dma1_output.buffer_number = 0;
789*4882a593Smuzhiyun isp->dma1_output.buffer_address = 0;
790*4882a593Smuzhiyun isp->dma1_output.notify_dma_done = 0;
791*4882a593Smuzhiyun isp->dma1_output.dma_out_mask = 0;
792*4882a593Smuzhiyun isp->dma1_output.err = DMA_OUTPUT_ERROR_NONE;
793*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_ISP_DMA1_OUTPUT);
794*4882a593Smuzhiyun }
795*4882a593Smuzhiyun
796*4882a593Smuzhiyun if (!test_bit(PARAM_ISP_DMA2_OUTPUT, p_index)) {
797*4882a593Smuzhiyun isp->dma2_output.cmd = DMA_OUTPUT_COMMAND_DISABLE;
798*4882a593Smuzhiyun isp->dma2_output.width = 0;
799*4882a593Smuzhiyun isp->dma2_output.height = 0;
800*4882a593Smuzhiyun isp->dma2_output.format = 0;
801*4882a593Smuzhiyun isp->dma2_output.bitwidth = 0;
802*4882a593Smuzhiyun isp->dma2_output.plane = 0;
803*4882a593Smuzhiyun isp->dma2_output.order = 0;
804*4882a593Smuzhiyun isp->dma2_output.buffer_number = 0;
805*4882a593Smuzhiyun isp->dma2_output.buffer_address = 0;
806*4882a593Smuzhiyun isp->dma2_output.notify_dma_done = 0;
807*4882a593Smuzhiyun isp->dma2_output.dma_out_mask = 0;
808*4882a593Smuzhiyun isp->dma2_output.err = DMA_OUTPUT_ERROR_NONE;
809*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_ISP_DMA2_OUTPUT);
810*4882a593Smuzhiyun }
811*4882a593Smuzhiyun
812*4882a593Smuzhiyun /* Sensor */
813*4882a593Smuzhiyun if (!test_bit(PARAM_SENSOR_FRAME_RATE, p_index)) {
814*4882a593Smuzhiyun if (is->config_index == 0)
815*4882a593Smuzhiyun __is_set_sensor(is, 0);
816*4882a593Smuzhiyun }
817*4882a593Smuzhiyun
818*4882a593Smuzhiyun /* DRC */
819*4882a593Smuzhiyun drc->control.cmd = CONTROL_COMMAND_START;
820*4882a593Smuzhiyun __is_set_drc_control(is, CONTROL_BYPASS_ENABLE);
821*4882a593Smuzhiyun
822*4882a593Smuzhiyun drc->otf_input.cmd = OTF_INPUT_COMMAND_ENABLE;
823*4882a593Smuzhiyun if (!test_bit(PARAM_DRC_OTF_INPUT, p_index)) {
824*4882a593Smuzhiyun drc->otf_input.width = DEFAULT_PREVIEW_STILL_WIDTH;
825*4882a593Smuzhiyun drc->otf_input.height = DEFAULT_PREVIEW_STILL_HEIGHT;
826*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_DRC_OTF_INPUT);
827*4882a593Smuzhiyun }
828*4882a593Smuzhiyun drc->otf_input.format = OTF_INPUT_FORMAT_YUV444;
829*4882a593Smuzhiyun drc->otf_input.bitwidth = 12;
830*4882a593Smuzhiyun drc->otf_input.order = 0;
831*4882a593Smuzhiyun drc->otf_input.err = OTF_INPUT_ERROR_NONE;
832*4882a593Smuzhiyun
833*4882a593Smuzhiyun drc->dma_input.cmd = DMA_INPUT_COMMAND_DISABLE;
834*4882a593Smuzhiyun drc->dma_input.width = 0;
835*4882a593Smuzhiyun drc->dma_input.height = 0;
836*4882a593Smuzhiyun drc->dma_input.format = 0;
837*4882a593Smuzhiyun drc->dma_input.bitwidth = 0;
838*4882a593Smuzhiyun drc->dma_input.plane = 0;
839*4882a593Smuzhiyun drc->dma_input.order = 0;
840*4882a593Smuzhiyun drc->dma_input.buffer_number = 0;
841*4882a593Smuzhiyun drc->dma_input.width = 0;
842*4882a593Smuzhiyun drc->dma_input.err = DMA_INPUT_ERROR_NONE;
843*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_DRC_DMA_INPUT);
844*4882a593Smuzhiyun
845*4882a593Smuzhiyun drc->otf_output.cmd = OTF_OUTPUT_COMMAND_ENABLE;
846*4882a593Smuzhiyun if (!test_bit(PARAM_DRC_OTF_OUTPUT, p_index)) {
847*4882a593Smuzhiyun drc->otf_output.width = DEFAULT_PREVIEW_STILL_WIDTH;
848*4882a593Smuzhiyun drc->otf_output.height = DEFAULT_PREVIEW_STILL_HEIGHT;
849*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_DRC_OTF_OUTPUT);
850*4882a593Smuzhiyun }
851*4882a593Smuzhiyun drc->otf_output.format = OTF_OUTPUT_FORMAT_YUV444;
852*4882a593Smuzhiyun drc->otf_output.bitwidth = 8;
853*4882a593Smuzhiyun drc->otf_output.order = 0;
854*4882a593Smuzhiyun drc->otf_output.err = OTF_OUTPUT_ERROR_NONE;
855*4882a593Smuzhiyun
856*4882a593Smuzhiyun /* FD */
857*4882a593Smuzhiyun __is_set_fd_control(is, CONTROL_COMMAND_STOP);
858*4882a593Smuzhiyun fd->control.bypass = CONTROL_BYPASS_DISABLE;
859*4882a593Smuzhiyun
860*4882a593Smuzhiyun fd->otf_input.cmd = OTF_INPUT_COMMAND_ENABLE;
861*4882a593Smuzhiyun if (!test_bit(PARAM_FD_OTF_INPUT, p_index)) {
862*4882a593Smuzhiyun fd->otf_input.width = DEFAULT_PREVIEW_STILL_WIDTH;
863*4882a593Smuzhiyun fd->otf_input.height = DEFAULT_PREVIEW_STILL_HEIGHT;
864*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_FD_OTF_INPUT);
865*4882a593Smuzhiyun }
866*4882a593Smuzhiyun
867*4882a593Smuzhiyun fd->otf_input.format = OTF_INPUT_FORMAT_YUV444;
868*4882a593Smuzhiyun fd->otf_input.bitwidth = 8;
869*4882a593Smuzhiyun fd->otf_input.order = 0;
870*4882a593Smuzhiyun fd->otf_input.err = OTF_INPUT_ERROR_NONE;
871*4882a593Smuzhiyun
872*4882a593Smuzhiyun fd->dma_input.cmd = DMA_INPUT_COMMAND_DISABLE;
873*4882a593Smuzhiyun fd->dma_input.width = 0;
874*4882a593Smuzhiyun fd->dma_input.height = 0;
875*4882a593Smuzhiyun fd->dma_input.format = 0;
876*4882a593Smuzhiyun fd->dma_input.bitwidth = 0;
877*4882a593Smuzhiyun fd->dma_input.plane = 0;
878*4882a593Smuzhiyun fd->dma_input.order = 0;
879*4882a593Smuzhiyun fd->dma_input.buffer_number = 0;
880*4882a593Smuzhiyun fd->dma_input.width = 0;
881*4882a593Smuzhiyun fd->dma_input.err = DMA_INPUT_ERROR_NONE;
882*4882a593Smuzhiyun fimc_is_set_param_bit(is, PARAM_FD_DMA_INPUT);
883*4882a593Smuzhiyun
884*4882a593Smuzhiyun __is_set_fd_config_maxface(is, 5);
885*4882a593Smuzhiyun __is_set_fd_config_rollangle(is, FD_CONFIG_ROLL_ANGLE_FULL);
886*4882a593Smuzhiyun __is_set_fd_config_yawangle(is, FD_CONFIG_YAW_ANGLE_45_90);
887*4882a593Smuzhiyun __is_set_fd_config_smilemode(is, FD_CONFIG_SMILE_MODE_DISABLE);
888*4882a593Smuzhiyun __is_set_fd_config_blinkmode(is, FD_CONFIG_BLINK_MODE_DISABLE);
889*4882a593Smuzhiyun __is_set_fd_config_eyedetect(is, FD_CONFIG_EYES_DETECT_ENABLE);
890*4882a593Smuzhiyun __is_set_fd_config_mouthdetect(is, FD_CONFIG_MOUTH_DETECT_DISABLE);
891*4882a593Smuzhiyun __is_set_fd_config_orientation(is, FD_CONFIG_ORIENTATION_DISABLE);
892*4882a593Smuzhiyun __is_set_fd_config_orientation_val(is, 0);
893*4882a593Smuzhiyun }
894