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 /*
53  * Helper function
54  */
55 void dump_sp_dmem(struct atomisp_device *isp, unsigned int addr,
56 		  unsigned int size);
57 struct camera_mipi_info *atomisp_to_sensor_mipi_info(struct v4l2_subdev *sd);
58 struct atomisp_video_pipe *atomisp_to_video_pipe(struct video_device *dev);
59 struct atomisp_acc_pipe *atomisp_to_acc_pipe(struct video_device *dev);
60 int atomisp_reset(struct atomisp_device *isp);
61 void atomisp_flush_bufs_and_wakeup(struct atomisp_sub_device *asd);
62 void atomisp_clear_css_buffer_counters(struct atomisp_sub_device *asd);
63 /* ISP2400 */
64 bool atomisp_buffers_queued(struct atomisp_sub_device *asd);
65 /* ISP2401 */
66 bool atomisp_buffers_queued_pipe(struct atomisp_video_pipe *pipe);
67 
68 /*
69  * Interrupt functions
70  */
71 void atomisp_msi_irq_init(struct atomisp_device *isp);
72 void atomisp_msi_irq_uninit(struct atomisp_device *isp);
73 void atomisp_wdt_work(struct work_struct *work);
74 void atomisp_wdt(struct timer_list *t);
75 void atomisp_setup_flash(struct atomisp_sub_device *asd);
76 irqreturn_t atomisp_isr(int irq, void *dev);
77 irqreturn_t atomisp_isr_thread(int irq, void *isp_ptr);
78 const struct atomisp_format_bridge *get_atomisp_format_bridge_from_mbus(
79     u32 mbus_code);
80 bool atomisp_is_mbuscode_raw(uint32_t code);
81 int atomisp_get_frame_pgnr(struct atomisp_device *isp,
82 			   const struct ia_css_frame *frame, u32 *p_pgnr);
83 void atomisp_delayed_init_work(struct work_struct *work);
84 
85 /*
86  * Get internal fmt according to V4L2 fmt
87  */
88 
89 bool atomisp_is_viewfinder_support(struct atomisp_device *isp);
90 
91 /*
92  * ISP features control function
93  */
94 
95 /*
96  * Function to set sensor runmode by user when
97  * ATOMISP_IOC_S_SENSOR_RUNMODE ioctl was called
98  */
99 int atomisp_set_sensor_runmode(struct atomisp_sub_device *asd,
100 			       struct atomisp_s_runmode *runmode);
101 /*
102  * Function to enable/disable lens geometry distortion correction (GDC) and
103  * chromatic aberration correction (CAC)
104  */
105 int atomisp_gdc_cac(struct atomisp_sub_device *asd, int flag,
106 		    __s32 *value);
107 
108 /*
109  * Function to enable/disable low light mode (including ANR)
110  */
111 int atomisp_low_light(struct atomisp_sub_device *asd, int flag,
112 		      __s32 *value);
113 
114 /*
115  * Function to enable/disable extra noise reduction (XNR) in low light
116  * condition
117  */
118 int atomisp_xnr(struct atomisp_sub_device *asd, int flag, int *arg);
119 
120 int atomisp_formats(struct atomisp_sub_device *asd, int flag,
121 		    struct atomisp_formats_config *config);
122 
123 /*
124  * Function to configure noise reduction
125  */
126 int atomisp_nr(struct atomisp_sub_device *asd, int flag,
127 	       struct atomisp_nr_config *config);
128 
129 /*
130  * Function to configure temporal noise reduction (TNR)
131  */
132 int atomisp_tnr(struct atomisp_sub_device *asd, int flag,
133 		struct atomisp_tnr_config *config);
134 
135 /*
136  * Function to configure black level compensation
137  */
138 int atomisp_black_level(struct atomisp_sub_device *asd, int flag,
139 			struct atomisp_ob_config *config);
140 
141 /*
142  * Function to configure edge enhancement
143  */
144 int atomisp_ee(struct atomisp_sub_device *asd, int flag,
145 	       struct atomisp_ee_config *config);
146 
147 /*
148  * Function to update Gamma table for gamma, brightness and contrast config
149  */
150 int atomisp_gamma(struct atomisp_sub_device *asd, int flag,
151 		  struct atomisp_gamma_table *config);
152 /*
153  * Function to update Ctc table for Chroma Enhancement
154  */
155 int atomisp_ctc(struct atomisp_sub_device *asd, int flag,
156 		struct atomisp_ctc_table *config);
157 
158 /*
159  * Function to update gamma correction parameters
160  */
161 int atomisp_gamma_correction(struct atomisp_sub_device *asd, int flag,
162 			     struct atomisp_gc_config *config);
163 
164 /*
165  * Function to update Gdc table for gdc
166  */
167 int atomisp_gdc_cac_table(struct atomisp_sub_device *asd, int flag,
168 			  struct atomisp_morph_table *config);
169 
170 /*
171  * Function to update table for macc
172  */
173 int atomisp_macc_table(struct atomisp_sub_device *asd, int flag,
174 		       struct atomisp_macc_config *config);
175 /*
176  * Function to get DIS statistics.
177  */
178 int atomisp_get_dis_stat(struct atomisp_sub_device *asd,
179 			 struct atomisp_dis_statistics *stats);
180 
181 /*
182  * Function to get DVS2 BQ resolution settings
183  */
184 int atomisp_get_dvs2_bq_resolutions(struct atomisp_sub_device *asd,
185 				    struct atomisp_dvs2_bq_resolutions *bq_res);
186 
187 /*
188  * Function to set the DIS coefficients.
189  */
190 int atomisp_set_dis_coefs(struct atomisp_sub_device *asd,
191 			  struct atomisp_dis_coefficients *coefs);
192 
193 /*
194  * Function to set the DIS motion vector.
195  */
196 int atomisp_set_dis_vector(struct atomisp_sub_device *asd,
197 			   struct atomisp_dis_vector *vector);
198 
199 /*
200  * Function to set/get 3A stat from isp
201  */
202 int atomisp_3a_stat(struct atomisp_sub_device *asd, int flag,
203 		    struct atomisp_3a_statistics *config);
204 
205 /*
206  * Function to get metadata from isp
207  */
208 int atomisp_get_metadata(struct atomisp_sub_device *asd, int flag,
209 			 struct atomisp_metadata *config);
210 
211 int atomisp_get_metadata_by_type(struct atomisp_sub_device *asd, int flag,
212 				 struct atomisp_metadata_with_type *config);
213 
214 int atomisp_set_parameters(struct video_device *vdev,
215 			   struct atomisp_parameters *arg);
216 /*
217  * Function to set/get isp parameters to isp
218  */
219 int atomisp_param(struct atomisp_sub_device *asd, int flag,
220 		  struct atomisp_parm *config);
221 
222 /*
223  * Function to configure color effect of the image
224  */
225 int atomisp_color_effect(struct atomisp_sub_device *asd, int flag,
226 			 __s32 *effect);
227 
228 /*
229  * Function to configure bad pixel correction
230  */
231 int atomisp_bad_pixel(struct atomisp_sub_device *asd, int flag,
232 		      __s32 *value);
233 
234 /*
235  * Function to configure bad pixel correction params
236  */
237 int atomisp_bad_pixel_param(struct atomisp_sub_device *asd, int flag,
238 			    struct atomisp_dp_config *config);
239 
240 /*
241  * Function to enable/disable video image stablization
242  */
243 int atomisp_video_stable(struct atomisp_sub_device *asd, int flag,
244 			 __s32 *value);
245 
246 /*
247  * Function to configure fixed pattern noise
248  */
249 int atomisp_fixed_pattern(struct atomisp_sub_device *asd, int flag,
250 			  __s32 *value);
251 
252 /*
253  * Function to configure fixed pattern noise table
254  */
255 int atomisp_fixed_pattern_table(struct atomisp_sub_device *asd,
256 				struct v4l2_framebuffer *config);
257 
258 /*
259  * Function to configure false color correction
260  */
261 int atomisp_false_color(struct atomisp_sub_device *asd, int flag,
262 			__s32 *value);
263 
264 /*
265  * Function to configure false color correction params
266  */
267 int atomisp_false_color_param(struct atomisp_sub_device *asd, int flag,
268 			      struct atomisp_de_config *config);
269 
270 /*
271  * Function to configure white balance params
272  */
273 int atomisp_white_balance_param(struct atomisp_sub_device *asd, int flag,
274 				struct atomisp_wb_config *config);
275 
276 int atomisp_3a_config_param(struct atomisp_sub_device *asd, int flag,
277 			    struct atomisp_3a_config *config);
278 
279 /*
280  * Function to setup digital zoom
281  */
282 int atomisp_digital_zoom(struct atomisp_sub_device *asd, int flag,
283 			 __s32 *value);
284 
285 /*
286  * Function  set camera_prefiles.xml current sensor pixel array size
287  */
288 int atomisp_set_array_res(struct atomisp_sub_device *asd,
289 			  struct atomisp_resolution  *config);
290 
291 /*
292  * Function to calculate real zoom region for every pipe
293  */
294 int atomisp_calculate_real_zoom_region(struct atomisp_sub_device *asd,
295 				       struct ia_css_dz_config   *dz_config,
296 				       enum ia_css_pipe_id css_pipe_id);
297 
298 int atomisp_cp_general_isp_parameters(struct atomisp_sub_device *asd,
299 				      struct atomisp_parameters *arg,
300 				      struct atomisp_css_params *css_param,
301 				      bool from_user);
302 
303 int atomisp_cp_lsc_table(struct atomisp_sub_device *asd,
304 			 struct atomisp_shading_table *source_st,
305 			 struct atomisp_css_params *css_param,
306 			 bool from_user);
307 
308 int atomisp_css_cp_dvs2_coefs(struct atomisp_sub_device *asd,
309 			      struct ia_css_dvs2_coefficients *coefs,
310 			      struct atomisp_css_params *css_param,
311 			      bool from_user);
312 
313 int atomisp_cp_morph_table(struct atomisp_sub_device *asd,
314 			   struct atomisp_morph_table *source_morph_table,
315 			   struct atomisp_css_params *css_param,
316 			   bool from_user);
317 
318 int atomisp_cp_dvs_6axis_config(struct atomisp_sub_device *asd,
319 				struct atomisp_dvs_6axis_config *user_6axis_config,
320 				struct atomisp_css_params *css_param,
321 				bool from_user);
322 
323 int atomisp_makeup_css_parameters(struct atomisp_sub_device *asd,
324 				  struct atomisp_parameters *arg,
325 				  struct atomisp_css_params *css_param);
326 
327 int atomisp_compare_grid(struct atomisp_sub_device *asd,
328 			 struct atomisp_grid_info *atomgrid);
329 
330 int atomisp_get_sensor_mode_data(struct atomisp_sub_device *asd,
331 				 struct atomisp_sensor_mode_data *config);
332 
333 int atomisp_get_fmt(struct video_device *vdev, struct v4l2_format *f);
334 
335 /* This function looks up the closest available resolution. */
336 int atomisp_try_fmt(struct video_device *vdev, struct v4l2_format *f,
337 		    bool *res_overflow);
338 
339 int atomisp_set_fmt(struct video_device *vdev, struct v4l2_format *f);
340 int atomisp_set_fmt_file(struct video_device *vdev, struct v4l2_format *f);
341 
342 int atomisp_set_shading_table(struct atomisp_sub_device *asd,
343 			      struct atomisp_shading_table *shading_table);
344 
345 int atomisp_offline_capture_configure(struct atomisp_sub_device *asd,
346 				      struct atomisp_cont_capture_conf *cvf_config);
347 
348 int atomisp_ospm_dphy_down(struct atomisp_device *isp);
349 int atomisp_ospm_dphy_up(struct atomisp_device *isp);
350 int atomisp_exif_makernote(struct atomisp_sub_device *asd,
351 			   struct atomisp_makernote_info *config);
352 
353 void atomisp_free_internal_buffers(struct atomisp_sub_device *asd);
354 
355 int atomisp_s_ae_window(struct atomisp_sub_device *asd,
356 			struct atomisp_ae_window *arg);
357 
358 int  atomisp_flash_enable(struct atomisp_sub_device *asd,
359 			  int num_frames);
360 
361 int atomisp_freq_scaling(struct atomisp_device *vdev,
362 			 enum atomisp_dfs_mode mode,
363 			 bool force);
364 
365 void atomisp_buf_done(struct atomisp_sub_device *asd, int error,
366 		      enum ia_css_buffer_type buf_type,
367 		      enum ia_css_pipe_id css_pipe_id,
368 		      bool q_buffers, enum atomisp_input_stream_id stream_id);
369 
370 void atomisp_css_flush(struct atomisp_device *isp);
371 int atomisp_source_pad_to_stream_id(struct atomisp_sub_device *asd,
372 				    uint16_t source_pad);
373 
374 /*
375  * Events. Only one event has to be exported for now.
376  */
377 void atomisp_eof_event(struct atomisp_sub_device *asd, uint8_t exp_id);
378 
379 enum mipi_port_id __get_mipi_port(struct atomisp_device *isp,
380 				  enum atomisp_camera_port port);
381 
382 bool atomisp_is_vf_pipe(struct atomisp_video_pipe *pipe);
383 
384 void atomisp_apply_css_parameters(
385     struct atomisp_sub_device *asd,
386     struct atomisp_css_params *css_param);
387 void atomisp_free_css_parameters(struct atomisp_css_params *css_param);
388 
389 void atomisp_handle_parameter_and_buffer(struct atomisp_video_pipe *pipe);
390 
391 void atomisp_flush_params_queue(struct atomisp_video_pipe *asd);
392 /*
393  * Function to do Raw Buffer related operation, after enable Lock Unlock Raw Buffer
394  */
395 int atomisp_exp_id_unlock(struct atomisp_sub_device *asd, int *exp_id);
396 int atomisp_exp_id_capture(struct atomisp_sub_device *asd, int *exp_id);
397 
398 /*
399  * Function to update Raw Buffer bitmap
400  */
401 int atomisp_set_raw_buffer_bitmap(struct atomisp_sub_device *asd, int exp_id);
402 void atomisp_init_raw_buffer_bitmap(struct atomisp_sub_device *asd);
403 
404 /*
405  * Function to enable/disable zoom for capture pipe
406  */
407 int atomisp_enable_dz_capt_pipe(struct atomisp_sub_device *asd,
408 				unsigned int *enable);
409 
410 /*
411  * Function to get metadata type bu pipe id
412  */
413 enum atomisp_metadata_type
414 atomisp_get_metadata_type(struct atomisp_sub_device *asd,
415 			  enum ia_css_pipe_id pipe_id);
416 
417 /*
418  * Function for HAL to inject a fake event to wake up poll thread
419  */
420 int atomisp_inject_a_fake_event(struct atomisp_sub_device *asd, int *event);
421 
422 /*
423  * Function for HAL to query how many invalid frames at the beginning of ISP
424  * pipeline output
425  */
426 int atomisp_get_invalid_frame_num(struct video_device *vdev,
427 				  int *invalid_frame_num);
428 
429 int atomisp_mrfld_power_up(struct atomisp_device *isp);
430 int atomisp_mrfld_power_down(struct atomisp_device *isp);
431 int atomisp_runtime_suspend(struct device *dev);
432 int atomisp_runtime_resume(struct device *dev);
433 #endif /* __ATOMISP_CMD_H__ */
434