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 71b298f059SPaul Elder /* enum for the csi receiver pads */ 72b298f059SPaul Elder enum rkisp1_csi_pad { 73b298f059SPaul Elder RKISP1_CSI_PAD_SINK, 74b298f059SPaul Elder RKISP1_CSI_PAD_SRC, 75b298f059SPaul Elder RKISP1_CSI_PAD_NUM 76b298f059SPaul Elder }; 77b298f059SPaul Elder 78e6938cc1SHelen Koike /* enum for the capture id */ 79e6938cc1SHelen Koike enum rkisp1_stream_id { 80e6938cc1SHelen Koike RKISP1_MAINPATH, 81e6938cc1SHelen Koike RKISP1_SELFPATH, 82e6938cc1SHelen Koike }; 83e6938cc1SHelen Koike 84e6938cc1SHelen Koike /* bayer patterns */ 85e6938cc1SHelen Koike enum rkisp1_fmt_raw_pat_type { 86e6938cc1SHelen Koike RKISP1_RAW_RGGB = 0, 87e6938cc1SHelen Koike RKISP1_RAW_GRBG, 88e6938cc1SHelen Koike RKISP1_RAW_GBRG, 89e6938cc1SHelen Koike RKISP1_RAW_BGGR, 90e6938cc1SHelen Koike }; 91e6938cc1SHelen Koike 92e6938cc1SHelen Koike /* enum for the isp pads */ 93e6938cc1SHelen Koike enum rkisp1_isp_pad { 94e6938cc1SHelen Koike RKISP1_ISP_PAD_SINK_VIDEO, 95e6938cc1SHelen Koike RKISP1_ISP_PAD_SINK_PARAMS, 96e6938cc1SHelen Koike RKISP1_ISP_PAD_SOURCE_VIDEO, 97e6938cc1SHelen Koike RKISP1_ISP_PAD_SOURCE_STATS, 98e6938cc1SHelen Koike RKISP1_ISP_PAD_MAX 99e6938cc1SHelen Koike }; 100e6938cc1SHelen Koike 101e6938cc1SHelen Koike /* 102f1b8f171SLaurent Pinchart * enum rkisp1_feature - ISP features 103f1b8f171SLaurent Pinchart * 104f1b8f171SLaurent Pinchart * @RKISP1_FEATURE_MIPI_CSI2: The ISP has an internal MIPI CSI-2 receiver 105f1b8f171SLaurent Pinchart * 106f1b8f171SLaurent Pinchart * The ISP features are stored in a bitmask in &rkisp1_info.features and allow 107f1b8f171SLaurent Pinchart * the driver to implement support for features present in some ISP versions 108f1b8f171SLaurent Pinchart * only. 109f1b8f171SLaurent Pinchart */ 110f1b8f171SLaurent Pinchart enum rkisp1_feature { 111f1b8f171SLaurent Pinchart RKISP1_FEATURE_MIPI_CSI2 = BIT(0), 112f1b8f171SLaurent Pinchart }; 113f1b8f171SLaurent Pinchart 114f1b8f171SLaurent Pinchart /* 1159125aee7SPaul Elder * struct rkisp1_info - Model-specific ISP Information 1169125aee7SPaul Elder * 1179125aee7SPaul Elder * @clks: array of ISP clock names 1189125aee7SPaul Elder * @clk_size: number of entries in the @clks array 1199125aee7SPaul Elder * @isrs: array of ISP interrupt descriptors 1209125aee7SPaul Elder * @isr_size: number of entries in the @isrs array 1219125aee7SPaul Elder * @isp_ver: ISP version 122f1b8f171SLaurent Pinchart * @features: bitmask of rkisp1_feature features implemented by the ISP 1239125aee7SPaul Elder * 1249125aee7SPaul Elder * This structure contains information about the ISP specific to a particular 1259125aee7SPaul Elder * ISP model, version, or integration in a particular SoC. 1269125aee7SPaul Elder */ 1279125aee7SPaul Elder struct rkisp1_info { 1289125aee7SPaul Elder const char * const *clks; 1299125aee7SPaul Elder unsigned int clk_size; 1309125aee7SPaul Elder const struct rkisp1_isr_data *isrs; 1319125aee7SPaul Elder unsigned int isr_size; 1329125aee7SPaul Elder enum rkisp1_cif_isp_version isp_ver; 133f1b8f171SLaurent Pinchart unsigned int features; 1349125aee7SPaul Elder }; 1359125aee7SPaul Elder 1369125aee7SPaul Elder /* 137e6938cc1SHelen Koike * struct rkisp1_sensor_async - A container for the v4l2_async_subdev to add to the notifier 138e6938cc1SHelen Koike * of the v4l2-async API 139e6938cc1SHelen Koike * 140e6938cc1SHelen Koike * @asd: async_subdev variable for the sensor 141bc374e17SLaurent Pinchart * @index: index of the sensor (counting sensor found in DT) 142b0b8ab68SLaurent Pinchart * @source_ep: fwnode for the sensor source endpoint 143e6938cc1SHelen Koike * @lanes: number of lanes 144e6938cc1SHelen Koike * @mbus_type: type of bus (currently only CSI2 is supported) 145e6938cc1SHelen Koike * @mbus_flags: media bus (V4L2_MBUS_*) flags 146e6938cc1SHelen Koike * @sd: a pointer to v4l2_subdev struct of the sensor 147e6938cc1SHelen Koike * @pixel_rate_ctrl: pixel rate of the sensor, used to initialize the phy 148f42f4558SPaul Elder * @port: port number (0: MIPI, 1: Parallel) 149e6938cc1SHelen Koike */ 150e6938cc1SHelen Koike struct rkisp1_sensor_async { 151*adb2dcd5SSakari Ailus struct v4l2_async_connection asd; 152bc374e17SLaurent Pinchart unsigned int index; 153b0b8ab68SLaurent Pinchart struct fwnode_handle *source_ep; 154e6938cc1SHelen Koike unsigned int lanes; 155e6938cc1SHelen Koike enum v4l2_mbus_type mbus_type; 156e6938cc1SHelen Koike unsigned int mbus_flags; 157e6938cc1SHelen Koike struct v4l2_subdev *sd; 158e6938cc1SHelen Koike struct v4l2_ctrl *pixel_rate_ctrl; 159f42f4558SPaul Elder unsigned int port; 1608082e2f4SPaul Elder }; 1618082e2f4SPaul Elder 1628082e2f4SPaul Elder /* 1638082e2f4SPaul Elder * struct rkisp1_csi - CSI receiver subdev 1648082e2f4SPaul Elder * 1658082e2f4SPaul Elder * @rkisp1: pointer to the rkisp1 device 1668082e2f4SPaul Elder * @dphy: a pointer to the phy 1678082e2f4SPaul Elder * @is_dphy_errctrl_disabled: if dphy errctrl is disabled (avoid endless interrupt) 168b298f059SPaul Elder * @sd: v4l2_subdev variable 169b298f059SPaul Elder * @pads: media pads 170b298f059SPaul Elder * @pad_cfg: configurations for the pads 171b298f059SPaul Elder * @sink_fmt: input format 172b298f059SPaul Elder * @lock: protects pad_cfg and sink_fmt 173b298f059SPaul Elder * @source: source in-use, set when starting streaming 1748082e2f4SPaul Elder */ 1758082e2f4SPaul Elder struct rkisp1_csi { 1768082e2f4SPaul Elder struct rkisp1_device *rkisp1; 177e6938cc1SHelen Koike struct phy *dphy; 1788082e2f4SPaul Elder bool is_dphy_errctrl_disabled; 179b298f059SPaul Elder struct v4l2_subdev sd; 180b298f059SPaul Elder struct media_pad pads[RKISP1_CSI_PAD_NUM]; 181b298f059SPaul Elder struct v4l2_subdev_pad_config pad_cfg[RKISP1_CSI_PAD_NUM]; 182b298f059SPaul Elder const struct rkisp1_mbus_info *sink_fmt; 183b298f059SPaul Elder struct mutex lock; 184b298f059SPaul Elder struct v4l2_subdev *source; 185e6938cc1SHelen Koike }; 186e6938cc1SHelen Koike 187e6938cc1SHelen Koike /* 188e6938cc1SHelen Koike * struct rkisp1_isp - ISP subdev entity 189e6938cc1SHelen Koike * 190e6938cc1SHelen Koike * @sd: v4l2_subdev variable 191e6938cc1SHelen Koike * @rkisp1: pointer to rkisp1_device 192e6938cc1SHelen Koike * @pads: media pads 193e6938cc1SHelen Koike * @pad_cfg: pads configurations 194e6938cc1SHelen Koike * @sink_fmt: input format 195e6938cc1SHelen Koike * @src_fmt: output format 196e6938cc1SHelen Koike * @ops_lock: ops serialization 197e6938cc1SHelen Koike * @frame_sequence: used to synchronize frame_id between video devices. 198e6938cc1SHelen Koike */ 199e6938cc1SHelen Koike struct rkisp1_isp { 200e6938cc1SHelen Koike struct v4l2_subdev sd; 201fd130bc6SLaurent Pinchart struct rkisp1_device *rkisp1; 202e6938cc1SHelen Koike struct media_pad pads[RKISP1_ISP_PAD_MAX]; 203e6938cc1SHelen Koike struct v4l2_subdev_pad_config pad_cfg[RKISP1_ISP_PAD_MAX]; 2040f3c2ab2SPaul Elder const struct rkisp1_mbus_info *sink_fmt; 2050f3c2ab2SPaul Elder const struct rkisp1_mbus_info *src_fmt; 206e6938cc1SHelen Koike struct mutex ops_lock; /* serialize the subdevice ops */ 207e6938cc1SHelen Koike __u32 frame_sequence; 208e6938cc1SHelen Koike }; 209e6938cc1SHelen Koike 210e6938cc1SHelen Koike /* 211e6938cc1SHelen Koike * struct rkisp1_vdev_node - Container for the video nodes: params, stats, mainpath, selfpath 212e6938cc1SHelen Koike * 213e6938cc1SHelen Koike * @buf_queue: queue of buffers 214e6938cc1SHelen Koike * @vlock: lock of the video node 215e6938cc1SHelen Koike * @vdev: video node 216e6938cc1SHelen Koike * @pad: media pad 217e6938cc1SHelen Koike */ 218e6938cc1SHelen Koike struct rkisp1_vdev_node { 219e6938cc1SHelen Koike struct vb2_queue buf_queue; 220e6938cc1SHelen Koike struct mutex vlock; /* ioctl serialization mutex */ 221e6938cc1SHelen Koike struct video_device vdev; 222e6938cc1SHelen Koike struct media_pad pad; 223e6938cc1SHelen Koike }; 224e6938cc1SHelen Koike 225e6938cc1SHelen Koike /* 226e6938cc1SHelen Koike * struct rkisp1_buffer - A container for the vb2 buffers used by the video devices: 227e6938cc1SHelen Koike * params, stats, mainpath, selfpath 228e6938cc1SHelen Koike * 229e6938cc1SHelen Koike * @vb: vb2 buffer 230e6938cc1SHelen Koike * @queue: entry of the buffer in the queue 231e6938cc1SHelen Koike * @buff_addr: dma addresses of each plane, used only by the capture devices: selfpath, mainpath 232e6938cc1SHelen Koike */ 233e6938cc1SHelen Koike struct rkisp1_buffer { 234e6938cc1SHelen Koike struct vb2_v4l2_buffer vb; 235e6938cc1SHelen Koike struct list_head queue; 236e6938cc1SHelen Koike u32 buff_addr[VIDEO_MAX_PLANES]; 237e6938cc1SHelen Koike }; 238e6938cc1SHelen Koike 239e6938cc1SHelen Koike /* 240e6938cc1SHelen Koike * struct rkisp1_dummy_buffer - A buffer to write the next frame to in case 241e6938cc1SHelen Koike * there are no vb2 buffers available. 242e6938cc1SHelen Koike * 243e6938cc1SHelen Koike * @vaddr: return value of call to dma_alloc_attrs. 244e6938cc1SHelen Koike * @dma_addr: dma address of the buffer. 245e6938cc1SHelen Koike * @size: size of the buffer. 246e6938cc1SHelen Koike */ 247e6938cc1SHelen Koike struct rkisp1_dummy_buffer { 248e6938cc1SHelen Koike void *vaddr; 249e6938cc1SHelen Koike dma_addr_t dma_addr; 250e6938cc1SHelen Koike u32 size; 251e6938cc1SHelen Koike }; 252e6938cc1SHelen Koike 253e6938cc1SHelen Koike struct rkisp1_device; 254e6938cc1SHelen Koike 255e6938cc1SHelen Koike /* 256e6938cc1SHelen Koike * struct rkisp1_capture - ISP capture video device 257e6938cc1SHelen Koike * 258e6938cc1SHelen Koike * @vnode: video node 259e6938cc1SHelen Koike * @rkisp1: pointer to rkisp1_device 260e6938cc1SHelen Koike * @id: id of the capture, one of RKISP1_SELFPATH, RKISP1_MAINPATH 261e6938cc1SHelen Koike * @ops: list of callbacks to configure the capture device. 262e6938cc1SHelen Koike * @config: a pointer to the list of registers to configure the capture format. 263e6938cc1SHelen Koike * @is_streaming: device is streaming 264e6938cc1SHelen Koike * @is_stopping: stop_streaming callback was called and the device is in the process of 265e6938cc1SHelen Koike * stopping the streaming. 266e6938cc1SHelen Koike * @done: when stop_streaming callback is called, the device waits for the next irq 267e6938cc1SHelen Koike * handler to stop the streaming by waiting on the 'done' wait queue. 268e6938cc1SHelen Koike * If the irq handler is not called, the stream is stopped by the callback 269e6938cc1SHelen Koike * after timeout. 270e6938cc1SHelen Koike * @sp_y_stride: the selfpath allows to configure a y stride that is longer than the image width. 271e6938cc1SHelen Koike * @buf.lock: lock to protect buf.queue 272e6938cc1SHelen Koike * @buf.queue: queued buffer list 273e6938cc1SHelen Koike * @buf.dummy: dummy space to store dropped data 274e6938cc1SHelen Koike * 275e6938cc1SHelen Koike * rkisp1 uses shadow registers, so it needs two buffers at a time 276e6938cc1SHelen Koike * @buf.curr: the buffer used for current frame 277e6938cc1SHelen Koike * @buf.next: the buffer used for next frame 278e6938cc1SHelen Koike * @pix.cfg: pixel configuration 279e6938cc1SHelen Koike * @pix.info: a pointer to the v4l2_format_info of the pixel format 280e6938cc1SHelen Koike * @pix.fmt: buffer format 281e6938cc1SHelen Koike */ 282e6938cc1SHelen Koike struct rkisp1_capture { 283e6938cc1SHelen Koike struct rkisp1_vdev_node vnode; 284e6938cc1SHelen Koike struct rkisp1_device *rkisp1; 285e6938cc1SHelen Koike enum rkisp1_stream_id id; 286a109073bSRikard Falkeborn const struct rkisp1_capture_ops *ops; 287e6938cc1SHelen Koike const struct rkisp1_capture_config *config; 288e6938cc1SHelen Koike bool is_streaming; 289e6938cc1SHelen Koike bool is_stopping; 290e6938cc1SHelen Koike wait_queue_head_t done; 291e6938cc1SHelen Koike unsigned int sp_y_stride; 292e6938cc1SHelen Koike struct { 293e6938cc1SHelen Koike /* protects queue, curr and next */ 294e6938cc1SHelen Koike spinlock_t lock; 295e6938cc1SHelen Koike struct list_head queue; 296e6938cc1SHelen Koike struct rkisp1_dummy_buffer dummy; 297e6938cc1SHelen Koike struct rkisp1_buffer *curr; 298e6938cc1SHelen Koike struct rkisp1_buffer *next; 299e6938cc1SHelen Koike } buf; 300e6938cc1SHelen Koike struct { 301e6938cc1SHelen Koike const struct rkisp1_capture_fmt_cfg *cfg; 302e6938cc1SHelen Koike const struct v4l2_format_info *info; 303e6938cc1SHelen Koike struct v4l2_pix_format_mplane fmt; 304e6938cc1SHelen Koike } pix; 305e6938cc1SHelen Koike }; 306e6938cc1SHelen Koike 307962fb140SHeiko Stuebner struct rkisp1_stats; 308962fb140SHeiko Stuebner struct rkisp1_stats_ops { 309962fb140SHeiko Stuebner void (*get_awb_meas)(struct rkisp1_stats *stats, 310962fb140SHeiko Stuebner struct rkisp1_stat_buffer *pbuf); 311962fb140SHeiko Stuebner void (*get_aec_meas)(struct rkisp1_stats *stats, 312962fb140SHeiko Stuebner struct rkisp1_stat_buffer *pbuf); 313962fb140SHeiko Stuebner void (*get_hst_meas)(struct rkisp1_stats *stats, 314962fb140SHeiko Stuebner struct rkisp1_stat_buffer *pbuf); 315962fb140SHeiko Stuebner }; 316962fb140SHeiko Stuebner 317e6938cc1SHelen Koike /* 318e6938cc1SHelen Koike * struct rkisp1_stats - ISP Statistics device 319e6938cc1SHelen Koike * 320e6938cc1SHelen Koike * @vnode: video node 321e6938cc1SHelen Koike * @rkisp1: pointer to the rkisp1 device 322e6938cc1SHelen Koike * @lock: locks the buffer list 'stat' 323e6938cc1SHelen Koike * @stat: queue of rkisp1_buffer 324e6938cc1SHelen Koike * @vdev_fmt: v4l2_format of the metadata format 325e6938cc1SHelen Koike */ 326e6938cc1SHelen Koike struct rkisp1_stats { 327e6938cc1SHelen Koike struct rkisp1_vdev_node vnode; 328e6938cc1SHelen Koike struct rkisp1_device *rkisp1; 329962fb140SHeiko Stuebner const struct rkisp1_stats_ops *ops; 330e6938cc1SHelen Koike 331e6938cc1SHelen Koike spinlock_t lock; /* locks the buffers list 'stats' */ 332e6938cc1SHelen Koike struct list_head stat; 333e6938cc1SHelen Koike struct v4l2_format vdev_fmt; 334e6938cc1SHelen Koike }; 335e6938cc1SHelen Koike 3365e8d9d72SHeiko Stuebner struct rkisp1_params; 3375e8d9d72SHeiko Stuebner struct rkisp1_params_ops { 3385e8d9d72SHeiko Stuebner void (*lsc_matrix_config)(struct rkisp1_params *params, 3395e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_lsc_config *pconfig); 3405e8d9d72SHeiko Stuebner void (*goc_config)(struct rkisp1_params *params, 3415e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_goc_config *arg); 3425e8d9d72SHeiko Stuebner void (*awb_meas_config)(struct rkisp1_params *params, 3435e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_awb_meas_config *arg); 3445e8d9d72SHeiko Stuebner void (*awb_meas_enable)(struct rkisp1_params *params, 3455e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_awb_meas_config *arg, 3465e8d9d72SHeiko Stuebner bool en); 3475e8d9d72SHeiko Stuebner void (*awb_gain_config)(struct rkisp1_params *params, 3485e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_awb_gain_config *arg); 3495e8d9d72SHeiko Stuebner void (*aec_config)(struct rkisp1_params *params, 3505e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_aec_config *arg); 3515e8d9d72SHeiko Stuebner void (*hst_config)(struct rkisp1_params *params, 3525e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_hst_config *arg); 3535e8d9d72SHeiko Stuebner void (*hst_enable)(struct rkisp1_params *params, 3545e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_hst_config *arg, bool en); 3555e8d9d72SHeiko Stuebner void (*afm_config)(struct rkisp1_params *params, 3565e8d9d72SHeiko Stuebner const struct rkisp1_cif_isp_afc_config *arg); 3575e8d9d72SHeiko Stuebner }; 3585e8d9d72SHeiko Stuebner 359e6938cc1SHelen Koike /* 360e6938cc1SHelen Koike * struct rkisp1_params - ISP input parameters device 361e6938cc1SHelen Koike * 362e6938cc1SHelen Koike * @vnode: video node 363e6938cc1SHelen Koike * @rkisp1: pointer to the rkisp1 device 3645e8d9d72SHeiko Stuebner * @ops: pointer to the variant-specific operations 365e6938cc1SHelen Koike * @config_lock: locks the buffer list 'params' 366e6938cc1SHelen Koike * @params: queue of rkisp1_buffer 367e6938cc1SHelen Koike * @vdev_fmt: v4l2_format of the metadata format 368e6938cc1SHelen Koike * @quantization: the quantization configured on the isp's src pad 369e6938cc1SHelen Koike * @raw_type: the bayer pattern on the isp video sink pad 370e6938cc1SHelen Koike */ 371e6938cc1SHelen Koike struct rkisp1_params { 372e6938cc1SHelen Koike struct rkisp1_vdev_node vnode; 373e6938cc1SHelen Koike struct rkisp1_device *rkisp1; 3745e8d9d72SHeiko Stuebner const struct rkisp1_params_ops *ops; 375e6938cc1SHelen Koike 376e6938cc1SHelen Koike spinlock_t config_lock; /* locks the buffers list 'params' */ 377e6938cc1SHelen Koike struct list_head params; 378e6938cc1SHelen Koike struct v4l2_format vdev_fmt; 379e6938cc1SHelen Koike 380e6938cc1SHelen Koike enum v4l2_quantization quantization; 381f7aa2d23SLaurent Pinchart enum v4l2_ycbcr_encoding ycbcr_encoding; 382e6938cc1SHelen Koike enum rkisp1_fmt_raw_pat_type raw_type; 383e6938cc1SHelen Koike }; 384e6938cc1SHelen Koike 385e6938cc1SHelen Koike /* 386e6938cc1SHelen Koike * struct rkisp1_resizer - Resizer subdev 387e6938cc1SHelen Koike * 388e6938cc1SHelen Koike * @sd: v4l2_subdev variable 3893e74a422SLaurent Pinchart * @regs_base: base register address offset 390e6938cc1SHelen Koike * @id: id of the resizer, one of RKISP1_SELFPATH, RKISP1_MAINPATH 391e6938cc1SHelen Koike * @rkisp1: pointer to the rkisp1 device 392e6938cc1SHelen Koike * @pads: media pads 393e6938cc1SHelen Koike * @pad_cfg: configurations for the pads 394e6938cc1SHelen Koike * @config: the set of registers to configure the resizer 395e6938cc1SHelen Koike * @pixel_enc: pixel encoding of the resizer 396e6938cc1SHelen Koike * @ops_lock: a lock for the subdev ops 397e6938cc1SHelen Koike */ 398e6938cc1SHelen Koike struct rkisp1_resizer { 399e6938cc1SHelen Koike struct v4l2_subdev sd; 4003e74a422SLaurent Pinchart u32 regs_base; 401e6938cc1SHelen Koike enum rkisp1_stream_id id; 402e6938cc1SHelen Koike struct rkisp1_device *rkisp1; 403e6938cc1SHelen Koike struct media_pad pads[RKISP1_RSZ_PAD_MAX]; 404e6938cc1SHelen Koike struct v4l2_subdev_pad_config pad_cfg[RKISP1_RSZ_PAD_MAX]; 405e6938cc1SHelen Koike const struct rkisp1_rsz_config *config; 406e6938cc1SHelen Koike enum v4l2_pixel_encoding pixel_enc; 407e6938cc1SHelen Koike struct mutex ops_lock; /* serialize the subdevice ops */ 408e6938cc1SHelen Koike }; 409e6938cc1SHelen Koike 410e6938cc1SHelen Koike /* 411e6938cc1SHelen Koike * struct rkisp1_debug - Values to be exposed on debugfs. 412e6938cc1SHelen Koike * The parameters are counters of the number of times the 413e6938cc1SHelen Koike * event occurred since the driver was loaded. 414e6938cc1SHelen Koike * 415e6938cc1SHelen Koike * @data_loss: loss of data occurred within a line, processing failure 416e6938cc1SHelen Koike * @outform_size_error: size error is generated in outmux submodule 417e6938cc1SHelen Koike * @img_stabilization_size_error: size error is generated in image stabilization submodule 418e6938cc1SHelen Koike * @inform_size_err: size error is generated in inform submodule 419e6938cc1SHelen Koike * @mipi_error: mipi error occurred 420e6938cc1SHelen Koike * @stats_error: writing to the 'Interrupt clear register' did not clear 421e6938cc1SHelen Koike * it in the register 'Masked interrupt status' 422e6938cc1SHelen Koike * @stop_timeout: upon stream stop, the capture waits 1 second for the isr to stop 423e6938cc1SHelen Koike * the stream. This param is incremented in case of timeout. 424e6938cc1SHelen Koike * @frame_drop: a frame was ready but the buffer queue was empty so the frame 425e6938cc1SHelen Koike * was not sent to userspace 426e6938cc1SHelen Koike */ 427e6938cc1SHelen Koike struct rkisp1_debug { 428e6938cc1SHelen Koike struct dentry *debugfs_dir; 429e6938cc1SHelen Koike unsigned long data_loss; 430e6938cc1SHelen Koike unsigned long outform_size_error; 431e6938cc1SHelen Koike unsigned long img_stabilization_size_error; 432e6938cc1SHelen Koike unsigned long inform_size_error; 433e6938cc1SHelen Koike unsigned long irq_delay; 434e6938cc1SHelen Koike unsigned long mipi_error; 435e6938cc1SHelen Koike unsigned long stats_error; 436e6938cc1SHelen Koike unsigned long stop_timeout[2]; 437e6938cc1SHelen Koike unsigned long frame_drop[2]; 438e6938cc1SHelen Koike }; 439e6938cc1SHelen Koike 440e6938cc1SHelen Koike /* 441e6938cc1SHelen Koike * struct rkisp1_device - ISP platform device 442e6938cc1SHelen Koike * 443e6938cc1SHelen Koike * @base_addr: base register address 444e6938cc1SHelen Koike * @irq: the irq number 445e6938cc1SHelen Koike * @dev: a pointer to the struct device 446e6938cc1SHelen Koike * @clk_size: number of clocks 447e6938cc1SHelen Koike * @clks: array of clocks 448e6938cc1SHelen Koike * @v4l2_dev: v4l2_device variable 449e6938cc1SHelen Koike * @media_dev: media_device variable 450e6938cc1SHelen Koike * @notifier: a notifier to register on the v4l2-async API to be notified on the sensor 451745ba74aSLaurent Pinchart * @source: source subdev in-use, set when starting streaming 4528082e2f4SPaul Elder * @csi: internal CSI-2 receiver 453e6938cc1SHelen Koike * @isp: ISP sub-device 454e6938cc1SHelen Koike * @resizer_devs: resizer sub-devices 455e6938cc1SHelen Koike * @capture_devs: capture devices 456e6938cc1SHelen Koike * @stats: ISP statistics metadata capture device 457e6938cc1SHelen Koike * @params: ISP parameters metadata output device 458e6938cc1SHelen Koike * @pipe: media pipeline 459e6938cc1SHelen Koike * @stream_lock: serializes {start/stop}_streaming callbacks between the capture devices. 460e6938cc1SHelen Koike * @debug: debug params to be exposed on debugfs 4619125aee7SPaul Elder * @info: version-specific ISP information 462e6938cc1SHelen Koike */ 463e6938cc1SHelen Koike struct rkisp1_device { 464e6938cc1SHelen Koike void __iomem *base_addr; 465e6938cc1SHelen Koike struct device *dev; 466e6938cc1SHelen Koike unsigned int clk_size; 467e6938cc1SHelen Koike struct clk_bulk_data clks[RKISP1_MAX_BUS_CLK]; 468e6938cc1SHelen Koike struct v4l2_device v4l2_dev; 469e6938cc1SHelen Koike struct media_device media_dev; 470e6938cc1SHelen Koike struct v4l2_async_notifier notifier; 471745ba74aSLaurent Pinchart struct v4l2_subdev *source; 4728082e2f4SPaul Elder struct rkisp1_csi csi; 473e6938cc1SHelen Koike struct rkisp1_isp isp; 474e6938cc1SHelen Koike struct rkisp1_resizer resizer_devs[2]; 475e6938cc1SHelen Koike struct rkisp1_capture capture_devs[2]; 476e6938cc1SHelen Koike struct rkisp1_stats stats; 477e6938cc1SHelen Koike struct rkisp1_params params; 478e6938cc1SHelen Koike struct media_pipeline pipe; 479e6938cc1SHelen Koike struct mutex stream_lock; /* serialize {start/stop}_streaming cb between capture devices */ 480e6938cc1SHelen Koike struct rkisp1_debug debug; 4819125aee7SPaul Elder const struct rkisp1_info *info; 482e6938cc1SHelen Koike }; 483e6938cc1SHelen Koike 484e6938cc1SHelen Koike /* 4850f3c2ab2SPaul Elder * struct rkisp1_mbus_info - ISP media bus info, Translates media bus code to hardware 486e6938cc1SHelen Koike * format values 487e6938cc1SHelen Koike * 488e6938cc1SHelen Koike * @mbus_code: media bus code 489e6938cc1SHelen Koike * @pixel_enc: pixel encoding 490e6938cc1SHelen Koike * @mipi_dt: mipi data type 491e6938cc1SHelen Koike * @yuv_seq: the order of the Y, Cb, Cr values 492e6938cc1SHelen Koike * @bus_width: bus width 493e6938cc1SHelen Koike * @bayer_pat: bayer pattern 494e6938cc1SHelen Koike * @direction: a bitmask of the flags indicating on which pad the format is supported on 495e6938cc1SHelen Koike */ 4960f3c2ab2SPaul Elder struct rkisp1_mbus_info { 497e6938cc1SHelen Koike u32 mbus_code; 498e6938cc1SHelen Koike enum v4l2_pixel_encoding pixel_enc; 499e6938cc1SHelen Koike u32 mipi_dt; 500e6938cc1SHelen Koike u32 yuv_seq; 501e6938cc1SHelen Koike u8 bus_width; 502e6938cc1SHelen Koike enum rkisp1_fmt_raw_pat_type bayer_pat; 503e6938cc1SHelen Koike unsigned int direction; 504e6938cc1SHelen Koike }; 505e6938cc1SHelen Koike 506e6938cc1SHelen Koike static inline void 5070ef7dc30SLaurent Pinchart rkisp1_write(struct rkisp1_device *rkisp1, unsigned int addr, u32 val) 508e6938cc1SHelen Koike { 509e6938cc1SHelen Koike writel(val, rkisp1->base_addr + addr); 510e6938cc1SHelen Koike } 511e6938cc1SHelen Koike 512e6938cc1SHelen Koike static inline u32 rkisp1_read(struct rkisp1_device *rkisp1, unsigned int addr) 513e6938cc1SHelen Koike { 514e6938cc1SHelen Koike return readl(rkisp1->base_addr + addr); 515e6938cc1SHelen Koike } 516e6938cc1SHelen Koike 517e6938cc1SHelen Koike /* 518e6938cc1SHelen Koike * rkisp1_cap_enum_mbus_codes - A helper function that return the i'th supported mbus code 519e6938cc1SHelen Koike * of the capture entity. This is used to enumerate the supported 520e6938cc1SHelen Koike * mbus codes on the source pad of the resizer. 521e6938cc1SHelen Koike * 522e6938cc1SHelen Koike * @cap: the capture entity 523e6938cc1SHelen Koike * @code: the mbus code, the function reads the code->index and fills the code->code 524e6938cc1SHelen Koike */ 525e6938cc1SHelen Koike int rkisp1_cap_enum_mbus_codes(struct rkisp1_capture *cap, 526e6938cc1SHelen Koike struct v4l2_subdev_mbus_code_enum *code); 527e6938cc1SHelen Koike 528e6938cc1SHelen Koike /* 5290f3c2ab2SPaul Elder * rkisp1_mbus_info_get_by_index - Retrieve the ith supported mbus info 5300f3c2ab2SPaul Elder * 5310f3c2ab2SPaul Elder * @index: index of the mbus info to fetch 5320f3c2ab2SPaul Elder */ 5330f3c2ab2SPaul Elder const struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_index(unsigned int index); 5340f3c2ab2SPaul Elder 5350f3c2ab2SPaul Elder /* 536e6938cc1SHelen Koike * rkisp1_sd_adjust_crop_rect - adjust a rectangle to fit into another rectangle. 537e6938cc1SHelen Koike * 538e6938cc1SHelen Koike * @crop: rectangle to adjust. 539e6938cc1SHelen Koike * @bounds: rectangle used as bounds. 540e6938cc1SHelen Koike */ 541e6938cc1SHelen Koike void rkisp1_sd_adjust_crop_rect(struct v4l2_rect *crop, 542e6938cc1SHelen Koike const struct v4l2_rect *bounds); 543e6938cc1SHelen Koike 544e6938cc1SHelen Koike /* 545e6938cc1SHelen Koike * rkisp1_sd_adjust_crop - adjust a rectangle to fit into media bus format 546e6938cc1SHelen Koike * 547e6938cc1SHelen Koike * @crop: rectangle to adjust. 548e6938cc1SHelen Koike * @bounds: media bus format used as bounds. 549e6938cc1SHelen Koike */ 550e6938cc1SHelen Koike void rkisp1_sd_adjust_crop(struct v4l2_rect *crop, 551e6938cc1SHelen Koike const struct v4l2_mbus_framefmt *bounds); 552e6938cc1SHelen Koike 553e6938cc1SHelen Koike /* 5540f3c2ab2SPaul Elder * rkisp1_mbus_info_get_by_code - get the isp info of the media bus code 555e6938cc1SHelen Koike * 556e6938cc1SHelen Koike * @mbus_code: the media bus code 557e6938cc1SHelen Koike */ 5580f3c2ab2SPaul Elder const struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_code(u32 mbus_code); 559e6938cc1SHelen Koike 5604b07e2b8SLaurent Pinchart /* 5614b07e2b8SLaurent Pinchart * rkisp1_params_pre_configure - Configure the params before stream start 562e6938cc1SHelen Koike * 5634b07e2b8SLaurent Pinchart * @params: pointer to rkisp1_params 564e6938cc1SHelen Koike * @bayer_pat: the bayer pattern on the isp video sink pad 565e6938cc1SHelen Koike * @quantization: the quantization configured on the isp's src pad 566f7aa2d23SLaurent Pinchart * @ycbcr_encoding: the ycbcr_encoding configured on the isp's src pad 5674b07e2b8SLaurent Pinchart * 5684b07e2b8SLaurent Pinchart * This function is called by the ISP entity just before the ISP gets started. 5694b07e2b8SLaurent Pinchart * It applies the initial ISP parameters from the first params buffer, but 5704b07e2b8SLaurent Pinchart * skips LSC as it needs to be configured after the ISP is started. 571e6938cc1SHelen Koike */ 5724b07e2b8SLaurent Pinchart void rkisp1_params_pre_configure(struct rkisp1_params *params, 573e6938cc1SHelen Koike enum rkisp1_fmt_raw_pat_type bayer_pat, 574f7aa2d23SLaurent Pinchart enum v4l2_quantization quantization, 575f7aa2d23SLaurent Pinchart enum v4l2_ycbcr_encoding ycbcr_encoding); 576e6938cc1SHelen Koike 5774b07e2b8SLaurent Pinchart /* 5784b07e2b8SLaurent Pinchart * rkisp1_params_post_configure - Configure the params after stream start 5794b07e2b8SLaurent Pinchart * 5804b07e2b8SLaurent Pinchart * @params: pointer to rkisp1_params 5814b07e2b8SLaurent Pinchart * 5824b07e2b8SLaurent Pinchart * This function is called by the ISP entity just after the ISP gets started. 5834b07e2b8SLaurent Pinchart * It applies the initial ISP LSC parameters from the first params buffer. 5844b07e2b8SLaurent Pinchart */ 5854b07e2b8SLaurent Pinchart void rkisp1_params_post_configure(struct rkisp1_params *params); 5864b07e2b8SLaurent Pinchart 587e6938cc1SHelen Koike /* rkisp1_params_disable - disable all parameters. 588e6938cc1SHelen Koike * This function is called by the isp entity upon stream start 589e6938cc1SHelen Koike * when capturing bayer format. 590e6938cc1SHelen Koike * 591e6938cc1SHelen Koike * @params: pointer to rkisp1_params. 592e6938cc1SHelen Koike */ 593e6938cc1SHelen Koike void rkisp1_params_disable(struct rkisp1_params *params); 594e6938cc1SHelen Koike 595e6938cc1SHelen Koike /* irq handlers */ 59608818e6aSHeiko Stuebner irqreturn_t rkisp1_isp_isr(int irq, void *ctx); 5970c0b9f9cSLaurent Pinchart irqreturn_t rkisp1_csi_isr(int irq, void *ctx); 59808818e6aSHeiko Stuebner irqreturn_t rkisp1_capture_isr(int irq, void *ctx); 599e6938cc1SHelen Koike void rkisp1_stats_isr(struct rkisp1_stats *stats, u32 isp_ris); 600e6938cc1SHelen Koike void rkisp1_params_isr(struct rkisp1_device *rkisp1); 601e6938cc1SHelen Koike 602e6938cc1SHelen Koike /* register/unregisters functions of the entities */ 603e6938cc1SHelen Koike int rkisp1_capture_devs_register(struct rkisp1_device *rkisp1); 604e6938cc1SHelen Koike void rkisp1_capture_devs_unregister(struct rkisp1_device *rkisp1); 605e6938cc1SHelen Koike 606e6938cc1SHelen Koike int rkisp1_isp_register(struct rkisp1_device *rkisp1); 607e6938cc1SHelen Koike void rkisp1_isp_unregister(struct rkisp1_device *rkisp1); 608e6938cc1SHelen Koike 609e6938cc1SHelen Koike int rkisp1_resizer_devs_register(struct rkisp1_device *rkisp1); 610e6938cc1SHelen Koike void rkisp1_resizer_devs_unregister(struct rkisp1_device *rkisp1); 611e6938cc1SHelen Koike 612e6938cc1SHelen Koike int rkisp1_stats_register(struct rkisp1_device *rkisp1); 613e6938cc1SHelen Koike void rkisp1_stats_unregister(struct rkisp1_device *rkisp1); 614e6938cc1SHelen Koike 615e6938cc1SHelen Koike int rkisp1_params_register(struct rkisp1_device *rkisp1); 616e6938cc1SHelen Koike void rkisp1_params_unregister(struct rkisp1_device *rkisp1); 617e6938cc1SHelen Koike 618fd3608feSLaurent Pinchart #if IS_ENABLED(CONFIG_DEBUG_FS) 6198682037dSLaurent Pinchart void rkisp1_debug_init(struct rkisp1_device *rkisp1); 6208682037dSLaurent Pinchart void rkisp1_debug_cleanup(struct rkisp1_device *rkisp1); 621fd3608feSLaurent Pinchart #else 622fd3608feSLaurent Pinchart static inline void rkisp1_debug_init(struct rkisp1_device *rkisp1) 623fd3608feSLaurent Pinchart { 624fd3608feSLaurent Pinchart } 625fd3608feSLaurent Pinchart static inline void rkisp1_debug_cleanup(struct rkisp1_device *rkisp1) 626fd3608feSLaurent Pinchart { 627fd3608feSLaurent Pinchart } 628fd3608feSLaurent Pinchart #endif 6298682037dSLaurent Pinchart 630e6938cc1SHelen Koike #endif /* _RKISP1_COMMON_H */ 631