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