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