root/drivers/media/platform/samsung/s5p-g2d/g2d.h
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Samsung S5P G2D - 2D Graphics Accelerator Driver
 *
 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
 * Kamil Debski, <k.debski@samsung.com>
 */

#include <linux/platform_device.h>
#include <media/v4l2-device.h>
#include <media/v4l2-ctrls.h>

#define G2D_NAME "s5p-g2d"
#define TYPE_G2D_3X 3
#define TYPE_G2D_4X 4

struct g2d_dev {
        struct v4l2_device      v4l2_dev;
        struct v4l2_m2m_dev     *m2m_dev;
        struct video_device     *vfd;
        struct mutex            mutex;
        spinlock_t              ctrl_lock;
        atomic_t                num_inst;
        void __iomem            *regs;
        struct clk              *clk;
        struct clk              *gate;
        struct g2d_ctx          *curr;
        struct g2d_variant      *variant;
        int irq;
};

struct g2d_frame {
        /* Original dimensions */
        u32     width;
        u32     height;
        /* Crop size */
        u32     c_width;
        u32     c_height;
        /* Offset */
        u32     o_width;
        u32     o_height;
        /* Image format */
        struct g2d_fmt *fmt;
        /* Variables that can calculated once and reused */
        u32     stride;
        u32     bottom;
        u32     right;
        u32     size;
};

struct g2d_ctx {
        struct v4l2_fh fh;
        struct g2d_dev          *dev;
        struct g2d_frame        in;
        struct g2d_frame        out;
        struct v4l2_ctrl        *ctrl_hflip;
        struct v4l2_ctrl        *ctrl_vflip;
        struct v4l2_ctrl_handler ctrl_handler;
        u32 rop;
        u32 flip;
};

struct g2d_fmt {
        u32     fourcc;
        int     depth;
        u32     hw;
};

struct g2d_variant {
        unsigned short hw_rev;
};

void g2d_reset(struct g2d_dev *d);
void g2d_set_src_size(struct g2d_dev *d, struct g2d_frame *f);
void g2d_set_src_addr(struct g2d_dev *d, dma_addr_t a);
void g2d_set_dst_size(struct g2d_dev *d, struct g2d_frame *f);
void g2d_set_dst_addr(struct g2d_dev *d, dma_addr_t a);
void g2d_start(struct g2d_dev *d);
void g2d_clear_int(struct g2d_dev *d);
void g2d_set_rop4(struct g2d_dev *d, u32 r);
void g2d_set_flip(struct g2d_dev *d, u32 r);
void g2d_set_v41_stretch(struct g2d_dev *d,
                        struct g2d_frame *src, struct g2d_frame *dst);
void g2d_set_cmd(struct g2d_dev *d, u32 c);