1e6938cc1SHelen Koike /* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ 2e6938cc1SHelen Koike /* 3e6938cc1SHelen Koike * Rockchip ISP1 Driver - Common definitions 4e6938cc1SHelen Koike * 5e6938cc1SHelen Koike * Copyright (C) 2019 Collabora, Ltd. 6e6938cc1SHelen Koike * 7e6938cc1SHelen Koike * Based on Rockchip ISP1 driver by Rockchip Electronics Co., Ltd. 8e6938cc1SHelen Koike * Copyright (C) 2017 Rockchip Electronics Co., Ltd. 9e6938cc1SHelen Koike */ 10e6938cc1SHelen Koike 11e6938cc1SHelen Koike #ifndef _RKISP1_COMMON_H 12e6938cc1SHelen Koike #define _RKISP1_COMMON_H 13e6938cc1SHelen Koike 14e6938cc1SHelen Koike #include <linux/clk.h> 1508818e6aSHeiko Stuebner #include <linux/interrupt.h> 16e6938cc1SHelen Koike #include <linux/mutex.h> 17e6938cc1SHelen Koike #include <linux/rkisp1-config.h> 18e6938cc1SHelen Koike #include <media/media-device.h> 19e6938cc1SHelen Koike #include <media/media-entity.h> 20e6938cc1SHelen Koike #include <media/v4l2-ctrls.h> 21e6938cc1SHelen Koike #include <media/v4l2-device.h> 22e6938cc1SHelen Koike #include <media/videobuf2-v4l2.h> 23e6938cc1SHelen Koike 24e6938cc1SHelen Koike #include "rkisp1-regs.h" 25e6938cc1SHelen Koike 268682037dSLaurent Pinchart struct dentry; 278682037dSLaurent Pinchart 28e6938cc1SHelen Koike /* 290f3c2ab2SPaul Elder * flags on the 'direction' field in struct rkisp1_mbus_info' that indicate 30e6938cc1SHelen Koike * on which pad the media bus format is supported 31e6938cc1SHelen Koike */ 32e6938cc1SHelen Koike #define RKISP1_ISP_SD_SRC BIT(0) 33e6938cc1SHelen Koike #define RKISP1_ISP_SD_SINK BIT(1) 34e6938cc1SHelen Koike 35e6938cc1SHelen Koike /* min and max values for the widths and heights of the entities */ 36e6938cc1SHelen Koike #define RKISP1_ISP_MAX_WIDTH 4032 37e6938cc1SHelen Koike #define RKISP1_ISP_MAX_HEIGHT 3024 38e6938cc1SHelen Koike #define RKISP1_ISP_MIN_WIDTH 32 39e6938cc1SHelen Koike #define RKISP1_ISP_MIN_HEIGHT 32 40e6938cc1SHelen Koike 41e6938cc1SHelen Koike #define RKISP1_RSZ_MP_SRC_MAX_WIDTH 4416 42e6938cc1SHelen Koike #define RKISP1_RSZ_MP_SRC_MAX_HEIGHT 3312 43e6938cc1SHelen Koike #define RKISP1_RSZ_SP_SRC_MAX_WIDTH 1920 44e6938cc1SHelen Koike #define RKISP1_RSZ_SP_SRC_MAX_HEIGHT 1920 45e6938cc1SHelen Koike #define RKISP1_RSZ_SRC_MIN_WIDTH 32 46e6938cc1SHelen Koike #define RKISP1_RSZ_SRC_MIN_HEIGHT 16 47e6938cc1SHelen Koike 48e6938cc1SHelen Koike /* the default width and height of all the entities */ 49e6938cc1SHelen Koike #define RKISP1_DEFAULT_WIDTH 800 50e6938cc1SHelen Koike #define RKISP1_DEFAULT_HEIGHT 600 51e6938cc1SHelen Koike 52e6938cc1SHelen Koike #define RKISP1_DRIVER_NAME "rkisp1" 53e6938cc1SHelen Koike #define RKISP1_BUS_INFO "platform:" RKISP1_DRIVER_NAME 54e6938cc1SHelen Koike 55e6938cc1SHelen Koike /* maximum number of clocks */ 56e6938cc1SHelen Koike #define RKISP1_MAX_BUS_CLK 8 57e6938cc1SHelen Koike 58e6938cc1SHelen Koike /* a bitmask of the ready stats */ 59e6938cc1SHelen Koike #define RKISP1_STATS_MEAS_MASK (RKISP1_CIF_ISP_AWB_DONE | \ 60e6938cc1SHelen Koike RKISP1_CIF_ISP_AFM_FIN | \ 61e6938cc1SHelen Koike RKISP1_CIF_ISP_EXP_END | \ 62e6938cc1SHelen Koike RKISP1_CIF_ISP_HIST_MEASURE_RDY) 63e6938cc1SHelen Koike 64e6938cc1SHelen Koike /* enum for the resizer pads */ 65e6938cc1SHelen Koike enum rkisp1_rsz_pad { 66e6938cc1SHelen Koike RKISP1_RSZ_PAD_SINK, 67e6938cc1SHelen Koike RKISP1_RSZ_PAD_SRC, 68e6938cc1SHelen Koike RKISP1_RSZ_PAD_MAX 69e6938cc1SHelen Koike }; 70e6938cc1SHelen Koike 71e6938cc1SHelen Koike /* enum for the capture id */ 72e6938cc1SHelen Koike enum rkisp1_stream_id { 73e6938cc1SHelen Koike RKISP1_MAINPATH, 74e6938cc1SHelen Koike RKISP1_SELFPATH, 75e6938cc1SHelen Koike }; 76e6938cc1SHelen Koike 77e6938cc1SHelen Koike /* bayer patterns */ 78e6938cc1SHelen Koike enum rkisp1_fmt_raw_pat_type { 79e6938cc1SHelen Koike RKISP1_RAW_RGGB = 0, 80e6938cc1SHelen Koike RKISP1_RAW_GRBG, 81e6938cc1SHelen Koike RKISP1_RAW_GBRG, 82e6938cc1SHelen Koike RKISP1_RAW_BGGR, 83e6938cc1SHelen Koike }; 84e6938cc1SHelen Koike 85e6938cc1SHelen Koike /* enum for the isp pads */ 86e6938cc1SHelen Koike enum rkisp1_isp_pad { 87e6938cc1SHelen Koike RKISP1_ISP_PAD_SINK_VIDEO, 88e6938cc1SHelen Koike RKISP1_ISP_PAD_SINK_PARAMS, 89e6938cc1SHelen Koike RKISP1_ISP_PAD_SOURCE_VIDEO, 90e6938cc1SHelen Koike RKISP1_ISP_PAD_SOURCE_STATS, 91e6938cc1SHelen Koike RKISP1_ISP_PAD_MAX 92e6938cc1SHelen Koike }; 93e6938cc1SHelen Koike 94e6938cc1SHelen Koike /* 959125aee7SPaul Elder * struct rkisp1_info - Model-specific ISP Information 969125aee7SPaul Elder * 979125aee7SPaul Elder * @clks: array of ISP clock names 989125aee7SPaul Elder * @clk_size: number of entries in the @clks array 999125aee7SPaul Elder * @isrs: array of ISP interrupt descriptors 1009125aee7SPaul Elder * @isr_size: number of entries in the @isrs array 1019125aee7SPaul Elder * @isp_ver: ISP version 1029125aee7SPaul Elder * 1039125aee7SPaul Elder * This structure contains information about the ISP specific to a particular 1049125aee7SPaul Elder * ISP model, version, or integration in a particular SoC. 1059125aee7SPaul Elder */ 1069125aee7SPaul Elder struct rkisp1_info { 1079125aee7SPaul Elder const char * const *clks; 1089125aee7SPaul Elder unsigned int clk_size; 1099125aee7SPaul Elder const struct rkisp1_isr_data *isrs; 1109125aee7SPaul Elder unsigned int isr_size; 1119125aee7SPaul Elder enum rkisp1_cif_isp_version isp_ver; 1129125aee7SPaul Elder }; 1139125aee7SPaul Elder 1149125aee7SPaul Elder /* 115e6938cc1SHelen Koike * struct rkisp1_sensor_async - A container for the v4l2_async_subdev to add to the notifier 116e6938cc1SHelen Koike * of the v4l2-async API 117e6938cc1SHelen Koike * 118e6938cc1SHelen Koike * @asd: async_subdev variable for the sensor 119bc374e17SLaurent Pinchart * @index: index of the sensor (counting sensor found in DT) 120b0b8ab68SLaurent Pinchart * @source_ep: fwnode for the sensor source endpoint 121e6938cc1SHelen Koike * @lanes: number of lanes 122e6938cc1SHelen Koike * @mbus_type: type of bus (currently only CSI2 is supported) 123e6938cc1SHelen Koike * @mbus_flags: media bus (V4L2_MBUS_*) flags 124e6938cc1SHelen Koike * @sd: a pointer to v4l2_subdev struct of the sensor 125e6938cc1SHelen Koike * @pixel_rate_ctrl: pixel rate of the sensor, used to initialize the phy 126e6938cc1SHelen Koike */ 127e6938cc1SHelen Koike struct rkisp1_sensor_async { 128e6938cc1SHelen Koike struct v4l2_async_subdev asd; 129bc374e17SLaurent Pinchart unsigned int index; 130b0b8ab68SLaurent Pinchart struct fwnode_handle *source_ep; 131e6938cc1SHelen Koike unsigned int lanes; 132e6938cc1SHelen Koike enum v4l2_mbus_type mbus_type; 133e6938cc1SHelen Koike unsigned int mbus_flags; 134e6938cc1SHelen Koike struct v4l2_subdev *sd; 135e6938cc1SHelen Koike struct v4l2_ctrl *pixel_rate_ctrl; 136*8082e2f4SPaul Elder }; 137*8082e2f4SPaul Elder 138*8082e2f4SPaul Elder /* 139*8082e2f4SPaul Elder * struct rkisp1_csi - CSI receiver subdev 140*8082e2f4SPaul Elder * 141*8082e2f4SPaul Elder * @rkisp1: pointer to the rkisp1 device 142*8082e2f4SPaul Elder * @dphy: a pointer to the phy 143*8082e2f4SPaul Elder * @is_dphy_errctrl_disabled: if dphy errctrl is disabled (avoid endless interrupt) 144*8082e2f4SPaul Elder */ 145*8082e2f4SPaul Elder struct rkisp1_csi { 146*8082e2f4SPaul Elder struct rkisp1_device *rkisp1; 147e6938cc1SHelen Koike struct phy *dphy; 148*8082e2f4SPaul Elder bool is_dphy_errctrl_disabled; 149e6938cc1SHelen Koike }; 150e6938cc1SHelen Koike 151e6938cc1SHelen Koike /* 152e6938cc1SHelen Koike * struct rkisp1_isp - ISP subdev entity 153e6938cc1SHelen Koike * 154e6938cc1SHelen Koike * @sd: v4l2_subdev variable 155e6938cc1SHelen Koike * @rkisp1: pointer to rkisp1_device 156e6938cc1SHelen Koike * @pads: media pads 157e6938cc1SHelen Koike * @pad_cfg: pads configurations 158e6938cc1SHelen Koike * @sink_fmt: input format 159e6938cc1SHelen Koike * @src_fmt: output format 160e6938cc1SHelen Koike * @ops_lock: ops serialization 161e6938cc1SHelen Koike * @frame_sequence: used to synchronize frame_id between video devices. 162e6938cc1SHelen Koike */ 163e6938cc1SHelen Koike struct rkisp1_isp { 164e6938cc1SHelen Koike struct v4l2_subdev sd; 165e6938cc1SHelen Koike struct media_pad pads[RKISP1_ISP_PAD_MAX]; 166e6938cc1SHelen Koike struct v4l2_subdev_pad_config pad_cfg[RKISP1_ISP_PAD_MAX]; 1670f3c2ab2SPaul Elder const struct rkisp1_mbus_info *sink_fmt; 1680f3c2ab2SPaul Elder const struct rkisp1_mbus_info *src_fmt; 169e6938cc1SHelen Koike struct mutex ops_lock; /* serialize the subdevice ops */ 170e6938cc1SHelen Koike __u32 frame_sequence; 171e6938cc1SHelen Koike }; 172e6938cc1SHelen Koike 173e6938cc1SHelen Koike /* 174e6938cc1SHelen Koike * struct rkisp1_vdev_node - Container for the video nodes: params, stats, mainpath, selfpath 175e6938cc1SHelen Koike * 176e6938cc1SHelen Koike * @buf_queue: queue of buffers 177e6938cc1SHelen Koike * @vlock: lock of the video node 178e6938cc1SHelen Koike * @vdev: video node 179e6938cc1SHelen Koike * @pad: media pad 180e6938cc1SHelen Koike */ 181e6938cc1SHelen Koike struct rkisp1_vdev_node { 182e6938cc1SHelen Koike struct vb2_queue buf_queue; 183e6938cc1SHelen Koike struct mutex vlock; /* ioctl serialization mutex */ 184e6938cc1SHelen Koike struct video_device vdev; 185e6938cc1SHelen Koike struct media_pad pad; 186e6938cc1SHelen Koike }; 187e6938cc1SHelen Koike 188e6938cc1SHelen Koike /* 189e6938cc1SHelen Koike * struct rkisp1_buffer - A container for the vb2 buffers used by the video devices: 190e6938cc1SHelen Koike * params, stats, mainpath, selfpath 191e6938cc1SHelen Koike * 192e6938cc1SHelen Koike * @vb: vb2 buffer 193e6938cc1SHelen Koike * @queue: entry of the buffer in the queue 194e6938cc1SHelen Koike * @buff_addr: dma addresses of each plane, used only by the capture devices: selfpath, mainpath 195e6938cc1SHelen Koike */ 196e6938cc1SHelen Koike struct rkisp1_buffer { 197e6938cc1SHelen Koike struct vb2_v4l2_buffer vb; 198e6938cc1SHelen Koike struct list_head queue; 199e6938cc1SHelen Koike u32 buff_addr[VIDEO_MAX_PLANES]; 200e6938cc1SHelen Koike }; 201e6938cc1SHelen Koike 202e6938cc1SHelen Koike /* 203e6938cc1SHelen Koike * struct rkisp1_dummy_buffer - A buffer to write the next frame to in case 204e6938cc1SHelen Koike * there are no vb2 buffers available. 205e6938cc1SHelen Koike * 206e6938cc1SHelen Koike * @vaddr: return value of call to dma_alloc_attrs. 207e6938cc1SHelen Koike * @dma_addr: dma address of the buffer. 208e6938cc1SHelen Koike * @size: size of the buffer. 209e6938cc1SHelen Koike */ 210e6938cc1SHelen Koike struct rkisp1_dummy_buffer { 211e6938cc1SHelen Koike void *vaddr; 212e6938cc1SHelen Koike dma_addr_t dma_addr; 213e6938cc1SHelen Koike u32 size; 214e6938cc1SHelen Koike }; 215e6938cc1SHelen Koike 216e6938cc1SHelen Koike struct rkisp1_device; 217e6938cc1SHelen Koike 218e6938cc1SHelen Koike /* 219e6938cc1SHelen Koike * struct rkisp1_capture - ISP capture video device 220e6938cc1SHelen Koike * 221e6938cc1SHelen Koike * @vnode: video node 222e6938cc1SHelen Koike * @rkisp1: pointer to rkisp1_device 223e6938cc1SHelen Koike * @id: id of the capture, one of RKISP1_SELFPATH, RKISP1_MAINPATH 224e6938cc1SHelen Koike * @ops: list of callbacks to configure the capture device. 225e6938cc1SHelen Koike * @config: a pointer to the list of registers to configure the capture format. 226e6938cc1SHelen Koike * @is_streaming: device is streaming 227e6938cc1SHelen Koike * @is_stopping: stop_streaming callback was called and the device is in the process of 228e6938cc1SHelen Koike * stopping the streaming. 229e6938cc1SHelen Koike * @done: when stop_streaming callback is called, the device waits for the next irq 230e6938cc1SHelen Koike * handler to stop the streaming by waiting on the 'done' wait queue. 231e6938cc1SHelen Koike * If the irq handler is not called, the stream is stopped by the callback 232e6938cc1SHelen Koike * after timeout. 233e6938cc1SHelen Koike * @sp_y_stride: the selfpath allows to configure a y stride that is longer than the image width. 234e6938cc1SHelen Koike * @buf.lock: lock to protect buf.queue 235e6938cc1SHelen Koike * @buf.queue: queued buffer list 236e6938cc1SHelen Koike * @buf.dummy: dummy space to store dropped data 237e6938cc1SHelen Koike * 238e6938cc1SHelen Koike * rkisp1 uses shadow registers, so it needs two buffers at a time 239e6938cc1SHelen Koike * @buf.curr: the buffer used for current frame 240e6938cc1SHelen Koike * @buf.next: the buffer used for next frame 241e6938cc1SHelen Koike * @pix.cfg: pixel configuration 242e6938cc1SHelen Koike * @pix.info: a pointer to the v4l2_format_info of the pixel format 243e6938cc1SHelen Koike * @pix.fmt: buffer format 244e6938cc1SHelen Koike */ 245e6938cc1SHelen Koike struct rkisp1_capture { 246e6938cc1SHelen Koike struct rkisp1_vdev_node vnode; 247e6938cc1SHelen Koike struct rkisp1_device *rkisp1; 248e6938cc1SHelen Koike enum rkisp1_stream_id id; 249a109073bSRikard Falkeborn const struct rkisp1_capture_ops *ops; 250e6938cc1SHelen Koike const struct rkisp1_capture_config *config; 251e6938cc1SHelen Koike bool is_streaming; 252e6938cc1SHelen Koike bool is_stopping; 253e6938cc1SHelen Koike wait_queue_head_t done; 254e6938cc1SHelen Koike unsigned int sp_y_stride; 255e6938cc1SHelen Koike struct { 256e6938cc1SHelen Koike /* protects queue, curr and next */ 257e6938cc1SHelen Koike spinlock_t lock; 258e6938cc1SHelen Koike struct list_head queue; 259e6938cc1SHelen Koike struct rkisp1_dummy_buffer dummy; 260e6938cc1SHelen Koike struct rkisp1_buffer *curr; 261e6938cc1SHelen Koike struct rkisp1_buffer *next; 262e6938cc1SHelen Koike } buf; 263e6938cc1SHelen Koike struct { 264e6938cc1SHelen Koike const struct rkisp1_capture_fmt_cfg *cfg; 265e6938cc1SHelen Koike const struct v4l2_format_info *info; 266e6938cc1SHelen Koike struct v4l2_pix_format_mplane fmt; 267e6938cc1SHelen Koike } pix; 268e6938cc1SHelen Koike }; 269e6938cc1SHelen Koike 270962fb140SHeiko Stuebner struct rkisp1_stats; 271962fb140SHeiko Stuebner struct rkisp1_stats_ops { 272962fb140SHeiko Stuebner void (*get_awb_meas)(struct rkisp1_stats *stats, 273962fb140SHeiko Stuebner struct rkisp1_stat_buffer *pbuf); 274962fb140SHeiko Stuebner void (*get_aec_meas)(struct rkisp1_stats *stats, 275962fb140SHeiko Stuebner struct rkisp1_stat_buffer *pbuf); 276962fb140SHeiko Stuebner void (*get_hst_meas)(struct rkisp1_stats *stats, 277962fb140SHeiko Stuebner struct rkisp1_stat_buffer *pbuf); 278962fb140SHeiko Stuebner }; 279962fb140SHeiko Stuebner 280e6938cc1SHelen Koike /* 281e6938cc1SHelen Koike * struct rkisp1_stats - ISP Statistics device 282e6938cc1SHelen Koike * 283e6938cc1SHelen Koike * @vnode: video node 284e6938cc1SHelen Koike * @rkisp1: pointer to the rkisp1 device 285e6938cc1SHelen Koike * @lock: locks the buffer list 'stat' 286e6938cc1SHelen Koike * @stat: queue of rkisp1_buffer 287e6938cc1SHelen Koike * @vdev_fmt: v4l2_format of the metadata format 288e6938cc1SHelen Koike */ 289e6938cc1SHelen Koike struct rkisp1_stats { 290e6938cc1SHelen Koike struct rkisp1_vdev_node vnode; 291e6938cc1SHelen Koike struct rkisp1_device *rkisp1; 292962fb140SHeiko Stuebner const struct rkisp1_stats_ops *ops; 293e6938cc1SHelen Koike 294e6938cc1SHelen Koike spinlock_t lock; /* locks the buffers list 'stats' */ 295e6938cc1SHelen Koike struct list_head stat; 296e6938cc1SHelen Koike struct v4l2_format vdev_fmt; 297e6938cc1SHelen Koike }; 298e6938cc1SHelen Koike 2995e8d9d72SHeiko Stuebner struct rkisp1_params; 3005e8d9d72SHeiko Stuebner struct rkisp1_params_ops { 3015e8d9d72SHeiko Stuebner void (*lsc_matrix_config)(struct rkisp1_params *params, 3025e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_lsc_config *pconfig); 3035e8d9d72SHeiko Stuebner void (*goc_config)(struct rkisp1_params *params, 3045e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_goc_config *arg); 3055e8d9d72SHeiko Stuebner void (*awb_meas_config)(struct rkisp1_params *params, 3065e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_awb_meas_config *arg); 3075e8d9d72SHeiko Stuebner void (*awb_meas_enable)(struct rkisp1_params *params, 3085e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_awb_meas_config *arg, 3095e8d9d72SHeiko Stuebner bool en); 3105e8d9d72SHeiko Stuebner void (*awb_gain_config)(struct rkisp1_params *params, 3115e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_awb_gain_config *arg); 3125e8d9d72SHeiko Stuebner void (*aec_config)(struct rkisp1_params *params, 3135e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_aec_config *arg); 3145e8d9d72SHeiko Stuebner void (*hst_config)(struct rkisp1_params *params, 3155e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_hst_config *arg); 3165e8d9d72SHeiko Stuebner void (*hst_enable)(struct rkisp1_params *params, 3175e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_hst_config *arg, bool en); 3185e8d9d72SHeiko Stuebner void (*afm_config)(struct rkisp1_params *params, 3195e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_afc_config *arg); 3205e8d9d72SHeiko Stuebner }; 3215e8d9d72SHeiko Stuebner 322e6938cc1SHelen Koike /* 323e6938cc1SHelen Koike * struct rkisp1_params - ISP input parameters device 324e6938cc1SHelen Koike * 325e6938cc1SHelen Koike * @vnode: video node 326e6938cc1SHelen Koike * @rkisp1: pointer to the rkisp1 device 3275e8d9d72SHeiko Stuebner * @ops: pointer to the variant-specific operations 328e6938cc1SHelen Koike * @config_lock: locks the buffer list 'params' 329e6938cc1SHelen Koike * @params: queue of rkisp1_buffer 330e6938cc1SHelen Koike * @vdev_fmt: v4l2_format of the metadata format 331e6938cc1SHelen Koike * @quantization: the quantization configured on the isp's src pad 332e6938cc1SHelen Koike * @raw_type: the bayer pattern on the isp video sink pad 333e6938cc1SHelen Koike */ 334e6938cc1SHelen Koike struct rkisp1_params { 335e6938cc1SHelen Koike struct rkisp1_vdev_node vnode; 336e6938cc1SHelen Koike struct rkisp1_device *rkisp1; 3375e8d9d72SHeiko Stuebner const struct rkisp1_params_ops *ops; 338e6938cc1SHelen Koike 339e6938cc1SHelen Koike spinlock_t config_lock; /* locks the buffers list 'params' */ 340e6938cc1SHelen Koike struct list_head params; 341e6938cc1SHelen Koike struct v4l2_format vdev_fmt; 342e6938cc1SHelen Koike 343e6938cc1SHelen Koike enum v4l2_quantization quantization; 344e6938cc1SHelen Koike enum rkisp1_fmt_raw_pat_type raw_type; 345e6938cc1SHelen Koike }; 346e6938cc1SHelen Koike 347e6938cc1SHelen Koike /* 348e6938cc1SHelen Koike * struct rkisp1_resizer - Resizer subdev 349e6938cc1SHelen Koike * 350e6938cc1SHelen Koike * @sd: v4l2_subdev variable 3513e74a422SLaurent Pinchart * @regs_base: base register address offset 352e6938cc1SHelen Koike * @id: id of the resizer, one of RKISP1_SELFPATH, RKISP1_MAINPATH 353e6938cc1SHelen Koike * @rkisp1: pointer to the rkisp1 device 354e6938cc1SHelen Koike * @pads: media pads 355e6938cc1SHelen Koike * @pad_cfg: configurations for the pads 356e6938cc1SHelen Koike * @config: the set of registers to configure the resizer 357e6938cc1SHelen Koike * @pixel_enc: pixel encoding of the resizer 358e6938cc1SHelen Koike * @ops_lock: a lock for the subdev ops 359e6938cc1SHelen Koike */ 360e6938cc1SHelen Koike struct rkisp1_resizer { 361e6938cc1SHelen Koike struct v4l2_subdev sd; 3623e74a422SLaurent Pinchart u32 regs_base; 363e6938cc1SHelen Koike enum rkisp1_stream_id id; 364e6938cc1SHelen Koike struct rkisp1_device *rkisp1; 365e6938cc1SHelen Koike struct media_pad pads[RKISP1_RSZ_PAD_MAX]; 366e6938cc1SHelen Koike struct v4l2_subdev_pad_config pad_cfg[RKISP1_RSZ_PAD_MAX]; 367e6938cc1SHelen Koike const struct rkisp1_rsz_config *config; 368e6938cc1SHelen Koike enum v4l2_pixel_encoding pixel_enc; 369e6938cc1SHelen Koike struct mutex ops_lock; /* serialize the subdevice ops */ 370e6938cc1SHelen Koike }; 371e6938cc1SHelen Koike 372e6938cc1SHelen Koike /* 373e6938cc1SHelen Koike * struct rkisp1_debug - Values to be exposed on debugfs. 374e6938cc1SHelen Koike * The parameters are counters of the number of times the 375e6938cc1SHelen Koike * event occurred since the driver was loaded. 376e6938cc1SHelen Koike * 377e6938cc1SHelen Koike * @data_loss: loss of data occurred within a line, processing failure 378e6938cc1SHelen Koike * @outform_size_error: size error is generated in outmux submodule 379e6938cc1SHelen Koike * @img_stabilization_size_error: size error is generated in image stabilization submodule 380e6938cc1SHelen Koike * @inform_size_err: size error is generated in inform submodule 381e6938cc1SHelen Koike * @mipi_error: mipi error occurred 382e6938cc1SHelen Koike * @stats_error: writing to the 'Interrupt clear register' did not clear 383e6938cc1SHelen Koike * it in the register 'Masked interrupt status' 384e6938cc1SHelen Koike * @stop_timeout: upon stream stop, the capture waits 1 second for the isr to stop 385e6938cc1SHelen Koike * the stream. This param is incremented in case of timeout. 386e6938cc1SHelen Koike * @frame_drop: a frame was ready but the buffer queue was empty so the frame 387e6938cc1SHelen Koike * was not sent to userspace 388e6938cc1SHelen Koike */ 389e6938cc1SHelen Koike struct rkisp1_debug { 390e6938cc1SHelen Koike struct dentry *debugfs_dir; 391e6938cc1SHelen Koike unsigned long data_loss; 392e6938cc1SHelen Koike unsigned long outform_size_error; 393e6938cc1SHelen Koike unsigned long img_stabilization_size_error; 394e6938cc1SHelen Koike unsigned long inform_size_error; 395e6938cc1SHelen Koike unsigned long irq_delay; 396e6938cc1SHelen Koike unsigned long mipi_error; 397e6938cc1SHelen Koike unsigned long stats_error; 398e6938cc1SHelen Koike unsigned long stop_timeout[2]; 399e6938cc1SHelen Koike unsigned long frame_drop[2]; 400e6938cc1SHelen Koike }; 401e6938cc1SHelen Koike 402e6938cc1SHelen Koike /* 403e6938cc1SHelen Koike * struct rkisp1_device - ISP platform device 404e6938cc1SHelen Koike * 405e6938cc1SHelen Koike * @base_addr: base register address 406e6938cc1SHelen Koike * @irq: the irq number 407e6938cc1SHelen Koike * @dev: a pointer to the struct device 408e6938cc1SHelen Koike * @clk_size: number of clocks 409e6938cc1SHelen Koike * @clks: array of clocks 410e6938cc1SHelen Koike * @v4l2_dev: v4l2_device variable 411e6938cc1SHelen Koike * @media_dev: media_device variable 412e6938cc1SHelen Koike * @notifier: a notifier to register on the v4l2-async API to be notified on the sensor 413e6938cc1SHelen Koike * @active_sensor: sensor in-use, set when streaming on 414*8082e2f4SPaul Elder * @csi: internal CSI-2 receiver 415e6938cc1SHelen Koike * @isp: ISP sub-device 416e6938cc1SHelen Koike * @resizer_devs: resizer sub-devices 417e6938cc1SHelen Koike * @capture_devs: capture devices 418e6938cc1SHelen Koike * @stats: ISP statistics metadata capture device 419e6938cc1SHelen Koike * @params: ISP parameters metadata output device 420e6938cc1SHelen Koike * @pipe: media pipeline 421e6938cc1SHelen Koike * @stream_lock: serializes {start/stop}_streaming callbacks between the capture devices. 422e6938cc1SHelen Koike * @debug: debug params to be exposed on debugfs 4239125aee7SPaul Elder * @info: version-specific ISP information 424e6938cc1SHelen Koike */ 425e6938cc1SHelen Koike struct rkisp1_device { 426e6938cc1SHelen Koike void __iomem *base_addr; 427e6938cc1SHelen Koike struct device *dev; 428e6938cc1SHelen Koike unsigned int clk_size; 429e6938cc1SHelen Koike struct clk_bulk_data clks[RKISP1_MAX_BUS_CLK]; 430e6938cc1SHelen Koike struct v4l2_device v4l2_dev; 431e6938cc1SHelen Koike struct media_device media_dev; 432e6938cc1SHelen Koike struct v4l2_async_notifier notifier; 433e6938cc1SHelen Koike struct rkisp1_sensor_async *active_sensor; 434*8082e2f4SPaul Elder struct rkisp1_csi csi; 435e6938cc1SHelen Koike struct rkisp1_isp isp; 436e6938cc1SHelen Koike struct rkisp1_resizer resizer_devs[2]; 437e6938cc1SHelen Koike struct rkisp1_capture capture_devs[2]; 438e6938cc1SHelen Koike struct rkisp1_stats stats; 439e6938cc1SHelen Koike struct rkisp1_params params; 440e6938cc1SHelen Koike struct media_pipeline pipe; 441e6938cc1SHelen Koike struct mutex stream_lock; /* serialize {start/stop}_streaming cb between capture devices */ 442e6938cc1SHelen Koike struct rkisp1_debug debug; 4439125aee7SPaul Elder const struct rkisp1_info *info; 444e6938cc1SHelen Koike }; 445e6938cc1SHelen Koike 446e6938cc1SHelen Koike /* 4470f3c2ab2SPaul Elder * struct rkisp1_mbus_info - ISP media bus info, Translates media bus code to hardware 448e6938cc1SHelen Koike * format values 449e6938cc1SHelen Koike * 450e6938cc1SHelen Koike * @mbus_code: media bus code 451e6938cc1SHelen Koike * @pixel_enc: pixel encoding 452e6938cc1SHelen Koike * @mipi_dt: mipi data type 453e6938cc1SHelen Koike * @yuv_seq: the order of the Y, Cb, Cr values 454e6938cc1SHelen Koike * @bus_width: bus width 455e6938cc1SHelen Koike * @bayer_pat: bayer pattern 456e6938cc1SHelen Koike * @direction: a bitmask of the flags indicating on which pad the format is supported on 457e6938cc1SHelen Koike */ 4580f3c2ab2SPaul Elder struct rkisp1_mbus_info { 459e6938cc1SHelen Koike u32 mbus_code; 460e6938cc1SHelen Koike enum v4l2_pixel_encoding pixel_enc; 461e6938cc1SHelen Koike u32 mipi_dt; 462e6938cc1SHelen Koike u32 yuv_seq; 463e6938cc1SHelen Koike u8 bus_width; 464e6938cc1SHelen Koike enum rkisp1_fmt_raw_pat_type bayer_pat; 465e6938cc1SHelen Koike unsigned int direction; 466e6938cc1SHelen Koike }; 467e6938cc1SHelen Koike 468e6938cc1SHelen Koike static inline void 4690ef7dc30SLaurent Pinchart rkisp1_write(struct rkisp1_device *rkisp1, unsigned int addr, u32 val) 470e6938cc1SHelen Koike { 471e6938cc1SHelen Koike writel(val, rkisp1->base_addr + addr); 472e6938cc1SHelen Koike } 473e6938cc1SHelen Koike 474e6938cc1SHelen Koike static inline u32 rkisp1_read(struct rkisp1_device *rkisp1, unsigned int addr) 475e6938cc1SHelen Koike { 476e6938cc1SHelen Koike return readl(rkisp1->base_addr + addr); 477e6938cc1SHelen Koike } 478e6938cc1SHelen Koike 479e6938cc1SHelen Koike /* 480e6938cc1SHelen Koike * rkisp1_cap_enum_mbus_codes - A helper function that return the i'th supported mbus code 481e6938cc1SHelen Koike * of the capture entity. This is used to enumerate the supported 482e6938cc1SHelen Koike * mbus codes on the source pad of the resizer. 483e6938cc1SHelen Koike * 484e6938cc1SHelen Koike * @cap: the capture entity 485e6938cc1SHelen Koike * @code: the mbus code, the function reads the code->index and fills the code->code 486e6938cc1SHelen Koike */ 487e6938cc1SHelen Koike int rkisp1_cap_enum_mbus_codes(struct rkisp1_capture *cap, 488e6938cc1SHelen Koike struct v4l2_subdev_mbus_code_enum *code); 489e6938cc1SHelen Koike 490e6938cc1SHelen Koike /* 4910f3c2ab2SPaul Elder * rkisp1_mbus_info_get_by_index - Retrieve the ith supported mbus info 4920f3c2ab2SPaul Elder * 4930f3c2ab2SPaul Elder * @index: index of the mbus info to fetch 4940f3c2ab2SPaul Elder */ 4950f3c2ab2SPaul Elder const struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_index(unsigned int index); 4960f3c2ab2SPaul Elder 4970f3c2ab2SPaul Elder /* 498e6938cc1SHelen Koike * rkisp1_sd_adjust_crop_rect - adjust a rectangle to fit into another rectangle. 499e6938cc1SHelen Koike * 500e6938cc1SHelen Koike * @crop: rectangle to adjust. 501e6938cc1SHelen Koike * @bounds: rectangle used as bounds. 502e6938cc1SHelen Koike */ 503e6938cc1SHelen Koike void rkisp1_sd_adjust_crop_rect(struct v4l2_rect *crop, 504e6938cc1SHelen Koike const struct v4l2_rect *bounds); 505e6938cc1SHelen Koike 506e6938cc1SHelen Koike /* 507e6938cc1SHelen Koike * rkisp1_sd_adjust_crop - adjust a rectangle to fit into media bus format 508e6938cc1SHelen Koike * 509e6938cc1SHelen Koike * @crop: rectangle to adjust. 510e6938cc1SHelen Koike * @bounds: media bus format used as bounds. 511e6938cc1SHelen Koike */ 512e6938cc1SHelen Koike void rkisp1_sd_adjust_crop(struct v4l2_rect *crop, 513e6938cc1SHelen Koike const struct v4l2_mbus_framefmt *bounds); 514e6938cc1SHelen Koike 515e6938cc1SHelen Koike /* 5160f3c2ab2SPaul Elder * rkisp1_mbus_info_get_by_code - get the isp info of the media bus code 517e6938cc1SHelen Koike * 518e6938cc1SHelen Koike * @mbus_code: the media bus code 519e6938cc1SHelen Koike */ 5200f3c2ab2SPaul Elder const struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_code(u32 mbus_code); 521e6938cc1SHelen Koike 522e6938cc1SHelen Koike /* rkisp1_params_configure - configure the params when stream starts. 523e6938cc1SHelen Koike * This function is called by the isp entity upon stream starts. 524e6938cc1SHelen Koike * The function applies the initial configuration of the parameters. 525e6938cc1SHelen Koike * 526e6938cc1SHelen Koike * @params: pointer to rkisp1_params. 527e6938cc1SHelen Koike * @bayer_pat: the bayer pattern on the isp video sink pad 528e6938cc1SHelen Koike * @quantization: the quantization configured on the isp's src pad 529e6938cc1SHelen Koike */ 530e6938cc1SHelen Koike void rkisp1_params_configure(struct rkisp1_params *params, 531e6938cc1SHelen Koike enum rkisp1_fmt_raw_pat_type bayer_pat, 532e6938cc1SHelen Koike enum v4l2_quantization quantization); 533e6938cc1SHelen Koike 534e6938cc1SHelen Koike /* rkisp1_params_disable - disable all parameters. 535e6938cc1SHelen Koike * This function is called by the isp entity upon stream start 536e6938cc1SHelen Koike * when capturing bayer format. 537e6938cc1SHelen Koike * 538e6938cc1SHelen Koike * @params: pointer to rkisp1_params. 539e6938cc1SHelen Koike */ 540e6938cc1SHelen Koike void rkisp1_params_disable(struct rkisp1_params *params); 541e6938cc1SHelen Koike 542e6938cc1SHelen Koike /* irq handlers */ 54308818e6aSHeiko Stuebner irqreturn_t rkisp1_isp_isr(int irq, void *ctx); 54408818e6aSHeiko Stuebner irqreturn_t rkisp1_mipi_isr(int irq, void *ctx); 54508818e6aSHeiko Stuebner irqreturn_t rkisp1_capture_isr(int irq, void *ctx); 546e6938cc1SHelen Koike void rkisp1_stats_isr(struct rkisp1_stats *stats, u32 isp_ris); 547e6938cc1SHelen Koike void rkisp1_params_isr(struct rkisp1_device *rkisp1); 548e6938cc1SHelen Koike 549e6938cc1SHelen Koike /* register/unregisters functions of the entities */ 550e6938cc1SHelen Koike int rkisp1_capture_devs_register(struct rkisp1_device *rkisp1); 551e6938cc1SHelen Koike void rkisp1_capture_devs_unregister(struct rkisp1_device *rkisp1); 552e6938cc1SHelen Koike 553e6938cc1SHelen Koike int rkisp1_isp_register(struct rkisp1_device *rkisp1); 554e6938cc1SHelen Koike void rkisp1_isp_unregister(struct rkisp1_device *rkisp1); 555e6938cc1SHelen Koike 556e6938cc1SHelen Koike int rkisp1_resizer_devs_register(struct rkisp1_device *rkisp1); 557e6938cc1SHelen Koike void rkisp1_resizer_devs_unregister(struct rkisp1_device *rkisp1); 558e6938cc1SHelen Koike 559e6938cc1SHelen Koike int rkisp1_stats_register(struct rkisp1_device *rkisp1); 560e6938cc1SHelen Koike void rkisp1_stats_unregister(struct rkisp1_device *rkisp1); 561e6938cc1SHelen Koike 562e6938cc1SHelen Koike int rkisp1_params_register(struct rkisp1_device *rkisp1); 563e6938cc1SHelen Koike void rkisp1_params_unregister(struct rkisp1_device *rkisp1); 564e6938cc1SHelen Koike 565fd3608feSLaurent Pinchart #if IS_ENABLED(CONFIG_DEBUG_FS) 5668682037dSLaurent Pinchart void rkisp1_debug_init(struct rkisp1_device *rkisp1); 5678682037dSLaurent Pinchart void rkisp1_debug_cleanup(struct rkisp1_device *rkisp1); 568fd3608feSLaurent Pinchart #else 569fd3608feSLaurent Pinchart static inline void rkisp1_debug_init(struct rkisp1_device *rkisp1) 570fd3608feSLaurent Pinchart { 571fd3608feSLaurent Pinchart } 572fd3608feSLaurent Pinchart static inline void rkisp1_debug_cleanup(struct rkisp1_device *rkisp1) 573fd3608feSLaurent Pinchart { 574fd3608feSLaurent Pinchart } 575fd3608feSLaurent Pinchart #endif 5768682037dSLaurent Pinchart 577e6938cc1SHelen Koike #endif /* _RKISP1_COMMON_H */ 578