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