1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Rockchip isp1 driver 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2017 Rockchip Electronics Co., Ltd. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * This software is available to you under a choice of one of two 7*4882a593Smuzhiyun * licenses. You may choose to be licensed under the terms of the GNU 8*4882a593Smuzhiyun * General Public License (GPL) Version 2, available from the file 9*4882a593Smuzhiyun * COPYING in the main directory of this source tree, or the 10*4882a593Smuzhiyun * OpenIB.org BSD license below: 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * Redistribution and use in source and binary forms, with or 13*4882a593Smuzhiyun * without modification, are permitted provided that the following 14*4882a593Smuzhiyun * conditions are met: 15*4882a593Smuzhiyun * 16*4882a593Smuzhiyun * - Redistributions of source code must retain the above 17*4882a593Smuzhiyun * copyright notice, this list of conditions and the following 18*4882a593Smuzhiyun * disclaimer. 19*4882a593Smuzhiyun * 20*4882a593Smuzhiyun * - Redistributions in binary form must reproduce the above 21*4882a593Smuzhiyun * copyright notice, this list of conditions and the following 22*4882a593Smuzhiyun * disclaimer in the documentation and/or other materials 23*4882a593Smuzhiyun * provided with the distribution. 24*4882a593Smuzhiyun * 25*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 26*4882a593Smuzhiyun * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 27*4882a593Smuzhiyun * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 28*4882a593Smuzhiyun * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 29*4882a593Smuzhiyun * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 30*4882a593Smuzhiyun * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 31*4882a593Smuzhiyun * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 32*4882a593Smuzhiyun * SOFTWARE. 33*4882a593Smuzhiyun */ 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #ifndef _RKISP1_PATH_VIDEO_H 36*4882a593Smuzhiyun #define _RKISP1_PATH_VIDEO_H 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun #include "common.h" 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun struct rkisp1_stream; 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun /* 43*4882a593Smuzhiyun * @fourcc: pixel format 44*4882a593Smuzhiyun * @mbus_code: pixel format over bus 45*4882a593Smuzhiyun * @fmt_type: helper filed for pixel format 46*4882a593Smuzhiyun * @bpp: bits per pixel 47*4882a593Smuzhiyun * @bayer_pat: bayer patten type 48*4882a593Smuzhiyun * @cplanes: number of colour planes 49*4882a593Smuzhiyun * @mplanes: number of stored memory planes 50*4882a593Smuzhiyun * @uv_swap: if cb cr swaped, for yuv 51*4882a593Smuzhiyun * @write_format: defines how YCbCr self picture data is written to memory 52*4882a593Smuzhiyun * @input_format: defines sp input format 53*4882a593Smuzhiyun * @output_format: defines sp output format 54*4882a593Smuzhiyun */ 55*4882a593Smuzhiyun struct capture_fmt { 56*4882a593Smuzhiyun u32 fourcc; 57*4882a593Smuzhiyun u32 mbus_code; 58*4882a593Smuzhiyun u8 fmt_type; 59*4882a593Smuzhiyun u8 cplanes; 60*4882a593Smuzhiyun u8 mplanes; 61*4882a593Smuzhiyun u8 uv_swap; 62*4882a593Smuzhiyun u32 write_format; 63*4882a593Smuzhiyun u32 output_format; 64*4882a593Smuzhiyun u8 bpp[VIDEO_MAX_PLANES]; 65*4882a593Smuzhiyun }; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun enum rkisp1_sp_inp { 68*4882a593Smuzhiyun RKISP1_SP_INP_ISP, 69*4882a593Smuzhiyun RKISP1_SP_INP_DMA_SP, 70*4882a593Smuzhiyun RKISP1_SP_INP_MAX 71*4882a593Smuzhiyun }; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun enum rkisp1_field { 74*4882a593Smuzhiyun RKISP_FIELD_ODD, 75*4882a593Smuzhiyun RKISP_FIELD_EVEN, 76*4882a593Smuzhiyun RKISP_FIELD_INVAL, 77*4882a593Smuzhiyun }; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun struct rkisp1_stream_sp { 80*4882a593Smuzhiyun int y_stride; 81*4882a593Smuzhiyun int vir_offs; 82*4882a593Smuzhiyun enum rkisp1_sp_inp input_sel; 83*4882a593Smuzhiyun enum rkisp1_field field; 84*4882a593Smuzhiyun enum rkisp1_field field_rec; 85*4882a593Smuzhiyun }; 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun struct rkisp1_stream_mp { 88*4882a593Smuzhiyun bool raw_enable; 89*4882a593Smuzhiyun }; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun struct rkisp1_stream_raw { 92*4882a593Smuzhiyun u8 pre_stop; 93*4882a593Smuzhiyun }; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun struct rkisp1_stream_dmarx { 96*4882a593Smuzhiyun int y_stride; 97*4882a593Smuzhiyun }; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun /* Different config between selfpath and mainpath */ 100*4882a593Smuzhiyun struct stream_config { 101*4882a593Smuzhiyun const struct capture_fmt *fmts; 102*4882a593Smuzhiyun int fmt_size; 103*4882a593Smuzhiyun /* constrains */ 104*4882a593Smuzhiyun const int max_rsz_width; 105*4882a593Smuzhiyun const int max_rsz_height; 106*4882a593Smuzhiyun const int min_rsz_width; 107*4882a593Smuzhiyun const int min_rsz_height; 108*4882a593Smuzhiyun /* registers */ 109*4882a593Smuzhiyun struct { 110*4882a593Smuzhiyun u32 ctrl; 111*4882a593Smuzhiyun u32 ctrl_shd; 112*4882a593Smuzhiyun u32 scale_hy; 113*4882a593Smuzhiyun u32 scale_hcr; 114*4882a593Smuzhiyun u32 scale_hcb; 115*4882a593Smuzhiyun u32 scale_vy; 116*4882a593Smuzhiyun u32 scale_vc; 117*4882a593Smuzhiyun u32 scale_lut; 118*4882a593Smuzhiyun u32 scale_lut_addr; 119*4882a593Smuzhiyun u32 scale_hy_shd; 120*4882a593Smuzhiyun u32 scale_hcr_shd; 121*4882a593Smuzhiyun u32 scale_hcb_shd; 122*4882a593Smuzhiyun u32 scale_vy_shd; 123*4882a593Smuzhiyun u32 scale_vc_shd; 124*4882a593Smuzhiyun u32 phase_hy; 125*4882a593Smuzhiyun u32 phase_hc; 126*4882a593Smuzhiyun u32 phase_vy; 127*4882a593Smuzhiyun u32 phase_vc; 128*4882a593Smuzhiyun u32 phase_hy_shd; 129*4882a593Smuzhiyun u32 phase_hc_shd; 130*4882a593Smuzhiyun u32 phase_vy_shd; 131*4882a593Smuzhiyun u32 phase_vc_shd; 132*4882a593Smuzhiyun } rsz; 133*4882a593Smuzhiyun struct { 134*4882a593Smuzhiyun u32 ctrl; 135*4882a593Smuzhiyun u32 yuvmode_mask; 136*4882a593Smuzhiyun u32 rawmode_mask; 137*4882a593Smuzhiyun u32 h_offset; 138*4882a593Smuzhiyun u32 v_offset; 139*4882a593Smuzhiyun u32 h_size; 140*4882a593Smuzhiyun u32 v_size; 141*4882a593Smuzhiyun } dual_crop; 142*4882a593Smuzhiyun struct { 143*4882a593Smuzhiyun u32 y_size_init; 144*4882a593Smuzhiyun u32 cb_size_init; 145*4882a593Smuzhiyun u32 cr_size_init; 146*4882a593Smuzhiyun u32 y_base_ad_init; 147*4882a593Smuzhiyun u32 cb_base_ad_init; 148*4882a593Smuzhiyun u32 cr_base_ad_init; 149*4882a593Smuzhiyun u32 y_offs_cnt_init; 150*4882a593Smuzhiyun u32 cb_offs_cnt_init; 151*4882a593Smuzhiyun u32 cr_offs_cnt_init; 152*4882a593Smuzhiyun } mi; 153*4882a593Smuzhiyun }; 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun /* Different reg ops between selfpath and mainpath */ 156*4882a593Smuzhiyun struct streams_ops { 157*4882a593Smuzhiyun int (*config_mi)(struct rkisp1_stream *stream); 158*4882a593Smuzhiyun void (*stop_mi)(struct rkisp1_stream *stream); 159*4882a593Smuzhiyun void (*enable_mi)(struct rkisp1_stream *stream); 160*4882a593Smuzhiyun void (*disable_mi)(struct rkisp1_stream *stream); 161*4882a593Smuzhiyun void (*set_data_path)(void __iomem *base); 162*4882a593Smuzhiyun bool (*is_stream_stopped)(void __iomem *base); 163*4882a593Smuzhiyun void (*update_mi)(struct rkisp1_stream *stream); 164*4882a593Smuzhiyun }; 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun /* 167*4882a593Smuzhiyun * struct rkisp1_stream - ISP capture video device 168*4882a593Smuzhiyun * 169*4882a593Smuzhiyun * @out_isp_fmt: output isp format 170*4882a593Smuzhiyun * @out_fmt: output buffer size 171*4882a593Smuzhiyun * @dcrop: coordinates of dual-crop 172*4882a593Smuzhiyun * 173*4882a593Smuzhiyun * @vbq_lock: lock to protect buf_queue 174*4882a593Smuzhiyun * @buf_queue: queued buffer list 175*4882a593Smuzhiyun * @dummy_buf: dummy space to store dropped data 176*4882a593Smuzhiyun * 177*4882a593Smuzhiyun * rkisp1 use shadowsock registers, so it need two buffer at a time 178*4882a593Smuzhiyun * @curr_buf: the buffer used for current frame 179*4882a593Smuzhiyun * @next_buf: the buffer used for next frame 180*4882a593Smuzhiyun */ 181*4882a593Smuzhiyun struct rkisp1_stream { 182*4882a593Smuzhiyun unsigned id:2; 183*4882a593Smuzhiyun unsigned interlaced:1; 184*4882a593Smuzhiyun struct rkisp1_device *ispdev; 185*4882a593Smuzhiyun struct rkisp1_vdev_node vnode; 186*4882a593Smuzhiyun struct capture_fmt out_isp_fmt; 187*4882a593Smuzhiyun struct v4l2_pix_format_mplane out_fmt; 188*4882a593Smuzhiyun struct v4l2_rect dcrop; 189*4882a593Smuzhiyun struct streams_ops *ops; 190*4882a593Smuzhiyun struct stream_config *config; 191*4882a593Smuzhiyun spinlock_t vbq_lock; 192*4882a593Smuzhiyun struct list_head buf_queue; 193*4882a593Smuzhiyun struct rkisp1_dummy_buffer dummy_buf; 194*4882a593Smuzhiyun struct rkisp1_buffer *curr_buf; 195*4882a593Smuzhiyun struct rkisp1_buffer *next_buf; 196*4882a593Smuzhiyun bool streaming; 197*4882a593Smuzhiyun bool stopping; 198*4882a593Smuzhiyun bool frame_end; 199*4882a593Smuzhiyun wait_queue_head_t done; 200*4882a593Smuzhiyun unsigned int burst; 201*4882a593Smuzhiyun union { 202*4882a593Smuzhiyun struct rkisp1_stream_sp sp; 203*4882a593Smuzhiyun struct rkisp1_stream_mp mp; 204*4882a593Smuzhiyun struct rkisp1_stream_raw raw; 205*4882a593Smuzhiyun struct rkisp1_stream_dmarx dmarx; 206*4882a593Smuzhiyun } u; 207*4882a593Smuzhiyun }; 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun void rkisp1_unregister_stream_vdevs(struct rkisp1_device *dev); 210*4882a593Smuzhiyun int rkisp1_register_stream_vdevs(struct rkisp1_device *dev); 211*4882a593Smuzhiyun void rkisp1_mi_isr(u32 mis_val, struct rkisp1_device *dev); 212*4882a593Smuzhiyun void rkisp1_stream_init(struct rkisp1_device *dev, u32 id); 213*4882a593Smuzhiyun void rkisp1_set_stream_def_fmt(struct rkisp1_device *dev, u32 id, 214*4882a593Smuzhiyun u32 width, u32 height, u32 pixelformat); 215*4882a593Smuzhiyun void rkisp1_mipi_dmatx0_end(u32 status, struct rkisp1_device *dev); 216*4882a593Smuzhiyun int fcc_xysubs(u32 fcc, u32 *xsubs, u32 *ysubs); 217*4882a593Smuzhiyun int rkisp1_fh_open(struct file *filp); 218*4882a593Smuzhiyun int rkisp1_fop_release(struct file *file); 219*4882a593Smuzhiyun #endif /* _RKISP1_PATH_VIDEO_H */ 220