1918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski/* 2918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski * Samsung S5P G2D - 2D Graphics Accelerator Driver 3918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski * 4918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski * Copyright (c) 2011 Samsung Electronics Co., Ltd. 5918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski * Kamil Debski, <k.debski@samsung.com> 6918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski * 7918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski * This program is free software; you can redistribute it and/or modify 8918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski * it under the terms of the GNU General Public License as published by the 9918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski * Free Software Foundation; either version 2 of the 10918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski * License, or (at your option) any later version 11918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski */ 12918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski 13918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski#include <media/v4l2-device.h> 14918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski#include <media/v4l2-ctrls.h> 15918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski 16918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski#define G2D_NAME "s5p-g2d" 17918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski 18918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debskistruct g2d_dev { 19918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski struct v4l2_device v4l2_dev; 20918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski struct v4l2_m2m_dev *m2m_dev; 21918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski struct video_device *vfd; 22918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski struct mutex mutex; 2327dda973e8057225e05a41597a21bc3a8f4d0c3eKamil Debski spinlock_t ctrl_lock; 24918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski atomic_t num_inst; 25918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski struct vb2_alloc_ctx *alloc_ctx; 26918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski struct resource *res_regs; 27918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski void __iomem *regs; 28918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski struct clk *clk; 29918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski struct clk *gate; 30918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski struct g2d_ctx *curr; 31918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski int irq; 32918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski wait_queue_head_t irq_queue; 33918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski}; 34918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski 35918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debskistruct g2d_frame { 36918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski /* Original dimensions */ 37918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski u32 width; 38918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski u32 height; 39918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski /* Crop size */ 40918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski u32 c_width; 41918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski u32 c_height; 42918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski /* Offset */ 43918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski u32 o_width; 44918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski u32 o_height; 45918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski /* Image format */ 46918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski struct g2d_fmt *fmt; 47918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski /* Variables that can calculated once and reused */ 48918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski u32 stride; 49918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski u32 bottom; 50918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski u32 right; 51918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski u32 size; 52918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski}; 53918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski 54918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debskistruct g2d_ctx { 55918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski struct v4l2_fh fh; 56918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski struct g2d_dev *dev; 57918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski struct v4l2_m2m_ctx *m2m_ctx; 58918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski struct g2d_frame in; 59918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski struct g2d_frame out; 60d0d2832658a1677c2ba339db068475851277af7dSachin Kamat struct v4l2_ctrl *ctrl_hflip; 61d0d2832658a1677c2ba339db068475851277af7dSachin Kamat struct v4l2_ctrl *ctrl_vflip; 62918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski struct v4l2_ctrl_handler ctrl_handler; 63918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski u32 rop; 64d0d2832658a1677c2ba339db068475851277af7dSachin Kamat u32 flip; 65918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski}; 66918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski 67918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debskistruct g2d_fmt { 68918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski char *name; 69918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski u32 fourcc; 70918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski int depth; 71918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski u32 hw; 72918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski}; 73918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski 74918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski 75918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debskivoid g2d_reset(struct g2d_dev *d); 76918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debskivoid g2d_set_src_size(struct g2d_dev *d, struct g2d_frame *f); 77918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debskivoid g2d_set_src_addr(struct g2d_dev *d, dma_addr_t a); 78918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debskivoid g2d_set_dst_size(struct g2d_dev *d, struct g2d_frame *f); 79918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debskivoid g2d_set_dst_addr(struct g2d_dev *d, dma_addr_t a); 80918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debskivoid g2d_start(struct g2d_dev *d); 81918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debskivoid g2d_clear_int(struct g2d_dev *d); 82918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debskivoid g2d_set_rop4(struct g2d_dev *d, u32 r); 83d0d2832658a1677c2ba339db068475851277af7dSachin Kamatvoid g2d_set_flip(struct g2d_dev *d, u32 r); 84918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debskiu32 g2d_cmd_stretch(u32 e); 85918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debskivoid g2d_set_cmd(struct g2d_dev *d, u32 c); 86918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski 87918847341af0f5f1907fc0b52549f0dc29192c03Kamil Debski 88