linux/drivers/staging/media/rkisp1/rkisp1-common.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
   2/*
   3 * Rockchip ISP1 Driver - Common definitions
   4 *
   5 * Copyright (C) 2019 Collabora, Ltd.
   6 *
   7 * Based on Rockchip ISP1 driver by Rockchip Electronics Co., Ltd.
   8 * Copyright (C) 2017 Rockchip Electronics Co., Ltd.
   9 */
  10
  11#ifndef _RKISP1_COMMON_H
  12#define _RKISP1_COMMON_H
  13
  14#include <linux/clk.h>
  15#include <linux/mutex.h>
  16#include <media/media-device.h>
  17#include <media/media-entity.h>
  18#include <media/v4l2-ctrls.h>
  19#include <media/v4l2-device.h>
  20#include <media/videobuf2-v4l2.h>
  21
  22#include "rkisp1-regs.h"
  23#include "uapi/rkisp1-config.h"
  24
  25#define RKISP1_ISP_SD_SRC BIT(0)
  26#define RKISP1_ISP_SD_SINK BIT(1)
  27
  28#define RKISP1_ISP_MAX_WIDTH            4032
  29#define RKISP1_ISP_MAX_HEIGHT           3024
  30#define RKISP1_ISP_MIN_WIDTH            32
  31#define RKISP1_ISP_MIN_HEIGHT           32
  32
  33#define RKISP1_RSZ_MP_SRC_MAX_WIDTH             4416
  34#define RKISP1_RSZ_MP_SRC_MAX_HEIGHT            3312
  35#define RKISP1_RSZ_SP_SRC_MAX_WIDTH             1920
  36#define RKISP1_RSZ_SP_SRC_MAX_HEIGHT            1920
  37#define RKISP1_RSZ_SRC_MIN_WIDTH                32
  38#define RKISP1_RSZ_SRC_MIN_HEIGHT               16
  39
  40#define RKISP1_DEFAULT_WIDTH            800
  41#define RKISP1_DEFAULT_HEIGHT           600
  42
  43#define RKISP1_DRIVER_NAME      "rkisp1"
  44#define RKISP1_BUS_INFO         "platform:" RKISP1_DRIVER_NAME
  45
  46#define RKISP1_MAX_BUS_CLK      8
  47
  48#define RKISP1_STATS_MEAS_MASK          (RKISP1_CIF_ISP_AWB_DONE |      \
  49                                         RKISP1_CIF_ISP_AFM_FIN |       \
  50                                         RKISP1_CIF_ISP_EXP_END |       \
  51                                         RKISP1_CIF_ISP_HIST_MEASURE_RDY)
  52enum rkisp1_rsz_pad {
  53        RKISP1_RSZ_PAD_SINK,
  54        RKISP1_RSZ_PAD_SRC,
  55        RKISP1_RSZ_PAD_MAX
  56};
  57
  58enum rkisp1_stream_id {
  59        RKISP1_MAINPATH,
  60        RKISP1_SELFPATH,
  61};
  62
  63enum rkisp1_fmt_raw_pat_type {
  64        RKISP1_RAW_RGGB = 0,
  65        RKISP1_RAW_GRBG,
  66        RKISP1_RAW_GBRG,
  67        RKISP1_RAW_BGGR,
  68};
  69
  70enum rkisp1_isp_pad {
  71        RKISP1_ISP_PAD_SINK_VIDEO,
  72        RKISP1_ISP_PAD_SINK_PARAMS,
  73        RKISP1_ISP_PAD_SOURCE_VIDEO,
  74        RKISP1_ISP_PAD_SOURCE_STATS,
  75        RKISP1_ISP_PAD_MAX
  76};
  77
  78/*
  79 * struct rkisp1_sensor_async - Sensor information
  80 * @mbus: media bus configuration
  81 */
  82struct rkisp1_sensor_async {
  83        struct v4l2_async_subdev asd;
  84        unsigned int lanes;
  85        enum v4l2_mbus_type mbus_type;
  86        unsigned int mbus_flags;
  87        struct v4l2_subdev *sd;
  88        struct v4l2_ctrl *pixel_rate_ctrl;
  89        struct phy *dphy;
  90};
  91
  92/*
  93 * struct rkisp1_isp - ISP sub-device
  94 *
  95 * See Cropping regions of ISP in rkisp1.c for details
  96 * @sink_frm: input size, don't have to be equal to sensor size
  97 * @sink_fmt: input format
  98 * @sink_crop: crop for sink pad
  99 * @src_fmt: output format
 100 * @src_crop: output size
 101 * @ops_lock: ops serialization
 102 *
 103 * @is_dphy_errctrl_disabled : if dphy errctrl is disabled (avoid endless interrupt)
 104 * @frame_sequence: used to synchronize frame_id between video devices.
 105 * @quantization: output quantization
 106 */
 107struct rkisp1_isp {
 108        struct v4l2_subdev sd;
 109        struct media_pad pads[RKISP1_ISP_PAD_MAX];
 110        struct v4l2_subdev_pad_config pad_cfg[RKISP1_ISP_PAD_MAX];
 111        const struct rkisp1_isp_mbus_info *sink_fmt;
 112        const struct rkisp1_isp_mbus_info *src_fmt;
 113        struct mutex ops_lock;
 114        bool is_dphy_errctrl_disabled;
 115        atomic_t frame_sequence;
 116};
 117
 118struct rkisp1_vdev_node {
 119        struct vb2_queue buf_queue;
 120        struct mutex vlock; /* ioctl serialization mutex */
 121        struct video_device vdev;
 122        struct media_pad pad;
 123};
 124
 125struct rkisp1_buffer {
 126        struct vb2_v4l2_buffer vb;
 127        struct list_head queue;
 128        union {
 129                u32 buff_addr[VIDEO_MAX_PLANES];
 130                void *vaddr[VIDEO_MAX_PLANES];
 131        };
 132};
 133
 134struct rkisp1_dummy_buffer {
 135        void *vaddr;
 136        dma_addr_t dma_addr;
 137        u32 size;
 138};
 139
 140struct rkisp1_device;
 141
 142/*
 143 * struct rkisp1_capture - ISP capture video device
 144 *
 145 * @pix.fmt: buffer format
 146 * @pix.info: pixel information
 147 * @pix.cfg: pixel configuration
 148 *
 149 * @buf.lock: lock to protect buf_queue
 150 * @buf.queue: queued buffer list
 151 * @buf.dummy: dummy space to store dropped data
 152 *
 153 * rkisp1 use shadowsock registers, so it need two buffer at a time
 154 * @buf.curr: the buffer used for current frame
 155 * @buf.next: the buffer used for next frame
 156 */
 157struct rkisp1_capture {
 158        struct rkisp1_vdev_node vnode;
 159        struct rkisp1_device *rkisp1;
 160        enum rkisp1_stream_id id;
 161        struct rkisp1_capture_ops *ops;
 162        const struct rkisp1_capture_config *config;
 163        bool is_streaming;
 164        bool is_stopping;
 165        wait_queue_head_t done;
 166        unsigned int sp_y_stride;
 167        struct {
 168                /* protects queue, curr and next */
 169                spinlock_t lock;
 170                struct list_head queue;
 171                struct rkisp1_dummy_buffer dummy;
 172                struct rkisp1_buffer *curr;
 173                struct rkisp1_buffer *next;
 174        } buf;
 175        struct {
 176                const struct rkisp1_capture_fmt_cfg *cfg;
 177                const struct v4l2_format_info *info;
 178                struct v4l2_pix_format_mplane fmt;
 179        } pix;
 180};
 181
 182/*
 183 * struct rkisp1_stats - ISP Statistics device
 184 *
 185 * @lock: locks the buffer list 'stat' and 'is_streaming'
 186 * @stat: stats buffer list
 187 */
 188struct rkisp1_stats {
 189        struct rkisp1_vdev_node vnode;
 190        struct rkisp1_device *rkisp1;
 191
 192        spinlock_t lock; /* locks 'is_streaming', and 'stats' */
 193        struct list_head stat;
 194        struct v4l2_format vdev_fmt;
 195        bool is_streaming;
 196};
 197
 198/*
 199 * struct rkisp1_params - ISP input parameters device
 200 *
 201 * @cur_params: Current ISP parameters
 202 * @is_first_params: the first params should take effect immediately
 203 */
 204struct rkisp1_params {
 205        struct rkisp1_vdev_node vnode;
 206        struct rkisp1_device *rkisp1;
 207
 208        spinlock_t config_lock;
 209        struct list_head params;
 210        struct rkisp1_params_cfg cur_params;
 211        struct v4l2_format vdev_fmt;
 212        bool is_streaming;
 213        bool is_first_params;
 214
 215        enum v4l2_quantization quantization;
 216        enum rkisp1_fmt_raw_pat_type raw_type;
 217};
 218
 219struct rkisp1_resizer {
 220        struct v4l2_subdev sd;
 221        enum rkisp1_stream_id id;
 222        struct rkisp1_device *rkisp1;
 223        struct media_pad pads[RKISP1_RSZ_PAD_MAX];
 224        struct v4l2_subdev_pad_config pad_cfg[RKISP1_RSZ_PAD_MAX];
 225        const struct rkisp1_rsz_config *config;
 226        enum v4l2_pixel_encoding pixel_enc;
 227        struct mutex ops_lock;
 228};
 229
 230struct rkisp1_debug {
 231        struct dentry *debugfs_dir;
 232        unsigned long data_loss;
 233        unsigned long outform_size_error;
 234        unsigned long img_stabilization_size_error;
 235        unsigned long inform_size_error;
 236        unsigned long mipi_error;
 237        unsigned long stats_error;
 238        unsigned long stop_timeout[2];
 239        unsigned long frame_drop[2];
 240};
 241
 242/*
 243 * struct rkisp1_device - ISP platform device
 244 * @base_addr: base register address
 245 * @active_sensor: sensor in-use, set when streaming on
 246 * @isp: ISP sub-device
 247 * @rkisp1_capture: capture video device
 248 * @stats: ISP statistics output device
 249 * @params: ISP input parameters device
 250 * @stream_lock: lock to serialize start/stop streaming in capture devices.
 251 */
 252struct rkisp1_device {
 253        void __iomem *base_addr;
 254        int irq;
 255        struct device *dev;
 256        unsigned int clk_size;
 257        struct clk_bulk_data clks[RKISP1_MAX_BUS_CLK];
 258        struct v4l2_device v4l2_dev;
 259        struct media_device media_dev;
 260        struct v4l2_async_notifier notifier;
 261        struct rkisp1_sensor_async *active_sensor;
 262        struct rkisp1_isp isp;
 263        struct rkisp1_resizer resizer_devs[2];
 264        struct rkisp1_capture capture_devs[2];
 265        struct rkisp1_stats stats;
 266        struct rkisp1_params params;
 267        struct media_pipeline pipe;
 268        struct mutex stream_lock;
 269        struct rkisp1_debug debug;
 270};
 271
 272/*
 273 * struct rkisp1_isp_mbus_info - ISP pad format info
 274 *
 275 * Translate mbus_code to hardware format values
 276 *
 277 * @bus_width: used for parallel
 278 */
 279struct rkisp1_isp_mbus_info {
 280        u32 mbus_code;
 281        enum v4l2_pixel_encoding pixel_enc;
 282        u32 mipi_dt;
 283        u32 yuv_seq;
 284        u8 bus_width;
 285        enum rkisp1_fmt_raw_pat_type bayer_pat;
 286        unsigned int direction;
 287};
 288
 289static inline void
 290rkisp1_write(struct rkisp1_device *rkisp1, u32 val, unsigned int addr)
 291{
 292        writel(val, rkisp1->base_addr + addr);
 293}
 294
 295static inline u32 rkisp1_read(struct rkisp1_device *rkisp1, unsigned int addr)
 296{
 297        return readl(rkisp1->base_addr + addr);
 298}
 299
 300void rkisp1_sd_adjust_crop_rect(struct v4l2_rect *crop,
 301                                const struct v4l2_rect *bounds);
 302
 303void rkisp1_sd_adjust_crop(struct v4l2_rect *crop,
 304                           const struct v4l2_mbus_framefmt *bounds);
 305
 306int rkisp1_isp_register(struct rkisp1_device *rkisp1,
 307                        struct v4l2_device *v4l2_dev);
 308void rkisp1_isp_unregister(struct rkisp1_device *rkisp1);
 309
 310const struct rkisp1_isp_mbus_info *rkisp1_isp_mbus_info_get(u32 mbus_code);
 311
 312void rkisp1_isp_isr(struct rkisp1_device *rkisp1);
 313void rkisp1_mipi_isr(struct rkisp1_device *rkisp1);
 314void rkisp1_capture_isr(struct rkisp1_device *rkisp1);
 315void rkisp1_stats_isr(struct rkisp1_stats *stats, u32 isp_ris);
 316void rkisp1_params_isr(struct rkisp1_device *rkisp1, u32 isp_mis);
 317
 318int rkisp1_capture_devs_register(struct rkisp1_device *rkisp1);
 319void rkisp1_capture_devs_unregister(struct rkisp1_device *rkisp1);
 320
 321int rkisp1_resizer_devs_register(struct rkisp1_device *rkisp1);
 322void rkisp1_resizer_devs_unregister(struct rkisp1_device *rkisp1);
 323
 324int rkisp1_stats_register(struct rkisp1_stats *stats,
 325                          struct v4l2_device *v4l2_dev,
 326                          struct rkisp1_device *rkisp1);
 327void rkisp1_stats_unregister(struct rkisp1_stats *stats);
 328
 329void rkisp1_params_configure(struct rkisp1_params *params,
 330                             enum rkisp1_fmt_raw_pat_type bayer_pat,
 331                             enum v4l2_quantization quantization);
 332void rkisp1_params_disable(struct rkisp1_params *params);
 333int rkisp1_params_register(struct rkisp1_params *params,
 334                           struct v4l2_device *v4l2_dev,
 335                           struct rkisp1_device *rkisp1);
 336void rkisp1_params_unregister(struct rkisp1_params *params);
 337
 338void rkisp1_params_isr_handler(struct rkisp1_device *rkisp1, u32 isp_mis);
 339
 340#endif /* _RKISP1_COMMON_H */
 341