root/drivers/media/platform/rcar-vin/rcar-vin.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0+ */
   2 /*
   3  * Driver for Renesas R-Car VIN
   4  *
   5  * Copyright (C) 2016 Renesas Electronics Corp.
   6  * Copyright (C) 2011-2013 Renesas Solutions Corp.
   7  * Copyright (C) 2013 Cogent Embedded, Inc., <source@cogentembedded.com>
   8  * Copyright (C) 2008 Magnus Damm
   9  *
  10  * Based on the soc-camera rcar_vin driver
  11  */
  12 
  13 #ifndef __RCAR_VIN__
  14 #define __RCAR_VIN__
  15 
  16 #include <linux/kref.h>
  17 
  18 #include <media/v4l2-async.h>
  19 #include <media/v4l2-ctrls.h>
  20 #include <media/v4l2-dev.h>
  21 #include <media/v4l2-device.h>
  22 #include <media/videobuf2-v4l2.h>
  23 
  24 /* Number of HW buffers */
  25 #define HW_BUFFER_NUM 3
  26 
  27 /* Address alignment mask for HW buffers */
  28 #define HW_BUFFER_MASK 0x7f
  29 
  30 /* Max number on VIN instances that can be in a system */
  31 #define RCAR_VIN_NUM 8
  32 
  33 struct rvin_group;
  34 
  35 enum model_id {
  36         RCAR_H1,
  37         RCAR_M1,
  38         RCAR_GEN2,
  39         RCAR_GEN3,
  40 };
  41 
  42 enum rvin_csi_id {
  43         RVIN_CSI20,
  44         RVIN_CSI21,
  45         RVIN_CSI40,
  46         RVIN_CSI41,
  47         RVIN_CSI_MAX,
  48 };
  49 
  50 /**
  51  * STOPPED  - No operation in progress
  52  * STARTING - Capture starting up
  53  * RUNNING  - Operation in progress have buffers
  54  * STOPPING - Stopping operation
  55  */
  56 enum rvin_dma_state {
  57         STOPPED = 0,
  58         STARTING,
  59         RUNNING,
  60         STOPPING,
  61 };
  62 
  63 /**
  64  * struct rvin_video_format - Data format stored in memory
  65  * @fourcc:     Pixelformat
  66  * @bpp:        Bytes per pixel
  67  */
  68 struct rvin_video_format {
  69         u32 fourcc;
  70         u8 bpp;
  71 };
  72 
  73 /**
  74  * struct rvin_parallel_entity - Parallel video input endpoint descriptor
  75  * @asd:        sub-device descriptor for async framework
  76  * @subdev:     subdevice matched using async framework
  77  * @mbus_type:  media bus type
  78  * @mbus_flags: media bus configuration flags
  79  * @source_pad: source pad of remote subdevice
  80  * @sink_pad:   sink pad of remote subdevice
  81  *
  82  */
  83 struct rvin_parallel_entity {
  84         struct v4l2_async_subdev asd;
  85         struct v4l2_subdev *subdev;
  86 
  87         enum v4l2_mbus_type mbus_type;
  88         unsigned int mbus_flags;
  89 
  90         unsigned int source_pad;
  91         unsigned int sink_pad;
  92 };
  93 
  94 /**
  95  * struct rvin_group_route - describes a route from a channel of a
  96  *      CSI-2 receiver to a VIN
  97  *
  98  * @csi:        CSI-2 receiver ID.
  99  * @channel:    Output channel of the CSI-2 receiver.
 100  * @vin:        VIN ID.
 101  * @mask:       Bitmask of the different CHSEL register values that
 102  *              allow for a route from @csi + @chan to @vin.
 103  *
 104  * .. note::
 105  *      Each R-Car CSI-2 receiver has four output channels facing the VIN
 106  *      devices, each channel can carry one CSI-2 Virtual Channel (VC).
 107  *      There is no correlation between channel number and CSI-2 VC. It's
 108  *      up to the CSI-2 receiver driver to configure which VC is output
 109  *      on which channel, the VIN devices only care about output channels.
 110  *
 111  *      There are in some cases multiple CHSEL register settings which would
 112  *      allow for the same route from @csi + @channel to @vin. For example
 113  *      on R-Car H3 both the CHSEL values 0 and 3 allow for a route from
 114  *      CSI40/VC0 to VIN0. All possible CHSEL values for a route need to be
 115  *      recorded as a bitmask in @mask, in this example bit 0 and 3 should
 116  *      be set.
 117  */
 118 struct rvin_group_route {
 119         enum rvin_csi_id csi;
 120         unsigned int channel;
 121         unsigned int vin;
 122         unsigned int mask;
 123 };
 124 
 125 /**
 126  * struct rvin_info - Information about the particular VIN implementation
 127  * @model:              VIN model
 128  * @use_mc:             use media controller instead of controlling subdevice
 129  * @max_width:          max input width the VIN supports
 130  * @max_height:         max input height the VIN supports
 131  * @routes:             list of possible routes from the CSI-2 recivers to
 132  *                      all VINs. The list mush be NULL terminated.
 133  */
 134 struct rvin_info {
 135         enum model_id model;
 136         bool use_mc;
 137 
 138         unsigned int max_width;
 139         unsigned int max_height;
 140         const struct rvin_group_route *routes;
 141 };
 142 
 143 /**
 144  * struct rvin_dev - Renesas VIN device structure
 145  * @dev:                (OF) device
 146  * @base:               device I/O register space remapped to virtual memory
 147  * @info:               info about VIN instance
 148  *
 149  * @vdev:               V4L2 video device associated with VIN
 150  * @v4l2_dev:           V4L2 device
 151  * @ctrl_handler:       V4L2 control handler
 152  * @notifier:           V4L2 asynchronous subdevs notifier
 153  *
 154  * @parallel:           parallel input subdevice descriptor
 155  *
 156  * @group:              Gen3 CSI group
 157  * @id:                 Gen3 group id for this VIN
 158  * @pad:                media pad for the video device entity
 159  *
 160  * @lock:               protects @queue
 161  * @queue:              vb2 buffers queue
 162  * @scratch:            cpu address for scratch buffer
 163  * @scratch_phys:       physical address of the scratch buffer
 164  *
 165  * @qlock:              protects @queue_buf, @buf_list, @sequence
 166  *                      @state
 167  * @queue_buf:          Keeps track of buffers given to HW slot
 168  * @buf_list:           list of queued buffers
 169  * @sequence:           V4L2 buffers sequence number
 170  * @state:              keeps track of operation state
 171  *
 172  * @is_csi:             flag to mark the VIN as using a CSI-2 subdevice
 173  *
 174  * @mbus_code:          media bus format code
 175  * @format:             active V4L2 pixel format
 176  *
 177  * @crop:               active cropping
 178  * @compose:            active composing
 179  * @source:             active size of the video source
 180  * @std:                active video standard of the video source
 181  *
 182  * @alpha:              Alpha component to fill in for supported pixel formats
 183  */
 184 struct rvin_dev {
 185         struct device *dev;
 186         void __iomem *base;
 187         const struct rvin_info *info;
 188 
 189         struct video_device vdev;
 190         struct v4l2_device v4l2_dev;
 191         struct v4l2_ctrl_handler ctrl_handler;
 192         struct v4l2_async_notifier notifier;
 193 
 194         struct rvin_parallel_entity *parallel;
 195 
 196         struct rvin_group *group;
 197         unsigned int id;
 198         struct media_pad pad;
 199 
 200         struct mutex lock;
 201         struct vb2_queue queue;
 202         void *scratch;
 203         dma_addr_t scratch_phys;
 204 
 205         spinlock_t qlock;
 206         struct vb2_v4l2_buffer *queue_buf[HW_BUFFER_NUM];
 207         struct list_head buf_list;
 208         unsigned int sequence;
 209         enum rvin_dma_state state;
 210 
 211         bool is_csi;
 212 
 213         u32 mbus_code;
 214         struct v4l2_pix_format format;
 215 
 216         struct v4l2_rect crop;
 217         struct v4l2_rect compose;
 218         struct v4l2_rect source;
 219         v4l2_std_id std;
 220 
 221         unsigned int alpha;
 222 };
 223 
 224 #define vin_to_source(vin)              ((vin)->parallel->subdev)
 225 
 226 /* Debug */
 227 #define vin_dbg(d, fmt, arg...)         dev_dbg(d->dev, fmt, ##arg)
 228 #define vin_info(d, fmt, arg...)        dev_info(d->dev, fmt, ##arg)
 229 #define vin_warn(d, fmt, arg...)        dev_warn(d->dev, fmt, ##arg)
 230 #define vin_err(d, fmt, arg...)         dev_err(d->dev, fmt, ##arg)
 231 
 232 /**
 233  * struct rvin_group - VIN CSI2 group information
 234  * @refcount:           number of VIN instances using the group
 235  *
 236  * @mdev:               media device which represents the group
 237  *
 238  * @lock:               protects the count, notifier, vin and csi members
 239  * @count:              number of enabled VIN instances found in DT
 240  * @notifier:           group notifier for CSI-2 async subdevices
 241  * @vin:                VIN instances which are part of the group
 242  * @csi:                array of pairs of fwnode and subdev pointers
 243  *                      to all CSI-2 subdevices.
 244  */
 245 struct rvin_group {
 246         struct kref refcount;
 247 
 248         struct media_device mdev;
 249 
 250         struct mutex lock;
 251         unsigned int count;
 252         struct v4l2_async_notifier notifier;
 253         struct rvin_dev *vin[RCAR_VIN_NUM];
 254 
 255         struct {
 256                 struct fwnode_handle *fwnode;
 257                 struct v4l2_subdev *subdev;
 258         } csi[RVIN_CSI_MAX];
 259 };
 260 
 261 int rvin_dma_register(struct rvin_dev *vin, int irq);
 262 void rvin_dma_unregister(struct rvin_dev *vin);
 263 
 264 int rvin_v4l2_register(struct rvin_dev *vin);
 265 void rvin_v4l2_unregister(struct rvin_dev *vin);
 266 
 267 const struct rvin_video_format *rvin_format_from_pixel(struct rvin_dev *vin,
 268                                                        u32 pixelformat);
 269 
 270 
 271 /* Cropping, composing and scaling */
 272 void rvin_crop_scale_comp(struct rvin_dev *vin);
 273 
 274 int rvin_set_channel_routing(struct rvin_dev *vin, u8 chsel);
 275 void rvin_set_alpha(struct rvin_dev *vin, unsigned int alpha);
 276 
 277 #endif

/* [<][>][^][v][top][bottom][index][help] */