Linux-libre 5.4.49-gnu
[librecmc/linux-libre.git] / drivers / staging / vc04_services / bcm2835-camera / bcm2835-camera.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Broadcom BM2835 V4L2 driver
4  *
5  * Copyright © 2013 Raspberry Pi (Trading) Ltd.
6  *
7  * Authors: Vincent Sanders @ Collabora
8  *          Dave Stevenson @ Broadcom
9  *              (now dave.stevenson@raspberrypi.org)
10  *          Simon Mellor @ Broadcom
11  *          Luke Diamand @ Broadcom
12  *
13  * core driver device
14  */
15
16 #define V4L2_CTRL_COUNT 29 /* number of v4l controls */
17
18 enum {
19         COMP_CAMERA = 0,
20         COMP_PREVIEW,
21         COMP_IMAGE_ENCODE,
22         COMP_VIDEO_ENCODE,
23         COMP_COUNT
24 };
25
26 enum {
27         CAM_PORT_PREVIEW = 0,
28         CAM_PORT_VIDEO,
29         CAM_PORT_CAPTURE,
30         CAM_PORT_COUNT
31 };
32
33 #define PREVIEW_LAYER      2
34
35 extern int bcm2835_v4l2_debug;
36
37 struct bm2835_mmal_dev {
38         /* v4l2 devices */
39         struct v4l2_device     v4l2_dev;
40         struct video_device    vdev;
41         struct mutex           mutex;
42
43         /* controls */
44         struct v4l2_ctrl_handler  ctrl_handler;
45         struct v4l2_ctrl          *ctrls[V4L2_CTRL_COUNT];
46         enum v4l2_scene_mode      scene_mode;
47         struct mmal_colourfx      colourfx;
48         int                       hflip;
49         int                       vflip;
50         int                       red_gain;
51         int                       blue_gain;
52         enum mmal_parameter_exposuremode exposure_mode_user;
53         enum v4l2_exposure_auto_type exposure_mode_v4l2_user;
54         /* active exposure mode may differ if selected via a scene mode */
55         enum mmal_parameter_exposuremode exposure_mode_active;
56         enum mmal_parameter_exposuremeteringmode metering_mode;
57         unsigned int              manual_shutter_speed;
58         bool                      exp_auto_priority;
59         bool manual_iso_enabled;
60         u32 iso;
61
62         /* allocated mmal instance and components */
63         struct vchiq_mmal_instance   *instance;
64         struct vchiq_mmal_component  *component[COMP_COUNT];
65         int camera_use_count;
66
67         struct v4l2_window overlay;
68
69         struct {
70                 unsigned int     width;  /* width */
71                 unsigned int     height;  /* height */
72                 unsigned int     stride;  /* stride */
73                 unsigned int     buffersize; /* buffer size with padding */
74                 struct mmal_fmt  *fmt;
75                 struct v4l2_fract timeperframe;
76
77                 /* H264 encode bitrate */
78                 int         encode_bitrate;
79                 /* H264 bitrate mode. CBR/VBR */
80                 int         encode_bitrate_mode;
81                 /* H264 profile */
82                 enum v4l2_mpeg_video_h264_profile enc_profile;
83                 /* H264 level */
84                 enum v4l2_mpeg_video_h264_level enc_level;
85                 /* JPEG Q-factor */
86                 int         q_factor;
87
88                 struct vb2_queue        vb_vidq;
89
90                 /* VC start timestamp for streaming */
91                 s64         vc_start_timestamp;
92                 /* Kernel start timestamp for streaming */
93                 ktime_t kernel_start_ts;
94                 /* Sequence number of last buffer */
95                 u32             sequence;
96
97                 struct vchiq_mmal_port  *port; /* port being used for capture */
98                 /* camera port being used for capture */
99                 struct vchiq_mmal_port  *camera_port;
100                 /* component being used for encode */
101                 struct vchiq_mmal_component *encode_component;
102                 /* number of frames remaining which driver should capture */
103                 unsigned int  frame_count;
104                 /* last frame completion */
105                 struct completion  frame_cmplt;
106
107         } capture;
108
109         unsigned int camera_num;
110         unsigned int max_width;
111         unsigned int max_height;
112         unsigned int rgb_bgr_swapped;
113 };
114
115 int bm2835_mmal_init_controls(
116                         struct bm2835_mmal_dev *dev,
117                         struct v4l2_ctrl_handler *hdl);
118
119 int bm2835_mmal_set_all_camera_controls(struct bm2835_mmal_dev *dev);
120 int set_framerate_params(struct bm2835_mmal_dev *dev);
121
122 /* Debug helpers */
123
124 #define v4l2_dump_pix_format(level, debug, dev, pix_fmt, desc)  \
125 {       \
126         v4l2_dbg(level, debug, dev,     \
127 "%s: w %u h %u field %u pfmt 0x%x bpl %u sz_img %u colorspace 0x%x priv %u\n", \
128                 desc,   \
129                 (pix_fmt)->width, (pix_fmt)->height, (pix_fmt)->field,  \
130                 (pix_fmt)->pixelformat, (pix_fmt)->bytesperline,        \
131                 (pix_fmt)->sizeimage, (pix_fmt)->colorspace, (pix_fmt)->priv); \
132 }
133
134 #define v4l2_dump_win_format(level, debug, dev, win_fmt, desc)  \
135 {       \
136         v4l2_dbg(level, debug, dev,     \
137 "%s: w %u h %u l %u t %u  field %u chromakey %06X clip %p " \
138 "clipcount %u bitmap %p\n", \
139                 desc,   \
140                 (win_fmt)->w.width, (win_fmt)->w.height, \
141                 (win_fmt)->w.left, (win_fmt)->w.top, \
142                 (win_fmt)->field,       \
143                 (win_fmt)->chromakey,   \
144                 (win_fmt)->clips, (win_fmt)->clipcount, \
145                 (win_fmt)->bitmap); \
146 }