[media] s5p-fimc: Conversion to multiplanar formats
[deliverable/linux.git] / drivers / media / video / s5p-fimc / fimc-core.h
index 4f047d35f8ad9333ce3b4768836685b3d5f2f411..187af60bcf69213cf661dfd16a25e0220cbd1eaa 100644 (file)
@@ -16,7 +16,8 @@
 #include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/videodev2.h>
-#include <media/videobuf-core.h>
+#include <linux/io.h>
+#include <media/videobuf2-core.h>
 #include <media/v4l2-device.h>
 #include <media/v4l2-mem2mem.h>
 #include <media/v4l2-mediabus.h>
@@ -70,13 +71,6 @@ enum fimc_dev_flags {
 #define fimc_capture_streaming(dev) \
        test_bit(ST_CAPT_STREAM, &(dev)->state)
 
-#define fimc_buf_finish(dev, vid_buf) do { \
-       spin_lock(&(dev)->irqlock); \
-       (vid_buf)->vb.state = VIDEOBUF_DONE; \
-       spin_unlock(&(dev)->irqlock); \
-       wake_up(&(vid_buf)->vb.done); \
-} while (0)
-
 enum fimc_datapath {
        FIMC_CAMERA,
        FIMC_DMA,
@@ -90,7 +84,6 @@ enum fimc_color_fmt {
        S5P_FIMC_RGB888,
        S5P_FIMC_RGB30_LOCAL,
        S5P_FIMC_YCBCR420 = 0x20,
-       S5P_FIMC_YCBCR422,
        S5P_FIMC_YCBYCR422,
        S5P_FIMC_YCRYCB422,
        S5P_FIMC_CBYCRY422,
@@ -157,18 +150,18 @@ enum fimc_color_fmt {
  * @name: format description
  * @fourcc: the fourcc code for this format, 0 if not applicable
  * @color: the corresponding fimc_color_fmt
- * @depth: driver's private 'number of bits per pixel'
- * @buff_cnt: number of physically non-contiguous data planes
- * @planes_cnt: number of physically contiguous data planes
+ * @depth: per plane driver's private 'number of bits per pixel'
+ * @memplanes: number of physically non-contiguous data planes
+ * @colplanes: number of physically contiguous data planes
  */
 struct fimc_fmt {
        enum v4l2_mbus_pixelcode mbus_code;
        char    *name;
        u32     fourcc;
        u32     color;
-       u16     buff_cnt;
-       u16     planes_cnt;
-       u16     depth;
+       u16     memplanes;
+       u16     colplanes;
+       u8      depth[VIDEO_MAX_PLANES];
        u16     flags;
 #define FMT_FLAGS_CAM  (1 << 0)
 #define FMT_FLAGS_M2M  (1 << 1)
@@ -260,7 +253,8 @@ struct fimc_addr {
  * @index: buffer index for the output DMA engine
  */
 struct fimc_vid_buffer {
-       struct videobuf_buffer  vb;
+       struct vb2_buffer       vb;
+       struct list_head        list;
        struct fimc_addr        paddr;
        int                     index;
 };
@@ -277,7 +271,7 @@ struct fimc_vid_buffer {
  * @height:    image pixel weight
  * @paddr:     image frame buffer physical addresses
  * @buf_cnt:   number of buffers depending on a color format
- * @size:      image size in bytes
+ * @payload:   image size in bytes (w x h x bpp)
  * @color:     color format
  * @dma_offset:        DMA offset in bytes
  */
@@ -290,7 +284,7 @@ struct fimc_frame {
        u32     offs_v;
        u32     width;
        u32     height;
-       u32     size;
+       unsigned long           payload[VIDEO_MAX_PLANES];
        struct fimc_addr        paddr;
        struct fimc_dma_offset  dma_offset;
        struct fimc_fmt         *fmt;
@@ -331,13 +325,14 @@ struct fimc_m2m_device {
  */
 struct fimc_vid_cap {
        struct fimc_ctx                 *ctx;
+       struct vb2_alloc_ctx            *alloc_ctx;
        struct video_device             *vfd;
        struct v4l2_device              v4l2_dev;
-       struct v4l2_subdev              *sd;
+       struct v4l2_subdev              *sd;;
        struct v4l2_mbus_framefmt       fmt;
        struct list_head                pending_buf_q;
        struct list_head                active_buf_q;
-       struct videobuf_queue           vbq;
+       struct vb2_queue                vbq;
        int                             active_buf_cnt;
        int                             buf_index;
        unsigned int                    frame_count;
@@ -417,7 +412,6 @@ struct fimc_ctx;
  * @regs:      the mapped hardware registers
  * @regs_res:  the resource claimed for IO registers
  * @irq:       interrupt number of the FIMC subdevice
- * @irqlock:   spinlock protecting videobuffer queue
  * @irq_queue:
  * @m2m:       memory-to-memory V4L2 device information
  * @vid_cap:   camera capture device information
@@ -434,11 +428,11 @@ struct fimc_dev {
        void __iomem                    *regs;
        struct resource                 *regs_res;
        int                             irq;
-       spinlock_t                      irqlock;
        wait_queue_head_t               irq_queue;
        struct fimc_m2m_device          m2m;
        struct fimc_vid_cap             vid_cap;
        unsigned long                   state;
+       struct vb2_alloc_ctx            *alloc_ctx;
 };
 
 /**
@@ -482,11 +476,9 @@ struct fimc_ctx {
        struct v4l2_m2m_ctx     *m2m_ctx;
 };
 
-extern struct videobuf_queue_ops fimc_qops;
-
 static inline int tiled_fmt(struct fimc_fmt *fmt)
 {
-       return 0;
+       return fmt->fourcc == V4L2_PIX_FMT_NV12MT;
 }
 
 static inline void fimc_hw_clear_irq(struct fimc_dev *dev)
@@ -542,12 +534,12 @@ static inline struct fimc_frame *ctx_get_frame(struct fimc_ctx *ctx,
 {
        struct fimc_frame *frame;
 
-       if (V4L2_BUF_TYPE_VIDEO_OUTPUT == type) {
+       if (V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE == type) {
                if (ctx->state & FIMC_CTX_M2M)
                        frame = &ctx->s_frame;
                else
                        return ERR_PTR(-EINVAL);
-       } else if (V4L2_BUF_TYPE_VIDEO_CAPTURE == type) {
+       } else if (V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE == type) {
                frame = &ctx->d_frame;
        } else {
                v4l2_err(&ctx->fimc_dev->m2m.v4l2_dev,
@@ -589,7 +581,7 @@ void fimc_hw_set_input_path(struct fimc_ctx *ctx);
 void fimc_hw_set_output_path(struct fimc_ctx *ctx);
 void fimc_hw_set_input_addr(struct fimc_dev *fimc, struct fimc_addr *paddr);
 void fimc_hw_set_output_addr(struct fimc_dev *fimc, struct fimc_addr *paddr,
-                             int index);
+                            int index);
 int fimc_hw_set_camera_source(struct fimc_dev *fimc,
                              struct s3c_fimc_isp_info *cam);
 int fimc_hw_set_camera_offset(struct fimc_dev *fimc, struct fimc_frame *f);
@@ -600,12 +592,12 @@ int fimc_hw_set_camera_type(struct fimc_dev *fimc,
 
 /* -----------------------------------------------------*/
 /* fimc-core.c */
-int fimc_vidioc_enum_fmt(struct file *file, void *priv,
-                     struct v4l2_fmtdesc *f);
-int fimc_vidioc_g_fmt(struct file *file, void *priv,
-                     struct v4l2_format *f);
-int fimc_vidioc_try_fmt(struct file *file, void *priv,
-                       struct v4l2_format *f);
+int fimc_vidioc_enum_fmt_mplane(struct file *file, void *priv,
+                               struct v4l2_fmtdesc *f);
+int fimc_vidioc_g_fmt_mplane(struct file *file, void *priv,
+                            struct v4l2_format *f);
+int fimc_vidioc_try_fmt_mplane(struct file *file, void *priv,
+                              struct v4l2_format *f);
 int fimc_vidioc_queryctrl(struct file *file, void *priv,
                          struct v4l2_queryctrl *qc);
 int fimc_vidioc_g_ctrl(struct file *file, void *priv,
@@ -622,7 +614,7 @@ struct fimc_fmt *find_mbus_format(struct v4l2_mbus_framefmt *f,
 int fimc_check_scaler_ratio(struct v4l2_rect *r, struct fimc_frame *f);
 int fimc_set_scaler_info(struct fimc_ctx *ctx);
 int fimc_prepare_config(struct fimc_ctx *ctx, u32 flags);
-int fimc_prepare_addr(struct fimc_ctx *ctx, struct fimc_vid_buffer *buf,
+int fimc_prepare_addr(struct fimc_ctx *ctx, struct vb2_buffer *vb,
                      struct fimc_frame *frame, struct fimc_addr *paddr);
 
 /* -----------------------------------------------------*/
@@ -649,28 +641,27 @@ static inline void fimc_deactivate_capture(struct fimc_dev *fimc)
 }
 
 /*
- * Add video buffer to the active buffers queue.
- * The caller holds irqlock spinlock.
+ * Add buf to the capture active buffers queue.
+ * Locking: Need to be called with fimc_dev::slock held.
  */
 static inline void active_queue_add(struct fimc_vid_cap *vid_cap,
-                                        struct fimc_vid_buffer *buf)
+                                   struct fimc_vid_buffer *buf)
 {
-       buf->vb.state = VIDEOBUF_ACTIVE;
-       list_add_tail(&buf->vb.queue, &vid_cap->active_buf_q);
+       list_add_tail(&buf->list, &vid_cap->active_buf_q);
        vid_cap->active_buf_cnt++;
 }
 
 /*
  * Pop a video buffer from the capture active buffers queue
- * Locking: Need to be called with dev->slock held.
+ * Locking: Need to be called with fimc_dev::slock held.
  */
 static inline struct fimc_vid_buffer *
 active_queue_pop(struct fimc_vid_cap *vid_cap)
 {
        struct fimc_vid_buffer *buf;
        buf = list_entry(vid_cap->active_buf_q.next,
-                        struct fimc_vid_buffer, vb.queue);
-       list_del(&buf->vb.queue);
+                        struct fimc_vid_buffer, list);
+       list_del(&buf->list);
        vid_cap->active_buf_cnt--;
        return buf;
 }
@@ -679,8 +670,7 @@ active_queue_pop(struct fimc_vid_cap *vid_cap)
 static inline void fimc_pending_queue_add(struct fimc_vid_cap *vid_cap,
                                          struct fimc_vid_buffer *buf)
 {
-       buf->vb.state = VIDEOBUF_QUEUED;
-       list_add_tail(&buf->vb.queue, &vid_cap->pending_buf_q);
+       list_add_tail(&buf->list, &vid_cap->pending_buf_q);
 }
 
 /* Add video buffer to the capture pending buffers queue */
@@ -689,10 +679,9 @@ pending_queue_pop(struct fimc_vid_cap *vid_cap)
 {
        struct fimc_vid_buffer *buf;
        buf = list_entry(vid_cap->pending_buf_q.next,
-                       struct fimc_vid_buffer, vb.queue);
-       list_del(&buf->vb.queue);
+                       struct fimc_vid_buffer, list);
+       list_del(&buf->list);
        return buf;
 }
 
-
 #endif /* FIMC_CORE_H_ */
This page took 0.03837 seconds and 5 git commands to generate.