162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Samsung S5P G2D - 2D Graphics Accelerator Driver 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2011 Samsung Electronics Co., Ltd. 662306a36Sopenharmony_ci * Kamil Debski, <k.debski@samsung.com> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/platform_device.h> 1062306a36Sopenharmony_ci#include <media/v4l2-device.h> 1162306a36Sopenharmony_ci#include <media/v4l2-ctrls.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define G2D_NAME "s5p-g2d" 1462306a36Sopenharmony_ci#define TYPE_G2D_3X 3 1562306a36Sopenharmony_ci#define TYPE_G2D_4X 4 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistruct g2d_dev { 1862306a36Sopenharmony_ci struct v4l2_device v4l2_dev; 1962306a36Sopenharmony_ci struct v4l2_m2m_dev *m2m_dev; 2062306a36Sopenharmony_ci struct video_device *vfd; 2162306a36Sopenharmony_ci struct mutex mutex; 2262306a36Sopenharmony_ci spinlock_t ctrl_lock; 2362306a36Sopenharmony_ci atomic_t num_inst; 2462306a36Sopenharmony_ci void __iomem *regs; 2562306a36Sopenharmony_ci struct clk *clk; 2662306a36Sopenharmony_ci struct clk *gate; 2762306a36Sopenharmony_ci struct g2d_ctx *curr; 2862306a36Sopenharmony_ci struct g2d_variant *variant; 2962306a36Sopenharmony_ci int irq; 3062306a36Sopenharmony_ci}; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistruct g2d_frame { 3362306a36Sopenharmony_ci /* Original dimensions */ 3462306a36Sopenharmony_ci u32 width; 3562306a36Sopenharmony_ci u32 height; 3662306a36Sopenharmony_ci /* Crop size */ 3762306a36Sopenharmony_ci u32 c_width; 3862306a36Sopenharmony_ci u32 c_height; 3962306a36Sopenharmony_ci /* Offset */ 4062306a36Sopenharmony_ci u32 o_width; 4162306a36Sopenharmony_ci u32 o_height; 4262306a36Sopenharmony_ci /* Image format */ 4362306a36Sopenharmony_ci struct g2d_fmt *fmt; 4462306a36Sopenharmony_ci /* Variables that can calculated once and reused */ 4562306a36Sopenharmony_ci u32 stride; 4662306a36Sopenharmony_ci u32 bottom; 4762306a36Sopenharmony_ci u32 right; 4862306a36Sopenharmony_ci u32 size; 4962306a36Sopenharmony_ci}; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistruct g2d_ctx { 5262306a36Sopenharmony_ci struct v4l2_fh fh; 5362306a36Sopenharmony_ci struct g2d_dev *dev; 5462306a36Sopenharmony_ci struct g2d_frame in; 5562306a36Sopenharmony_ci struct g2d_frame out; 5662306a36Sopenharmony_ci struct v4l2_ctrl *ctrl_hflip; 5762306a36Sopenharmony_ci struct v4l2_ctrl *ctrl_vflip; 5862306a36Sopenharmony_ci struct v4l2_ctrl_handler ctrl_handler; 5962306a36Sopenharmony_ci u32 rop; 6062306a36Sopenharmony_ci u32 flip; 6162306a36Sopenharmony_ci}; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistruct g2d_fmt { 6462306a36Sopenharmony_ci u32 fourcc; 6562306a36Sopenharmony_ci int depth; 6662306a36Sopenharmony_ci u32 hw; 6762306a36Sopenharmony_ci}; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_cistruct g2d_variant { 7062306a36Sopenharmony_ci unsigned short hw_rev; 7162306a36Sopenharmony_ci}; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_civoid g2d_reset(struct g2d_dev *d); 7462306a36Sopenharmony_civoid g2d_set_src_size(struct g2d_dev *d, struct g2d_frame *f); 7562306a36Sopenharmony_civoid g2d_set_src_addr(struct g2d_dev *d, dma_addr_t a); 7662306a36Sopenharmony_civoid g2d_set_dst_size(struct g2d_dev *d, struct g2d_frame *f); 7762306a36Sopenharmony_civoid g2d_set_dst_addr(struct g2d_dev *d, dma_addr_t a); 7862306a36Sopenharmony_civoid g2d_start(struct g2d_dev *d); 7962306a36Sopenharmony_civoid g2d_clear_int(struct g2d_dev *d); 8062306a36Sopenharmony_civoid g2d_set_rop4(struct g2d_dev *d, u32 r); 8162306a36Sopenharmony_civoid g2d_set_flip(struct g2d_dev *d, u32 r); 8262306a36Sopenharmony_civoid g2d_set_v41_stretch(struct g2d_dev *d, 8362306a36Sopenharmony_ci struct g2d_frame *src, struct g2d_frame *dst); 8462306a36Sopenharmony_civoid g2d_set_cmd(struct g2d_dev *d, u32 c); 85