linux/drivers/media/platform/rcar-vin/rcar-vin.h
<<
>>
Prefs
   1/*
   2 * Driver for Renesas R-Car VIN
   3 *
   4 * Copyright (C) 2016 Renesas Electronics Corp.
   5 * Copyright (C) 2011-2013 Renesas Solutions Corp.
   6 * Copyright (C) 2013 Cogent Embedded, Inc., <source@cogentembedded.com>
   7 * Copyright (C) 2008 Magnus Damm
   8 *
   9 * Based on the soc-camera rcar_vin driver
  10 *
  11 * This program is free software; you can redistribute  it and/or modify it
  12 * under  the terms of  the GNU General  Public License as published by the
  13 * Free Software Foundation;  either version 2 of the  License, or (at your
  14 * option) any later version.
  15 */
  16
  17#ifndef __RCAR_VIN__
  18#define __RCAR_VIN__
  19
  20#include <media/v4l2-async.h>
  21#include <media/v4l2-ctrls.h>
  22#include <media/v4l2-dev.h>
  23#include <media/v4l2-device.h>
  24#include <media/videobuf2-v4l2.h>
  25
  26/* Number of HW buffers */
  27#define HW_BUFFER_NUM 3
  28
  29/* Address alignment mask for HW buffers */
  30#define HW_BUFFER_MASK 0x7f
  31
  32enum chip_id {
  33        RCAR_H1,
  34        RCAR_M1,
  35        RCAR_GEN2,
  36};
  37
  38/**
  39 * STOPPED  - No operation in progress
  40 * RUNNING  - Operation in progress have buffers
  41 * STALLED  - No operation in progress have no buffers
  42 * STOPPING - Stopping operation
  43 */
  44enum rvin_dma_state {
  45        STOPPED = 0,
  46        RUNNING,
  47        STALLED,
  48        STOPPING,
  49};
  50
  51/**
  52 * struct rvin_source_fmt - Source information
  53 * @width:      Width from source
  54 * @height:     Height from source
  55 */
  56struct rvin_source_fmt {
  57        u32 width;
  58        u32 height;
  59};
  60
  61/**
  62 * struct rvin_video_format - Data format stored in memory
  63 * @fourcc:     Pixelformat
  64 * @bpp:        Bytes per pixel
  65 */
  66struct rvin_video_format {
  67        u32 fourcc;
  68        u8 bpp;
  69};
  70
  71/**
  72 * struct rvin_graph_entity - Video endpoint from async framework
  73 * @asd:        sub-device descriptor for async framework
  74 * @subdev:     subdevice matched using async framework
  75 * @code:       Media bus format from source
  76 * @mbus_cfg:   Media bus format from DT
  77 */
  78struct rvin_graph_entity {
  79        struct v4l2_async_subdev asd;
  80        struct v4l2_subdev *subdev;
  81
  82        u32 code;
  83        struct v4l2_mbus_config mbus_cfg;
  84};
  85
  86/**
  87 * struct rvin_dev - Renesas VIN device structure
  88 * @dev:                (OF) device
  89 * @base:               device I/O register space remapped to virtual memory
  90 * @chip:               type of VIN chip
  91 *
  92 * @vdev:               V4L2 video device associated with VIN
  93 * @v4l2_dev:           V4L2 device
  94 * @src_pad_idx:        source pad index for media controller drivers
  95 * @sink_pad_idx:       sink pad index for media controller drivers
  96 * @ctrl_handler:       V4L2 control handler
  97 * @notifier:           V4L2 asynchronous subdevs notifier
  98 * @digital:            entity in the DT for local digital subdevice
  99 *
 100 * @lock:               protects @queue
 101 * @queue:              vb2 buffers queue
 102 *
 103 * @qlock:              protects @queue_buf, @buf_list, @continuous, @sequence
 104 *                      @state
 105 * @queue_buf:          Keeps track of buffers given to HW slot
 106 * @buf_list:           list of queued buffers
 107 * @continuous:         tracks if active operation is continuous or single mode
 108 * @sequence:           V4L2 buffers sequence number
 109 * @state:              keeps track of operation state
 110 *
 111 * @source:             active format from the video source
 112 * @format:             active V4L2 pixel format
 113 *
 114 * @crop:               active cropping
 115 * @compose:            active composing
 116 */
 117struct rvin_dev {
 118        struct device *dev;
 119        void __iomem *base;
 120        enum chip_id chip;
 121
 122        struct video_device vdev;
 123        struct v4l2_device v4l2_dev;
 124        int src_pad_idx;
 125        int sink_pad_idx;
 126        struct v4l2_ctrl_handler ctrl_handler;
 127        struct v4l2_async_notifier notifier;
 128        struct rvin_graph_entity digital;
 129
 130        struct mutex lock;
 131        struct vb2_queue queue;
 132
 133        spinlock_t qlock;
 134        struct vb2_v4l2_buffer *queue_buf[HW_BUFFER_NUM];
 135        struct list_head buf_list;
 136        bool continuous;
 137        unsigned int sequence;
 138        enum rvin_dma_state state;
 139
 140        struct rvin_source_fmt source;
 141        struct v4l2_pix_format format;
 142
 143        struct v4l2_rect crop;
 144        struct v4l2_rect compose;
 145};
 146
 147#define vin_to_source(vin)              vin->digital.subdev
 148
 149/* Debug */
 150#define vin_dbg(d, fmt, arg...)         dev_dbg(d->dev, fmt, ##arg)
 151#define vin_info(d, fmt, arg...)        dev_info(d->dev, fmt, ##arg)
 152#define vin_warn(d, fmt, arg...)        dev_warn(d->dev, fmt, ##arg)
 153#define vin_err(d, fmt, arg...)         dev_err(d->dev, fmt, ##arg)
 154
 155int rvin_dma_probe(struct rvin_dev *vin, int irq);
 156void rvin_dma_remove(struct rvin_dev *vin);
 157
 158int rvin_v4l2_probe(struct rvin_dev *vin);
 159void rvin_v4l2_remove(struct rvin_dev *vin);
 160
 161const struct rvin_video_format *rvin_format_from_pixel(u32 pixelformat);
 162
 163/* Cropping, composing and scaling */
 164void rvin_scale_try(struct rvin_dev *vin, struct v4l2_pix_format *pix,
 165                    u32 width, u32 height);
 166void rvin_crop_scale_comp(struct rvin_dev *vin);
 167
 168#endif
 169