root/drivers/staging/media/imx/imx-media.h

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

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. to_imx_media_vb
  2. to_pad_vdev_list

   1 /* SPDX-License-Identifier: GPL-2.0+ */
   2 /*
   3  * V4L2 Media Controller Driver for Freescale i.MX5/6 SOC
   4  *
   5  * Copyright (c) 2016 Mentor Graphics Inc.
   6  */
   7 #ifndef _IMX_MEDIA_H
   8 #define _IMX_MEDIA_H
   9 
  10 #include <linux/platform_device.h>
  11 #include <media/v4l2-ctrls.h>
  12 #include <media/v4l2-device.h>
  13 #include <media/v4l2-fwnode.h>
  14 #include <media/v4l2-subdev.h>
  15 #include <media/videobuf2-dma-contig.h>
  16 #include <video/imx-ipu-v3.h>
  17 
  18 /*
  19  * Enumeration of the IPU internal sub-devices
  20  */
  21 enum {
  22         IPU_CSI0 = 0,
  23         IPU_CSI1,
  24         IPU_VDIC,
  25         IPU_IC_PRP,
  26         IPU_IC_PRPENC,
  27         IPU_IC_PRPVF,
  28         NUM_IPU_SUBDEVS,
  29 };
  30 
  31 /*
  32  * Pad definitions for the subdevs with multiple source or
  33  * sink pads
  34  */
  35 
  36 /* ipu_csi */
  37 enum {
  38         CSI_SINK_PAD = 0,
  39         CSI_SRC_PAD_DIRECT,
  40         CSI_SRC_PAD_IDMAC,
  41         CSI_NUM_PADS,
  42 };
  43 
  44 /* ipu_vdic */
  45 enum {
  46         VDIC_SINK_PAD_DIRECT = 0,
  47         VDIC_SINK_PAD_IDMAC,
  48         VDIC_SRC_PAD_DIRECT,
  49         VDIC_NUM_PADS,
  50 };
  51 
  52 /* ipu_ic_prp */
  53 enum {
  54         PRP_SINK_PAD = 0,
  55         PRP_SRC_PAD_PRPENC,
  56         PRP_SRC_PAD_PRPVF,
  57         PRP_NUM_PADS,
  58 };
  59 
  60 /* ipu_ic_prpencvf */
  61 enum {
  62         PRPENCVF_SINK_PAD = 0,
  63         PRPENCVF_SRC_PAD,
  64         PRPENCVF_NUM_PADS,
  65 };
  66 
  67 /* How long to wait for EOF interrupts in the buffer-capture subdevs */
  68 #define IMX_MEDIA_EOF_TIMEOUT       1000
  69 
  70 struct imx_media_pixfmt {
  71         u32     fourcc;
  72         u32     codes[4];
  73         int     bpp;     /* total bpp */
  74         /* cycles per pixel for generic (bayer) formats for the parallel bus */
  75         int     cycles;
  76         enum ipu_color_space cs;
  77         bool    planar;  /* is a planar format */
  78         bool    bayer;   /* is a raw bayer format */
  79         bool    ipufmt;  /* is one of the IPU internal formats */
  80 };
  81 
  82 struct imx_media_buffer {
  83         struct vb2_v4l2_buffer vbuf; /* v4l buffer must be first */
  84         struct list_head  list;
  85 };
  86 
  87 struct imx_media_video_dev {
  88         struct video_device *vfd;
  89 
  90         /* the user format */
  91         struct v4l2_format fmt;
  92         /* the compose rectangle */
  93         struct v4l2_rect compose;
  94         const struct imx_media_pixfmt *cc;
  95 
  96         /* links this vdev to master list */
  97         struct list_head list;
  98 };
  99 
 100 static inline struct imx_media_buffer *to_imx_media_vb(struct vb2_buffer *vb)
 101 {
 102         struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
 103 
 104         return container_of(vbuf, struct imx_media_buffer, vbuf);
 105 }
 106 
 107 /*
 108  * to support control inheritance to video devices, this
 109  * retrieves a pad's list_head of video devices that can
 110  * be reached from the pad. Note that only the lists in
 111  * source pads get populated, sink pads have empty lists.
 112  */
 113 static inline struct list_head *
 114 to_pad_vdev_list(struct v4l2_subdev *sd, int pad_index)
 115 {
 116         struct list_head *vdev_list = sd->host_priv;
 117 
 118         return vdev_list ? &vdev_list[pad_index] : NULL;
 119 }
 120 
 121 /* an entry in a pad's video device list */
 122 struct imx_media_pad_vdev {
 123         struct imx_media_video_dev *vdev;
 124         struct list_head list;
 125 };
 126 
 127 struct imx_media_dev {
 128         struct media_device md;
 129         struct v4l2_device  v4l2_dev;
 130 
 131         /* the pipeline object */
 132         struct media_pipeline pipe;
 133 
 134         struct mutex mutex; /* protect elements below */
 135 
 136         /* master video device list */
 137         struct list_head vdev_list;
 138 
 139         /* IPUs this media driver control, valid after subdevs bound */
 140         struct ipu_soc *ipu[2];
 141 
 142         /* for async subdev registration */
 143         struct v4l2_async_notifier notifier;
 144 
 145         /* IC scaler/CSC mem2mem video device */
 146         struct imx_media_video_dev *m2m_vdev;
 147 
 148         /* the IPU internal subdev's registered synchronously */
 149         struct v4l2_subdev *sync_sd[2][NUM_IPU_SUBDEVS];
 150 };
 151 
 152 enum codespace_sel {
 153         CS_SEL_YUV = 0,
 154         CS_SEL_RGB,
 155         CS_SEL_ANY,
 156 };
 157 
 158 /* imx-media-utils.c */
 159 const struct imx_media_pixfmt *
 160 imx_media_find_format(u32 fourcc, enum codespace_sel cs_sel, bool allow_bayer);
 161 int imx_media_enum_format(u32 *fourcc, u32 index, enum codespace_sel cs_sel);
 162 const struct imx_media_pixfmt *
 163 imx_media_find_mbus_format(u32 code, enum codespace_sel cs_sel,
 164                            bool allow_bayer);
 165 int imx_media_enum_mbus_format(u32 *code, u32 index, enum codespace_sel cs_sel,
 166                                bool allow_bayer);
 167 const struct imx_media_pixfmt *
 168 imx_media_find_ipu_format(u32 code, enum codespace_sel cs_sel);
 169 int imx_media_enum_ipu_format(u32 *code, u32 index, enum codespace_sel cs_sel);
 170 int imx_media_init_mbus_fmt(struct v4l2_mbus_framefmt *mbus,
 171                             u32 width, u32 height, u32 code, u32 field,
 172                             const struct imx_media_pixfmt **cc);
 173 int imx_media_init_cfg(struct v4l2_subdev *sd,
 174                        struct v4l2_subdev_pad_config *cfg);
 175 void imx_media_try_colorimetry(struct v4l2_mbus_framefmt *tryfmt,
 176                                bool ic_route);
 177 int imx_media_mbus_fmt_to_pix_fmt(struct v4l2_pix_format *pix,
 178                                   struct v4l2_mbus_framefmt *mbus,
 179                                   const struct imx_media_pixfmt *cc);
 180 int imx_media_mbus_fmt_to_ipu_image(struct ipu_image *image,
 181                                     struct v4l2_mbus_framefmt *mbus);
 182 int imx_media_ipu_image_to_mbus_fmt(struct v4l2_mbus_framefmt *mbus,
 183                                     struct ipu_image *image);
 184 void imx_media_grp_id_to_sd_name(char *sd_name, int sz,
 185                                  u32 grp_id, int ipu_id);
 186 struct v4l2_subdev *
 187 imx_media_find_subdev_by_fwnode(struct imx_media_dev *imxmd,
 188                                 struct fwnode_handle *fwnode);
 189 struct v4l2_subdev *
 190 imx_media_find_subdev_by_devname(struct imx_media_dev *imxmd,
 191                                  const char *devname);
 192 void imx_media_add_video_device(struct imx_media_dev *imxmd,
 193                                 struct imx_media_video_dev *vdev);
 194 int imx_media_pipeline_csi2_channel(struct media_entity *start_entity);
 195 struct media_pad *
 196 imx_media_pipeline_pad(struct media_entity *start_entity, u32 grp_id,
 197                        enum v4l2_buf_type buftype, bool upstream);
 198 struct v4l2_subdev *
 199 imx_media_pipeline_subdev(struct media_entity *start_entity, u32 grp_id,
 200                           bool upstream);
 201 struct video_device *
 202 imx_media_pipeline_video_device(struct media_entity *start_entity,
 203                                 enum v4l2_buf_type buftype, bool upstream);
 204 
 205 struct imx_media_dma_buf {
 206         void          *virt;
 207         dma_addr_t     phys;
 208         unsigned long  len;
 209 };
 210 
 211 void imx_media_free_dma_buf(struct device *dev,
 212                             struct imx_media_dma_buf *buf);
 213 int imx_media_alloc_dma_buf(struct device *dev,
 214                             struct imx_media_dma_buf *buf,
 215                             int size);
 216 
 217 int imx_media_pipeline_set_stream(struct imx_media_dev *imxmd,
 218                                   struct media_entity *entity,
 219                                   bool on);
 220 
 221 /* imx-media-dev-common.c */
 222 int imx_media_probe_complete(struct v4l2_async_notifier *notifier);
 223 struct imx_media_dev *imx_media_dev_init(struct device *dev,
 224                                          const struct media_device_ops *ops);
 225 int imx_media_dev_notifier_register(struct imx_media_dev *imxmd,
 226                             const struct v4l2_async_notifier_operations *ops);
 227 
 228 /* imx-media-fim.c */
 229 struct imx_media_fim;
 230 void imx_media_fim_eof_monitor(struct imx_media_fim *fim, ktime_t timestamp);
 231 int imx_media_fim_set_stream(struct imx_media_fim *fim,
 232                              const struct v4l2_fract *frame_interval,
 233                              bool on);
 234 int imx_media_fim_add_controls(struct imx_media_fim *fim);
 235 struct imx_media_fim *imx_media_fim_init(struct v4l2_subdev *sd);
 236 void imx_media_fim_free(struct imx_media_fim *fim);
 237 
 238 /* imx-media-internal-sd.c */
 239 int imx_media_register_ipu_internal_subdevs(struct imx_media_dev *imxmd,
 240                                             struct v4l2_subdev *csi);
 241 void imx_media_unregister_ipu_internal_subdevs(struct imx_media_dev *imxmd);
 242 
 243 /* imx-media-of.c */
 244 int imx_media_add_of_subdevs(struct imx_media_dev *dev,
 245                              struct device_node *np);
 246 int imx_media_create_of_links(struct imx_media_dev *imxmd,
 247                               struct v4l2_subdev *sd);
 248 int imx_media_create_csi_of_links(struct imx_media_dev *imxmd,
 249                                   struct v4l2_subdev *csi);
 250 int imx_media_of_add_csi(struct imx_media_dev *imxmd,
 251                          struct device_node *csi_np);
 252 
 253 /* imx-media-vdic.c */
 254 struct v4l2_subdev *imx_media_vdic_register(struct v4l2_device *v4l2_dev,
 255                                             struct device *ipu_dev,
 256                                             struct ipu_soc *ipu,
 257                                             u32 grp_id);
 258 int imx_media_vdic_unregister(struct v4l2_subdev *sd);
 259 
 260 /* imx-ic-common.c */
 261 struct v4l2_subdev *imx_media_ic_register(struct v4l2_device *v4l2_dev,
 262                                           struct device *ipu_dev,
 263                                           struct ipu_soc *ipu,
 264                                           u32 grp_id);
 265 int imx_media_ic_unregister(struct v4l2_subdev *sd);
 266 
 267 /* imx-media-capture.c */
 268 struct imx_media_video_dev *
 269 imx_media_capture_device_init(struct device *dev, struct v4l2_subdev *src_sd,
 270                               int pad);
 271 void imx_media_capture_device_remove(struct imx_media_video_dev *vdev);
 272 int imx_media_capture_device_register(struct imx_media_video_dev *vdev);
 273 void imx_media_capture_device_unregister(struct imx_media_video_dev *vdev);
 274 struct imx_media_buffer *
 275 imx_media_capture_device_next_buf(struct imx_media_video_dev *vdev);
 276 void imx_media_capture_device_error(struct imx_media_video_dev *vdev);
 277 
 278 /* imx-media-csc-scaler.c */
 279 struct imx_media_video_dev *
 280 imx_media_csc_scaler_device_init(struct imx_media_dev *dev);
 281 int imx_media_csc_scaler_device_register(struct imx_media_video_dev *vdev);
 282 void imx_media_csc_scaler_device_unregister(struct imx_media_video_dev *vdev);
 283 
 284 /* subdev group ids */
 285 #define IMX_MEDIA_GRP_ID_CSI2          BIT(8)
 286 #define IMX_MEDIA_GRP_ID_CSI           BIT(9)
 287 #define IMX_MEDIA_GRP_ID_IPU_CSI_BIT   10
 288 #define IMX_MEDIA_GRP_ID_IPU_CSI       (0x3 << IMX_MEDIA_GRP_ID_IPU_CSI_BIT)
 289 #define IMX_MEDIA_GRP_ID_IPU_CSI0      BIT(IMX_MEDIA_GRP_ID_IPU_CSI_BIT)
 290 #define IMX_MEDIA_GRP_ID_IPU_CSI1      (2 << IMX_MEDIA_GRP_ID_IPU_CSI_BIT)
 291 #define IMX_MEDIA_GRP_ID_IPU_VDIC      BIT(12)
 292 #define IMX_MEDIA_GRP_ID_IPU_IC_PRP    BIT(13)
 293 #define IMX_MEDIA_GRP_ID_IPU_IC_PRPENC BIT(14)
 294 #define IMX_MEDIA_GRP_ID_IPU_IC_PRPVF  BIT(15)
 295 
 296 #endif

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