1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#ifndef __ATOMISP_SUBDEV_H__
18#define __ATOMISP_SUBDEV_H__
19
20#include <media/v4l2-ctrls.h>
21#include <media/v4l2-device.h>
22#include <media/v4l2-subdev.h>
23#include <media/videobuf-core.h>
24
25#include "atomisp_common.h"
26#include "atomisp_compat.h"
27#include "atomisp_v4l2.h"
28
29#include "ia_css.h"
30
31
32#define ATOMISP_MAX_EXP_ID (250)
33enum atomisp_subdev_input_entity {
34 ATOMISP_SUBDEV_INPUT_NONE,
35 ATOMISP_SUBDEV_INPUT_MEMORY,
36 ATOMISP_SUBDEV_INPUT_CSI2,
37
38
39
40
41 ATOMISP_SUBDEV_INPUT_CSI2_PORT1,
42 ATOMISP_SUBDEV_INPUT_CSI2_PORT2,
43 ATOMISP_SUBDEV_INPUT_CSI2_PORT3,
44};
45
46#define ATOMISP_SUBDEV_PAD_SINK 0
47
48#define ATOMISP_SUBDEV_PAD_SOURCE_CAPTURE 1
49
50#define ATOMISP_SUBDEV_PAD_SOURCE_VF 2
51
52#define ATOMISP_SUBDEV_PAD_SOURCE_PREVIEW 3
53
54#define ATOMISP_SUBDEV_PAD_SOURCE_VIDEO 4
55#define ATOMISP_SUBDEV_PADS_NUM 5
56
57struct atomisp_in_fmt_conv {
58 u32 code;
59 uint8_t bpp;
60 uint8_t depth;
61 enum atomisp_input_format atomisp_in_fmt;
62 enum atomisp_css_bayer_order bayer_order;
63 enum atomisp_input_format css_stream_fmt;
64};
65
66struct atomisp_sub_device;
67
68struct atomisp_video_pipe {
69 struct video_device vdev;
70 enum v4l2_buf_type type;
71 struct media_pad pad;
72 struct videobuf_queue capq;
73 struct videobuf_queue outq;
74 struct list_head activeq;
75 struct list_head activeq_out;
76
77
78
79
80 struct list_head buffers_waiting_for_param;
81
82 struct list_head per_frame_params;
83
84 unsigned int buffers_in_css;
85
86
87
88
89 spinlock_t irq_lock;
90 unsigned int users;
91
92 struct atomisp_device *isp;
93 struct v4l2_pix_format pix;
94 uint32_t sh_fmt;
95
96 struct atomisp_sub_device *asd;
97
98
99
100
101
102 unsigned int frame_config_id[VIDEO_MAX_FRAME];
103
104
105
106
107 unsigned int frame_request_config_id[VIDEO_MAX_FRAME];
108 struct atomisp_css_params_with_list *frame_params[VIDEO_MAX_FRAME];
109#ifdef ISP2401
110
111
112
113
114 struct timer_list wdt;
115 unsigned int wdt_duration;
116 unsigned long wdt_expires;
117 atomic_t wdt_count;
118#endif
119};
120
121struct atomisp_acc_pipe {
122 struct video_device vdev;
123 unsigned int users;
124 bool running;
125 struct atomisp_sub_device *asd;
126 struct atomisp_device *isp;
127};
128
129struct atomisp_pad_format {
130 struct v4l2_mbus_framefmt fmt;
131 struct v4l2_rect crop;
132 struct v4l2_rect compose;
133};
134
135
136enum atomisp_flash_state {
137 ATOMISP_FLASH_IDLE,
138 ATOMISP_FLASH_REQUESTED,
139 ATOMISP_FLASH_ONGOING,
140 ATOMISP_FLASH_DONE
141};
142
143
144
145
146
147struct atomisp_css_params {
148 struct ia_css_wb_config wb_config;
149 struct ia_css_cc_config cc_config;
150 struct ia_css_tnr_config tnr_config;
151 struct ia_css_ecd_config ecd_config;
152 struct ia_css_ynr_config ynr_config;
153 struct ia_css_fc_config fc_config;
154 struct ia_css_formats_config formats_config;
155 struct ia_css_cnr_config cnr_config;
156 struct ia_css_macc_config macc_config;
157 struct ia_css_ctc_config ctc_config;
158 struct ia_css_aa_config aa_config;
159 struct ia_css_aa_config baa_config;
160 struct ia_css_ce_config ce_config;
161 struct ia_css_ob_config ob_config;
162 struct ia_css_dp_config dp_config;
163 struct ia_css_de_config de_config;
164 struct ia_css_gc_config gc_config;
165 struct ia_css_nr_config nr_config;
166 struct ia_css_ee_config ee_config;
167 struct ia_css_anr_config anr_config;
168 struct ia_css_3a_config s3a_config;
169 struct ia_css_xnr_config xnr_config;
170 struct ia_css_dz_config dz_config;
171 struct ia_css_cc_config yuv2rgb_cc_config;
172 struct ia_css_cc_config rgb2yuv_cc_config;
173 struct ia_css_macc_table macc_table;
174 struct ia_css_gamma_table gamma_table;
175 struct ia_css_ctc_table ctc_table;
176
177 struct ia_css_xnr_table xnr_table;
178 struct ia_css_rgb_gamma_table r_gamma_table;
179 struct ia_css_rgb_gamma_table g_gamma_table;
180 struct ia_css_rgb_gamma_table b_gamma_table;
181
182 struct ia_css_vector motion_vector;
183 struct ia_css_anr_thres anr_thres;
184
185 struct ia_css_dvs_6axis_config *dvs_6axis;
186 struct ia_css_dvs2_coefficients *dvs2_coeff;
187 struct ia_css_shading_table *shading_table;
188 struct ia_css_morph_table *morph_table;
189
190
191
192
193
194 void *output_frame;
195 uint32_t isp_config_id;
196
197
198 struct atomisp_parameters update_flag;
199};
200
201struct atomisp_subdev_params {
202
203
204 int online_process;
205 int yuv_ds_en;
206 unsigned int color_effect;
207 bool gdc_cac_en;
208 bool macc_en;
209 bool bad_pixel_en;
210 bool video_dis_en;
211 bool sc_en;
212 bool fpn_en;
213 bool xnr_en;
214 bool low_light;
215 int false_color;
216 unsigned int histogram_elenum;
217
218
219 struct atomisp_css_grid_info curr_grid_info;
220 enum atomisp_css_pipe_id s3a_enabled_pipe;
221
222 int s3a_output_bytes;
223
224 bool dis_proj_data_valid;
225
226 struct ia_css_dz_config dz_config;
227 struct ia_css_capture_config capture_config;
228
229 struct atomisp_css_isp_config config;
230
231
232 struct atomisp_css_params css_param;
233
234
235
236
237
238 struct ia_css_3a_statistics *s3a_user_stat;
239
240 void *metadata_user[ATOMISP_METADATA_TYPE_NUM];
241 uint32_t metadata_width_size;
242
243 struct ia_css_dvs2_statistics *dvs_stat;
244 struct atomisp_css_dvs_6axis *dvs_6axis;
245 uint32_t exp_id;
246 int dvs_hor_coef_bytes;
247 int dvs_ver_coef_bytes;
248 int dvs_ver_proj_bytes;
249 int dvs_hor_proj_bytes;
250
251
252 int num_flash_frames;
253 enum atomisp_flash_state flash_state;
254 enum atomisp_frame_status last_frame_status;
255
256
257 struct atomisp_cont_capture_conf offline_parm;
258
259 bool css_update_params_needed;
260};
261
262struct atomisp_css_params_with_list {
263
264 struct atomisp_css_params params;
265 struct list_head list;
266};
267
268struct atomisp_acc_fw {
269 struct atomisp_css_fw_info *fw;
270 unsigned int handle;
271 unsigned int flags;
272 unsigned int type;
273 struct {
274 size_t length;
275 unsigned long css_ptr;
276 } args[ATOMISP_ACC_NR_MEMORY];
277 struct list_head list;
278};
279
280struct atomisp_map {
281 ia_css_ptr ptr;
282 size_t length;
283 struct list_head list;
284
285
286
287
288};
289
290struct atomisp_sub_device {
291 struct v4l2_subdev subdev;
292 struct media_pad pads[ATOMISP_SUBDEV_PADS_NUM];
293 struct atomisp_pad_format fmt[ATOMISP_SUBDEV_PADS_NUM];
294 uint16_t capture_pad;
295
296 enum atomisp_subdev_input_entity input;
297 unsigned int output;
298 struct atomisp_video_pipe video_in;
299 struct atomisp_video_pipe video_out_capture;
300 struct atomisp_video_pipe video_out_vf;
301 struct atomisp_video_pipe video_out_preview;
302 struct atomisp_acc_pipe video_acc;
303
304 struct atomisp_video_pipe video_out_video_capture;
305
306 spinlock_t lock;
307 struct atomisp_device *isp;
308 struct v4l2_ctrl_handler ctrl_handler;
309 struct v4l2_ctrl *fmt_auto;
310 struct v4l2_ctrl *run_mode;
311 struct v4l2_ctrl *depth_mode;
312 struct v4l2_ctrl *vfpp;
313 struct v4l2_ctrl *continuous_mode;
314 struct v4l2_ctrl *continuous_raw_buffer_size;
315 struct v4l2_ctrl *continuous_viewfinder;
316 struct v4l2_ctrl *enable_raw_buffer_lock;
317#ifdef ISP2401
318 struct v4l2_ctrl *ion_dev_fd;
319#endif
320 struct v4l2_ctrl *disable_dz;
321#ifdef ISP2401
322 struct v4l2_ctrl *select_isp_version;
323#endif
324
325 struct {
326 struct list_head fw;
327 struct list_head memory_maps;
328 struct atomisp_css_pipeline *pipeline;
329 bool extension_mode;
330 struct ida ida;
331 struct completion acc_done;
332 void *acc_stages;
333 } acc;
334
335 struct atomisp_subdev_params params;
336
337 struct atomisp_stream_env stream_env[ATOMISP_INPUT_STREAM_NUM];
338
339 struct v4l2_pix_format dvs_envelop;
340 unsigned int s3a_bufs_in_css[CSS_PIPE_ID_NUM];
341 unsigned int dis_bufs_in_css;
342
343 unsigned int metadata_bufs_in_css
344 [ATOMISP_INPUT_STREAM_NUM][CSS_PIPE_ID_NUM];
345
346 struct list_head metadata[ATOMISP_METADATA_TYPE_NUM];
347
348 struct list_head metadata_in_css[ATOMISP_METADATA_TYPE_NUM];
349
350 struct list_head metadata_ready[ATOMISP_METADATA_TYPE_NUM];
351
352
353 struct list_head s3a_stats;
354
355 struct list_head s3a_stats_in_css;
356
357 struct list_head s3a_stats_ready;
358
359 struct list_head dis_stats;
360 struct list_head dis_stats_in_css;
361 spinlock_t dis_stats_lock;
362
363 struct atomisp_css_frame *vf_frame;
364 struct atomisp_css_frame *raw_output_frame;
365 enum atomisp_frame_status frame_status[VIDEO_MAX_FRAME];
366
367
368 int input_curr;
369
370
371 int sensor_curr;
372
373 atomic_t sof_count;
374 atomic_t sequence;
375 atomic_t sequence_temp;
376
377 unsigned int streaming;
378 bool stream_prepared;
379
380
381
382
383 unsigned int index;
384
385
386 struct completion init_done;
387 struct workqueue_struct *delayed_init_workq;
388 unsigned int delayed_init;
389 struct work_struct delayed_init_work;
390
391 unsigned int latest_preview_exp_id;
392
393 unsigned int mipi_frame_size;
394
395 bool copy_mode;
396 bool yuvpp_mode;
397
398 int raw_buffer_bitmap[ATOMISP_MAX_EXP_ID/32 + 1];
399 int raw_buffer_locked_count;
400 spinlock_t raw_buffer_bitmap_lock;
401
402#ifndef ISP2401
403 struct timer_list wdt;
404 unsigned int wdt_duration;
405 unsigned long wdt_expires;
406
407#endif
408 struct atomisp_resolution sensor_array_res;
409 bool high_speed_mode;
410 int pending_capture_request;
411#ifndef ISP2401
412
413#else
414 bool re_trigger_capture;
415#endif
416 unsigned int preview_exp_id;
417 unsigned int postview_exp_id;
418};
419
420extern const struct atomisp_in_fmt_conv atomisp_in_fmt_conv[];
421
422u32 atomisp_subdev_uncompressed_code(u32 code);
423bool atomisp_subdev_is_compressed(u32 code);
424const struct atomisp_in_fmt_conv *atomisp_find_in_fmt_conv(u32 code);
425#ifndef ISP2401
426const struct atomisp_in_fmt_conv *atomisp_find_in_fmt_conv_by_atomisp_in_fmt(
427 enum atomisp_input_format atomisp_in_fmt);
428#else
429const struct atomisp_in_fmt_conv
430 *atomisp_find_in_fmt_conv_by_atomisp_in_fmt(enum atomisp_input_format
431 atomisp_in_fmt);
432#endif
433const struct atomisp_in_fmt_conv *atomisp_find_in_fmt_conv_compressed(u32 code);
434bool atomisp_subdev_format_conversion(struct atomisp_sub_device *asd,
435 unsigned int source_pad);
436uint16_t atomisp_subdev_source_pad(struct video_device *vdev);
437
438
439struct v4l2_mbus_framefmt
440*atomisp_subdev_get_ffmt(struct v4l2_subdev *sd,
441 struct v4l2_subdev_pad_config *cfg, uint32_t which,
442 uint32_t pad);
443struct v4l2_rect *atomisp_subdev_get_rect(struct v4l2_subdev *sd,
444 struct v4l2_subdev_pad_config *cfg,
445 uint32_t which, uint32_t pad,
446 uint32_t target);
447int atomisp_subdev_set_selection(struct v4l2_subdev *sd,
448 struct v4l2_subdev_pad_config *cfg,
449 uint32_t which, uint32_t pad, uint32_t target,
450 uint32_t flags, struct v4l2_rect *r);
451
452void atomisp_subdev_set_ffmt(struct v4l2_subdev *sd,
453 struct v4l2_subdev_pad_config *cfg, uint32_t which,
454 uint32_t pad, struct v4l2_mbus_framefmt *ffmt);
455
456int atomisp_update_run_mode(struct atomisp_sub_device *asd);
457
458void atomisp_subdev_cleanup_pending_events(struct atomisp_sub_device *asd);
459
460void atomisp_subdev_unregister_entities(struct atomisp_sub_device *asd);
461int atomisp_subdev_register_entities(struct atomisp_sub_device *asd,
462 struct v4l2_device *vdev);
463int atomisp_subdev_init(struct atomisp_device *isp);
464void atomisp_subdev_cleanup(struct atomisp_device *isp);
465int atomisp_create_pads_links(struct atomisp_device *isp);
466
467#endif
468