18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Samsung S5P G2D - 2D Graphics Accelerator Driver 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (c) 2011 Samsung Electronics Co., Ltd. 68c2ecf20Sopenharmony_ci * Kamil Debski, <k.debski@samsung.com> 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 108c2ecf20Sopenharmony_ci#include <media/v4l2-device.h> 118c2ecf20Sopenharmony_ci#include <media/v4l2-ctrls.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#define G2D_NAME "s5p-g2d" 148c2ecf20Sopenharmony_ci#define TYPE_G2D_3X 3 158c2ecf20Sopenharmony_ci#define TYPE_G2D_4X 4 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_cistruct g2d_dev { 188c2ecf20Sopenharmony_ci struct v4l2_device v4l2_dev; 198c2ecf20Sopenharmony_ci struct v4l2_m2m_dev *m2m_dev; 208c2ecf20Sopenharmony_ci struct video_device *vfd; 218c2ecf20Sopenharmony_ci struct mutex mutex; 228c2ecf20Sopenharmony_ci spinlock_t ctrl_lock; 238c2ecf20Sopenharmony_ci atomic_t num_inst; 248c2ecf20Sopenharmony_ci void __iomem *regs; 258c2ecf20Sopenharmony_ci struct clk *clk; 268c2ecf20Sopenharmony_ci struct clk *gate; 278c2ecf20Sopenharmony_ci struct g2d_ctx *curr; 288c2ecf20Sopenharmony_ci struct g2d_variant *variant; 298c2ecf20Sopenharmony_ci int irq; 308c2ecf20Sopenharmony_ci}; 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_cistruct g2d_frame { 338c2ecf20Sopenharmony_ci /* Original dimensions */ 348c2ecf20Sopenharmony_ci u32 width; 358c2ecf20Sopenharmony_ci u32 height; 368c2ecf20Sopenharmony_ci /* Crop size */ 378c2ecf20Sopenharmony_ci u32 c_width; 388c2ecf20Sopenharmony_ci u32 c_height; 398c2ecf20Sopenharmony_ci /* Offset */ 408c2ecf20Sopenharmony_ci u32 o_width; 418c2ecf20Sopenharmony_ci u32 o_height; 428c2ecf20Sopenharmony_ci /* Image format */ 438c2ecf20Sopenharmony_ci struct g2d_fmt *fmt; 448c2ecf20Sopenharmony_ci /* Variables that can calculated once and reused */ 458c2ecf20Sopenharmony_ci u32 stride; 468c2ecf20Sopenharmony_ci u32 bottom; 478c2ecf20Sopenharmony_ci u32 right; 488c2ecf20Sopenharmony_ci u32 size; 498c2ecf20Sopenharmony_ci}; 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_cistruct g2d_ctx { 528c2ecf20Sopenharmony_ci struct v4l2_fh fh; 538c2ecf20Sopenharmony_ci struct g2d_dev *dev; 548c2ecf20Sopenharmony_ci struct g2d_frame in; 558c2ecf20Sopenharmony_ci struct g2d_frame out; 568c2ecf20Sopenharmony_ci struct v4l2_ctrl *ctrl_hflip; 578c2ecf20Sopenharmony_ci struct v4l2_ctrl *ctrl_vflip; 588c2ecf20Sopenharmony_ci struct v4l2_ctrl_handler ctrl_handler; 598c2ecf20Sopenharmony_ci u32 rop; 608c2ecf20Sopenharmony_ci u32 flip; 618c2ecf20Sopenharmony_ci}; 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_cistruct g2d_fmt { 648c2ecf20Sopenharmony_ci u32 fourcc; 658c2ecf20Sopenharmony_ci int depth; 668c2ecf20Sopenharmony_ci u32 hw; 678c2ecf20Sopenharmony_ci}; 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_cistruct g2d_variant { 708c2ecf20Sopenharmony_ci unsigned short hw_rev; 718c2ecf20Sopenharmony_ci}; 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_civoid g2d_reset(struct g2d_dev *d); 748c2ecf20Sopenharmony_civoid g2d_set_src_size(struct g2d_dev *d, struct g2d_frame *f); 758c2ecf20Sopenharmony_civoid g2d_set_src_addr(struct g2d_dev *d, dma_addr_t a); 768c2ecf20Sopenharmony_civoid g2d_set_dst_size(struct g2d_dev *d, struct g2d_frame *f); 778c2ecf20Sopenharmony_civoid g2d_set_dst_addr(struct g2d_dev *d, dma_addr_t a); 788c2ecf20Sopenharmony_civoid g2d_start(struct g2d_dev *d); 798c2ecf20Sopenharmony_civoid g2d_clear_int(struct g2d_dev *d); 808c2ecf20Sopenharmony_civoid g2d_set_rop4(struct g2d_dev *d, u32 r); 818c2ecf20Sopenharmony_civoid g2d_set_flip(struct g2d_dev *d, u32 r); 828c2ecf20Sopenharmony_civoid g2d_set_v41_stretch(struct g2d_dev *d, 838c2ecf20Sopenharmony_ci struct g2d_frame *src, struct g2d_frame *dst); 848c2ecf20Sopenharmony_civoid g2d_set_cmd(struct g2d_dev *d, u32 c); 85