162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Samsung EXYNOS4x12 FIMC-IS (Imaging Subsystem) driver 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2013 Samsung Electronics Co., Ltd. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Authors: Younghwan Joo <yhwan.joo@samsung.com> 862306a36Sopenharmony_ci * Sylwester Nawrocki <s.nawrocki@samsung.com> 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci#define pr_fmt(fmt) "%s:%d " fmt, __func__, __LINE__ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/bitops.h> 1362306a36Sopenharmony_ci#include <linux/bug.h> 1462306a36Sopenharmony_ci#include <linux/device.h> 1562306a36Sopenharmony_ci#include <linux/errno.h> 1662306a36Sopenharmony_ci#include <linux/kernel.h> 1762306a36Sopenharmony_ci#include <linux/module.h> 1862306a36Sopenharmony_ci#include <linux/platform_device.h> 1962306a36Sopenharmony_ci#include <linux/slab.h> 2062306a36Sopenharmony_ci#include <linux/types.h> 2162306a36Sopenharmony_ci#include <linux/videodev2.h> 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#include <media/v4l2-device.h> 2462306a36Sopenharmony_ci#include <media/v4l2-ioctl.h> 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#include "fimc-is.h" 2762306a36Sopenharmony_ci#include "fimc-is-command.h" 2862306a36Sopenharmony_ci#include "fimc-is-errno.h" 2962306a36Sopenharmony_ci#include "fimc-is-param.h" 3062306a36Sopenharmony_ci#include "fimc-is-regs.h" 3162306a36Sopenharmony_ci#include "fimc-is-sensor.h" 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistatic void __hw_param_copy(void *dst, void *src) 3462306a36Sopenharmony_ci{ 3562306a36Sopenharmony_ci memcpy(dst, src, FIMC_IS_PARAM_MAX_SIZE); 3662306a36Sopenharmony_ci} 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistatic void __fimc_is_hw_update_param_global_shotmode(struct fimc_is *is) 3962306a36Sopenharmony_ci{ 4062306a36Sopenharmony_ci struct param_global_shotmode *dst, *src; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci dst = &is->is_p_region->parameter.global.shotmode; 4362306a36Sopenharmony_ci src = &is->config[is->config_index].global.shotmode; 4462306a36Sopenharmony_ci __hw_param_copy(dst, src); 4562306a36Sopenharmony_ci} 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_cistatic void __fimc_is_hw_update_param_sensor_framerate(struct fimc_is *is) 4862306a36Sopenharmony_ci{ 4962306a36Sopenharmony_ci struct param_sensor_framerate *dst, *src; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci dst = &is->is_p_region->parameter.sensor.frame_rate; 5262306a36Sopenharmony_ci src = &is->config[is->config_index].sensor.frame_rate; 5362306a36Sopenharmony_ci __hw_param_copy(dst, src); 5462306a36Sopenharmony_ci} 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ciint __fimc_is_hw_update_param(struct fimc_is *is, u32 offset) 5762306a36Sopenharmony_ci{ 5862306a36Sopenharmony_ci struct is_param_region *par = &is->is_p_region->parameter; 5962306a36Sopenharmony_ci struct chain_config *cfg = &is->config[is->config_index]; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci switch (offset) { 6262306a36Sopenharmony_ci case PARAM_ISP_CONTROL: 6362306a36Sopenharmony_ci __hw_param_copy(&par->isp.control, &cfg->isp.control); 6462306a36Sopenharmony_ci break; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci case PARAM_ISP_OTF_INPUT: 6762306a36Sopenharmony_ci __hw_param_copy(&par->isp.otf_input, &cfg->isp.otf_input); 6862306a36Sopenharmony_ci break; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci case PARAM_ISP_DMA1_INPUT: 7162306a36Sopenharmony_ci __hw_param_copy(&par->isp.dma1_input, &cfg->isp.dma1_input); 7262306a36Sopenharmony_ci break; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci case PARAM_ISP_DMA2_INPUT: 7562306a36Sopenharmony_ci __hw_param_copy(&par->isp.dma2_input, &cfg->isp.dma2_input); 7662306a36Sopenharmony_ci break; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci case PARAM_ISP_AA: 7962306a36Sopenharmony_ci __hw_param_copy(&par->isp.aa, &cfg->isp.aa); 8062306a36Sopenharmony_ci break; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci case PARAM_ISP_FLASH: 8362306a36Sopenharmony_ci __hw_param_copy(&par->isp.flash, &cfg->isp.flash); 8462306a36Sopenharmony_ci break; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci case PARAM_ISP_AWB: 8762306a36Sopenharmony_ci __hw_param_copy(&par->isp.awb, &cfg->isp.awb); 8862306a36Sopenharmony_ci break; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci case PARAM_ISP_IMAGE_EFFECT: 9162306a36Sopenharmony_ci __hw_param_copy(&par->isp.effect, &cfg->isp.effect); 9262306a36Sopenharmony_ci break; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci case PARAM_ISP_ISO: 9562306a36Sopenharmony_ci __hw_param_copy(&par->isp.iso, &cfg->isp.iso); 9662306a36Sopenharmony_ci break; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci case PARAM_ISP_ADJUST: 9962306a36Sopenharmony_ci __hw_param_copy(&par->isp.adjust, &cfg->isp.adjust); 10062306a36Sopenharmony_ci break; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci case PARAM_ISP_METERING: 10362306a36Sopenharmony_ci __hw_param_copy(&par->isp.metering, &cfg->isp.metering); 10462306a36Sopenharmony_ci break; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci case PARAM_ISP_AFC: 10762306a36Sopenharmony_ci __hw_param_copy(&par->isp.afc, &cfg->isp.afc); 10862306a36Sopenharmony_ci break; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci case PARAM_ISP_OTF_OUTPUT: 11162306a36Sopenharmony_ci __hw_param_copy(&par->isp.otf_output, &cfg->isp.otf_output); 11262306a36Sopenharmony_ci break; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci case PARAM_ISP_DMA1_OUTPUT: 11562306a36Sopenharmony_ci __hw_param_copy(&par->isp.dma1_output, &cfg->isp.dma1_output); 11662306a36Sopenharmony_ci break; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci case PARAM_ISP_DMA2_OUTPUT: 11962306a36Sopenharmony_ci __hw_param_copy(&par->isp.dma2_output, &cfg->isp.dma2_output); 12062306a36Sopenharmony_ci break; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci case PARAM_DRC_CONTROL: 12362306a36Sopenharmony_ci __hw_param_copy(&par->drc.control, &cfg->drc.control); 12462306a36Sopenharmony_ci break; 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci case PARAM_DRC_OTF_INPUT: 12762306a36Sopenharmony_ci __hw_param_copy(&par->drc.otf_input, &cfg->drc.otf_input); 12862306a36Sopenharmony_ci break; 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci case PARAM_DRC_DMA_INPUT: 13162306a36Sopenharmony_ci __hw_param_copy(&par->drc.dma_input, &cfg->drc.dma_input); 13262306a36Sopenharmony_ci break; 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci case PARAM_DRC_OTF_OUTPUT: 13562306a36Sopenharmony_ci __hw_param_copy(&par->drc.otf_output, &cfg->drc.otf_output); 13662306a36Sopenharmony_ci break; 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci case PARAM_FD_CONTROL: 13962306a36Sopenharmony_ci __hw_param_copy(&par->fd.control, &cfg->fd.control); 14062306a36Sopenharmony_ci break; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci case PARAM_FD_OTF_INPUT: 14362306a36Sopenharmony_ci __hw_param_copy(&par->fd.otf_input, &cfg->fd.otf_input); 14462306a36Sopenharmony_ci break; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci case PARAM_FD_DMA_INPUT: 14762306a36Sopenharmony_ci __hw_param_copy(&par->fd.dma_input, &cfg->fd.dma_input); 14862306a36Sopenharmony_ci break; 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci case PARAM_FD_CONFIG: 15162306a36Sopenharmony_ci __hw_param_copy(&par->fd.config, &cfg->fd.config); 15262306a36Sopenharmony_ci break; 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci default: 15562306a36Sopenharmony_ci return -EINVAL; 15662306a36Sopenharmony_ci } 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci return 0; 15962306a36Sopenharmony_ci} 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ciunsigned int __get_pending_param_count(struct fimc_is *is) 16262306a36Sopenharmony_ci{ 16362306a36Sopenharmony_ci struct chain_config *config = &is->config[is->config_index]; 16462306a36Sopenharmony_ci unsigned long flags; 16562306a36Sopenharmony_ci unsigned int count; 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci spin_lock_irqsave(&is->slock, flags); 16862306a36Sopenharmony_ci count = hweight32(config->p_region_index[0]); 16962306a36Sopenharmony_ci count += hweight32(config->p_region_index[1]); 17062306a36Sopenharmony_ci spin_unlock_irqrestore(&is->slock, flags); 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci return count; 17362306a36Sopenharmony_ci} 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ciint __is_hw_update_params(struct fimc_is *is) 17662306a36Sopenharmony_ci{ 17762306a36Sopenharmony_ci unsigned long *p_index; 17862306a36Sopenharmony_ci int i, id, ret = 0; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci id = is->config_index; 18162306a36Sopenharmony_ci p_index = &is->config[id].p_region_index[0]; 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci if (test_bit(PARAM_GLOBAL_SHOTMODE, p_index)) 18462306a36Sopenharmony_ci __fimc_is_hw_update_param_global_shotmode(is); 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci if (test_bit(PARAM_SENSOR_FRAME_RATE, p_index)) 18762306a36Sopenharmony_ci __fimc_is_hw_update_param_sensor_framerate(is); 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci for (i = PARAM_ISP_CONTROL; i < PARAM_DRC_CONTROL; i++) { 19062306a36Sopenharmony_ci if (test_bit(i, p_index)) 19162306a36Sopenharmony_ci ret = __fimc_is_hw_update_param(is, i); 19262306a36Sopenharmony_ci } 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci for (i = PARAM_DRC_CONTROL; i < PARAM_SCALERC_CONTROL; i++) { 19562306a36Sopenharmony_ci if (test_bit(i, p_index)) 19662306a36Sopenharmony_ci ret = __fimc_is_hw_update_param(is, i); 19762306a36Sopenharmony_ci } 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci for (i = PARAM_FD_CONTROL; i <= PARAM_FD_CONFIG; i++) { 20062306a36Sopenharmony_ci if (test_bit(i, p_index)) 20162306a36Sopenharmony_ci ret = __fimc_is_hw_update_param(is, i); 20262306a36Sopenharmony_ci } 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci return ret; 20562306a36Sopenharmony_ci} 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_civoid __is_get_frame_size(struct fimc_is *is, struct v4l2_mbus_framefmt *mf) 20862306a36Sopenharmony_ci{ 20962306a36Sopenharmony_ci struct isp_param *isp; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci isp = &is->config[is->config_index].isp; 21262306a36Sopenharmony_ci mf->width = isp->otf_input.width; 21362306a36Sopenharmony_ci mf->height = isp->otf_input.height; 21462306a36Sopenharmony_ci} 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_civoid __is_set_frame_size(struct fimc_is *is, struct v4l2_mbus_framefmt *mf) 21762306a36Sopenharmony_ci{ 21862306a36Sopenharmony_ci unsigned int index = is->config_index; 21962306a36Sopenharmony_ci struct isp_param *isp; 22062306a36Sopenharmony_ci struct drc_param *drc; 22162306a36Sopenharmony_ci struct fd_param *fd; 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci isp = &is->config[index].isp; 22462306a36Sopenharmony_ci drc = &is->config[index].drc; 22562306a36Sopenharmony_ci fd = &is->config[index].fd; 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci /* Update isp size info (OTF only) */ 22862306a36Sopenharmony_ci isp->otf_input.width = mf->width; 22962306a36Sopenharmony_ci isp->otf_input.height = mf->height; 23062306a36Sopenharmony_ci isp->otf_output.width = mf->width; 23162306a36Sopenharmony_ci isp->otf_output.height = mf->height; 23262306a36Sopenharmony_ci /* Update drc size info (OTF only) */ 23362306a36Sopenharmony_ci drc->otf_input.width = mf->width; 23462306a36Sopenharmony_ci drc->otf_input.height = mf->height; 23562306a36Sopenharmony_ci drc->otf_output.width = mf->width; 23662306a36Sopenharmony_ci drc->otf_output.height = mf->height; 23762306a36Sopenharmony_ci /* Update fd size info (OTF only) */ 23862306a36Sopenharmony_ci fd->otf_input.width = mf->width; 23962306a36Sopenharmony_ci fd->otf_input.height = mf->height; 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci if (test_bit(PARAM_ISP_OTF_INPUT, 24262306a36Sopenharmony_ci &is->config[index].p_region_index[0])) 24362306a36Sopenharmony_ci return; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci /* Update field */ 24662306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_ISP_OTF_INPUT); 24762306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_ISP_OTF_OUTPUT); 24862306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_DRC_OTF_INPUT); 24962306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_DRC_OTF_OUTPUT); 25062306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_FD_OTF_INPUT); 25162306a36Sopenharmony_ci} 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ciint fimc_is_hw_get_sensor_max_framerate(struct fimc_is *is) 25462306a36Sopenharmony_ci{ 25562306a36Sopenharmony_ci switch (is->sensor->drvdata->id) { 25662306a36Sopenharmony_ci case FIMC_IS_SENSOR_ID_S5K6A3: 25762306a36Sopenharmony_ci return 30; 25862306a36Sopenharmony_ci default: 25962306a36Sopenharmony_ci return 15; 26062306a36Sopenharmony_ci } 26162306a36Sopenharmony_ci} 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_civoid __is_set_sensor(struct fimc_is *is, int fps) 26462306a36Sopenharmony_ci{ 26562306a36Sopenharmony_ci unsigned int index = is->config_index; 26662306a36Sopenharmony_ci struct sensor_param *sensor; 26762306a36Sopenharmony_ci struct isp_param *isp; 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci sensor = &is->config[index].sensor; 27062306a36Sopenharmony_ci isp = &is->config[index].isp; 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci if (fps == 0) { 27362306a36Sopenharmony_ci sensor->frame_rate.frame_rate = 27462306a36Sopenharmony_ci fimc_is_hw_get_sensor_max_framerate(is); 27562306a36Sopenharmony_ci isp->otf_input.frametime_min = 0; 27662306a36Sopenharmony_ci isp->otf_input.frametime_max = 66666; 27762306a36Sopenharmony_ci } else { 27862306a36Sopenharmony_ci sensor->frame_rate.frame_rate = fps; 27962306a36Sopenharmony_ci isp->otf_input.frametime_min = 0; 28062306a36Sopenharmony_ci isp->otf_input.frametime_max = (u32)1000000 / fps; 28162306a36Sopenharmony_ci } 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_SENSOR_FRAME_RATE); 28462306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_ISP_OTF_INPUT); 28562306a36Sopenharmony_ci} 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_cistatic void __maybe_unused __is_set_init_isp_aa(struct fimc_is *is) 28862306a36Sopenharmony_ci{ 28962306a36Sopenharmony_ci struct isp_param *isp; 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ci isp = &is->config[is->config_index].isp; 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci isp->aa.cmd = ISP_AA_COMMAND_START; 29462306a36Sopenharmony_ci isp->aa.target = ISP_AA_TARGET_AF | ISP_AA_TARGET_AE | 29562306a36Sopenharmony_ci ISP_AA_TARGET_AWB; 29662306a36Sopenharmony_ci isp->aa.mode = 0; 29762306a36Sopenharmony_ci isp->aa.scene = 0; 29862306a36Sopenharmony_ci isp->aa.sleep = 0; 29962306a36Sopenharmony_ci isp->aa.face = 0; 30062306a36Sopenharmony_ci isp->aa.touch_x = 0; 30162306a36Sopenharmony_ci isp->aa.touch_y = 0; 30262306a36Sopenharmony_ci isp->aa.manual_af_setting = 0; 30362306a36Sopenharmony_ci isp->aa.err = ISP_AF_ERROR_NONE; 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_ISP_AA); 30662306a36Sopenharmony_ci} 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_civoid __is_set_isp_flash(struct fimc_is *is, u32 cmd, u32 redeye) 30962306a36Sopenharmony_ci{ 31062306a36Sopenharmony_ci unsigned int index = is->config_index; 31162306a36Sopenharmony_ci struct isp_param *isp = &is->config[index].isp; 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci isp->flash.cmd = cmd; 31462306a36Sopenharmony_ci isp->flash.redeye = redeye; 31562306a36Sopenharmony_ci isp->flash.err = ISP_FLASH_ERROR_NONE; 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_ISP_FLASH); 31862306a36Sopenharmony_ci} 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_civoid __is_set_isp_awb(struct fimc_is *is, u32 cmd, u32 val) 32162306a36Sopenharmony_ci{ 32262306a36Sopenharmony_ci unsigned int index = is->config_index; 32362306a36Sopenharmony_ci struct isp_param *isp; 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci isp = &is->config[index].isp; 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci isp->awb.cmd = cmd; 32862306a36Sopenharmony_ci isp->awb.illumination = val; 32962306a36Sopenharmony_ci isp->awb.err = ISP_AWB_ERROR_NONE; 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_ISP_AWB); 33262306a36Sopenharmony_ci} 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_civoid __is_set_isp_effect(struct fimc_is *is, u32 cmd) 33562306a36Sopenharmony_ci{ 33662306a36Sopenharmony_ci unsigned int index = is->config_index; 33762306a36Sopenharmony_ci struct isp_param *isp; 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_ci isp = &is->config[index].isp; 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci isp->effect.cmd = cmd; 34262306a36Sopenharmony_ci isp->effect.err = ISP_IMAGE_EFFECT_ERROR_NONE; 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_ISP_IMAGE_EFFECT); 34562306a36Sopenharmony_ci} 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_civoid __is_set_isp_iso(struct fimc_is *is, u32 cmd, u32 val) 34862306a36Sopenharmony_ci{ 34962306a36Sopenharmony_ci unsigned int index = is->config_index; 35062306a36Sopenharmony_ci struct isp_param *isp; 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ci isp = &is->config[index].isp; 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci isp->iso.cmd = cmd; 35562306a36Sopenharmony_ci isp->iso.value = val; 35662306a36Sopenharmony_ci isp->iso.err = ISP_ISO_ERROR_NONE; 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_ISP_ISO); 35962306a36Sopenharmony_ci} 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_civoid __is_set_isp_adjust(struct fimc_is *is, u32 cmd, u32 val) 36262306a36Sopenharmony_ci{ 36362306a36Sopenharmony_ci unsigned int index = is->config_index; 36462306a36Sopenharmony_ci unsigned long *p_index; 36562306a36Sopenharmony_ci struct isp_param *isp; 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci p_index = &is->config[index].p_region_index[0]; 36862306a36Sopenharmony_ci isp = &is->config[index].isp; 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci switch (cmd) { 37162306a36Sopenharmony_ci case ISP_ADJUST_COMMAND_MANUAL_CONTRAST: 37262306a36Sopenharmony_ci isp->adjust.contrast = val; 37362306a36Sopenharmony_ci break; 37462306a36Sopenharmony_ci case ISP_ADJUST_COMMAND_MANUAL_SATURATION: 37562306a36Sopenharmony_ci isp->adjust.saturation = val; 37662306a36Sopenharmony_ci break; 37762306a36Sopenharmony_ci case ISP_ADJUST_COMMAND_MANUAL_SHARPNESS: 37862306a36Sopenharmony_ci isp->adjust.sharpness = val; 37962306a36Sopenharmony_ci break; 38062306a36Sopenharmony_ci case ISP_ADJUST_COMMAND_MANUAL_EXPOSURE: 38162306a36Sopenharmony_ci isp->adjust.exposure = val; 38262306a36Sopenharmony_ci break; 38362306a36Sopenharmony_ci case ISP_ADJUST_COMMAND_MANUAL_BRIGHTNESS: 38462306a36Sopenharmony_ci isp->adjust.brightness = val; 38562306a36Sopenharmony_ci break; 38662306a36Sopenharmony_ci case ISP_ADJUST_COMMAND_MANUAL_HUE: 38762306a36Sopenharmony_ci isp->adjust.hue = val; 38862306a36Sopenharmony_ci break; 38962306a36Sopenharmony_ci case ISP_ADJUST_COMMAND_AUTO: 39062306a36Sopenharmony_ci isp->adjust.contrast = 0; 39162306a36Sopenharmony_ci isp->adjust.saturation = 0; 39262306a36Sopenharmony_ci isp->adjust.sharpness = 0; 39362306a36Sopenharmony_ci isp->adjust.exposure = 0; 39462306a36Sopenharmony_ci isp->adjust.brightness = 0; 39562306a36Sopenharmony_ci isp->adjust.hue = 0; 39662306a36Sopenharmony_ci break; 39762306a36Sopenharmony_ci } 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci if (!test_bit(PARAM_ISP_ADJUST, p_index)) { 40062306a36Sopenharmony_ci isp->adjust.cmd = cmd; 40162306a36Sopenharmony_ci isp->adjust.err = ISP_ADJUST_ERROR_NONE; 40262306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_ISP_ADJUST); 40362306a36Sopenharmony_ci } else { 40462306a36Sopenharmony_ci isp->adjust.cmd |= cmd; 40562306a36Sopenharmony_ci } 40662306a36Sopenharmony_ci} 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_civoid __is_set_isp_metering(struct fimc_is *is, u32 id, u32 val) 40962306a36Sopenharmony_ci{ 41062306a36Sopenharmony_ci unsigned int index = is->config_index; 41162306a36Sopenharmony_ci struct isp_param *isp; 41262306a36Sopenharmony_ci unsigned long *p_index; 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_ci p_index = &is->config[index].p_region_index[0]; 41562306a36Sopenharmony_ci isp = &is->config[index].isp; 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ci switch (id) { 41862306a36Sopenharmony_ci case IS_METERING_CONFIG_CMD: 41962306a36Sopenharmony_ci isp->metering.cmd = val; 42062306a36Sopenharmony_ci break; 42162306a36Sopenharmony_ci case IS_METERING_CONFIG_WIN_POS_X: 42262306a36Sopenharmony_ci isp->metering.win_pos_x = val; 42362306a36Sopenharmony_ci break; 42462306a36Sopenharmony_ci case IS_METERING_CONFIG_WIN_POS_Y: 42562306a36Sopenharmony_ci isp->metering.win_pos_y = val; 42662306a36Sopenharmony_ci break; 42762306a36Sopenharmony_ci case IS_METERING_CONFIG_WIN_WIDTH: 42862306a36Sopenharmony_ci isp->metering.win_width = val; 42962306a36Sopenharmony_ci break; 43062306a36Sopenharmony_ci case IS_METERING_CONFIG_WIN_HEIGHT: 43162306a36Sopenharmony_ci isp->metering.win_height = val; 43262306a36Sopenharmony_ci break; 43362306a36Sopenharmony_ci default: 43462306a36Sopenharmony_ci return; 43562306a36Sopenharmony_ci } 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_ci if (!test_bit(PARAM_ISP_METERING, p_index)) { 43862306a36Sopenharmony_ci isp->metering.err = ISP_METERING_ERROR_NONE; 43962306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_ISP_METERING); 44062306a36Sopenharmony_ci } 44162306a36Sopenharmony_ci} 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_civoid __is_set_isp_afc(struct fimc_is *is, u32 cmd, u32 val) 44462306a36Sopenharmony_ci{ 44562306a36Sopenharmony_ci unsigned int index = is->config_index; 44662306a36Sopenharmony_ci struct isp_param *isp; 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ci isp = &is->config[index].isp; 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_ci isp->afc.cmd = cmd; 45162306a36Sopenharmony_ci isp->afc.manual = val; 45262306a36Sopenharmony_ci isp->afc.err = ISP_AFC_ERROR_NONE; 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_ISP_AFC); 45562306a36Sopenharmony_ci} 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_civoid __is_set_drc_control(struct fimc_is *is, u32 val) 45862306a36Sopenharmony_ci{ 45962306a36Sopenharmony_ci unsigned int index = is->config_index; 46062306a36Sopenharmony_ci struct drc_param *drc; 46162306a36Sopenharmony_ci 46262306a36Sopenharmony_ci drc = &is->config[index].drc; 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_ci drc->control.bypass = val; 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_DRC_CONTROL); 46762306a36Sopenharmony_ci} 46862306a36Sopenharmony_ci 46962306a36Sopenharmony_civoid __is_set_fd_control(struct fimc_is *is, u32 val) 47062306a36Sopenharmony_ci{ 47162306a36Sopenharmony_ci unsigned int index = is->config_index; 47262306a36Sopenharmony_ci struct fd_param *fd; 47362306a36Sopenharmony_ci unsigned long *p_index; 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ci p_index = &is->config[index].p_region_index[1]; 47662306a36Sopenharmony_ci fd = &is->config[index].fd; 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ci fd->control.cmd = val; 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_ci if (!test_bit((PARAM_FD_CONFIG - 32), p_index)) 48162306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_FD_CONTROL); 48262306a36Sopenharmony_ci} 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_civoid __is_set_fd_config_maxface(struct fimc_is *is, u32 val) 48562306a36Sopenharmony_ci{ 48662306a36Sopenharmony_ci unsigned int index = is->config_index; 48762306a36Sopenharmony_ci struct fd_param *fd; 48862306a36Sopenharmony_ci unsigned long *p_index; 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ci p_index = &is->config[index].p_region_index[1]; 49162306a36Sopenharmony_ci fd = &is->config[index].fd; 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_ci fd->config.max_number = val; 49462306a36Sopenharmony_ci 49562306a36Sopenharmony_ci if (!test_bit((PARAM_FD_CONFIG - 32), p_index)) { 49662306a36Sopenharmony_ci fd->config.cmd = FD_CONFIG_COMMAND_MAXIMUM_NUMBER; 49762306a36Sopenharmony_ci fd->config.err = ERROR_FD_NONE; 49862306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_FD_CONFIG); 49962306a36Sopenharmony_ci } else { 50062306a36Sopenharmony_ci fd->config.cmd |= FD_CONFIG_COMMAND_MAXIMUM_NUMBER; 50162306a36Sopenharmony_ci } 50262306a36Sopenharmony_ci} 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_civoid __is_set_fd_config_rollangle(struct fimc_is *is, u32 val) 50562306a36Sopenharmony_ci{ 50662306a36Sopenharmony_ci unsigned int index = is->config_index; 50762306a36Sopenharmony_ci struct fd_param *fd; 50862306a36Sopenharmony_ci unsigned long *p_index; 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_ci p_index = &is->config[index].p_region_index[1]; 51162306a36Sopenharmony_ci fd = &is->config[index].fd; 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_ci fd->config.roll_angle = val; 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_ci if (!test_bit((PARAM_FD_CONFIG - 32), p_index)) { 51662306a36Sopenharmony_ci fd->config.cmd = FD_CONFIG_COMMAND_ROLL_ANGLE; 51762306a36Sopenharmony_ci fd->config.err = ERROR_FD_NONE; 51862306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_FD_CONFIG); 51962306a36Sopenharmony_ci } else { 52062306a36Sopenharmony_ci fd->config.cmd |= FD_CONFIG_COMMAND_ROLL_ANGLE; 52162306a36Sopenharmony_ci } 52262306a36Sopenharmony_ci} 52362306a36Sopenharmony_ci 52462306a36Sopenharmony_civoid __is_set_fd_config_yawangle(struct fimc_is *is, u32 val) 52562306a36Sopenharmony_ci{ 52662306a36Sopenharmony_ci unsigned int index = is->config_index; 52762306a36Sopenharmony_ci struct fd_param *fd; 52862306a36Sopenharmony_ci unsigned long *p_index; 52962306a36Sopenharmony_ci 53062306a36Sopenharmony_ci p_index = &is->config[index].p_region_index[1]; 53162306a36Sopenharmony_ci fd = &is->config[index].fd; 53262306a36Sopenharmony_ci 53362306a36Sopenharmony_ci fd->config.yaw_angle = val; 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_ci if (!test_bit((PARAM_FD_CONFIG - 32), p_index)) { 53662306a36Sopenharmony_ci fd->config.cmd = FD_CONFIG_COMMAND_YAW_ANGLE; 53762306a36Sopenharmony_ci fd->config.err = ERROR_FD_NONE; 53862306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_FD_CONFIG); 53962306a36Sopenharmony_ci } else { 54062306a36Sopenharmony_ci fd->config.cmd |= FD_CONFIG_COMMAND_YAW_ANGLE; 54162306a36Sopenharmony_ci } 54262306a36Sopenharmony_ci} 54362306a36Sopenharmony_ci 54462306a36Sopenharmony_civoid __is_set_fd_config_smilemode(struct fimc_is *is, u32 val) 54562306a36Sopenharmony_ci{ 54662306a36Sopenharmony_ci unsigned int index = is->config_index; 54762306a36Sopenharmony_ci struct fd_param *fd; 54862306a36Sopenharmony_ci unsigned long *p_index; 54962306a36Sopenharmony_ci 55062306a36Sopenharmony_ci p_index = &is->config[index].p_region_index[1]; 55162306a36Sopenharmony_ci fd = &is->config[index].fd; 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_ci fd->config.smile_mode = val; 55462306a36Sopenharmony_ci 55562306a36Sopenharmony_ci if (!test_bit((PARAM_FD_CONFIG - 32), p_index)) { 55662306a36Sopenharmony_ci fd->config.cmd = FD_CONFIG_COMMAND_SMILE_MODE; 55762306a36Sopenharmony_ci fd->config.err = ERROR_FD_NONE; 55862306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_FD_CONFIG); 55962306a36Sopenharmony_ci } else { 56062306a36Sopenharmony_ci fd->config.cmd |= FD_CONFIG_COMMAND_SMILE_MODE; 56162306a36Sopenharmony_ci } 56262306a36Sopenharmony_ci} 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_civoid __is_set_fd_config_blinkmode(struct fimc_is *is, u32 val) 56562306a36Sopenharmony_ci{ 56662306a36Sopenharmony_ci unsigned int index = is->config_index; 56762306a36Sopenharmony_ci struct fd_param *fd; 56862306a36Sopenharmony_ci unsigned long *p_index; 56962306a36Sopenharmony_ci 57062306a36Sopenharmony_ci p_index = &is->config[index].p_region_index[1]; 57162306a36Sopenharmony_ci fd = &is->config[index].fd; 57262306a36Sopenharmony_ci 57362306a36Sopenharmony_ci fd->config.blink_mode = val; 57462306a36Sopenharmony_ci 57562306a36Sopenharmony_ci if (!test_bit((PARAM_FD_CONFIG - 32), p_index)) { 57662306a36Sopenharmony_ci fd->config.cmd = FD_CONFIG_COMMAND_BLINK_MODE; 57762306a36Sopenharmony_ci fd->config.err = ERROR_FD_NONE; 57862306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_FD_CONFIG); 57962306a36Sopenharmony_ci } else { 58062306a36Sopenharmony_ci fd->config.cmd |= FD_CONFIG_COMMAND_BLINK_MODE; 58162306a36Sopenharmony_ci } 58262306a36Sopenharmony_ci} 58362306a36Sopenharmony_ci 58462306a36Sopenharmony_civoid __is_set_fd_config_eyedetect(struct fimc_is *is, u32 val) 58562306a36Sopenharmony_ci{ 58662306a36Sopenharmony_ci unsigned int index = is->config_index; 58762306a36Sopenharmony_ci struct fd_param *fd; 58862306a36Sopenharmony_ci unsigned long *p_index; 58962306a36Sopenharmony_ci 59062306a36Sopenharmony_ci p_index = &is->config[index].p_region_index[1]; 59162306a36Sopenharmony_ci fd = &is->config[index].fd; 59262306a36Sopenharmony_ci 59362306a36Sopenharmony_ci fd->config.eye_detect = val; 59462306a36Sopenharmony_ci 59562306a36Sopenharmony_ci if (!test_bit((PARAM_FD_CONFIG - 32), p_index)) { 59662306a36Sopenharmony_ci fd->config.cmd = FD_CONFIG_COMMAND_EYES_DETECT; 59762306a36Sopenharmony_ci fd->config.err = ERROR_FD_NONE; 59862306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_FD_CONFIG); 59962306a36Sopenharmony_ci } else { 60062306a36Sopenharmony_ci fd->config.cmd |= FD_CONFIG_COMMAND_EYES_DETECT; 60162306a36Sopenharmony_ci } 60262306a36Sopenharmony_ci} 60362306a36Sopenharmony_ci 60462306a36Sopenharmony_civoid __is_set_fd_config_mouthdetect(struct fimc_is *is, u32 val) 60562306a36Sopenharmony_ci{ 60662306a36Sopenharmony_ci unsigned int index = is->config_index; 60762306a36Sopenharmony_ci struct fd_param *fd; 60862306a36Sopenharmony_ci unsigned long *p_index; 60962306a36Sopenharmony_ci 61062306a36Sopenharmony_ci p_index = &is->config[index].p_region_index[1]; 61162306a36Sopenharmony_ci fd = &is->config[index].fd; 61262306a36Sopenharmony_ci 61362306a36Sopenharmony_ci fd->config.mouth_detect = val; 61462306a36Sopenharmony_ci 61562306a36Sopenharmony_ci if (!test_bit((PARAM_FD_CONFIG - 32), p_index)) { 61662306a36Sopenharmony_ci fd->config.cmd = FD_CONFIG_COMMAND_MOUTH_DETECT; 61762306a36Sopenharmony_ci fd->config.err = ERROR_FD_NONE; 61862306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_FD_CONFIG); 61962306a36Sopenharmony_ci } else { 62062306a36Sopenharmony_ci fd->config.cmd |= FD_CONFIG_COMMAND_MOUTH_DETECT; 62162306a36Sopenharmony_ci } 62262306a36Sopenharmony_ci} 62362306a36Sopenharmony_ci 62462306a36Sopenharmony_civoid __is_set_fd_config_orientation(struct fimc_is *is, u32 val) 62562306a36Sopenharmony_ci{ 62662306a36Sopenharmony_ci unsigned int index = is->config_index; 62762306a36Sopenharmony_ci struct fd_param *fd; 62862306a36Sopenharmony_ci unsigned long *p_index; 62962306a36Sopenharmony_ci 63062306a36Sopenharmony_ci p_index = &is->config[index].p_region_index[1]; 63162306a36Sopenharmony_ci fd = &is->config[index].fd; 63262306a36Sopenharmony_ci 63362306a36Sopenharmony_ci fd->config.orientation = val; 63462306a36Sopenharmony_ci 63562306a36Sopenharmony_ci if (!test_bit((PARAM_FD_CONFIG - 32), p_index)) { 63662306a36Sopenharmony_ci fd->config.cmd = FD_CONFIG_COMMAND_ORIENTATION; 63762306a36Sopenharmony_ci fd->config.err = ERROR_FD_NONE; 63862306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_FD_CONFIG); 63962306a36Sopenharmony_ci } else { 64062306a36Sopenharmony_ci fd->config.cmd |= FD_CONFIG_COMMAND_ORIENTATION; 64162306a36Sopenharmony_ci } 64262306a36Sopenharmony_ci} 64362306a36Sopenharmony_ci 64462306a36Sopenharmony_civoid __is_set_fd_config_orientation_val(struct fimc_is *is, u32 val) 64562306a36Sopenharmony_ci{ 64662306a36Sopenharmony_ci unsigned int index = is->config_index; 64762306a36Sopenharmony_ci struct fd_param *fd; 64862306a36Sopenharmony_ci unsigned long *p_index; 64962306a36Sopenharmony_ci 65062306a36Sopenharmony_ci p_index = &is->config[index].p_region_index[1]; 65162306a36Sopenharmony_ci fd = &is->config[index].fd; 65262306a36Sopenharmony_ci 65362306a36Sopenharmony_ci fd->config.orientation_value = val; 65462306a36Sopenharmony_ci 65562306a36Sopenharmony_ci if (!test_bit((PARAM_FD_CONFIG - 32), p_index)) { 65662306a36Sopenharmony_ci fd->config.cmd = FD_CONFIG_COMMAND_ORIENTATION_VALUE; 65762306a36Sopenharmony_ci fd->config.err = ERROR_FD_NONE; 65862306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_FD_CONFIG); 65962306a36Sopenharmony_ci } else { 66062306a36Sopenharmony_ci fd->config.cmd |= FD_CONFIG_COMMAND_ORIENTATION_VALUE; 66162306a36Sopenharmony_ci } 66262306a36Sopenharmony_ci} 66362306a36Sopenharmony_ci 66462306a36Sopenharmony_civoid fimc_is_set_initial_params(struct fimc_is *is) 66562306a36Sopenharmony_ci{ 66662306a36Sopenharmony_ci struct global_param *global; 66762306a36Sopenharmony_ci struct isp_param *isp; 66862306a36Sopenharmony_ci struct drc_param *drc; 66962306a36Sopenharmony_ci struct fd_param *fd; 67062306a36Sopenharmony_ci unsigned long *p_index; 67162306a36Sopenharmony_ci unsigned int index; 67262306a36Sopenharmony_ci 67362306a36Sopenharmony_ci index = is->config_index; 67462306a36Sopenharmony_ci global = &is->config[index].global; 67562306a36Sopenharmony_ci isp = &is->config[index].isp; 67662306a36Sopenharmony_ci drc = &is->config[index].drc; 67762306a36Sopenharmony_ci fd = &is->config[index].fd; 67862306a36Sopenharmony_ci p_index = &is->config[index].p_region_index[0]; 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_ci /* Global */ 68162306a36Sopenharmony_ci global->shotmode.cmd = 1; 68262306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_GLOBAL_SHOTMODE); 68362306a36Sopenharmony_ci 68462306a36Sopenharmony_ci /* ISP */ 68562306a36Sopenharmony_ci isp->control.cmd = CONTROL_COMMAND_START; 68662306a36Sopenharmony_ci isp->control.bypass = CONTROL_BYPASS_DISABLE; 68762306a36Sopenharmony_ci isp->control.err = CONTROL_ERROR_NONE; 68862306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_ISP_CONTROL); 68962306a36Sopenharmony_ci 69062306a36Sopenharmony_ci isp->otf_input.cmd = OTF_INPUT_COMMAND_ENABLE; 69162306a36Sopenharmony_ci if (!test_bit(PARAM_ISP_OTF_INPUT, p_index)) { 69262306a36Sopenharmony_ci isp->otf_input.width = DEFAULT_PREVIEW_STILL_WIDTH; 69362306a36Sopenharmony_ci isp->otf_input.height = DEFAULT_PREVIEW_STILL_HEIGHT; 69462306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_ISP_OTF_INPUT); 69562306a36Sopenharmony_ci } 69662306a36Sopenharmony_ci if (is->sensor->test_pattern) 69762306a36Sopenharmony_ci isp->otf_input.format = OTF_INPUT_FORMAT_STRGEN_COLORBAR_BAYER; 69862306a36Sopenharmony_ci else 69962306a36Sopenharmony_ci isp->otf_input.format = OTF_INPUT_FORMAT_BAYER; 70062306a36Sopenharmony_ci isp->otf_input.bitwidth = 10; 70162306a36Sopenharmony_ci isp->otf_input.order = OTF_INPUT_ORDER_BAYER_GR_BG; 70262306a36Sopenharmony_ci isp->otf_input.crop_offset_x = 0; 70362306a36Sopenharmony_ci isp->otf_input.crop_offset_y = 0; 70462306a36Sopenharmony_ci isp->otf_input.err = OTF_INPUT_ERROR_NONE; 70562306a36Sopenharmony_ci 70662306a36Sopenharmony_ci isp->dma1_input.cmd = DMA_INPUT_COMMAND_DISABLE; 70762306a36Sopenharmony_ci isp->dma1_input.width = 0; 70862306a36Sopenharmony_ci isp->dma1_input.height = 0; 70962306a36Sopenharmony_ci isp->dma1_input.format = 0; 71062306a36Sopenharmony_ci isp->dma1_input.bitwidth = 0; 71162306a36Sopenharmony_ci isp->dma1_input.plane = 0; 71262306a36Sopenharmony_ci isp->dma1_input.order = 0; 71362306a36Sopenharmony_ci isp->dma1_input.buffer_number = 0; 71462306a36Sopenharmony_ci isp->dma1_input.width = 0; 71562306a36Sopenharmony_ci isp->dma1_input.err = DMA_INPUT_ERROR_NONE; 71662306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_ISP_DMA1_INPUT); 71762306a36Sopenharmony_ci 71862306a36Sopenharmony_ci isp->dma2_input.cmd = DMA_INPUT_COMMAND_DISABLE; 71962306a36Sopenharmony_ci isp->dma2_input.width = 0; 72062306a36Sopenharmony_ci isp->dma2_input.height = 0; 72162306a36Sopenharmony_ci isp->dma2_input.format = 0; 72262306a36Sopenharmony_ci isp->dma2_input.bitwidth = 0; 72362306a36Sopenharmony_ci isp->dma2_input.plane = 0; 72462306a36Sopenharmony_ci isp->dma2_input.order = 0; 72562306a36Sopenharmony_ci isp->dma2_input.buffer_number = 0; 72662306a36Sopenharmony_ci isp->dma2_input.width = 0; 72762306a36Sopenharmony_ci isp->dma2_input.err = DMA_INPUT_ERROR_NONE; 72862306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_ISP_DMA2_INPUT); 72962306a36Sopenharmony_ci 73062306a36Sopenharmony_ci isp->aa.cmd = ISP_AA_COMMAND_START; 73162306a36Sopenharmony_ci isp->aa.target = ISP_AA_TARGET_AE | ISP_AA_TARGET_AWB; 73262306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_ISP_AA); 73362306a36Sopenharmony_ci 73462306a36Sopenharmony_ci if (!test_bit(PARAM_ISP_FLASH, p_index)) 73562306a36Sopenharmony_ci __is_set_isp_flash(is, ISP_FLASH_COMMAND_DISABLE, 73662306a36Sopenharmony_ci ISP_FLASH_REDEYE_DISABLE); 73762306a36Sopenharmony_ci 73862306a36Sopenharmony_ci if (!test_bit(PARAM_ISP_AWB, p_index)) 73962306a36Sopenharmony_ci __is_set_isp_awb(is, ISP_AWB_COMMAND_AUTO, 0); 74062306a36Sopenharmony_ci 74162306a36Sopenharmony_ci if (!test_bit(PARAM_ISP_IMAGE_EFFECT, p_index)) 74262306a36Sopenharmony_ci __is_set_isp_effect(is, ISP_IMAGE_EFFECT_DISABLE); 74362306a36Sopenharmony_ci 74462306a36Sopenharmony_ci if (!test_bit(PARAM_ISP_ISO, p_index)) 74562306a36Sopenharmony_ci __is_set_isp_iso(is, ISP_ISO_COMMAND_AUTO, 0); 74662306a36Sopenharmony_ci 74762306a36Sopenharmony_ci if (!test_bit(PARAM_ISP_ADJUST, p_index)) { 74862306a36Sopenharmony_ci __is_set_isp_adjust(is, ISP_ADJUST_COMMAND_MANUAL_CONTRAST, 0); 74962306a36Sopenharmony_ci __is_set_isp_adjust(is, 75062306a36Sopenharmony_ci ISP_ADJUST_COMMAND_MANUAL_SATURATION, 0); 75162306a36Sopenharmony_ci __is_set_isp_adjust(is, ISP_ADJUST_COMMAND_MANUAL_SHARPNESS, 0); 75262306a36Sopenharmony_ci __is_set_isp_adjust(is, ISP_ADJUST_COMMAND_MANUAL_EXPOSURE, 0); 75362306a36Sopenharmony_ci __is_set_isp_adjust(is, 75462306a36Sopenharmony_ci ISP_ADJUST_COMMAND_MANUAL_BRIGHTNESS, 0); 75562306a36Sopenharmony_ci __is_set_isp_adjust(is, ISP_ADJUST_COMMAND_MANUAL_HUE, 0); 75662306a36Sopenharmony_ci } 75762306a36Sopenharmony_ci 75862306a36Sopenharmony_ci if (!test_bit(PARAM_ISP_METERING, p_index)) { 75962306a36Sopenharmony_ci __is_set_isp_metering(is, 0, ISP_METERING_COMMAND_CENTER); 76062306a36Sopenharmony_ci __is_set_isp_metering(is, 1, 0); 76162306a36Sopenharmony_ci __is_set_isp_metering(is, 2, 0); 76262306a36Sopenharmony_ci __is_set_isp_metering(is, 3, 0); 76362306a36Sopenharmony_ci __is_set_isp_metering(is, 4, 0); 76462306a36Sopenharmony_ci } 76562306a36Sopenharmony_ci 76662306a36Sopenharmony_ci if (!test_bit(PARAM_ISP_AFC, p_index)) 76762306a36Sopenharmony_ci __is_set_isp_afc(is, ISP_AFC_COMMAND_AUTO, 0); 76862306a36Sopenharmony_ci 76962306a36Sopenharmony_ci isp->otf_output.cmd = OTF_OUTPUT_COMMAND_ENABLE; 77062306a36Sopenharmony_ci if (!test_bit(PARAM_ISP_OTF_OUTPUT, p_index)) { 77162306a36Sopenharmony_ci isp->otf_output.width = DEFAULT_PREVIEW_STILL_WIDTH; 77262306a36Sopenharmony_ci isp->otf_output.height = DEFAULT_PREVIEW_STILL_HEIGHT; 77362306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_ISP_OTF_OUTPUT); 77462306a36Sopenharmony_ci } 77562306a36Sopenharmony_ci isp->otf_output.format = OTF_OUTPUT_FORMAT_YUV444; 77662306a36Sopenharmony_ci isp->otf_output.bitwidth = 12; 77762306a36Sopenharmony_ci isp->otf_output.order = 0; 77862306a36Sopenharmony_ci isp->otf_output.err = OTF_OUTPUT_ERROR_NONE; 77962306a36Sopenharmony_ci 78062306a36Sopenharmony_ci if (!test_bit(PARAM_ISP_DMA1_OUTPUT, p_index)) { 78162306a36Sopenharmony_ci isp->dma1_output.cmd = DMA_OUTPUT_COMMAND_DISABLE; 78262306a36Sopenharmony_ci isp->dma1_output.width = 0; 78362306a36Sopenharmony_ci isp->dma1_output.height = 0; 78462306a36Sopenharmony_ci isp->dma1_output.format = 0; 78562306a36Sopenharmony_ci isp->dma1_output.bitwidth = 0; 78662306a36Sopenharmony_ci isp->dma1_output.plane = 0; 78762306a36Sopenharmony_ci isp->dma1_output.order = 0; 78862306a36Sopenharmony_ci isp->dma1_output.buffer_number = 0; 78962306a36Sopenharmony_ci isp->dma1_output.buffer_address = 0; 79062306a36Sopenharmony_ci isp->dma1_output.notify_dma_done = 0; 79162306a36Sopenharmony_ci isp->dma1_output.dma_out_mask = 0; 79262306a36Sopenharmony_ci isp->dma1_output.err = DMA_OUTPUT_ERROR_NONE; 79362306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_ISP_DMA1_OUTPUT); 79462306a36Sopenharmony_ci } 79562306a36Sopenharmony_ci 79662306a36Sopenharmony_ci if (!test_bit(PARAM_ISP_DMA2_OUTPUT, p_index)) { 79762306a36Sopenharmony_ci isp->dma2_output.cmd = DMA_OUTPUT_COMMAND_DISABLE; 79862306a36Sopenharmony_ci isp->dma2_output.width = 0; 79962306a36Sopenharmony_ci isp->dma2_output.height = 0; 80062306a36Sopenharmony_ci isp->dma2_output.format = 0; 80162306a36Sopenharmony_ci isp->dma2_output.bitwidth = 0; 80262306a36Sopenharmony_ci isp->dma2_output.plane = 0; 80362306a36Sopenharmony_ci isp->dma2_output.order = 0; 80462306a36Sopenharmony_ci isp->dma2_output.buffer_number = 0; 80562306a36Sopenharmony_ci isp->dma2_output.buffer_address = 0; 80662306a36Sopenharmony_ci isp->dma2_output.notify_dma_done = 0; 80762306a36Sopenharmony_ci isp->dma2_output.dma_out_mask = 0; 80862306a36Sopenharmony_ci isp->dma2_output.err = DMA_OUTPUT_ERROR_NONE; 80962306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_ISP_DMA2_OUTPUT); 81062306a36Sopenharmony_ci } 81162306a36Sopenharmony_ci 81262306a36Sopenharmony_ci /* Sensor */ 81362306a36Sopenharmony_ci if (!test_bit(PARAM_SENSOR_FRAME_RATE, p_index)) { 81462306a36Sopenharmony_ci if (is->config_index == 0) 81562306a36Sopenharmony_ci __is_set_sensor(is, 0); 81662306a36Sopenharmony_ci } 81762306a36Sopenharmony_ci 81862306a36Sopenharmony_ci /* DRC */ 81962306a36Sopenharmony_ci drc->control.cmd = CONTROL_COMMAND_START; 82062306a36Sopenharmony_ci __is_set_drc_control(is, CONTROL_BYPASS_ENABLE); 82162306a36Sopenharmony_ci 82262306a36Sopenharmony_ci drc->otf_input.cmd = OTF_INPUT_COMMAND_ENABLE; 82362306a36Sopenharmony_ci if (!test_bit(PARAM_DRC_OTF_INPUT, p_index)) { 82462306a36Sopenharmony_ci drc->otf_input.width = DEFAULT_PREVIEW_STILL_WIDTH; 82562306a36Sopenharmony_ci drc->otf_input.height = DEFAULT_PREVIEW_STILL_HEIGHT; 82662306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_DRC_OTF_INPUT); 82762306a36Sopenharmony_ci } 82862306a36Sopenharmony_ci drc->otf_input.format = OTF_INPUT_FORMAT_YUV444; 82962306a36Sopenharmony_ci drc->otf_input.bitwidth = 12; 83062306a36Sopenharmony_ci drc->otf_input.order = 0; 83162306a36Sopenharmony_ci drc->otf_input.err = OTF_INPUT_ERROR_NONE; 83262306a36Sopenharmony_ci 83362306a36Sopenharmony_ci drc->dma_input.cmd = DMA_INPUT_COMMAND_DISABLE; 83462306a36Sopenharmony_ci drc->dma_input.width = 0; 83562306a36Sopenharmony_ci drc->dma_input.height = 0; 83662306a36Sopenharmony_ci drc->dma_input.format = 0; 83762306a36Sopenharmony_ci drc->dma_input.bitwidth = 0; 83862306a36Sopenharmony_ci drc->dma_input.plane = 0; 83962306a36Sopenharmony_ci drc->dma_input.order = 0; 84062306a36Sopenharmony_ci drc->dma_input.buffer_number = 0; 84162306a36Sopenharmony_ci drc->dma_input.width = 0; 84262306a36Sopenharmony_ci drc->dma_input.err = DMA_INPUT_ERROR_NONE; 84362306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_DRC_DMA_INPUT); 84462306a36Sopenharmony_ci 84562306a36Sopenharmony_ci drc->otf_output.cmd = OTF_OUTPUT_COMMAND_ENABLE; 84662306a36Sopenharmony_ci if (!test_bit(PARAM_DRC_OTF_OUTPUT, p_index)) { 84762306a36Sopenharmony_ci drc->otf_output.width = DEFAULT_PREVIEW_STILL_WIDTH; 84862306a36Sopenharmony_ci drc->otf_output.height = DEFAULT_PREVIEW_STILL_HEIGHT; 84962306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_DRC_OTF_OUTPUT); 85062306a36Sopenharmony_ci } 85162306a36Sopenharmony_ci drc->otf_output.format = OTF_OUTPUT_FORMAT_YUV444; 85262306a36Sopenharmony_ci drc->otf_output.bitwidth = 8; 85362306a36Sopenharmony_ci drc->otf_output.order = 0; 85462306a36Sopenharmony_ci drc->otf_output.err = OTF_OUTPUT_ERROR_NONE; 85562306a36Sopenharmony_ci 85662306a36Sopenharmony_ci /* FD */ 85762306a36Sopenharmony_ci __is_set_fd_control(is, CONTROL_COMMAND_STOP); 85862306a36Sopenharmony_ci fd->control.bypass = CONTROL_BYPASS_DISABLE; 85962306a36Sopenharmony_ci 86062306a36Sopenharmony_ci fd->otf_input.cmd = OTF_INPUT_COMMAND_ENABLE; 86162306a36Sopenharmony_ci if (!test_bit(PARAM_FD_OTF_INPUT, p_index)) { 86262306a36Sopenharmony_ci fd->otf_input.width = DEFAULT_PREVIEW_STILL_WIDTH; 86362306a36Sopenharmony_ci fd->otf_input.height = DEFAULT_PREVIEW_STILL_HEIGHT; 86462306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_FD_OTF_INPUT); 86562306a36Sopenharmony_ci } 86662306a36Sopenharmony_ci 86762306a36Sopenharmony_ci fd->otf_input.format = OTF_INPUT_FORMAT_YUV444; 86862306a36Sopenharmony_ci fd->otf_input.bitwidth = 8; 86962306a36Sopenharmony_ci fd->otf_input.order = 0; 87062306a36Sopenharmony_ci fd->otf_input.err = OTF_INPUT_ERROR_NONE; 87162306a36Sopenharmony_ci 87262306a36Sopenharmony_ci fd->dma_input.cmd = DMA_INPUT_COMMAND_DISABLE; 87362306a36Sopenharmony_ci fd->dma_input.width = 0; 87462306a36Sopenharmony_ci fd->dma_input.height = 0; 87562306a36Sopenharmony_ci fd->dma_input.format = 0; 87662306a36Sopenharmony_ci fd->dma_input.bitwidth = 0; 87762306a36Sopenharmony_ci fd->dma_input.plane = 0; 87862306a36Sopenharmony_ci fd->dma_input.order = 0; 87962306a36Sopenharmony_ci fd->dma_input.buffer_number = 0; 88062306a36Sopenharmony_ci fd->dma_input.width = 0; 88162306a36Sopenharmony_ci fd->dma_input.err = DMA_INPUT_ERROR_NONE; 88262306a36Sopenharmony_ci fimc_is_set_param_bit(is, PARAM_FD_DMA_INPUT); 88362306a36Sopenharmony_ci 88462306a36Sopenharmony_ci __is_set_fd_config_maxface(is, 5); 88562306a36Sopenharmony_ci __is_set_fd_config_rollangle(is, FD_CONFIG_ROLL_ANGLE_FULL); 88662306a36Sopenharmony_ci __is_set_fd_config_yawangle(is, FD_CONFIG_YAW_ANGLE_45_90); 88762306a36Sopenharmony_ci __is_set_fd_config_smilemode(is, FD_CONFIG_SMILE_MODE_DISABLE); 88862306a36Sopenharmony_ci __is_set_fd_config_blinkmode(is, FD_CONFIG_BLINK_MODE_DISABLE); 88962306a36Sopenharmony_ci __is_set_fd_config_eyedetect(is, FD_CONFIG_EYES_DETECT_ENABLE); 89062306a36Sopenharmony_ci __is_set_fd_config_mouthdetect(is, FD_CONFIG_MOUTH_DETECT_DISABLE); 89162306a36Sopenharmony_ci __is_set_fd_config_orientation(is, FD_CONFIG_ORIENTATION_DISABLE); 89262306a36Sopenharmony_ci __is_set_fd_config_orientation_val(is, 0); 89362306a36Sopenharmony_ci} 894