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