1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Samsung S5P G2D - 2D Graphics Accelerator Driver 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2011 Samsung Electronics Co., Ltd. 6*4882a593Smuzhiyun * Kamil Debski, <k.debski@samsung.com> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <linux/platform_device.h> 10*4882a593Smuzhiyun #include <media/v4l2-device.h> 11*4882a593Smuzhiyun #include <media/v4l2-ctrls.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #define G2D_NAME "s5p-g2d" 14*4882a593Smuzhiyun #define TYPE_G2D_3X 3 15*4882a593Smuzhiyun #define TYPE_G2D_4X 4 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun struct g2d_dev { 18*4882a593Smuzhiyun struct v4l2_device v4l2_dev; 19*4882a593Smuzhiyun struct v4l2_m2m_dev *m2m_dev; 20*4882a593Smuzhiyun struct video_device *vfd; 21*4882a593Smuzhiyun struct mutex mutex; 22*4882a593Smuzhiyun spinlock_t ctrl_lock; 23*4882a593Smuzhiyun atomic_t num_inst; 24*4882a593Smuzhiyun void __iomem *regs; 25*4882a593Smuzhiyun struct clk *clk; 26*4882a593Smuzhiyun struct clk *gate; 27*4882a593Smuzhiyun struct g2d_ctx *curr; 28*4882a593Smuzhiyun struct g2d_variant *variant; 29*4882a593Smuzhiyun int irq; 30*4882a593Smuzhiyun }; 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun struct g2d_frame { 33*4882a593Smuzhiyun /* Original dimensions */ 34*4882a593Smuzhiyun u32 width; 35*4882a593Smuzhiyun u32 height; 36*4882a593Smuzhiyun /* Crop size */ 37*4882a593Smuzhiyun u32 c_width; 38*4882a593Smuzhiyun u32 c_height; 39*4882a593Smuzhiyun /* Offset */ 40*4882a593Smuzhiyun u32 o_width; 41*4882a593Smuzhiyun u32 o_height; 42*4882a593Smuzhiyun /* Image format */ 43*4882a593Smuzhiyun struct g2d_fmt *fmt; 44*4882a593Smuzhiyun /* Variables that can calculated once and reused */ 45*4882a593Smuzhiyun u32 stride; 46*4882a593Smuzhiyun u32 bottom; 47*4882a593Smuzhiyun u32 right; 48*4882a593Smuzhiyun u32 size; 49*4882a593Smuzhiyun }; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun struct g2d_ctx { 52*4882a593Smuzhiyun struct v4l2_fh fh; 53*4882a593Smuzhiyun struct g2d_dev *dev; 54*4882a593Smuzhiyun struct g2d_frame in; 55*4882a593Smuzhiyun struct g2d_frame out; 56*4882a593Smuzhiyun struct v4l2_ctrl *ctrl_hflip; 57*4882a593Smuzhiyun struct v4l2_ctrl *ctrl_vflip; 58*4882a593Smuzhiyun struct v4l2_ctrl_handler ctrl_handler; 59*4882a593Smuzhiyun u32 rop; 60*4882a593Smuzhiyun u32 flip; 61*4882a593Smuzhiyun }; 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun struct g2d_fmt { 64*4882a593Smuzhiyun u32 fourcc; 65*4882a593Smuzhiyun int depth; 66*4882a593Smuzhiyun u32 hw; 67*4882a593Smuzhiyun }; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun struct g2d_variant { 70*4882a593Smuzhiyun unsigned short hw_rev; 71*4882a593Smuzhiyun }; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun void g2d_reset(struct g2d_dev *d); 74*4882a593Smuzhiyun void g2d_set_src_size(struct g2d_dev *d, struct g2d_frame *f); 75*4882a593Smuzhiyun void g2d_set_src_addr(struct g2d_dev *d, dma_addr_t a); 76*4882a593Smuzhiyun void g2d_set_dst_size(struct g2d_dev *d, struct g2d_frame *f); 77*4882a593Smuzhiyun void g2d_set_dst_addr(struct g2d_dev *d, dma_addr_t a); 78*4882a593Smuzhiyun void g2d_start(struct g2d_dev *d); 79*4882a593Smuzhiyun void g2d_clear_int(struct g2d_dev *d); 80*4882a593Smuzhiyun void g2d_set_rop4(struct g2d_dev *d, u32 r); 81*4882a593Smuzhiyun void g2d_set_flip(struct g2d_dev *d, u32 r); 82*4882a593Smuzhiyun void g2d_set_v41_stretch(struct g2d_dev *d, 83*4882a593Smuzhiyun struct g2d_frame *src, struct g2d_frame *dst); 84*4882a593Smuzhiyun void g2d_set_cmd(struct g2d_dev *d, u32 c); 85