1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Support for Medifield PNW Camera Imaging ISP subsystem. 4 * 5 * Copyright (c) 2010 Intel Corporation. All Rights Reserved. 6 * 7 * Copyright (c) 2010 Silicon Hive www.siliconhive.com. 8 * 9 * This program is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU General Public License version 11 * 2 as published by the Free Software Foundation. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * 19 */ 20 21 #ifndef __ATOMISP_CMD_H__ 22 #define __ATOMISP_CMD_H__ 23 24 #include "../../include/linux/atomisp.h" 25 #include <linux/interrupt.h> 26 #include <linux/videodev2.h> 27 28 #include <media/v4l2-subdev.h> 29 30 #include "atomisp_internal.h" 31 32 #include "ia_css_types.h" 33 #include "ia_css.h" 34 35 struct atomisp_device; 36 struct ia_css_frame; 37 38 #define MSI_ENABLE_BIT 16 39 #define INTR_DISABLE_BIT 10 40 #define BUS_MASTER_ENABLE 2 41 #define MEMORY_SPACE_ENABLE 1 42 #define INTR_IER 24 43 #define INTR_IIR 16 44 45 /* ISP2401 */ 46 #define RUNMODE_MASK (ATOMISP_RUN_MODE_VIDEO | ATOMISP_RUN_MODE_STILL_CAPTURE \ 47 | ATOMISP_RUN_MODE_PREVIEW) 48 49 /* FIXME: check if can go */ 50 extern int atomisp_punit_hpll_freq; 51 52 /* Helper function */ 53 void dump_sp_dmem(struct atomisp_device *isp, unsigned int addr, 54 unsigned int size); 55 struct camera_mipi_info *atomisp_to_sensor_mipi_info(struct v4l2_subdev *sd); 56 struct atomisp_video_pipe *atomisp_to_video_pipe(struct video_device *dev); 57 struct atomisp_acc_pipe *atomisp_to_acc_pipe(struct video_device *dev); 58 int atomisp_reset(struct atomisp_device *isp); 59 void atomisp_flush_bufs_and_wakeup(struct atomisp_sub_device *asd); 60 void atomisp_clear_css_buffer_counters(struct atomisp_sub_device *asd); 61 /* ISP2400 */ 62 bool atomisp_buffers_queued(struct atomisp_sub_device *asd); 63 /* ISP2401 */ 64 bool atomisp_buffers_queued_pipe(struct atomisp_video_pipe *pipe); 65 66 /* Interrupt functions */ 67 void atomisp_msi_irq_init(struct atomisp_device *isp); 68 void atomisp_msi_irq_uninit(struct atomisp_device *isp); 69 void atomisp_wdt_work(struct work_struct *work); 70 void atomisp_wdt(struct timer_list *t); 71 void atomisp_setup_flash(struct atomisp_sub_device *asd); 72 irqreturn_t atomisp_isr(int irq, void *dev); 73 irqreturn_t atomisp_isr_thread(int irq, void *isp_ptr); 74 const struct atomisp_format_bridge *get_atomisp_format_bridge_from_mbus( 75 u32 mbus_code); 76 bool atomisp_is_mbuscode_raw(uint32_t code); 77 void atomisp_delayed_init_work(struct work_struct *work); 78 79 /* Get internal fmt according to V4L2 fmt */ 80 bool atomisp_is_viewfinder_support(struct atomisp_device *isp); 81 82 /* ISP features control function */ 83 84 /* 85 * Function to set sensor runmode by user when 86 * ATOMISP_IOC_S_SENSOR_RUNMODE ioctl was called 87 */ 88 int atomisp_set_sensor_runmode(struct atomisp_sub_device *asd, 89 struct atomisp_s_runmode *runmode); 90 /* 91 * Function to enable/disable lens geometry distortion correction (GDC) and 92 * chromatic aberration correction (CAC) 93 */ 94 int atomisp_gdc_cac(struct atomisp_sub_device *asd, int flag, 95 __s32 *value); 96 97 /* Function to enable/disable low light mode (including ANR) */ 98 int atomisp_low_light(struct atomisp_sub_device *asd, int flag, 99 __s32 *value); 100 101 /* 102 * Function to enable/disable extra noise reduction (XNR) in low light 103 * condition 104 */ 105 int atomisp_xnr(struct atomisp_sub_device *asd, int flag, int *arg); 106 107 int atomisp_formats(struct atomisp_sub_device *asd, int flag, 108 struct atomisp_formats_config *config); 109 110 /* Function to configure noise reduction */ 111 int atomisp_nr(struct atomisp_sub_device *asd, int flag, 112 struct atomisp_nr_config *config); 113 114 /* Function to configure temporal noise reduction (TNR) */ 115 int atomisp_tnr(struct atomisp_sub_device *asd, int flag, 116 struct atomisp_tnr_config *config); 117 118 /* Function to configure black level compensation */ 119 int atomisp_black_level(struct atomisp_sub_device *asd, int flag, 120 struct atomisp_ob_config *config); 121 122 /* Function to configure edge enhancement */ 123 int atomisp_ee(struct atomisp_sub_device *asd, int flag, 124 struct atomisp_ee_config *config); 125 126 /* Function to update Gamma table for gamma, brightness and contrast config */ 127 int atomisp_gamma(struct atomisp_sub_device *asd, int flag, 128 struct atomisp_gamma_table *config); 129 130 /* Function to update Ctc table for Chroma Enhancement */ 131 int atomisp_ctc(struct atomisp_sub_device *asd, int flag, 132 struct atomisp_ctc_table *config); 133 134 /* Function to update gamma correction parameters */ 135 int atomisp_gamma_correction(struct atomisp_sub_device *asd, int flag, 136 struct atomisp_gc_config *config); 137 138 /* Function to update Gdc table for gdc */ 139 int atomisp_gdc_cac_table(struct atomisp_sub_device *asd, int flag, 140 struct atomisp_morph_table *config); 141 142 /* Function to update table for macc */ 143 int atomisp_macc_table(struct atomisp_sub_device *asd, int flag, 144 struct atomisp_macc_config *config); 145 146 /* Function to get DIS statistics. */ 147 int atomisp_get_dis_stat(struct atomisp_sub_device *asd, 148 struct atomisp_dis_statistics *stats); 149 150 /* Function to get DVS2 BQ resolution settings */ 151 int atomisp_get_dvs2_bq_resolutions(struct atomisp_sub_device *asd, 152 struct atomisp_dvs2_bq_resolutions *bq_res); 153 154 /* Function to set the DIS coefficients. */ 155 int atomisp_set_dis_coefs(struct atomisp_sub_device *asd, 156 struct atomisp_dis_coefficients *coefs); 157 158 /* Function to set the DIS motion vector. */ 159 int atomisp_set_dis_vector(struct atomisp_sub_device *asd, 160 struct atomisp_dis_vector *vector); 161 162 /* Function to set/get 3A stat from isp */ 163 int atomisp_3a_stat(struct atomisp_sub_device *asd, int flag, 164 struct atomisp_3a_statistics *config); 165 166 /* Function to get metadata from isp */ 167 int atomisp_get_metadata(struct atomisp_sub_device *asd, int flag, 168 struct atomisp_metadata *config); 169 170 int atomisp_get_metadata_by_type(struct atomisp_sub_device *asd, int flag, 171 struct atomisp_metadata_with_type *config); 172 173 int atomisp_set_parameters(struct video_device *vdev, 174 struct atomisp_parameters *arg); 175 176 /* Function to set/get isp parameters to isp */ 177 int atomisp_param(struct atomisp_sub_device *asd, int flag, 178 struct atomisp_parm *config); 179 180 /* Function to configure color effect of the image */ 181 int atomisp_color_effect(struct atomisp_sub_device *asd, int flag, 182 __s32 *effect); 183 184 /* Function to configure bad pixel correction */ 185 int atomisp_bad_pixel(struct atomisp_sub_device *asd, int flag, 186 __s32 *value); 187 188 /* Function to configure bad pixel correction params */ 189 int atomisp_bad_pixel_param(struct atomisp_sub_device *asd, int flag, 190 struct atomisp_dp_config *config); 191 192 /* Function to enable/disable video image stablization */ 193 int atomisp_video_stable(struct atomisp_sub_device *asd, int flag, 194 __s32 *value); 195 196 /* Function to configure fixed pattern noise */ 197 int atomisp_fixed_pattern(struct atomisp_sub_device *asd, int flag, 198 __s32 *value); 199 200 /* Function to configure fixed pattern noise table */ 201 int atomisp_fixed_pattern_table(struct atomisp_sub_device *asd, 202 struct v4l2_framebuffer *config); 203 204 /* Function to configure false color correction */ 205 int atomisp_false_color(struct atomisp_sub_device *asd, int flag, 206 __s32 *value); 207 208 /* Function to configure false color correction params */ 209 int atomisp_false_color_param(struct atomisp_sub_device *asd, int flag, 210 struct atomisp_de_config *config); 211 212 /* Function to configure white balance params */ 213 int atomisp_white_balance_param(struct atomisp_sub_device *asd, int flag, 214 struct atomisp_wb_config *config); 215 216 int atomisp_3a_config_param(struct atomisp_sub_device *asd, int flag, 217 struct atomisp_3a_config *config); 218 219 /* Function to setup digital zoom */ 220 int atomisp_digital_zoom(struct atomisp_sub_device *asd, int flag, 221 __s32 *value); 222 223 /* Function set camera_prefiles.xml current sensor pixel array size */ 224 int atomisp_set_array_res(struct atomisp_sub_device *asd, 225 struct atomisp_resolution *config); 226 227 /* Function to calculate real zoom region for every pipe */ 228 int atomisp_calculate_real_zoom_region(struct atomisp_sub_device *asd, 229 struct ia_css_dz_config *dz_config, 230 enum ia_css_pipe_id css_pipe_id); 231 232 int atomisp_cp_general_isp_parameters(struct atomisp_sub_device *asd, 233 struct atomisp_parameters *arg, 234 struct atomisp_css_params *css_param, 235 bool from_user); 236 237 int atomisp_cp_lsc_table(struct atomisp_sub_device *asd, 238 struct atomisp_shading_table *source_st, 239 struct atomisp_css_params *css_param, 240 bool from_user); 241 242 int atomisp_css_cp_dvs2_coefs(struct atomisp_sub_device *asd, 243 struct ia_css_dvs2_coefficients *coefs, 244 struct atomisp_css_params *css_param, 245 bool from_user); 246 247 int atomisp_cp_morph_table(struct atomisp_sub_device *asd, 248 struct atomisp_morph_table *source_morph_table, 249 struct atomisp_css_params *css_param, 250 bool from_user); 251 252 int atomisp_cp_dvs_6axis_config(struct atomisp_sub_device *asd, 253 struct atomisp_dvs_6axis_config *user_6axis_config, 254 struct atomisp_css_params *css_param, 255 bool from_user); 256 257 int atomisp_makeup_css_parameters(struct atomisp_sub_device *asd, 258 struct atomisp_parameters *arg, 259 struct atomisp_css_params *css_param); 260 261 int atomisp_compare_grid(struct atomisp_sub_device *asd, 262 struct atomisp_grid_info *atomgrid); 263 264 int atomisp_get_sensor_mode_data(struct atomisp_sub_device *asd, 265 struct atomisp_sensor_mode_data *config); 266 267 /* This function looks up the closest available resolution. */ 268 int atomisp_try_fmt(struct video_device *vdev, struct v4l2_pix_format *f, 269 bool *res_overflow); 270 271 int atomisp_set_fmt(struct video_device *vdev, struct v4l2_format *f); 272 int atomisp_set_fmt_file(struct video_device *vdev, struct v4l2_format *f); 273 274 int atomisp_set_shading_table(struct atomisp_sub_device *asd, 275 struct atomisp_shading_table *shading_table); 276 277 int atomisp_offline_capture_configure(struct atomisp_sub_device *asd, 278 struct atomisp_cont_capture_conf *cvf_config); 279 280 int atomisp_ospm_dphy_down(struct atomisp_device *isp); 281 int atomisp_ospm_dphy_up(struct atomisp_device *isp); 282 int atomisp_exif_makernote(struct atomisp_sub_device *asd, 283 struct atomisp_makernote_info *config); 284 285 void atomisp_free_internal_buffers(struct atomisp_sub_device *asd); 286 287 int atomisp_s_ae_window(struct atomisp_sub_device *asd, 288 struct atomisp_ae_window *arg); 289 290 int atomisp_flash_enable(struct atomisp_sub_device *asd, 291 int num_frames); 292 293 int atomisp_freq_scaling(struct atomisp_device *vdev, 294 enum atomisp_dfs_mode mode, 295 bool force); 296 297 void atomisp_buf_done(struct atomisp_sub_device *asd, int error, 298 enum ia_css_buffer_type buf_type, 299 enum ia_css_pipe_id css_pipe_id, 300 bool q_buffers, enum atomisp_input_stream_id stream_id); 301 302 void atomisp_css_flush(struct atomisp_device *isp); 303 int atomisp_source_pad_to_stream_id(struct atomisp_sub_device *asd, 304 uint16_t source_pad); 305 306 /* Events. Only one event has to be exported for now. */ 307 void atomisp_eof_event(struct atomisp_sub_device *asd, uint8_t exp_id); 308 309 enum mipi_port_id __get_mipi_port(struct atomisp_device *isp, 310 enum atomisp_camera_port port); 311 312 bool atomisp_is_vf_pipe(struct atomisp_video_pipe *pipe); 313 314 void atomisp_apply_css_parameters( 315 struct atomisp_sub_device *asd, 316 struct atomisp_css_params *css_param); 317 void atomisp_free_css_parameters(struct atomisp_css_params *css_param); 318 319 void atomisp_handle_parameter_and_buffer(struct atomisp_video_pipe *pipe); 320 321 void atomisp_flush_params_queue(struct atomisp_video_pipe *asd); 322 323 /* Function to do Raw Buffer related operation, after enable Lock Unlock Raw Buffer */ 324 int atomisp_exp_id_unlock(struct atomisp_sub_device *asd, int *exp_id); 325 int atomisp_exp_id_capture(struct atomisp_sub_device *asd, int *exp_id); 326 327 /* Function to update Raw Buffer bitmap */ 328 int atomisp_set_raw_buffer_bitmap(struct atomisp_sub_device *asd, int exp_id); 329 void atomisp_init_raw_buffer_bitmap(struct atomisp_sub_device *asd); 330 331 /* Function to enable/disable zoom for capture pipe */ 332 int atomisp_enable_dz_capt_pipe(struct atomisp_sub_device *asd, 333 unsigned int *enable); 334 335 /* Function to get metadata type bu pipe id */ 336 enum atomisp_metadata_type 337 atomisp_get_metadata_type(struct atomisp_sub_device *asd, 338 enum ia_css_pipe_id pipe_id); 339 340 u32 atomisp_get_pixel_depth(u32 pixelformat); 341 342 /* Function for HAL to inject a fake event to wake up poll thread */ 343 int atomisp_inject_a_fake_event(struct atomisp_sub_device *asd, int *event); 344 345 /* 346 * Function for HAL to query how many invalid frames at the beginning of ISP 347 * pipeline output 348 */ 349 int atomisp_get_invalid_frame_num(struct video_device *vdev, 350 int *invalid_frame_num); 351 352 int atomisp_mrfld_power_up(struct atomisp_device *isp); 353 int atomisp_mrfld_power_down(struct atomisp_device *isp); 354 int atomisp_runtime_suspend(struct device *dev); 355 int atomisp_runtime_resume(struct device *dev); 356 #endif /* __ATOMISP_CMD_H__ */ 357