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) 120*b0b8ab68SLaurent 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 * @dphy: a pointer to the phy 127e6938cc1SHelen Koike */ 128e6938cc1SHelen Koike struct rkisp1_sensor_async { 129e6938cc1SHelen Koike struct v4l2_async_subdev asd; 130bc374e17SLaurent Pinchart unsigned int index; 131*b0b8ab68SLaurent Pinchart struct fwnode_handle *source_ep; 132e6938cc1SHelen Koike unsigned int lanes; 133e6938cc1SHelen Koike enum v4l2_mbus_type mbus_type; 134e6938cc1SHelen Koike unsigned int mbus_flags; 135e6938cc1SHelen Koike struct v4l2_subdev *sd; 136e6938cc1SHelen Koike struct v4l2_ctrl *pixel_rate_ctrl; 137e6938cc1SHelen Koike struct phy *dphy; 138e6938cc1SHelen Koike }; 139e6938cc1SHelen Koike 140e6938cc1SHelen Koike /* 141e6938cc1SHelen Koike * struct rkisp1_isp - ISP subdev entity 142e6938cc1SHelen Koike * 143e6938cc1SHelen Koike * @sd: v4l2_subdev variable 144e6938cc1SHelen Koike * @rkisp1: pointer to rkisp1_device 145e6938cc1SHelen Koike * @pads: media pads 146e6938cc1SHelen Koike * @pad_cfg: pads configurations 147e6938cc1SHelen Koike * @sink_fmt: input format 148e6938cc1SHelen Koike * @src_fmt: output format 149e6938cc1SHelen Koike * @ops_lock: ops serialization 150e6938cc1SHelen Koike * @is_dphy_errctrl_disabled: if dphy errctrl is disabled (avoid endless interrupt) 151e6938cc1SHelen Koike * @frame_sequence: used to synchronize frame_id between video devices. 152e6938cc1SHelen Koike */ 153e6938cc1SHelen Koike struct rkisp1_isp { 154e6938cc1SHelen Koike struct v4l2_subdev sd; 155e6938cc1SHelen Koike struct media_pad pads[RKISP1_ISP_PAD_MAX]; 156e6938cc1SHelen Koike struct v4l2_subdev_pad_config pad_cfg[RKISP1_ISP_PAD_MAX]; 1570f3c2ab2SPaul Elder const struct rkisp1_mbus_info *sink_fmt; 1580f3c2ab2SPaul Elder const struct rkisp1_mbus_info *src_fmt; 159e6938cc1SHelen Koike struct mutex ops_lock; /* serialize the subdevice ops */ 160e6938cc1SHelen Koike bool is_dphy_errctrl_disabled; 161e6938cc1SHelen Koike __u32 frame_sequence; 162e6938cc1SHelen Koike }; 163e6938cc1SHelen Koike 164e6938cc1SHelen Koike /* 165e6938cc1SHelen Koike * struct rkisp1_vdev_node - Container for the video nodes: params, stats, mainpath, selfpath 166e6938cc1SHelen Koike * 167e6938cc1SHelen Koike * @buf_queue: queue of buffers 168e6938cc1SHelen Koike * @vlock: lock of the video node 169e6938cc1SHelen Koike * @vdev: video node 170e6938cc1SHelen Koike * @pad: media pad 171e6938cc1SHelen Koike */ 172e6938cc1SHelen Koike struct rkisp1_vdev_node { 173e6938cc1SHelen Koike struct vb2_queue buf_queue; 174e6938cc1SHelen Koike struct mutex vlock; /* ioctl serialization mutex */ 175e6938cc1SHelen Koike struct video_device vdev; 176e6938cc1SHelen Koike struct media_pad pad; 177e6938cc1SHelen Koike }; 178e6938cc1SHelen Koike 179e6938cc1SHelen Koike /* 180e6938cc1SHelen Koike * struct rkisp1_buffer - A container for the vb2 buffers used by the video devices: 181e6938cc1SHelen Koike * params, stats, mainpath, selfpath 182e6938cc1SHelen Koike * 183e6938cc1SHelen Koike * @vb: vb2 buffer 184e6938cc1SHelen Koike * @queue: entry of the buffer in the queue 185e6938cc1SHelen Koike * @buff_addr: dma addresses of each plane, used only by the capture devices: selfpath, mainpath 186e6938cc1SHelen Koike */ 187e6938cc1SHelen Koike struct rkisp1_buffer { 188e6938cc1SHelen Koike struct vb2_v4l2_buffer vb; 189e6938cc1SHelen Koike struct list_head queue; 190e6938cc1SHelen Koike u32 buff_addr[VIDEO_MAX_PLANES]; 191e6938cc1SHelen Koike }; 192e6938cc1SHelen Koike 193e6938cc1SHelen Koike /* 194e6938cc1SHelen Koike * struct rkisp1_dummy_buffer - A buffer to write the next frame to in case 195e6938cc1SHelen Koike * there are no vb2 buffers available. 196e6938cc1SHelen Koike * 197e6938cc1SHelen Koike * @vaddr: return value of call to dma_alloc_attrs. 198e6938cc1SHelen Koike * @dma_addr: dma address of the buffer. 199e6938cc1SHelen Koike * @size: size of the buffer. 200e6938cc1SHelen Koike */ 201e6938cc1SHelen Koike struct rkisp1_dummy_buffer { 202e6938cc1SHelen Koike void *vaddr; 203e6938cc1SHelen Koike dma_addr_t dma_addr; 204e6938cc1SHelen Koike u32 size; 205e6938cc1SHelen Koike }; 206e6938cc1SHelen Koike 207e6938cc1SHelen Koike struct rkisp1_device; 208e6938cc1SHelen Koike 209e6938cc1SHelen Koike /* 210e6938cc1SHelen Koike * struct rkisp1_capture - ISP capture video device 211e6938cc1SHelen Koike * 212e6938cc1SHelen Koike * @vnode: video node 213e6938cc1SHelen Koike * @rkisp1: pointer to rkisp1_device 214e6938cc1SHelen Koike * @id: id of the capture, one of RKISP1_SELFPATH, RKISP1_MAINPATH 215e6938cc1SHelen Koike * @ops: list of callbacks to configure the capture device. 216e6938cc1SHelen Koike * @config: a pointer to the list of registers to configure the capture format. 217e6938cc1SHelen Koike * @is_streaming: device is streaming 218e6938cc1SHelen Koike * @is_stopping: stop_streaming callback was called and the device is in the process of 219e6938cc1SHelen Koike * stopping the streaming. 220e6938cc1SHelen Koike * @done: when stop_streaming callback is called, the device waits for the next irq 221e6938cc1SHelen Koike * handler to stop the streaming by waiting on the 'done' wait queue. 222e6938cc1SHelen Koike * If the irq handler is not called, the stream is stopped by the callback 223e6938cc1SHelen Koike * after timeout. 224e6938cc1SHelen Koike * @sp_y_stride: the selfpath allows to configure a y stride that is longer than the image width. 225e6938cc1SHelen Koike * @buf.lock: lock to protect buf.queue 226e6938cc1SHelen Koike * @buf.queue: queued buffer list 227e6938cc1SHelen Koike * @buf.dummy: dummy space to store dropped data 228e6938cc1SHelen Koike * 229e6938cc1SHelen Koike * rkisp1 uses shadow registers, so it needs two buffers at a time 230e6938cc1SHelen Koike * @buf.curr: the buffer used for current frame 231e6938cc1SHelen Koike * @buf.next: the buffer used for next frame 232e6938cc1SHelen Koike * @pix.cfg: pixel configuration 233e6938cc1SHelen Koike * @pix.info: a pointer to the v4l2_format_info of the pixel format 234e6938cc1SHelen Koike * @pix.fmt: buffer format 235e6938cc1SHelen Koike */ 236e6938cc1SHelen Koike struct rkisp1_capture { 237e6938cc1SHelen Koike struct rkisp1_vdev_node vnode; 238e6938cc1SHelen Koike struct rkisp1_device *rkisp1; 239e6938cc1SHelen Koike enum rkisp1_stream_id id; 240a109073bSRikard Falkeborn const struct rkisp1_capture_ops *ops; 241e6938cc1SHelen Koike const struct rkisp1_capture_config *config; 242e6938cc1SHelen Koike bool is_streaming; 243e6938cc1SHelen Koike bool is_stopping; 244e6938cc1SHelen Koike wait_queue_head_t done; 245e6938cc1SHelen Koike unsigned int sp_y_stride; 246e6938cc1SHelen Koike struct { 247e6938cc1SHelen Koike /* protects queue, curr and next */ 248e6938cc1SHelen Koike spinlock_t lock; 249e6938cc1SHelen Koike struct list_head queue; 250e6938cc1SHelen Koike struct rkisp1_dummy_buffer dummy; 251e6938cc1SHelen Koike struct rkisp1_buffer *curr; 252e6938cc1SHelen Koike struct rkisp1_buffer *next; 253e6938cc1SHelen Koike } buf; 254e6938cc1SHelen Koike struct { 255e6938cc1SHelen Koike const struct rkisp1_capture_fmt_cfg *cfg; 256e6938cc1SHelen Koike const struct v4l2_format_info *info; 257e6938cc1SHelen Koike struct v4l2_pix_format_mplane fmt; 258e6938cc1SHelen Koike } pix; 259e6938cc1SHelen Koike }; 260e6938cc1SHelen Koike 261962fb140SHeiko Stuebner struct rkisp1_stats; 262962fb140SHeiko Stuebner struct rkisp1_stats_ops { 263962fb140SHeiko Stuebner void (*get_awb_meas)(struct rkisp1_stats *stats, 264962fb140SHeiko Stuebner struct rkisp1_stat_buffer *pbuf); 265962fb140SHeiko Stuebner void (*get_aec_meas)(struct rkisp1_stats *stats, 266962fb140SHeiko Stuebner struct rkisp1_stat_buffer *pbuf); 267962fb140SHeiko Stuebner void (*get_hst_meas)(struct rkisp1_stats *stats, 268962fb140SHeiko Stuebner struct rkisp1_stat_buffer *pbuf); 269962fb140SHeiko Stuebner }; 270962fb140SHeiko Stuebner 271e6938cc1SHelen Koike /* 272e6938cc1SHelen Koike * struct rkisp1_stats - ISP Statistics device 273e6938cc1SHelen Koike * 274e6938cc1SHelen Koike * @vnode: video node 275e6938cc1SHelen Koike * @rkisp1: pointer to the rkisp1 device 276e6938cc1SHelen Koike * @lock: locks the buffer list 'stat' 277e6938cc1SHelen Koike * @stat: queue of rkisp1_buffer 278e6938cc1SHelen Koike * @vdev_fmt: v4l2_format of the metadata format 279e6938cc1SHelen Koike */ 280e6938cc1SHelen Koike struct rkisp1_stats { 281e6938cc1SHelen Koike struct rkisp1_vdev_node vnode; 282e6938cc1SHelen Koike struct rkisp1_device *rkisp1; 283962fb140SHeiko Stuebner const struct rkisp1_stats_ops *ops; 284e6938cc1SHelen Koike 285e6938cc1SHelen Koike spinlock_t lock; /* locks the buffers list 'stats' */ 286e6938cc1SHelen Koike struct list_head stat; 287e6938cc1SHelen Koike struct v4l2_format vdev_fmt; 288e6938cc1SHelen Koike }; 289e6938cc1SHelen Koike 2905e8d9d72SHeiko Stuebner struct rkisp1_params; 2915e8d9d72SHeiko Stuebner struct rkisp1_params_ops { 2925e8d9d72SHeiko Stuebner void (*lsc_matrix_config)(struct rkisp1_params *params, 2935e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_lsc_config *pconfig); 2945e8d9d72SHeiko Stuebner void (*goc_config)(struct rkisp1_params *params, 2955e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_goc_config *arg); 2965e8d9d72SHeiko Stuebner void (*awb_meas_config)(struct rkisp1_params *params, 2975e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_awb_meas_config *arg); 2985e8d9d72SHeiko Stuebner void (*awb_meas_enable)(struct rkisp1_params *params, 2995e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_awb_meas_config *arg, 3005e8d9d72SHeiko Stuebner bool en); 3015e8d9d72SHeiko Stuebner void (*awb_gain_config)(struct rkisp1_params *params, 3025e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_awb_gain_config *arg); 3035e8d9d72SHeiko Stuebner void (*aec_config)(struct rkisp1_params *params, 3045e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_aec_config *arg); 3055e8d9d72SHeiko Stuebner void (*hst_config)(struct rkisp1_params *params, 3065e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_hst_config *arg); 3075e8d9d72SHeiko Stuebner void (*hst_enable)(struct rkisp1_params *params, 3085e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_hst_config *arg, bool en); 3095e8d9d72SHeiko Stuebner void (*afm_config)(struct rkisp1_params *params, 3105e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_afc_config *arg); 3115e8d9d72SHeiko Stuebner }; 3125e8d9d72SHeiko Stuebner 313e6938cc1SHelen Koike /* 314e6938cc1SHelen Koike * struct rkisp1_params - ISP input parameters device 315e6938cc1SHelen Koike * 316e6938cc1SHelen Koike * @vnode: video node 317e6938cc1SHelen Koike * @rkisp1: pointer to the rkisp1 device 3185e8d9d72SHeiko Stuebner * @ops: pointer to the variant-specific operations 319e6938cc1SHelen Koike * @config_lock: locks the buffer list 'params' 320e6938cc1SHelen Koike * @params: queue of rkisp1_buffer 321e6938cc1SHelen Koike * @vdev_fmt: v4l2_format of the metadata format 322e6938cc1SHelen Koike * @quantization: the quantization configured on the isp's src pad 323e6938cc1SHelen Koike * @raw_type: the bayer pattern on the isp video sink pad 324e6938cc1SHelen Koike */ 325e6938cc1SHelen Koike struct rkisp1_params { 326e6938cc1SHelen Koike struct rkisp1_vdev_node vnode; 327e6938cc1SHelen Koike struct rkisp1_device *rkisp1; 3285e8d9d72SHeiko Stuebner const struct rkisp1_params_ops *ops; 329e6938cc1SHelen Koike 330e6938cc1SHelen Koike spinlock_t config_lock; /* locks the buffers list 'params' */ 331e6938cc1SHelen Koike struct list_head params; 332e6938cc1SHelen Koike struct v4l2_format vdev_fmt; 333e6938cc1SHelen Koike 334e6938cc1SHelen Koike enum v4l2_quantization quantization; 335e6938cc1SHelen Koike enum rkisp1_fmt_raw_pat_type raw_type; 336e6938cc1SHelen Koike }; 337e6938cc1SHelen Koike 338e6938cc1SHelen Koike /* 339e6938cc1SHelen Koike * struct rkisp1_resizer - Resizer subdev 340e6938cc1SHelen Koike * 341e6938cc1SHelen Koike * @sd: v4l2_subdev variable 3423e74a422SLaurent Pinchart * @regs_base: base register address offset 343e6938cc1SHelen Koike * @id: id of the resizer, one of RKISP1_SELFPATH, RKISP1_MAINPATH 344e6938cc1SHelen Koike * @rkisp1: pointer to the rkisp1 device 345e6938cc1SHelen Koike * @pads: media pads 346e6938cc1SHelen Koike * @pad_cfg: configurations for the pads 347e6938cc1SHelen Koike * @config: the set of registers to configure the resizer 348e6938cc1SHelen Koike * @pixel_enc: pixel encoding of the resizer 349e6938cc1SHelen Koike * @ops_lock: a lock for the subdev ops 350e6938cc1SHelen Koike */ 351e6938cc1SHelen Koike struct rkisp1_resizer { 352e6938cc1SHelen Koike struct v4l2_subdev sd; 3533e74a422SLaurent Pinchart u32 regs_base; 354e6938cc1SHelen Koike enum rkisp1_stream_id id; 355e6938cc1SHelen Koike struct rkisp1_device *rkisp1; 356e6938cc1SHelen Koike struct media_pad pads[RKISP1_RSZ_PAD_MAX]; 357e6938cc1SHelen Koike struct v4l2_subdev_pad_config pad_cfg[RKISP1_RSZ_PAD_MAX]; 358e6938cc1SHelen Koike const struct rkisp1_rsz_config *config; 359e6938cc1SHelen Koike enum v4l2_pixel_encoding pixel_enc; 360e6938cc1SHelen Koike struct mutex ops_lock; /* serialize the subdevice ops */ 361e6938cc1SHelen Koike }; 362e6938cc1SHelen Koike 363e6938cc1SHelen Koike /* 364e6938cc1SHelen Koike * struct rkisp1_debug - Values to be exposed on debugfs. 365e6938cc1SHelen Koike * The parameters are counters of the number of times the 366e6938cc1SHelen Koike * event occurred since the driver was loaded. 367e6938cc1SHelen Koike * 368e6938cc1SHelen Koike * @data_loss: loss of data occurred within a line, processing failure 369e6938cc1SHelen Koike * @outform_size_error: size error is generated in outmux submodule 370e6938cc1SHelen Koike * @img_stabilization_size_error: size error is generated in image stabilization submodule 371e6938cc1SHelen Koike * @inform_size_err: size error is generated in inform submodule 372e6938cc1SHelen Koike * @mipi_error: mipi error occurred 373e6938cc1SHelen Koike * @stats_error: writing to the 'Interrupt clear register' did not clear 374e6938cc1SHelen Koike * it in the register 'Masked interrupt status' 375e6938cc1SHelen Koike * @stop_timeout: upon stream stop, the capture waits 1 second for the isr to stop 376e6938cc1SHelen Koike * the stream. This param is incremented in case of timeout. 377e6938cc1SHelen Koike * @frame_drop: a frame was ready but the buffer queue was empty so the frame 378e6938cc1SHelen Koike * was not sent to userspace 379e6938cc1SHelen Koike */ 380e6938cc1SHelen Koike struct rkisp1_debug { 381e6938cc1SHelen Koike struct dentry *debugfs_dir; 382e6938cc1SHelen Koike unsigned long data_loss; 383e6938cc1SHelen Koike unsigned long outform_size_error; 384e6938cc1SHelen Koike unsigned long img_stabilization_size_error; 385e6938cc1SHelen Koike unsigned long inform_size_error; 386e6938cc1SHelen Koike unsigned long irq_delay; 387e6938cc1SHelen Koike unsigned long mipi_error; 388e6938cc1SHelen Koike unsigned long stats_error; 389e6938cc1SHelen Koike unsigned long stop_timeout[2]; 390e6938cc1SHelen Koike unsigned long frame_drop[2]; 391e6938cc1SHelen Koike }; 392e6938cc1SHelen Koike 393e6938cc1SHelen Koike /* 394e6938cc1SHelen Koike * struct rkisp1_device - ISP platform device 395e6938cc1SHelen Koike * 396e6938cc1SHelen Koike * @base_addr: base register address 397e6938cc1SHelen Koike * @irq: the irq number 398e6938cc1SHelen Koike * @dev: a pointer to the struct device 399e6938cc1SHelen Koike * @clk_size: number of clocks 400e6938cc1SHelen Koike * @clks: array of clocks 401e6938cc1SHelen Koike * @v4l2_dev: v4l2_device variable 402e6938cc1SHelen Koike * @media_dev: media_device variable 403e6938cc1SHelen Koike * @notifier: a notifier to register on the v4l2-async API to be notified on the sensor 404e6938cc1SHelen Koike * @active_sensor: sensor in-use, set when streaming on 405e6938cc1SHelen Koike * @isp: ISP sub-device 406e6938cc1SHelen Koike * @resizer_devs: resizer sub-devices 407e6938cc1SHelen Koike * @capture_devs: capture devices 408e6938cc1SHelen Koike * @stats: ISP statistics metadata capture device 409e6938cc1SHelen Koike * @params: ISP parameters metadata output device 410e6938cc1SHelen Koike * @pipe: media pipeline 411e6938cc1SHelen Koike * @stream_lock: serializes {start/stop}_streaming callbacks between the capture devices. 412e6938cc1SHelen Koike * @debug: debug params to be exposed on debugfs 4139125aee7SPaul Elder * @info: version-specific ISP information 414e6938cc1SHelen Koike */ 415e6938cc1SHelen Koike struct rkisp1_device { 416e6938cc1SHelen Koike void __iomem *base_addr; 417e6938cc1SHelen Koike struct device *dev; 418e6938cc1SHelen Koike unsigned int clk_size; 419e6938cc1SHelen Koike struct clk_bulk_data clks[RKISP1_MAX_BUS_CLK]; 420e6938cc1SHelen Koike struct v4l2_device v4l2_dev; 421e6938cc1SHelen Koike struct media_device media_dev; 422e6938cc1SHelen Koike struct v4l2_async_notifier notifier; 423e6938cc1SHelen Koike struct rkisp1_sensor_async *active_sensor; 424e6938cc1SHelen Koike struct rkisp1_isp isp; 425e6938cc1SHelen Koike struct rkisp1_resizer resizer_devs[2]; 426e6938cc1SHelen Koike struct rkisp1_capture capture_devs[2]; 427e6938cc1SHelen Koike struct rkisp1_stats stats; 428e6938cc1SHelen Koike struct rkisp1_params params; 429e6938cc1SHelen Koike struct media_pipeline pipe; 430e6938cc1SHelen Koike struct mutex stream_lock; /* serialize {start/stop}_streaming cb between capture devices */ 431e6938cc1SHelen Koike struct rkisp1_debug debug; 4329125aee7SPaul Elder const struct rkisp1_info *info; 433e6938cc1SHelen Koike }; 434e6938cc1SHelen Koike 435e6938cc1SHelen Koike /* 4360f3c2ab2SPaul Elder * struct rkisp1_mbus_info - ISP media bus info, Translates media bus code to hardware 437e6938cc1SHelen Koike * format values 438e6938cc1SHelen Koike * 439e6938cc1SHelen Koike * @mbus_code: media bus code 440e6938cc1SHelen Koike * @pixel_enc: pixel encoding 441e6938cc1SHelen Koike * @mipi_dt: mipi data type 442e6938cc1SHelen Koike * @yuv_seq: the order of the Y, Cb, Cr values 443e6938cc1SHelen Koike * @bus_width: bus width 444e6938cc1SHelen Koike * @bayer_pat: bayer pattern 445e6938cc1SHelen Koike * @direction: a bitmask of the flags indicating on which pad the format is supported on 446e6938cc1SHelen Koike */ 4470f3c2ab2SPaul Elder struct rkisp1_mbus_info { 448e6938cc1SHelen Koike u32 mbus_code; 449e6938cc1SHelen Koike enum v4l2_pixel_encoding pixel_enc; 450e6938cc1SHelen Koike u32 mipi_dt; 451e6938cc1SHelen Koike u32 yuv_seq; 452e6938cc1SHelen Koike u8 bus_width; 453e6938cc1SHelen Koike enum rkisp1_fmt_raw_pat_type bayer_pat; 454e6938cc1SHelen Koike unsigned int direction; 455e6938cc1SHelen Koike }; 456e6938cc1SHelen Koike 457e6938cc1SHelen Koike static inline void 4580ef7dc30SLaurent Pinchart rkisp1_write(struct rkisp1_device *rkisp1, unsigned int addr, u32 val) 459e6938cc1SHelen Koike { 460e6938cc1SHelen Koike writel(val, rkisp1->base_addr + addr); 461e6938cc1SHelen Koike } 462e6938cc1SHelen Koike 463e6938cc1SHelen Koike static inline u32 rkisp1_read(struct rkisp1_device *rkisp1, unsigned int addr) 464e6938cc1SHelen Koike { 465e6938cc1SHelen Koike return readl(rkisp1->base_addr + addr); 466e6938cc1SHelen Koike } 467e6938cc1SHelen Koike 468e6938cc1SHelen Koike /* 469e6938cc1SHelen Koike * rkisp1_cap_enum_mbus_codes - A helper function that return the i'th supported mbus code 470e6938cc1SHelen Koike * of the capture entity. This is used to enumerate the supported 471e6938cc1SHelen Koike * mbus codes on the source pad of the resizer. 472e6938cc1SHelen Koike * 473e6938cc1SHelen Koike * @cap: the capture entity 474e6938cc1SHelen Koike * @code: the mbus code, the function reads the code->index and fills the code->code 475e6938cc1SHelen Koike */ 476e6938cc1SHelen Koike int rkisp1_cap_enum_mbus_codes(struct rkisp1_capture *cap, 477e6938cc1SHelen Koike struct v4l2_subdev_mbus_code_enum *code); 478e6938cc1SHelen Koike 479e6938cc1SHelen Koike /* 4800f3c2ab2SPaul Elder * rkisp1_mbus_info_get_by_index - Retrieve the ith supported mbus info 4810f3c2ab2SPaul Elder * 4820f3c2ab2SPaul Elder * @index: index of the mbus info to fetch 4830f3c2ab2SPaul Elder */ 4840f3c2ab2SPaul Elder const struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_index(unsigned int index); 4850f3c2ab2SPaul Elder 4860f3c2ab2SPaul Elder /* 487e6938cc1SHelen Koike * rkisp1_sd_adjust_crop_rect - adjust a rectangle to fit into another rectangle. 488e6938cc1SHelen Koike * 489e6938cc1SHelen Koike * @crop: rectangle to adjust. 490e6938cc1SHelen Koike * @bounds: rectangle used as bounds. 491e6938cc1SHelen Koike */ 492e6938cc1SHelen Koike void rkisp1_sd_adjust_crop_rect(struct v4l2_rect *crop, 493e6938cc1SHelen Koike const struct v4l2_rect *bounds); 494e6938cc1SHelen Koike 495e6938cc1SHelen Koike /* 496e6938cc1SHelen Koike * rkisp1_sd_adjust_crop - adjust a rectangle to fit into media bus format 497e6938cc1SHelen Koike * 498e6938cc1SHelen Koike * @crop: rectangle to adjust. 499e6938cc1SHelen Koike * @bounds: media bus format used as bounds. 500e6938cc1SHelen Koike */ 501e6938cc1SHelen Koike void rkisp1_sd_adjust_crop(struct v4l2_rect *crop, 502e6938cc1SHelen Koike const struct v4l2_mbus_framefmt *bounds); 503e6938cc1SHelen Koike 504e6938cc1SHelen Koike /* 5050f3c2ab2SPaul Elder * rkisp1_mbus_info_get_by_code - get the isp info of the media bus code 506e6938cc1SHelen Koike * 507e6938cc1SHelen Koike * @mbus_code: the media bus code 508e6938cc1SHelen Koike */ 5090f3c2ab2SPaul Elder const struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_code(u32 mbus_code); 510e6938cc1SHelen Koike 511e6938cc1SHelen Koike /* rkisp1_params_configure - configure the params when stream starts. 512e6938cc1SHelen Koike * This function is called by the isp entity upon stream starts. 513e6938cc1SHelen Koike * The function applies the initial configuration of the parameters. 514e6938cc1SHelen Koike * 515e6938cc1SHelen Koike * @params: pointer to rkisp1_params. 516e6938cc1SHelen Koike * @bayer_pat: the bayer pattern on the isp video sink pad 517e6938cc1SHelen Koike * @quantization: the quantization configured on the isp's src pad 518e6938cc1SHelen Koike */ 519e6938cc1SHelen Koike void rkisp1_params_configure(struct rkisp1_params *params, 520e6938cc1SHelen Koike enum rkisp1_fmt_raw_pat_type bayer_pat, 521e6938cc1SHelen Koike enum v4l2_quantization quantization); 522e6938cc1SHelen Koike 523e6938cc1SHelen Koike /* rkisp1_params_disable - disable all parameters. 524e6938cc1SHelen Koike * This function is called by the isp entity upon stream start 525e6938cc1SHelen Koike * when capturing bayer format. 526e6938cc1SHelen Koike * 527e6938cc1SHelen Koike * @params: pointer to rkisp1_params. 528e6938cc1SHelen Koike */ 529e6938cc1SHelen Koike void rkisp1_params_disable(struct rkisp1_params *params); 530e6938cc1SHelen Koike 531e6938cc1SHelen Koike /* irq handlers */ 53208818e6aSHeiko Stuebner irqreturn_t rkisp1_isp_isr(int irq, void *ctx); 53308818e6aSHeiko Stuebner irqreturn_t rkisp1_mipi_isr(int irq, void *ctx); 53408818e6aSHeiko Stuebner irqreturn_t rkisp1_capture_isr(int irq, void *ctx); 535e6938cc1SHelen Koike void rkisp1_stats_isr(struct rkisp1_stats *stats, u32 isp_ris); 536e6938cc1SHelen Koike void rkisp1_params_isr(struct rkisp1_device *rkisp1); 537e6938cc1SHelen Koike 538e6938cc1SHelen Koike /* register/unregisters functions of the entities */ 539e6938cc1SHelen Koike int rkisp1_capture_devs_register(struct rkisp1_device *rkisp1); 540e6938cc1SHelen Koike void rkisp1_capture_devs_unregister(struct rkisp1_device *rkisp1); 541e6938cc1SHelen Koike 542e6938cc1SHelen Koike int rkisp1_isp_register(struct rkisp1_device *rkisp1); 543e6938cc1SHelen Koike void rkisp1_isp_unregister(struct rkisp1_device *rkisp1); 544e6938cc1SHelen Koike 545e6938cc1SHelen Koike int rkisp1_resizer_devs_register(struct rkisp1_device *rkisp1); 546e6938cc1SHelen Koike void rkisp1_resizer_devs_unregister(struct rkisp1_device *rkisp1); 547e6938cc1SHelen Koike 548e6938cc1SHelen Koike int rkisp1_stats_register(struct rkisp1_device *rkisp1); 549e6938cc1SHelen Koike void rkisp1_stats_unregister(struct rkisp1_device *rkisp1); 550e6938cc1SHelen Koike 551e6938cc1SHelen Koike int rkisp1_params_register(struct rkisp1_device *rkisp1); 552e6938cc1SHelen Koike void rkisp1_params_unregister(struct rkisp1_device *rkisp1); 553e6938cc1SHelen Koike 554fd3608feSLaurent Pinchart #if IS_ENABLED(CONFIG_DEBUG_FS) 5558682037dSLaurent Pinchart void rkisp1_debug_init(struct rkisp1_device *rkisp1); 5568682037dSLaurent Pinchart void rkisp1_debug_cleanup(struct rkisp1_device *rkisp1); 557fd3608feSLaurent Pinchart #else 558fd3608feSLaurent Pinchart static inline void rkisp1_debug_init(struct rkisp1_device *rkisp1) 559fd3608feSLaurent Pinchart { 560fd3608feSLaurent Pinchart } 561fd3608feSLaurent Pinchart static inline void rkisp1_debug_cleanup(struct rkisp1_device *rkisp1) 562fd3608feSLaurent Pinchart { 563fd3608feSLaurent Pinchart } 564fd3608feSLaurent Pinchart #endif 5658682037dSLaurent Pinchart 566e6938cc1SHelen Koike #endif /* _RKISP1_COMMON_H */ 567